1 /* 2 * QLogic Fibre Channel HBA Driver 3 * Copyright (c) 2003-2008 QLogic Corporation 4 * 5 * See LICENSE.qla2xxx for copyright and licensing details. 6 */ 7 #include "qla_def.h" 8 9 #include <linux/delay.h> 10 11 12 /* 13 * qla2x00_mailbox_command 14 * Issue mailbox command and waits for completion. 15 * 16 * Input: 17 * ha = adapter block pointer. 18 * mcp = driver internal mbx struct pointer. 19 * 20 * Output: 21 * mb[MAX_MAILBOX_REGISTER_COUNT] = returned mailbox data. 22 * 23 * Returns: 24 * 0 : QLA_SUCCESS = cmd performed success 25 * 1 : QLA_FUNCTION_FAILED (error encountered) 26 * 6 : QLA_FUNCTION_TIMEOUT (timeout condition encountered) 27 * 28 * Context: 29 * Kernel context. 30 */ 31 static int 32 qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) 33 { 34 int rval; 35 unsigned long flags = 0; 36 device_reg_t __iomem *reg; 37 uint8_t abort_active; 38 uint8_t io_lock_on; 39 uint16_t command; 40 uint16_t *iptr; 41 uint16_t __iomem *optr; 42 uint32_t cnt; 43 uint32_t mboxes; 44 unsigned long wait_time; 45 struct qla_hw_data *ha = vha->hw; 46 scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev); 47 48 if (ha->pdev->error_state > pci_channel_io_frozen) 49 return QLA_FUNCTION_TIMEOUT; 50 51 reg = ha->iobase; 52 io_lock_on = base_vha->flags.init_done; 53 54 rval = QLA_SUCCESS; 55 abort_active = test_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags); 56 57 DEBUG11(printk("%s(%ld): entered.\n", __func__, base_vha->host_no)); 58 59 /* 60 * Wait for active mailbox commands to finish by waiting at most tov 61 * seconds. This is to serialize actual issuing of mailbox cmds during 62 * non ISP abort time. 63 */ 64 if (!wait_for_completion_timeout(&ha->mbx_cmd_comp, mcp->tov * HZ)) { 65 /* Timeout occurred. Return error. */ 66 DEBUG2_3_11(printk("%s(%ld): cmd access timeout. " 67 "Exiting.\n", __func__, base_vha->host_no)); 68 return QLA_FUNCTION_TIMEOUT; 69 } 70 71 ha->flags.mbox_busy = 1; 72 /* Save mailbox command for debug */ 73 ha->mcp = mcp; 74 75 DEBUG11(printk("scsi(%ld): prepare to issue mbox cmd=0x%x.\n", 76 base_vha->host_no, mcp->mb[0])); 77 78 spin_lock_irqsave(&ha->hardware_lock, flags); 79 80 /* Load mailbox registers. */ 81 if (IS_FWI2_CAPABLE(ha)) 82 optr = (uint16_t __iomem *)®->isp24.mailbox0; 83 else 84 optr = (uint16_t __iomem *)MAILBOX_REG(ha, ®->isp, 0); 85 86 iptr = mcp->mb; 87 command = mcp->mb[0]; 88 mboxes = mcp->out_mb; 89 90 for (cnt = 0; cnt < ha->mbx_count; cnt++) { 91 if (IS_QLA2200(ha) && cnt == 8) 92 optr = 93 (uint16_t __iomem *)MAILBOX_REG(ha, ®->isp, 8); 94 if (mboxes & BIT_0) 95 WRT_REG_WORD(optr, *iptr); 96 97 mboxes >>= 1; 98 optr++; 99 iptr++; 100 } 101 102 #if defined(QL_DEBUG_LEVEL_1) 103 printk("%s(%ld): Loaded MBX registers (displayed in bytes) = \n", 104 __func__, base_vha->host_no); 105 qla2x00_dump_buffer((uint8_t *)mcp->mb, 16); 106 printk("\n"); 107 qla2x00_dump_buffer(((uint8_t *)mcp->mb + 0x10), 16); 108 printk("\n"); 109 qla2x00_dump_buffer(((uint8_t *)mcp->mb + 0x20), 8); 110 printk("\n"); 111 printk("%s(%ld): I/O address = %p.\n", __func__, base_vha->host_no, 112 optr); 113 qla2x00_dump_regs(base_vha); 114 #endif 115 116 /* Issue set host interrupt command to send cmd out. */ 117 ha->flags.mbox_int = 0; 118 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); 119 120 /* Unlock mbx registers and wait for interrupt */ 121 DEBUG11(printk("%s(%ld): going to unlock irq & waiting for interrupt. " 122 "jiffies=%lx.\n", __func__, base_vha->host_no, jiffies)); 123 124 /* Wait for mbx cmd completion until timeout */ 125 126 if ((!abort_active && io_lock_on) || IS_NOPOLLING_TYPE(ha)) { 127 set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); 128 129 if (IS_FWI2_CAPABLE(ha)) 130 WRT_REG_DWORD(®->isp24.hccr, HCCRX_SET_HOST_INT); 131 else 132 WRT_REG_WORD(®->isp.hccr, HCCR_SET_HOST_INT); 133 spin_unlock_irqrestore(&ha->hardware_lock, flags); 134 135 wait_for_completion_timeout(&ha->mbx_intr_comp, mcp->tov * HZ); 136 137 clear_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); 138 139 } else { 140 DEBUG3_11(printk("%s(%ld): cmd=%x POLLING MODE.\n", __func__, 141 base_vha->host_no, command)); 142 143 if (IS_FWI2_CAPABLE(ha)) 144 WRT_REG_DWORD(®->isp24.hccr, HCCRX_SET_HOST_INT); 145 else 146 WRT_REG_WORD(®->isp.hccr, HCCR_SET_HOST_INT); 147 spin_unlock_irqrestore(&ha->hardware_lock, flags); 148 149 wait_time = jiffies + mcp->tov * HZ; /* wait at most tov secs */ 150 while (!ha->flags.mbox_int) { 151 if (time_after(jiffies, wait_time)) 152 break; 153 154 /* Check for pending interrupts. */ 155 qla2x00_poll(ha->rsp_q_map[0]); 156 157 if (command != MBC_LOAD_RISC_RAM_EXTENDED && 158 !ha->flags.mbox_int) 159 msleep(10); 160 } /* while */ 161 } 162 163 /* Check whether we timed out */ 164 if (ha->flags.mbox_int) { 165 uint16_t *iptr2; 166 167 DEBUG3_11(printk("%s(%ld): cmd %x completed.\n", __func__, 168 base_vha->host_no, command)); 169 170 /* Got interrupt. Clear the flag. */ 171 ha->flags.mbox_int = 0; 172 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); 173 174 if (ha->mailbox_out[0] != MBS_COMMAND_COMPLETE) 175 rval = QLA_FUNCTION_FAILED; 176 177 /* Load return mailbox registers. */ 178 iptr2 = mcp->mb; 179 iptr = (uint16_t *)&ha->mailbox_out[0]; 180 mboxes = mcp->in_mb; 181 for (cnt = 0; cnt < ha->mbx_count; cnt++) { 182 if (mboxes & BIT_0) 183 *iptr2 = *iptr; 184 185 mboxes >>= 1; 186 iptr2++; 187 iptr++; 188 } 189 } else { 190 191 #if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) || \ 192 defined(QL_DEBUG_LEVEL_11) 193 uint16_t mb0; 194 uint32_t ictrl; 195 196 if (IS_FWI2_CAPABLE(ha)) { 197 mb0 = RD_REG_WORD(®->isp24.mailbox0); 198 ictrl = RD_REG_DWORD(®->isp24.ictrl); 199 } else { 200 mb0 = RD_MAILBOX_REG(ha, ®->isp, 0); 201 ictrl = RD_REG_WORD(®->isp.ictrl); 202 } 203 printk("%s(%ld): **** MB Command Timeout for cmd %x ****\n", 204 __func__, base_vha->host_no, command); 205 printk("%s(%ld): icontrol=%x jiffies=%lx\n", __func__, 206 base_vha->host_no, ictrl, jiffies); 207 printk("%s(%ld): *** mailbox[0] = 0x%x ***\n", __func__, 208 base_vha->host_no, mb0); 209 qla2x00_dump_regs(base_vha); 210 #endif 211 212 rval = QLA_FUNCTION_TIMEOUT; 213 } 214 215 ha->flags.mbox_busy = 0; 216 217 /* Clean up */ 218 ha->mcp = NULL; 219 220 if ((abort_active || !io_lock_on) && !IS_NOPOLLING_TYPE(ha)) { 221 DEBUG11(printk("%s(%ld): checking for additional resp " 222 "interrupt.\n", __func__, base_vha->host_no)); 223 224 /* polling mode for non isp_abort commands. */ 225 qla2x00_poll(ha->rsp_q_map[0]); 226 } 227 228 if (rval == QLA_FUNCTION_TIMEOUT && 229 mcp->mb[0] != MBC_GEN_SYSTEM_ERROR) { 230 if (!io_lock_on || (mcp->flags & IOCTL_CMD)) { 231 /* not in dpc. schedule it for dpc to take over. */ 232 DEBUG(printk("%s(%ld): timeout schedule " 233 "isp_abort_needed.\n", __func__, 234 base_vha->host_no)); 235 DEBUG2_3_11(printk("%s(%ld): timeout schedule " 236 "isp_abort_needed.\n", __func__, 237 base_vha->host_no)); 238 qla_printk(KERN_WARNING, ha, 239 "Mailbox command timeout occurred. Scheduling ISP " 240 "abort.\n"); 241 set_bit(ISP_ABORT_NEEDED, &base_vha->dpc_flags); 242 qla2xxx_wake_dpc(vha); 243 } else if (!abort_active) { 244 /* call abort directly since we are in the DPC thread */ 245 DEBUG(printk("%s(%ld): timeout calling abort_isp\n", 246 __func__, base_vha->host_no)); 247 DEBUG2_3_11(printk("%s(%ld): timeout calling " 248 "abort_isp\n", __func__, base_vha->host_no)); 249 qla_printk(KERN_WARNING, ha, 250 "Mailbox command timeout occurred. Issuing ISP " 251 "abort.\n"); 252 253 set_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags); 254 clear_bit(ISP_ABORT_NEEDED, &base_vha->dpc_flags); 255 if (qla2x00_abort_isp(base_vha)) { 256 /* Failed. retry later. */ 257 set_bit(ISP_ABORT_NEEDED, &base_vha->dpc_flags); 258 } 259 clear_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags); 260 DEBUG(printk("%s(%ld): finished abort_isp\n", __func__, 261 base_vha->host_no)); 262 DEBUG2_3_11(printk("%s(%ld): finished abort_isp\n", 263 __func__, base_vha->host_no)); 264 } 265 } 266 267 /* Allow next mbx cmd to come in. */ 268 complete(&ha->mbx_cmd_comp); 269 270 if (rval) { 271 DEBUG2_3_11(printk("%s(%ld): **** FAILED. mbx0=%x, mbx1=%x, " 272 "mbx2=%x, cmd=%x ****\n", __func__, base_vha->host_no, 273 mcp->mb[0], mcp->mb[1], mcp->mb[2], command)); 274 } else { 275 DEBUG11(printk("%s(%ld): done.\n", __func__, 276 base_vha->host_no)); 277 } 278 279 return rval; 280 } 281 282 int 283 qla2x00_load_ram(scsi_qla_host_t *vha, dma_addr_t req_dma, uint32_t risc_addr, 284 uint32_t risc_code_size) 285 { 286 int rval; 287 struct qla_hw_data *ha = vha->hw; 288 mbx_cmd_t mc; 289 mbx_cmd_t *mcp = &mc; 290 291 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 292 293 if (MSW(risc_addr) || IS_FWI2_CAPABLE(ha)) { 294 mcp->mb[0] = MBC_LOAD_RISC_RAM_EXTENDED; 295 mcp->mb[8] = MSW(risc_addr); 296 mcp->out_mb = MBX_8|MBX_0; 297 } else { 298 mcp->mb[0] = MBC_LOAD_RISC_RAM; 299 mcp->out_mb = MBX_0; 300 } 301 mcp->mb[1] = LSW(risc_addr); 302 mcp->mb[2] = MSW(req_dma); 303 mcp->mb[3] = LSW(req_dma); 304 mcp->mb[6] = MSW(MSD(req_dma)); 305 mcp->mb[7] = LSW(MSD(req_dma)); 306 mcp->out_mb |= MBX_7|MBX_6|MBX_3|MBX_2|MBX_1; 307 if (IS_FWI2_CAPABLE(ha)) { 308 mcp->mb[4] = MSW(risc_code_size); 309 mcp->mb[5] = LSW(risc_code_size); 310 mcp->out_mb |= MBX_5|MBX_4; 311 } else { 312 mcp->mb[4] = LSW(risc_code_size); 313 mcp->out_mb |= MBX_4; 314 } 315 316 mcp->in_mb = MBX_0; 317 mcp->tov = MBX_TOV_SECONDS; 318 mcp->flags = 0; 319 rval = qla2x00_mailbox_command(vha, mcp); 320 321 if (rval != QLA_SUCCESS) { 322 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__, 323 vha->host_no, rval, mcp->mb[0])); 324 } else { 325 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 326 } 327 328 return rval; 329 } 330 331 /* 332 * qla2x00_execute_fw 333 * Start adapter firmware. 334 * 335 * Input: 336 * ha = adapter block pointer. 337 * TARGET_QUEUE_LOCK must be released. 338 * ADAPTER_STATE_LOCK must be released. 339 * 340 * Returns: 341 * qla2x00 local function return status code. 342 * 343 * Context: 344 * Kernel context. 345 */ 346 int 347 qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr) 348 { 349 int rval; 350 struct qla_hw_data *ha = vha->hw; 351 mbx_cmd_t mc; 352 mbx_cmd_t *mcp = &mc; 353 354 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 355 356 mcp->mb[0] = MBC_EXECUTE_FIRMWARE; 357 mcp->out_mb = MBX_0; 358 mcp->in_mb = MBX_0; 359 if (IS_FWI2_CAPABLE(ha)) { 360 mcp->mb[1] = MSW(risc_addr); 361 mcp->mb[2] = LSW(risc_addr); 362 mcp->mb[3] = 0; 363 mcp->mb[4] = 0; 364 mcp->out_mb |= MBX_4|MBX_3|MBX_2|MBX_1; 365 mcp->in_mb |= MBX_1; 366 } else { 367 mcp->mb[1] = LSW(risc_addr); 368 mcp->out_mb |= MBX_1; 369 if (IS_QLA2322(ha) || IS_QLA6322(ha)) { 370 mcp->mb[2] = 0; 371 mcp->out_mb |= MBX_2; 372 } 373 } 374 375 mcp->tov = MBX_TOV_SECONDS; 376 mcp->flags = 0; 377 rval = qla2x00_mailbox_command(vha, mcp); 378 379 if (rval != QLA_SUCCESS) { 380 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__, 381 vha->host_no, rval, mcp->mb[0])); 382 } else { 383 if (IS_FWI2_CAPABLE(ha)) { 384 DEBUG11(printk("%s(%ld): done exchanges=%x.\n", 385 __func__, vha->host_no, mcp->mb[1])); 386 } else { 387 DEBUG11(printk("%s(%ld): done.\n", __func__, 388 vha->host_no)); 389 } 390 } 391 392 return rval; 393 } 394 395 /* 396 * qla2x00_get_fw_version 397 * Get firmware version. 398 * 399 * Input: 400 * ha: adapter state pointer. 401 * major: pointer for major number. 402 * minor: pointer for minor number. 403 * subminor: pointer for subminor number. 404 * 405 * Returns: 406 * qla2x00 local function return status code. 407 * 408 * Context: 409 * Kernel context. 410 */ 411 int 412 qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, 413 uint16_t *subminor, uint16_t *attributes, uint32_t *memory, uint8_t *mpi, 414 uint32_t *mpi_caps, uint8_t *phy) 415 { 416 int rval; 417 mbx_cmd_t mc; 418 mbx_cmd_t *mcp = &mc; 419 420 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 421 422 mcp->mb[0] = MBC_GET_FIRMWARE_VERSION; 423 mcp->out_mb = MBX_0; 424 mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 425 if (IS_QLA81XX(vha->hw)) 426 mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8; 427 mcp->flags = 0; 428 mcp->tov = MBX_TOV_SECONDS; 429 rval = qla2x00_mailbox_command(vha, mcp); 430 if (rval != QLA_SUCCESS) 431 goto failed; 432 433 /* Return mailbox data. */ 434 *major = mcp->mb[1]; 435 *minor = mcp->mb[2]; 436 *subminor = mcp->mb[3]; 437 *attributes = mcp->mb[6]; 438 if (IS_QLA2100(vha->hw) || IS_QLA2200(vha->hw)) 439 *memory = 0x1FFFF; /* Defaults to 128KB. */ 440 else 441 *memory = (mcp->mb[5] << 16) | mcp->mb[4]; 442 if (IS_QLA81XX(vha->hw)) { 443 mpi[0] = mcp->mb[10] & 0xff; 444 mpi[1] = mcp->mb[11] >> 8; 445 mpi[2] = mcp->mb[11] & 0xff; 446 *mpi_caps = (mcp->mb[12] << 16) | mcp->mb[13]; 447 phy[0] = mcp->mb[8] & 0xff; 448 phy[1] = mcp->mb[9] >> 8; 449 phy[2] = mcp->mb[9] & 0xff; 450 } 451 failed: 452 if (rval != QLA_SUCCESS) { 453 /*EMPTY*/ 454 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 455 vha->host_no, rval)); 456 } else { 457 /*EMPTY*/ 458 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 459 } 460 return rval; 461 } 462 463 /* 464 * qla2x00_get_fw_options 465 * Set firmware options. 466 * 467 * Input: 468 * ha = adapter block pointer. 469 * fwopt = pointer for firmware options. 470 * 471 * Returns: 472 * qla2x00 local function return status code. 473 * 474 * Context: 475 * Kernel context. 476 */ 477 int 478 qla2x00_get_fw_options(scsi_qla_host_t *vha, uint16_t *fwopts) 479 { 480 int rval; 481 mbx_cmd_t mc; 482 mbx_cmd_t *mcp = &mc; 483 484 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 485 486 mcp->mb[0] = MBC_GET_FIRMWARE_OPTION; 487 mcp->out_mb = MBX_0; 488 mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0; 489 mcp->tov = MBX_TOV_SECONDS; 490 mcp->flags = 0; 491 rval = qla2x00_mailbox_command(vha, mcp); 492 493 if (rval != QLA_SUCCESS) { 494 /*EMPTY*/ 495 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 496 vha->host_no, rval)); 497 } else { 498 fwopts[0] = mcp->mb[0]; 499 fwopts[1] = mcp->mb[1]; 500 fwopts[2] = mcp->mb[2]; 501 fwopts[3] = mcp->mb[3]; 502 503 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 504 } 505 506 return rval; 507 } 508 509 510 /* 511 * qla2x00_set_fw_options 512 * Set firmware options. 513 * 514 * Input: 515 * ha = adapter block pointer. 516 * fwopt = pointer for firmware options. 517 * 518 * Returns: 519 * qla2x00 local function return status code. 520 * 521 * Context: 522 * Kernel context. 523 */ 524 int 525 qla2x00_set_fw_options(scsi_qla_host_t *vha, uint16_t *fwopts) 526 { 527 int rval; 528 mbx_cmd_t mc; 529 mbx_cmd_t *mcp = &mc; 530 531 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 532 533 mcp->mb[0] = MBC_SET_FIRMWARE_OPTION; 534 mcp->mb[1] = fwopts[1]; 535 mcp->mb[2] = fwopts[2]; 536 mcp->mb[3] = fwopts[3]; 537 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; 538 mcp->in_mb = MBX_0; 539 if (IS_FWI2_CAPABLE(vha->hw)) { 540 mcp->in_mb |= MBX_1; 541 } else { 542 mcp->mb[10] = fwopts[10]; 543 mcp->mb[11] = fwopts[11]; 544 mcp->mb[12] = 0; /* Undocumented, but used */ 545 mcp->out_mb |= MBX_12|MBX_11|MBX_10; 546 } 547 mcp->tov = MBX_TOV_SECONDS; 548 mcp->flags = 0; 549 rval = qla2x00_mailbox_command(vha, mcp); 550 551 fwopts[0] = mcp->mb[0]; 552 553 if (rval != QLA_SUCCESS) { 554 /*EMPTY*/ 555 DEBUG2_3_11(printk("%s(%ld): failed=%x (%x/%x).\n", __func__, 556 vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 557 } else { 558 /*EMPTY*/ 559 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 560 } 561 562 return rval; 563 } 564 565 /* 566 * qla2x00_mbx_reg_test 567 * Mailbox register wrap test. 568 * 569 * Input: 570 * ha = adapter block pointer. 571 * TARGET_QUEUE_LOCK must be released. 572 * ADAPTER_STATE_LOCK must be released. 573 * 574 * Returns: 575 * qla2x00 local function return status code. 576 * 577 * Context: 578 * Kernel context. 579 */ 580 int 581 qla2x00_mbx_reg_test(scsi_qla_host_t *vha) 582 { 583 int rval; 584 mbx_cmd_t mc; 585 mbx_cmd_t *mcp = &mc; 586 587 DEBUG11(printk("qla2x00_mbx_reg_test(%ld): entered.\n", vha->host_no)); 588 589 mcp->mb[0] = MBC_MAILBOX_REGISTER_TEST; 590 mcp->mb[1] = 0xAAAA; 591 mcp->mb[2] = 0x5555; 592 mcp->mb[3] = 0xAA55; 593 mcp->mb[4] = 0x55AA; 594 mcp->mb[5] = 0xA5A5; 595 mcp->mb[6] = 0x5A5A; 596 mcp->mb[7] = 0x2525; 597 mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 598 mcp->in_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 599 mcp->tov = MBX_TOV_SECONDS; 600 mcp->flags = 0; 601 rval = qla2x00_mailbox_command(vha, mcp); 602 603 if (rval == QLA_SUCCESS) { 604 if (mcp->mb[1] != 0xAAAA || mcp->mb[2] != 0x5555 || 605 mcp->mb[3] != 0xAA55 || mcp->mb[4] != 0x55AA) 606 rval = QLA_FUNCTION_FAILED; 607 if (mcp->mb[5] != 0xA5A5 || mcp->mb[6] != 0x5A5A || 608 mcp->mb[7] != 0x2525) 609 rval = QLA_FUNCTION_FAILED; 610 } 611 612 if (rval != QLA_SUCCESS) { 613 /*EMPTY*/ 614 DEBUG2_3_11(printk("qla2x00_mbx_reg_test(%ld): failed=%x.\n", 615 vha->host_no, rval)); 616 } else { 617 /*EMPTY*/ 618 DEBUG11(printk("qla2x00_mbx_reg_test(%ld): done.\n", 619 vha->host_no)); 620 } 621 622 return rval; 623 } 624 625 /* 626 * qla2x00_verify_checksum 627 * Verify firmware checksum. 628 * 629 * Input: 630 * ha = adapter block pointer. 631 * TARGET_QUEUE_LOCK must be released. 632 * ADAPTER_STATE_LOCK must be released. 633 * 634 * Returns: 635 * qla2x00 local function return status code. 636 * 637 * Context: 638 * Kernel context. 639 */ 640 int 641 qla2x00_verify_checksum(scsi_qla_host_t *vha, uint32_t risc_addr) 642 { 643 int rval; 644 mbx_cmd_t mc; 645 mbx_cmd_t *mcp = &mc; 646 647 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 648 649 mcp->mb[0] = MBC_VERIFY_CHECKSUM; 650 mcp->out_mb = MBX_0; 651 mcp->in_mb = MBX_0; 652 if (IS_FWI2_CAPABLE(vha->hw)) { 653 mcp->mb[1] = MSW(risc_addr); 654 mcp->mb[2] = LSW(risc_addr); 655 mcp->out_mb |= MBX_2|MBX_1; 656 mcp->in_mb |= MBX_2|MBX_1; 657 } else { 658 mcp->mb[1] = LSW(risc_addr); 659 mcp->out_mb |= MBX_1; 660 mcp->in_mb |= MBX_1; 661 } 662 663 mcp->tov = MBX_TOV_SECONDS; 664 mcp->flags = 0; 665 rval = qla2x00_mailbox_command(vha, mcp); 666 667 if (rval != QLA_SUCCESS) { 668 DEBUG2_3_11(printk("%s(%ld): failed=%x chk sum=%x.\n", __func__, 669 vha->host_no, rval, IS_FWI2_CAPABLE(vha->hw) ? 670 (mcp->mb[2] << 16) | mcp->mb[1]: mcp->mb[1])); 671 } else { 672 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 673 } 674 675 return rval; 676 } 677 678 /* 679 * qla2x00_issue_iocb 680 * Issue IOCB using mailbox command 681 * 682 * Input: 683 * ha = adapter state pointer. 684 * buffer = buffer pointer. 685 * phys_addr = physical address of buffer. 686 * size = size of buffer. 687 * TARGET_QUEUE_LOCK must be released. 688 * ADAPTER_STATE_LOCK must be released. 689 * 690 * Returns: 691 * qla2x00 local function return status code. 692 * 693 * Context: 694 * Kernel context. 695 */ 696 static int 697 qla2x00_issue_iocb_timeout(scsi_qla_host_t *vha, void *buffer, 698 dma_addr_t phys_addr, size_t size, uint32_t tov) 699 { 700 int rval; 701 mbx_cmd_t mc; 702 mbx_cmd_t *mcp = &mc; 703 704 mcp->mb[0] = MBC_IOCB_COMMAND_A64; 705 mcp->mb[1] = 0; 706 mcp->mb[2] = MSW(phys_addr); 707 mcp->mb[3] = LSW(phys_addr); 708 mcp->mb[6] = MSW(MSD(phys_addr)); 709 mcp->mb[7] = LSW(MSD(phys_addr)); 710 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 711 mcp->in_mb = MBX_2|MBX_0; 712 mcp->tov = tov; 713 mcp->flags = 0; 714 rval = qla2x00_mailbox_command(vha, mcp); 715 716 if (rval != QLA_SUCCESS) { 717 /*EMPTY*/ 718 DEBUG(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x\n", 719 vha->host_no, rval)); 720 } else { 721 sts_entry_t *sts_entry = (sts_entry_t *) buffer; 722 723 /* Mask reserved bits. */ 724 sts_entry->entry_status &= 725 IS_FWI2_CAPABLE(vha->hw) ? RF_MASK_24XX : RF_MASK; 726 } 727 728 return rval; 729 } 730 731 int 732 qla2x00_issue_iocb(scsi_qla_host_t *vha, void *buffer, dma_addr_t phys_addr, 733 size_t size) 734 { 735 return qla2x00_issue_iocb_timeout(vha, buffer, phys_addr, size, 736 MBX_TOV_SECONDS); 737 } 738 739 /* 740 * qla2x00_abort_command 741 * Abort command aborts a specified IOCB. 742 * 743 * Input: 744 * ha = adapter block pointer. 745 * sp = SB structure pointer. 746 * 747 * Returns: 748 * qla2x00 local function return status code. 749 * 750 * Context: 751 * Kernel context. 752 */ 753 int 754 qla2x00_abort_command(srb_t *sp) 755 { 756 unsigned long flags = 0; 757 int rval; 758 uint32_t handle = 0; 759 mbx_cmd_t mc; 760 mbx_cmd_t *mcp = &mc; 761 fc_port_t *fcport = sp->fcport; 762 scsi_qla_host_t *vha = fcport->vha; 763 struct qla_hw_data *ha = vha->hw; 764 struct req_que *req = vha->req; 765 766 DEBUG11(printk("qla2x00_abort_command(%ld): entered.\n", vha->host_no)); 767 768 spin_lock_irqsave(&ha->hardware_lock, flags); 769 for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) { 770 if (req->outstanding_cmds[handle] == sp) 771 break; 772 } 773 spin_unlock_irqrestore(&ha->hardware_lock, flags); 774 775 if (handle == MAX_OUTSTANDING_COMMANDS) { 776 /* command not found */ 777 return QLA_FUNCTION_FAILED; 778 } 779 780 mcp->mb[0] = MBC_ABORT_COMMAND; 781 if (HAS_EXTENDED_IDS(ha)) 782 mcp->mb[1] = fcport->loop_id; 783 else 784 mcp->mb[1] = fcport->loop_id << 8; 785 mcp->mb[2] = (uint16_t)handle; 786 mcp->mb[3] = (uint16_t)(handle >> 16); 787 mcp->mb[6] = (uint16_t)sp->cmd->device->lun; 788 mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 789 mcp->in_mb = MBX_0; 790 mcp->tov = MBX_TOV_SECONDS; 791 mcp->flags = 0; 792 rval = qla2x00_mailbox_command(vha, mcp); 793 794 if (rval != QLA_SUCCESS) { 795 DEBUG2_3_11(printk("qla2x00_abort_command(%ld): failed=%x.\n", 796 vha->host_no, rval)); 797 } else { 798 DEBUG11(printk("qla2x00_abort_command(%ld): done.\n", 799 vha->host_no)); 800 } 801 802 return rval; 803 } 804 805 int 806 qla2x00_abort_target(struct fc_port *fcport, unsigned int l, int tag) 807 { 808 int rval, rval2; 809 mbx_cmd_t mc; 810 mbx_cmd_t *mcp = &mc; 811 scsi_qla_host_t *vha; 812 struct req_que *req; 813 struct rsp_que *rsp; 814 815 DEBUG11(printk("%s(%ld): entered.\n", __func__, fcport->vha->host_no)); 816 817 l = l; 818 vha = fcport->vha; 819 req = vha->hw->req_q_map[tag]; 820 rsp = vha->hw->rsp_q_map[tag]; 821 mcp->mb[0] = MBC_ABORT_TARGET; 822 mcp->out_mb = MBX_9|MBX_2|MBX_1|MBX_0; 823 if (HAS_EXTENDED_IDS(vha->hw)) { 824 mcp->mb[1] = fcport->loop_id; 825 mcp->mb[10] = 0; 826 mcp->out_mb |= MBX_10; 827 } else { 828 mcp->mb[1] = fcport->loop_id << 8; 829 } 830 mcp->mb[2] = vha->hw->loop_reset_delay; 831 mcp->mb[9] = vha->vp_idx; 832 833 mcp->in_mb = MBX_0; 834 mcp->tov = MBX_TOV_SECONDS; 835 mcp->flags = 0; 836 rval = qla2x00_mailbox_command(vha, mcp); 837 if (rval != QLA_SUCCESS) { 838 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 839 vha->host_no, rval)); 840 } 841 842 /* Issue marker IOCB. */ 843 rval2 = qla2x00_marker(vha, req, rsp, fcport->loop_id, 0, 844 MK_SYNC_ID); 845 if (rval2 != QLA_SUCCESS) { 846 DEBUG2_3_11(printk("%s(%ld): failed to issue Marker IOCB " 847 "(%x).\n", __func__, vha->host_no, rval2)); 848 } else { 849 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 850 } 851 852 return rval; 853 } 854 855 int 856 qla2x00_lun_reset(struct fc_port *fcport, unsigned int l, int tag) 857 { 858 int rval, rval2; 859 mbx_cmd_t mc; 860 mbx_cmd_t *mcp = &mc; 861 scsi_qla_host_t *vha; 862 struct req_que *req; 863 struct rsp_que *rsp; 864 865 DEBUG11(printk("%s(%ld): entered.\n", __func__, fcport->vha->host_no)); 866 867 vha = fcport->vha; 868 req = vha->hw->req_q_map[tag]; 869 rsp = vha->hw->rsp_q_map[tag]; 870 mcp->mb[0] = MBC_LUN_RESET; 871 mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0; 872 if (HAS_EXTENDED_IDS(vha->hw)) 873 mcp->mb[1] = fcport->loop_id; 874 else 875 mcp->mb[1] = fcport->loop_id << 8; 876 mcp->mb[2] = l; 877 mcp->mb[3] = 0; 878 mcp->mb[9] = vha->vp_idx; 879 880 mcp->in_mb = MBX_0; 881 mcp->tov = MBX_TOV_SECONDS; 882 mcp->flags = 0; 883 rval = qla2x00_mailbox_command(vha, mcp); 884 if (rval != QLA_SUCCESS) { 885 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 886 vha->host_no, rval)); 887 } 888 889 /* Issue marker IOCB. */ 890 rval2 = qla2x00_marker(vha, req, rsp, fcport->loop_id, l, 891 MK_SYNC_ID_LUN); 892 if (rval2 != QLA_SUCCESS) { 893 DEBUG2_3_11(printk("%s(%ld): failed to issue Marker IOCB " 894 "(%x).\n", __func__, vha->host_no, rval2)); 895 } else { 896 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 897 } 898 899 return rval; 900 } 901 902 /* 903 * qla2x00_get_adapter_id 904 * Get adapter ID and topology. 905 * 906 * Input: 907 * ha = adapter block pointer. 908 * id = pointer for loop ID. 909 * al_pa = pointer for AL_PA. 910 * area = pointer for area. 911 * domain = pointer for domain. 912 * top = pointer for topology. 913 * TARGET_QUEUE_LOCK must be released. 914 * ADAPTER_STATE_LOCK must be released. 915 * 916 * Returns: 917 * qla2x00 local function return status code. 918 * 919 * Context: 920 * Kernel context. 921 */ 922 int 923 qla2x00_get_adapter_id(scsi_qla_host_t *vha, uint16_t *id, uint8_t *al_pa, 924 uint8_t *area, uint8_t *domain, uint16_t *top, uint16_t *sw_cap) 925 { 926 int rval; 927 mbx_cmd_t mc; 928 mbx_cmd_t *mcp = &mc; 929 930 DEBUG11(printk("qla2x00_get_adapter_id(%ld): entered.\n", 931 vha->host_no)); 932 933 mcp->mb[0] = MBC_GET_ADAPTER_LOOP_ID; 934 mcp->mb[9] = vha->vp_idx; 935 mcp->out_mb = MBX_9|MBX_0; 936 mcp->in_mb = MBX_9|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 937 if (IS_QLA81XX(vha->hw)) 938 mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10; 939 mcp->tov = MBX_TOV_SECONDS; 940 mcp->flags = 0; 941 rval = qla2x00_mailbox_command(vha, mcp); 942 if (mcp->mb[0] == MBS_COMMAND_ERROR) 943 rval = QLA_COMMAND_ERROR; 944 else if (mcp->mb[0] == MBS_INVALID_COMMAND) 945 rval = QLA_INVALID_COMMAND; 946 947 /* Return data. */ 948 *id = mcp->mb[1]; 949 *al_pa = LSB(mcp->mb[2]); 950 *area = MSB(mcp->mb[2]); 951 *domain = LSB(mcp->mb[3]); 952 *top = mcp->mb[6]; 953 *sw_cap = mcp->mb[7]; 954 955 if (rval != QLA_SUCCESS) { 956 /*EMPTY*/ 957 DEBUG2_3_11(printk("qla2x00_get_adapter_id(%ld): failed=%x.\n", 958 vha->host_no, rval)); 959 } else { 960 DEBUG11(printk("qla2x00_get_adapter_id(%ld): done.\n", 961 vha->host_no)); 962 963 if (IS_QLA81XX(vha->hw)) { 964 vha->fcoe_vlan_id = mcp->mb[9] & 0xfff; 965 vha->fcoe_fcf_idx = mcp->mb[10]; 966 vha->fcoe_vn_port_mac[5] = mcp->mb[11] >> 8; 967 vha->fcoe_vn_port_mac[4] = mcp->mb[11] & 0xff; 968 vha->fcoe_vn_port_mac[3] = mcp->mb[12] >> 8; 969 vha->fcoe_vn_port_mac[2] = mcp->mb[12] & 0xff; 970 vha->fcoe_vn_port_mac[1] = mcp->mb[13] >> 8; 971 vha->fcoe_vn_port_mac[0] = mcp->mb[13] & 0xff; 972 } 973 } 974 975 return rval; 976 } 977 978 /* 979 * qla2x00_get_retry_cnt 980 * Get current firmware login retry count and delay. 981 * 982 * Input: 983 * ha = adapter block pointer. 984 * retry_cnt = pointer to login retry count. 985 * tov = pointer to login timeout value. 986 * 987 * Returns: 988 * qla2x00 local function return status code. 989 * 990 * Context: 991 * Kernel context. 992 */ 993 int 994 qla2x00_get_retry_cnt(scsi_qla_host_t *vha, uint8_t *retry_cnt, uint8_t *tov, 995 uint16_t *r_a_tov) 996 { 997 int rval; 998 uint16_t ratov; 999 mbx_cmd_t mc; 1000 mbx_cmd_t *mcp = &mc; 1001 1002 DEBUG11(printk("qla2x00_get_retry_cnt(%ld): entered.\n", 1003 vha->host_no)); 1004 1005 mcp->mb[0] = MBC_GET_RETRY_COUNT; 1006 mcp->out_mb = MBX_0; 1007 mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0; 1008 mcp->tov = MBX_TOV_SECONDS; 1009 mcp->flags = 0; 1010 rval = qla2x00_mailbox_command(vha, mcp); 1011 1012 if (rval != QLA_SUCCESS) { 1013 /*EMPTY*/ 1014 DEBUG2_3_11(printk("qla2x00_get_retry_cnt(%ld): failed = %x.\n", 1015 vha->host_no, mcp->mb[0])); 1016 } else { 1017 /* Convert returned data and check our values. */ 1018 *r_a_tov = mcp->mb[3] / 2; 1019 ratov = (mcp->mb[3]/2) / 10; /* mb[3] value is in 100ms */ 1020 if (mcp->mb[1] * ratov > (*retry_cnt) * (*tov)) { 1021 /* Update to the larger values */ 1022 *retry_cnt = (uint8_t)mcp->mb[1]; 1023 *tov = ratov; 1024 } 1025 1026 DEBUG11(printk("qla2x00_get_retry_cnt(%ld): done. mb3=%d " 1027 "ratov=%d.\n", vha->host_no, mcp->mb[3], ratov)); 1028 } 1029 1030 return rval; 1031 } 1032 1033 /* 1034 * qla2x00_init_firmware 1035 * Initialize adapter firmware. 1036 * 1037 * Input: 1038 * ha = adapter block pointer. 1039 * dptr = Initialization control block pointer. 1040 * size = size of initialization control block. 1041 * TARGET_QUEUE_LOCK must be released. 1042 * ADAPTER_STATE_LOCK must be released. 1043 * 1044 * Returns: 1045 * qla2x00 local function return status code. 1046 * 1047 * Context: 1048 * Kernel context. 1049 */ 1050 int 1051 qla2x00_init_firmware(scsi_qla_host_t *vha, uint16_t size) 1052 { 1053 int rval; 1054 mbx_cmd_t mc; 1055 mbx_cmd_t *mcp = &mc; 1056 struct qla_hw_data *ha = vha->hw; 1057 1058 DEBUG11(printk("qla2x00_init_firmware(%ld): entered.\n", 1059 vha->host_no)); 1060 1061 if (ha->flags.npiv_supported) 1062 mcp->mb[0] = MBC_MID_INITIALIZE_FIRMWARE; 1063 else 1064 mcp->mb[0] = MBC_INITIALIZE_FIRMWARE; 1065 1066 mcp->mb[1] = 0; 1067 mcp->mb[2] = MSW(ha->init_cb_dma); 1068 mcp->mb[3] = LSW(ha->init_cb_dma); 1069 mcp->mb[6] = MSW(MSD(ha->init_cb_dma)); 1070 mcp->mb[7] = LSW(MSD(ha->init_cb_dma)); 1071 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 1072 if (IS_QLA81XX(ha) && ha->ex_init_cb->ex_version) { 1073 mcp->mb[1] = BIT_0; 1074 mcp->mb[10] = MSW(ha->ex_init_cb_dma); 1075 mcp->mb[11] = LSW(ha->ex_init_cb_dma); 1076 mcp->mb[12] = MSW(MSD(ha->ex_init_cb_dma)); 1077 mcp->mb[13] = LSW(MSD(ha->ex_init_cb_dma)); 1078 mcp->mb[14] = sizeof(*ha->ex_init_cb); 1079 mcp->out_mb |= MBX_14|MBX_13|MBX_12|MBX_11|MBX_10; 1080 } 1081 mcp->in_mb = MBX_0; 1082 mcp->buf_size = size; 1083 mcp->flags = MBX_DMA_OUT; 1084 mcp->tov = MBX_TOV_SECONDS; 1085 rval = qla2x00_mailbox_command(vha, mcp); 1086 1087 if (rval != QLA_SUCCESS) { 1088 /*EMPTY*/ 1089 DEBUG2_3_11(printk("qla2x00_init_firmware(%ld): failed=%x " 1090 "mb0=%x.\n", 1091 vha->host_no, rval, mcp->mb[0])); 1092 } else { 1093 /*EMPTY*/ 1094 DEBUG11(printk("qla2x00_init_firmware(%ld): done.\n", 1095 vha->host_no)); 1096 } 1097 1098 return rval; 1099 } 1100 1101 /* 1102 * qla2x00_get_port_database 1103 * Issue normal/enhanced get port database mailbox command 1104 * and copy device name as necessary. 1105 * 1106 * Input: 1107 * ha = adapter state pointer. 1108 * dev = structure pointer. 1109 * opt = enhanced cmd option byte. 1110 * 1111 * Returns: 1112 * qla2x00 local function return status code. 1113 * 1114 * Context: 1115 * Kernel context. 1116 */ 1117 int 1118 qla2x00_get_port_database(scsi_qla_host_t *vha, fc_port_t *fcport, uint8_t opt) 1119 { 1120 int rval; 1121 mbx_cmd_t mc; 1122 mbx_cmd_t *mcp = &mc; 1123 port_database_t *pd; 1124 struct port_database_24xx *pd24; 1125 dma_addr_t pd_dma; 1126 struct qla_hw_data *ha = vha->hw; 1127 1128 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 1129 1130 pd24 = NULL; 1131 pd = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &pd_dma); 1132 if (pd == NULL) { 1133 DEBUG2_3(printk("%s(%ld): failed to allocate Port Database " 1134 "structure.\n", __func__, vha->host_no)); 1135 return QLA_MEMORY_ALLOC_FAILED; 1136 } 1137 memset(pd, 0, max(PORT_DATABASE_SIZE, PORT_DATABASE_24XX_SIZE)); 1138 1139 mcp->mb[0] = MBC_GET_PORT_DATABASE; 1140 if (opt != 0 && !IS_FWI2_CAPABLE(ha)) 1141 mcp->mb[0] = MBC_ENHANCED_GET_PORT_DATABASE; 1142 mcp->mb[2] = MSW(pd_dma); 1143 mcp->mb[3] = LSW(pd_dma); 1144 mcp->mb[6] = MSW(MSD(pd_dma)); 1145 mcp->mb[7] = LSW(MSD(pd_dma)); 1146 mcp->mb[9] = vha->vp_idx; 1147 mcp->out_mb = MBX_9|MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; 1148 mcp->in_mb = MBX_0; 1149 if (IS_FWI2_CAPABLE(ha)) { 1150 mcp->mb[1] = fcport->loop_id; 1151 mcp->mb[10] = opt; 1152 mcp->out_mb |= MBX_10|MBX_1; 1153 mcp->in_mb |= MBX_1; 1154 } else if (HAS_EXTENDED_IDS(ha)) { 1155 mcp->mb[1] = fcport->loop_id; 1156 mcp->mb[10] = opt; 1157 mcp->out_mb |= MBX_10|MBX_1; 1158 } else { 1159 mcp->mb[1] = fcport->loop_id << 8 | opt; 1160 mcp->out_mb |= MBX_1; 1161 } 1162 mcp->buf_size = IS_FWI2_CAPABLE(ha) ? 1163 PORT_DATABASE_24XX_SIZE : PORT_DATABASE_SIZE; 1164 mcp->flags = MBX_DMA_IN; 1165 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2); 1166 rval = qla2x00_mailbox_command(vha, mcp); 1167 if (rval != QLA_SUCCESS) 1168 goto gpd_error_out; 1169 1170 if (IS_FWI2_CAPABLE(ha)) { 1171 pd24 = (struct port_database_24xx *) pd; 1172 1173 /* Check for logged in state. */ 1174 if (pd24->current_login_state != PDS_PRLI_COMPLETE && 1175 pd24->last_login_state != PDS_PRLI_COMPLETE) { 1176 DEBUG2(printk("%s(%ld): Unable to verify " 1177 "login-state (%x/%x) for loop_id %x\n", 1178 __func__, vha->host_no, 1179 pd24->current_login_state, 1180 pd24->last_login_state, fcport->loop_id)); 1181 rval = QLA_FUNCTION_FAILED; 1182 goto gpd_error_out; 1183 } 1184 1185 /* Names are little-endian. */ 1186 memcpy(fcport->node_name, pd24->node_name, WWN_SIZE); 1187 memcpy(fcport->port_name, pd24->port_name, WWN_SIZE); 1188 1189 /* Get port_id of device. */ 1190 fcport->d_id.b.domain = pd24->port_id[0]; 1191 fcport->d_id.b.area = pd24->port_id[1]; 1192 fcport->d_id.b.al_pa = pd24->port_id[2]; 1193 fcport->d_id.b.rsvd_1 = 0; 1194 1195 /* If not target must be initiator or unknown type. */ 1196 if ((pd24->prli_svc_param_word_3[0] & BIT_4) == 0) 1197 fcport->port_type = FCT_INITIATOR; 1198 else 1199 fcport->port_type = FCT_TARGET; 1200 } else { 1201 /* Check for logged in state. */ 1202 if (pd->master_state != PD_STATE_PORT_LOGGED_IN && 1203 pd->slave_state != PD_STATE_PORT_LOGGED_IN) { 1204 rval = QLA_FUNCTION_FAILED; 1205 goto gpd_error_out; 1206 } 1207 1208 /* Names are little-endian. */ 1209 memcpy(fcport->node_name, pd->node_name, WWN_SIZE); 1210 memcpy(fcport->port_name, pd->port_name, WWN_SIZE); 1211 1212 /* Get port_id of device. */ 1213 fcport->d_id.b.domain = pd->port_id[0]; 1214 fcport->d_id.b.area = pd->port_id[3]; 1215 fcport->d_id.b.al_pa = pd->port_id[2]; 1216 fcport->d_id.b.rsvd_1 = 0; 1217 1218 /* If not target must be initiator or unknown type. */ 1219 if ((pd->prli_svc_param_word_3[0] & BIT_4) == 0) 1220 fcport->port_type = FCT_INITIATOR; 1221 else 1222 fcport->port_type = FCT_TARGET; 1223 1224 /* Passback COS information. */ 1225 fcport->supported_classes = (pd->options & BIT_4) ? 1226 FC_COS_CLASS2: FC_COS_CLASS3; 1227 } 1228 1229 gpd_error_out: 1230 dma_pool_free(ha->s_dma_pool, pd, pd_dma); 1231 1232 if (rval != QLA_SUCCESS) { 1233 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n", 1234 __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 1235 } else { 1236 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 1237 } 1238 1239 return rval; 1240 } 1241 1242 /* 1243 * qla2x00_get_firmware_state 1244 * Get adapter firmware state. 1245 * 1246 * Input: 1247 * ha = adapter block pointer. 1248 * dptr = pointer for firmware state. 1249 * TARGET_QUEUE_LOCK must be released. 1250 * ADAPTER_STATE_LOCK must be released. 1251 * 1252 * Returns: 1253 * qla2x00 local function return status code. 1254 * 1255 * Context: 1256 * Kernel context. 1257 */ 1258 int 1259 qla2x00_get_firmware_state(scsi_qla_host_t *vha, uint16_t *states) 1260 { 1261 int rval; 1262 mbx_cmd_t mc; 1263 mbx_cmd_t *mcp = &mc; 1264 1265 DEBUG11(printk("qla2x00_get_firmware_state(%ld): entered.\n", 1266 vha->host_no)); 1267 1268 mcp->mb[0] = MBC_GET_FIRMWARE_STATE; 1269 mcp->out_mb = MBX_0; 1270 if (IS_FWI2_CAPABLE(vha->hw)) 1271 mcp->in_mb = MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 1272 else 1273 mcp->in_mb = MBX_1|MBX_0; 1274 mcp->tov = MBX_TOV_SECONDS; 1275 mcp->flags = 0; 1276 rval = qla2x00_mailbox_command(vha, mcp); 1277 1278 /* Return firmware states. */ 1279 states[0] = mcp->mb[1]; 1280 if (IS_FWI2_CAPABLE(vha->hw)) { 1281 states[1] = mcp->mb[2]; 1282 states[2] = mcp->mb[3]; 1283 states[3] = mcp->mb[4]; 1284 states[4] = mcp->mb[5]; 1285 } 1286 1287 if (rval != QLA_SUCCESS) { 1288 /*EMPTY*/ 1289 DEBUG2_3_11(printk("qla2x00_get_firmware_state(%ld): " 1290 "failed=%x.\n", vha->host_no, rval)); 1291 } else { 1292 /*EMPTY*/ 1293 DEBUG11(printk("qla2x00_get_firmware_state(%ld): done.\n", 1294 vha->host_no)); 1295 } 1296 1297 return rval; 1298 } 1299 1300 /* 1301 * qla2x00_get_port_name 1302 * Issue get port name mailbox command. 1303 * Returned name is in big endian format. 1304 * 1305 * Input: 1306 * ha = adapter block pointer. 1307 * loop_id = loop ID of device. 1308 * name = pointer for name. 1309 * TARGET_QUEUE_LOCK must be released. 1310 * ADAPTER_STATE_LOCK must be released. 1311 * 1312 * Returns: 1313 * qla2x00 local function return status code. 1314 * 1315 * Context: 1316 * Kernel context. 1317 */ 1318 int 1319 qla2x00_get_port_name(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t *name, 1320 uint8_t opt) 1321 { 1322 int rval; 1323 mbx_cmd_t mc; 1324 mbx_cmd_t *mcp = &mc; 1325 1326 DEBUG11(printk("qla2x00_get_port_name(%ld): entered.\n", 1327 vha->host_no)); 1328 1329 mcp->mb[0] = MBC_GET_PORT_NAME; 1330 mcp->mb[9] = vha->vp_idx; 1331 mcp->out_mb = MBX_9|MBX_1|MBX_0; 1332 if (HAS_EXTENDED_IDS(vha->hw)) { 1333 mcp->mb[1] = loop_id; 1334 mcp->mb[10] = opt; 1335 mcp->out_mb |= MBX_10; 1336 } else { 1337 mcp->mb[1] = loop_id << 8 | opt; 1338 } 1339 1340 mcp->in_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 1341 mcp->tov = MBX_TOV_SECONDS; 1342 mcp->flags = 0; 1343 rval = qla2x00_mailbox_command(vha, mcp); 1344 1345 if (rval != QLA_SUCCESS) { 1346 /*EMPTY*/ 1347 DEBUG2_3_11(printk("qla2x00_get_port_name(%ld): failed=%x.\n", 1348 vha->host_no, rval)); 1349 } else { 1350 if (name != NULL) { 1351 /* This function returns name in big endian. */ 1352 name[0] = MSB(mcp->mb[2]); 1353 name[1] = LSB(mcp->mb[2]); 1354 name[2] = MSB(mcp->mb[3]); 1355 name[3] = LSB(mcp->mb[3]); 1356 name[4] = MSB(mcp->mb[6]); 1357 name[5] = LSB(mcp->mb[6]); 1358 name[6] = MSB(mcp->mb[7]); 1359 name[7] = LSB(mcp->mb[7]); 1360 } 1361 1362 DEBUG11(printk("qla2x00_get_port_name(%ld): done.\n", 1363 vha->host_no)); 1364 } 1365 1366 return rval; 1367 } 1368 1369 /* 1370 * qla2x00_lip_reset 1371 * Issue LIP reset mailbox command. 1372 * 1373 * Input: 1374 * ha = adapter block pointer. 1375 * TARGET_QUEUE_LOCK must be released. 1376 * ADAPTER_STATE_LOCK must be released. 1377 * 1378 * Returns: 1379 * qla2x00 local function return status code. 1380 * 1381 * Context: 1382 * Kernel context. 1383 */ 1384 int 1385 qla2x00_lip_reset(scsi_qla_host_t *vha) 1386 { 1387 int rval; 1388 mbx_cmd_t mc; 1389 mbx_cmd_t *mcp = &mc; 1390 1391 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 1392 1393 if (IS_QLA81XX(vha->hw)) { 1394 /* Logout across all FCFs. */ 1395 mcp->mb[0] = MBC_LIP_FULL_LOGIN; 1396 mcp->mb[1] = BIT_1; 1397 mcp->mb[2] = 0; 1398 mcp->out_mb = MBX_2|MBX_1|MBX_0; 1399 } else if (IS_FWI2_CAPABLE(vha->hw)) { 1400 mcp->mb[0] = MBC_LIP_FULL_LOGIN; 1401 mcp->mb[1] = BIT_6; 1402 mcp->mb[2] = 0; 1403 mcp->mb[3] = vha->hw->loop_reset_delay; 1404 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; 1405 } else { 1406 mcp->mb[0] = MBC_LIP_RESET; 1407 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; 1408 if (HAS_EXTENDED_IDS(vha->hw)) { 1409 mcp->mb[1] = 0x00ff; 1410 mcp->mb[10] = 0; 1411 mcp->out_mb |= MBX_10; 1412 } else { 1413 mcp->mb[1] = 0xff00; 1414 } 1415 mcp->mb[2] = vha->hw->loop_reset_delay; 1416 mcp->mb[3] = 0; 1417 } 1418 mcp->in_mb = MBX_0; 1419 mcp->tov = MBX_TOV_SECONDS; 1420 mcp->flags = 0; 1421 rval = qla2x00_mailbox_command(vha, mcp); 1422 1423 if (rval != QLA_SUCCESS) { 1424 /*EMPTY*/ 1425 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", 1426 __func__, vha->host_no, rval)); 1427 } else { 1428 /*EMPTY*/ 1429 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 1430 } 1431 1432 return rval; 1433 } 1434 1435 /* 1436 * qla2x00_send_sns 1437 * Send SNS command. 1438 * 1439 * Input: 1440 * ha = adapter block pointer. 1441 * sns = pointer for command. 1442 * cmd_size = command size. 1443 * buf_size = response/command size. 1444 * TARGET_QUEUE_LOCK must be released. 1445 * ADAPTER_STATE_LOCK must be released. 1446 * 1447 * Returns: 1448 * qla2x00 local function return status code. 1449 * 1450 * Context: 1451 * Kernel context. 1452 */ 1453 int 1454 qla2x00_send_sns(scsi_qla_host_t *vha, dma_addr_t sns_phys_address, 1455 uint16_t cmd_size, size_t buf_size) 1456 { 1457 int rval; 1458 mbx_cmd_t mc; 1459 mbx_cmd_t *mcp = &mc; 1460 1461 DEBUG11(printk("qla2x00_send_sns(%ld): entered.\n", 1462 vha->host_no)); 1463 1464 DEBUG11(printk("qla2x00_send_sns: retry cnt=%d ratov=%d total " 1465 "tov=%d.\n", vha->hw->retry_count, vha->hw->login_timeout, 1466 mcp->tov)); 1467 1468 mcp->mb[0] = MBC_SEND_SNS_COMMAND; 1469 mcp->mb[1] = cmd_size; 1470 mcp->mb[2] = MSW(sns_phys_address); 1471 mcp->mb[3] = LSW(sns_phys_address); 1472 mcp->mb[6] = MSW(MSD(sns_phys_address)); 1473 mcp->mb[7] = LSW(MSD(sns_phys_address)); 1474 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 1475 mcp->in_mb = MBX_0|MBX_1; 1476 mcp->buf_size = buf_size; 1477 mcp->flags = MBX_DMA_OUT|MBX_DMA_IN; 1478 mcp->tov = (vha->hw->login_timeout * 2) + (vha->hw->login_timeout / 2); 1479 rval = qla2x00_mailbox_command(vha, mcp); 1480 1481 if (rval != QLA_SUCCESS) { 1482 /*EMPTY*/ 1483 DEBUG(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x " 1484 "mb[1]=%x.\n", vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 1485 DEBUG2_3_11(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x " 1486 "mb[1]=%x.\n", vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 1487 } else { 1488 /*EMPTY*/ 1489 DEBUG11(printk("qla2x00_send_sns(%ld): done.\n", vha->host_no)); 1490 } 1491 1492 return rval; 1493 } 1494 1495 int 1496 qla24xx_login_fabric(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain, 1497 uint8_t area, uint8_t al_pa, uint16_t *mb, uint8_t opt) 1498 { 1499 int rval; 1500 1501 struct logio_entry_24xx *lg; 1502 dma_addr_t lg_dma; 1503 uint32_t iop[2]; 1504 struct qla_hw_data *ha = vha->hw; 1505 struct req_que *req; 1506 struct rsp_que *rsp; 1507 1508 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 1509 1510 if (ha->flags.cpu_affinity_enabled) 1511 req = ha->req_q_map[0]; 1512 else 1513 req = vha->req; 1514 rsp = req->rsp; 1515 1516 lg = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &lg_dma); 1517 if (lg == NULL) { 1518 DEBUG2_3(printk("%s(%ld): failed to allocate Login IOCB.\n", 1519 __func__, vha->host_no)); 1520 return QLA_MEMORY_ALLOC_FAILED; 1521 } 1522 memset(lg, 0, sizeof(struct logio_entry_24xx)); 1523 1524 lg->entry_type = LOGINOUT_PORT_IOCB_TYPE; 1525 lg->entry_count = 1; 1526 lg->handle = MAKE_HANDLE(req->id, lg->handle); 1527 lg->nport_handle = cpu_to_le16(loop_id); 1528 lg->control_flags = __constant_cpu_to_le16(LCF_COMMAND_PLOGI); 1529 if (opt & BIT_0) 1530 lg->control_flags |= __constant_cpu_to_le16(LCF_COND_PLOGI); 1531 if (opt & BIT_1) 1532 lg->control_flags |= __constant_cpu_to_le16(LCF_SKIP_PRLI); 1533 lg->port_id[0] = al_pa; 1534 lg->port_id[1] = area; 1535 lg->port_id[2] = domain; 1536 lg->vp_index = vha->vp_idx; 1537 rval = qla2x00_issue_iocb(vha, lg, lg_dma, 0); 1538 if (rval != QLA_SUCCESS) { 1539 DEBUG2_3_11(printk("%s(%ld): failed to issue Login IOCB " 1540 "(%x).\n", __func__, vha->host_no, rval)); 1541 } else if (lg->entry_status != 0) { 1542 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 1543 "-- error status (%x).\n", __func__, vha->host_no, 1544 lg->entry_status)); 1545 rval = QLA_FUNCTION_FAILED; 1546 } else if (lg->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) { 1547 iop[0] = le32_to_cpu(lg->io_parameter[0]); 1548 iop[1] = le32_to_cpu(lg->io_parameter[1]); 1549 1550 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 1551 "-- completion status (%x) ioparam=%x/%x.\n", __func__, 1552 vha->host_no, le16_to_cpu(lg->comp_status), iop[0], 1553 iop[1])); 1554 1555 switch (iop[0]) { 1556 case LSC_SCODE_PORTID_USED: 1557 mb[0] = MBS_PORT_ID_USED; 1558 mb[1] = LSW(iop[1]); 1559 break; 1560 case LSC_SCODE_NPORT_USED: 1561 mb[0] = MBS_LOOP_ID_USED; 1562 break; 1563 case LSC_SCODE_NOLINK: 1564 case LSC_SCODE_NOIOCB: 1565 case LSC_SCODE_NOXCB: 1566 case LSC_SCODE_CMD_FAILED: 1567 case LSC_SCODE_NOFABRIC: 1568 case LSC_SCODE_FW_NOT_READY: 1569 case LSC_SCODE_NOT_LOGGED_IN: 1570 case LSC_SCODE_NOPCB: 1571 case LSC_SCODE_ELS_REJECT: 1572 case LSC_SCODE_CMD_PARAM_ERR: 1573 case LSC_SCODE_NONPORT: 1574 case LSC_SCODE_LOGGED_IN: 1575 case LSC_SCODE_NOFLOGI_ACC: 1576 default: 1577 mb[0] = MBS_COMMAND_ERROR; 1578 break; 1579 } 1580 } else { 1581 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 1582 1583 iop[0] = le32_to_cpu(lg->io_parameter[0]); 1584 1585 mb[0] = MBS_COMMAND_COMPLETE; 1586 mb[1] = 0; 1587 if (iop[0] & BIT_4) { 1588 if (iop[0] & BIT_8) 1589 mb[1] |= BIT_1; 1590 } else 1591 mb[1] = BIT_0; 1592 1593 /* Passback COS information. */ 1594 mb[10] = 0; 1595 if (lg->io_parameter[7] || lg->io_parameter[8]) 1596 mb[10] |= BIT_0; /* Class 2. */ 1597 if (lg->io_parameter[9] || lg->io_parameter[10]) 1598 mb[10] |= BIT_1; /* Class 3. */ 1599 } 1600 1601 dma_pool_free(ha->s_dma_pool, lg, lg_dma); 1602 1603 return rval; 1604 } 1605 1606 /* 1607 * qla2x00_login_fabric 1608 * Issue login fabric port mailbox command. 1609 * 1610 * Input: 1611 * ha = adapter block pointer. 1612 * loop_id = device loop ID. 1613 * domain = device domain. 1614 * area = device area. 1615 * al_pa = device AL_PA. 1616 * status = pointer for return status. 1617 * opt = command options. 1618 * TARGET_QUEUE_LOCK must be released. 1619 * ADAPTER_STATE_LOCK must be released. 1620 * 1621 * Returns: 1622 * qla2x00 local function return status code. 1623 * 1624 * Context: 1625 * Kernel context. 1626 */ 1627 int 1628 qla2x00_login_fabric(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain, 1629 uint8_t area, uint8_t al_pa, uint16_t *mb, uint8_t opt) 1630 { 1631 int rval; 1632 mbx_cmd_t mc; 1633 mbx_cmd_t *mcp = &mc; 1634 struct qla_hw_data *ha = vha->hw; 1635 1636 DEBUG11(printk("qla2x00_login_fabric(%ld): entered.\n", vha->host_no)); 1637 1638 mcp->mb[0] = MBC_LOGIN_FABRIC_PORT; 1639 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; 1640 if (HAS_EXTENDED_IDS(ha)) { 1641 mcp->mb[1] = loop_id; 1642 mcp->mb[10] = opt; 1643 mcp->out_mb |= MBX_10; 1644 } else { 1645 mcp->mb[1] = (loop_id << 8) | opt; 1646 } 1647 mcp->mb[2] = domain; 1648 mcp->mb[3] = area << 8 | al_pa; 1649 1650 mcp->in_mb = MBX_7|MBX_6|MBX_2|MBX_1|MBX_0; 1651 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2); 1652 mcp->flags = 0; 1653 rval = qla2x00_mailbox_command(vha, mcp); 1654 1655 /* Return mailbox statuses. */ 1656 if (mb != NULL) { 1657 mb[0] = mcp->mb[0]; 1658 mb[1] = mcp->mb[1]; 1659 mb[2] = mcp->mb[2]; 1660 mb[6] = mcp->mb[6]; 1661 mb[7] = mcp->mb[7]; 1662 /* COS retrieved from Get-Port-Database mailbox command. */ 1663 mb[10] = 0; 1664 } 1665 1666 if (rval != QLA_SUCCESS) { 1667 /* RLU tmp code: need to change main mailbox_command function to 1668 * return ok even when the mailbox completion value is not 1669 * SUCCESS. The caller needs to be responsible to interpret 1670 * the return values of this mailbox command if we're not 1671 * to change too much of the existing code. 1672 */ 1673 if (mcp->mb[0] == 0x4001 || mcp->mb[0] == 0x4002 || 1674 mcp->mb[0] == 0x4003 || mcp->mb[0] == 0x4005 || 1675 mcp->mb[0] == 0x4006) 1676 rval = QLA_SUCCESS; 1677 1678 /*EMPTY*/ 1679 DEBUG2_3_11(printk("qla2x00_login_fabric(%ld): failed=%x " 1680 "mb[0]=%x mb[1]=%x mb[2]=%x.\n", vha->host_no, rval, 1681 mcp->mb[0], mcp->mb[1], mcp->mb[2])); 1682 } else { 1683 /*EMPTY*/ 1684 DEBUG11(printk("qla2x00_login_fabric(%ld): done.\n", 1685 vha->host_no)); 1686 } 1687 1688 return rval; 1689 } 1690 1691 /* 1692 * qla2x00_login_local_device 1693 * Issue login loop port mailbox command. 1694 * 1695 * Input: 1696 * ha = adapter block pointer. 1697 * loop_id = device loop ID. 1698 * opt = command options. 1699 * 1700 * Returns: 1701 * Return status code. 1702 * 1703 * Context: 1704 * Kernel context. 1705 * 1706 */ 1707 int 1708 qla2x00_login_local_device(scsi_qla_host_t *vha, fc_port_t *fcport, 1709 uint16_t *mb_ret, uint8_t opt) 1710 { 1711 int rval; 1712 mbx_cmd_t mc; 1713 mbx_cmd_t *mcp = &mc; 1714 struct qla_hw_data *ha = vha->hw; 1715 1716 if (IS_FWI2_CAPABLE(ha)) 1717 return qla24xx_login_fabric(vha, fcport->loop_id, 1718 fcport->d_id.b.domain, fcport->d_id.b.area, 1719 fcport->d_id.b.al_pa, mb_ret, opt); 1720 1721 DEBUG3(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 1722 1723 mcp->mb[0] = MBC_LOGIN_LOOP_PORT; 1724 if (HAS_EXTENDED_IDS(ha)) 1725 mcp->mb[1] = fcport->loop_id; 1726 else 1727 mcp->mb[1] = fcport->loop_id << 8; 1728 mcp->mb[2] = opt; 1729 mcp->out_mb = MBX_2|MBX_1|MBX_0; 1730 mcp->in_mb = MBX_7|MBX_6|MBX_1|MBX_0; 1731 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2); 1732 mcp->flags = 0; 1733 rval = qla2x00_mailbox_command(vha, mcp); 1734 1735 /* Return mailbox statuses. */ 1736 if (mb_ret != NULL) { 1737 mb_ret[0] = mcp->mb[0]; 1738 mb_ret[1] = mcp->mb[1]; 1739 mb_ret[6] = mcp->mb[6]; 1740 mb_ret[7] = mcp->mb[7]; 1741 } 1742 1743 if (rval != QLA_SUCCESS) { 1744 /* AV tmp code: need to change main mailbox_command function to 1745 * return ok even when the mailbox completion value is not 1746 * SUCCESS. The caller needs to be responsible to interpret 1747 * the return values of this mailbox command if we're not 1748 * to change too much of the existing code. 1749 */ 1750 if (mcp->mb[0] == 0x4005 || mcp->mb[0] == 0x4006) 1751 rval = QLA_SUCCESS; 1752 1753 DEBUG(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x " 1754 "mb[6]=%x mb[7]=%x.\n", __func__, vha->host_no, rval, 1755 mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7])); 1756 DEBUG2_3(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x " 1757 "mb[6]=%x mb[7]=%x.\n", __func__, vha->host_no, rval, 1758 mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7])); 1759 } else { 1760 /*EMPTY*/ 1761 DEBUG3(printk("%s(%ld): done.\n", __func__, vha->host_no)); 1762 } 1763 1764 return (rval); 1765 } 1766 1767 int 1768 qla24xx_fabric_logout(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain, 1769 uint8_t area, uint8_t al_pa) 1770 { 1771 int rval; 1772 struct logio_entry_24xx *lg; 1773 dma_addr_t lg_dma; 1774 struct qla_hw_data *ha = vha->hw; 1775 struct req_que *req; 1776 struct rsp_que *rsp; 1777 1778 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 1779 1780 lg = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &lg_dma); 1781 if (lg == NULL) { 1782 DEBUG2_3(printk("%s(%ld): failed to allocate Logout IOCB.\n", 1783 __func__, vha->host_no)); 1784 return QLA_MEMORY_ALLOC_FAILED; 1785 } 1786 memset(lg, 0, sizeof(struct logio_entry_24xx)); 1787 1788 if (ql2xmaxqueues > 1) 1789 req = ha->req_q_map[0]; 1790 else 1791 req = vha->req; 1792 rsp = req->rsp; 1793 lg->entry_type = LOGINOUT_PORT_IOCB_TYPE; 1794 lg->entry_count = 1; 1795 lg->handle = MAKE_HANDLE(req->id, lg->handle); 1796 lg->nport_handle = cpu_to_le16(loop_id); 1797 lg->control_flags = 1798 __constant_cpu_to_le16(LCF_COMMAND_LOGO|LCF_IMPL_LOGO); 1799 lg->port_id[0] = al_pa; 1800 lg->port_id[1] = area; 1801 lg->port_id[2] = domain; 1802 lg->vp_index = vha->vp_idx; 1803 1804 rval = qla2x00_issue_iocb(vha, lg, lg_dma, 0); 1805 if (rval != QLA_SUCCESS) { 1806 DEBUG2_3_11(printk("%s(%ld): failed to issue Logout IOCB " 1807 "(%x).\n", __func__, vha->host_no, rval)); 1808 } else if (lg->entry_status != 0) { 1809 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 1810 "-- error status (%x).\n", __func__, vha->host_no, 1811 lg->entry_status)); 1812 rval = QLA_FUNCTION_FAILED; 1813 } else if (lg->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) { 1814 DEBUG2_3_11(printk("%s(%ld %d): failed to complete IOCB " 1815 "-- completion status (%x) ioparam=%x/%x.\n", __func__, 1816 vha->host_no, vha->vp_idx, le16_to_cpu(lg->comp_status), 1817 le32_to_cpu(lg->io_parameter[0]), 1818 le32_to_cpu(lg->io_parameter[1]))); 1819 } else { 1820 /*EMPTY*/ 1821 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 1822 } 1823 1824 dma_pool_free(ha->s_dma_pool, lg, lg_dma); 1825 1826 return rval; 1827 } 1828 1829 /* 1830 * qla2x00_fabric_logout 1831 * Issue logout fabric port mailbox command. 1832 * 1833 * Input: 1834 * ha = adapter block pointer. 1835 * loop_id = device loop ID. 1836 * TARGET_QUEUE_LOCK must be released. 1837 * ADAPTER_STATE_LOCK must be released. 1838 * 1839 * Returns: 1840 * qla2x00 local function return status code. 1841 * 1842 * Context: 1843 * Kernel context. 1844 */ 1845 int 1846 qla2x00_fabric_logout(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain, 1847 uint8_t area, uint8_t al_pa) 1848 { 1849 int rval; 1850 mbx_cmd_t mc; 1851 mbx_cmd_t *mcp = &mc; 1852 1853 DEBUG11(printk("qla2x00_fabric_logout(%ld): entered.\n", 1854 vha->host_no)); 1855 1856 mcp->mb[0] = MBC_LOGOUT_FABRIC_PORT; 1857 mcp->out_mb = MBX_1|MBX_0; 1858 if (HAS_EXTENDED_IDS(vha->hw)) { 1859 mcp->mb[1] = loop_id; 1860 mcp->mb[10] = 0; 1861 mcp->out_mb |= MBX_10; 1862 } else { 1863 mcp->mb[1] = loop_id << 8; 1864 } 1865 1866 mcp->in_mb = MBX_1|MBX_0; 1867 mcp->tov = MBX_TOV_SECONDS; 1868 mcp->flags = 0; 1869 rval = qla2x00_mailbox_command(vha, mcp); 1870 1871 if (rval != QLA_SUCCESS) { 1872 /*EMPTY*/ 1873 DEBUG2_3_11(printk("qla2x00_fabric_logout(%ld): failed=%x " 1874 "mbx1=%x.\n", vha->host_no, rval, mcp->mb[1])); 1875 } else { 1876 /*EMPTY*/ 1877 DEBUG11(printk("qla2x00_fabric_logout(%ld): done.\n", 1878 vha->host_no)); 1879 } 1880 1881 return rval; 1882 } 1883 1884 /* 1885 * qla2x00_full_login_lip 1886 * Issue full login LIP mailbox command. 1887 * 1888 * Input: 1889 * ha = adapter block pointer. 1890 * TARGET_QUEUE_LOCK must be released. 1891 * ADAPTER_STATE_LOCK must be released. 1892 * 1893 * Returns: 1894 * qla2x00 local function return status code. 1895 * 1896 * Context: 1897 * Kernel context. 1898 */ 1899 int 1900 qla2x00_full_login_lip(scsi_qla_host_t *vha) 1901 { 1902 int rval; 1903 mbx_cmd_t mc; 1904 mbx_cmd_t *mcp = &mc; 1905 1906 DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n", 1907 vha->host_no)); 1908 1909 mcp->mb[0] = MBC_LIP_FULL_LOGIN; 1910 mcp->mb[1] = IS_FWI2_CAPABLE(vha->hw) ? BIT_3 : 0; 1911 mcp->mb[2] = 0; 1912 mcp->mb[3] = 0; 1913 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; 1914 mcp->in_mb = MBX_0; 1915 mcp->tov = MBX_TOV_SECONDS; 1916 mcp->flags = 0; 1917 rval = qla2x00_mailbox_command(vha, mcp); 1918 1919 if (rval != QLA_SUCCESS) { 1920 /*EMPTY*/ 1921 DEBUG2_3_11(printk("qla2x00_full_login_lip(%ld): failed=%x.\n", 1922 vha->host_no, rval)); 1923 } else { 1924 /*EMPTY*/ 1925 DEBUG11(printk("qla2x00_full_login_lip(%ld): done.\n", 1926 vha->host_no)); 1927 } 1928 1929 return rval; 1930 } 1931 1932 /* 1933 * qla2x00_get_id_list 1934 * 1935 * Input: 1936 * ha = adapter block pointer. 1937 * 1938 * Returns: 1939 * qla2x00 local function return status code. 1940 * 1941 * Context: 1942 * Kernel context. 1943 */ 1944 int 1945 qla2x00_get_id_list(scsi_qla_host_t *vha, void *id_list, dma_addr_t id_list_dma, 1946 uint16_t *entries) 1947 { 1948 int rval; 1949 mbx_cmd_t mc; 1950 mbx_cmd_t *mcp = &mc; 1951 1952 DEBUG11(printk("qla2x00_get_id_list(%ld): entered.\n", 1953 vha->host_no)); 1954 1955 if (id_list == NULL) 1956 return QLA_FUNCTION_FAILED; 1957 1958 mcp->mb[0] = MBC_GET_ID_LIST; 1959 mcp->out_mb = MBX_0; 1960 if (IS_FWI2_CAPABLE(vha->hw)) { 1961 mcp->mb[2] = MSW(id_list_dma); 1962 mcp->mb[3] = LSW(id_list_dma); 1963 mcp->mb[6] = MSW(MSD(id_list_dma)); 1964 mcp->mb[7] = LSW(MSD(id_list_dma)); 1965 mcp->mb[8] = 0; 1966 mcp->mb[9] = vha->vp_idx; 1967 mcp->out_mb |= MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2; 1968 } else { 1969 mcp->mb[1] = MSW(id_list_dma); 1970 mcp->mb[2] = LSW(id_list_dma); 1971 mcp->mb[3] = MSW(MSD(id_list_dma)); 1972 mcp->mb[6] = LSW(MSD(id_list_dma)); 1973 mcp->out_mb |= MBX_6|MBX_3|MBX_2|MBX_1; 1974 } 1975 mcp->in_mb = MBX_1|MBX_0; 1976 mcp->tov = MBX_TOV_SECONDS; 1977 mcp->flags = 0; 1978 rval = qla2x00_mailbox_command(vha, mcp); 1979 1980 if (rval != QLA_SUCCESS) { 1981 /*EMPTY*/ 1982 DEBUG2_3_11(printk("qla2x00_get_id_list(%ld): failed=%x.\n", 1983 vha->host_no, rval)); 1984 } else { 1985 *entries = mcp->mb[1]; 1986 DEBUG11(printk("qla2x00_get_id_list(%ld): done.\n", 1987 vha->host_no)); 1988 } 1989 1990 return rval; 1991 } 1992 1993 /* 1994 * qla2x00_get_resource_cnts 1995 * Get current firmware resource counts. 1996 * 1997 * Input: 1998 * ha = adapter block pointer. 1999 * 2000 * Returns: 2001 * qla2x00 local function return status code. 2002 * 2003 * Context: 2004 * Kernel context. 2005 */ 2006 int 2007 qla2x00_get_resource_cnts(scsi_qla_host_t *vha, uint16_t *cur_xchg_cnt, 2008 uint16_t *orig_xchg_cnt, uint16_t *cur_iocb_cnt, 2009 uint16_t *orig_iocb_cnt, uint16_t *max_npiv_vports) 2010 { 2011 int rval; 2012 mbx_cmd_t mc; 2013 mbx_cmd_t *mcp = &mc; 2014 2015 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2016 2017 mcp->mb[0] = MBC_GET_RESOURCE_COUNTS; 2018 mcp->out_mb = MBX_0; 2019 mcp->in_mb = MBX_11|MBX_10|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 2020 mcp->tov = MBX_TOV_SECONDS; 2021 mcp->flags = 0; 2022 rval = qla2x00_mailbox_command(vha, mcp); 2023 2024 if (rval != QLA_SUCCESS) { 2025 /*EMPTY*/ 2026 DEBUG2_3_11(printk("%s(%ld): failed = %x.\n", __func__, 2027 vha->host_no, mcp->mb[0])); 2028 } else { 2029 DEBUG11(printk("%s(%ld): done. mb1=%x mb2=%x mb3=%x mb6=%x " 2030 "mb7=%x mb10=%x mb11=%x.\n", __func__, vha->host_no, 2031 mcp->mb[1], mcp->mb[2], mcp->mb[3], mcp->mb[6], mcp->mb[7], 2032 mcp->mb[10], mcp->mb[11])); 2033 2034 if (cur_xchg_cnt) 2035 *cur_xchg_cnt = mcp->mb[3]; 2036 if (orig_xchg_cnt) 2037 *orig_xchg_cnt = mcp->mb[6]; 2038 if (cur_iocb_cnt) 2039 *cur_iocb_cnt = mcp->mb[7]; 2040 if (orig_iocb_cnt) 2041 *orig_iocb_cnt = mcp->mb[10]; 2042 if (vha->hw->flags.npiv_supported && max_npiv_vports) 2043 *max_npiv_vports = mcp->mb[11]; 2044 } 2045 2046 return (rval); 2047 } 2048 2049 #if defined(QL_DEBUG_LEVEL_3) 2050 /* 2051 * qla2x00_get_fcal_position_map 2052 * Get FCAL (LILP) position map using mailbox command 2053 * 2054 * Input: 2055 * ha = adapter state pointer. 2056 * pos_map = buffer pointer (can be NULL). 2057 * 2058 * Returns: 2059 * qla2x00 local function return status code. 2060 * 2061 * Context: 2062 * Kernel context. 2063 */ 2064 int 2065 qla2x00_get_fcal_position_map(scsi_qla_host_t *vha, char *pos_map) 2066 { 2067 int rval; 2068 mbx_cmd_t mc; 2069 mbx_cmd_t *mcp = &mc; 2070 char *pmap; 2071 dma_addr_t pmap_dma; 2072 struct qla_hw_data *ha = vha->hw; 2073 2074 pmap = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &pmap_dma); 2075 if (pmap == NULL) { 2076 DEBUG2_3_11(printk("%s(%ld): **** Mem Alloc Failed ****", 2077 __func__, vha->host_no)); 2078 return QLA_MEMORY_ALLOC_FAILED; 2079 } 2080 memset(pmap, 0, FCAL_MAP_SIZE); 2081 2082 mcp->mb[0] = MBC_GET_FC_AL_POSITION_MAP; 2083 mcp->mb[2] = MSW(pmap_dma); 2084 mcp->mb[3] = LSW(pmap_dma); 2085 mcp->mb[6] = MSW(MSD(pmap_dma)); 2086 mcp->mb[7] = LSW(MSD(pmap_dma)); 2087 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; 2088 mcp->in_mb = MBX_1|MBX_0; 2089 mcp->buf_size = FCAL_MAP_SIZE; 2090 mcp->flags = MBX_DMA_IN; 2091 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2); 2092 rval = qla2x00_mailbox_command(vha, mcp); 2093 2094 if (rval == QLA_SUCCESS) { 2095 DEBUG11(printk("%s(%ld): (mb0=%x/mb1=%x) FC/AL Position Map " 2096 "size (%x)\n", __func__, vha->host_no, mcp->mb[0], 2097 mcp->mb[1], (unsigned)pmap[0])); 2098 DEBUG11(qla2x00_dump_buffer(pmap, pmap[0] + 1)); 2099 2100 if (pos_map) 2101 memcpy(pos_map, pmap, FCAL_MAP_SIZE); 2102 } 2103 dma_pool_free(ha->s_dma_pool, pmap, pmap_dma); 2104 2105 if (rval != QLA_SUCCESS) { 2106 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 2107 vha->host_no, rval)); 2108 } else { 2109 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2110 } 2111 2112 return rval; 2113 } 2114 #endif 2115 2116 /* 2117 * qla2x00_get_link_status 2118 * 2119 * Input: 2120 * ha = adapter block pointer. 2121 * loop_id = device loop ID. 2122 * ret_buf = pointer to link status return buffer. 2123 * 2124 * Returns: 2125 * 0 = success. 2126 * BIT_0 = mem alloc error. 2127 * BIT_1 = mailbox error. 2128 */ 2129 int 2130 qla2x00_get_link_status(scsi_qla_host_t *vha, uint16_t loop_id, 2131 struct link_statistics *stats, dma_addr_t stats_dma) 2132 { 2133 int rval; 2134 mbx_cmd_t mc; 2135 mbx_cmd_t *mcp = &mc; 2136 uint32_t *siter, *diter, dwords; 2137 struct qla_hw_data *ha = vha->hw; 2138 2139 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2140 2141 mcp->mb[0] = MBC_GET_LINK_STATUS; 2142 mcp->mb[2] = MSW(stats_dma); 2143 mcp->mb[3] = LSW(stats_dma); 2144 mcp->mb[6] = MSW(MSD(stats_dma)); 2145 mcp->mb[7] = LSW(MSD(stats_dma)); 2146 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; 2147 mcp->in_mb = MBX_0; 2148 if (IS_FWI2_CAPABLE(ha)) { 2149 mcp->mb[1] = loop_id; 2150 mcp->mb[4] = 0; 2151 mcp->mb[10] = 0; 2152 mcp->out_mb |= MBX_10|MBX_4|MBX_1; 2153 mcp->in_mb |= MBX_1; 2154 } else if (HAS_EXTENDED_IDS(ha)) { 2155 mcp->mb[1] = loop_id; 2156 mcp->mb[10] = 0; 2157 mcp->out_mb |= MBX_10|MBX_1; 2158 } else { 2159 mcp->mb[1] = loop_id << 8; 2160 mcp->out_mb |= MBX_1; 2161 } 2162 mcp->tov = MBX_TOV_SECONDS; 2163 mcp->flags = IOCTL_CMD; 2164 rval = qla2x00_mailbox_command(vha, mcp); 2165 2166 if (rval == QLA_SUCCESS) { 2167 if (mcp->mb[0] != MBS_COMMAND_COMPLETE) { 2168 DEBUG2_3_11(printk("%s(%ld): cmd failed. mbx0=%x.\n", 2169 __func__, vha->host_no, mcp->mb[0])); 2170 rval = QLA_FUNCTION_FAILED; 2171 } else { 2172 /* Copy over data -- firmware data is LE. */ 2173 dwords = offsetof(struct link_statistics, unused1) / 4; 2174 siter = diter = &stats->link_fail_cnt; 2175 while (dwords--) 2176 *diter++ = le32_to_cpu(*siter++); 2177 } 2178 } else { 2179 /* Failed. */ 2180 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 2181 vha->host_no, rval)); 2182 } 2183 2184 return rval; 2185 } 2186 2187 int 2188 qla24xx_get_isp_stats(scsi_qla_host_t *vha, struct link_statistics *stats, 2189 dma_addr_t stats_dma) 2190 { 2191 int rval; 2192 mbx_cmd_t mc; 2193 mbx_cmd_t *mcp = &mc; 2194 uint32_t *siter, *diter, dwords; 2195 2196 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2197 2198 mcp->mb[0] = MBC_GET_LINK_PRIV_STATS; 2199 mcp->mb[2] = MSW(stats_dma); 2200 mcp->mb[3] = LSW(stats_dma); 2201 mcp->mb[6] = MSW(MSD(stats_dma)); 2202 mcp->mb[7] = LSW(MSD(stats_dma)); 2203 mcp->mb[8] = sizeof(struct link_statistics) / 4; 2204 mcp->mb[9] = vha->vp_idx; 2205 mcp->mb[10] = 0; 2206 mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; 2207 mcp->in_mb = MBX_2|MBX_1|MBX_0; 2208 mcp->tov = MBX_TOV_SECONDS; 2209 mcp->flags = IOCTL_CMD; 2210 rval = qla2x00_mailbox_command(vha, mcp); 2211 2212 if (rval == QLA_SUCCESS) { 2213 if (mcp->mb[0] != MBS_COMMAND_COMPLETE) { 2214 DEBUG2_3_11(printk("%s(%ld): cmd failed. mbx0=%x.\n", 2215 __func__, vha->host_no, mcp->mb[0])); 2216 rval = QLA_FUNCTION_FAILED; 2217 } else { 2218 /* Copy over data -- firmware data is LE. */ 2219 dwords = sizeof(struct link_statistics) / 4; 2220 siter = diter = &stats->link_fail_cnt; 2221 while (dwords--) 2222 *diter++ = le32_to_cpu(*siter++); 2223 } 2224 } else { 2225 /* Failed. */ 2226 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 2227 vha->host_no, rval)); 2228 } 2229 2230 return rval; 2231 } 2232 2233 int 2234 qla24xx_abort_command(srb_t *sp) 2235 { 2236 int rval; 2237 unsigned long flags = 0; 2238 2239 struct abort_entry_24xx *abt; 2240 dma_addr_t abt_dma; 2241 uint32_t handle; 2242 fc_port_t *fcport = sp->fcport; 2243 struct scsi_qla_host *vha = fcport->vha; 2244 struct qla_hw_data *ha = vha->hw; 2245 struct req_que *req = vha->req; 2246 2247 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2248 2249 spin_lock_irqsave(&ha->hardware_lock, flags); 2250 for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) { 2251 if (req->outstanding_cmds[handle] == sp) 2252 break; 2253 } 2254 spin_unlock_irqrestore(&ha->hardware_lock, flags); 2255 if (handle == MAX_OUTSTANDING_COMMANDS) { 2256 /* Command not found. */ 2257 return QLA_FUNCTION_FAILED; 2258 } 2259 2260 abt = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &abt_dma); 2261 if (abt == NULL) { 2262 DEBUG2_3(printk("%s(%ld): failed to allocate Abort IOCB.\n", 2263 __func__, vha->host_no)); 2264 return QLA_MEMORY_ALLOC_FAILED; 2265 } 2266 memset(abt, 0, sizeof(struct abort_entry_24xx)); 2267 2268 abt->entry_type = ABORT_IOCB_TYPE; 2269 abt->entry_count = 1; 2270 abt->handle = MAKE_HANDLE(req->id, abt->handle); 2271 abt->nport_handle = cpu_to_le16(fcport->loop_id); 2272 abt->handle_to_abort = handle; 2273 abt->port_id[0] = fcport->d_id.b.al_pa; 2274 abt->port_id[1] = fcport->d_id.b.area; 2275 abt->port_id[2] = fcport->d_id.b.domain; 2276 abt->vp_index = fcport->vp_idx; 2277 2278 abt->req_que_no = cpu_to_le16(req->id); 2279 2280 rval = qla2x00_issue_iocb(vha, abt, abt_dma, 0); 2281 if (rval != QLA_SUCCESS) { 2282 DEBUG2_3_11(printk("%s(%ld): failed to issue IOCB (%x).\n", 2283 __func__, vha->host_no, rval)); 2284 } else if (abt->entry_status != 0) { 2285 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2286 "-- error status (%x).\n", __func__, vha->host_no, 2287 abt->entry_status)); 2288 rval = QLA_FUNCTION_FAILED; 2289 } else if (abt->nport_handle != __constant_cpu_to_le16(0)) { 2290 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2291 "-- completion status (%x).\n", __func__, vha->host_no, 2292 le16_to_cpu(abt->nport_handle))); 2293 rval = QLA_FUNCTION_FAILED; 2294 } else { 2295 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2296 } 2297 2298 dma_pool_free(ha->s_dma_pool, abt, abt_dma); 2299 2300 return rval; 2301 } 2302 2303 struct tsk_mgmt_cmd { 2304 union { 2305 struct tsk_mgmt_entry tsk; 2306 struct sts_entry_24xx sts; 2307 } p; 2308 }; 2309 2310 static int 2311 __qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport, 2312 unsigned int l, int tag) 2313 { 2314 int rval, rval2; 2315 struct tsk_mgmt_cmd *tsk; 2316 dma_addr_t tsk_dma; 2317 scsi_qla_host_t *vha; 2318 struct qla_hw_data *ha; 2319 struct req_que *req; 2320 struct rsp_que *rsp; 2321 2322 DEBUG11(printk("%s(%ld): entered.\n", __func__, fcport->vha->host_no)); 2323 2324 vha = fcport->vha; 2325 ha = vha->hw; 2326 req = vha->req; 2327 if (ha->flags.cpu_affinity_enabled) 2328 rsp = ha->rsp_q_map[tag + 1]; 2329 else 2330 rsp = req->rsp; 2331 tsk = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &tsk_dma); 2332 if (tsk == NULL) { 2333 DEBUG2_3(printk("%s(%ld): failed to allocate Task Management " 2334 "IOCB.\n", __func__, vha->host_no)); 2335 return QLA_MEMORY_ALLOC_FAILED; 2336 } 2337 memset(tsk, 0, sizeof(struct tsk_mgmt_cmd)); 2338 2339 tsk->p.tsk.entry_type = TSK_MGMT_IOCB_TYPE; 2340 tsk->p.tsk.entry_count = 1; 2341 tsk->p.tsk.handle = MAKE_HANDLE(req->id, tsk->p.tsk.handle); 2342 tsk->p.tsk.nport_handle = cpu_to_le16(fcport->loop_id); 2343 tsk->p.tsk.timeout = cpu_to_le16(ha->r_a_tov / 10 * 2); 2344 tsk->p.tsk.control_flags = cpu_to_le32(type); 2345 tsk->p.tsk.port_id[0] = fcport->d_id.b.al_pa; 2346 tsk->p.tsk.port_id[1] = fcport->d_id.b.area; 2347 tsk->p.tsk.port_id[2] = fcport->d_id.b.domain; 2348 tsk->p.tsk.vp_index = fcport->vp_idx; 2349 if (type == TCF_LUN_RESET) { 2350 int_to_scsilun(l, &tsk->p.tsk.lun); 2351 host_to_fcp_swap((uint8_t *)&tsk->p.tsk.lun, 2352 sizeof(tsk->p.tsk.lun)); 2353 } 2354 2355 rval = qla2x00_issue_iocb(vha, tsk, tsk_dma, 0); 2356 if (rval != QLA_SUCCESS) { 2357 DEBUG2_3_11(printk("%s(%ld): failed to issue %s Reset IOCB " 2358 "(%x).\n", __func__, vha->host_no, name, rval)); 2359 } else if (tsk->p.sts.entry_status != 0) { 2360 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2361 "-- error status (%x).\n", __func__, vha->host_no, 2362 tsk->p.sts.entry_status)); 2363 rval = QLA_FUNCTION_FAILED; 2364 } else if (tsk->p.sts.comp_status != 2365 __constant_cpu_to_le16(CS_COMPLETE)) { 2366 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2367 "-- completion status (%x).\n", __func__, 2368 vha->host_no, le16_to_cpu(tsk->p.sts.comp_status))); 2369 rval = QLA_FUNCTION_FAILED; 2370 } 2371 2372 /* Issue marker IOCB. */ 2373 rval2 = qla2x00_marker(vha, req, rsp, fcport->loop_id, l, 2374 type == TCF_LUN_RESET ? MK_SYNC_ID_LUN: MK_SYNC_ID); 2375 if (rval2 != QLA_SUCCESS) { 2376 DEBUG2_3_11(printk("%s(%ld): failed to issue Marker IOCB " 2377 "(%x).\n", __func__, vha->host_no, rval2)); 2378 } else { 2379 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2380 } 2381 2382 dma_pool_free(ha->s_dma_pool, tsk, tsk_dma); 2383 2384 return rval; 2385 } 2386 2387 int 2388 qla24xx_abort_target(struct fc_port *fcport, unsigned int l, int tag) 2389 { 2390 return __qla24xx_issue_tmf("Target", TCF_TARGET_RESET, fcport, l, tag); 2391 } 2392 2393 int 2394 qla24xx_lun_reset(struct fc_port *fcport, unsigned int l, int tag) 2395 { 2396 return __qla24xx_issue_tmf("Lun", TCF_LUN_RESET, fcport, l, tag); 2397 } 2398 2399 int 2400 qla2x00_system_error(scsi_qla_host_t *vha) 2401 { 2402 int rval; 2403 mbx_cmd_t mc; 2404 mbx_cmd_t *mcp = &mc; 2405 struct qla_hw_data *ha = vha->hw; 2406 2407 if (!IS_QLA23XX(ha) && !IS_FWI2_CAPABLE(ha)) 2408 return QLA_FUNCTION_FAILED; 2409 2410 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2411 2412 mcp->mb[0] = MBC_GEN_SYSTEM_ERROR; 2413 mcp->out_mb = MBX_0; 2414 mcp->in_mb = MBX_0; 2415 mcp->tov = 5; 2416 mcp->flags = 0; 2417 rval = qla2x00_mailbox_command(vha, mcp); 2418 2419 if (rval != QLA_SUCCESS) { 2420 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 2421 vha->host_no, rval)); 2422 } else { 2423 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2424 } 2425 2426 return rval; 2427 } 2428 2429 /** 2430 * qla2x00_set_serdes_params() - 2431 * @ha: HA context 2432 * 2433 * Returns 2434 */ 2435 int 2436 qla2x00_set_serdes_params(scsi_qla_host_t *vha, uint16_t sw_em_1g, 2437 uint16_t sw_em_2g, uint16_t sw_em_4g) 2438 { 2439 int rval; 2440 mbx_cmd_t mc; 2441 mbx_cmd_t *mcp = &mc; 2442 2443 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2444 2445 mcp->mb[0] = MBC_SERDES_PARAMS; 2446 mcp->mb[1] = BIT_0; 2447 mcp->mb[2] = sw_em_1g | BIT_15; 2448 mcp->mb[3] = sw_em_2g | BIT_15; 2449 mcp->mb[4] = sw_em_4g | BIT_15; 2450 mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 2451 mcp->in_mb = MBX_0; 2452 mcp->tov = MBX_TOV_SECONDS; 2453 mcp->flags = 0; 2454 rval = qla2x00_mailbox_command(vha, mcp); 2455 2456 if (rval != QLA_SUCCESS) { 2457 /*EMPTY*/ 2458 DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__, 2459 vha->host_no, rval, mcp->mb[0])); 2460 } else { 2461 /*EMPTY*/ 2462 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2463 } 2464 2465 return rval; 2466 } 2467 2468 int 2469 qla2x00_stop_firmware(scsi_qla_host_t *vha) 2470 { 2471 int rval; 2472 mbx_cmd_t mc; 2473 mbx_cmd_t *mcp = &mc; 2474 2475 if (!IS_FWI2_CAPABLE(vha->hw)) 2476 return QLA_FUNCTION_FAILED; 2477 2478 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2479 2480 mcp->mb[0] = MBC_STOP_FIRMWARE; 2481 mcp->out_mb = MBX_0; 2482 mcp->in_mb = MBX_0; 2483 mcp->tov = 5; 2484 mcp->flags = 0; 2485 rval = qla2x00_mailbox_command(vha, mcp); 2486 2487 if (rval != QLA_SUCCESS) { 2488 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 2489 vha->host_no, rval)); 2490 if (mcp->mb[0] == MBS_INVALID_COMMAND) 2491 rval = QLA_INVALID_COMMAND; 2492 } else { 2493 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2494 } 2495 2496 return rval; 2497 } 2498 2499 int 2500 qla2x00_enable_eft_trace(scsi_qla_host_t *vha, dma_addr_t eft_dma, 2501 uint16_t buffers) 2502 { 2503 int rval; 2504 mbx_cmd_t mc; 2505 mbx_cmd_t *mcp = &mc; 2506 2507 if (!IS_FWI2_CAPABLE(vha->hw)) 2508 return QLA_FUNCTION_FAILED; 2509 2510 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2511 2512 mcp->mb[0] = MBC_TRACE_CONTROL; 2513 mcp->mb[1] = TC_EFT_ENABLE; 2514 mcp->mb[2] = LSW(eft_dma); 2515 mcp->mb[3] = MSW(eft_dma); 2516 mcp->mb[4] = LSW(MSD(eft_dma)); 2517 mcp->mb[5] = MSW(MSD(eft_dma)); 2518 mcp->mb[6] = buffers; 2519 mcp->mb[7] = TC_AEN_DISABLE; 2520 mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 2521 mcp->in_mb = MBX_1|MBX_0; 2522 mcp->tov = MBX_TOV_SECONDS; 2523 mcp->flags = 0; 2524 rval = qla2x00_mailbox_command(vha, mcp); 2525 if (rval != QLA_SUCCESS) { 2526 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n", 2527 __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 2528 } else { 2529 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2530 } 2531 2532 return rval; 2533 } 2534 2535 int 2536 qla2x00_disable_eft_trace(scsi_qla_host_t *vha) 2537 { 2538 int rval; 2539 mbx_cmd_t mc; 2540 mbx_cmd_t *mcp = &mc; 2541 2542 if (!IS_FWI2_CAPABLE(vha->hw)) 2543 return QLA_FUNCTION_FAILED; 2544 2545 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2546 2547 mcp->mb[0] = MBC_TRACE_CONTROL; 2548 mcp->mb[1] = TC_EFT_DISABLE; 2549 mcp->out_mb = MBX_1|MBX_0; 2550 mcp->in_mb = MBX_1|MBX_0; 2551 mcp->tov = MBX_TOV_SECONDS; 2552 mcp->flags = 0; 2553 rval = qla2x00_mailbox_command(vha, mcp); 2554 if (rval != QLA_SUCCESS) { 2555 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n", 2556 __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 2557 } else { 2558 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2559 } 2560 2561 return rval; 2562 } 2563 2564 int 2565 qla2x00_enable_fce_trace(scsi_qla_host_t *vha, dma_addr_t fce_dma, 2566 uint16_t buffers, uint16_t *mb, uint32_t *dwords) 2567 { 2568 int rval; 2569 mbx_cmd_t mc; 2570 mbx_cmd_t *mcp = &mc; 2571 2572 if (!IS_QLA25XX(vha->hw) && !IS_QLA81XX(vha->hw)) 2573 return QLA_FUNCTION_FAILED; 2574 2575 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2576 2577 mcp->mb[0] = MBC_TRACE_CONTROL; 2578 mcp->mb[1] = TC_FCE_ENABLE; 2579 mcp->mb[2] = LSW(fce_dma); 2580 mcp->mb[3] = MSW(fce_dma); 2581 mcp->mb[4] = LSW(MSD(fce_dma)); 2582 mcp->mb[5] = MSW(MSD(fce_dma)); 2583 mcp->mb[6] = buffers; 2584 mcp->mb[7] = TC_AEN_DISABLE; 2585 mcp->mb[8] = 0; 2586 mcp->mb[9] = TC_FCE_DEFAULT_RX_SIZE; 2587 mcp->mb[10] = TC_FCE_DEFAULT_TX_SIZE; 2588 mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2| 2589 MBX_1|MBX_0; 2590 mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 2591 mcp->tov = MBX_TOV_SECONDS; 2592 mcp->flags = 0; 2593 rval = qla2x00_mailbox_command(vha, mcp); 2594 if (rval != QLA_SUCCESS) { 2595 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n", 2596 __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 2597 } else { 2598 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2599 2600 if (mb) 2601 memcpy(mb, mcp->mb, 8 * sizeof(*mb)); 2602 if (dwords) 2603 *dwords = buffers; 2604 } 2605 2606 return rval; 2607 } 2608 2609 int 2610 qla2x00_disable_fce_trace(scsi_qla_host_t *vha, uint64_t *wr, uint64_t *rd) 2611 { 2612 int rval; 2613 mbx_cmd_t mc; 2614 mbx_cmd_t *mcp = &mc; 2615 2616 if (!IS_FWI2_CAPABLE(vha->hw)) 2617 return QLA_FUNCTION_FAILED; 2618 2619 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2620 2621 mcp->mb[0] = MBC_TRACE_CONTROL; 2622 mcp->mb[1] = TC_FCE_DISABLE; 2623 mcp->mb[2] = TC_FCE_DISABLE_TRACE; 2624 mcp->out_mb = MBX_2|MBX_1|MBX_0; 2625 mcp->in_mb = MBX_9|MBX_8|MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2| 2626 MBX_1|MBX_0; 2627 mcp->tov = MBX_TOV_SECONDS; 2628 mcp->flags = 0; 2629 rval = qla2x00_mailbox_command(vha, mcp); 2630 if (rval != QLA_SUCCESS) { 2631 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n", 2632 __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 2633 } else { 2634 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2635 2636 if (wr) 2637 *wr = (uint64_t) mcp->mb[5] << 48 | 2638 (uint64_t) mcp->mb[4] << 32 | 2639 (uint64_t) mcp->mb[3] << 16 | 2640 (uint64_t) mcp->mb[2]; 2641 if (rd) 2642 *rd = (uint64_t) mcp->mb[9] << 48 | 2643 (uint64_t) mcp->mb[8] << 32 | 2644 (uint64_t) mcp->mb[7] << 16 | 2645 (uint64_t) mcp->mb[6]; 2646 } 2647 2648 return rval; 2649 } 2650 2651 int 2652 qla2x00_read_sfp(scsi_qla_host_t *vha, dma_addr_t sfp_dma, uint16_t addr, 2653 uint16_t off, uint16_t count) 2654 { 2655 int rval; 2656 mbx_cmd_t mc; 2657 mbx_cmd_t *mcp = &mc; 2658 2659 if (!IS_FWI2_CAPABLE(vha->hw)) 2660 return QLA_FUNCTION_FAILED; 2661 2662 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2663 2664 mcp->mb[0] = MBC_READ_SFP; 2665 mcp->mb[1] = addr; 2666 mcp->mb[2] = MSW(sfp_dma); 2667 mcp->mb[3] = LSW(sfp_dma); 2668 mcp->mb[6] = MSW(MSD(sfp_dma)); 2669 mcp->mb[7] = LSW(MSD(sfp_dma)); 2670 mcp->mb[8] = count; 2671 mcp->mb[9] = off; 2672 mcp->mb[10] = 0; 2673 mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 2674 mcp->in_mb = MBX_0; 2675 mcp->tov = MBX_TOV_SECONDS; 2676 mcp->flags = 0; 2677 rval = qla2x00_mailbox_command(vha, mcp); 2678 2679 if (rval != QLA_SUCCESS) { 2680 DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__, 2681 vha->host_no, rval, mcp->mb[0])); 2682 } else { 2683 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2684 } 2685 2686 return rval; 2687 } 2688 2689 int 2690 qla2x00_set_idma_speed(scsi_qla_host_t *vha, uint16_t loop_id, 2691 uint16_t port_speed, uint16_t *mb) 2692 { 2693 int rval; 2694 mbx_cmd_t mc; 2695 mbx_cmd_t *mcp = &mc; 2696 2697 if (!IS_IIDMA_CAPABLE(vha->hw)) 2698 return QLA_FUNCTION_FAILED; 2699 2700 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2701 2702 mcp->mb[0] = MBC_PORT_PARAMS; 2703 mcp->mb[1] = loop_id; 2704 mcp->mb[2] = BIT_0; 2705 if (IS_QLA81XX(vha->hw)) 2706 mcp->mb[3] = port_speed & (BIT_5|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0); 2707 else 2708 mcp->mb[3] = port_speed & (BIT_2|BIT_1|BIT_0); 2709 mcp->mb[9] = vha->vp_idx; 2710 mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0; 2711 mcp->in_mb = MBX_3|MBX_1|MBX_0; 2712 mcp->tov = MBX_TOV_SECONDS; 2713 mcp->flags = 0; 2714 rval = qla2x00_mailbox_command(vha, mcp); 2715 2716 /* Return mailbox statuses. */ 2717 if (mb != NULL) { 2718 mb[0] = mcp->mb[0]; 2719 mb[1] = mcp->mb[1]; 2720 mb[3] = mcp->mb[3]; 2721 } 2722 2723 if (rval != QLA_SUCCESS) { 2724 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 2725 vha->host_no, rval)); 2726 } else { 2727 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2728 } 2729 2730 return rval; 2731 } 2732 2733 void 2734 qla24xx_report_id_acquisition(scsi_qla_host_t *vha, 2735 struct vp_rpt_id_entry_24xx *rptid_entry) 2736 { 2737 uint8_t vp_idx; 2738 uint16_t stat = le16_to_cpu(rptid_entry->vp_idx); 2739 struct qla_hw_data *ha = vha->hw; 2740 scsi_qla_host_t *vp; 2741 scsi_qla_host_t *tvp; 2742 2743 if (rptid_entry->entry_status != 0) 2744 return; 2745 2746 if (rptid_entry->format == 0) { 2747 DEBUG15(printk("%s:format 0 : scsi(%ld) number of VPs setup %d," 2748 " number of VPs acquired %d\n", __func__, vha->host_no, 2749 MSB(le16_to_cpu(rptid_entry->vp_count)), 2750 LSB(le16_to_cpu(rptid_entry->vp_count)))); 2751 DEBUG15(printk("%s primary port id %02x%02x%02x\n", __func__, 2752 rptid_entry->port_id[2], rptid_entry->port_id[1], 2753 rptid_entry->port_id[0])); 2754 } else if (rptid_entry->format == 1) { 2755 vp_idx = LSB(stat); 2756 DEBUG15(printk("%s:format 1: scsi(%ld): VP[%d] enabled " 2757 "- status %d - " 2758 "with port id %02x%02x%02x\n", __func__, vha->host_no, 2759 vp_idx, MSB(stat), 2760 rptid_entry->port_id[2], rptid_entry->port_id[1], 2761 rptid_entry->port_id[0])); 2762 if (vp_idx == 0) 2763 return; 2764 2765 if (MSB(stat) == 1) { 2766 DEBUG2(printk("scsi(%ld): Could not acquire ID for " 2767 "VP[%d].\n", vha->host_no, vp_idx)); 2768 return; 2769 } 2770 2771 list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) 2772 if (vp_idx == vp->vp_idx) 2773 break; 2774 if (!vp) 2775 return; 2776 2777 vp->d_id.b.domain = rptid_entry->port_id[2]; 2778 vp->d_id.b.area = rptid_entry->port_id[1]; 2779 vp->d_id.b.al_pa = rptid_entry->port_id[0]; 2780 2781 /* 2782 * Cannot configure here as we are still sitting on the 2783 * response queue. Handle it in dpc context. 2784 */ 2785 set_bit(VP_IDX_ACQUIRED, &vp->vp_flags); 2786 set_bit(VP_DPC_NEEDED, &vha->dpc_flags); 2787 2788 qla2xxx_wake_dpc(vha); 2789 } 2790 } 2791 2792 /* 2793 * qla24xx_modify_vp_config 2794 * Change VP configuration for vha 2795 * 2796 * Input: 2797 * vha = adapter block pointer. 2798 * 2799 * Returns: 2800 * qla2xxx local function return status code. 2801 * 2802 * Context: 2803 * Kernel context. 2804 */ 2805 int 2806 qla24xx_modify_vp_config(scsi_qla_host_t *vha) 2807 { 2808 int rval; 2809 struct vp_config_entry_24xx *vpmod; 2810 dma_addr_t vpmod_dma; 2811 struct qla_hw_data *ha = vha->hw; 2812 struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); 2813 2814 /* This can be called by the parent */ 2815 2816 vpmod = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &vpmod_dma); 2817 if (!vpmod) { 2818 DEBUG2_3(printk("%s(%ld): failed to allocate Modify VP " 2819 "IOCB.\n", __func__, vha->host_no)); 2820 return QLA_MEMORY_ALLOC_FAILED; 2821 } 2822 2823 memset(vpmod, 0, sizeof(struct vp_config_entry_24xx)); 2824 vpmod->entry_type = VP_CONFIG_IOCB_TYPE; 2825 vpmod->entry_count = 1; 2826 vpmod->command = VCT_COMMAND_MOD_ENABLE_VPS; 2827 vpmod->vp_count = 1; 2828 vpmod->vp_index1 = vha->vp_idx; 2829 vpmod->options_idx1 = BIT_3|BIT_4|BIT_5; 2830 memcpy(vpmod->node_name_idx1, vha->node_name, WWN_SIZE); 2831 memcpy(vpmod->port_name_idx1, vha->port_name, WWN_SIZE); 2832 vpmod->entry_count = 1; 2833 2834 rval = qla2x00_issue_iocb(base_vha, vpmod, vpmod_dma, 0); 2835 if (rval != QLA_SUCCESS) { 2836 DEBUG2_3_11(printk("%s(%ld): failed to issue VP config IOCB" 2837 "(%x).\n", __func__, base_vha->host_no, rval)); 2838 } else if (vpmod->comp_status != 0) { 2839 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2840 "-- error status (%x).\n", __func__, base_vha->host_no, 2841 vpmod->comp_status)); 2842 rval = QLA_FUNCTION_FAILED; 2843 } else if (vpmod->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) { 2844 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2845 "-- completion status (%x).\n", __func__, base_vha->host_no, 2846 le16_to_cpu(vpmod->comp_status))); 2847 rval = QLA_FUNCTION_FAILED; 2848 } else { 2849 /* EMPTY */ 2850 DEBUG11(printk("%s(%ld): done.\n", __func__, 2851 base_vha->host_no)); 2852 fc_vport_set_state(vha->fc_vport, FC_VPORT_INITIALIZING); 2853 } 2854 dma_pool_free(ha->s_dma_pool, vpmod, vpmod_dma); 2855 2856 return rval; 2857 } 2858 2859 /* 2860 * qla24xx_control_vp 2861 * Enable a virtual port for given host 2862 * 2863 * Input: 2864 * ha = adapter block pointer. 2865 * vhba = virtual adapter (unused) 2866 * index = index number for enabled VP 2867 * 2868 * Returns: 2869 * qla2xxx local function return status code. 2870 * 2871 * Context: 2872 * Kernel context. 2873 */ 2874 int 2875 qla24xx_control_vp(scsi_qla_host_t *vha, int cmd) 2876 { 2877 int rval; 2878 int map, pos; 2879 struct vp_ctrl_entry_24xx *vce; 2880 dma_addr_t vce_dma; 2881 struct qla_hw_data *ha = vha->hw; 2882 int vp_index = vha->vp_idx; 2883 struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); 2884 2885 DEBUG11(printk("%s(%ld): entered. Enabling index %d\n", __func__, 2886 vha->host_no, vp_index)); 2887 2888 if (vp_index == 0 || vp_index >= ha->max_npiv_vports) 2889 return QLA_PARAMETER_ERROR; 2890 2891 vce = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &vce_dma); 2892 if (!vce) { 2893 DEBUG2_3(printk("%s(%ld): " 2894 "failed to allocate VP Control IOCB.\n", __func__, 2895 base_vha->host_no)); 2896 return QLA_MEMORY_ALLOC_FAILED; 2897 } 2898 memset(vce, 0, sizeof(struct vp_ctrl_entry_24xx)); 2899 2900 vce->entry_type = VP_CTRL_IOCB_TYPE; 2901 vce->entry_count = 1; 2902 vce->command = cpu_to_le16(cmd); 2903 vce->vp_count = __constant_cpu_to_le16(1); 2904 2905 /* index map in firmware starts with 1; decrement index 2906 * this is ok as we never use index 0 2907 */ 2908 map = (vp_index - 1) / 8; 2909 pos = (vp_index - 1) & 7; 2910 mutex_lock(&ha->vport_lock); 2911 vce->vp_idx_map[map] |= 1 << pos; 2912 mutex_unlock(&ha->vport_lock); 2913 2914 rval = qla2x00_issue_iocb(base_vha, vce, vce_dma, 0); 2915 if (rval != QLA_SUCCESS) { 2916 DEBUG2_3_11(printk("%s(%ld): failed to issue VP control IOCB" 2917 "(%x).\n", __func__, base_vha->host_no, rval)); 2918 printk("%s(%ld): failed to issue VP control IOCB" 2919 "(%x).\n", __func__, base_vha->host_no, rval); 2920 } else if (vce->entry_status != 0) { 2921 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2922 "-- error status (%x).\n", __func__, base_vha->host_no, 2923 vce->entry_status)); 2924 printk("%s(%ld): failed to complete IOCB " 2925 "-- error status (%x).\n", __func__, base_vha->host_no, 2926 vce->entry_status); 2927 rval = QLA_FUNCTION_FAILED; 2928 } else if (vce->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) { 2929 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2930 "-- completion status (%x).\n", __func__, base_vha->host_no, 2931 le16_to_cpu(vce->comp_status))); 2932 printk("%s(%ld): failed to complete IOCB " 2933 "-- completion status (%x).\n", __func__, base_vha->host_no, 2934 le16_to_cpu(vce->comp_status)); 2935 rval = QLA_FUNCTION_FAILED; 2936 } else { 2937 DEBUG2(printk("%s(%ld): done.\n", __func__, base_vha->host_no)); 2938 } 2939 2940 dma_pool_free(ha->s_dma_pool, vce, vce_dma); 2941 2942 return rval; 2943 } 2944 2945 /* 2946 * qla2x00_send_change_request 2947 * Receive or disable RSCN request from fabric controller 2948 * 2949 * Input: 2950 * ha = adapter block pointer 2951 * format = registration format: 2952 * 0 - Reserved 2953 * 1 - Fabric detected registration 2954 * 2 - N_port detected registration 2955 * 3 - Full registration 2956 * FF - clear registration 2957 * vp_idx = Virtual port index 2958 * 2959 * Returns: 2960 * qla2x00 local function return status code. 2961 * 2962 * Context: 2963 * Kernel Context 2964 */ 2965 2966 int 2967 qla2x00_send_change_request(scsi_qla_host_t *vha, uint16_t format, 2968 uint16_t vp_idx) 2969 { 2970 int rval; 2971 mbx_cmd_t mc; 2972 mbx_cmd_t *mcp = &mc; 2973 2974 /* 2975 * This command is implicitly executed by firmware during login for the 2976 * physical hosts 2977 */ 2978 if (vp_idx == 0) 2979 return QLA_FUNCTION_FAILED; 2980 2981 mcp->mb[0] = MBC_SEND_CHANGE_REQUEST; 2982 mcp->mb[1] = format; 2983 mcp->mb[9] = vp_idx; 2984 mcp->out_mb = MBX_9|MBX_1|MBX_0; 2985 mcp->in_mb = MBX_0|MBX_1; 2986 mcp->tov = MBX_TOV_SECONDS; 2987 mcp->flags = 0; 2988 rval = qla2x00_mailbox_command(vha, mcp); 2989 2990 if (rval == QLA_SUCCESS) { 2991 if (mcp->mb[0] != MBS_COMMAND_COMPLETE) { 2992 rval = BIT_1; 2993 } 2994 } else 2995 rval = BIT_1; 2996 2997 return rval; 2998 } 2999 3000 int 3001 qla2x00_dump_ram(scsi_qla_host_t *vha, dma_addr_t req_dma, uint32_t addr, 3002 uint32_t size) 3003 { 3004 int rval; 3005 mbx_cmd_t mc; 3006 mbx_cmd_t *mcp = &mc; 3007 3008 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3009 3010 if (MSW(addr) || IS_FWI2_CAPABLE(vha->hw)) { 3011 mcp->mb[0] = MBC_DUMP_RISC_RAM_EXTENDED; 3012 mcp->mb[8] = MSW(addr); 3013 mcp->out_mb = MBX_8|MBX_0; 3014 } else { 3015 mcp->mb[0] = MBC_DUMP_RISC_RAM; 3016 mcp->out_mb = MBX_0; 3017 } 3018 mcp->mb[1] = LSW(addr); 3019 mcp->mb[2] = MSW(req_dma); 3020 mcp->mb[3] = LSW(req_dma); 3021 mcp->mb[6] = MSW(MSD(req_dma)); 3022 mcp->mb[7] = LSW(MSD(req_dma)); 3023 mcp->out_mb |= MBX_7|MBX_6|MBX_3|MBX_2|MBX_1; 3024 if (IS_FWI2_CAPABLE(vha->hw)) { 3025 mcp->mb[4] = MSW(size); 3026 mcp->mb[5] = LSW(size); 3027 mcp->out_mb |= MBX_5|MBX_4; 3028 } else { 3029 mcp->mb[4] = LSW(size); 3030 mcp->out_mb |= MBX_4; 3031 } 3032 3033 mcp->in_mb = MBX_0; 3034 mcp->tov = MBX_TOV_SECONDS; 3035 mcp->flags = 0; 3036 rval = qla2x00_mailbox_command(vha, mcp); 3037 3038 if (rval != QLA_SUCCESS) { 3039 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__, 3040 vha->host_no, rval, mcp->mb[0])); 3041 } else { 3042 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3043 } 3044 3045 return rval; 3046 } 3047 3048 /* 84XX Support **************************************************************/ 3049 3050 struct cs84xx_mgmt_cmd { 3051 union { 3052 struct verify_chip_entry_84xx req; 3053 struct verify_chip_rsp_84xx rsp; 3054 } p; 3055 }; 3056 3057 int 3058 qla84xx_verify_chip(struct scsi_qla_host *vha, uint16_t *status) 3059 { 3060 int rval, retry; 3061 struct cs84xx_mgmt_cmd *mn; 3062 dma_addr_t mn_dma; 3063 uint16_t options; 3064 unsigned long flags; 3065 struct qla_hw_data *ha = vha->hw; 3066 3067 DEBUG16(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3068 3069 mn = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &mn_dma); 3070 if (mn == NULL) { 3071 DEBUG2_3(printk("%s(%ld): failed to allocate Verify ISP84XX " 3072 "IOCB.\n", __func__, vha->host_no)); 3073 return QLA_MEMORY_ALLOC_FAILED; 3074 } 3075 3076 /* Force Update? */ 3077 options = ha->cs84xx->fw_update ? VCO_FORCE_UPDATE : 0; 3078 /* Diagnostic firmware? */ 3079 /* options |= MENLO_DIAG_FW; */ 3080 /* We update the firmware with only one data sequence. */ 3081 options |= VCO_END_OF_DATA; 3082 3083 do { 3084 retry = 0; 3085 memset(mn, 0, sizeof(*mn)); 3086 mn->p.req.entry_type = VERIFY_CHIP_IOCB_TYPE; 3087 mn->p.req.entry_count = 1; 3088 mn->p.req.options = cpu_to_le16(options); 3089 3090 DEBUG16(printk("%s(%ld): Dump of Verify Request.\n", __func__, 3091 vha->host_no)); 3092 DEBUG16(qla2x00_dump_buffer((uint8_t *)mn, 3093 sizeof(*mn))); 3094 3095 rval = qla2x00_issue_iocb_timeout(vha, mn, mn_dma, 0, 120); 3096 if (rval != QLA_SUCCESS) { 3097 DEBUG2_16(printk("%s(%ld): failed to issue Verify " 3098 "IOCB (%x).\n", __func__, vha->host_no, rval)); 3099 goto verify_done; 3100 } 3101 3102 DEBUG16(printk("%s(%ld): Dump of Verify Response.\n", __func__, 3103 vha->host_no)); 3104 DEBUG16(qla2x00_dump_buffer((uint8_t *)mn, 3105 sizeof(*mn))); 3106 3107 status[0] = le16_to_cpu(mn->p.rsp.comp_status); 3108 status[1] = status[0] == CS_VCS_CHIP_FAILURE ? 3109 le16_to_cpu(mn->p.rsp.failure_code) : 0; 3110 DEBUG2_16(printk("%s(%ld): cs=%x fc=%x\n", __func__, 3111 vha->host_no, status[0], status[1])); 3112 3113 if (status[0] != CS_COMPLETE) { 3114 rval = QLA_FUNCTION_FAILED; 3115 if (!(options & VCO_DONT_UPDATE_FW)) { 3116 DEBUG2_16(printk("%s(%ld): Firmware update " 3117 "failed. Retrying without update " 3118 "firmware.\n", __func__, vha->host_no)); 3119 options |= VCO_DONT_UPDATE_FW; 3120 options &= ~VCO_FORCE_UPDATE; 3121 retry = 1; 3122 } 3123 } else { 3124 DEBUG2_16(printk("%s(%ld): firmware updated to %x.\n", 3125 __func__, vha->host_no, 3126 le32_to_cpu(mn->p.rsp.fw_ver))); 3127 3128 /* NOTE: we only update OP firmware. */ 3129 spin_lock_irqsave(&ha->cs84xx->access_lock, flags); 3130 ha->cs84xx->op_fw_version = 3131 le32_to_cpu(mn->p.rsp.fw_ver); 3132 spin_unlock_irqrestore(&ha->cs84xx->access_lock, 3133 flags); 3134 } 3135 } while (retry); 3136 3137 verify_done: 3138 dma_pool_free(ha->s_dma_pool, mn, mn_dma); 3139 3140 if (rval != QLA_SUCCESS) { 3141 DEBUG2_16(printk("%s(%ld): failed=%x.\n", __func__, 3142 vha->host_no, rval)); 3143 } else { 3144 DEBUG16(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3145 } 3146 3147 return rval; 3148 } 3149 3150 int 3151 qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) 3152 { 3153 int rval; 3154 unsigned long flags; 3155 mbx_cmd_t mc; 3156 mbx_cmd_t *mcp = &mc; 3157 struct device_reg_25xxmq __iomem *reg; 3158 struct qla_hw_data *ha = vha->hw; 3159 3160 mcp->mb[0] = MBC_INITIALIZE_MULTIQ; 3161 mcp->mb[1] = req->options; 3162 mcp->mb[2] = MSW(LSD(req->dma)); 3163 mcp->mb[3] = LSW(LSD(req->dma)); 3164 mcp->mb[6] = MSW(MSD(req->dma)); 3165 mcp->mb[7] = LSW(MSD(req->dma)); 3166 mcp->mb[5] = req->length; 3167 if (req->rsp) 3168 mcp->mb[10] = req->rsp->id; 3169 mcp->mb[12] = req->qos; 3170 mcp->mb[11] = req->vp_idx; 3171 mcp->mb[13] = req->rid; 3172 3173 reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) + 3174 QLA_QUE_PAGE * req->id); 3175 3176 mcp->mb[4] = req->id; 3177 /* que in ptr index */ 3178 mcp->mb[8] = 0; 3179 /* que out ptr index */ 3180 mcp->mb[9] = 0; 3181 mcp->out_mb = MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8|MBX_7| 3182 MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 3183 mcp->in_mb = MBX_0; 3184 mcp->flags = MBX_DMA_OUT; 3185 mcp->tov = 60; 3186 3187 spin_lock_irqsave(&ha->hardware_lock, flags); 3188 if (!(req->options & BIT_0)) { 3189 WRT_REG_DWORD(®->req_q_in, 0); 3190 WRT_REG_DWORD(®->req_q_out, 0); 3191 } 3192 req->req_q_in = ®->req_q_in; 3193 req->req_q_out = ®->req_q_out; 3194 spin_unlock_irqrestore(&ha->hardware_lock, flags); 3195 3196 rval = qla2x00_mailbox_command(vha, mcp); 3197 if (rval != QLA_SUCCESS) 3198 DEBUG2_3_11(printk(KERN_WARNING "%s(%ld): failed=%x mb0=%x.\n", 3199 __func__, vha->host_no, rval, mcp->mb[0])); 3200 return rval; 3201 } 3202 3203 int 3204 qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) 3205 { 3206 int rval; 3207 unsigned long flags; 3208 mbx_cmd_t mc; 3209 mbx_cmd_t *mcp = &mc; 3210 struct device_reg_25xxmq __iomem *reg; 3211 struct qla_hw_data *ha = vha->hw; 3212 3213 mcp->mb[0] = MBC_INITIALIZE_MULTIQ; 3214 mcp->mb[1] = rsp->options; 3215 mcp->mb[2] = MSW(LSD(rsp->dma)); 3216 mcp->mb[3] = LSW(LSD(rsp->dma)); 3217 mcp->mb[6] = MSW(MSD(rsp->dma)); 3218 mcp->mb[7] = LSW(MSD(rsp->dma)); 3219 mcp->mb[5] = rsp->length; 3220 mcp->mb[14] = rsp->msix->entry; 3221 mcp->mb[13] = rsp->rid; 3222 3223 reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) + 3224 QLA_QUE_PAGE * rsp->id); 3225 3226 mcp->mb[4] = rsp->id; 3227 /* que in ptr index */ 3228 mcp->mb[8] = 0; 3229 /* que out ptr index */ 3230 mcp->mb[9] = 0; 3231 mcp->out_mb = MBX_14|MBX_13|MBX_9|MBX_8|MBX_7 3232 |MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 3233 mcp->in_mb = MBX_0; 3234 mcp->flags = MBX_DMA_OUT; 3235 mcp->tov = 60; 3236 3237 spin_lock_irqsave(&ha->hardware_lock, flags); 3238 if (!(rsp->options & BIT_0)) { 3239 WRT_REG_DWORD(®->rsp_q_out, 0); 3240 WRT_REG_DWORD(®->rsp_q_in, 0); 3241 } 3242 3243 spin_unlock_irqrestore(&ha->hardware_lock, flags); 3244 3245 rval = qla2x00_mailbox_command(vha, mcp); 3246 if (rval != QLA_SUCCESS) 3247 DEBUG2_3_11(printk(KERN_WARNING "%s(%ld): failed=%x " 3248 "mb0=%x.\n", __func__, 3249 vha->host_no, rval, mcp->mb[0])); 3250 return rval; 3251 } 3252 3253 int 3254 qla81xx_idc_ack(scsi_qla_host_t *vha, uint16_t *mb) 3255 { 3256 int rval; 3257 mbx_cmd_t mc; 3258 mbx_cmd_t *mcp = &mc; 3259 3260 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3261 3262 mcp->mb[0] = MBC_IDC_ACK; 3263 memcpy(&mcp->mb[1], mb, QLA_IDC_ACK_REGS * sizeof(uint16_t)); 3264 mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 3265 mcp->in_mb = MBX_0; 3266 mcp->tov = MBX_TOV_SECONDS; 3267 mcp->flags = 0; 3268 rval = qla2x00_mailbox_command(vha, mcp); 3269 3270 if (rval != QLA_SUCCESS) { 3271 DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__, 3272 vha->host_no, rval, mcp->mb[0])); 3273 } else { 3274 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3275 } 3276 3277 return rval; 3278 } 3279 3280 int 3281 qla81xx_fac_get_sector_size(scsi_qla_host_t *vha, uint32_t *sector_size) 3282 { 3283 int rval; 3284 mbx_cmd_t mc; 3285 mbx_cmd_t *mcp = &mc; 3286 3287 if (!IS_QLA81XX(vha->hw)) 3288 return QLA_FUNCTION_FAILED; 3289 3290 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3291 3292 mcp->mb[0] = MBC_FLASH_ACCESS_CTRL; 3293 mcp->mb[1] = FAC_OPT_CMD_GET_SECTOR_SIZE; 3294 mcp->out_mb = MBX_1|MBX_0; 3295 mcp->in_mb = MBX_1|MBX_0; 3296 mcp->tov = MBX_TOV_SECONDS; 3297 mcp->flags = 0; 3298 rval = qla2x00_mailbox_command(vha, mcp); 3299 3300 if (rval != QLA_SUCCESS) { 3301 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n", 3302 __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 3303 } else { 3304 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3305 *sector_size = mcp->mb[1]; 3306 } 3307 3308 return rval; 3309 } 3310 3311 int 3312 qla81xx_fac_do_write_enable(scsi_qla_host_t *vha, int enable) 3313 { 3314 int rval; 3315 mbx_cmd_t mc; 3316 mbx_cmd_t *mcp = &mc; 3317 3318 if (!IS_QLA81XX(vha->hw)) 3319 return QLA_FUNCTION_FAILED; 3320 3321 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3322 3323 mcp->mb[0] = MBC_FLASH_ACCESS_CTRL; 3324 mcp->mb[1] = enable ? FAC_OPT_CMD_WRITE_ENABLE : 3325 FAC_OPT_CMD_WRITE_PROTECT; 3326 mcp->out_mb = MBX_1|MBX_0; 3327 mcp->in_mb = MBX_1|MBX_0; 3328 mcp->tov = MBX_TOV_SECONDS; 3329 mcp->flags = 0; 3330 rval = qla2x00_mailbox_command(vha, mcp); 3331 3332 if (rval != QLA_SUCCESS) { 3333 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n", 3334 __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 3335 } else { 3336 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3337 } 3338 3339 return rval; 3340 } 3341 3342 int 3343 qla81xx_fac_erase_sector(scsi_qla_host_t *vha, uint32_t start, uint32_t finish) 3344 { 3345 int rval; 3346 mbx_cmd_t mc; 3347 mbx_cmd_t *mcp = &mc; 3348 3349 if (!IS_QLA81XX(vha->hw)) 3350 return QLA_FUNCTION_FAILED; 3351 3352 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3353 3354 mcp->mb[0] = MBC_FLASH_ACCESS_CTRL; 3355 mcp->mb[1] = FAC_OPT_CMD_ERASE_SECTOR; 3356 mcp->mb[2] = LSW(start); 3357 mcp->mb[3] = MSW(start); 3358 mcp->mb[4] = LSW(finish); 3359 mcp->mb[5] = MSW(finish); 3360 mcp->out_mb = MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 3361 mcp->in_mb = MBX_2|MBX_1|MBX_0; 3362 mcp->tov = MBX_TOV_SECONDS; 3363 mcp->flags = 0; 3364 rval = qla2x00_mailbox_command(vha, mcp); 3365 3366 if (rval != QLA_SUCCESS) { 3367 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x " 3368 "mb[2]=%x.\n", __func__, vha->host_no, rval, mcp->mb[0], 3369 mcp->mb[1], mcp->mb[2])); 3370 } else { 3371 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3372 } 3373 3374 return rval; 3375 } 3376 3377 int 3378 qla81xx_restart_mpi_firmware(scsi_qla_host_t *vha) 3379 { 3380 int rval = 0; 3381 mbx_cmd_t mc; 3382 mbx_cmd_t *mcp = &mc; 3383 3384 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3385 3386 mcp->mb[0] = MBC_RESTART_MPI_FW; 3387 mcp->out_mb = MBX_0; 3388 mcp->in_mb = MBX_0|MBX_1; 3389 mcp->tov = MBX_TOV_SECONDS; 3390 mcp->flags = 0; 3391 rval = qla2x00_mailbox_command(vha, mcp); 3392 3393 if (rval != QLA_SUCCESS) { 3394 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=0x%x mb[1]=0x%x.\n", 3395 __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 3396 } else { 3397 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3398 } 3399 3400 return rval; 3401 } 3402 3403 int 3404 qla2x00_read_edc(scsi_qla_host_t *vha, uint16_t dev, uint16_t adr, 3405 dma_addr_t sfp_dma, uint8_t *sfp, uint16_t len, uint16_t opt) 3406 { 3407 int rval; 3408 mbx_cmd_t mc; 3409 mbx_cmd_t *mcp = &mc; 3410 3411 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3412 3413 mcp->mb[0] = MBC_READ_SFP; 3414 mcp->mb[1] = dev; 3415 mcp->mb[2] = MSW(sfp_dma); 3416 mcp->mb[3] = LSW(sfp_dma); 3417 mcp->mb[6] = MSW(MSD(sfp_dma)); 3418 mcp->mb[7] = LSW(MSD(sfp_dma)); 3419 mcp->mb[8] = len; 3420 mcp->mb[9] = adr; 3421 mcp->mb[10] = opt; 3422 mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 3423 mcp->in_mb = MBX_0; 3424 mcp->tov = MBX_TOV_SECONDS; 3425 mcp->flags = 0; 3426 rval = qla2x00_mailbox_command(vha, mcp); 3427 3428 if (opt & BIT_0) 3429 if (sfp) 3430 *sfp = mcp->mb[8]; 3431 3432 if (rval != QLA_SUCCESS) { 3433 DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__, 3434 vha->host_no, rval, mcp->mb[0])); 3435 } else { 3436 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3437 } 3438 3439 return rval; 3440 } 3441 3442 int 3443 qla2x00_write_edc(scsi_qla_host_t *vha, uint16_t dev, uint16_t adr, 3444 dma_addr_t sfp_dma, uint8_t *sfp, uint16_t len, uint16_t opt) 3445 { 3446 int rval; 3447 mbx_cmd_t mc; 3448 mbx_cmd_t *mcp = &mc; 3449 3450 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3451 3452 if (opt & BIT_0) 3453 if (sfp) 3454 len = *sfp; 3455 3456 mcp->mb[0] = MBC_WRITE_SFP; 3457 mcp->mb[1] = dev; 3458 mcp->mb[2] = MSW(sfp_dma); 3459 mcp->mb[3] = LSW(sfp_dma); 3460 mcp->mb[6] = MSW(MSD(sfp_dma)); 3461 mcp->mb[7] = LSW(MSD(sfp_dma)); 3462 mcp->mb[8] = len; 3463 mcp->mb[9] = adr; 3464 mcp->mb[10] = opt; 3465 mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 3466 mcp->in_mb = MBX_0; 3467 mcp->tov = MBX_TOV_SECONDS; 3468 mcp->flags = 0; 3469 rval = qla2x00_mailbox_command(vha, mcp); 3470 3471 if (rval != QLA_SUCCESS) { 3472 DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__, 3473 vha->host_no, rval, mcp->mb[0])); 3474 } else { 3475 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3476 } 3477 3478 return rval; 3479 } 3480 3481 int 3482 qla2x00_get_xgmac_stats(scsi_qla_host_t *vha, dma_addr_t stats_dma, 3483 uint16_t size_in_bytes, uint16_t *actual_size) 3484 { 3485 int rval; 3486 mbx_cmd_t mc; 3487 mbx_cmd_t *mcp = &mc; 3488 3489 if (!IS_QLA81XX(vha->hw)) 3490 return QLA_FUNCTION_FAILED; 3491 3492 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3493 3494 mcp->mb[0] = MBC_GET_XGMAC_STATS; 3495 mcp->mb[2] = MSW(stats_dma); 3496 mcp->mb[3] = LSW(stats_dma); 3497 mcp->mb[6] = MSW(MSD(stats_dma)); 3498 mcp->mb[7] = LSW(MSD(stats_dma)); 3499 mcp->mb[8] = size_in_bytes >> 2; 3500 mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; 3501 mcp->in_mb = MBX_2|MBX_1|MBX_0; 3502 mcp->tov = MBX_TOV_SECONDS; 3503 mcp->flags = 0; 3504 rval = qla2x00_mailbox_command(vha, mcp); 3505 3506 if (rval != QLA_SUCCESS) { 3507 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=0x%x " 3508 "mb[1]=0x%x mb[2]=0x%x.\n", __func__, vha->host_no, rval, 3509 mcp->mb[0], mcp->mb[1], mcp->mb[2])); 3510 } else { 3511 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3512 3513 *actual_size = mcp->mb[2] << 2; 3514 } 3515 3516 return rval; 3517 } 3518 3519 int 3520 qla2x00_get_dcbx_params(scsi_qla_host_t *vha, dma_addr_t tlv_dma, 3521 uint16_t size) 3522 { 3523 int rval; 3524 mbx_cmd_t mc; 3525 mbx_cmd_t *mcp = &mc; 3526 3527 if (!IS_QLA81XX(vha->hw)) 3528 return QLA_FUNCTION_FAILED; 3529 3530 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3531 3532 mcp->mb[0] = MBC_GET_DCBX_PARAMS; 3533 mcp->mb[1] = 0; 3534 mcp->mb[2] = MSW(tlv_dma); 3535 mcp->mb[3] = LSW(tlv_dma); 3536 mcp->mb[6] = MSW(MSD(tlv_dma)); 3537 mcp->mb[7] = LSW(MSD(tlv_dma)); 3538 mcp->mb[8] = size; 3539 mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 3540 mcp->in_mb = MBX_2|MBX_1|MBX_0; 3541 mcp->tov = MBX_TOV_SECONDS; 3542 mcp->flags = 0; 3543 rval = qla2x00_mailbox_command(vha, mcp); 3544 3545 if (rval != QLA_SUCCESS) { 3546 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=0x%x " 3547 "mb[1]=0x%x mb[2]=0x%x.\n", __func__, vha->host_no, rval, 3548 mcp->mb[0], mcp->mb[1], mcp->mb[2])); 3549 } else { 3550 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3551 } 3552 3553 return rval; 3554 } 3555 3556 int 3557 qla2x00_read_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t *data) 3558 { 3559 int rval; 3560 mbx_cmd_t mc; 3561 mbx_cmd_t *mcp = &mc; 3562 3563 if (!IS_FWI2_CAPABLE(vha->hw)) 3564 return QLA_FUNCTION_FAILED; 3565 3566 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3567 3568 mcp->mb[0] = MBC_READ_RAM_EXTENDED; 3569 mcp->mb[1] = LSW(risc_addr); 3570 mcp->mb[8] = MSW(risc_addr); 3571 mcp->out_mb = MBX_8|MBX_1|MBX_0; 3572 mcp->in_mb = MBX_3|MBX_2|MBX_0; 3573 mcp->tov = 30; 3574 mcp->flags = 0; 3575 rval = qla2x00_mailbox_command(vha, mcp); 3576 if (rval != QLA_SUCCESS) { 3577 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__, 3578 vha->host_no, rval, mcp->mb[0])); 3579 } else { 3580 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3581 *data = mcp->mb[3] << 16 | mcp->mb[2]; 3582 } 3583 3584 return rval; 3585 } 3586 3587 int 3588 qla2x00_write_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t data) 3589 { 3590 int rval; 3591 mbx_cmd_t mc; 3592 mbx_cmd_t *mcp = &mc; 3593 3594 if (!IS_FWI2_CAPABLE(vha->hw)) 3595 return QLA_FUNCTION_FAILED; 3596 3597 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3598 3599 mcp->mb[0] = MBC_WRITE_RAM_WORD_EXTENDED; 3600 mcp->mb[1] = LSW(risc_addr); 3601 mcp->mb[2] = LSW(data); 3602 mcp->mb[3] = MSW(data); 3603 mcp->mb[8] = MSW(risc_addr); 3604 mcp->out_mb = MBX_8|MBX_3|MBX_2|MBX_1|MBX_0; 3605 mcp->in_mb = MBX_0; 3606 mcp->tov = 30; 3607 mcp->flags = 0; 3608 rval = qla2x00_mailbox_command(vha, mcp); 3609 if (rval != QLA_SUCCESS) { 3610 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__, 3611 vha->host_no, rval, mcp->mb[0])); 3612 } else { 3613 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3614 } 3615 3616 return rval; 3617 } 3618