qla_mbx.c revision 39a112403fd4c6cd2215b5a59ff079e42eb824a4
1/* 2 * QLogic Fibre Channel HBA Driver 3 * Copyright (c) 2003-2005 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 11static void 12qla2x00_mbx_sem_timeout(unsigned long data) 13{ 14 struct semaphore *sem_ptr = (struct semaphore *)data; 15 16 DEBUG11(printk("qla2x00_sem_timeout: entered.\n");) 17 18 if (sem_ptr != NULL) { 19 up(sem_ptr); 20 } 21 22 DEBUG11(printk("qla2x00_mbx_sem_timeout: exiting.\n");) 23} 24 25/* 26 * qla2x00_mailbox_command 27 * Issue mailbox command and waits for completion. 28 * 29 * Input: 30 * ha = adapter block pointer. 31 * mcp = driver internal mbx struct pointer. 32 * 33 * Output: 34 * mb[MAX_MAILBOX_REGISTER_COUNT] = returned mailbox data. 35 * 36 * Returns: 37 * 0 : QLA_SUCCESS = cmd performed success 38 * 1 : QLA_FUNCTION_FAILED (error encountered) 39 * 6 : QLA_FUNCTION_TIMEOUT (timeout condition encountered) 40 * 41 * Context: 42 * Kernel context. 43 */ 44static int 45qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) 46{ 47 int rval; 48 unsigned long flags = 0; 49 device_reg_t __iomem *reg = ha->iobase; 50 struct timer_list tmp_intr_timer; 51 uint8_t abort_active; 52 uint8_t io_lock_on = ha->flags.init_done; 53 uint16_t command; 54 uint16_t *iptr; 55 uint16_t __iomem *optr; 56 uint32_t cnt; 57 uint32_t mboxes; 58 unsigned long mbx_flags = 0; 59 unsigned long wait_time; 60 61 rval = QLA_SUCCESS; 62 abort_active = test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); 63 64 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) 65 66 /* 67 * Wait for active mailbox commands to finish by waiting at most tov 68 * seconds. This is to serialize actual issuing of mailbox cmds during 69 * non ISP abort time. 70 */ 71 if (!abort_active) { 72 if (qla2x00_down_timeout(&ha->mbx_cmd_sem, mcp->tov * HZ)) { 73 /* Timeout occurred. Return error. */ 74 DEBUG2_3_11(printk("%s(%ld): cmd access timeout. " 75 "Exiting.\n", __func__, ha->host_no);) 76 return QLA_FUNCTION_TIMEOUT; 77 } 78 } 79 80 ha->flags.mbox_busy = 1; 81 /* Save mailbox command for debug */ 82 ha->mcp = mcp; 83 84 /* Try to get mailbox register access */ 85 if (!abort_active) 86 spin_lock_irqsave(&ha->mbx_reg_lock, mbx_flags); 87 88 DEBUG11(printk("scsi(%ld): prepare to issue mbox cmd=0x%x.\n", 89 ha->host_no, mcp->mb[0]);) 90 91 spin_lock_irqsave(&ha->hardware_lock, flags); 92 93 /* Load mailbox registers. */ 94 if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) 95 optr = (uint16_t __iomem *)®->isp24.mailbox0; 96 else 97 optr = (uint16_t __iomem *)MAILBOX_REG(ha, ®->isp, 0); 98 99 iptr = mcp->mb; 100 command = mcp->mb[0]; 101 mboxes = mcp->out_mb; 102 103 for (cnt = 0; cnt < ha->mbx_count; cnt++) { 104 if (IS_QLA2200(ha) && cnt == 8) 105 optr = 106 (uint16_t __iomem *)MAILBOX_REG(ha, ®->isp, 8); 107 if (mboxes & BIT_0) 108 WRT_REG_WORD(optr, *iptr); 109 110 mboxes >>= 1; 111 optr++; 112 iptr++; 113 } 114 115#if defined(QL_DEBUG_LEVEL_1) 116 printk("%s(%ld): Loaded MBX registers (displayed in bytes) = \n", 117 __func__, ha->host_no); 118 qla2x00_dump_buffer((uint8_t *)mcp->mb, 16); 119 printk("\n"); 120 qla2x00_dump_buffer(((uint8_t *)mcp->mb + 0x10), 16); 121 printk("\n"); 122 qla2x00_dump_buffer(((uint8_t *)mcp->mb + 0x20), 8); 123 printk("\n"); 124 printk("%s(%ld): I/O address = %p.\n", __func__, ha->host_no, optr); 125 qla2x00_dump_regs(ha); 126#endif 127 128 /* Issue set host interrupt command to send cmd out. */ 129 ha->flags.mbox_int = 0; 130 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); 131 132 /* Unlock mbx registers and wait for interrupt */ 133 DEBUG11(printk("%s(%ld): going to unlock irq & waiting for interrupt. " 134 "jiffies=%lx.\n", __func__, ha->host_no, jiffies);) 135 136 /* Wait for mbx cmd completion until timeout */ 137 138 if (!abort_active && io_lock_on) { 139 /* sleep on completion semaphore */ 140 DEBUG11(printk("%s(%ld): INTERRUPT MODE. Initializing timer.\n", 141 __func__, ha->host_no);) 142 143 init_timer(&tmp_intr_timer); 144 tmp_intr_timer.data = (unsigned long)&ha->mbx_intr_sem; 145 tmp_intr_timer.expires = jiffies + mcp->tov * HZ; 146 tmp_intr_timer.function = 147 (void (*)(unsigned long))qla2x00_mbx_sem_timeout; 148 149 DEBUG11(printk("%s(%ld): Adding timer.\n", __func__, 150 ha->host_no);) 151 add_timer(&tmp_intr_timer); 152 153 DEBUG11(printk("%s(%ld): going to unlock & sleep. " 154 "time=0x%lx.\n", __func__, ha->host_no, jiffies);) 155 156 set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); 157 158 if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) 159 WRT_REG_DWORD(®->isp24.hccr, HCCRX_SET_HOST_INT); 160 else 161 WRT_REG_WORD(®->isp.hccr, HCCR_SET_HOST_INT); 162 spin_unlock_irqrestore(&ha->hardware_lock, flags); 163 164 if (!abort_active) 165 spin_unlock_irqrestore(&ha->mbx_reg_lock, mbx_flags); 166 167 /* Wait for either the timer to expire 168 * or the mbox completion interrupt 169 */ 170 down(&ha->mbx_intr_sem); 171 172 DEBUG11(printk("%s(%ld): waking up. time=0x%lx\n", __func__, 173 ha->host_no, jiffies);) 174 clear_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); 175 176 /* delete the timer */ 177 del_timer(&tmp_intr_timer); 178 } else { 179 DEBUG3_11(printk("%s(%ld): cmd=%x POLLING MODE.\n", __func__, 180 ha->host_no, command);) 181 182 if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) 183 WRT_REG_DWORD(®->isp24.hccr, HCCRX_SET_HOST_INT); 184 else 185 WRT_REG_WORD(®->isp.hccr, HCCR_SET_HOST_INT); 186 spin_unlock_irqrestore(&ha->hardware_lock, flags); 187 if (!abort_active) 188 spin_unlock_irqrestore(&ha->mbx_reg_lock, mbx_flags); 189 190 wait_time = jiffies + mcp->tov * HZ; /* wait at most tov secs */ 191 while (!ha->flags.mbox_int) { 192 if (time_after(jiffies, wait_time)) 193 break; 194 195 /* Check for pending interrupts. */ 196 qla2x00_poll(ha); 197 198 if (command != MBC_LOAD_RISC_RAM_EXTENDED && 199 !ha->flags.mbox_int) 200 msleep(10); 201 } /* while */ 202 } 203 204 if (!abort_active) 205 spin_lock_irqsave(&ha->mbx_reg_lock, mbx_flags); 206 207 /* Check whether we timed out */ 208 if (ha->flags.mbox_int) { 209 uint16_t *iptr2; 210 211 DEBUG3_11(printk("%s(%ld): cmd %x completed.\n", __func__, 212 ha->host_no, command);) 213 214 /* Got interrupt. Clear the flag. */ 215 ha->flags.mbox_int = 0; 216 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); 217 218 if (ha->mailbox_out[0] != MBS_COMMAND_COMPLETE) 219 rval = QLA_FUNCTION_FAILED; 220 221 /* Load return mailbox registers. */ 222 iptr2 = mcp->mb; 223 iptr = (uint16_t *)&ha->mailbox_out[0]; 224 mboxes = mcp->in_mb; 225 for (cnt = 0; cnt < ha->mbx_count; cnt++) { 226 if (mboxes & BIT_0) 227 *iptr2 = *iptr; 228 229 mboxes >>= 1; 230 iptr2++; 231 iptr++; 232 } 233 } else { 234 235#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) || \ 236 defined(QL_DEBUG_LEVEL_11) 237 uint16_t mb0; 238 uint32_t ictrl; 239 240 if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { 241 mb0 = RD_REG_WORD(®->isp24.mailbox0); 242 ictrl = RD_REG_DWORD(®->isp24.ictrl); 243 } else { 244 mb0 = RD_MAILBOX_REG(ha, ®->isp, 0); 245 ictrl = RD_REG_WORD(®->isp.ictrl); 246 } 247 printk("%s(%ld): **** MB Command Timeout for cmd %x ****\n", 248 __func__, ha->host_no, command); 249 printk("%s(%ld): icontrol=%x jiffies=%lx\n", __func__, 250 ha->host_no, ictrl, jiffies); 251 printk("%s(%ld): *** mailbox[0] = 0x%x ***\n", __func__, 252 ha->host_no, mb0); 253 qla2x00_dump_regs(ha); 254#endif 255 256 rval = QLA_FUNCTION_TIMEOUT; 257 } 258 259 if (!abort_active) 260 spin_unlock_irqrestore(&ha->mbx_reg_lock, mbx_flags); 261 262 ha->flags.mbox_busy = 0; 263 264 /* Clean up */ 265 ha->mcp = NULL; 266 267 if (!abort_active) { 268 DEBUG11(printk("%s(%ld): checking for additional resp " 269 "interrupt.\n", __func__, ha->host_no);) 270 271 /* polling mode for non isp_abort commands. */ 272 qla2x00_poll(ha); 273 } 274 275 if (rval == QLA_FUNCTION_TIMEOUT && 276 mcp->mb[0] != MBC_GEN_SYSTEM_ERROR) { 277 if (!io_lock_on || (mcp->flags & IOCTL_CMD)) { 278 /* not in dpc. schedule it for dpc to take over. */ 279 DEBUG(printk("%s(%ld): timeout schedule " 280 "isp_abort_needed.\n", __func__, ha->host_no);) 281 DEBUG2_3_11(printk("%s(%ld): timeout schedule " 282 "isp_abort_needed.\n", __func__, ha->host_no);) 283 qla_printk(KERN_WARNING, ha, 284 "Mailbox command timeout occured. Scheduling ISP " 285 "abort.\n"); 286 set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); 287 qla2xxx_wake_dpc(ha); 288 } else if (!abort_active) { 289 /* call abort directly since we are in the DPC thread */ 290 DEBUG(printk("%s(%ld): timeout calling abort_isp\n", 291 __func__, ha->host_no);) 292 DEBUG2_3_11(printk("%s(%ld): timeout calling " 293 "abort_isp\n", __func__, ha->host_no);) 294 qla_printk(KERN_WARNING, ha, 295 "Mailbox command timeout occured. Issuing ISP " 296 "abort.\n"); 297 298 set_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); 299 clear_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); 300 if (qla2x00_abort_isp(ha)) { 301 /* Failed. retry later. */ 302 set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); 303 } 304 clear_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); 305 DEBUG(printk("%s(%ld): finished abort_isp\n", __func__, 306 ha->host_no);) 307 DEBUG2_3_11(printk("%s(%ld): finished abort_isp\n", 308 __func__, ha->host_no);) 309 } 310 } 311 312 /* Allow next mbx cmd to come in. */ 313 if (!abort_active) 314 up(&ha->mbx_cmd_sem); 315 316 if (rval) { 317 DEBUG2_3_11(printk("%s(%ld): **** FAILED. mbx0=%x, mbx1=%x, " 318 "mbx2=%x, cmd=%x ****\n", __func__, ha->host_no, 319 mcp->mb[0], mcp->mb[1], mcp->mb[2], command);) 320 } else { 321 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no);) 322 } 323 324 return rval; 325} 326 327int 328qla2x00_load_ram(scsi_qla_host_t *ha, dma_addr_t req_dma, uint32_t risc_addr, 329 uint32_t risc_code_size) 330{ 331 int rval; 332 mbx_cmd_t mc; 333 mbx_cmd_t *mcp = &mc; 334 335 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); 336 337 if (MSW(risc_addr) || IS_QLA24XX(ha) || IS_QLA25XX(ha)) { 338 mcp->mb[0] = MBC_LOAD_RISC_RAM_EXTENDED; 339 mcp->mb[8] = MSW(risc_addr); 340 mcp->out_mb = MBX_8|MBX_0; 341 } else { 342 mcp->mb[0] = MBC_LOAD_RISC_RAM; 343 mcp->out_mb = MBX_0; 344 } 345 mcp->mb[1] = LSW(risc_addr); 346 mcp->mb[2] = MSW(req_dma); 347 mcp->mb[3] = LSW(req_dma); 348 mcp->mb[6] = MSW(MSD(req_dma)); 349 mcp->mb[7] = LSW(MSD(req_dma)); 350 mcp->out_mb |= MBX_7|MBX_6|MBX_3|MBX_2|MBX_1; 351 if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { 352 mcp->mb[4] = MSW(risc_code_size); 353 mcp->mb[5] = LSW(risc_code_size); 354 mcp->out_mb |= MBX_5|MBX_4; 355 } else { 356 mcp->mb[4] = LSW(risc_code_size); 357 mcp->out_mb |= MBX_4; 358 } 359 360 mcp->in_mb = MBX_0; 361 mcp->tov = 30; 362 mcp->flags = 0; 363 rval = qla2x00_mailbox_command(ha, mcp); 364 365 if (rval != QLA_SUCCESS) { 366 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__, 367 ha->host_no, rval, mcp->mb[0])); 368 } else { 369 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); 370 } 371 372 return rval; 373} 374 375/* 376 * qla2x00_execute_fw 377 * Start adapter firmware. 378 * 379 * Input: 380 * ha = adapter block pointer. 381 * TARGET_QUEUE_LOCK must be released. 382 * ADAPTER_STATE_LOCK must be released. 383 * 384 * Returns: 385 * qla2x00 local function return status code. 386 * 387 * Context: 388 * Kernel context. 389 */ 390int 391qla2x00_execute_fw(scsi_qla_host_t *ha, uint32_t risc_addr) 392{ 393 int rval; 394 mbx_cmd_t mc; 395 mbx_cmd_t *mcp = &mc; 396 397 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) 398 399 mcp->mb[0] = MBC_EXECUTE_FIRMWARE; 400 mcp->out_mb = MBX_0; 401 mcp->in_mb = MBX_0; 402 if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { 403 mcp->mb[1] = MSW(risc_addr); 404 mcp->mb[2] = LSW(risc_addr); 405 mcp->mb[3] = 0; 406 mcp->out_mb |= MBX_3|MBX_2|MBX_1; 407 mcp->in_mb |= MBX_1; 408 } else { 409 mcp->mb[1] = LSW(risc_addr); 410 mcp->out_mb |= MBX_1; 411 if (IS_QLA2322(ha) || IS_QLA6322(ha)) { 412 mcp->mb[2] = 0; 413 mcp->out_mb |= MBX_2; 414 } 415 } 416 417 mcp->tov = 30; 418 mcp->flags = 0; 419 rval = qla2x00_mailbox_command(ha, mcp); 420 421 if (rval != QLA_SUCCESS) { 422 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__, 423 ha->host_no, rval, mcp->mb[0])); 424 } else { 425 if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { 426 DEBUG11(printk("%s(%ld): done exchanges=%x.\n", 427 __func__, ha->host_no, mcp->mb[1]);) 428 } else { 429 DEBUG11(printk("%s(%ld): done.\n", __func__, 430 ha->host_no);) 431 } 432 } 433 434 return rval; 435} 436 437/* 438 * qla2x00_get_fw_version 439 * Get firmware version. 440 * 441 * Input: 442 * ha: adapter state pointer. 443 * major: pointer for major number. 444 * minor: pointer for minor number. 445 * subminor: pointer for subminor number. 446 * 447 * Returns: 448 * qla2x00 local function return status code. 449 * 450 * Context: 451 * Kernel context. 452 */ 453void 454qla2x00_get_fw_version(scsi_qla_host_t *ha, uint16_t *major, uint16_t *minor, 455 uint16_t *subminor, uint16_t *attributes, uint32_t *memory) 456{ 457 int rval; 458 mbx_cmd_t mc; 459 mbx_cmd_t *mcp = &mc; 460 461 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); 462 463 mcp->mb[0] = MBC_GET_FIRMWARE_VERSION; 464 mcp->out_mb = MBX_0; 465 mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 466 mcp->flags = 0; 467 mcp->tov = 30; 468 rval = qla2x00_mailbox_command(ha, mcp); 469 470 /* Return mailbox data. */ 471 *major = mcp->mb[1]; 472 *minor = mcp->mb[2]; 473 *subminor = mcp->mb[3]; 474 *attributes = mcp->mb[6]; 475 if (IS_QLA2100(ha) || IS_QLA2200(ha)) 476 *memory = 0x1FFFF; /* Defaults to 128KB. */ 477 else 478 *memory = (mcp->mb[5] << 16) | mcp->mb[4]; 479 480 if (rval != QLA_SUCCESS) { 481 /*EMPTY*/ 482 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 483 ha->host_no, rval)); 484 } else { 485 /*EMPTY*/ 486 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); 487 } 488} 489 490/* 491 * qla2x00_get_fw_options 492 * Set firmware options. 493 * 494 * Input: 495 * ha = adapter block pointer. 496 * fwopt = pointer for firmware options. 497 * 498 * Returns: 499 * qla2x00 local function return status code. 500 * 501 * Context: 502 * Kernel context. 503 */ 504int 505qla2x00_get_fw_options(scsi_qla_host_t *ha, uint16_t *fwopts) 506{ 507 int rval; 508 mbx_cmd_t mc; 509 mbx_cmd_t *mcp = &mc; 510 511 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); 512 513 mcp->mb[0] = MBC_GET_FIRMWARE_OPTION; 514 mcp->out_mb = MBX_0; 515 mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0; 516 mcp->tov = 30; 517 mcp->flags = 0; 518 rval = qla2x00_mailbox_command(ha, mcp); 519 520 if (rval != QLA_SUCCESS) { 521 /*EMPTY*/ 522 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 523 ha->host_no, rval)); 524 } else { 525 fwopts[0] = mcp->mb[0]; 526 fwopts[1] = mcp->mb[1]; 527 fwopts[2] = mcp->mb[2]; 528 fwopts[3] = mcp->mb[3]; 529 530 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); 531 } 532 533 return rval; 534} 535 536 537/* 538 * qla2x00_set_fw_options 539 * Set firmware options. 540 * 541 * Input: 542 * ha = adapter block pointer. 543 * fwopt = pointer for firmware options. 544 * 545 * Returns: 546 * qla2x00 local function return status code. 547 * 548 * Context: 549 * Kernel context. 550 */ 551int 552qla2x00_set_fw_options(scsi_qla_host_t *ha, uint16_t *fwopts) 553{ 554 int rval; 555 mbx_cmd_t mc; 556 mbx_cmd_t *mcp = &mc; 557 558 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); 559 560 mcp->mb[0] = MBC_SET_FIRMWARE_OPTION; 561 mcp->mb[1] = fwopts[1]; 562 mcp->mb[2] = fwopts[2]; 563 mcp->mb[3] = fwopts[3]; 564 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; 565 mcp->in_mb = MBX_0; 566 if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { 567 mcp->in_mb |= MBX_1; 568 } else { 569 mcp->mb[10] = fwopts[10]; 570 mcp->mb[11] = fwopts[11]; 571 mcp->mb[12] = 0; /* Undocumented, but used */ 572 mcp->out_mb |= MBX_12|MBX_11|MBX_10; 573 } 574 mcp->tov = 30; 575 mcp->flags = 0; 576 rval = qla2x00_mailbox_command(ha, mcp); 577 578 fwopts[0] = mcp->mb[0]; 579 580 if (rval != QLA_SUCCESS) { 581 /*EMPTY*/ 582 DEBUG2_3_11(printk("%s(%ld): failed=%x (%x/%x).\n", __func__, 583 ha->host_no, rval, mcp->mb[0], mcp->mb[1])); 584 } else { 585 /*EMPTY*/ 586 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); 587 } 588 589 return rval; 590} 591 592/* 593 * qla2x00_mbx_reg_test 594 * Mailbox register wrap test. 595 * 596 * Input: 597 * ha = adapter block pointer. 598 * TARGET_QUEUE_LOCK must be released. 599 * ADAPTER_STATE_LOCK must be released. 600 * 601 * Returns: 602 * qla2x00 local function return status code. 603 * 604 * Context: 605 * Kernel context. 606 */ 607int 608qla2x00_mbx_reg_test(scsi_qla_host_t *ha) 609{ 610 int rval; 611 mbx_cmd_t mc; 612 mbx_cmd_t *mcp = &mc; 613 614 DEBUG11(printk("qla2x00_mbx_reg_test(%ld): entered.\n", ha->host_no);) 615 616 mcp->mb[0] = MBC_MAILBOX_REGISTER_TEST; 617 mcp->mb[1] = 0xAAAA; 618 mcp->mb[2] = 0x5555; 619 mcp->mb[3] = 0xAA55; 620 mcp->mb[4] = 0x55AA; 621 mcp->mb[5] = 0xA5A5; 622 mcp->mb[6] = 0x5A5A; 623 mcp->mb[7] = 0x2525; 624 mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 625 mcp->in_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 626 mcp->tov = 30; 627 mcp->flags = 0; 628 rval = qla2x00_mailbox_command(ha, mcp); 629 630 if (rval == QLA_SUCCESS) { 631 if (mcp->mb[1] != 0xAAAA || mcp->mb[2] != 0x5555 || 632 mcp->mb[3] != 0xAA55 || mcp->mb[4] != 0x55AA) 633 rval = QLA_FUNCTION_FAILED; 634 if (mcp->mb[5] != 0xA5A5 || mcp->mb[6] != 0x5A5A || 635 mcp->mb[7] != 0x2525) 636 rval = QLA_FUNCTION_FAILED; 637 } 638 639 if (rval != QLA_SUCCESS) { 640 /*EMPTY*/ 641 DEBUG2_3_11(printk("qla2x00_mbx_reg_test(%ld): failed=%x.\n", 642 ha->host_no, rval);) 643 } else { 644 /*EMPTY*/ 645 DEBUG11(printk("qla2x00_mbx_reg_test(%ld): done.\n", 646 ha->host_no);) 647 } 648 649 return rval; 650} 651 652/* 653 * qla2x00_verify_checksum 654 * Verify firmware checksum. 655 * 656 * Input: 657 * ha = adapter block pointer. 658 * TARGET_QUEUE_LOCK must be released. 659 * ADAPTER_STATE_LOCK must be released. 660 * 661 * Returns: 662 * qla2x00 local function return status code. 663 * 664 * Context: 665 * Kernel context. 666 */ 667int 668qla2x00_verify_checksum(scsi_qla_host_t *ha, uint32_t risc_addr) 669{ 670 int rval; 671 mbx_cmd_t mc; 672 mbx_cmd_t *mcp = &mc; 673 674 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) 675 676 mcp->mb[0] = MBC_VERIFY_CHECKSUM; 677 mcp->out_mb = MBX_0; 678 mcp->in_mb = MBX_0; 679 if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { 680 mcp->mb[1] = MSW(risc_addr); 681 mcp->mb[2] = LSW(risc_addr); 682 mcp->out_mb |= MBX_2|MBX_1; 683 mcp->in_mb |= MBX_2|MBX_1; 684 } else { 685 mcp->mb[1] = LSW(risc_addr); 686 mcp->out_mb |= MBX_1; 687 mcp->in_mb |= MBX_1; 688 } 689 690 mcp->tov = 30; 691 mcp->flags = 0; 692 rval = qla2x00_mailbox_command(ha, mcp); 693 694 if (rval != QLA_SUCCESS) { 695 DEBUG2_3_11(printk("%s(%ld): failed=%x chk sum=%x.\n", __func__, 696 ha->host_no, rval, (IS_QLA24XX(ha) || IS_QLA25XX(ha) ? 697 (mcp->mb[2] << 16) | mcp->mb[1]: mcp->mb[1]));) 698 } else { 699 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no);) 700 } 701 702 return rval; 703} 704 705/* 706 * qla2x00_issue_iocb 707 * Issue IOCB using mailbox command 708 * 709 * Input: 710 * ha = adapter state pointer. 711 * buffer = buffer pointer. 712 * phys_addr = physical address of buffer. 713 * size = size of buffer. 714 * TARGET_QUEUE_LOCK must be released. 715 * ADAPTER_STATE_LOCK must be released. 716 * 717 * Returns: 718 * qla2x00 local function return status code. 719 * 720 * Context: 721 * Kernel context. 722 */ 723int 724qla2x00_issue_iocb(scsi_qla_host_t *ha, void* buffer, dma_addr_t phys_addr, 725 size_t size) 726{ 727 int rval; 728 mbx_cmd_t mc; 729 mbx_cmd_t *mcp = &mc; 730 731 mcp->mb[0] = MBC_IOCB_COMMAND_A64; 732 mcp->mb[1] = 0; 733 mcp->mb[2] = MSW(phys_addr); 734 mcp->mb[3] = LSW(phys_addr); 735 mcp->mb[6] = MSW(MSD(phys_addr)); 736 mcp->mb[7] = LSW(MSD(phys_addr)); 737 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 738 mcp->in_mb = MBX_2|MBX_0; 739 mcp->tov = 30; 740 mcp->flags = 0; 741 rval = qla2x00_mailbox_command(ha, mcp); 742 743 if (rval != QLA_SUCCESS) { 744 /*EMPTY*/ 745 DEBUG(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x\n", 746 ha->host_no, rval);) 747 DEBUG2(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x\n", 748 ha->host_no, rval);) 749 } else { 750 sts_entry_t *sts_entry = (sts_entry_t *) buffer; 751 752 /* Mask reserved bits. */ 753 sts_entry->entry_status &= 754 IS_QLA24XX(ha) || IS_QLA25XX(ha) ? RF_MASK_24XX :RF_MASK; 755 } 756 757 return rval; 758} 759 760/* 761 * qla2x00_abort_command 762 * Abort command aborts a specified IOCB. 763 * 764 * Input: 765 * ha = adapter block pointer. 766 * sp = SB structure pointer. 767 * 768 * Returns: 769 * qla2x00 local function return status code. 770 * 771 * Context: 772 * Kernel context. 773 */ 774int 775qla2x00_abort_command(scsi_qla_host_t *ha, srb_t *sp) 776{ 777 unsigned long flags = 0; 778 fc_port_t *fcport; 779 int rval; 780 uint32_t handle; 781 mbx_cmd_t mc; 782 mbx_cmd_t *mcp = &mc; 783 784 DEBUG11(printk("qla2x00_abort_command(%ld): entered.\n", ha->host_no);) 785 786 fcport = sp->fcport; 787 788 spin_lock_irqsave(&ha->hardware_lock, flags); 789 for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) { 790 if (ha->outstanding_cmds[handle] == sp) 791 break; 792 } 793 spin_unlock_irqrestore(&ha->hardware_lock, flags); 794 795 if (handle == MAX_OUTSTANDING_COMMANDS) { 796 /* command not found */ 797 return QLA_FUNCTION_FAILED; 798 } 799 800 mcp->mb[0] = MBC_ABORT_COMMAND; 801 if (HAS_EXTENDED_IDS(ha)) 802 mcp->mb[1] = fcport->loop_id; 803 else 804 mcp->mb[1] = fcport->loop_id << 8; 805 mcp->mb[2] = (uint16_t)handle; 806 mcp->mb[3] = (uint16_t)(handle >> 16); 807 mcp->mb[6] = (uint16_t)sp->cmd->device->lun; 808 mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 809 mcp->in_mb = MBX_0; 810 mcp->tov = 30; 811 mcp->flags = 0; 812 rval = qla2x00_mailbox_command(ha, mcp); 813 814 if (rval != QLA_SUCCESS) { 815 DEBUG2_3_11(printk("qla2x00_abort_command(%ld): failed=%x.\n", 816 ha->host_no, rval);) 817 } else { 818 sp->flags |= SRB_ABORT_PENDING; 819 DEBUG11(printk("qla2x00_abort_command(%ld): done.\n", 820 ha->host_no);) 821 } 822 823 return rval; 824} 825 826#if USE_ABORT_TGT 827/* 828 * qla2x00_abort_target 829 * Issue abort target mailbox command. 830 * 831 * Input: 832 * ha = adapter block pointer. 833 * 834 * Returns: 835 * qla2x00 local function return status code. 836 * 837 * Context: 838 * Kernel context. 839 */ 840int 841qla2x00_abort_target(fc_port_t *fcport) 842{ 843 int rval; 844 mbx_cmd_t mc; 845 mbx_cmd_t *mcp = &mc; 846 scsi_qla_host_t *ha; 847 848 if (fcport == NULL) 849 return 0; 850 851 DEBUG11(printk("%s(%ld): entered.\n", __func__, fcport->ha->host_no);) 852 853 ha = fcport->ha; 854 mcp->mb[0] = MBC_ABORT_TARGET; 855 mcp->out_mb = MBX_2|MBX_1|MBX_0; 856 if (HAS_EXTENDED_IDS(ha)) { 857 mcp->mb[1] = fcport->loop_id; 858 mcp->mb[10] = 0; 859 mcp->out_mb |= MBX_10; 860 } else { 861 mcp->mb[1] = fcport->loop_id << 8; 862 } 863 mcp->mb[2] = ha->loop_reset_delay; 864 865 mcp->in_mb = MBX_0; 866 mcp->tov = 30; 867 mcp->flags = 0; 868 rval = qla2x00_mailbox_command(ha, mcp); 869 870 /* Issue marker command. */ 871 ha->marker_needed = 1; 872 873 if (rval != QLA_SUCCESS) { 874 DEBUG2_3_11(printk("qla2x00_abort_target(%ld): failed=%x.\n", 875 ha->host_no, rval);) 876 } else { 877 /*EMPTY*/ 878 DEBUG11(printk("qla2x00_abort_target(%ld): done.\n", 879 ha->host_no);) 880 } 881 882 return rval; 883} 884#endif 885 886/* 887 * qla2x00_get_adapter_id 888 * Get adapter ID and topology. 889 * 890 * Input: 891 * ha = adapter block pointer. 892 * id = pointer for loop ID. 893 * al_pa = pointer for AL_PA. 894 * area = pointer for area. 895 * domain = pointer for domain. 896 * top = pointer for topology. 897 * TARGET_QUEUE_LOCK must be released. 898 * ADAPTER_STATE_LOCK must be released. 899 * 900 * Returns: 901 * qla2x00 local function return status code. 902 * 903 * Context: 904 * Kernel context. 905 */ 906int 907qla2x00_get_adapter_id(scsi_qla_host_t *ha, uint16_t *id, uint8_t *al_pa, 908 uint8_t *area, uint8_t *domain, uint16_t *top) 909{ 910 int rval; 911 mbx_cmd_t mc; 912 mbx_cmd_t *mcp = &mc; 913 914 DEBUG11(printk("qla2x00_get_adapter_id(%ld): entered.\n", 915 ha->host_no);) 916 917 mcp->mb[0] = MBC_GET_ADAPTER_LOOP_ID; 918 mcp->out_mb = MBX_0; 919 mcp->in_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 920 mcp->tov = 30; 921 mcp->flags = 0; 922 rval = qla2x00_mailbox_command(ha, mcp); 923 if (mcp->mb[0] == MBS_COMMAND_ERROR) 924 rval = QLA_COMMAND_ERROR; 925 926 /* Return data. */ 927 *id = mcp->mb[1]; 928 *al_pa = LSB(mcp->mb[2]); 929 *area = MSB(mcp->mb[2]); 930 *domain = LSB(mcp->mb[3]); 931 *top = mcp->mb[6]; 932 933 if (rval != QLA_SUCCESS) { 934 /*EMPTY*/ 935 DEBUG2_3_11(printk("qla2x00_get_adapter_id(%ld): failed=%x.\n", 936 ha->host_no, rval);) 937 } else { 938 /*EMPTY*/ 939 DEBUG11(printk("qla2x00_get_adapter_id(%ld): done.\n", 940 ha->host_no);) 941 } 942 943 return rval; 944} 945 946/* 947 * qla2x00_get_retry_cnt 948 * Get current firmware login retry count and delay. 949 * 950 * Input: 951 * ha = adapter block pointer. 952 * retry_cnt = pointer to login retry count. 953 * tov = pointer to login timeout value. 954 * 955 * Returns: 956 * qla2x00 local function return status code. 957 * 958 * Context: 959 * Kernel context. 960 */ 961int 962qla2x00_get_retry_cnt(scsi_qla_host_t *ha, uint8_t *retry_cnt, uint8_t *tov, 963 uint16_t *r_a_tov) 964{ 965 int rval; 966 uint16_t ratov; 967 mbx_cmd_t mc; 968 mbx_cmd_t *mcp = &mc; 969 970 DEBUG11(printk("qla2x00_get_retry_cnt(%ld): entered.\n", 971 ha->host_no);) 972 973 mcp->mb[0] = MBC_GET_RETRY_COUNT; 974 mcp->out_mb = MBX_0; 975 mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0; 976 mcp->tov = 30; 977 mcp->flags = 0; 978 rval = qla2x00_mailbox_command(ha, mcp); 979 980 if (rval != QLA_SUCCESS) { 981 /*EMPTY*/ 982 DEBUG2_3_11(printk("qla2x00_get_retry_cnt(%ld): failed = %x.\n", 983 ha->host_no, mcp->mb[0]);) 984 } else { 985 /* Convert returned data and check our values. */ 986 *r_a_tov = mcp->mb[3] / 2; 987 ratov = (mcp->mb[3]/2) / 10; /* mb[3] value is in 100ms */ 988 if (mcp->mb[1] * ratov > (*retry_cnt) * (*tov)) { 989 /* Update to the larger values */ 990 *retry_cnt = (uint8_t)mcp->mb[1]; 991 *tov = ratov; 992 } 993 994 DEBUG11(printk("qla2x00_get_retry_cnt(%ld): done. mb3=%d " 995 "ratov=%d.\n", ha->host_no, mcp->mb[3], ratov);) 996 } 997 998 return rval; 999} 1000 1001/* 1002 * qla2x00_init_firmware 1003 * Initialize adapter firmware. 1004 * 1005 * Input: 1006 * ha = adapter block pointer. 1007 * dptr = Initialization control block pointer. 1008 * size = size of initialization control block. 1009 * TARGET_QUEUE_LOCK must be released. 1010 * ADAPTER_STATE_LOCK must be released. 1011 * 1012 * Returns: 1013 * qla2x00 local function return status code. 1014 * 1015 * Context: 1016 * Kernel context. 1017 */ 1018int 1019qla2x00_init_firmware(scsi_qla_host_t *ha, uint16_t size) 1020{ 1021 int rval; 1022 mbx_cmd_t mc; 1023 mbx_cmd_t *mcp = &mc; 1024 1025 DEBUG11(printk("qla2x00_init_firmware(%ld): entered.\n", 1026 ha->host_no);) 1027 1028 mcp->mb[0] = MBC_INITIALIZE_FIRMWARE; 1029 mcp->mb[2] = MSW(ha->init_cb_dma); 1030 mcp->mb[3] = LSW(ha->init_cb_dma); 1031 mcp->mb[4] = 0; 1032 mcp->mb[5] = 0; 1033 mcp->mb[6] = MSW(MSD(ha->init_cb_dma)); 1034 mcp->mb[7] = LSW(MSD(ha->init_cb_dma)); 1035 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; 1036 mcp->in_mb = MBX_5|MBX_4|MBX_0; 1037 mcp->buf_size = size; 1038 mcp->flags = MBX_DMA_OUT; 1039 mcp->tov = 30; 1040 rval = qla2x00_mailbox_command(ha, mcp); 1041 1042 if (rval != QLA_SUCCESS) { 1043 /*EMPTY*/ 1044 DEBUG2_3_11(printk("qla2x00_init_firmware(%ld): failed=%x " 1045 "mb0=%x.\n", 1046 ha->host_no, rval, mcp->mb[0]);) 1047 } else { 1048 /*EMPTY*/ 1049 DEBUG11(printk("qla2x00_init_firmware(%ld): done.\n", 1050 ha->host_no);) 1051 } 1052 1053 return rval; 1054} 1055 1056/* 1057 * qla2x00_get_port_database 1058 * Issue normal/enhanced get port database mailbox command 1059 * and copy device name as necessary. 1060 * 1061 * Input: 1062 * ha = adapter state pointer. 1063 * dev = structure pointer. 1064 * opt = enhanced cmd option byte. 1065 * 1066 * Returns: 1067 * qla2x00 local function return status code. 1068 * 1069 * Context: 1070 * Kernel context. 1071 */ 1072int 1073qla2x00_get_port_database(scsi_qla_host_t *ha, fc_port_t *fcport, uint8_t opt) 1074{ 1075 int rval; 1076 mbx_cmd_t mc; 1077 mbx_cmd_t *mcp = &mc; 1078 port_database_t *pd; 1079 struct port_database_24xx *pd24; 1080 dma_addr_t pd_dma; 1081 1082 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) 1083 1084 pd24 = NULL; 1085 pd = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &pd_dma); 1086 if (pd == NULL) { 1087 DEBUG2_3(printk("%s(%ld): failed to allocate Port Database " 1088 "structure.\n", __func__, ha->host_no)); 1089 return QLA_MEMORY_ALLOC_FAILED; 1090 } 1091 memset(pd, 0, max(PORT_DATABASE_SIZE, PORT_DATABASE_24XX_SIZE)); 1092 1093 mcp->mb[0] = MBC_GET_PORT_DATABASE; 1094 if (opt != 0 && !IS_QLA24XX(ha) && !IS_QLA25XX(ha)) 1095 mcp->mb[0] = MBC_ENHANCED_GET_PORT_DATABASE; 1096 mcp->mb[2] = MSW(pd_dma); 1097 mcp->mb[3] = LSW(pd_dma); 1098 mcp->mb[6] = MSW(MSD(pd_dma)); 1099 mcp->mb[7] = LSW(MSD(pd_dma)); 1100 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; 1101 mcp->in_mb = MBX_0; 1102 if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { 1103 mcp->mb[1] = fcport->loop_id; 1104 mcp->mb[10] = opt; 1105 mcp->out_mb |= MBX_10|MBX_1; 1106 mcp->in_mb |= MBX_1; 1107 } else if (HAS_EXTENDED_IDS(ha)) { 1108 mcp->mb[1] = fcport->loop_id; 1109 mcp->mb[10] = opt; 1110 mcp->out_mb |= MBX_10|MBX_1; 1111 } else { 1112 mcp->mb[1] = fcport->loop_id << 8 | opt; 1113 mcp->out_mb |= MBX_1; 1114 } 1115 mcp->buf_size = (IS_QLA24XX(ha) || IS_QLA25XX(ha) ? 1116 PORT_DATABASE_24XX_SIZE : PORT_DATABASE_SIZE); 1117 mcp->flags = MBX_DMA_IN; 1118 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2); 1119 rval = qla2x00_mailbox_command(ha, mcp); 1120 if (rval != QLA_SUCCESS) 1121 goto gpd_error_out; 1122 1123 if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { 1124 pd24 = (struct port_database_24xx *) pd; 1125 1126 /* Check for logged in state. */ 1127 if (pd24->current_login_state != PDS_PRLI_COMPLETE && 1128 pd24->last_login_state != PDS_PRLI_COMPLETE) { 1129 DEBUG2(printk("%s(%ld): Unable to verify " 1130 "login-state (%x/%x) for loop_id %x\n", 1131 __func__, ha->host_no, 1132 pd24->current_login_state, 1133 pd24->last_login_state, fcport->loop_id)); 1134 rval = QLA_FUNCTION_FAILED; 1135 goto gpd_error_out; 1136 } 1137 1138 /* Names are little-endian. */ 1139 memcpy(fcport->node_name, pd24->node_name, WWN_SIZE); 1140 memcpy(fcport->port_name, pd24->port_name, WWN_SIZE); 1141 1142 /* Get port_id of device. */ 1143 fcport->d_id.b.domain = pd24->port_id[0]; 1144 fcport->d_id.b.area = pd24->port_id[1]; 1145 fcport->d_id.b.al_pa = pd24->port_id[2]; 1146 fcport->d_id.b.rsvd_1 = 0; 1147 1148 /* If not target must be initiator or unknown type. */ 1149 if ((pd24->prli_svc_param_word_3[0] & BIT_4) == 0) 1150 fcport->port_type = FCT_INITIATOR; 1151 else 1152 fcport->port_type = FCT_TARGET; 1153 } else { 1154 /* Check for logged in state. */ 1155 if (pd->master_state != PD_STATE_PORT_LOGGED_IN && 1156 pd->slave_state != PD_STATE_PORT_LOGGED_IN) { 1157 rval = QLA_FUNCTION_FAILED; 1158 goto gpd_error_out; 1159 } 1160 1161 /* Names are little-endian. */ 1162 memcpy(fcport->node_name, pd->node_name, WWN_SIZE); 1163 memcpy(fcport->port_name, pd->port_name, WWN_SIZE); 1164 1165 /* Get port_id of device. */ 1166 fcport->d_id.b.domain = pd->port_id[0]; 1167 fcport->d_id.b.area = pd->port_id[3]; 1168 fcport->d_id.b.al_pa = pd->port_id[2]; 1169 fcport->d_id.b.rsvd_1 = 0; 1170 1171 /* Check for device require authentication. */ 1172 pd->common_features & BIT_5 ? (fcport->flags |= FCF_AUTH_REQ) : 1173 (fcport->flags &= ~FCF_AUTH_REQ); 1174 1175 /* If not target must be initiator or unknown type. */ 1176 if ((pd->prli_svc_param_word_3[0] & BIT_4) == 0) 1177 fcport->port_type = FCT_INITIATOR; 1178 else 1179 fcport->port_type = FCT_TARGET; 1180 1181 /* Passback COS information. */ 1182 fcport->supported_classes = (pd->options & BIT_4) ? 1183 FC_COS_CLASS2: FC_COS_CLASS3; 1184 } 1185 1186gpd_error_out: 1187 dma_pool_free(ha->s_dma_pool, pd, pd_dma); 1188 1189 if (rval != QLA_SUCCESS) { 1190 DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n", 1191 __func__, ha->host_no, rval, mcp->mb[0], mcp->mb[1])); 1192 } else { 1193 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); 1194 } 1195 1196 return rval; 1197} 1198 1199/* 1200 * qla2x00_get_firmware_state 1201 * Get adapter firmware state. 1202 * 1203 * Input: 1204 * ha = adapter block pointer. 1205 * dptr = pointer for firmware state. 1206 * TARGET_QUEUE_LOCK must be released. 1207 * ADAPTER_STATE_LOCK must be released. 1208 * 1209 * Returns: 1210 * qla2x00 local function return status code. 1211 * 1212 * Context: 1213 * Kernel context. 1214 */ 1215int 1216qla2x00_get_firmware_state(scsi_qla_host_t *ha, uint16_t *dptr) 1217{ 1218 int rval; 1219 mbx_cmd_t mc; 1220 mbx_cmd_t *mcp = &mc; 1221 1222 DEBUG11(printk("qla2x00_get_firmware_state(%ld): entered.\n", 1223 ha->host_no);) 1224 1225 mcp->mb[0] = MBC_GET_FIRMWARE_STATE; 1226 mcp->out_mb = MBX_0; 1227 mcp->in_mb = MBX_2|MBX_1|MBX_0; 1228 mcp->tov = 30; 1229 mcp->flags = 0; 1230 rval = qla2x00_mailbox_command(ha, mcp); 1231 1232 /* Return firmware state. */ 1233 *dptr = mcp->mb[1]; 1234 1235 if (rval != QLA_SUCCESS) { 1236 /*EMPTY*/ 1237 DEBUG2_3_11(printk("qla2x00_get_firmware_state(%ld): " 1238 "failed=%x.\n", ha->host_no, rval);) 1239 } else { 1240 /*EMPTY*/ 1241 DEBUG11(printk("qla2x00_get_firmware_state(%ld): done.\n", 1242 ha->host_no);) 1243 } 1244 1245 return rval; 1246} 1247 1248/* 1249 * qla2x00_get_port_name 1250 * Issue get port name mailbox command. 1251 * Returned name is in big endian format. 1252 * 1253 * Input: 1254 * ha = adapter block pointer. 1255 * loop_id = loop ID of device. 1256 * name = pointer for name. 1257 * TARGET_QUEUE_LOCK must be released. 1258 * ADAPTER_STATE_LOCK must be released. 1259 * 1260 * Returns: 1261 * qla2x00 local function return status code. 1262 * 1263 * Context: 1264 * Kernel context. 1265 */ 1266int 1267qla2x00_get_port_name(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t *name, 1268 uint8_t opt) 1269{ 1270 int rval; 1271 mbx_cmd_t mc; 1272 mbx_cmd_t *mcp = &mc; 1273 1274 DEBUG11(printk("qla2x00_get_port_name(%ld): entered.\n", 1275 ha->host_no);) 1276 1277 mcp->mb[0] = MBC_GET_PORT_NAME; 1278 mcp->out_mb = MBX_1|MBX_0; 1279 if (HAS_EXTENDED_IDS(ha)) { 1280 mcp->mb[1] = loop_id; 1281 mcp->mb[10] = opt; 1282 mcp->out_mb |= MBX_10; 1283 } else { 1284 mcp->mb[1] = loop_id << 8 | opt; 1285 } 1286 1287 mcp->in_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 1288 mcp->tov = 30; 1289 mcp->flags = 0; 1290 rval = qla2x00_mailbox_command(ha, mcp); 1291 1292 if (rval != QLA_SUCCESS) { 1293 /*EMPTY*/ 1294 DEBUG2_3_11(printk("qla2x00_get_port_name(%ld): failed=%x.\n", 1295 ha->host_no, rval);) 1296 } else { 1297 if (name != NULL) { 1298 /* This function returns name in big endian. */ 1299 name[0] = LSB(mcp->mb[2]); 1300 name[1] = MSB(mcp->mb[2]); 1301 name[2] = LSB(mcp->mb[3]); 1302 name[3] = MSB(mcp->mb[3]); 1303 name[4] = LSB(mcp->mb[6]); 1304 name[5] = MSB(mcp->mb[6]); 1305 name[6] = LSB(mcp->mb[7]); 1306 name[7] = MSB(mcp->mb[7]); 1307 } 1308 1309 DEBUG11(printk("qla2x00_get_port_name(%ld): done.\n", 1310 ha->host_no);) 1311 } 1312 1313 return rval; 1314} 1315 1316/* 1317 * qla2x00_lip_reset 1318 * Issue LIP reset mailbox command. 1319 * 1320 * Input: 1321 * ha = adapter block pointer. 1322 * TARGET_QUEUE_LOCK must be released. 1323 * ADAPTER_STATE_LOCK must be released. 1324 * 1325 * Returns: 1326 * qla2x00 local function return status code. 1327 * 1328 * Context: 1329 * Kernel context. 1330 */ 1331int 1332qla2x00_lip_reset(scsi_qla_host_t *ha) 1333{ 1334 int rval; 1335 mbx_cmd_t mc; 1336 mbx_cmd_t *mcp = &mc; 1337 1338 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) 1339 1340 if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { 1341 mcp->mb[0] = MBC_LIP_FULL_LOGIN; 1342 mcp->mb[1] = BIT_0; 1343 mcp->mb[2] = 0xff; 1344 mcp->mb[3] = 0; 1345 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; 1346 } else { 1347 mcp->mb[0] = MBC_LIP_RESET; 1348 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; 1349 if (HAS_EXTENDED_IDS(ha)) { 1350 mcp->mb[1] = 0x00ff; 1351 mcp->mb[10] = 0; 1352 mcp->out_mb |= MBX_10; 1353 } else { 1354 mcp->mb[1] = 0xff00; 1355 } 1356 mcp->mb[2] = ha->loop_reset_delay; 1357 mcp->mb[3] = 0; 1358 } 1359 mcp->in_mb = MBX_0; 1360 mcp->tov = 30; 1361 mcp->flags = 0; 1362 rval = qla2x00_mailbox_command(ha, mcp); 1363 1364 if (rval != QLA_SUCCESS) { 1365 /*EMPTY*/ 1366 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", 1367 __func__, ha->host_no, rval);) 1368 } else { 1369 /*EMPTY*/ 1370 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no);) 1371 } 1372 1373 return rval; 1374} 1375 1376/* 1377 * qla2x00_send_sns 1378 * Send SNS command. 1379 * 1380 * Input: 1381 * ha = adapter block pointer. 1382 * sns = pointer for command. 1383 * cmd_size = command size. 1384 * buf_size = response/command size. 1385 * TARGET_QUEUE_LOCK must be released. 1386 * ADAPTER_STATE_LOCK must be released. 1387 * 1388 * Returns: 1389 * qla2x00 local function return status code. 1390 * 1391 * Context: 1392 * Kernel context. 1393 */ 1394int 1395qla2x00_send_sns(scsi_qla_host_t *ha, dma_addr_t sns_phys_address, 1396 uint16_t cmd_size, size_t buf_size) 1397{ 1398 int rval; 1399 mbx_cmd_t mc; 1400 mbx_cmd_t *mcp = &mc; 1401 1402 DEBUG11(printk("qla2x00_send_sns(%ld): entered.\n", 1403 ha->host_no);) 1404 1405 DEBUG11(printk("qla2x00_send_sns: retry cnt=%d ratov=%d total " 1406 "tov=%d.\n", ha->retry_count, ha->login_timeout, mcp->tov);) 1407 1408 mcp->mb[0] = MBC_SEND_SNS_COMMAND; 1409 mcp->mb[1] = cmd_size; 1410 mcp->mb[2] = MSW(sns_phys_address); 1411 mcp->mb[3] = LSW(sns_phys_address); 1412 mcp->mb[6] = MSW(MSD(sns_phys_address)); 1413 mcp->mb[7] = LSW(MSD(sns_phys_address)); 1414 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 1415 mcp->in_mb = MBX_0|MBX_1; 1416 mcp->buf_size = buf_size; 1417 mcp->flags = MBX_DMA_OUT|MBX_DMA_IN; 1418 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2); 1419 rval = qla2x00_mailbox_command(ha, mcp); 1420 1421 if (rval != QLA_SUCCESS) { 1422 /*EMPTY*/ 1423 DEBUG(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x " 1424 "mb[1]=%x.\n", ha->host_no, rval, mcp->mb[0], mcp->mb[1]);) 1425 DEBUG2_3_11(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x " 1426 "mb[1]=%x.\n", ha->host_no, rval, mcp->mb[0], mcp->mb[1]);) 1427 } else { 1428 /*EMPTY*/ 1429 DEBUG11(printk("qla2x00_send_sns(%ld): done.\n", ha->host_no);) 1430 } 1431 1432 return rval; 1433} 1434 1435int 1436qla24xx_login_fabric(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain, 1437 uint8_t area, uint8_t al_pa, uint16_t *mb, uint8_t opt) 1438{ 1439 int rval; 1440 1441 struct logio_entry_24xx *lg; 1442 dma_addr_t lg_dma; 1443 uint32_t iop[2]; 1444 1445 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) 1446 1447 lg = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &lg_dma); 1448 if (lg == NULL) { 1449 DEBUG2_3(printk("%s(%ld): failed to allocate Login IOCB.\n", 1450 __func__, ha->host_no)); 1451 return QLA_MEMORY_ALLOC_FAILED; 1452 } 1453 memset(lg, 0, sizeof(struct logio_entry_24xx)); 1454 1455 lg->entry_type = LOGINOUT_PORT_IOCB_TYPE; 1456 lg->entry_count = 1; 1457 lg->nport_handle = cpu_to_le16(loop_id); 1458 lg->control_flags = __constant_cpu_to_le16(LCF_COMMAND_PLOGI); 1459 if (opt & BIT_0) 1460 lg->control_flags |= __constant_cpu_to_le16(LCF_COND_PLOGI); 1461 lg->port_id[0] = al_pa; 1462 lg->port_id[1] = area; 1463 lg->port_id[2] = domain; 1464 rval = qla2x00_issue_iocb(ha, lg, lg_dma, 0); 1465 if (rval != QLA_SUCCESS) { 1466 DEBUG2_3_11(printk("%s(%ld): failed to issue Login IOCB " 1467 "(%x).\n", __func__, ha->host_no, rval);) 1468 } else if (lg->entry_status != 0) { 1469 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 1470 "-- error status (%x).\n", __func__, ha->host_no, 1471 lg->entry_status)); 1472 rval = QLA_FUNCTION_FAILED; 1473 } else if (lg->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) { 1474 iop[0] = le32_to_cpu(lg->io_parameter[0]); 1475 iop[1] = le32_to_cpu(lg->io_parameter[1]); 1476 1477 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 1478 "-- completion status (%x) ioparam=%x/%x.\n", __func__, 1479 ha->host_no, le16_to_cpu(lg->comp_status), iop[0], 1480 iop[1])); 1481 1482 switch (iop[0]) { 1483 case LSC_SCODE_PORTID_USED: 1484 mb[0] = MBS_PORT_ID_USED; 1485 mb[1] = LSW(iop[1]); 1486 break; 1487 case LSC_SCODE_NPORT_USED: 1488 mb[0] = MBS_LOOP_ID_USED; 1489 break; 1490 case LSC_SCODE_NOLINK: 1491 case LSC_SCODE_NOIOCB: 1492 case LSC_SCODE_NOXCB: 1493 case LSC_SCODE_CMD_FAILED: 1494 case LSC_SCODE_NOFABRIC: 1495 case LSC_SCODE_FW_NOT_READY: 1496 case LSC_SCODE_NOT_LOGGED_IN: 1497 case LSC_SCODE_NOPCB: 1498 case LSC_SCODE_ELS_REJECT: 1499 case LSC_SCODE_CMD_PARAM_ERR: 1500 case LSC_SCODE_NONPORT: 1501 case LSC_SCODE_LOGGED_IN: 1502 case LSC_SCODE_NOFLOGI_ACC: 1503 default: 1504 mb[0] = MBS_COMMAND_ERROR; 1505 break; 1506 } 1507 } else { 1508 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no);) 1509 1510 iop[0] = le32_to_cpu(lg->io_parameter[0]); 1511 1512 mb[0] = MBS_COMMAND_COMPLETE; 1513 mb[1] = 0; 1514 if (iop[0] & BIT_4) { 1515 if (iop[0] & BIT_8) 1516 mb[1] |= BIT_1; 1517 } else 1518 mb[1] = BIT_0; 1519 1520 /* Passback COS information. */ 1521 mb[10] = 0; 1522 if (lg->io_parameter[7] || lg->io_parameter[8]) 1523 mb[10] |= BIT_0; /* Class 2. */ 1524 if (lg->io_parameter[9] || lg->io_parameter[10]) 1525 mb[10] |= BIT_1; /* Class 3. */ 1526 } 1527 1528 dma_pool_free(ha->s_dma_pool, lg, lg_dma); 1529 1530 return rval; 1531} 1532 1533/* 1534 * qla2x00_login_fabric 1535 * Issue login fabric port mailbox command. 1536 * 1537 * Input: 1538 * ha = adapter block pointer. 1539 * loop_id = device loop ID. 1540 * domain = device domain. 1541 * area = device area. 1542 * al_pa = device AL_PA. 1543 * status = pointer for return status. 1544 * opt = command options. 1545 * TARGET_QUEUE_LOCK must be released. 1546 * ADAPTER_STATE_LOCK must be released. 1547 * 1548 * Returns: 1549 * qla2x00 local function return status code. 1550 * 1551 * Context: 1552 * Kernel context. 1553 */ 1554int 1555qla2x00_login_fabric(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain, 1556 uint8_t area, uint8_t al_pa, uint16_t *mb, uint8_t opt) 1557{ 1558 int rval; 1559 mbx_cmd_t mc; 1560 mbx_cmd_t *mcp = &mc; 1561 1562 DEBUG11(printk("qla2x00_login_fabric(%ld): entered.\n", ha->host_no);) 1563 1564 mcp->mb[0] = MBC_LOGIN_FABRIC_PORT; 1565 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; 1566 if (HAS_EXTENDED_IDS(ha)) { 1567 mcp->mb[1] = loop_id; 1568 mcp->mb[10] = opt; 1569 mcp->out_mb |= MBX_10; 1570 } else { 1571 mcp->mb[1] = (loop_id << 8) | opt; 1572 } 1573 mcp->mb[2] = domain; 1574 mcp->mb[3] = area << 8 | al_pa; 1575 1576 mcp->in_mb = MBX_7|MBX_6|MBX_2|MBX_1|MBX_0; 1577 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2); 1578 mcp->flags = 0; 1579 rval = qla2x00_mailbox_command(ha, mcp); 1580 1581 /* Return mailbox statuses. */ 1582 if (mb != NULL) { 1583 mb[0] = mcp->mb[0]; 1584 mb[1] = mcp->mb[1]; 1585 mb[2] = mcp->mb[2]; 1586 mb[6] = mcp->mb[6]; 1587 mb[7] = mcp->mb[7]; 1588 /* COS retrieved from Get-Port-Database mailbox command. */ 1589 mb[10] = 0; 1590 } 1591 1592 if (rval != QLA_SUCCESS) { 1593 /* RLU tmp code: need to change main mailbox_command function to 1594 * return ok even when the mailbox completion value is not 1595 * SUCCESS. The caller needs to be responsible to interpret 1596 * the return values of this mailbox command if we're not 1597 * to change too much of the existing code. 1598 */ 1599 if (mcp->mb[0] == 0x4001 || mcp->mb[0] == 0x4002 || 1600 mcp->mb[0] == 0x4003 || mcp->mb[0] == 0x4005 || 1601 mcp->mb[0] == 0x4006) 1602 rval = QLA_SUCCESS; 1603 1604 /*EMPTY*/ 1605 DEBUG2_3_11(printk("qla2x00_login_fabric(%ld): failed=%x " 1606 "mb[0]=%x mb[1]=%x mb[2]=%x.\n", ha->host_no, rval, 1607 mcp->mb[0], mcp->mb[1], mcp->mb[2]);) 1608 } else { 1609 /*EMPTY*/ 1610 DEBUG11(printk("qla2x00_login_fabric(%ld): done.\n", 1611 ha->host_no);) 1612 } 1613 1614 return rval; 1615} 1616 1617/* 1618 * qla2x00_login_local_device 1619 * Issue login loop port mailbox command. 1620 * 1621 * Input: 1622 * ha = adapter block pointer. 1623 * loop_id = device loop ID. 1624 * opt = command options. 1625 * 1626 * Returns: 1627 * Return status code. 1628 * 1629 * Context: 1630 * Kernel context. 1631 * 1632 */ 1633int 1634qla2x00_login_local_device(scsi_qla_host_t *ha, uint16_t loop_id, 1635 uint16_t *mb_ret, uint8_t opt) 1636{ 1637 int rval; 1638 mbx_cmd_t mc; 1639 mbx_cmd_t *mcp = &mc; 1640 1641 DEBUG3(printk("%s(%ld): entered.\n", __func__, ha->host_no);) 1642 1643 mcp->mb[0] = MBC_LOGIN_LOOP_PORT; 1644 if (HAS_EXTENDED_IDS(ha)) 1645 mcp->mb[1] = loop_id; 1646 else 1647 mcp->mb[1] = loop_id << 8; 1648 mcp->mb[2] = opt; 1649 mcp->out_mb = MBX_2|MBX_1|MBX_0; 1650 mcp->in_mb = MBX_7|MBX_6|MBX_1|MBX_0; 1651 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2); 1652 mcp->flags = 0; 1653 rval = qla2x00_mailbox_command(ha, mcp); 1654 1655 /* Return mailbox statuses. */ 1656 if (mb_ret != NULL) { 1657 mb_ret[0] = mcp->mb[0]; 1658 mb_ret[1] = mcp->mb[1]; 1659 mb_ret[6] = mcp->mb[6]; 1660 mb_ret[7] = mcp->mb[7]; 1661 } 1662 1663 if (rval != QLA_SUCCESS) { 1664 /* AV tmp code: need to change main mailbox_command function to 1665 * return ok even when the mailbox completion value is not 1666 * SUCCESS. The caller needs to be responsible to interpret 1667 * the return values of this mailbox command if we're not 1668 * to change too much of the existing code. 1669 */ 1670 if (mcp->mb[0] == 0x4005 || mcp->mb[0] == 0x4006) 1671 rval = QLA_SUCCESS; 1672 1673 DEBUG(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x " 1674 "mb[6]=%x mb[7]=%x.\n", __func__, ha->host_no, rval, 1675 mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7]);) 1676 DEBUG2_3(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x " 1677 "mb[6]=%x mb[7]=%x.\n", __func__, ha->host_no, rval, 1678 mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7]);) 1679 } else { 1680 /*EMPTY*/ 1681 DEBUG3(printk("%s(%ld): done.\n", __func__, ha->host_no);) 1682 } 1683 1684 return (rval); 1685} 1686 1687int 1688qla24xx_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain, 1689 uint8_t area, uint8_t al_pa) 1690{ 1691 int rval; 1692 struct logio_entry_24xx *lg; 1693 dma_addr_t lg_dma; 1694 1695 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) 1696 1697 lg = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &lg_dma); 1698 if (lg == NULL) { 1699 DEBUG2_3(printk("%s(%ld): failed to allocate Logout IOCB.\n", 1700 __func__, ha->host_no)); 1701 return QLA_MEMORY_ALLOC_FAILED; 1702 } 1703 memset(lg, 0, sizeof(struct logio_entry_24xx)); 1704 1705 lg->entry_type = LOGINOUT_PORT_IOCB_TYPE; 1706 lg->entry_count = 1; 1707 lg->nport_handle = cpu_to_le16(loop_id); 1708 lg->control_flags = 1709 __constant_cpu_to_le16(LCF_COMMAND_LOGO|LCF_EXPL_LOGO); 1710 lg->port_id[0] = al_pa; 1711 lg->port_id[1] = area; 1712 lg->port_id[2] = domain; 1713 rval = qla2x00_issue_iocb(ha, lg, lg_dma, 0); 1714 if (rval != QLA_SUCCESS) { 1715 DEBUG2_3_11(printk("%s(%ld): failed to issue Logout IOCB " 1716 "(%x).\n", __func__, ha->host_no, rval);) 1717 } else if (lg->entry_status != 0) { 1718 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 1719 "-- error status (%x).\n", __func__, ha->host_no, 1720 lg->entry_status)); 1721 rval = QLA_FUNCTION_FAILED; 1722 } else if (lg->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) { 1723 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 1724 "-- completion status (%x) ioparam=%x/%x.\n", __func__, 1725 ha->host_no, le16_to_cpu(lg->comp_status), 1726 le32_to_cpu(lg->io_parameter[0]), 1727 le32_to_cpu(lg->io_parameter[1]));) 1728 } else { 1729 /*EMPTY*/ 1730 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no);) 1731 } 1732 1733 dma_pool_free(ha->s_dma_pool, lg, lg_dma); 1734 1735 return rval; 1736} 1737 1738/* 1739 * qla2x00_fabric_logout 1740 * Issue logout fabric port mailbox command. 1741 * 1742 * Input: 1743 * ha = adapter block pointer. 1744 * loop_id = device loop ID. 1745 * TARGET_QUEUE_LOCK must be released. 1746 * ADAPTER_STATE_LOCK must be released. 1747 * 1748 * Returns: 1749 * qla2x00 local function return status code. 1750 * 1751 * Context: 1752 * Kernel context. 1753 */ 1754int 1755qla2x00_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain, 1756 uint8_t area, uint8_t al_pa) 1757{ 1758 int rval; 1759 mbx_cmd_t mc; 1760 mbx_cmd_t *mcp = &mc; 1761 1762 DEBUG11(printk("qla2x00_fabric_logout(%ld): entered.\n", 1763 ha->host_no);) 1764 1765 mcp->mb[0] = MBC_LOGOUT_FABRIC_PORT; 1766 mcp->out_mb = MBX_1|MBX_0; 1767 if (HAS_EXTENDED_IDS(ha)) { 1768 mcp->mb[1] = loop_id; 1769 mcp->mb[10] = 0; 1770 mcp->out_mb |= MBX_10; 1771 } else { 1772 mcp->mb[1] = loop_id << 8; 1773 } 1774 1775 mcp->in_mb = MBX_1|MBX_0; 1776 mcp->tov = 30; 1777 mcp->flags = 0; 1778 rval = qla2x00_mailbox_command(ha, mcp); 1779 1780 if (rval != QLA_SUCCESS) { 1781 /*EMPTY*/ 1782 DEBUG2_3_11(printk("qla2x00_fabric_logout(%ld): failed=%x " 1783 "mbx1=%x.\n", ha->host_no, rval, mcp->mb[1]);) 1784 } else { 1785 /*EMPTY*/ 1786 DEBUG11(printk("qla2x00_fabric_logout(%ld): done.\n", 1787 ha->host_no);) 1788 } 1789 1790 return rval; 1791} 1792 1793/* 1794 * qla2x00_full_login_lip 1795 * Issue full login LIP mailbox command. 1796 * 1797 * Input: 1798 * ha = adapter block pointer. 1799 * TARGET_QUEUE_LOCK must be released. 1800 * ADAPTER_STATE_LOCK must be released. 1801 * 1802 * Returns: 1803 * qla2x00 local function return status code. 1804 * 1805 * Context: 1806 * Kernel context. 1807 */ 1808int 1809qla2x00_full_login_lip(scsi_qla_host_t *ha) 1810{ 1811 int rval; 1812 mbx_cmd_t mc; 1813 mbx_cmd_t *mcp = &mc; 1814 1815 DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n", 1816 ha->host_no);) 1817 1818 mcp->mb[0] = MBC_LIP_FULL_LOGIN; 1819 mcp->mb[1] = 0; 1820 mcp->mb[2] = 0xff; 1821 mcp->mb[3] = 0; 1822 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; 1823 mcp->in_mb = MBX_0; 1824 mcp->tov = 30; 1825 mcp->flags = 0; 1826 rval = qla2x00_mailbox_command(ha, mcp); 1827 1828 if (rval != QLA_SUCCESS) { 1829 /*EMPTY*/ 1830 DEBUG2_3_11(printk("qla2x00_full_login_lip(%ld): failed=%x.\n", 1831 ha->host_no, rval);) 1832 } else { 1833 /*EMPTY*/ 1834 DEBUG11(printk("qla2x00_full_login_lip(%ld): done.\n", 1835 ha->host_no);) 1836 } 1837 1838 return rval; 1839} 1840 1841/* 1842 * qla2x00_get_id_list 1843 * 1844 * Input: 1845 * ha = adapter block pointer. 1846 * 1847 * Returns: 1848 * qla2x00 local function return status code. 1849 * 1850 * Context: 1851 * Kernel context. 1852 */ 1853int 1854qla2x00_get_id_list(scsi_qla_host_t *ha, void *id_list, dma_addr_t id_list_dma, 1855 uint16_t *entries) 1856{ 1857 int rval; 1858 mbx_cmd_t mc; 1859 mbx_cmd_t *mcp = &mc; 1860 1861 DEBUG11(printk("qla2x00_get_id_list(%ld): entered.\n", 1862 ha->host_no);) 1863 1864 if (id_list == NULL) 1865 return QLA_FUNCTION_FAILED; 1866 1867 mcp->mb[0] = MBC_GET_ID_LIST; 1868 mcp->out_mb = MBX_0; 1869 if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { 1870 mcp->mb[2] = MSW(id_list_dma); 1871 mcp->mb[3] = LSW(id_list_dma); 1872 mcp->mb[6] = MSW(MSD(id_list_dma)); 1873 mcp->mb[7] = LSW(MSD(id_list_dma)); 1874 mcp->mb[8] = 0; 1875 mcp->out_mb |= MBX_8|MBX_7|MBX_6|MBX_3|MBX_2; 1876 } else { 1877 mcp->mb[1] = MSW(id_list_dma); 1878 mcp->mb[2] = LSW(id_list_dma); 1879 mcp->mb[3] = MSW(MSD(id_list_dma)); 1880 mcp->mb[6] = LSW(MSD(id_list_dma)); 1881 mcp->out_mb |= MBX_6|MBX_3|MBX_2|MBX_1; 1882 } 1883 mcp->in_mb = MBX_1|MBX_0; 1884 mcp->tov = 30; 1885 mcp->flags = 0; 1886 rval = qla2x00_mailbox_command(ha, mcp); 1887 1888 if (rval != QLA_SUCCESS) { 1889 /*EMPTY*/ 1890 DEBUG2_3_11(printk("qla2x00_get_id_list(%ld): failed=%x.\n", 1891 ha->host_no, rval);) 1892 } else { 1893 *entries = mcp->mb[1]; 1894 DEBUG11(printk("qla2x00_get_id_list(%ld): done.\n", 1895 ha->host_no);) 1896 } 1897 1898 return rval; 1899} 1900 1901/* 1902 * qla2x00_get_resource_cnts 1903 * Get current firmware resource counts. 1904 * 1905 * Input: 1906 * ha = adapter block pointer. 1907 * 1908 * Returns: 1909 * qla2x00 local function return status code. 1910 * 1911 * Context: 1912 * Kernel context. 1913 */ 1914int 1915qla2x00_get_resource_cnts(scsi_qla_host_t *ha, uint16_t *cur_xchg_cnt, 1916 uint16_t *orig_xchg_cnt, uint16_t *cur_iocb_cnt, uint16_t *orig_iocb_cnt) 1917{ 1918 int rval; 1919 mbx_cmd_t mc; 1920 mbx_cmd_t *mcp = &mc; 1921 1922 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); 1923 1924 mcp->mb[0] = MBC_GET_RESOURCE_COUNTS; 1925 mcp->out_mb = MBX_0; 1926 mcp->in_mb = MBX_10|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 1927 mcp->tov = 30; 1928 mcp->flags = 0; 1929 rval = qla2x00_mailbox_command(ha, mcp); 1930 1931 if (rval != QLA_SUCCESS) { 1932 /*EMPTY*/ 1933 DEBUG2_3_11(printk("%s(%ld): failed = %x.\n", __func__, 1934 ha->host_no, mcp->mb[0]);) 1935 } else { 1936 DEBUG11(printk("%s(%ld): done. mb1=%x mb2=%x mb3=%x mb6=%x " 1937 "mb7=%x mb10=%x.\n", __func__, ha->host_no, 1938 mcp->mb[1], mcp->mb[2], mcp->mb[3], mcp->mb[6], mcp->mb[7], 1939 mcp->mb[10])); 1940 1941 if (cur_xchg_cnt) 1942 *cur_xchg_cnt = mcp->mb[3]; 1943 if (orig_xchg_cnt) 1944 *orig_xchg_cnt = mcp->mb[6]; 1945 if (cur_iocb_cnt) 1946 *cur_iocb_cnt = mcp->mb[7]; 1947 if (orig_iocb_cnt) 1948 *orig_iocb_cnt = mcp->mb[10]; 1949 } 1950 1951 return (rval); 1952} 1953 1954#if defined(QL_DEBUG_LEVEL_3) 1955/* 1956 * qla2x00_get_fcal_position_map 1957 * Get FCAL (LILP) position map using mailbox command 1958 * 1959 * Input: 1960 * ha = adapter state pointer. 1961 * pos_map = buffer pointer (can be NULL). 1962 * 1963 * Returns: 1964 * qla2x00 local function return status code. 1965 * 1966 * Context: 1967 * Kernel context. 1968 */ 1969int 1970qla2x00_get_fcal_position_map(scsi_qla_host_t *ha, char *pos_map) 1971{ 1972 int rval; 1973 mbx_cmd_t mc; 1974 mbx_cmd_t *mcp = &mc; 1975 char *pmap; 1976 dma_addr_t pmap_dma; 1977 1978 pmap = dma_pool_alloc(ha->s_dma_pool, GFP_ATOMIC, &pmap_dma); 1979 if (pmap == NULL) { 1980 DEBUG2_3_11(printk("%s(%ld): **** Mem Alloc Failed ****", 1981 __func__, ha->host_no)); 1982 return QLA_MEMORY_ALLOC_FAILED; 1983 } 1984 memset(pmap, 0, FCAL_MAP_SIZE); 1985 1986 mcp->mb[0] = MBC_GET_FC_AL_POSITION_MAP; 1987 mcp->mb[2] = MSW(pmap_dma); 1988 mcp->mb[3] = LSW(pmap_dma); 1989 mcp->mb[6] = MSW(MSD(pmap_dma)); 1990 mcp->mb[7] = LSW(MSD(pmap_dma)); 1991 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; 1992 mcp->in_mb = MBX_1|MBX_0; 1993 mcp->buf_size = FCAL_MAP_SIZE; 1994 mcp->flags = MBX_DMA_IN; 1995 mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2); 1996 rval = qla2x00_mailbox_command(ha, mcp); 1997 1998 if (rval == QLA_SUCCESS) { 1999 DEBUG11(printk("%s(%ld): (mb0=%x/mb1=%x) FC/AL Position Map " 2000 "size (%x)\n", __func__, ha->host_no, mcp->mb[0], 2001 mcp->mb[1], (unsigned)pmap[0])); 2002 DEBUG11(qla2x00_dump_buffer(pmap, pmap[0] + 1)); 2003 2004 if (pos_map) 2005 memcpy(pos_map, pmap, FCAL_MAP_SIZE); 2006 } 2007 dma_pool_free(ha->s_dma_pool, pmap, pmap_dma); 2008 2009 if (rval != QLA_SUCCESS) { 2010 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 2011 ha->host_no, rval)); 2012 } else { 2013 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); 2014 } 2015 2016 return rval; 2017} 2018#endif 2019 2020/* 2021 * qla2x00_get_link_status 2022 * 2023 * Input: 2024 * ha = adapter block pointer. 2025 * loop_id = device loop ID. 2026 * ret_buf = pointer to link status return buffer. 2027 * 2028 * Returns: 2029 * 0 = success. 2030 * BIT_0 = mem alloc error. 2031 * BIT_1 = mailbox error. 2032 */ 2033int 2034qla2x00_get_link_status(scsi_qla_host_t *ha, uint16_t loop_id, 2035 link_stat_t *ret_buf, uint16_t *status) 2036{ 2037 int rval; 2038 mbx_cmd_t mc; 2039 mbx_cmd_t *mcp = &mc; 2040 link_stat_t *stat_buf; 2041 dma_addr_t stat_buf_dma; 2042 2043 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) 2044 2045 stat_buf = dma_pool_alloc(ha->s_dma_pool, GFP_ATOMIC, &stat_buf_dma); 2046 if (stat_buf == NULL) { 2047 DEBUG2_3_11(printk("%s(%ld): Failed to allocate memory.\n", 2048 __func__, ha->host_no)); 2049 return BIT_0; 2050 } 2051 memset(stat_buf, 0, sizeof(link_stat_t)); 2052 2053 mcp->mb[0] = MBC_GET_LINK_STATUS; 2054 mcp->mb[2] = MSW(stat_buf_dma); 2055 mcp->mb[3] = LSW(stat_buf_dma); 2056 mcp->mb[6] = MSW(MSD(stat_buf_dma)); 2057 mcp->mb[7] = LSW(MSD(stat_buf_dma)); 2058 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; 2059 mcp->in_mb = MBX_0; 2060 if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { 2061 mcp->mb[1] = loop_id; 2062 mcp->mb[4] = 0; 2063 mcp->mb[10] = 0; 2064 mcp->out_mb |= MBX_10|MBX_4|MBX_1; 2065 mcp->in_mb |= MBX_1; 2066 } else if (HAS_EXTENDED_IDS(ha)) { 2067 mcp->mb[1] = loop_id; 2068 mcp->mb[10] = 0; 2069 mcp->out_mb |= MBX_10|MBX_1; 2070 } else { 2071 mcp->mb[1] = loop_id << 8; 2072 mcp->out_mb |= MBX_1; 2073 } 2074 mcp->tov = 30; 2075 mcp->flags = IOCTL_CMD; 2076 rval = qla2x00_mailbox_command(ha, mcp); 2077 2078 if (rval == QLA_SUCCESS) { 2079 if (mcp->mb[0] != MBS_COMMAND_COMPLETE) { 2080 DEBUG2_3_11(printk("%s(%ld): cmd failed. mbx0=%x.\n", 2081 __func__, ha->host_no, mcp->mb[0]);) 2082 status[0] = mcp->mb[0]; 2083 rval = BIT_1; 2084 } else { 2085 /* copy over data -- firmware data is LE. */ 2086 ret_buf->link_fail_cnt = 2087 le32_to_cpu(stat_buf->link_fail_cnt); 2088 ret_buf->loss_sync_cnt = 2089 le32_to_cpu(stat_buf->loss_sync_cnt); 2090 ret_buf->loss_sig_cnt = 2091 le32_to_cpu(stat_buf->loss_sig_cnt); 2092 ret_buf->prim_seq_err_cnt = 2093 le32_to_cpu(stat_buf->prim_seq_err_cnt); 2094 ret_buf->inval_xmit_word_cnt = 2095 le32_to_cpu(stat_buf->inval_xmit_word_cnt); 2096 ret_buf->inval_crc_cnt = 2097 le32_to_cpu(stat_buf->inval_crc_cnt); 2098 2099 DEBUG11(printk("%s(%ld): stat dump: fail_cnt=%d " 2100 "loss_sync=%d loss_sig=%d seq_err=%d " 2101 "inval_xmt_word=%d inval_crc=%d.\n", __func__, 2102 ha->host_no, stat_buf->link_fail_cnt, 2103 stat_buf->loss_sync_cnt, stat_buf->loss_sig_cnt, 2104 stat_buf->prim_seq_err_cnt, 2105 stat_buf->inval_xmit_word_cnt, 2106 stat_buf->inval_crc_cnt);) 2107 } 2108 } else { 2109 /* Failed. */ 2110 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 2111 ha->host_no, rval);) 2112 rval = BIT_1; 2113 } 2114 2115 dma_pool_free(ha->s_dma_pool, stat_buf, stat_buf_dma); 2116 2117 return rval; 2118} 2119 2120int 2121qla24xx_get_isp_stats(scsi_qla_host_t *ha, uint32_t *dwbuf, uint32_t dwords, 2122 uint16_t *status) 2123{ 2124 int rval; 2125 mbx_cmd_t mc; 2126 mbx_cmd_t *mcp = &mc; 2127 uint32_t *sbuf, *siter; 2128 dma_addr_t sbuf_dma; 2129 2130 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) 2131 2132 if (dwords > (DMA_POOL_SIZE / 4)) { 2133 DEBUG2_3_11(printk("%s(%ld): Unabled to retrieve %d DWORDs " 2134 "(max %d).\n", __func__, ha->host_no, dwords, 2135 DMA_POOL_SIZE / 4)); 2136 return BIT_0; 2137 } 2138 sbuf = dma_pool_alloc(ha->s_dma_pool, GFP_ATOMIC, &sbuf_dma); 2139 if (sbuf == NULL) { 2140 DEBUG2_3_11(printk("%s(%ld): Failed to allocate memory.\n", 2141 __func__, ha->host_no)); 2142 return BIT_0; 2143 } 2144 memset(sbuf, 0, DMA_POOL_SIZE); 2145 2146 mcp->mb[0] = MBC_GET_LINK_PRIV_STATS; 2147 mcp->mb[2] = MSW(sbuf_dma); 2148 mcp->mb[3] = LSW(sbuf_dma); 2149 mcp->mb[6] = MSW(MSD(sbuf_dma)); 2150 mcp->mb[7] = LSW(MSD(sbuf_dma)); 2151 mcp->mb[8] = dwords; 2152 mcp->mb[10] = 0; 2153 mcp->out_mb = MBX_10|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; 2154 mcp->in_mb = MBX_2|MBX_1|MBX_0; 2155 mcp->tov = 30; 2156 mcp->flags = IOCTL_CMD; 2157 rval = qla2x00_mailbox_command(ha, mcp); 2158 2159 if (rval == QLA_SUCCESS) { 2160 if (mcp->mb[0] != MBS_COMMAND_COMPLETE) { 2161 DEBUG2_3_11(printk("%s(%ld): cmd failed. mbx0=%x.\n", 2162 __func__, ha->host_no, mcp->mb[0])); 2163 status[0] = mcp->mb[0]; 2164 rval = BIT_1; 2165 } else { 2166 /* Copy over data -- firmware data is LE. */ 2167 siter = sbuf; 2168 while (dwords--) 2169 *dwbuf++ = le32_to_cpu(*siter++); 2170 } 2171 } else { 2172 /* Failed. */ 2173 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 2174 ha->host_no, rval)); 2175 rval = BIT_1; 2176 } 2177 2178 dma_pool_free(ha->s_dma_pool, sbuf, sbuf_dma); 2179 2180 return rval; 2181} 2182 2183int 2184qla24xx_abort_command(scsi_qla_host_t *ha, srb_t *sp) 2185{ 2186 int rval; 2187 fc_port_t *fcport; 2188 unsigned long flags = 0; 2189 2190 struct abort_entry_24xx *abt; 2191 dma_addr_t abt_dma; 2192 uint32_t handle; 2193 2194 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) 2195 2196 fcport = sp->fcport; 2197 2198 spin_lock_irqsave(&ha->hardware_lock, flags); 2199 for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) { 2200 if (ha->outstanding_cmds[handle] == sp) 2201 break; 2202 } 2203 spin_unlock_irqrestore(&ha->hardware_lock, flags); 2204 if (handle == MAX_OUTSTANDING_COMMANDS) { 2205 /* Command not found. */ 2206 return QLA_FUNCTION_FAILED; 2207 } 2208 2209 abt = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &abt_dma); 2210 if (abt == NULL) { 2211 DEBUG2_3(printk("%s(%ld): failed to allocate Abort IOCB.\n", 2212 __func__, ha->host_no)); 2213 return QLA_MEMORY_ALLOC_FAILED; 2214 } 2215 memset(abt, 0, sizeof(struct abort_entry_24xx)); 2216 2217 abt->entry_type = ABORT_IOCB_TYPE; 2218 abt->entry_count = 1; 2219 abt->nport_handle = cpu_to_le16(fcport->loop_id); 2220 abt->handle_to_abort = handle; 2221 abt->port_id[0] = fcport->d_id.b.al_pa; 2222 abt->port_id[1] = fcport->d_id.b.area; 2223 abt->port_id[2] = fcport->d_id.b.domain; 2224 rval = qla2x00_issue_iocb(ha, abt, abt_dma, 0); 2225 if (rval != QLA_SUCCESS) { 2226 DEBUG2_3_11(printk("%s(%ld): failed to issue IOCB (%x).\n", 2227 __func__, ha->host_no, rval);) 2228 } else if (abt->entry_status != 0) { 2229 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2230 "-- error status (%x).\n", __func__, ha->host_no, 2231 abt->entry_status)); 2232 rval = QLA_FUNCTION_FAILED; 2233 } else if (abt->nport_handle != __constant_cpu_to_le16(0)) { 2234 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2235 "-- completion status (%x).\n", __func__, ha->host_no, 2236 le16_to_cpu(abt->nport_handle));) 2237 rval = QLA_FUNCTION_FAILED; 2238 } else { 2239 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no);) 2240 sp->flags |= SRB_ABORT_PENDING; 2241 } 2242 2243 dma_pool_free(ha->s_dma_pool, abt, abt_dma); 2244 2245 return rval; 2246} 2247 2248struct tsk_mgmt_cmd { 2249 union { 2250 struct tsk_mgmt_entry tsk; 2251 struct sts_entry_24xx sts; 2252 } p; 2253}; 2254 2255int 2256qla24xx_abort_target(fc_port_t *fcport) 2257{ 2258 int rval; 2259 struct tsk_mgmt_cmd *tsk; 2260 dma_addr_t tsk_dma; 2261 scsi_qla_host_t *ha; 2262 2263 if (fcport == NULL) 2264 return 0; 2265 2266 DEBUG11(printk("%s(%ld): entered.\n", __func__, fcport->ha->host_no);) 2267 2268 ha = fcport->ha; 2269 tsk = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &tsk_dma); 2270 if (tsk == NULL) { 2271 DEBUG2_3(printk("%s(%ld): failed to allocate Task Management " 2272 "IOCB.\n", __func__, ha->host_no)); 2273 return QLA_MEMORY_ALLOC_FAILED; 2274 } 2275 memset(tsk, 0, sizeof(struct tsk_mgmt_cmd)); 2276 2277 tsk->p.tsk.entry_type = TSK_MGMT_IOCB_TYPE; 2278 tsk->p.tsk.entry_count = 1; 2279 tsk->p.tsk.nport_handle = cpu_to_le16(fcport->loop_id); 2280 tsk->p.tsk.timeout = __constant_cpu_to_le16(25); 2281 tsk->p.tsk.control_flags = __constant_cpu_to_le32(TCF_TARGET_RESET); 2282 tsk->p.tsk.port_id[0] = fcport->d_id.b.al_pa; 2283 tsk->p.tsk.port_id[1] = fcport->d_id.b.area; 2284 tsk->p.tsk.port_id[2] = fcport->d_id.b.domain; 2285 rval = qla2x00_issue_iocb(ha, tsk, tsk_dma, 0); 2286 if (rval != QLA_SUCCESS) { 2287 DEBUG2_3_11(printk("%s(%ld): failed to issue Target Reset IOCB " 2288 "(%x).\n", __func__, ha->host_no, rval);) 2289 goto atarget_done; 2290 } else if (tsk->p.sts.entry_status != 0) { 2291 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2292 "-- error status (%x).\n", __func__, ha->host_no, 2293 tsk->p.sts.entry_status)); 2294 rval = QLA_FUNCTION_FAILED; 2295 goto atarget_done; 2296 } else if (tsk->p.sts.comp_status != 2297 __constant_cpu_to_le16(CS_COMPLETE)) { 2298 DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " 2299 "-- completion status (%x).\n", __func__, 2300 ha->host_no, le16_to_cpu(tsk->p.sts.comp_status));) 2301 rval = QLA_FUNCTION_FAILED; 2302 goto atarget_done; 2303 } 2304 2305 /* Issue marker IOCB. */ 2306 rval = qla2x00_marker(ha, fcport->loop_id, 0, MK_SYNC_ID); 2307 if (rval != QLA_SUCCESS) { 2308 DEBUG2_3_11(printk("%s(%ld): failed to issue Marker IOCB " 2309 "(%x).\n", __func__, ha->host_no, rval);) 2310 } else { 2311 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no);) 2312 } 2313 2314atarget_done: 2315 dma_pool_free(ha->s_dma_pool, tsk, tsk_dma); 2316 2317 return rval; 2318} 2319 2320int 2321qla2x00_system_error(scsi_qla_host_t *ha) 2322{ 2323 int rval; 2324 mbx_cmd_t mc; 2325 mbx_cmd_t *mcp = &mc; 2326 2327 if (!IS_QLA24XX(ha) && !IS_QLA25XX(ha)) 2328 return QLA_FUNCTION_FAILED; 2329 2330 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); 2331 2332 mcp->mb[0] = MBC_GEN_SYSTEM_ERROR; 2333 mcp->out_mb = MBX_0; 2334 mcp->in_mb = MBX_0; 2335 mcp->tov = 5; 2336 mcp->flags = 0; 2337 rval = qla2x00_mailbox_command(ha, mcp); 2338 2339 if (rval != QLA_SUCCESS) { 2340 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 2341 ha->host_no, rval)); 2342 } else { 2343 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); 2344 } 2345 2346 return rval; 2347} 2348 2349/** 2350 * qla2x00_get_serdes_params() - 2351 * @ha: HA context 2352 * 2353 * Returns 2354 */ 2355int 2356qla2x00_get_serdes_params(scsi_qla_host_t *ha, uint16_t *sw_em_1g, 2357 uint16_t *sw_em_2g, uint16_t *sw_em_4g) 2358{ 2359 int rval; 2360 mbx_cmd_t mc; 2361 mbx_cmd_t *mcp = &mc; 2362 2363 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); 2364 2365 mcp->mb[0] = MBC_SERDES_PARAMS; 2366 mcp->mb[1] = 0; 2367 mcp->out_mb = MBX_1|MBX_0; 2368 mcp->in_mb = MBX_4|MBX_3|MBX_2|MBX_0; 2369 mcp->tov = 30; 2370 mcp->flags = 0; 2371 rval = qla2x00_mailbox_command(ha, mcp); 2372 2373 if (rval != QLA_SUCCESS) { 2374 /*EMPTY*/ 2375 DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__, 2376 ha->host_no, rval, mcp->mb[0])); 2377 } else { 2378 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); 2379 2380 if (sw_em_1g) 2381 *sw_em_1g = mcp->mb[2]; 2382 if (sw_em_2g) 2383 *sw_em_2g = mcp->mb[3]; 2384 if (sw_em_4g) 2385 *sw_em_4g = mcp->mb[4]; 2386 } 2387 2388 return rval; 2389} 2390 2391/** 2392 * qla2x00_set_serdes_params() - 2393 * @ha: HA context 2394 * 2395 * Returns 2396 */ 2397int 2398qla2x00_set_serdes_params(scsi_qla_host_t *ha, uint16_t sw_em_1g, 2399 uint16_t sw_em_2g, uint16_t sw_em_4g) 2400{ 2401 int rval; 2402 mbx_cmd_t mc; 2403 mbx_cmd_t *mcp = &mc; 2404 2405 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); 2406 2407 mcp->mb[0] = MBC_SERDES_PARAMS; 2408 mcp->mb[1] = BIT_0; 2409 mcp->mb[2] = sw_em_1g; 2410 mcp->mb[3] = sw_em_2g; 2411 mcp->mb[4] = sw_em_4g; 2412 mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 2413 mcp->in_mb = MBX_0; 2414 mcp->tov = 30; 2415 mcp->flags = 0; 2416 rval = qla2x00_mailbox_command(ha, mcp); 2417 2418 if (rval != QLA_SUCCESS) { 2419 /*EMPTY*/ 2420 DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__, 2421 ha->host_no, rval, mcp->mb[0])); 2422 } else { 2423 /*EMPTY*/ 2424 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); 2425 } 2426 2427 return rval; 2428} 2429 2430int 2431qla2x00_stop_firmware(scsi_qla_host_t *ha) 2432{ 2433 int rval; 2434 mbx_cmd_t mc; 2435 mbx_cmd_t *mcp = &mc; 2436 2437 if (!IS_QLA24XX(ha) && !IS_QLA25XX(ha)) 2438 return QLA_FUNCTION_FAILED; 2439 2440 DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); 2441 2442 mcp->mb[0] = MBC_STOP_FIRMWARE; 2443 mcp->out_mb = MBX_0; 2444 mcp->in_mb = MBX_0; 2445 mcp->tov = 5; 2446 mcp->flags = 0; 2447 rval = qla2x00_mailbox_command(ha, mcp); 2448 2449 if (rval != QLA_SUCCESS) { 2450 DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, 2451 ha->host_no, rval)); 2452 } else { 2453 DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); 2454 } 2455 2456 return rval; 2457} 2458