1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright 2017 Broadcom. All Rights Reserved. 4 * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries. 5 * 6 * Contact Information: 7 * linux-drivers@broadcom.com 8 */ 9 10 #include <scsi/iscsi_proto.h> 11 12 #include "be_main.h" 13 #include "be.h" 14 #include "be_mgmt.h" 15 16 /* UE Status Low CSR */ 17 static const char * const desc_ue_status_low[] = { 18 "CEV", 19 "CTX", 20 "DBUF", 21 "ERX", 22 "Host", 23 "MPU", 24 "NDMA", 25 "PTC ", 26 "RDMA ", 27 "RXF ", 28 "RXIPS ", 29 "RXULP0 ", 30 "RXULP1 ", 31 "RXULP2 ", 32 "TIM ", 33 "TPOST ", 34 "TPRE ", 35 "TXIPS ", 36 "TXULP0 ", 37 "TXULP1 ", 38 "UC ", 39 "WDMA ", 40 "TXULP2 ", 41 "HOST1 ", 42 "P0_OB_LINK ", 43 "P1_OB_LINK ", 44 "HOST_GPIO ", 45 "MBOX ", 46 "AXGMAC0", 47 "AXGMAC1", 48 "JTAG", 49 "MPU_INTPEND" 50 }; 51 52 /* UE Status High CSR */ 53 static const char * const desc_ue_status_hi[] = { 54 "LPCMEMHOST", 55 "MGMT_MAC", 56 "PCS0ONLINE", 57 "MPU_IRAM", 58 "PCS1ONLINE", 59 "PCTL0", 60 "PCTL1", 61 "PMEM", 62 "RR", 63 "TXPB", 64 "RXPP", 65 "XAUI", 66 "TXP", 67 "ARM", 68 "IPC", 69 "HOST2", 70 "HOST3", 71 "HOST4", 72 "HOST5", 73 "HOST6", 74 "HOST7", 75 "HOST8", 76 "HOST9", 77 "NETC", 78 "Unknown", 79 "Unknown", 80 "Unknown", 81 "Unknown", 82 "Unknown", 83 "Unknown", 84 "Unknown", 85 "Unknown" 86 }; 87 88 struct be_mcc_wrb *alloc_mcc_wrb(struct beiscsi_hba *phba, 89 unsigned int *ref_tag) 90 { 91 struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q; 92 struct be_mcc_wrb *wrb = NULL; 93 unsigned int tag; 94 95 spin_lock(&phba->ctrl.mcc_lock); 96 if (mccq->used == mccq->len) { 97 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT | 98 BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX, 99 "BC_%d : MCC queue full: WRB used %u tag avail %u\n", 100 mccq->used, phba->ctrl.mcc_tag_available); 101 goto alloc_failed; 102 } 103 104 if (!phba->ctrl.mcc_tag_available) 105 goto alloc_failed; 106 107 tag = phba->ctrl.mcc_tag[phba->ctrl.mcc_alloc_index]; 108 if (!tag) { 109 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT | 110 BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX, 111 "BC_%d : MCC tag 0 allocated: tag avail %u alloc index %u\n", 112 phba->ctrl.mcc_tag_available, 113 phba->ctrl.mcc_alloc_index); 114 goto alloc_failed; 115 } 116 117 /* return this tag for further reference */ 118 *ref_tag = tag; 119 phba->ctrl.mcc_tag[phba->ctrl.mcc_alloc_index] = 0; 120 phba->ctrl.mcc_tag_status[tag] = 0; 121 phba->ctrl.ptag_state[tag].tag_state = 0; 122 phba->ctrl.ptag_state[tag].cbfn = NULL; 123 phba->ctrl.mcc_tag_available--; 124 if (phba->ctrl.mcc_alloc_index == (MAX_MCC_CMD - 1)) 125 phba->ctrl.mcc_alloc_index = 0; 126 else 127 phba->ctrl.mcc_alloc_index++; 128 129 wrb = queue_head_node(mccq); 130 memset(wrb, 0, sizeof(*wrb)); 131 wrb->tag0 = tag; 132 wrb->tag0 |= (mccq->head << MCC_Q_WRB_IDX_SHIFT) & MCC_Q_WRB_IDX_MASK; 133 queue_head_inc(mccq); 134 mccq->used++; 135 136 alloc_failed: 137 spin_unlock(&phba->ctrl.mcc_lock); 138 return wrb; 139 } 140 141 void free_mcc_wrb(struct be_ctrl_info *ctrl, unsigned int tag) 142 { 143 struct be_queue_info *mccq = &ctrl->mcc_obj.q; 144 145 spin_lock(&ctrl->mcc_lock); 146 tag = tag & MCC_Q_CMD_TAG_MASK; 147 ctrl->mcc_tag[ctrl->mcc_free_index] = tag; 148 if (ctrl->mcc_free_index == (MAX_MCC_CMD - 1)) 149 ctrl->mcc_free_index = 0; 150 else 151 ctrl->mcc_free_index++; 152 ctrl->mcc_tag_available++; 153 mccq->used--; 154 spin_unlock(&ctrl->mcc_lock); 155 } 156 157 /* 158 * beiscsi_mcc_compl_status - Return the status of MCC completion 159 * @phba: Driver private structure 160 * @tag: Tag for the MBX Command 161 * @wrb: the WRB used for the MBX Command 162 * @mbx_cmd_mem: ptr to memory allocated for MBX Cmd 163 * 164 * return 165 * Success: 0 166 * Failure: Non-Zero 167 */ 168 int __beiscsi_mcc_compl_status(struct beiscsi_hba *phba, 169 unsigned int tag, 170 struct be_mcc_wrb **wrb, 171 struct be_dma_mem *mbx_cmd_mem) 172 { 173 struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q; 174 uint16_t status = 0, addl_status = 0, wrb_num = 0; 175 struct be_cmd_resp_hdr *mbx_resp_hdr; 176 struct be_cmd_req_hdr *mbx_hdr; 177 struct be_mcc_wrb *temp_wrb; 178 uint32_t mcc_tag_status; 179 int rc = 0; 180 181 mcc_tag_status = phba->ctrl.mcc_tag_status[tag]; 182 status = (mcc_tag_status & CQE_STATUS_MASK); 183 addl_status = ((mcc_tag_status & CQE_STATUS_ADDL_MASK) >> 184 CQE_STATUS_ADDL_SHIFT); 185 186 if (mbx_cmd_mem) { 187 mbx_hdr = (struct be_cmd_req_hdr *)mbx_cmd_mem->va; 188 } else { 189 wrb_num = (mcc_tag_status & CQE_STATUS_WRB_MASK) >> 190 CQE_STATUS_WRB_SHIFT; 191 temp_wrb = (struct be_mcc_wrb *)queue_get_wrb(mccq, wrb_num); 192 mbx_hdr = embedded_payload(temp_wrb); 193 194 if (wrb) 195 *wrb = temp_wrb; 196 } 197 198 if (status || addl_status) { 199 beiscsi_log(phba, KERN_WARNING, 200 BEISCSI_LOG_INIT | BEISCSI_LOG_EH | 201 BEISCSI_LOG_CONFIG, 202 "BC_%d : MBX Cmd Failed for Subsys : %d Opcode : %d with Status : %d and Extd_Status : %d\n", 203 mbx_hdr->subsystem, mbx_hdr->opcode, 204 status, addl_status); 205 rc = -EIO; 206 if (status == MCC_STATUS_INSUFFICIENT_BUFFER) { 207 mbx_resp_hdr = (struct be_cmd_resp_hdr *)mbx_hdr; 208 beiscsi_log(phba, KERN_WARNING, 209 BEISCSI_LOG_INIT | BEISCSI_LOG_EH | 210 BEISCSI_LOG_CONFIG, 211 "BC_%d : Insufficient Buffer Error Resp_Len : %d Actual_Resp_Len : %d\n", 212 mbx_resp_hdr->response_length, 213 mbx_resp_hdr->actual_resp_len); 214 rc = -EAGAIN; 215 } 216 } 217 218 return rc; 219 } 220 221 /* 222 * beiscsi_mccq_compl_wait()- Process completion in MCC CQ 223 * @phba: Driver private structure 224 * @tag: Tag for the MBX Command 225 * @wrb: the WRB used for the MBX Command 226 * @mbx_cmd_mem: ptr to memory allocated for MBX Cmd 227 * 228 * Waits for MBX completion with the passed TAG. 229 * 230 * return 231 * Success: 0 232 * Failure: Non-Zero 233 **/ 234 int beiscsi_mccq_compl_wait(struct beiscsi_hba *phba, 235 unsigned int tag, 236 struct be_mcc_wrb **wrb, 237 struct be_dma_mem *mbx_cmd_mem) 238 { 239 int rc = 0; 240 241 if (!tag || tag > MAX_MCC_CMD) { 242 __beiscsi_log(phba, KERN_ERR, 243 "BC_%d : invalid tag %u\n", tag); 244 return -EINVAL; 245 } 246 247 if (beiscsi_hba_in_error(phba)) { 248 clear_bit(MCC_TAG_STATE_RUNNING, 249 &phba->ctrl.ptag_state[tag].tag_state); 250 return -EIO; 251 } 252 253 /* wait for the mccq completion */ 254 rc = wait_event_interruptible_timeout(phba->ctrl.mcc_wait[tag], 255 phba->ctrl.mcc_tag_status[tag], 256 msecs_to_jiffies( 257 BEISCSI_HOST_MBX_TIMEOUT)); 258 /** 259 * Return EIO if port is being disabled. Associated DMA memory, if any, 260 * is freed by the caller. When port goes offline, MCCQ is cleaned up 261 * so does WRB. 262 */ 263 if (!test_bit(BEISCSI_HBA_ONLINE, &phba->state)) { 264 clear_bit(MCC_TAG_STATE_RUNNING, 265 &phba->ctrl.ptag_state[tag].tag_state); 266 return -EIO; 267 } 268 269 /** 270 * If MBOX cmd timeout expired, tag and resource allocated 271 * for cmd is not freed until FW returns completion. 272 */ 273 if (rc <= 0) { 274 struct be_dma_mem *tag_mem; 275 276 /** 277 * PCI/DMA memory allocated and posted in non-embedded mode 278 * will have mbx_cmd_mem != NULL. 279 * Save virtual and bus addresses for the command so that it 280 * can be freed later. 281 **/ 282 tag_mem = &phba->ctrl.ptag_state[tag].tag_mem_state; 283 if (mbx_cmd_mem) { 284 tag_mem->size = mbx_cmd_mem->size; 285 tag_mem->va = mbx_cmd_mem->va; 286 tag_mem->dma = mbx_cmd_mem->dma; 287 } else 288 tag_mem->size = 0; 289 290 /* first make tag_mem_state visible to all */ 291 wmb(); 292 set_bit(MCC_TAG_STATE_TIMEOUT, 293 &phba->ctrl.ptag_state[tag].tag_state); 294 295 beiscsi_log(phba, KERN_ERR, 296 BEISCSI_LOG_INIT | BEISCSI_LOG_EH | 297 BEISCSI_LOG_CONFIG, 298 "BC_%d : MBX Cmd Completion timed out\n"); 299 return -EBUSY; 300 } 301 302 rc = __beiscsi_mcc_compl_status(phba, tag, wrb, mbx_cmd_mem); 303 304 free_mcc_wrb(&phba->ctrl, tag); 305 return rc; 306 } 307 308 /* 309 * beiscsi_process_mbox_compl()- Check the MBX completion status 310 * @ctrl: Function specific MBX data structure 311 * @compl: Completion status of MBX Command 312 * 313 * Check for the MBX completion status when BMBX method used 314 * 315 * return 316 * Success: Zero 317 * Failure: Non-Zero 318 **/ 319 static int beiscsi_process_mbox_compl(struct be_ctrl_info *ctrl, 320 struct be_mcc_compl *compl) 321 { 322 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); 323 struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev); 324 struct be_cmd_req_hdr *hdr = embedded_payload(wrb); 325 u16 compl_status, extd_status; 326 327 /** 328 * To check if valid bit is set, check the entire word as we don't know 329 * the endianness of the data (old entry is host endian while a new 330 * entry is little endian) 331 */ 332 if (!compl->flags) { 333 beiscsi_log(phba, KERN_ERR, 334 BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX, 335 "BC_%d : BMBX busy, no completion\n"); 336 return -EBUSY; 337 } 338 compl->flags = le32_to_cpu(compl->flags); 339 WARN_ON((compl->flags & CQE_FLAGS_VALID_MASK) == 0); 340 341 /** 342 * Just swap the status to host endian; 343 * mcc tag is opaquely copied from mcc_wrb. 344 */ 345 be_dws_le_to_cpu(compl, 4); 346 compl_status = (compl->status >> CQE_STATUS_COMPL_SHIFT) & 347 CQE_STATUS_COMPL_MASK; 348 extd_status = (compl->status >> CQE_STATUS_EXTD_SHIFT) & 349 CQE_STATUS_EXTD_MASK; 350 /* Need to reset the entire word that houses the valid bit */ 351 compl->flags = 0; 352 353 if (compl_status == MCC_STATUS_SUCCESS) 354 return 0; 355 356 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX, 357 "BC_%d : error in cmd completion: Subsystem : %d Opcode : %d status(compl/extd)=%d/%d\n", 358 hdr->subsystem, hdr->opcode, compl_status, extd_status); 359 return compl_status; 360 } 361 362 static void beiscsi_process_async_link(struct beiscsi_hba *phba, 363 struct be_mcc_compl *compl) 364 { 365 struct be_async_event_link_state *evt; 366 367 evt = (struct be_async_event_link_state *)compl; 368 369 phba->port_speed = evt->port_speed; 370 /** 371 * Check logical link status in ASYNC event. 372 * This has been newly introduced in SKH-R Firmware 10.0.338.45. 373 **/ 374 if (evt->port_link_status & BE_ASYNC_LINK_UP_MASK) { 375 set_bit(BEISCSI_HBA_LINK_UP, &phba->state); 376 if (test_bit(BEISCSI_HBA_BOOT_FOUND, &phba->state)) 377 beiscsi_start_boot_work(phba, BE_BOOT_INVALID_SHANDLE); 378 __beiscsi_log(phba, KERN_ERR, 379 "BC_%d : Link Up on Port %d tag 0x%x\n", 380 evt->physical_port, evt->event_tag); 381 } else { 382 clear_bit(BEISCSI_HBA_LINK_UP, &phba->state); 383 __beiscsi_log(phba, KERN_ERR, 384 "BC_%d : Link Down on Port %d tag 0x%x\n", 385 evt->physical_port, evt->event_tag); 386 iscsi_host_for_each_session(phba->shost, 387 beiscsi_session_fail); 388 } 389 } 390 391 static char *beiscsi_port_misconf_event_msg[] = { 392 "Physical Link is functional.", 393 "Optics faulted/incorrectly installed/not installed - Reseat optics, if issue not resolved, replace.", 394 "Optics of two types installed - Remove one optic or install matching pair of optics.", 395 "Incompatible optics - Replace with compatible optics for card to function.", 396 "Unqualified optics - Replace with Avago optics for Warranty and Technical Support.", 397 "Uncertified optics - Replace with Avago Certified optics to enable link operation." 398 }; 399 400 static void beiscsi_process_async_sli(struct beiscsi_hba *phba, 401 struct be_mcc_compl *compl) 402 { 403 struct be_async_event_sli *async_sli; 404 u8 evt_type, state, old_state, le; 405 char *sev = KERN_WARNING; 406 char *msg = NULL; 407 408 evt_type = compl->flags >> ASYNC_TRAILER_EVENT_TYPE_SHIFT; 409 evt_type &= ASYNC_TRAILER_EVENT_TYPE_MASK; 410 411 /* processing only MISCONFIGURED physical port event */ 412 if (evt_type != ASYNC_SLI_EVENT_TYPE_MISCONFIGURED) 413 return; 414 415 async_sli = (struct be_async_event_sli *)compl; 416 state = async_sli->event_data1 >> 417 (phba->fw_config.phys_port * 8) & 0xff; 418 le = async_sli->event_data2 >> 419 (phba->fw_config.phys_port * 8) & 0xff; 420 421 old_state = phba->optic_state; 422 phba->optic_state = state; 423 424 if (state >= ARRAY_SIZE(beiscsi_port_misconf_event_msg)) { 425 /* fw is reporting a state we don't know, log and return */ 426 __beiscsi_log(phba, KERN_ERR, 427 "BC_%d : Port %c: Unrecognized optic state 0x%x\n", 428 phba->port_name, async_sli->event_data1); 429 return; 430 } 431 432 if (ASYNC_SLI_LINK_EFFECT_VALID(le)) { 433 /* log link effect for unqualified-4, uncertified-5 optics */ 434 if (state > 3) 435 msg = (ASYNC_SLI_LINK_EFFECT_STATE(le)) ? 436 " Link is non-operational." : 437 " Link is operational."; 438 /* 1 - info */ 439 if (ASYNC_SLI_LINK_EFFECT_SEV(le) == 1) 440 sev = KERN_INFO; 441 /* 2 - error */ 442 if (ASYNC_SLI_LINK_EFFECT_SEV(le) == 2) 443 sev = KERN_ERR; 444 } 445 446 if (old_state != phba->optic_state) 447 __beiscsi_log(phba, sev, "BC_%d : Port %c: %s%s\n", 448 phba->port_name, 449 beiscsi_port_misconf_event_msg[state], 450 !msg ? "" : msg); 451 } 452 453 void beiscsi_process_async_event(struct beiscsi_hba *phba, 454 struct be_mcc_compl *compl) 455 { 456 char *sev = KERN_INFO; 457 u8 evt_code; 458 459 /* interpret flags as an async trailer */ 460 evt_code = compl->flags >> ASYNC_TRAILER_EVENT_CODE_SHIFT; 461 evt_code &= ASYNC_TRAILER_EVENT_CODE_MASK; 462 switch (evt_code) { 463 case ASYNC_EVENT_CODE_LINK_STATE: 464 beiscsi_process_async_link(phba, compl); 465 break; 466 case ASYNC_EVENT_CODE_ISCSI: 467 if (test_bit(BEISCSI_HBA_BOOT_FOUND, &phba->state)) 468 beiscsi_start_boot_work(phba, BE_BOOT_INVALID_SHANDLE); 469 sev = KERN_ERR; 470 break; 471 case ASYNC_EVENT_CODE_SLI: 472 beiscsi_process_async_sli(phba, compl); 473 break; 474 default: 475 /* event not registered */ 476 sev = KERN_ERR; 477 } 478 479 beiscsi_log(phba, sev, BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX, 480 "BC_%d : ASYNC Event %x: status 0x%08x flags 0x%08x\n", 481 evt_code, compl->status, compl->flags); 482 } 483 484 int beiscsi_process_mcc_compl(struct be_ctrl_info *ctrl, 485 struct be_mcc_compl *compl) 486 { 487 struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev); 488 u16 compl_status, extd_status; 489 struct be_dma_mem *tag_mem; 490 unsigned int tag, wrb_idx; 491 492 be_dws_le_to_cpu(compl, 4); 493 tag = (compl->tag0 & MCC_Q_CMD_TAG_MASK); 494 wrb_idx = (compl->tag0 & CQE_STATUS_WRB_MASK) >> CQE_STATUS_WRB_SHIFT; 495 496 if (!test_bit(MCC_TAG_STATE_RUNNING, 497 &ctrl->ptag_state[tag].tag_state)) { 498 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_MBOX | 499 BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG, 500 "BC_%d : MBX cmd completed but not posted\n"); 501 return 0; 502 } 503 504 /* end MCC with this tag */ 505 clear_bit(MCC_TAG_STATE_RUNNING, &ctrl->ptag_state[tag].tag_state); 506 507 if (test_bit(MCC_TAG_STATE_TIMEOUT, &ctrl->ptag_state[tag].tag_state)) { 508 beiscsi_log(phba, KERN_WARNING, 509 BEISCSI_LOG_MBOX | BEISCSI_LOG_INIT | 510 BEISCSI_LOG_CONFIG, 511 "BC_%d : MBX Completion for timeout Command from FW\n"); 512 /** 513 * Check for the size before freeing resource. 514 * Only for non-embedded cmd, PCI resource is allocated. 515 **/ 516 tag_mem = &ctrl->ptag_state[tag].tag_mem_state; 517 if (tag_mem->size) { 518 dma_free_coherent(&ctrl->pdev->dev, tag_mem->size, 519 tag_mem->va, tag_mem->dma); 520 tag_mem->size = 0; 521 } 522 free_mcc_wrb(ctrl, tag); 523 return 0; 524 } 525 526 compl_status = (compl->status >> CQE_STATUS_COMPL_SHIFT) & 527 CQE_STATUS_COMPL_MASK; 528 extd_status = (compl->status >> CQE_STATUS_EXTD_SHIFT) & 529 CQE_STATUS_EXTD_MASK; 530 /* The ctrl.mcc_tag_status[tag] is filled with 531 * [31] = valid, [30:24] = Rsvd, [23:16] = wrb, [15:8] = extd_status, 532 * [7:0] = compl_status 533 */ 534 ctrl->mcc_tag_status[tag] = CQE_VALID_MASK; 535 ctrl->mcc_tag_status[tag] |= (wrb_idx << CQE_STATUS_WRB_SHIFT); 536 ctrl->mcc_tag_status[tag] |= (extd_status << CQE_STATUS_ADDL_SHIFT) & 537 CQE_STATUS_ADDL_MASK; 538 ctrl->mcc_tag_status[tag] |= (compl_status & CQE_STATUS_MASK); 539 540 if (test_bit(MCC_TAG_STATE_ASYNC, &ctrl->ptag_state[tag].tag_state)) { 541 if (ctrl->ptag_state[tag].cbfn) 542 ctrl->ptag_state[tag].cbfn(phba, tag); 543 else 544 __beiscsi_log(phba, KERN_ERR, 545 "BC_%d : MBX ASYNC command with no callback\n"); 546 free_mcc_wrb(ctrl, tag); 547 return 0; 548 } 549 550 if (test_bit(MCC_TAG_STATE_IGNORE, &ctrl->ptag_state[tag].tag_state)) { 551 /* just check completion status and free wrb */ 552 __beiscsi_mcc_compl_status(phba, tag, NULL, NULL); 553 free_mcc_wrb(ctrl, tag); 554 return 0; 555 } 556 557 wake_up_interruptible(&ctrl->mcc_wait[tag]); 558 return 0; 559 } 560 561 void be_mcc_notify(struct beiscsi_hba *phba, unsigned int tag) 562 { 563 struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q; 564 u32 val = 0; 565 566 set_bit(MCC_TAG_STATE_RUNNING, &phba->ctrl.ptag_state[tag].tag_state); 567 val |= mccq->id & DB_MCCQ_RING_ID_MASK; 568 val |= 1 << DB_MCCQ_NUM_POSTED_SHIFT; 569 /* make request available for DMA */ 570 wmb(); 571 iowrite32(val, phba->db_va + DB_MCCQ_OFFSET); 572 } 573 574 /* 575 * be_mbox_db_ready_poll()- Check ready status 576 * @ctrl: Function specific MBX data structure 577 * 578 * Check for the ready status of FW to send BMBX 579 * commands to adapter. 580 * 581 * return 582 * Success: 0 583 * Failure: Non-Zero 584 **/ 585 static int be_mbox_db_ready_poll(struct be_ctrl_info *ctrl) 586 { 587 /* wait 30s for generic non-flash MBOX operation */ 588 #define BEISCSI_MBX_RDY_BIT_TIMEOUT 30000 589 void __iomem *db = ctrl->db + MPU_MAILBOX_DB_OFFSET; 590 struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev); 591 unsigned long timeout; 592 u32 ready; 593 594 /* 595 * This BMBX busy wait path is used during init only. 596 * For the commands executed during init, 5s should suffice. 597 */ 598 timeout = jiffies + msecs_to_jiffies(BEISCSI_MBX_RDY_BIT_TIMEOUT); 599 do { 600 if (beiscsi_hba_in_error(phba)) 601 return -EIO; 602 603 ready = ioread32(db); 604 if (ready == 0xffffffff) 605 return -EIO; 606 607 ready &= MPU_MAILBOX_DB_RDY_MASK; 608 if (ready) 609 return 0; 610 611 if (time_after(jiffies, timeout)) 612 break; 613 /* 1ms sleep is enough in most cases */ 614 schedule_timeout_uninterruptible(msecs_to_jiffies(1)); 615 } while (!ready); 616 617 beiscsi_log(phba, KERN_ERR, 618 BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX, 619 "BC_%d : FW Timed Out\n"); 620 set_bit(BEISCSI_HBA_FW_TIMEOUT, &phba->state); 621 return -EBUSY; 622 } 623 624 /* 625 * be_mbox_notify: Notify adapter of new BMBX command 626 * @ctrl: Function specific MBX data structure 627 * 628 * Ring doorbell to inform adapter of a BMBX command 629 * to process 630 * 631 * return 632 * Success: 0 633 * Failure: Non-Zero 634 **/ 635 static int be_mbox_notify(struct be_ctrl_info *ctrl) 636 { 637 int status; 638 u32 val = 0; 639 void __iomem *db = ctrl->db + MPU_MAILBOX_DB_OFFSET; 640 struct be_dma_mem *mbox_mem = &ctrl->mbox_mem; 641 struct be_mcc_mailbox *mbox = mbox_mem->va; 642 643 status = be_mbox_db_ready_poll(ctrl); 644 if (status) 645 return status; 646 647 val &= ~MPU_MAILBOX_DB_RDY_MASK; 648 val |= MPU_MAILBOX_DB_HI_MASK; 649 val |= (upper_32_bits(mbox_mem->dma) >> 2) << 2; 650 iowrite32(val, db); 651 652 status = be_mbox_db_ready_poll(ctrl); 653 if (status) 654 return status; 655 656 val = 0; 657 val &= ~MPU_MAILBOX_DB_RDY_MASK; 658 val &= ~MPU_MAILBOX_DB_HI_MASK; 659 val |= (u32) (mbox_mem->dma >> 4) << 2; 660 iowrite32(val, db); 661 662 status = be_mbox_db_ready_poll(ctrl); 663 if (status) 664 return status; 665 666 /* RDY is set; small delay before CQE read. */ 667 udelay(1); 668 669 status = beiscsi_process_mbox_compl(ctrl, &mbox->compl); 670 return status; 671 } 672 673 void be_wrb_hdr_prepare(struct be_mcc_wrb *wrb, u32 payload_len, 674 bool embedded, u8 sge_cnt) 675 { 676 if (embedded) 677 wrb->emb_sgecnt_special |= MCC_WRB_EMBEDDED_MASK; 678 else 679 wrb->emb_sgecnt_special |= (sge_cnt & MCC_WRB_SGE_CNT_MASK) << 680 MCC_WRB_SGE_CNT_SHIFT; 681 wrb->payload_length = payload_len; 682 be_dws_cpu_to_le(wrb, 8); 683 } 684 685 void be_cmd_hdr_prepare(struct be_cmd_req_hdr *req_hdr, 686 u8 subsystem, u8 opcode, u32 cmd_len) 687 { 688 req_hdr->opcode = opcode; 689 req_hdr->subsystem = subsystem; 690 req_hdr->request_length = cpu_to_le32(cmd_len - sizeof(*req_hdr)); 691 req_hdr->timeout = BEISCSI_FW_MBX_TIMEOUT; 692 } 693 694 static void be_cmd_page_addrs_prepare(struct phys_addr *pages, u32 max_pages, 695 struct be_dma_mem *mem) 696 { 697 int i, buf_pages; 698 u64 dma = (u64) mem->dma; 699 700 buf_pages = min(PAGES_4K_SPANNED(mem->va, mem->size), max_pages); 701 for (i = 0; i < buf_pages; i++) { 702 pages[i].lo = cpu_to_le32(dma & 0xFFFFFFFF); 703 pages[i].hi = cpu_to_le32(upper_32_bits(dma)); 704 dma += PAGE_SIZE_4K; 705 } 706 } 707 708 static u32 eq_delay_to_mult(u32 usec_delay) 709 { 710 #define MAX_INTR_RATE 651042 711 const u32 round = 10; 712 u32 multiplier; 713 714 if (usec_delay == 0) 715 multiplier = 0; 716 else { 717 u32 interrupt_rate = 1000000 / usec_delay; 718 if (interrupt_rate == 0) 719 multiplier = 1023; 720 else { 721 multiplier = (MAX_INTR_RATE - interrupt_rate) * round; 722 multiplier /= interrupt_rate; 723 multiplier = (multiplier + round / 2) / round; 724 multiplier = min(multiplier, (u32) 1023); 725 } 726 } 727 return multiplier; 728 } 729 730 struct be_mcc_wrb *wrb_from_mbox(struct be_dma_mem *mbox_mem) 731 { 732 return &((struct be_mcc_mailbox *)(mbox_mem->va))->wrb; 733 } 734 735 int beiscsi_cmd_eq_create(struct be_ctrl_info *ctrl, 736 struct be_queue_info *eq, int eq_delay) 737 { 738 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); 739 struct be_cmd_req_eq_create *req = embedded_payload(wrb); 740 struct be_cmd_resp_eq_create *resp = embedded_payload(wrb); 741 struct be_dma_mem *q_mem = &eq->dma_mem; 742 int status; 743 744 mutex_lock(&ctrl->mbox_lock); 745 memset(wrb, 0, sizeof(*wrb)); 746 747 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 748 749 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, 750 OPCODE_COMMON_EQ_CREATE, sizeof(*req)); 751 752 req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size)); 753 754 AMAP_SET_BITS(struct amap_eq_context, func, req->context, 755 PCI_FUNC(ctrl->pdev->devfn)); 756 AMAP_SET_BITS(struct amap_eq_context, valid, req->context, 1); 757 AMAP_SET_BITS(struct amap_eq_context, size, req->context, 0); 758 AMAP_SET_BITS(struct amap_eq_context, count, req->context, 759 __ilog2_u32(eq->len / 256)); 760 AMAP_SET_BITS(struct amap_eq_context, delaymult, req->context, 761 eq_delay_to_mult(eq_delay)); 762 be_dws_cpu_to_le(req->context, sizeof(req->context)); 763 764 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); 765 766 status = be_mbox_notify(ctrl); 767 if (!status) { 768 eq->id = le16_to_cpu(resp->eq_id); 769 eq->created = true; 770 } 771 mutex_unlock(&ctrl->mbox_lock); 772 return status; 773 } 774 775 int beiscsi_cmd_cq_create(struct be_ctrl_info *ctrl, 776 struct be_queue_info *cq, struct be_queue_info *eq, 777 bool sol_evts, bool no_delay, int coalesce_wm) 778 { 779 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); 780 struct be_cmd_req_cq_create *req = embedded_payload(wrb); 781 struct be_cmd_resp_cq_create *resp = embedded_payload(wrb); 782 struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev); 783 struct be_dma_mem *q_mem = &cq->dma_mem; 784 void *ctxt = &req->context; 785 int status; 786 787 mutex_lock(&ctrl->mbox_lock); 788 memset(wrb, 0, sizeof(*wrb)); 789 790 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 791 792 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, 793 OPCODE_COMMON_CQ_CREATE, sizeof(*req)); 794 795 req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size)); 796 if (is_chip_be2_be3r(phba)) { 797 AMAP_SET_BITS(struct amap_cq_context, coalescwm, 798 ctxt, coalesce_wm); 799 AMAP_SET_BITS(struct amap_cq_context, nodelay, ctxt, no_delay); 800 AMAP_SET_BITS(struct amap_cq_context, count, ctxt, 801 __ilog2_u32(cq->len / 256)); 802 AMAP_SET_BITS(struct amap_cq_context, valid, ctxt, 1); 803 AMAP_SET_BITS(struct amap_cq_context, solevent, ctxt, sol_evts); 804 AMAP_SET_BITS(struct amap_cq_context, eventable, ctxt, 1); 805 AMAP_SET_BITS(struct amap_cq_context, eqid, ctxt, eq->id); 806 AMAP_SET_BITS(struct amap_cq_context, armed, ctxt, 1); 807 AMAP_SET_BITS(struct amap_cq_context, func, ctxt, 808 PCI_FUNC(ctrl->pdev->devfn)); 809 } else { 810 req->hdr.version = MBX_CMD_VER2; 811 req->page_size = 1; 812 AMAP_SET_BITS(struct amap_cq_context_v2, coalescwm, 813 ctxt, coalesce_wm); 814 AMAP_SET_BITS(struct amap_cq_context_v2, nodelay, 815 ctxt, no_delay); 816 AMAP_SET_BITS(struct amap_cq_context_v2, count, ctxt, 817 __ilog2_u32(cq->len / 256)); 818 AMAP_SET_BITS(struct amap_cq_context_v2, valid, ctxt, 1); 819 AMAP_SET_BITS(struct amap_cq_context_v2, eventable, ctxt, 1); 820 AMAP_SET_BITS(struct amap_cq_context_v2, eqid, ctxt, eq->id); 821 AMAP_SET_BITS(struct amap_cq_context_v2, armed, ctxt, 1); 822 } 823 824 be_dws_cpu_to_le(ctxt, sizeof(req->context)); 825 826 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); 827 828 status = be_mbox_notify(ctrl); 829 if (!status) { 830 cq->id = le16_to_cpu(resp->cq_id); 831 cq->created = true; 832 } else 833 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, 834 "BC_%d : In be_cmd_cq_create, status=ox%08x\n", 835 status); 836 837 mutex_unlock(&ctrl->mbox_lock); 838 839 return status; 840 } 841 842 static u32 be_encoded_q_len(int q_len) 843 { 844 u32 len_encoded = fls(q_len); /* log2(len) + 1 */ 845 if (len_encoded == 16) 846 len_encoded = 0; 847 return len_encoded; 848 } 849 850 int beiscsi_cmd_mccq_create(struct beiscsi_hba *phba, 851 struct be_queue_info *mccq, 852 struct be_queue_info *cq) 853 { 854 struct be_mcc_wrb *wrb; 855 struct be_cmd_req_mcc_create_ext *req; 856 struct be_dma_mem *q_mem = &mccq->dma_mem; 857 struct be_ctrl_info *ctrl; 858 void *ctxt; 859 int status; 860 861 mutex_lock(&phba->ctrl.mbox_lock); 862 ctrl = &phba->ctrl; 863 wrb = wrb_from_mbox(&ctrl->mbox_mem); 864 memset(wrb, 0, sizeof(*wrb)); 865 req = embedded_payload(wrb); 866 ctxt = &req->context; 867 868 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 869 870 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, 871 OPCODE_COMMON_MCC_CREATE_EXT, sizeof(*req)); 872 873 req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size); 874 req->async_evt_bitmap = 1 << ASYNC_EVENT_CODE_LINK_STATE; 875 req->async_evt_bitmap |= 1 << ASYNC_EVENT_CODE_ISCSI; 876 req->async_evt_bitmap |= 1 << ASYNC_EVENT_CODE_SLI; 877 878 AMAP_SET_BITS(struct amap_mcc_context, fid, ctxt, 879 PCI_FUNC(phba->pcidev->devfn)); 880 AMAP_SET_BITS(struct amap_mcc_context, valid, ctxt, 1); 881 AMAP_SET_BITS(struct amap_mcc_context, ring_size, ctxt, 882 be_encoded_q_len(mccq->len)); 883 AMAP_SET_BITS(struct amap_mcc_context, cq_id, ctxt, cq->id); 884 885 be_dws_cpu_to_le(ctxt, sizeof(req->context)); 886 887 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); 888 889 status = be_mbox_notify(ctrl); 890 if (!status) { 891 struct be_cmd_resp_mcc_create *resp = embedded_payload(wrb); 892 mccq->id = le16_to_cpu(resp->id); 893 mccq->created = true; 894 } 895 mutex_unlock(&phba->ctrl.mbox_lock); 896 897 return status; 898 } 899 900 int beiscsi_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q, 901 int queue_type) 902 { 903 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); 904 struct be_cmd_req_q_destroy *req = embedded_payload(wrb); 905 struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev); 906 u8 subsys = 0, opcode = 0; 907 int status; 908 909 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, 910 "BC_%d : In beiscsi_cmd_q_destroy " 911 "queue_type : %d\n", queue_type); 912 913 mutex_lock(&ctrl->mbox_lock); 914 memset(wrb, 0, sizeof(*wrb)); 915 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 916 917 switch (queue_type) { 918 case QTYPE_EQ: 919 subsys = CMD_SUBSYSTEM_COMMON; 920 opcode = OPCODE_COMMON_EQ_DESTROY; 921 break; 922 case QTYPE_CQ: 923 subsys = CMD_SUBSYSTEM_COMMON; 924 opcode = OPCODE_COMMON_CQ_DESTROY; 925 break; 926 case QTYPE_MCCQ: 927 subsys = CMD_SUBSYSTEM_COMMON; 928 opcode = OPCODE_COMMON_MCC_DESTROY; 929 break; 930 case QTYPE_WRBQ: 931 subsys = CMD_SUBSYSTEM_ISCSI; 932 opcode = OPCODE_COMMON_ISCSI_WRBQ_DESTROY; 933 break; 934 case QTYPE_DPDUQ: 935 subsys = CMD_SUBSYSTEM_ISCSI; 936 opcode = OPCODE_COMMON_ISCSI_DEFQ_DESTROY; 937 break; 938 case QTYPE_SGL: 939 subsys = CMD_SUBSYSTEM_ISCSI; 940 opcode = OPCODE_COMMON_ISCSI_CFG_REMOVE_SGL_PAGES; 941 break; 942 default: 943 mutex_unlock(&ctrl->mbox_lock); 944 BUG(); 945 } 946 be_cmd_hdr_prepare(&req->hdr, subsys, opcode, sizeof(*req)); 947 if (queue_type != QTYPE_SGL) 948 req->id = cpu_to_le16(q->id); 949 950 status = be_mbox_notify(ctrl); 951 952 mutex_unlock(&ctrl->mbox_lock); 953 return status; 954 } 955 956 /** 957 * be_cmd_create_default_pdu_queue()- Create DEFQ for the adapter 958 * @ctrl: ptr to ctrl_info 959 * @cq: Completion Queue 960 * @dq: Default Queue 961 * @length: ring size 962 * @entry_size: size of each entry in DEFQ 963 * @is_header: Header or Data DEFQ 964 * @ulp_num: Bind to which ULP 965 * 966 * Create HDR/Data DEFQ for the passed ULP. Unsol PDU are posted 967 * on this queue by the FW 968 * 969 * return 970 * Success: 0 971 * Failure: Non-Zero Value 972 * 973 **/ 974 int be_cmd_create_default_pdu_queue(struct be_ctrl_info *ctrl, 975 struct be_queue_info *cq, 976 struct be_queue_info *dq, int length, 977 int entry_size, uint8_t is_header, 978 uint8_t ulp_num) 979 { 980 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); 981 struct be_defq_create_req *req = embedded_payload(wrb); 982 struct be_dma_mem *q_mem = &dq->dma_mem; 983 struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev); 984 void *ctxt = &req->context; 985 int status; 986 987 mutex_lock(&ctrl->mbox_lock); 988 memset(wrb, 0, sizeof(*wrb)); 989 990 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 991 992 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI, 993 OPCODE_COMMON_ISCSI_DEFQ_CREATE, sizeof(*req)); 994 995 req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size); 996 if (phba->fw_config.dual_ulp_aware) { 997 req->ulp_num = ulp_num; 998 req->dua_feature |= (1 << BEISCSI_DUAL_ULP_AWARE_BIT); 999 req->dua_feature |= (1 << BEISCSI_BIND_Q_TO_ULP_BIT); 1000 } 1001 1002 if (is_chip_be2_be3r(phba)) { 1003 AMAP_SET_BITS(struct amap_be_default_pdu_context, 1004 rx_pdid, ctxt, 0); 1005 AMAP_SET_BITS(struct amap_be_default_pdu_context, 1006 rx_pdid_valid, ctxt, 1); 1007 AMAP_SET_BITS(struct amap_be_default_pdu_context, 1008 pci_func_id, ctxt, PCI_FUNC(ctrl->pdev->devfn)); 1009 AMAP_SET_BITS(struct amap_be_default_pdu_context, 1010 ring_size, ctxt, 1011 be_encoded_q_len(length / 1012 sizeof(struct phys_addr))); 1013 AMAP_SET_BITS(struct amap_be_default_pdu_context, 1014 default_buffer_size, ctxt, entry_size); 1015 AMAP_SET_BITS(struct amap_be_default_pdu_context, 1016 cq_id_recv, ctxt, cq->id); 1017 } else { 1018 AMAP_SET_BITS(struct amap_default_pdu_context_ext, 1019 rx_pdid, ctxt, 0); 1020 AMAP_SET_BITS(struct amap_default_pdu_context_ext, 1021 rx_pdid_valid, ctxt, 1); 1022 AMAP_SET_BITS(struct amap_default_pdu_context_ext, 1023 ring_size, ctxt, 1024 be_encoded_q_len(length / 1025 sizeof(struct phys_addr))); 1026 AMAP_SET_BITS(struct amap_default_pdu_context_ext, 1027 default_buffer_size, ctxt, entry_size); 1028 AMAP_SET_BITS(struct amap_default_pdu_context_ext, 1029 cq_id_recv, ctxt, cq->id); 1030 } 1031 1032 be_dws_cpu_to_le(ctxt, sizeof(req->context)); 1033 1034 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); 1035 1036 status = be_mbox_notify(ctrl); 1037 if (!status) { 1038 struct be_ring *defq_ring; 1039 struct be_defq_create_resp *resp = embedded_payload(wrb); 1040 1041 dq->id = le16_to_cpu(resp->id); 1042 dq->created = true; 1043 if (is_header) 1044 defq_ring = &phba->phwi_ctrlr->default_pdu_hdr[ulp_num]; 1045 else 1046 defq_ring = &phba->phwi_ctrlr-> 1047 default_pdu_data[ulp_num]; 1048 1049 defq_ring->id = dq->id; 1050 1051 if (!phba->fw_config.dual_ulp_aware) { 1052 defq_ring->ulp_num = BEISCSI_ULP0; 1053 defq_ring->doorbell_offset = DB_RXULP0_OFFSET; 1054 } else { 1055 defq_ring->ulp_num = resp->ulp_num; 1056 defq_ring->doorbell_offset = resp->doorbell_offset; 1057 } 1058 } 1059 mutex_unlock(&ctrl->mbox_lock); 1060 1061 return status; 1062 } 1063 1064 /** 1065 * be_cmd_wrbq_create()- Create WRBQ 1066 * @ctrl: ptr to ctrl_info 1067 * @q_mem: memory details for the queue 1068 * @wrbq: queue info 1069 * @pwrb_context: ptr to wrb_context 1070 * @ulp_num: ULP on which the WRBQ is to be created 1071 * 1072 * Create WRBQ on the passed ULP_NUM. 1073 * 1074 **/ 1075 int be_cmd_wrbq_create(struct be_ctrl_info *ctrl, 1076 struct be_dma_mem *q_mem, 1077 struct be_queue_info *wrbq, 1078 struct hwi_wrb_context *pwrb_context, 1079 uint8_t ulp_num) 1080 { 1081 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); 1082 struct be_wrbq_create_req *req = embedded_payload(wrb); 1083 struct be_wrbq_create_resp *resp = embedded_payload(wrb); 1084 struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev); 1085 int status; 1086 1087 mutex_lock(&ctrl->mbox_lock); 1088 memset(wrb, 0, sizeof(*wrb)); 1089 1090 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 1091 1092 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI, 1093 OPCODE_COMMON_ISCSI_WRBQ_CREATE, sizeof(*req)); 1094 req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size); 1095 1096 if (phba->fw_config.dual_ulp_aware) { 1097 req->ulp_num = ulp_num; 1098 req->dua_feature |= (1 << BEISCSI_DUAL_ULP_AWARE_BIT); 1099 req->dua_feature |= (1 << BEISCSI_BIND_Q_TO_ULP_BIT); 1100 } 1101 1102 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); 1103 1104 status = be_mbox_notify(ctrl); 1105 if (!status) { 1106 wrbq->id = le16_to_cpu(resp->cid); 1107 wrbq->created = true; 1108 1109 pwrb_context->cid = wrbq->id; 1110 if (!phba->fw_config.dual_ulp_aware) { 1111 pwrb_context->doorbell_offset = DB_TXULP0_OFFSET; 1112 pwrb_context->ulp_num = BEISCSI_ULP0; 1113 } else { 1114 pwrb_context->ulp_num = resp->ulp_num; 1115 pwrb_context->doorbell_offset = resp->doorbell_offset; 1116 } 1117 } 1118 mutex_unlock(&ctrl->mbox_lock); 1119 return status; 1120 } 1121 1122 int be_cmd_iscsi_post_template_hdr(struct be_ctrl_info *ctrl, 1123 struct be_dma_mem *q_mem) 1124 { 1125 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); 1126 struct be_post_template_pages_req *req = embedded_payload(wrb); 1127 int status; 1128 1129 mutex_lock(&ctrl->mbox_lock); 1130 1131 memset(wrb, 0, sizeof(*wrb)); 1132 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 1133 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, 1134 OPCODE_COMMON_ADD_TEMPLATE_HEADER_BUFFERS, 1135 sizeof(*req)); 1136 1137 req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size); 1138 req->type = BEISCSI_TEMPLATE_HDR_TYPE_ISCSI; 1139 be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); 1140 1141 status = be_mbox_notify(ctrl); 1142 mutex_unlock(&ctrl->mbox_lock); 1143 return status; 1144 } 1145 1146 int be_cmd_iscsi_remove_template_hdr(struct be_ctrl_info *ctrl) 1147 { 1148 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); 1149 struct be_remove_template_pages_req *req = embedded_payload(wrb); 1150 int status; 1151 1152 mutex_lock(&ctrl->mbox_lock); 1153 1154 memset(wrb, 0, sizeof(*wrb)); 1155 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 1156 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, 1157 OPCODE_COMMON_REMOVE_TEMPLATE_HEADER_BUFFERS, 1158 sizeof(*req)); 1159 1160 req->type = BEISCSI_TEMPLATE_HDR_TYPE_ISCSI; 1161 1162 status = be_mbox_notify(ctrl); 1163 mutex_unlock(&ctrl->mbox_lock); 1164 return status; 1165 } 1166 1167 int be_cmd_iscsi_post_sgl_pages(struct be_ctrl_info *ctrl, 1168 struct be_dma_mem *q_mem, 1169 u32 page_offset, u32 num_pages) 1170 { 1171 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); 1172 struct be_post_sgl_pages_req *req = embedded_payload(wrb); 1173 struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev); 1174 int status; 1175 unsigned int curr_pages; 1176 u32 temp_num_pages = num_pages; 1177 1178 if (num_pages == 0xff) 1179 num_pages = 1; 1180 1181 mutex_lock(&ctrl->mbox_lock); 1182 do { 1183 memset(wrb, 0, sizeof(*wrb)); 1184 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 1185 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI, 1186 OPCODE_COMMON_ISCSI_CFG_POST_SGL_PAGES, 1187 sizeof(*req)); 1188 curr_pages = BE_NUMBER_OF_FIELD(struct be_post_sgl_pages_req, 1189 pages); 1190 req->num_pages = min(num_pages, curr_pages); 1191 req->page_offset = page_offset; 1192 be_cmd_page_addrs_prepare(req->pages, req->num_pages, q_mem); 1193 q_mem->dma = q_mem->dma + (req->num_pages * PAGE_SIZE); 1194 page_offset += req->num_pages; 1195 num_pages -= req->num_pages; 1196 1197 if (temp_num_pages == 0xff) 1198 req->num_pages = temp_num_pages; 1199 1200 status = be_mbox_notify(ctrl); 1201 if (status) { 1202 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, 1203 "BC_%d : FW CMD to map iscsi frags failed.\n"); 1204 1205 goto error; 1206 } 1207 } while (num_pages > 0); 1208 error: 1209 mutex_unlock(&ctrl->mbox_lock); 1210 if (status != 0) 1211 beiscsi_cmd_q_destroy(ctrl, NULL, QTYPE_SGL); 1212 return status; 1213 } 1214 1215 /** 1216 * be_cmd_set_vlan()- Configure VLAN paramters on the adapter 1217 * @phba: device priv structure instance 1218 * @vlan_tag: TAG to be set 1219 * 1220 * Set the VLAN_TAG for the adapter or Disable VLAN on adapter 1221 * 1222 * returns 1223 * TAG for the MBX Cmd 1224 * **/ 1225 int be_cmd_set_vlan(struct beiscsi_hba *phba, 1226 uint16_t vlan_tag) 1227 { 1228 unsigned int tag; 1229 struct be_mcc_wrb *wrb; 1230 struct be_cmd_set_vlan_req *req; 1231 struct be_ctrl_info *ctrl = &phba->ctrl; 1232 1233 if (mutex_lock_interruptible(&ctrl->mbox_lock)) 1234 return 0; 1235 wrb = alloc_mcc_wrb(phba, &tag); 1236 if (!wrb) { 1237 mutex_unlock(&ctrl->mbox_lock); 1238 return 0; 1239 } 1240 1241 req = embedded_payload(wrb); 1242 be_wrb_hdr_prepare(wrb, sizeof(*wrb), true, 0); 1243 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI, 1244 OPCODE_COMMON_ISCSI_NTWK_SET_VLAN, 1245 sizeof(*req)); 1246 1247 req->interface_hndl = phba->interface_handle; 1248 req->vlan_priority = vlan_tag; 1249 1250 be_mcc_notify(phba, tag); 1251 mutex_unlock(&ctrl->mbox_lock); 1252 1253 return tag; 1254 } 1255 1256 int beiscsi_check_supported_fw(struct be_ctrl_info *ctrl, 1257 struct beiscsi_hba *phba) 1258 { 1259 struct be_dma_mem nonemb_cmd; 1260 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); 1261 struct be_mgmt_controller_attributes *req; 1262 struct be_sge *sge = nonembedded_sgl(wrb); 1263 int status = 0; 1264 1265 nonemb_cmd.va = dma_alloc_coherent(&ctrl->pdev->dev, 1266 sizeof(struct be_mgmt_controller_attributes), 1267 &nonemb_cmd.dma, GFP_KERNEL); 1268 if (nonemb_cmd.va == NULL) { 1269 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, 1270 "BG_%d : dma_alloc_coherent failed in %s\n", 1271 __func__); 1272 return -ENOMEM; 1273 } 1274 nonemb_cmd.size = sizeof(struct be_mgmt_controller_attributes); 1275 req = nonemb_cmd.va; 1276 memset(req, 0, sizeof(*req)); 1277 mutex_lock(&ctrl->mbox_lock); 1278 memset(wrb, 0, sizeof(*wrb)); 1279 be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1); 1280 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, 1281 OPCODE_COMMON_GET_CNTL_ATTRIBUTES, sizeof(*req)); 1282 sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd.dma)); 1283 sge->pa_lo = cpu_to_le32(nonemb_cmd.dma & 0xFFFFFFFF); 1284 sge->len = cpu_to_le32(nonemb_cmd.size); 1285 status = be_mbox_notify(ctrl); 1286 if (!status) { 1287 struct be_mgmt_controller_attributes_resp *resp = nonemb_cmd.va; 1288 1289 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, 1290 "BG_%d : Firmware Version of CMD : %s\n" 1291 "Firmware Version is : %s\n" 1292 "Developer Build, not performing version check...\n", 1293 resp->params.hba_attribs 1294 .flashrom_version_string, 1295 resp->params.hba_attribs. 1296 firmware_version_string); 1297 1298 phba->fw_config.iscsi_features = 1299 resp->params.hba_attribs.iscsi_features; 1300 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, 1301 "BM_%d : phba->fw_config.iscsi_features = %d\n", 1302 phba->fw_config.iscsi_features); 1303 memcpy(phba->fw_ver_str, resp->params.hba_attribs. 1304 firmware_version_string, BEISCSI_VER_STRLEN); 1305 } else 1306 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, 1307 "BG_%d : Failed in beiscsi_check_supported_fw\n"); 1308 mutex_unlock(&ctrl->mbox_lock); 1309 if (nonemb_cmd.va) 1310 dma_free_coherent(&ctrl->pdev->dev, nonemb_cmd.size, 1311 nonemb_cmd.va, nonemb_cmd.dma); 1312 1313 return status; 1314 } 1315 1316 /** 1317 * beiscsi_get_fw_config()- Get the FW config for the function 1318 * @ctrl: ptr to Ctrl Info 1319 * @phba: ptr to the dev priv structure 1320 * 1321 * Get the FW config and resources available for the function. 1322 * The resources are created based on the count received here. 1323 * 1324 * return 1325 * Success: 0 1326 * Failure: Non-Zero Value 1327 **/ 1328 int beiscsi_get_fw_config(struct be_ctrl_info *ctrl, 1329 struct beiscsi_hba *phba) 1330 { 1331 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); 1332 struct be_fw_cfg *pfw_cfg = embedded_payload(wrb); 1333 uint32_t cid_count, icd_count; 1334 int status = -EINVAL; 1335 uint8_t ulp_num = 0; 1336 1337 mutex_lock(&ctrl->mbox_lock); 1338 memset(wrb, 0, sizeof(*wrb)); 1339 be_wrb_hdr_prepare(wrb, sizeof(*pfw_cfg), true, 0); 1340 1341 be_cmd_hdr_prepare(&pfw_cfg->hdr, CMD_SUBSYSTEM_COMMON, 1342 OPCODE_COMMON_QUERY_FIRMWARE_CONFIG, 1343 EMBED_MBX_MAX_PAYLOAD_SIZE); 1344 1345 if (be_mbox_notify(ctrl)) { 1346 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, 1347 "BG_%d : Failed in beiscsi_get_fw_config\n"); 1348 goto fail_init; 1349 } 1350 1351 /* FW response formats depend on port id */ 1352 phba->fw_config.phys_port = pfw_cfg->phys_port; 1353 if (phba->fw_config.phys_port >= BEISCSI_PHYS_PORT_MAX) { 1354 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, 1355 "BG_%d : invalid physical port id %d\n", 1356 phba->fw_config.phys_port); 1357 goto fail_init; 1358 } 1359 1360 /* populate and check FW config against min and max values */ 1361 if (!is_chip_be2_be3r(phba)) { 1362 phba->fw_config.eqid_count = pfw_cfg->eqid_count; 1363 phba->fw_config.cqid_count = pfw_cfg->cqid_count; 1364 if (phba->fw_config.eqid_count == 0 || 1365 phba->fw_config.eqid_count > 2048) { 1366 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, 1367 "BG_%d : invalid EQ count %d\n", 1368 phba->fw_config.eqid_count); 1369 goto fail_init; 1370 } 1371 if (phba->fw_config.cqid_count == 0 || 1372 phba->fw_config.cqid_count > 4096) { 1373 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, 1374 "BG_%d : invalid CQ count %d\n", 1375 phba->fw_config.cqid_count); 1376 goto fail_init; 1377 } 1378 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, 1379 "BG_%d : EQ_Count : %d CQ_Count : %d\n", 1380 phba->fw_config.eqid_count, 1381 phba->fw_config.cqid_count); 1382 } 1383 1384 /** 1385 * Check on which all ULP iSCSI Protocol is loaded. 1386 * Set the Bit for those ULP. This set flag is used 1387 * at all places in the code to check on which ULP 1388 * iSCSi Protocol is loaded 1389 **/ 1390 for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++) { 1391 if (pfw_cfg->ulp[ulp_num].ulp_mode & 1392 BEISCSI_ULP_ISCSI_INI_MODE) { 1393 set_bit(ulp_num, &phba->fw_config.ulp_supported); 1394 1395 /* Get the CID, ICD and Chain count for each ULP */ 1396 phba->fw_config.iscsi_cid_start[ulp_num] = 1397 pfw_cfg->ulp[ulp_num].sq_base; 1398 phba->fw_config.iscsi_cid_count[ulp_num] = 1399 pfw_cfg->ulp[ulp_num].sq_count; 1400 1401 phba->fw_config.iscsi_icd_start[ulp_num] = 1402 pfw_cfg->ulp[ulp_num].icd_base; 1403 phba->fw_config.iscsi_icd_count[ulp_num] = 1404 pfw_cfg->ulp[ulp_num].icd_count; 1405 1406 phba->fw_config.iscsi_chain_start[ulp_num] = 1407 pfw_cfg->chain_icd[ulp_num].chain_base; 1408 phba->fw_config.iscsi_chain_count[ulp_num] = 1409 pfw_cfg->chain_icd[ulp_num].chain_count; 1410 1411 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, 1412 "BG_%d : Function loaded on ULP : %d\n" 1413 "\tiscsi_cid_count : %d\n" 1414 "\tiscsi_cid_start : %d\n" 1415 "\t iscsi_icd_count : %d\n" 1416 "\t iscsi_icd_start : %d\n", 1417 ulp_num, 1418 phba->fw_config. 1419 iscsi_cid_count[ulp_num], 1420 phba->fw_config. 1421 iscsi_cid_start[ulp_num], 1422 phba->fw_config. 1423 iscsi_icd_count[ulp_num], 1424 phba->fw_config. 1425 iscsi_icd_start[ulp_num]); 1426 } 1427 } 1428 1429 if (phba->fw_config.ulp_supported == 0) { 1430 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, 1431 "BG_%d : iSCSI initiator mode not set: ULP0 %x ULP1 %x\n", 1432 pfw_cfg->ulp[BEISCSI_ULP0].ulp_mode, 1433 pfw_cfg->ulp[BEISCSI_ULP1].ulp_mode); 1434 goto fail_init; 1435 } 1436 1437 /** 1438 * ICD is shared among ULPs. Use icd_count of any one loaded ULP 1439 **/ 1440 for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++) 1441 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) 1442 break; 1443 icd_count = phba->fw_config.iscsi_icd_count[ulp_num]; 1444 if (icd_count == 0 || icd_count > 65536) { 1445 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, 1446 "BG_%d: invalid ICD count %d\n", icd_count); 1447 goto fail_init; 1448 } 1449 1450 cid_count = BEISCSI_GET_CID_COUNT(phba, BEISCSI_ULP0) + 1451 BEISCSI_GET_CID_COUNT(phba, BEISCSI_ULP1); 1452 if (cid_count == 0 || cid_count > 4096) { 1453 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, 1454 "BG_%d: invalid CID count %d\n", cid_count); 1455 goto fail_init; 1456 } 1457 1458 /** 1459 * Check FW is dual ULP aware i.e. can handle either 1460 * of the protocols. 1461 */ 1462 phba->fw_config.dual_ulp_aware = (pfw_cfg->function_mode & 1463 BEISCSI_FUNC_DUA_MODE); 1464 1465 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, 1466 "BG_%d : DUA Mode : 0x%x\n", 1467 phba->fw_config.dual_ulp_aware); 1468 1469 /* all set, continue using this FW config */ 1470 status = 0; 1471 fail_init: 1472 mutex_unlock(&ctrl->mbox_lock); 1473 return status; 1474 } 1475 1476 /** 1477 * beiscsi_get_port_name()- Get port name for the function 1478 * @ctrl: ptr to Ctrl Info 1479 * @phba: ptr to the dev priv structure 1480 * 1481 * Get the alphanumeric character for port 1482 * 1483 **/ 1484 int beiscsi_get_port_name(struct be_ctrl_info *ctrl, struct beiscsi_hba *phba) 1485 { 1486 int ret = 0; 1487 struct be_mcc_wrb *wrb; 1488 struct be_cmd_get_port_name *ioctl; 1489 1490 mutex_lock(&ctrl->mbox_lock); 1491 wrb = wrb_from_mbox(&ctrl->mbox_mem); 1492 memset(wrb, 0, sizeof(*wrb)); 1493 ioctl = embedded_payload(wrb); 1494 1495 be_wrb_hdr_prepare(wrb, sizeof(*ioctl), true, 0); 1496 be_cmd_hdr_prepare(&ioctl->h.req_hdr, CMD_SUBSYSTEM_COMMON, 1497 OPCODE_COMMON_GET_PORT_NAME, 1498 EMBED_MBX_MAX_PAYLOAD_SIZE); 1499 ret = be_mbox_notify(ctrl); 1500 phba->port_name = 0; 1501 if (!ret) { 1502 phba->port_name = ioctl->p.resp.port_names >> 1503 (phba->fw_config.phys_port * 8) & 0xff; 1504 } else { 1505 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, 1506 "BG_%d : GET_PORT_NAME ret 0x%x status 0x%x\n", 1507 ret, ioctl->h.resp_hdr.status); 1508 } 1509 1510 if (phba->port_name == 0) 1511 phba->port_name = '?'; 1512 1513 mutex_unlock(&ctrl->mbox_lock); 1514 return ret; 1515 } 1516 1517 int beiscsi_set_host_data(struct beiscsi_hba *phba) 1518 { 1519 struct be_ctrl_info *ctrl = &phba->ctrl; 1520 struct be_cmd_set_host_data *ioctl; 1521 struct be_mcc_wrb *wrb; 1522 int ret = 0; 1523 1524 if (is_chip_be2_be3r(phba)) 1525 return ret; 1526 1527 mutex_lock(&ctrl->mbox_lock); 1528 wrb = wrb_from_mbox(&ctrl->mbox_mem); 1529 memset(wrb, 0, sizeof(*wrb)); 1530 ioctl = embedded_payload(wrb); 1531 1532 be_wrb_hdr_prepare(wrb, sizeof(*ioctl), true, 0); 1533 be_cmd_hdr_prepare(&ioctl->h.req_hdr, CMD_SUBSYSTEM_COMMON, 1534 OPCODE_COMMON_SET_HOST_DATA, 1535 EMBED_MBX_MAX_PAYLOAD_SIZE); 1536 ioctl->param.req.param_id = BE_CMD_SET_HOST_PARAM_ID; 1537 ioctl->param.req.param_len = 1538 snprintf((char *)ioctl->param.req.param_data, 1539 sizeof(ioctl->param.req.param_data), 1540 "Linux iSCSI v%s", BUILD_STR); 1541 ioctl->param.req.param_len = ALIGN(ioctl->param.req.param_len + 1, 4); 1542 if (ioctl->param.req.param_len > BE_CMD_MAX_DRV_VERSION) 1543 ioctl->param.req.param_len = BE_CMD_MAX_DRV_VERSION; 1544 ret = be_mbox_notify(ctrl); 1545 if (!ret) { 1546 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, 1547 "BG_%d : HBA set host driver version\n"); 1548 } else { 1549 /** 1550 * Check "MCC_STATUS_INVALID_LENGTH" for SKH. 1551 * Older FW versions return this error. 1552 */ 1553 if (ret == MCC_STATUS_ILLEGAL_REQUEST || 1554 ret == MCC_STATUS_INVALID_LENGTH) 1555 __beiscsi_log(phba, KERN_INFO, 1556 "BG_%d : HBA failed to set host driver version\n"); 1557 } 1558 1559 mutex_unlock(&ctrl->mbox_lock); 1560 return ret; 1561 } 1562 1563 int beiscsi_set_uer_feature(struct beiscsi_hba *phba) 1564 { 1565 struct be_ctrl_info *ctrl = &phba->ctrl; 1566 struct be_cmd_set_features *ioctl; 1567 struct be_mcc_wrb *wrb; 1568 int ret = 0; 1569 1570 mutex_lock(&ctrl->mbox_lock); 1571 wrb = wrb_from_mbox(&ctrl->mbox_mem); 1572 memset(wrb, 0, sizeof(*wrb)); 1573 ioctl = embedded_payload(wrb); 1574 1575 be_wrb_hdr_prepare(wrb, sizeof(*ioctl), true, 0); 1576 be_cmd_hdr_prepare(&ioctl->h.req_hdr, CMD_SUBSYSTEM_COMMON, 1577 OPCODE_COMMON_SET_FEATURES, 1578 EMBED_MBX_MAX_PAYLOAD_SIZE); 1579 ioctl->feature = BE_CMD_SET_FEATURE_UER; 1580 ioctl->param_len = sizeof(ioctl->param.req); 1581 ioctl->param.req.uer = BE_CMD_UER_SUPP_BIT; 1582 ret = be_mbox_notify(ctrl); 1583 if (!ret) { 1584 phba->ue2rp = ioctl->param.resp.ue2rp; 1585 set_bit(BEISCSI_HBA_UER_SUPP, &phba->state); 1586 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, 1587 "BG_%d : HBA error recovery supported\n"); 1588 } else { 1589 /** 1590 * Check "MCC_STATUS_INVALID_LENGTH" for SKH. 1591 * Older FW versions return this error. 1592 */ 1593 if (ret == MCC_STATUS_ILLEGAL_REQUEST || 1594 ret == MCC_STATUS_INVALID_LENGTH) 1595 __beiscsi_log(phba, KERN_INFO, 1596 "BG_%d : HBA error recovery not supported\n"); 1597 } 1598 1599 mutex_unlock(&ctrl->mbox_lock); 1600 return ret; 1601 } 1602 1603 static u32 beiscsi_get_post_stage(struct beiscsi_hba *phba) 1604 { 1605 u32 sem; 1606 1607 if (is_chip_be2_be3r(phba)) 1608 sem = ioread32(phba->csr_va + SLIPORT_SEMAPHORE_OFFSET_BEx); 1609 else 1610 pci_read_config_dword(phba->pcidev, 1611 SLIPORT_SEMAPHORE_OFFSET_SH, &sem); 1612 return sem; 1613 } 1614 1615 int beiscsi_check_fw_rdy(struct beiscsi_hba *phba) 1616 { 1617 u32 loop, post, rdy = 0; 1618 1619 loop = 1000; 1620 while (loop--) { 1621 post = beiscsi_get_post_stage(phba); 1622 if (post & POST_ERROR_BIT) 1623 break; 1624 if ((post & POST_STAGE_MASK) == POST_STAGE_ARMFW_RDY) { 1625 rdy = 1; 1626 break; 1627 } 1628 msleep(60); 1629 } 1630 1631 if (!rdy) { 1632 __beiscsi_log(phba, KERN_ERR, 1633 "BC_%d : FW not ready 0x%x\n", post); 1634 } 1635 1636 return rdy; 1637 } 1638 1639 int beiscsi_cmd_function_reset(struct beiscsi_hba *phba) 1640 { 1641 struct be_ctrl_info *ctrl = &phba->ctrl; 1642 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); 1643 struct be_post_sgl_pages_req *req; 1644 int status; 1645 1646 mutex_lock(&ctrl->mbox_lock); 1647 1648 req = embedded_payload(wrb); 1649 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 1650 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, 1651 OPCODE_COMMON_FUNCTION_RESET, sizeof(*req)); 1652 status = be_mbox_notify(ctrl); 1653 1654 mutex_unlock(&ctrl->mbox_lock); 1655 return status; 1656 } 1657 1658 int beiscsi_cmd_special_wrb(struct be_ctrl_info *ctrl, u32 load) 1659 { 1660 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); 1661 struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev); 1662 u8 *endian_check; 1663 int status; 1664 1665 mutex_lock(&ctrl->mbox_lock); 1666 memset(wrb, 0, sizeof(*wrb)); 1667 1668 endian_check = (u8 *) wrb; 1669 if (load) { 1670 /* to start communicating */ 1671 *endian_check++ = 0xFF; 1672 *endian_check++ = 0x12; 1673 *endian_check++ = 0x34; 1674 *endian_check++ = 0xFF; 1675 *endian_check++ = 0xFF; 1676 *endian_check++ = 0x56; 1677 *endian_check++ = 0x78; 1678 *endian_check++ = 0xFF; 1679 } else { 1680 /* to stop communicating */ 1681 *endian_check++ = 0xFF; 1682 *endian_check++ = 0xAA; 1683 *endian_check++ = 0xBB; 1684 *endian_check++ = 0xFF; 1685 *endian_check++ = 0xFF; 1686 *endian_check++ = 0xCC; 1687 *endian_check++ = 0xDD; 1688 *endian_check = 0xFF; 1689 } 1690 be_dws_cpu_to_le(wrb, sizeof(*wrb)); 1691 1692 status = be_mbox_notify(ctrl); 1693 if (status) 1694 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, 1695 "BC_%d : special WRB message failed\n"); 1696 mutex_unlock(&ctrl->mbox_lock); 1697 return status; 1698 } 1699 1700 int beiscsi_init_sliport(struct beiscsi_hba *phba) 1701 { 1702 int status; 1703 1704 /* check POST stage before talking to FW */ 1705 status = beiscsi_check_fw_rdy(phba); 1706 if (!status) 1707 return -EIO; 1708 1709 /* clear all error states after checking FW rdy */ 1710 phba->state &= ~BEISCSI_HBA_IN_ERR; 1711 1712 /* check again UER support */ 1713 phba->state &= ~BEISCSI_HBA_UER_SUPP; 1714 1715 /* 1716 * SLI COMMON_FUNCTION_RESET completion is indicated by BMBX RDY bit. 1717 * It should clean up any stale info in FW for this fn. 1718 */ 1719 status = beiscsi_cmd_function_reset(phba); 1720 if (status) { 1721 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, 1722 "BC_%d : SLI Function Reset failed\n"); 1723 return status; 1724 } 1725 1726 /* indicate driver is loading */ 1727 return beiscsi_cmd_special_wrb(&phba->ctrl, 1); 1728 } 1729 1730 /** 1731 * beiscsi_cmd_iscsi_cleanup()- Inform FW to cleanup EP data structures. 1732 * @phba: pointer to dev priv structure 1733 * @ulp: ULP number. 1734 * 1735 * return 1736 * Success: 0 1737 * Failure: Non-Zero Value 1738 **/ 1739 int beiscsi_cmd_iscsi_cleanup(struct beiscsi_hba *phba, unsigned short ulp) 1740 { 1741 struct be_ctrl_info *ctrl = &phba->ctrl; 1742 struct iscsi_cleanup_req_v1 *req_v1; 1743 struct iscsi_cleanup_req *req; 1744 u16 hdr_ring_id, data_ring_id; 1745 struct be_mcc_wrb *wrb; 1746 int status; 1747 1748 mutex_lock(&ctrl->mbox_lock); 1749 wrb = wrb_from_mbox(&ctrl->mbox_mem); 1750 1751 hdr_ring_id = HWI_GET_DEF_HDRQ_ID(phba, ulp); 1752 data_ring_id = HWI_GET_DEF_BUFQ_ID(phba, ulp); 1753 if (is_chip_be2_be3r(phba)) { 1754 req = embedded_payload(wrb); 1755 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); 1756 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI, 1757 OPCODE_COMMON_ISCSI_CLEANUP, sizeof(*req)); 1758 req->chute = (1 << ulp); 1759 /* BE2/BE3 FW creates 8-bit ring id */ 1760 req->hdr_ring_id = hdr_ring_id; 1761 req->data_ring_id = data_ring_id; 1762 } else { 1763 req_v1 = embedded_payload(wrb); 1764 be_wrb_hdr_prepare(wrb, sizeof(*req_v1), true, 0); 1765 be_cmd_hdr_prepare(&req_v1->hdr, CMD_SUBSYSTEM_ISCSI, 1766 OPCODE_COMMON_ISCSI_CLEANUP, 1767 sizeof(*req_v1)); 1768 req_v1->hdr.version = 1; 1769 req_v1->chute = (1 << ulp); 1770 req_v1->hdr_ring_id = cpu_to_le16(hdr_ring_id); 1771 req_v1->data_ring_id = cpu_to_le16(data_ring_id); 1772 } 1773 1774 status = be_mbox_notify(ctrl); 1775 if (status) 1776 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT, 1777 "BG_%d : %s failed %d\n", __func__, ulp); 1778 mutex_unlock(&ctrl->mbox_lock); 1779 return status; 1780 } 1781 1782 /* 1783 * beiscsi_detect_ue()- Detect Unrecoverable Error on adapter 1784 * @phba: Driver priv structure 1785 * 1786 * Read registers linked to UE and check for the UE status 1787 **/ 1788 int beiscsi_detect_ue(struct beiscsi_hba *phba) 1789 { 1790 uint32_t ue_mask_hi = 0, ue_mask_lo = 0; 1791 uint32_t ue_hi = 0, ue_lo = 0; 1792 uint8_t i = 0; 1793 int ret = 0; 1794 1795 pci_read_config_dword(phba->pcidev, 1796 PCICFG_UE_STATUS_LOW, &ue_lo); 1797 pci_read_config_dword(phba->pcidev, 1798 PCICFG_UE_STATUS_MASK_LOW, 1799 &ue_mask_lo); 1800 pci_read_config_dword(phba->pcidev, 1801 PCICFG_UE_STATUS_HIGH, 1802 &ue_hi); 1803 pci_read_config_dword(phba->pcidev, 1804 PCICFG_UE_STATUS_MASK_HI, 1805 &ue_mask_hi); 1806 1807 ue_lo = (ue_lo & ~ue_mask_lo); 1808 ue_hi = (ue_hi & ~ue_mask_hi); 1809 1810 1811 if (ue_lo || ue_hi) { 1812 set_bit(BEISCSI_HBA_IN_UE, &phba->state); 1813 __beiscsi_log(phba, KERN_ERR, 1814 "BC_%d : HBA error detected\n"); 1815 ret = 1; 1816 } 1817 1818 if (ue_lo) { 1819 for (i = 0; ue_lo; ue_lo >>= 1, i++) { 1820 if (ue_lo & 1) 1821 __beiscsi_log(phba, KERN_ERR, 1822 "BC_%d : UE_LOW %s bit set\n", 1823 desc_ue_status_low[i]); 1824 } 1825 } 1826 1827 if (ue_hi) { 1828 for (i = 0; ue_hi; ue_hi >>= 1, i++) { 1829 if (ue_hi & 1) 1830 __beiscsi_log(phba, KERN_ERR, 1831 "BC_%d : UE_HIGH %s bit set\n", 1832 desc_ue_status_hi[i]); 1833 } 1834 } 1835 return ret; 1836 } 1837 1838 /* 1839 * beiscsi_detect_tpe()- Detect Transient Parity Error on adapter 1840 * @phba: Driver priv structure 1841 * 1842 * Read SLIPORT SEMAPHORE register to check for UER 1843 * 1844 **/ 1845 int beiscsi_detect_tpe(struct beiscsi_hba *phba) 1846 { 1847 u32 post, status; 1848 int ret = 0; 1849 1850 post = beiscsi_get_post_stage(phba); 1851 status = post & POST_STAGE_MASK; 1852 if ((status & POST_ERR_RECOVERY_CODE_MASK) == 1853 POST_STAGE_RECOVERABLE_ERR) { 1854 set_bit(BEISCSI_HBA_IN_TPE, &phba->state); 1855 __beiscsi_log(phba, KERN_INFO, 1856 "BC_%d : HBA error recoverable: 0x%x\n", post); 1857 ret = 1; 1858 } else { 1859 __beiscsi_log(phba, KERN_INFO, 1860 "BC_%d : HBA in UE: 0x%x\n", post); 1861 } 1862 1863 return ret; 1864 } 1865