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