qla_mbx.c revision 3064ff39b8121acbd731f64d046218ebf3c2f9c0
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 */ 31static int 32qla2x00_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 282int 283qla2x00_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 */ 346int 347qla2x00_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 */ 411int 412qla2x00_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 } 451failed: 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 */ 477int 478qla2x00_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 */ 524int 525qla2x00_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 */ 580int 581qla2x00_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 */ 640int 641qla2x00_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 */ 696static int 697qla2x00_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 731int 732qla2x00_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 */ 753int 754qla2x00_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 805int 806qla2x00_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 855int 856qla2x00_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 */ 922int 923qla2x00_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 */ 993int 994qla2x00_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 */ 1050int 1051qla2x00_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 */ 1117int 1118qla2x00_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 1229gpd_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 */ 1258int 1259qla2x00_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 */ 1318int 1319qla2x00_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 */ 1384int 1385qla2x00_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 */ 1453int 1454qla2x00_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 1495int 1496qla24xx_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 */ 1627int 1628qla2x00_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 */ 1707int 1708qla2x00_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 1767int 1768qla24xx_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 */ 1845int 1846qla2x00_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 */ 1899int 1900qla2x00_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 */ 1944int 1945qla2x00_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 */ 2006int 2007qla2x00_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, uint16_t *max_fcfs) 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 if (IS_QLA81XX(vha->hw)) 2021 mcp->in_mb |= MBX_12; 2022 mcp->tov = MBX_TOV_SECONDS; 2023 mcp->flags = 0; 2024 rval = qla2x00_mailbox_command(vha, mcp); 2025 2026 if (rval != QLA_SUCCESS) { 2027 /*EMPTY*/ 2028 DEBUG2_3_11(printk("%s(%ld): failed = %x.\n", __func__, 2029 vha->host_no, mcp->mb[0])); 2030 } else { 2031 DEBUG11(printk("%s(%ld): done. mb1=%x mb2=%x mb3=%x mb6=%x " 2032 "mb7=%x mb10=%x mb11=%x mb12=%x.\n", __func__, 2033 vha->host_no, mcp->mb[1], mcp->mb[2], mcp->mb[3], 2034 mcp->mb[6], mcp->mb[7], mcp->mb[10], mcp->mb[11], 2035 mcp->mb[12])); 2036 2037 if (cur_xchg_cnt) 2038 *cur_xchg_cnt = mcp->mb[3]; 2039 if (orig_xchg_cnt) 2040 *orig_xchg_cnt = mcp->mb[6]; 2041 if (cur_iocb_cnt) 2042 *cur_iocb_cnt = mcp->mb[7]; 2043 if (orig_iocb_cnt) 2044 *orig_iocb_cnt = mcp->mb[10]; 2045 if (vha->hw->flags.npiv_supported && max_npiv_vports) 2046 *max_npiv_vports = mcp->mb[11]; 2047 if (IS_QLA81XX(vha->hw) && max_fcfs) 2048 *max_fcfs = mcp->mb[12]; 2049 } 2050 2051 return (rval); 2052} 2053 2054#if defined(QL_DEBUG_LEVEL_3) 2055/* 2056 * qla2x00_get_fcal_position_map 2057 * Get FCAL (LILP) position map using mailbox command 2058 * 2059 * Input: 2060 * ha = adapter state pointer. 2061 * pos_map = buffer pointer (can be NULL). 2062 * 2063 * Returns: 2064 * qla2x00 local function return status code. 2065 * 2066 * Context: 2067 * Kernel context. 2068 */ 2069int 2070qla2x00_get_fcal_position_map(scsi_qla_host_t *vha, char *pos_map) 2071{ 2072 int rval; 2073 mbx_cmd_t mc; 2074 mbx_cmd_t *mcp = &mc; 2075 char *pmap; 2076 dma_addr_t pmap_dma; 2077 struct qla_hw_data *ha = vha->hw; 2078 2079 pmap = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &pmap_dma); 2080 if (pmap == NULL) { 2081 DEBUG2_3_11(printk("%s(%ld): **** Mem Alloc Failed ****", 2082 __func__, vha->host_no)); 2083 return QLA_MEMORY_ALLOC_FAILED; 2084 } 2085 memset(pmap, 0, FCAL_MAP_SIZE); 2086 2087 mcp->mb[0] = MBC_GET_FC_AL_POSITION_MAP; 2088 mcp->mb[2] = MSW(pmap_dma); 2089 mcp->mb[3] = LSW(pmap_dma); 2090 mcp->mb[6] = MSW(MSD(pmap_dma)); 2091 mcp->mb[7] = LSW(MSD(pmap_dma)); 2092 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; 2093 mcp->in_mb = MBX_1|MBX_0; 2094 mcp->buf_size = FCAL_MAP_SIZE; 2095 mcp->flags = MBX_DMA_IN; 2096 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2); 2097 rval = qla2x00_mailbox_command(vha, mcp); 2098 2099 if (rval == QLA_SUCCESS) { 2100 DEBUG11(printk("%s(%ld): (mb0=%x/mb1=%x) FC/AL Position Map " 2101 "size (%x)\n", __func__, vha->host_no, mcp->mb[0], 2102 mcp->mb[1], (unsigned)pmap[0])); 2103 DEBUG11(qla2x00_dump_buffer(pmap, pmap[0] + 1)); 2104 2105 if (pos_map) 2106 memcpy(pos_map, pmap, FCAL_MAP_SIZE); 2107 } 2108 dma_pool_free(ha->s_dma_pool, pmap, pmap_dma); 2109 2110 if (rval != QLA_SUCCESS) { 2111 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 2112 vha->host_no, rval)); 2113 } else { 2114 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2115 } 2116 2117 return rval; 2118} 2119#endif 2120 2121/* 2122 * qla2x00_get_link_status 2123 * 2124 * Input: 2125 * ha = adapter block pointer. 2126 * loop_id = device loop ID. 2127 * ret_buf = pointer to link status return buffer. 2128 * 2129 * Returns: 2130 * 0 = success. 2131 * BIT_0 = mem alloc error. 2132 * BIT_1 = mailbox error. 2133 */ 2134int 2135qla2x00_get_link_status(scsi_qla_host_t *vha, uint16_t loop_id, 2136 struct link_statistics *stats, dma_addr_t stats_dma) 2137{ 2138 int rval; 2139 mbx_cmd_t mc; 2140 mbx_cmd_t *mcp = &mc; 2141 uint32_t *siter, *diter, dwords; 2142 struct qla_hw_data *ha = vha->hw; 2143 2144 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2145 2146 mcp->mb[0] = MBC_GET_LINK_STATUS; 2147 mcp->mb[2] = MSW(stats_dma); 2148 mcp->mb[3] = LSW(stats_dma); 2149 mcp->mb[6] = MSW(MSD(stats_dma)); 2150 mcp->mb[7] = LSW(MSD(stats_dma)); 2151 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; 2152 mcp->in_mb = MBX_0; 2153 if (IS_FWI2_CAPABLE(ha)) { 2154 mcp->mb[1] = loop_id; 2155 mcp->mb[4] = 0; 2156 mcp->mb[10] = 0; 2157 mcp->out_mb |= MBX_10|MBX_4|MBX_1; 2158 mcp->in_mb |= MBX_1; 2159 } else if (HAS_EXTENDED_IDS(ha)) { 2160 mcp->mb[1] = loop_id; 2161 mcp->mb[10] = 0; 2162 mcp->out_mb |= MBX_10|MBX_1; 2163 } else { 2164 mcp->mb[1] = loop_id << 8; 2165 mcp->out_mb |= MBX_1; 2166 } 2167 mcp->tov = MBX_TOV_SECONDS; 2168 mcp->flags = IOCTL_CMD; 2169 rval = qla2x00_mailbox_command(vha, mcp); 2170 2171 if (rval == QLA_SUCCESS) { 2172 if (mcp->mb[0] != MBS_COMMAND_COMPLETE) { 2173 DEBUG2_3_11(printk("%s(%ld): cmd failed. mbx0=%x.\n", 2174 __func__, vha->host_no, mcp->mb[0])); 2175 rval = QLA_FUNCTION_FAILED; 2176 } else { 2177 /* Copy over data -- firmware data is LE. */ 2178 dwords = offsetof(struct link_statistics, unused1) / 4; 2179 siter = diter = &stats->link_fail_cnt; 2180 while (dwords--) 2181 *diter++ = le32_to_cpu(*siter++); 2182 } 2183 } else { 2184 /* Failed. */ 2185 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 2186 vha->host_no, rval)); 2187 } 2188 2189 return rval; 2190} 2191 2192int 2193qla24xx_get_isp_stats(scsi_qla_host_t *vha, struct link_statistics *stats, 2194 dma_addr_t stats_dma) 2195{ 2196 int rval; 2197 mbx_cmd_t mc; 2198 mbx_cmd_t *mcp = &mc; 2199 uint32_t *siter, *diter, dwords; 2200 2201 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2202 2203 mcp->mb[0] = MBC_GET_LINK_PRIV_STATS; 2204 mcp->mb[2] = MSW(stats_dma); 2205 mcp->mb[3] = LSW(stats_dma); 2206 mcp->mb[6] = MSW(MSD(stats_dma)); 2207 mcp->mb[7] = LSW(MSD(stats_dma)); 2208 mcp->mb[8] = sizeof(struct link_statistics) / 4; 2209 mcp->mb[9] = vha->vp_idx; 2210 mcp->mb[10] = 0; 2211 mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; 2212 mcp->in_mb = MBX_2|MBX_1|MBX_0; 2213 mcp->tov = MBX_TOV_SECONDS; 2214 mcp->flags = IOCTL_CMD; 2215 rval = qla2x00_mailbox_command(vha, mcp); 2216 2217 if (rval == QLA_SUCCESS) { 2218 if (mcp->mb[0] != MBS_COMMAND_COMPLETE) { 2219 DEBUG2_3_11(printk("%s(%ld): cmd failed. mbx0=%x.\n", 2220 __func__, vha->host_no, mcp->mb[0])); 2221 rval = QLA_FUNCTION_FAILED; 2222 } else { 2223 /* Copy over data -- firmware data is LE. */ 2224 dwords = sizeof(struct link_statistics) / 4; 2225 siter = diter = &stats->link_fail_cnt; 2226 while (dwords--) 2227 *diter++ = le32_to_cpu(*siter++); 2228 } 2229 } else { 2230 /* Failed. */ 2231 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 2232 vha->host_no, rval)); 2233 } 2234 2235 return rval; 2236} 2237 2238int 2239qla24xx_abort_command(srb_t *sp) 2240{ 2241 int rval; 2242 unsigned long flags = 0; 2243 2244 struct abort_entry_24xx *abt; 2245 dma_addr_t abt_dma; 2246 uint32_t handle; 2247 fc_port_t *fcport = sp->fcport; 2248 struct scsi_qla_host *vha = fcport->vha; 2249 struct qla_hw_data *ha = vha->hw; 2250 struct req_que *req = vha->req; 2251 2252 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2253 2254 spin_lock_irqsave(&ha->hardware_lock, flags); 2255 for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) { 2256 if (req->outstanding_cmds[handle] == sp) 2257 break; 2258 } 2259 spin_unlock_irqrestore(&ha->hardware_lock, flags); 2260 if (handle == MAX_OUTSTANDING_COMMANDS) { 2261 /* Command not found. */ 2262 return QLA_FUNCTION_FAILED; 2263 } 2264 2265 abt = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &abt_dma); 2266 if (abt == NULL) { 2267 DEBUG2_3(printk("%s(%ld): failed to allocate Abort IOCB.\n", 2268 __func__, vha->host_no)); 2269 return QLA_MEMORY_ALLOC_FAILED; 2270 } 2271 memset(abt, 0, sizeof(struct abort_entry_24xx)); 2272 2273 abt->entry_type = ABORT_IOCB_TYPE; 2274 abt->entry_count = 1; 2275 abt->handle = MAKE_HANDLE(req->id, abt->handle); 2276 abt->nport_handle = cpu_to_le16(fcport->loop_id); 2277 abt->handle_to_abort = handle; 2278 abt->port_id[0] = fcport->d_id.b.al_pa; 2279 abt->port_id[1] = fcport->d_id.b.area; 2280 abt->port_id[2] = fcport->d_id.b.domain; 2281 abt->vp_index = fcport->vp_idx; 2282 2283 abt->req_que_no = cpu_to_le16(req->id); 2284 2285 rval = qla2x00_issue_iocb(vha, abt, abt_dma, 0); 2286 if (rval != QLA_SUCCESS) { 2287 DEBUG2_3_11(printk("%s(%ld): failed to issue IOCB (%x).\n", 2288 __func__, vha->host_no, rval)); 2289 } else if (abt->entry_status != 0) { 2290 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2291 "-- error status (%x).\n", __func__, vha->host_no, 2292 abt->entry_status)); 2293 rval = QLA_FUNCTION_FAILED; 2294 } else if (abt->nport_handle != __constant_cpu_to_le16(0)) { 2295 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2296 "-- completion status (%x).\n", __func__, vha->host_no, 2297 le16_to_cpu(abt->nport_handle))); 2298 rval = QLA_FUNCTION_FAILED; 2299 } else { 2300 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2301 } 2302 2303 dma_pool_free(ha->s_dma_pool, abt, abt_dma); 2304 2305 return rval; 2306} 2307 2308struct tsk_mgmt_cmd { 2309 union { 2310 struct tsk_mgmt_entry tsk; 2311 struct sts_entry_24xx sts; 2312 } p; 2313}; 2314 2315static int 2316__qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport, 2317 unsigned int l, int tag) 2318{ 2319 int rval, rval2; 2320 struct tsk_mgmt_cmd *tsk; 2321 struct sts_entry_24xx *sts; 2322 dma_addr_t tsk_dma; 2323 scsi_qla_host_t *vha; 2324 struct qla_hw_data *ha; 2325 struct req_que *req; 2326 struct rsp_que *rsp; 2327 2328 DEBUG11(printk("%s(%ld): entered.\n", __func__, fcport->vha->host_no)); 2329 2330 vha = fcport->vha; 2331 ha = vha->hw; 2332 req = vha->req; 2333 if (ha->flags.cpu_affinity_enabled) 2334 rsp = ha->rsp_q_map[tag + 1]; 2335 else 2336 rsp = req->rsp; 2337 tsk = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &tsk_dma); 2338 if (tsk == NULL) { 2339 DEBUG2_3(printk("%s(%ld): failed to allocate Task Management " 2340 "IOCB.\n", __func__, vha->host_no)); 2341 return QLA_MEMORY_ALLOC_FAILED; 2342 } 2343 memset(tsk, 0, sizeof(struct tsk_mgmt_cmd)); 2344 2345 tsk->p.tsk.entry_type = TSK_MGMT_IOCB_TYPE; 2346 tsk->p.tsk.entry_count = 1; 2347 tsk->p.tsk.handle = MAKE_HANDLE(req->id, tsk->p.tsk.handle); 2348 tsk->p.tsk.nport_handle = cpu_to_le16(fcport->loop_id); 2349 tsk->p.tsk.timeout = cpu_to_le16(ha->r_a_tov / 10 * 2); 2350 tsk->p.tsk.control_flags = cpu_to_le32(type); 2351 tsk->p.tsk.port_id[0] = fcport->d_id.b.al_pa; 2352 tsk->p.tsk.port_id[1] = fcport->d_id.b.area; 2353 tsk->p.tsk.port_id[2] = fcport->d_id.b.domain; 2354 tsk->p.tsk.vp_index = fcport->vp_idx; 2355 if (type == TCF_LUN_RESET) { 2356 int_to_scsilun(l, &tsk->p.tsk.lun); 2357 host_to_fcp_swap((uint8_t *)&tsk->p.tsk.lun, 2358 sizeof(tsk->p.tsk.lun)); 2359 } 2360 2361 sts = &tsk->p.sts; 2362 rval = qla2x00_issue_iocb(vha, tsk, tsk_dma, 0); 2363 if (rval != QLA_SUCCESS) { 2364 DEBUG2_3_11(printk("%s(%ld): failed to issue %s Reset IOCB " 2365 "(%x).\n", __func__, vha->host_no, name, rval)); 2366 } else if (sts->entry_status != 0) { 2367 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2368 "-- error status (%x).\n", __func__, vha->host_no, 2369 sts->entry_status)); 2370 rval = QLA_FUNCTION_FAILED; 2371 } else if (sts->comp_status != 2372 __constant_cpu_to_le16(CS_COMPLETE)) { 2373 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2374 "-- completion status (%x).\n", __func__, 2375 vha->host_no, le16_to_cpu(sts->comp_status))); 2376 rval = QLA_FUNCTION_FAILED; 2377 } else if (!(le16_to_cpu(sts->scsi_status) & 2378 SS_RESPONSE_INFO_LEN_VALID)) { 2379 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2380 "-- no response info (%x).\n", __func__, vha->host_no, 2381 le16_to_cpu(sts->scsi_status))); 2382 rval = QLA_FUNCTION_FAILED; 2383 } else if (le32_to_cpu(sts->rsp_data_len) < 4) { 2384 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2385 "-- not enough response info (%d).\n", __func__, 2386 vha->host_no, le32_to_cpu(sts->rsp_data_len))); 2387 rval = QLA_FUNCTION_FAILED; 2388 } else if (sts->data[3]) { 2389 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2390 "-- response (%x).\n", __func__, 2391 vha->host_no, sts->data[3])); 2392 rval = QLA_FUNCTION_FAILED; 2393 } 2394 2395 /* Issue marker IOCB. */ 2396 rval2 = qla2x00_marker(vha, req, rsp, fcport->loop_id, l, 2397 type == TCF_LUN_RESET ? MK_SYNC_ID_LUN: MK_SYNC_ID); 2398 if (rval2 != QLA_SUCCESS) { 2399 DEBUG2_3_11(printk("%s(%ld): failed to issue Marker IOCB " 2400 "(%x).\n", __func__, vha->host_no, rval2)); 2401 } else { 2402 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2403 } 2404 2405 dma_pool_free(ha->s_dma_pool, tsk, tsk_dma); 2406 2407 return rval; 2408} 2409 2410int 2411qla24xx_abort_target(struct fc_port *fcport, unsigned int l, int tag) 2412{ 2413 return __qla24xx_issue_tmf("Target", TCF_TARGET_RESET, fcport, l, tag); 2414} 2415 2416int 2417qla24xx_lun_reset(struct fc_port *fcport, unsigned int l, int tag) 2418{ 2419 return __qla24xx_issue_tmf("Lun", TCF_LUN_RESET, fcport, l, tag); 2420} 2421 2422int 2423qla2x00_system_error(scsi_qla_host_t *vha) 2424{ 2425 int rval; 2426 mbx_cmd_t mc; 2427 mbx_cmd_t *mcp = &mc; 2428 struct qla_hw_data *ha = vha->hw; 2429 2430 if (!IS_QLA23XX(ha) && !IS_FWI2_CAPABLE(ha)) 2431 return QLA_FUNCTION_FAILED; 2432 2433 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2434 2435 mcp->mb[0] = MBC_GEN_SYSTEM_ERROR; 2436 mcp->out_mb = MBX_0; 2437 mcp->in_mb = MBX_0; 2438 mcp->tov = 5; 2439 mcp->flags = 0; 2440 rval = qla2x00_mailbox_command(vha, mcp); 2441 2442 if (rval != QLA_SUCCESS) { 2443 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 2444 vha->host_no, rval)); 2445 } else { 2446 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2447 } 2448 2449 return rval; 2450} 2451 2452/** 2453 * qla2x00_set_serdes_params() - 2454 * @ha: HA context 2455 * 2456 * Returns 2457 */ 2458int 2459qla2x00_set_serdes_params(scsi_qla_host_t *vha, uint16_t sw_em_1g, 2460 uint16_t sw_em_2g, uint16_t sw_em_4g) 2461{ 2462 int rval; 2463 mbx_cmd_t mc; 2464 mbx_cmd_t *mcp = &mc; 2465 2466 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2467 2468 mcp->mb[0] = MBC_SERDES_PARAMS; 2469 mcp->mb[1] = BIT_0; 2470 mcp->mb[2] = sw_em_1g | BIT_15; 2471 mcp->mb[3] = sw_em_2g | BIT_15; 2472 mcp->mb[4] = sw_em_4g | BIT_15; 2473 mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 2474 mcp->in_mb = MBX_0; 2475 mcp->tov = MBX_TOV_SECONDS; 2476 mcp->flags = 0; 2477 rval = qla2x00_mailbox_command(vha, mcp); 2478 2479 if (rval != QLA_SUCCESS) { 2480 /*EMPTY*/ 2481 DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__, 2482 vha->host_no, rval, mcp->mb[0])); 2483 } else { 2484 /*EMPTY*/ 2485 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2486 } 2487 2488 return rval; 2489} 2490 2491int 2492qla2x00_stop_firmware(scsi_qla_host_t *vha) 2493{ 2494 int rval; 2495 mbx_cmd_t mc; 2496 mbx_cmd_t *mcp = &mc; 2497 2498 if (!IS_FWI2_CAPABLE(vha->hw)) 2499 return QLA_FUNCTION_FAILED; 2500 2501 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2502 2503 mcp->mb[0] = MBC_STOP_FIRMWARE; 2504 mcp->out_mb = MBX_0; 2505 mcp->in_mb = MBX_0; 2506 mcp->tov = 5; 2507 mcp->flags = 0; 2508 rval = qla2x00_mailbox_command(vha, mcp); 2509 2510 if (rval != QLA_SUCCESS) { 2511 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 2512 vha->host_no, rval)); 2513 if (mcp->mb[0] == MBS_INVALID_COMMAND) 2514 rval = QLA_INVALID_COMMAND; 2515 } else { 2516 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2517 } 2518 2519 return rval; 2520} 2521 2522int 2523qla2x00_enable_eft_trace(scsi_qla_host_t *vha, dma_addr_t eft_dma, 2524 uint16_t buffers) 2525{ 2526 int rval; 2527 mbx_cmd_t mc; 2528 mbx_cmd_t *mcp = &mc; 2529 2530 if (!IS_FWI2_CAPABLE(vha->hw)) 2531 return QLA_FUNCTION_FAILED; 2532 2533 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2534 2535 mcp->mb[0] = MBC_TRACE_CONTROL; 2536 mcp->mb[1] = TC_EFT_ENABLE; 2537 mcp->mb[2] = LSW(eft_dma); 2538 mcp->mb[3] = MSW(eft_dma); 2539 mcp->mb[4] = LSW(MSD(eft_dma)); 2540 mcp->mb[5] = MSW(MSD(eft_dma)); 2541 mcp->mb[6] = buffers; 2542 mcp->mb[7] = TC_AEN_DISABLE; 2543 mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 2544 mcp->in_mb = MBX_1|MBX_0; 2545 mcp->tov = MBX_TOV_SECONDS; 2546 mcp->flags = 0; 2547 rval = qla2x00_mailbox_command(vha, mcp); 2548 if (rval != QLA_SUCCESS) { 2549 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n", 2550 __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 2551 } else { 2552 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2553 } 2554 2555 return rval; 2556} 2557 2558int 2559qla2x00_disable_eft_trace(scsi_qla_host_t *vha) 2560{ 2561 int rval; 2562 mbx_cmd_t mc; 2563 mbx_cmd_t *mcp = &mc; 2564 2565 if (!IS_FWI2_CAPABLE(vha->hw)) 2566 return QLA_FUNCTION_FAILED; 2567 2568 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2569 2570 mcp->mb[0] = MBC_TRACE_CONTROL; 2571 mcp->mb[1] = TC_EFT_DISABLE; 2572 mcp->out_mb = MBX_1|MBX_0; 2573 mcp->in_mb = MBX_1|MBX_0; 2574 mcp->tov = MBX_TOV_SECONDS; 2575 mcp->flags = 0; 2576 rval = qla2x00_mailbox_command(vha, mcp); 2577 if (rval != QLA_SUCCESS) { 2578 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n", 2579 __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 2580 } else { 2581 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2582 } 2583 2584 return rval; 2585} 2586 2587int 2588qla2x00_enable_fce_trace(scsi_qla_host_t *vha, dma_addr_t fce_dma, 2589 uint16_t buffers, uint16_t *mb, uint32_t *dwords) 2590{ 2591 int rval; 2592 mbx_cmd_t mc; 2593 mbx_cmd_t *mcp = &mc; 2594 2595 if (!IS_QLA25XX(vha->hw) && !IS_QLA81XX(vha->hw)) 2596 return QLA_FUNCTION_FAILED; 2597 2598 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2599 2600 mcp->mb[0] = MBC_TRACE_CONTROL; 2601 mcp->mb[1] = TC_FCE_ENABLE; 2602 mcp->mb[2] = LSW(fce_dma); 2603 mcp->mb[3] = MSW(fce_dma); 2604 mcp->mb[4] = LSW(MSD(fce_dma)); 2605 mcp->mb[5] = MSW(MSD(fce_dma)); 2606 mcp->mb[6] = buffers; 2607 mcp->mb[7] = TC_AEN_DISABLE; 2608 mcp->mb[8] = 0; 2609 mcp->mb[9] = TC_FCE_DEFAULT_RX_SIZE; 2610 mcp->mb[10] = TC_FCE_DEFAULT_TX_SIZE; 2611 mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2| 2612 MBX_1|MBX_0; 2613 mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 2614 mcp->tov = MBX_TOV_SECONDS; 2615 mcp->flags = 0; 2616 rval = qla2x00_mailbox_command(vha, mcp); 2617 if (rval != QLA_SUCCESS) { 2618 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n", 2619 __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 2620 } else { 2621 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2622 2623 if (mb) 2624 memcpy(mb, mcp->mb, 8 * sizeof(*mb)); 2625 if (dwords) 2626 *dwords = buffers; 2627 } 2628 2629 return rval; 2630} 2631 2632int 2633qla2x00_disable_fce_trace(scsi_qla_host_t *vha, uint64_t *wr, uint64_t *rd) 2634{ 2635 int rval; 2636 mbx_cmd_t mc; 2637 mbx_cmd_t *mcp = &mc; 2638 2639 if (!IS_FWI2_CAPABLE(vha->hw)) 2640 return QLA_FUNCTION_FAILED; 2641 2642 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2643 2644 mcp->mb[0] = MBC_TRACE_CONTROL; 2645 mcp->mb[1] = TC_FCE_DISABLE; 2646 mcp->mb[2] = TC_FCE_DISABLE_TRACE; 2647 mcp->out_mb = MBX_2|MBX_1|MBX_0; 2648 mcp->in_mb = MBX_9|MBX_8|MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2| 2649 MBX_1|MBX_0; 2650 mcp->tov = MBX_TOV_SECONDS; 2651 mcp->flags = 0; 2652 rval = qla2x00_mailbox_command(vha, mcp); 2653 if (rval != QLA_SUCCESS) { 2654 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n", 2655 __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 2656 } else { 2657 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2658 2659 if (wr) 2660 *wr = (uint64_t) mcp->mb[5] << 48 | 2661 (uint64_t) mcp->mb[4] << 32 | 2662 (uint64_t) mcp->mb[3] << 16 | 2663 (uint64_t) mcp->mb[2]; 2664 if (rd) 2665 *rd = (uint64_t) mcp->mb[9] << 48 | 2666 (uint64_t) mcp->mb[8] << 32 | 2667 (uint64_t) mcp->mb[7] << 16 | 2668 (uint64_t) mcp->mb[6]; 2669 } 2670 2671 return rval; 2672} 2673 2674int 2675qla2x00_read_sfp(scsi_qla_host_t *vha, dma_addr_t sfp_dma, uint16_t addr, 2676 uint16_t off, uint16_t count) 2677{ 2678 int rval; 2679 mbx_cmd_t mc; 2680 mbx_cmd_t *mcp = &mc; 2681 2682 if (!IS_FWI2_CAPABLE(vha->hw)) 2683 return QLA_FUNCTION_FAILED; 2684 2685 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2686 2687 mcp->mb[0] = MBC_READ_SFP; 2688 mcp->mb[1] = addr; 2689 mcp->mb[2] = MSW(sfp_dma); 2690 mcp->mb[3] = LSW(sfp_dma); 2691 mcp->mb[6] = MSW(MSD(sfp_dma)); 2692 mcp->mb[7] = LSW(MSD(sfp_dma)); 2693 mcp->mb[8] = count; 2694 mcp->mb[9] = off; 2695 mcp->mb[10] = 0; 2696 mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 2697 mcp->in_mb = MBX_0; 2698 mcp->tov = MBX_TOV_SECONDS; 2699 mcp->flags = 0; 2700 rval = qla2x00_mailbox_command(vha, mcp); 2701 2702 if (rval != QLA_SUCCESS) { 2703 DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__, 2704 vha->host_no, rval, mcp->mb[0])); 2705 } else { 2706 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2707 } 2708 2709 return rval; 2710} 2711 2712int 2713qla2x00_set_idma_speed(scsi_qla_host_t *vha, uint16_t loop_id, 2714 uint16_t port_speed, uint16_t *mb) 2715{ 2716 int rval; 2717 mbx_cmd_t mc; 2718 mbx_cmd_t *mcp = &mc; 2719 2720 if (!IS_IIDMA_CAPABLE(vha->hw)) 2721 return QLA_FUNCTION_FAILED; 2722 2723 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 2724 2725 mcp->mb[0] = MBC_PORT_PARAMS; 2726 mcp->mb[1] = loop_id; 2727 mcp->mb[2] = BIT_0; 2728 if (IS_QLA81XX(vha->hw)) 2729 mcp->mb[3] = port_speed & (BIT_5|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0); 2730 else 2731 mcp->mb[3] = port_speed & (BIT_2|BIT_1|BIT_0); 2732 mcp->mb[9] = vha->vp_idx; 2733 mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0; 2734 mcp->in_mb = MBX_3|MBX_1|MBX_0; 2735 mcp->tov = MBX_TOV_SECONDS; 2736 mcp->flags = 0; 2737 rval = qla2x00_mailbox_command(vha, mcp); 2738 2739 /* Return mailbox statuses. */ 2740 if (mb != NULL) { 2741 mb[0] = mcp->mb[0]; 2742 mb[1] = mcp->mb[1]; 2743 mb[3] = mcp->mb[3]; 2744 } 2745 2746 if (rval != QLA_SUCCESS) { 2747 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 2748 vha->host_no, rval)); 2749 } else { 2750 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 2751 } 2752 2753 return rval; 2754} 2755 2756void 2757qla24xx_report_id_acquisition(scsi_qla_host_t *vha, 2758 struct vp_rpt_id_entry_24xx *rptid_entry) 2759{ 2760 uint8_t vp_idx; 2761 uint16_t stat = le16_to_cpu(rptid_entry->vp_idx); 2762 struct qla_hw_data *ha = vha->hw; 2763 scsi_qla_host_t *vp; 2764 scsi_qla_host_t *tvp; 2765 2766 if (rptid_entry->entry_status != 0) 2767 return; 2768 2769 if (rptid_entry->format == 0) { 2770 DEBUG15(printk("%s:format 0 : scsi(%ld) number of VPs setup %d," 2771 " number of VPs acquired %d\n", __func__, vha->host_no, 2772 MSB(le16_to_cpu(rptid_entry->vp_count)), 2773 LSB(le16_to_cpu(rptid_entry->vp_count)))); 2774 DEBUG15(printk("%s primary port id %02x%02x%02x\n", __func__, 2775 rptid_entry->port_id[2], rptid_entry->port_id[1], 2776 rptid_entry->port_id[0])); 2777 } else if (rptid_entry->format == 1) { 2778 vp_idx = LSB(stat); 2779 DEBUG15(printk("%s:format 1: scsi(%ld): VP[%d] enabled " 2780 "- status %d - " 2781 "with port id %02x%02x%02x\n", __func__, vha->host_no, 2782 vp_idx, MSB(stat), 2783 rptid_entry->port_id[2], rptid_entry->port_id[1], 2784 rptid_entry->port_id[0])); 2785 2786 vp = vha; 2787 if (vp_idx == 0 && (MSB(stat) != 1)) 2788 goto reg_needed; 2789 2790 if (MSB(stat) == 1) { 2791 DEBUG2(printk("scsi(%ld): Could not acquire ID for " 2792 "VP[%d].\n", vha->host_no, vp_idx)); 2793 return; 2794 } 2795 2796 list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) 2797 if (vp_idx == vp->vp_idx) 2798 break; 2799 if (!vp) 2800 return; 2801 2802 vp->d_id.b.domain = rptid_entry->port_id[2]; 2803 vp->d_id.b.area = rptid_entry->port_id[1]; 2804 vp->d_id.b.al_pa = rptid_entry->port_id[0]; 2805 2806 /* 2807 * Cannot configure here as we are still sitting on the 2808 * response queue. Handle it in dpc context. 2809 */ 2810 set_bit(VP_IDX_ACQUIRED, &vp->vp_flags); 2811 2812reg_needed: 2813 set_bit(REGISTER_FC4_NEEDED, &vp->dpc_flags); 2814 set_bit(REGISTER_FDMI_NEEDED, &vp->dpc_flags); 2815 set_bit(VP_DPC_NEEDED, &vha->dpc_flags); 2816 qla2xxx_wake_dpc(vha); 2817 } 2818} 2819 2820/* 2821 * qla24xx_modify_vp_config 2822 * Change VP configuration for vha 2823 * 2824 * Input: 2825 * vha = adapter block pointer. 2826 * 2827 * Returns: 2828 * qla2xxx local function return status code. 2829 * 2830 * Context: 2831 * Kernel context. 2832 */ 2833int 2834qla24xx_modify_vp_config(scsi_qla_host_t *vha) 2835{ 2836 int rval; 2837 struct vp_config_entry_24xx *vpmod; 2838 dma_addr_t vpmod_dma; 2839 struct qla_hw_data *ha = vha->hw; 2840 struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); 2841 2842 /* This can be called by the parent */ 2843 2844 vpmod = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &vpmod_dma); 2845 if (!vpmod) { 2846 DEBUG2_3(printk("%s(%ld): failed to allocate Modify VP " 2847 "IOCB.\n", __func__, vha->host_no)); 2848 return QLA_MEMORY_ALLOC_FAILED; 2849 } 2850 2851 memset(vpmod, 0, sizeof(struct vp_config_entry_24xx)); 2852 vpmod->entry_type = VP_CONFIG_IOCB_TYPE; 2853 vpmod->entry_count = 1; 2854 vpmod->command = VCT_COMMAND_MOD_ENABLE_VPS; 2855 vpmod->vp_count = 1; 2856 vpmod->vp_index1 = vha->vp_idx; 2857 vpmod->options_idx1 = BIT_3|BIT_4|BIT_5; 2858 memcpy(vpmod->node_name_idx1, vha->node_name, WWN_SIZE); 2859 memcpy(vpmod->port_name_idx1, vha->port_name, WWN_SIZE); 2860 vpmod->entry_count = 1; 2861 2862 rval = qla2x00_issue_iocb(base_vha, vpmod, vpmod_dma, 0); 2863 if (rval != QLA_SUCCESS) { 2864 DEBUG2_3_11(printk("%s(%ld): failed to issue VP config IOCB" 2865 "(%x).\n", __func__, base_vha->host_no, rval)); 2866 } else if (vpmod->comp_status != 0) { 2867 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2868 "-- error status (%x).\n", __func__, base_vha->host_no, 2869 vpmod->comp_status)); 2870 rval = QLA_FUNCTION_FAILED; 2871 } else if (vpmod->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) { 2872 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2873 "-- completion status (%x).\n", __func__, base_vha->host_no, 2874 le16_to_cpu(vpmod->comp_status))); 2875 rval = QLA_FUNCTION_FAILED; 2876 } else { 2877 /* EMPTY */ 2878 DEBUG11(printk("%s(%ld): done.\n", __func__, 2879 base_vha->host_no)); 2880 fc_vport_set_state(vha->fc_vport, FC_VPORT_INITIALIZING); 2881 } 2882 dma_pool_free(ha->s_dma_pool, vpmod, vpmod_dma); 2883 2884 return rval; 2885} 2886 2887/* 2888 * qla24xx_control_vp 2889 * Enable a virtual port for given host 2890 * 2891 * Input: 2892 * ha = adapter block pointer. 2893 * vhba = virtual adapter (unused) 2894 * index = index number for enabled VP 2895 * 2896 * Returns: 2897 * qla2xxx local function return status code. 2898 * 2899 * Context: 2900 * Kernel context. 2901 */ 2902int 2903qla24xx_control_vp(scsi_qla_host_t *vha, int cmd) 2904{ 2905 int rval; 2906 int map, pos; 2907 struct vp_ctrl_entry_24xx *vce; 2908 dma_addr_t vce_dma; 2909 struct qla_hw_data *ha = vha->hw; 2910 int vp_index = vha->vp_idx; 2911 struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); 2912 2913 DEBUG11(printk("%s(%ld): entered. Enabling index %d\n", __func__, 2914 vha->host_no, vp_index)); 2915 2916 if (vp_index == 0 || vp_index >= ha->max_npiv_vports) 2917 return QLA_PARAMETER_ERROR; 2918 2919 vce = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &vce_dma); 2920 if (!vce) { 2921 DEBUG2_3(printk("%s(%ld): " 2922 "failed to allocate VP Control IOCB.\n", __func__, 2923 base_vha->host_no)); 2924 return QLA_MEMORY_ALLOC_FAILED; 2925 } 2926 memset(vce, 0, sizeof(struct vp_ctrl_entry_24xx)); 2927 2928 vce->entry_type = VP_CTRL_IOCB_TYPE; 2929 vce->entry_count = 1; 2930 vce->command = cpu_to_le16(cmd); 2931 vce->vp_count = __constant_cpu_to_le16(1); 2932 2933 /* index map in firmware starts with 1; decrement index 2934 * this is ok as we never use index 0 2935 */ 2936 map = (vp_index - 1) / 8; 2937 pos = (vp_index - 1) & 7; 2938 mutex_lock(&ha->vport_lock); 2939 vce->vp_idx_map[map] |= 1 << pos; 2940 mutex_unlock(&ha->vport_lock); 2941 2942 rval = qla2x00_issue_iocb(base_vha, vce, vce_dma, 0); 2943 if (rval != QLA_SUCCESS) { 2944 DEBUG2_3_11(printk("%s(%ld): failed to issue VP control IOCB" 2945 "(%x).\n", __func__, base_vha->host_no, rval)); 2946 printk("%s(%ld): failed to issue VP control IOCB" 2947 "(%x).\n", __func__, base_vha->host_no, rval); 2948 } else if (vce->entry_status != 0) { 2949 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2950 "-- error status (%x).\n", __func__, base_vha->host_no, 2951 vce->entry_status)); 2952 printk("%s(%ld): failed to complete IOCB " 2953 "-- error status (%x).\n", __func__, base_vha->host_no, 2954 vce->entry_status); 2955 rval = QLA_FUNCTION_FAILED; 2956 } else if (vce->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) { 2957 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2958 "-- completion status (%x).\n", __func__, base_vha->host_no, 2959 le16_to_cpu(vce->comp_status))); 2960 printk("%s(%ld): failed to complete IOCB " 2961 "-- completion status (%x).\n", __func__, base_vha->host_no, 2962 le16_to_cpu(vce->comp_status)); 2963 rval = QLA_FUNCTION_FAILED; 2964 } else { 2965 DEBUG2(printk("%s(%ld): done.\n", __func__, base_vha->host_no)); 2966 } 2967 2968 dma_pool_free(ha->s_dma_pool, vce, vce_dma); 2969 2970 return rval; 2971} 2972 2973/* 2974 * qla2x00_send_change_request 2975 * Receive or disable RSCN request from fabric controller 2976 * 2977 * Input: 2978 * ha = adapter block pointer 2979 * format = registration format: 2980 * 0 - Reserved 2981 * 1 - Fabric detected registration 2982 * 2 - N_port detected registration 2983 * 3 - Full registration 2984 * FF - clear registration 2985 * vp_idx = Virtual port index 2986 * 2987 * Returns: 2988 * qla2x00 local function return status code. 2989 * 2990 * Context: 2991 * Kernel Context 2992 */ 2993 2994int 2995qla2x00_send_change_request(scsi_qla_host_t *vha, uint16_t format, 2996 uint16_t vp_idx) 2997{ 2998 int rval; 2999 mbx_cmd_t mc; 3000 mbx_cmd_t *mcp = &mc; 3001 3002 /* 3003 * This command is implicitly executed by firmware during login for the 3004 * physical hosts 3005 */ 3006 if (vp_idx == 0) 3007 return QLA_FUNCTION_FAILED; 3008 3009 mcp->mb[0] = MBC_SEND_CHANGE_REQUEST; 3010 mcp->mb[1] = format; 3011 mcp->mb[9] = vp_idx; 3012 mcp->out_mb = MBX_9|MBX_1|MBX_0; 3013 mcp->in_mb = MBX_0|MBX_1; 3014 mcp->tov = MBX_TOV_SECONDS; 3015 mcp->flags = 0; 3016 rval = qla2x00_mailbox_command(vha, mcp); 3017 3018 if (rval == QLA_SUCCESS) { 3019 if (mcp->mb[0] != MBS_COMMAND_COMPLETE) { 3020 rval = BIT_1; 3021 } 3022 } else 3023 rval = BIT_1; 3024 3025 return rval; 3026} 3027 3028int 3029qla2x00_dump_ram(scsi_qla_host_t *vha, dma_addr_t req_dma, uint32_t addr, 3030 uint32_t size) 3031{ 3032 int rval; 3033 mbx_cmd_t mc; 3034 mbx_cmd_t *mcp = &mc; 3035 3036 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3037 3038 if (MSW(addr) || IS_FWI2_CAPABLE(vha->hw)) { 3039 mcp->mb[0] = MBC_DUMP_RISC_RAM_EXTENDED; 3040 mcp->mb[8] = MSW(addr); 3041 mcp->out_mb = MBX_8|MBX_0; 3042 } else { 3043 mcp->mb[0] = MBC_DUMP_RISC_RAM; 3044 mcp->out_mb = MBX_0; 3045 } 3046 mcp->mb[1] = LSW(addr); 3047 mcp->mb[2] = MSW(req_dma); 3048 mcp->mb[3] = LSW(req_dma); 3049 mcp->mb[6] = MSW(MSD(req_dma)); 3050 mcp->mb[7] = LSW(MSD(req_dma)); 3051 mcp->out_mb |= MBX_7|MBX_6|MBX_3|MBX_2|MBX_1; 3052 if (IS_FWI2_CAPABLE(vha->hw)) { 3053 mcp->mb[4] = MSW(size); 3054 mcp->mb[5] = LSW(size); 3055 mcp->out_mb |= MBX_5|MBX_4; 3056 } else { 3057 mcp->mb[4] = LSW(size); 3058 mcp->out_mb |= MBX_4; 3059 } 3060 3061 mcp->in_mb = MBX_0; 3062 mcp->tov = MBX_TOV_SECONDS; 3063 mcp->flags = 0; 3064 rval = qla2x00_mailbox_command(vha, mcp); 3065 3066 if (rval != QLA_SUCCESS) { 3067 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__, 3068 vha->host_no, rval, mcp->mb[0])); 3069 } else { 3070 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3071 } 3072 3073 return rval; 3074} 3075 3076/* 84XX Support **************************************************************/ 3077 3078struct cs84xx_mgmt_cmd { 3079 union { 3080 struct verify_chip_entry_84xx req; 3081 struct verify_chip_rsp_84xx rsp; 3082 } p; 3083}; 3084 3085int 3086qla84xx_verify_chip(struct scsi_qla_host *vha, uint16_t *status) 3087{ 3088 int rval, retry; 3089 struct cs84xx_mgmt_cmd *mn; 3090 dma_addr_t mn_dma; 3091 uint16_t options; 3092 unsigned long flags; 3093 struct qla_hw_data *ha = vha->hw; 3094 3095 DEBUG16(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3096 3097 mn = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &mn_dma); 3098 if (mn == NULL) { 3099 DEBUG2_3(printk("%s(%ld): failed to allocate Verify ISP84XX " 3100 "IOCB.\n", __func__, vha->host_no)); 3101 return QLA_MEMORY_ALLOC_FAILED; 3102 } 3103 3104 /* Force Update? */ 3105 options = ha->cs84xx->fw_update ? VCO_FORCE_UPDATE : 0; 3106 /* Diagnostic firmware? */ 3107 /* options |= MENLO_DIAG_FW; */ 3108 /* We update the firmware with only one data sequence. */ 3109 options |= VCO_END_OF_DATA; 3110 3111 do { 3112 retry = 0; 3113 memset(mn, 0, sizeof(*mn)); 3114 mn->p.req.entry_type = VERIFY_CHIP_IOCB_TYPE; 3115 mn->p.req.entry_count = 1; 3116 mn->p.req.options = cpu_to_le16(options); 3117 3118 DEBUG16(printk("%s(%ld): Dump of Verify Request.\n", __func__, 3119 vha->host_no)); 3120 DEBUG16(qla2x00_dump_buffer((uint8_t *)mn, 3121 sizeof(*mn))); 3122 3123 rval = qla2x00_issue_iocb_timeout(vha, mn, mn_dma, 0, 120); 3124 if (rval != QLA_SUCCESS) { 3125 DEBUG2_16(printk("%s(%ld): failed to issue Verify " 3126 "IOCB (%x).\n", __func__, vha->host_no, rval)); 3127 goto verify_done; 3128 } 3129 3130 DEBUG16(printk("%s(%ld): Dump of Verify Response.\n", __func__, 3131 vha->host_no)); 3132 DEBUG16(qla2x00_dump_buffer((uint8_t *)mn, 3133 sizeof(*mn))); 3134 3135 status[0] = le16_to_cpu(mn->p.rsp.comp_status); 3136 status[1] = status[0] == CS_VCS_CHIP_FAILURE ? 3137 le16_to_cpu(mn->p.rsp.failure_code) : 0; 3138 DEBUG2_16(printk("%s(%ld): cs=%x fc=%x\n", __func__, 3139 vha->host_no, status[0], status[1])); 3140 3141 if (status[0] != CS_COMPLETE) { 3142 rval = QLA_FUNCTION_FAILED; 3143 if (!(options & VCO_DONT_UPDATE_FW)) { 3144 DEBUG2_16(printk("%s(%ld): Firmware update " 3145 "failed. Retrying without update " 3146 "firmware.\n", __func__, vha->host_no)); 3147 options |= VCO_DONT_UPDATE_FW; 3148 options &= ~VCO_FORCE_UPDATE; 3149 retry = 1; 3150 } 3151 } else { 3152 DEBUG2_16(printk("%s(%ld): firmware updated to %x.\n", 3153 __func__, vha->host_no, 3154 le32_to_cpu(mn->p.rsp.fw_ver))); 3155 3156 /* NOTE: we only update OP firmware. */ 3157 spin_lock_irqsave(&ha->cs84xx->access_lock, flags); 3158 ha->cs84xx->op_fw_version = 3159 le32_to_cpu(mn->p.rsp.fw_ver); 3160 spin_unlock_irqrestore(&ha->cs84xx->access_lock, 3161 flags); 3162 } 3163 } while (retry); 3164 3165verify_done: 3166 dma_pool_free(ha->s_dma_pool, mn, mn_dma); 3167 3168 if (rval != QLA_SUCCESS) { 3169 DEBUG2_16(printk("%s(%ld): failed=%x.\n", __func__, 3170 vha->host_no, rval)); 3171 } else { 3172 DEBUG16(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3173 } 3174 3175 return rval; 3176} 3177 3178int 3179qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) 3180{ 3181 int rval; 3182 unsigned long flags; 3183 mbx_cmd_t mc; 3184 mbx_cmd_t *mcp = &mc; 3185 struct device_reg_25xxmq __iomem *reg; 3186 struct qla_hw_data *ha = vha->hw; 3187 3188 mcp->mb[0] = MBC_INITIALIZE_MULTIQ; 3189 mcp->mb[1] = req->options; 3190 mcp->mb[2] = MSW(LSD(req->dma)); 3191 mcp->mb[3] = LSW(LSD(req->dma)); 3192 mcp->mb[6] = MSW(MSD(req->dma)); 3193 mcp->mb[7] = LSW(MSD(req->dma)); 3194 mcp->mb[5] = req->length; 3195 if (req->rsp) 3196 mcp->mb[10] = req->rsp->id; 3197 mcp->mb[12] = req->qos; 3198 mcp->mb[11] = req->vp_idx; 3199 mcp->mb[13] = req->rid; 3200 3201 reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) + 3202 QLA_QUE_PAGE * req->id); 3203 3204 mcp->mb[4] = req->id; 3205 /* que in ptr index */ 3206 mcp->mb[8] = 0; 3207 /* que out ptr index */ 3208 mcp->mb[9] = 0; 3209 mcp->out_mb = MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8|MBX_7| 3210 MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 3211 mcp->in_mb = MBX_0; 3212 mcp->flags = MBX_DMA_OUT; 3213 mcp->tov = 60; 3214 3215 spin_lock_irqsave(&ha->hardware_lock, flags); 3216 if (!(req->options & BIT_0)) { 3217 WRT_REG_DWORD(®->req_q_in, 0); 3218 WRT_REG_DWORD(®->req_q_out, 0); 3219 } 3220 req->req_q_in = ®->req_q_in; 3221 req->req_q_out = ®->req_q_out; 3222 spin_unlock_irqrestore(&ha->hardware_lock, flags); 3223 3224 rval = qla2x00_mailbox_command(vha, mcp); 3225 if (rval != QLA_SUCCESS) 3226 DEBUG2_3_11(printk(KERN_WARNING "%s(%ld): failed=%x mb0=%x.\n", 3227 __func__, vha->host_no, rval, mcp->mb[0])); 3228 return rval; 3229} 3230 3231int 3232qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) 3233{ 3234 int rval; 3235 unsigned long flags; 3236 mbx_cmd_t mc; 3237 mbx_cmd_t *mcp = &mc; 3238 struct device_reg_25xxmq __iomem *reg; 3239 struct qla_hw_data *ha = vha->hw; 3240 3241 mcp->mb[0] = MBC_INITIALIZE_MULTIQ; 3242 mcp->mb[1] = rsp->options; 3243 mcp->mb[2] = MSW(LSD(rsp->dma)); 3244 mcp->mb[3] = LSW(LSD(rsp->dma)); 3245 mcp->mb[6] = MSW(MSD(rsp->dma)); 3246 mcp->mb[7] = LSW(MSD(rsp->dma)); 3247 mcp->mb[5] = rsp->length; 3248 mcp->mb[14] = rsp->msix->entry; 3249 mcp->mb[13] = rsp->rid; 3250 3251 reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) + 3252 QLA_QUE_PAGE * rsp->id); 3253 3254 mcp->mb[4] = rsp->id; 3255 /* que in ptr index */ 3256 mcp->mb[8] = 0; 3257 /* que out ptr index */ 3258 mcp->mb[9] = 0; 3259 mcp->out_mb = MBX_14|MBX_13|MBX_9|MBX_8|MBX_7 3260 |MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 3261 mcp->in_mb = MBX_0; 3262 mcp->flags = MBX_DMA_OUT; 3263 mcp->tov = 60; 3264 3265 spin_lock_irqsave(&ha->hardware_lock, flags); 3266 if (!(rsp->options & BIT_0)) { 3267 WRT_REG_DWORD(®->rsp_q_out, 0); 3268 WRT_REG_DWORD(®->rsp_q_in, 0); 3269 } 3270 3271 spin_unlock_irqrestore(&ha->hardware_lock, flags); 3272 3273 rval = qla2x00_mailbox_command(vha, mcp); 3274 if (rval != QLA_SUCCESS) 3275 DEBUG2_3_11(printk(KERN_WARNING "%s(%ld): failed=%x " 3276 "mb0=%x.\n", __func__, 3277 vha->host_no, rval, mcp->mb[0])); 3278 return rval; 3279} 3280 3281int 3282qla81xx_idc_ack(scsi_qla_host_t *vha, uint16_t *mb) 3283{ 3284 int rval; 3285 mbx_cmd_t mc; 3286 mbx_cmd_t *mcp = &mc; 3287 3288 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3289 3290 mcp->mb[0] = MBC_IDC_ACK; 3291 memcpy(&mcp->mb[1], mb, QLA_IDC_ACK_REGS * sizeof(uint16_t)); 3292 mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 3293 mcp->in_mb = MBX_0; 3294 mcp->tov = MBX_TOV_SECONDS; 3295 mcp->flags = 0; 3296 rval = qla2x00_mailbox_command(vha, mcp); 3297 3298 if (rval != QLA_SUCCESS) { 3299 DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__, 3300 vha->host_no, rval, mcp->mb[0])); 3301 } else { 3302 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3303 } 3304 3305 return rval; 3306} 3307 3308int 3309qla81xx_fac_get_sector_size(scsi_qla_host_t *vha, uint32_t *sector_size) 3310{ 3311 int rval; 3312 mbx_cmd_t mc; 3313 mbx_cmd_t *mcp = &mc; 3314 3315 if (!IS_QLA81XX(vha->hw)) 3316 return QLA_FUNCTION_FAILED; 3317 3318 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3319 3320 mcp->mb[0] = MBC_FLASH_ACCESS_CTRL; 3321 mcp->mb[1] = FAC_OPT_CMD_GET_SECTOR_SIZE; 3322 mcp->out_mb = MBX_1|MBX_0; 3323 mcp->in_mb = MBX_1|MBX_0; 3324 mcp->tov = MBX_TOV_SECONDS; 3325 mcp->flags = 0; 3326 rval = qla2x00_mailbox_command(vha, mcp); 3327 3328 if (rval != QLA_SUCCESS) { 3329 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n", 3330 __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 3331 } else { 3332 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3333 *sector_size = mcp->mb[1]; 3334 } 3335 3336 return rval; 3337} 3338 3339int 3340qla81xx_fac_do_write_enable(scsi_qla_host_t *vha, int enable) 3341{ 3342 int rval; 3343 mbx_cmd_t mc; 3344 mbx_cmd_t *mcp = &mc; 3345 3346 if (!IS_QLA81XX(vha->hw)) 3347 return QLA_FUNCTION_FAILED; 3348 3349 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3350 3351 mcp->mb[0] = MBC_FLASH_ACCESS_CTRL; 3352 mcp->mb[1] = enable ? FAC_OPT_CMD_WRITE_ENABLE : 3353 FAC_OPT_CMD_WRITE_PROTECT; 3354 mcp->out_mb = MBX_1|MBX_0; 3355 mcp->in_mb = MBX_1|MBX_0; 3356 mcp->tov = MBX_TOV_SECONDS; 3357 mcp->flags = 0; 3358 rval = qla2x00_mailbox_command(vha, mcp); 3359 3360 if (rval != QLA_SUCCESS) { 3361 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n", 3362 __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 3363 } else { 3364 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3365 } 3366 3367 return rval; 3368} 3369 3370int 3371qla81xx_fac_erase_sector(scsi_qla_host_t *vha, uint32_t start, uint32_t finish) 3372{ 3373 int rval; 3374 mbx_cmd_t mc; 3375 mbx_cmd_t *mcp = &mc; 3376 3377 if (!IS_QLA81XX(vha->hw)) 3378 return QLA_FUNCTION_FAILED; 3379 3380 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3381 3382 mcp->mb[0] = MBC_FLASH_ACCESS_CTRL; 3383 mcp->mb[1] = FAC_OPT_CMD_ERASE_SECTOR; 3384 mcp->mb[2] = LSW(start); 3385 mcp->mb[3] = MSW(start); 3386 mcp->mb[4] = LSW(finish); 3387 mcp->mb[5] = MSW(finish); 3388 mcp->out_mb = MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 3389 mcp->in_mb = MBX_2|MBX_1|MBX_0; 3390 mcp->tov = MBX_TOV_SECONDS; 3391 mcp->flags = 0; 3392 rval = qla2x00_mailbox_command(vha, mcp); 3393 3394 if (rval != QLA_SUCCESS) { 3395 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x " 3396 "mb[2]=%x.\n", __func__, vha->host_no, rval, mcp->mb[0], 3397 mcp->mb[1], mcp->mb[2])); 3398 } else { 3399 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3400 } 3401 3402 return rval; 3403} 3404 3405int 3406qla81xx_restart_mpi_firmware(scsi_qla_host_t *vha) 3407{ 3408 int rval = 0; 3409 mbx_cmd_t mc; 3410 mbx_cmd_t *mcp = &mc; 3411 3412 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3413 3414 mcp->mb[0] = MBC_RESTART_MPI_FW; 3415 mcp->out_mb = MBX_0; 3416 mcp->in_mb = MBX_0|MBX_1; 3417 mcp->tov = MBX_TOV_SECONDS; 3418 mcp->flags = 0; 3419 rval = qla2x00_mailbox_command(vha, mcp); 3420 3421 if (rval != QLA_SUCCESS) { 3422 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=0x%x mb[1]=0x%x.\n", 3423 __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1])); 3424 } else { 3425 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3426 } 3427 3428 return rval; 3429} 3430 3431int 3432qla2x00_read_edc(scsi_qla_host_t *vha, uint16_t dev, uint16_t adr, 3433 dma_addr_t sfp_dma, uint8_t *sfp, uint16_t len, uint16_t opt) 3434{ 3435 int rval; 3436 mbx_cmd_t mc; 3437 mbx_cmd_t *mcp = &mc; 3438 3439 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3440 3441 mcp->mb[0] = MBC_READ_SFP; 3442 mcp->mb[1] = dev; 3443 mcp->mb[2] = MSW(sfp_dma); 3444 mcp->mb[3] = LSW(sfp_dma); 3445 mcp->mb[6] = MSW(MSD(sfp_dma)); 3446 mcp->mb[7] = LSW(MSD(sfp_dma)); 3447 mcp->mb[8] = len; 3448 mcp->mb[9] = adr; 3449 mcp->mb[10] = opt; 3450 mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 3451 mcp->in_mb = MBX_0; 3452 mcp->tov = MBX_TOV_SECONDS; 3453 mcp->flags = 0; 3454 rval = qla2x00_mailbox_command(vha, mcp); 3455 3456 if (opt & BIT_0) 3457 if (sfp) 3458 *sfp = mcp->mb[8]; 3459 3460 if (rval != QLA_SUCCESS) { 3461 DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__, 3462 vha->host_no, rval, mcp->mb[0])); 3463 } else { 3464 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3465 } 3466 3467 return rval; 3468} 3469 3470int 3471qla2x00_write_edc(scsi_qla_host_t *vha, uint16_t dev, uint16_t adr, 3472 dma_addr_t sfp_dma, uint8_t *sfp, uint16_t len, uint16_t opt) 3473{ 3474 int rval; 3475 mbx_cmd_t mc; 3476 mbx_cmd_t *mcp = &mc; 3477 3478 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3479 3480 if (opt & BIT_0) 3481 if (sfp) 3482 len = *sfp; 3483 3484 mcp->mb[0] = MBC_WRITE_SFP; 3485 mcp->mb[1] = dev; 3486 mcp->mb[2] = MSW(sfp_dma); 3487 mcp->mb[3] = LSW(sfp_dma); 3488 mcp->mb[6] = MSW(MSD(sfp_dma)); 3489 mcp->mb[7] = LSW(MSD(sfp_dma)); 3490 mcp->mb[8] = len; 3491 mcp->mb[9] = adr; 3492 mcp->mb[10] = opt; 3493 mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 3494 mcp->in_mb = MBX_0; 3495 mcp->tov = MBX_TOV_SECONDS; 3496 mcp->flags = 0; 3497 rval = qla2x00_mailbox_command(vha, mcp); 3498 3499 if (rval != QLA_SUCCESS) { 3500 DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__, 3501 vha->host_no, rval, mcp->mb[0])); 3502 } else { 3503 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3504 } 3505 3506 return rval; 3507} 3508 3509int 3510qla2x00_get_xgmac_stats(scsi_qla_host_t *vha, dma_addr_t stats_dma, 3511 uint16_t size_in_bytes, uint16_t *actual_size) 3512{ 3513 int rval; 3514 mbx_cmd_t mc; 3515 mbx_cmd_t *mcp = &mc; 3516 3517 if (!IS_QLA81XX(vha->hw)) 3518 return QLA_FUNCTION_FAILED; 3519 3520 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3521 3522 mcp->mb[0] = MBC_GET_XGMAC_STATS; 3523 mcp->mb[2] = MSW(stats_dma); 3524 mcp->mb[3] = LSW(stats_dma); 3525 mcp->mb[6] = MSW(MSD(stats_dma)); 3526 mcp->mb[7] = LSW(MSD(stats_dma)); 3527 mcp->mb[8] = size_in_bytes >> 2; 3528 mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; 3529 mcp->in_mb = MBX_2|MBX_1|MBX_0; 3530 mcp->tov = MBX_TOV_SECONDS; 3531 mcp->flags = 0; 3532 rval = qla2x00_mailbox_command(vha, mcp); 3533 3534 if (rval != QLA_SUCCESS) { 3535 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=0x%x " 3536 "mb[1]=0x%x mb[2]=0x%x.\n", __func__, vha->host_no, rval, 3537 mcp->mb[0], mcp->mb[1], mcp->mb[2])); 3538 } else { 3539 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3540 3541 *actual_size = mcp->mb[2] << 2; 3542 } 3543 3544 return rval; 3545} 3546 3547int 3548qla2x00_get_dcbx_params(scsi_qla_host_t *vha, dma_addr_t tlv_dma, 3549 uint16_t size) 3550{ 3551 int rval; 3552 mbx_cmd_t mc; 3553 mbx_cmd_t *mcp = &mc; 3554 3555 if (!IS_QLA81XX(vha->hw)) 3556 return QLA_FUNCTION_FAILED; 3557 3558 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3559 3560 mcp->mb[0] = MBC_GET_DCBX_PARAMS; 3561 mcp->mb[1] = 0; 3562 mcp->mb[2] = MSW(tlv_dma); 3563 mcp->mb[3] = LSW(tlv_dma); 3564 mcp->mb[6] = MSW(MSD(tlv_dma)); 3565 mcp->mb[7] = LSW(MSD(tlv_dma)); 3566 mcp->mb[8] = size; 3567 mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 3568 mcp->in_mb = MBX_2|MBX_1|MBX_0; 3569 mcp->tov = MBX_TOV_SECONDS; 3570 mcp->flags = 0; 3571 rval = qla2x00_mailbox_command(vha, mcp); 3572 3573 if (rval != QLA_SUCCESS) { 3574 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=0x%x " 3575 "mb[1]=0x%x mb[2]=0x%x.\n", __func__, vha->host_no, rval, 3576 mcp->mb[0], mcp->mb[1], mcp->mb[2])); 3577 } else { 3578 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3579 } 3580 3581 return rval; 3582} 3583 3584int 3585qla2x00_read_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t *data) 3586{ 3587 int rval; 3588 mbx_cmd_t mc; 3589 mbx_cmd_t *mcp = &mc; 3590 3591 if (!IS_FWI2_CAPABLE(vha->hw)) 3592 return QLA_FUNCTION_FAILED; 3593 3594 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3595 3596 mcp->mb[0] = MBC_READ_RAM_EXTENDED; 3597 mcp->mb[1] = LSW(risc_addr); 3598 mcp->mb[8] = MSW(risc_addr); 3599 mcp->out_mb = MBX_8|MBX_1|MBX_0; 3600 mcp->in_mb = MBX_3|MBX_2|MBX_0; 3601 mcp->tov = 30; 3602 mcp->flags = 0; 3603 rval = qla2x00_mailbox_command(vha, mcp); 3604 if (rval != QLA_SUCCESS) { 3605 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__, 3606 vha->host_no, rval, mcp->mb[0])); 3607 } else { 3608 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3609 *data = mcp->mb[3] << 16 | mcp->mb[2]; 3610 } 3611 3612 return rval; 3613} 3614 3615int 3616qla2x00_write_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t data) 3617{ 3618 int rval; 3619 mbx_cmd_t mc; 3620 mbx_cmd_t *mcp = &mc; 3621 3622 if (!IS_FWI2_CAPABLE(vha->hw)) 3623 return QLA_FUNCTION_FAILED; 3624 3625 DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); 3626 3627 mcp->mb[0] = MBC_WRITE_RAM_WORD_EXTENDED; 3628 mcp->mb[1] = LSW(risc_addr); 3629 mcp->mb[2] = LSW(data); 3630 mcp->mb[3] = MSW(data); 3631 mcp->mb[8] = MSW(risc_addr); 3632 mcp->out_mb = MBX_8|MBX_3|MBX_2|MBX_1|MBX_0; 3633 mcp->in_mb = MBX_0; 3634 mcp->tov = 30; 3635 mcp->flags = 0; 3636 rval = qla2x00_mailbox_command(vha, mcp); 3637 if (rval != QLA_SUCCESS) { 3638 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__, 3639 vha->host_no, rval, mcp->mb[0])); 3640 } else { 3641 DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); 3642 } 3643 3644 return rval; 3645} 3646 3647int 3648qla2x00_get_data_rate(scsi_qla_host_t *vha) 3649{ 3650 int rval; 3651 mbx_cmd_t mc; 3652 mbx_cmd_t *mcp = &mc; 3653 struct qla_hw_data *ha = vha->hw; 3654 3655 if (!IS_FWI2_CAPABLE(ha)) 3656 return QLA_FUNCTION_FAILED; 3657 3658 DEBUG11(printk(KERN_INFO "%s(%ld): entered.\n", __func__, vha->host_no)); 3659 3660 mcp->mb[0] = MBC_DATA_RATE; 3661 mcp->mb[1] = 0; 3662 mcp->out_mb = MBX_1|MBX_0; 3663 mcp->in_mb = MBX_2|MBX_1|MBX_0; 3664 mcp->tov = MBX_TOV_SECONDS; 3665 mcp->flags = 0; 3666 rval = qla2x00_mailbox_command(vha, mcp); 3667 if (rval != QLA_SUCCESS) { 3668 DEBUG2_3_11(printk(KERN_INFO "%s(%ld): failed=%x mb[0]=%x.\n", 3669 __func__, vha->host_no, rval, mcp->mb[0])); 3670 } else { 3671 DEBUG11(printk(KERN_INFO 3672 "%s(%ld): done.\n", __func__, vha->host_no)); 3673 if (mcp->mb[1] != 0x7) 3674 ha->link_data_rate = mcp->mb[1]; 3675 } 3676 3677 return rval; 3678} 3679