efc_els.c (25315B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2021 Broadcom. All Rights Reserved. The term 4 * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. 5 */ 6 7/* 8 * Functions to build and send ELS/CT/BLS commands and responses. 9 */ 10 11#include "efc.h" 12#include "efc_els.h" 13#include "../libefc_sli/sli4.h" 14 15#define EFC_LOG_ENABLE_ELS_TRACE(efc) \ 16 (((efc) != NULL) ? (((efc)->logmask & (1U << 1)) != 0) : 0) 17 18#define node_els_trace() \ 19 do { \ 20 if (EFC_LOG_ENABLE_ELS_TRACE(efc)) \ 21 efc_log_info(efc, "[%s] %-20s\n", \ 22 node->display_name, __func__); \ 23 } while (0) 24 25#define els_io_printf(els, fmt, ...) \ 26 efc_log_err((struct efc *)els->node->efc,\ 27 "[%s] %-8s " fmt, \ 28 els->node->display_name,\ 29 els->display_name, ##__VA_ARGS__) 30 31#define EFC_ELS_RSP_LEN 1024 32#define EFC_ELS_GID_PT_RSP_LEN 8096 33 34struct efc_els_io_req * 35efc_els_io_alloc(struct efc_node *node, u32 reqlen) 36{ 37 return efc_els_io_alloc_size(node, reqlen, EFC_ELS_RSP_LEN); 38} 39 40struct efc_els_io_req * 41efc_els_io_alloc_size(struct efc_node *node, u32 reqlen, u32 rsplen) 42{ 43 struct efc *efc; 44 struct efc_els_io_req *els; 45 unsigned long flags = 0; 46 47 efc = node->efc; 48 49 if (!node->els_io_enabled) { 50 efc_log_err(efc, "els io alloc disabled\n"); 51 return NULL; 52 } 53 54 els = mempool_alloc(efc->els_io_pool, GFP_ATOMIC); 55 if (!els) { 56 atomic_add_return(1, &efc->els_io_alloc_failed_count); 57 return NULL; 58 } 59 60 /* initialize refcount */ 61 kref_init(&els->ref); 62 els->release = _efc_els_io_free; 63 64 /* populate generic io fields */ 65 els->node = node; 66 67 /* now allocate DMA for request and response */ 68 els->io.req.size = reqlen; 69 els->io.req.virt = dma_alloc_coherent(&efc->pci->dev, els->io.req.size, 70 &els->io.req.phys, GFP_KERNEL); 71 if (!els->io.req.virt) { 72 mempool_free(els, efc->els_io_pool); 73 return NULL; 74 } 75 76 els->io.rsp.size = rsplen; 77 els->io.rsp.virt = dma_alloc_coherent(&efc->pci->dev, els->io.rsp.size, 78 &els->io.rsp.phys, GFP_KERNEL); 79 if (!els->io.rsp.virt) { 80 dma_free_coherent(&efc->pci->dev, els->io.req.size, 81 els->io.req.virt, els->io.req.phys); 82 mempool_free(els, efc->els_io_pool); 83 els = NULL; 84 } 85 86 if (els) { 87 /* initialize fields */ 88 els->els_retries_remaining = EFC_FC_ELS_DEFAULT_RETRIES; 89 90 /* add els structure to ELS IO list */ 91 INIT_LIST_HEAD(&els->list_entry); 92 spin_lock_irqsave(&node->els_ios_lock, flags); 93 list_add_tail(&els->list_entry, &node->els_ios_list); 94 spin_unlock_irqrestore(&node->els_ios_lock, flags); 95 } 96 97 return els; 98} 99 100void 101efc_els_io_free(struct efc_els_io_req *els) 102{ 103 kref_put(&els->ref, els->release); 104} 105 106void 107_efc_els_io_free(struct kref *arg) 108{ 109 struct efc_els_io_req *els = 110 container_of(arg, struct efc_els_io_req, ref); 111 struct efc *efc; 112 struct efc_node *node; 113 int send_empty_event = false; 114 unsigned long flags = 0; 115 116 node = els->node; 117 efc = node->efc; 118 119 spin_lock_irqsave(&node->els_ios_lock, flags); 120 121 list_del(&els->list_entry); 122 /* Send list empty event if the IO allocator 123 * is disabled, and the list is empty 124 * If node->els_io_enabled was not checked, 125 * the event would be posted continually 126 */ 127 send_empty_event = (!node->els_io_enabled && 128 list_empty(&node->els_ios_list)); 129 130 spin_unlock_irqrestore(&node->els_ios_lock, flags); 131 132 /* free ELS request and response buffers */ 133 dma_free_coherent(&efc->pci->dev, els->io.rsp.size, 134 els->io.rsp.virt, els->io.rsp.phys); 135 dma_free_coherent(&efc->pci->dev, els->io.req.size, 136 els->io.req.virt, els->io.req.phys); 137 138 mempool_free(els, efc->els_io_pool); 139 140 if (send_empty_event) 141 efc_scsi_io_list_empty(node->efc, node); 142} 143 144static void 145efc_els_retry(struct efc_els_io_req *els); 146 147static void 148efc_els_delay_timer_cb(struct timer_list *t) 149{ 150 struct efc_els_io_req *els = from_timer(els, t, delay_timer); 151 152 /* Retry delay timer expired, retry the ELS request */ 153 efc_els_retry(els); 154} 155 156static int 157efc_els_req_cb(void *arg, u32 length, int status, u32 ext_status) 158{ 159 struct efc_els_io_req *els; 160 struct efc_node *node; 161 struct efc *efc; 162 struct efc_node_cb cbdata; 163 u32 reason_code; 164 165 els = arg; 166 node = els->node; 167 efc = node->efc; 168 169 if (status) 170 els_io_printf(els, "status x%x ext x%x\n", status, ext_status); 171 172 /* set the response len element of els->rsp */ 173 els->io.rsp.len = length; 174 175 cbdata.status = status; 176 cbdata.ext_status = ext_status; 177 cbdata.header = NULL; 178 cbdata.els_rsp = els->io.rsp; 179 180 /* set the response len element of els->rsp */ 181 cbdata.rsp_len = length; 182 183 /* FW returns the number of bytes received on the link in 184 * the WCQE, not the amount placed in the buffer; use this info to 185 * check if there was an overrun. 186 */ 187 if (length > els->io.rsp.size) { 188 efc_log_warn(efc, 189 "ELS response returned len=%d > buflen=%zu\n", 190 length, els->io.rsp.size); 191 efc_els_io_cleanup(els, EFC_EVT_SRRS_ELS_REQ_FAIL, &cbdata); 192 return 0; 193 } 194 195 /* Post event to ELS IO object */ 196 switch (status) { 197 case SLI4_FC_WCQE_STATUS_SUCCESS: 198 efc_els_io_cleanup(els, EFC_EVT_SRRS_ELS_REQ_OK, &cbdata); 199 break; 200 201 case SLI4_FC_WCQE_STATUS_LS_RJT: 202 reason_code = (ext_status >> 16) & 0xff; 203 204 /* delay and retry if reason code is Logical Busy */ 205 switch (reason_code) { 206 case ELS_RJT_BUSY: 207 els->node->els_req_cnt--; 208 els_io_printf(els, 209 "LS_RJT Logical Busy, delay and retry\n"); 210 timer_setup(&els->delay_timer, 211 efc_els_delay_timer_cb, 0); 212 mod_timer(&els->delay_timer, 213 jiffies + msecs_to_jiffies(5000)); 214 break; 215 default: 216 efc_els_io_cleanup(els, EFC_EVT_SRRS_ELS_REQ_RJT, 217 &cbdata); 218 break; 219 } 220 break; 221 222 case SLI4_FC_WCQE_STATUS_LOCAL_REJECT: 223 switch (ext_status) { 224 case SLI4_FC_LOCAL_REJECT_SEQUENCE_TIMEOUT: 225 efc_els_retry(els); 226 break; 227 default: 228 efc_log_err(efc, "LOCAL_REJECT with ext status:%x\n", 229 ext_status); 230 efc_els_io_cleanup(els, EFC_EVT_SRRS_ELS_REQ_FAIL, 231 &cbdata); 232 break; 233 } 234 break; 235 default: /* Other error */ 236 efc_log_warn(efc, "els req failed status x%x, ext_status x%x\n", 237 status, ext_status); 238 efc_els_io_cleanup(els, EFC_EVT_SRRS_ELS_REQ_FAIL, &cbdata); 239 break; 240 } 241 242 return 0; 243} 244 245void efc_disc_io_complete(struct efc_disc_io *io, u32 len, u32 status, 246 u32 ext_status) 247{ 248 struct efc_els_io_req *els = 249 container_of(io, struct efc_els_io_req, io); 250 251 WARN_ON_ONCE(!els->cb); 252 253 ((efc_hw_srrs_cb_t)els->cb) (els, len, status, ext_status); 254} 255 256static int efc_els_send_req(struct efc_node *node, struct efc_els_io_req *els, 257 enum efc_disc_io_type io_type) 258{ 259 int rc = 0; 260 struct efc *efc = node->efc; 261 struct efc_node_cb cbdata; 262 263 /* update ELS request counter */ 264 els->node->els_req_cnt++; 265 266 /* Prepare the IO request details */ 267 els->io.io_type = io_type; 268 els->io.xmit_len = els->io.req.size; 269 els->io.rsp_len = els->io.rsp.size; 270 els->io.rpi = node->rnode.indicator; 271 els->io.vpi = node->nport->indicator; 272 els->io.s_id = node->nport->fc_id; 273 els->io.d_id = node->rnode.fc_id; 274 275 if (node->rnode.attached) 276 els->io.rpi_registered = true; 277 278 els->cb = efc_els_req_cb; 279 280 rc = efc->tt.send_els(efc, &els->io); 281 if (!rc) 282 return rc; 283 284 cbdata.status = EFC_STATUS_INVALID; 285 cbdata.ext_status = EFC_STATUS_INVALID; 286 cbdata.els_rsp = els->io.rsp; 287 efc_log_err(efc, "efc_els_send failed: %d\n", rc); 288 efc_els_io_cleanup(els, EFC_EVT_SRRS_ELS_REQ_FAIL, &cbdata); 289 290 return rc; 291} 292 293static void 294efc_els_retry(struct efc_els_io_req *els) 295{ 296 struct efc *efc; 297 struct efc_node_cb cbdata; 298 u32 rc; 299 300 efc = els->node->efc; 301 cbdata.status = EFC_STATUS_INVALID; 302 cbdata.ext_status = EFC_STATUS_INVALID; 303 cbdata.els_rsp = els->io.rsp; 304 305 if (els->els_retries_remaining) { 306 els->els_retries_remaining--; 307 rc = efc->tt.send_els(efc, &els->io); 308 } else { 309 rc = -EIO; 310 } 311 312 if (rc) { 313 efc_log_err(efc, "ELS retries exhausted\n"); 314 efc_els_io_cleanup(els, EFC_EVT_SRRS_ELS_REQ_FAIL, &cbdata); 315 } 316} 317 318static int 319efc_els_acc_cb(void *arg, u32 length, int status, u32 ext_status) 320{ 321 struct efc_els_io_req *els; 322 struct efc_node *node; 323 struct efc *efc; 324 struct efc_node_cb cbdata; 325 326 els = arg; 327 node = els->node; 328 efc = node->efc; 329 330 cbdata.status = status; 331 cbdata.ext_status = ext_status; 332 cbdata.header = NULL; 333 cbdata.els_rsp = els->io.rsp; 334 335 /* Post node event */ 336 switch (status) { 337 case SLI4_FC_WCQE_STATUS_SUCCESS: 338 efc_els_io_cleanup(els, EFC_EVT_SRRS_ELS_CMPL_OK, &cbdata); 339 break; 340 341 default: /* Other error */ 342 efc_log_warn(efc, "[%s] %-8s failed status x%x, ext x%x\n", 343 node->display_name, els->display_name, 344 status, ext_status); 345 efc_els_io_cleanup(els, EFC_EVT_SRRS_ELS_CMPL_FAIL, &cbdata); 346 break; 347 } 348 349 return 0; 350} 351 352static int 353efc_els_send_rsp(struct efc_els_io_req *els, u32 rsplen) 354{ 355 int rc = 0; 356 struct efc_node_cb cbdata; 357 struct efc_node *node = els->node; 358 struct efc *efc = node->efc; 359 360 /* increment ELS completion counter */ 361 node->els_cmpl_cnt++; 362 363 els->io.io_type = EFC_DISC_IO_ELS_RESP; 364 els->cb = efc_els_acc_cb; 365 366 /* Prepare the IO request details */ 367 els->io.xmit_len = rsplen; 368 els->io.rsp_len = els->io.rsp.size; 369 els->io.rpi = node->rnode.indicator; 370 els->io.vpi = node->nport->indicator; 371 if (node->nport->fc_id != U32_MAX) 372 els->io.s_id = node->nport->fc_id; 373 else 374 els->io.s_id = els->io.iparam.els.s_id; 375 els->io.d_id = node->rnode.fc_id; 376 377 if (node->attached) 378 els->io.rpi_registered = true; 379 380 rc = efc->tt.send_els(efc, &els->io); 381 if (!rc) 382 return rc; 383 384 cbdata.status = EFC_STATUS_INVALID; 385 cbdata.ext_status = EFC_STATUS_INVALID; 386 cbdata.els_rsp = els->io.rsp; 387 efc_els_io_cleanup(els, EFC_EVT_SRRS_ELS_CMPL_FAIL, &cbdata); 388 389 return rc; 390} 391 392int 393efc_send_plogi(struct efc_node *node) 394{ 395 struct efc_els_io_req *els; 396 struct efc *efc = node->efc; 397 struct fc_els_flogi *plogi; 398 399 node_els_trace(); 400 401 els = efc_els_io_alloc(node, sizeof(*plogi)); 402 if (!els) { 403 efc_log_err(efc, "IO alloc failed\n"); 404 return -EIO; 405 } 406 els->display_name = "plogi"; 407 408 /* Build PLOGI request */ 409 plogi = els->io.req.virt; 410 411 memcpy(plogi, node->nport->service_params, sizeof(*plogi)); 412 413 plogi->fl_cmd = ELS_PLOGI; 414 memset(plogi->_fl_resvd, 0, sizeof(plogi->_fl_resvd)); 415 416 return efc_els_send_req(node, els, EFC_DISC_IO_ELS_REQ); 417} 418 419int 420efc_send_flogi(struct efc_node *node) 421{ 422 struct efc_els_io_req *els; 423 struct efc *efc; 424 struct fc_els_flogi *flogi; 425 426 efc = node->efc; 427 428 node_els_trace(); 429 430 els = efc_els_io_alloc(node, sizeof(*flogi)); 431 if (!els) { 432 efc_log_err(efc, "IO alloc failed\n"); 433 return -EIO; 434 } 435 436 els->display_name = "flogi"; 437 438 /* Build FLOGI request */ 439 flogi = els->io.req.virt; 440 441 memcpy(flogi, node->nport->service_params, sizeof(*flogi)); 442 flogi->fl_cmd = ELS_FLOGI; 443 memset(flogi->_fl_resvd, 0, sizeof(flogi->_fl_resvd)); 444 445 return efc_els_send_req(node, els, EFC_DISC_IO_ELS_REQ); 446} 447 448int 449efc_send_fdisc(struct efc_node *node) 450{ 451 struct efc_els_io_req *els; 452 struct efc *efc; 453 struct fc_els_flogi *fdisc; 454 455 efc = node->efc; 456 457 node_els_trace(); 458 459 els = efc_els_io_alloc(node, sizeof(*fdisc)); 460 if (!els) { 461 efc_log_err(efc, "IO alloc failed\n"); 462 return -EIO; 463 } 464 465 els->display_name = "fdisc"; 466 467 /* Build FDISC request */ 468 fdisc = els->io.req.virt; 469 470 memcpy(fdisc, node->nport->service_params, sizeof(*fdisc)); 471 fdisc->fl_cmd = ELS_FDISC; 472 memset(fdisc->_fl_resvd, 0, sizeof(fdisc->_fl_resvd)); 473 474 return efc_els_send_req(node, els, EFC_DISC_IO_ELS_REQ); 475} 476 477int 478efc_send_prli(struct efc_node *node) 479{ 480 struct efc *efc = node->efc; 481 struct efc_els_io_req *els; 482 struct { 483 struct fc_els_prli prli; 484 struct fc_els_spp spp; 485 } *pp; 486 487 node_els_trace(); 488 489 els = efc_els_io_alloc(node, sizeof(*pp)); 490 if (!els) { 491 efc_log_err(efc, "IO alloc failed\n"); 492 return -EIO; 493 } 494 495 els->display_name = "prli"; 496 497 /* Build PRLI request */ 498 pp = els->io.req.virt; 499 500 memset(pp, 0, sizeof(*pp)); 501 502 pp->prli.prli_cmd = ELS_PRLI; 503 pp->prli.prli_spp_len = 16; 504 pp->prli.prli_len = cpu_to_be16(sizeof(*pp)); 505 pp->spp.spp_type = FC_TYPE_FCP; 506 pp->spp.spp_type_ext = 0; 507 pp->spp.spp_flags = FC_SPP_EST_IMG_PAIR; 508 pp->spp.spp_params = cpu_to_be32(FCP_SPPF_RD_XRDY_DIS | 509 (node->nport->enable_ini ? 510 FCP_SPPF_INIT_FCN : 0) | 511 (node->nport->enable_tgt ? 512 FCP_SPPF_TARG_FCN : 0)); 513 514 return efc_els_send_req(node, els, EFC_DISC_IO_ELS_REQ); 515} 516 517int 518efc_send_logo(struct efc_node *node) 519{ 520 struct efc *efc = node->efc; 521 struct efc_els_io_req *els; 522 struct fc_els_logo *logo; 523 struct fc_els_flogi *sparams; 524 525 node_els_trace(); 526 527 sparams = (struct fc_els_flogi *)node->nport->service_params; 528 529 els = efc_els_io_alloc(node, sizeof(*logo)); 530 if (!els) { 531 efc_log_err(efc, "IO alloc failed\n"); 532 return -EIO; 533 } 534 535 els->display_name = "logo"; 536 537 /* Build LOGO request */ 538 539 logo = els->io.req.virt; 540 541 memset(logo, 0, sizeof(*logo)); 542 logo->fl_cmd = ELS_LOGO; 543 hton24(logo->fl_n_port_id, node->rnode.nport->fc_id); 544 logo->fl_n_port_wwn = sparams->fl_wwpn; 545 546 return efc_els_send_req(node, els, EFC_DISC_IO_ELS_REQ); 547} 548 549int 550efc_send_adisc(struct efc_node *node) 551{ 552 struct efc *efc = node->efc; 553 struct efc_els_io_req *els; 554 struct fc_els_adisc *adisc; 555 struct fc_els_flogi *sparams; 556 struct efc_nport *nport = node->nport; 557 558 node_els_trace(); 559 560 sparams = (struct fc_els_flogi *)node->nport->service_params; 561 562 els = efc_els_io_alloc(node, sizeof(*adisc)); 563 if (!els) { 564 efc_log_err(efc, "IO alloc failed\n"); 565 return -EIO; 566 } 567 568 els->display_name = "adisc"; 569 570 /* Build ADISC request */ 571 572 adisc = els->io.req.virt; 573 574 memset(adisc, 0, sizeof(*adisc)); 575 adisc->adisc_cmd = ELS_ADISC; 576 hton24(adisc->adisc_hard_addr, nport->fc_id); 577 adisc->adisc_wwpn = sparams->fl_wwpn; 578 adisc->adisc_wwnn = sparams->fl_wwnn; 579 hton24(adisc->adisc_port_id, node->rnode.nport->fc_id); 580 581 return efc_els_send_req(node, els, EFC_DISC_IO_ELS_REQ); 582} 583 584int 585efc_send_scr(struct efc_node *node) 586{ 587 struct efc_els_io_req *els; 588 struct efc *efc = node->efc; 589 struct fc_els_scr *req; 590 591 node_els_trace(); 592 593 els = efc_els_io_alloc(node, sizeof(*req)); 594 if (!els) { 595 efc_log_err(efc, "IO alloc failed\n"); 596 return -EIO; 597 } 598 599 els->display_name = "scr"; 600 601 req = els->io.req.virt; 602 603 memset(req, 0, sizeof(*req)); 604 req->scr_cmd = ELS_SCR; 605 req->scr_reg_func = ELS_SCRF_FULL; 606 607 return efc_els_send_req(node, els, EFC_DISC_IO_ELS_REQ); 608} 609 610int 611efc_send_ls_rjt(struct efc_node *node, u32 ox_id, u32 reason_code, 612 u32 reason_code_expl, u32 vendor_unique) 613{ 614 struct efc *efc = node->efc; 615 struct efc_els_io_req *els = NULL; 616 struct fc_els_ls_rjt *rjt; 617 618 els = efc_els_io_alloc(node, sizeof(*rjt)); 619 if (!els) { 620 efc_log_err(efc, "els IO alloc failed\n"); 621 return -EIO; 622 } 623 624 node_els_trace(); 625 626 els->display_name = "ls_rjt"; 627 628 memset(&els->io.iparam, 0, sizeof(els->io.iparam)); 629 els->io.iparam.els.ox_id = ox_id; 630 631 rjt = els->io.req.virt; 632 memset(rjt, 0, sizeof(*rjt)); 633 634 rjt->er_cmd = ELS_LS_RJT; 635 rjt->er_reason = reason_code; 636 rjt->er_explan = reason_code_expl; 637 638 return efc_els_send_rsp(els, sizeof(*rjt)); 639} 640 641int 642efc_send_plogi_acc(struct efc_node *node, u32 ox_id) 643{ 644 struct efc *efc = node->efc; 645 struct efc_els_io_req *els = NULL; 646 struct fc_els_flogi *plogi; 647 struct fc_els_flogi *req = (struct fc_els_flogi *)node->service_params; 648 649 node_els_trace(); 650 651 els = efc_els_io_alloc(node, sizeof(*plogi)); 652 if (!els) { 653 efc_log_err(efc, "els IO alloc failed\n"); 654 return -EIO; 655 } 656 657 els->display_name = "plogi_acc"; 658 659 memset(&els->io.iparam, 0, sizeof(els->io.iparam)); 660 els->io.iparam.els.ox_id = ox_id; 661 662 plogi = els->io.req.virt; 663 664 /* copy our port's service parameters to payload */ 665 memcpy(plogi, node->nport->service_params, sizeof(*plogi)); 666 plogi->fl_cmd = ELS_LS_ACC; 667 memset(plogi->_fl_resvd, 0, sizeof(plogi->_fl_resvd)); 668 669 /* Set Application header support bit if requested */ 670 if (req->fl_csp.sp_features & cpu_to_be16(FC_SP_FT_BCAST)) 671 plogi->fl_csp.sp_features |= cpu_to_be16(FC_SP_FT_BCAST); 672 673 return efc_els_send_rsp(els, sizeof(*plogi)); 674} 675 676int 677efc_send_flogi_p2p_acc(struct efc_node *node, u32 ox_id, u32 s_id) 678{ 679 struct efc *efc = node->efc; 680 struct efc_els_io_req *els = NULL; 681 struct fc_els_flogi *flogi; 682 683 node_els_trace(); 684 685 els = efc_els_io_alloc(node, sizeof(*flogi)); 686 if (!els) { 687 efc_log_err(efc, "els IO alloc failed\n"); 688 return -EIO; 689 } 690 691 els->display_name = "flogi_p2p_acc"; 692 693 memset(&els->io.iparam, 0, sizeof(els->io.iparam)); 694 els->io.iparam.els.ox_id = ox_id; 695 els->io.iparam.els.s_id = s_id; 696 697 flogi = els->io.req.virt; 698 699 /* copy our port's service parameters to payload */ 700 memcpy(flogi, node->nport->service_params, sizeof(*flogi)); 701 flogi->fl_cmd = ELS_LS_ACC; 702 memset(flogi->_fl_resvd, 0, sizeof(flogi->_fl_resvd)); 703 704 memset(flogi->fl_cssp, 0, sizeof(flogi->fl_cssp)); 705 706 return efc_els_send_rsp(els, sizeof(*flogi)); 707} 708 709int 710efc_send_prli_acc(struct efc_node *node, u32 ox_id) 711{ 712 struct efc *efc = node->efc; 713 struct efc_els_io_req *els = NULL; 714 struct { 715 struct fc_els_prli prli; 716 struct fc_els_spp spp; 717 } *pp; 718 719 node_els_trace(); 720 721 els = efc_els_io_alloc(node, sizeof(*pp)); 722 if (!els) { 723 efc_log_err(efc, "els IO alloc failed\n"); 724 return -EIO; 725 } 726 727 els->display_name = "prli_acc"; 728 729 memset(&els->io.iparam, 0, sizeof(els->io.iparam)); 730 els->io.iparam.els.ox_id = ox_id; 731 732 pp = els->io.req.virt; 733 memset(pp, 0, sizeof(*pp)); 734 735 pp->prli.prli_cmd = ELS_LS_ACC; 736 pp->prli.prli_spp_len = 0x10; 737 pp->prli.prli_len = cpu_to_be16(sizeof(*pp)); 738 pp->spp.spp_type = FC_TYPE_FCP; 739 pp->spp.spp_type_ext = 0; 740 pp->spp.spp_flags = FC_SPP_EST_IMG_PAIR | FC_SPP_RESP_ACK; 741 742 pp->spp.spp_params = cpu_to_be32(FCP_SPPF_RD_XRDY_DIS | 743 (node->nport->enable_ini ? 744 FCP_SPPF_INIT_FCN : 0) | 745 (node->nport->enable_tgt ? 746 FCP_SPPF_TARG_FCN : 0)); 747 748 return efc_els_send_rsp(els, sizeof(*pp)); 749} 750 751int 752efc_send_prlo_acc(struct efc_node *node, u32 ox_id) 753{ 754 struct efc *efc = node->efc; 755 struct efc_els_io_req *els = NULL; 756 struct { 757 struct fc_els_prlo prlo; 758 struct fc_els_spp spp; 759 } *pp; 760 761 node_els_trace(); 762 763 els = efc_els_io_alloc(node, sizeof(*pp)); 764 if (!els) { 765 efc_log_err(efc, "els IO alloc failed\n"); 766 return -EIO; 767 } 768 769 els->display_name = "prlo_acc"; 770 771 memset(&els->io.iparam, 0, sizeof(els->io.iparam)); 772 els->io.iparam.els.ox_id = ox_id; 773 774 pp = els->io.req.virt; 775 memset(pp, 0, sizeof(*pp)); 776 pp->prlo.prlo_cmd = ELS_LS_ACC; 777 pp->prlo.prlo_obs = 0x10; 778 pp->prlo.prlo_len = cpu_to_be16(sizeof(*pp)); 779 780 pp->spp.spp_type = FC_TYPE_FCP; 781 pp->spp.spp_type_ext = 0; 782 pp->spp.spp_flags = FC_SPP_RESP_ACK; 783 784 return efc_els_send_rsp(els, sizeof(*pp)); 785} 786 787int 788efc_send_ls_acc(struct efc_node *node, u32 ox_id) 789{ 790 struct efc *efc = node->efc; 791 struct efc_els_io_req *els = NULL; 792 struct fc_els_ls_acc *acc; 793 794 node_els_trace(); 795 796 els = efc_els_io_alloc(node, sizeof(*acc)); 797 if (!els) { 798 efc_log_err(efc, "els IO alloc failed\n"); 799 return -EIO; 800 } 801 802 els->display_name = "ls_acc"; 803 804 memset(&els->io.iparam, 0, sizeof(els->io.iparam)); 805 els->io.iparam.els.ox_id = ox_id; 806 807 acc = els->io.req.virt; 808 memset(acc, 0, sizeof(*acc)); 809 810 acc->la_cmd = ELS_LS_ACC; 811 812 return efc_els_send_rsp(els, sizeof(*acc)); 813} 814 815int 816efc_send_logo_acc(struct efc_node *node, u32 ox_id) 817{ 818 struct efc_els_io_req *els = NULL; 819 struct efc *efc = node->efc; 820 struct fc_els_ls_acc *logo; 821 822 node_els_trace(); 823 824 els = efc_els_io_alloc(node, sizeof(*logo)); 825 if (!els) { 826 efc_log_err(efc, "els IO alloc failed\n"); 827 return -EIO; 828 } 829 830 els->display_name = "logo_acc"; 831 832 memset(&els->io.iparam, 0, sizeof(els->io.iparam)); 833 els->io.iparam.els.ox_id = ox_id; 834 835 logo = els->io.req.virt; 836 memset(logo, 0, sizeof(*logo)); 837 838 logo->la_cmd = ELS_LS_ACC; 839 840 return efc_els_send_rsp(els, sizeof(*logo)); 841} 842 843int 844efc_send_adisc_acc(struct efc_node *node, u32 ox_id) 845{ 846 struct efc *efc = node->efc; 847 struct efc_els_io_req *els = NULL; 848 struct fc_els_adisc *adisc; 849 struct fc_els_flogi *sparams; 850 851 node_els_trace(); 852 853 els = efc_els_io_alloc(node, sizeof(*adisc)); 854 if (!els) { 855 efc_log_err(efc, "els IO alloc failed\n"); 856 return -EIO; 857 } 858 859 els->display_name = "adisc_acc"; 860 861 /* Go ahead and send the ELS_ACC */ 862 memset(&els->io.iparam, 0, sizeof(els->io.iparam)); 863 els->io.iparam.els.ox_id = ox_id; 864 865 sparams = (struct fc_els_flogi *)node->nport->service_params; 866 adisc = els->io.req.virt; 867 memset(adisc, 0, sizeof(*adisc)); 868 adisc->adisc_cmd = ELS_LS_ACC; 869 adisc->adisc_wwpn = sparams->fl_wwpn; 870 adisc->adisc_wwnn = sparams->fl_wwnn; 871 hton24(adisc->adisc_port_id, node->rnode.nport->fc_id); 872 873 return efc_els_send_rsp(els, sizeof(*adisc)); 874} 875 876static inline void 877fcct_build_req_header(struct fc_ct_hdr *hdr, u16 cmd, u16 max_size) 878{ 879 hdr->ct_rev = FC_CT_REV; 880 hdr->ct_fs_type = FC_FST_DIR; 881 hdr->ct_fs_subtype = FC_NS_SUBTYPE; 882 hdr->ct_options = 0; 883 hdr->ct_cmd = cpu_to_be16(cmd); 884 /* words */ 885 hdr->ct_mr_size = cpu_to_be16(max_size / (sizeof(u32))); 886 hdr->ct_reason = 0; 887 hdr->ct_explan = 0; 888 hdr->ct_vendor = 0; 889} 890 891int 892efc_ns_send_rftid(struct efc_node *node) 893{ 894 struct efc *efc = node->efc; 895 struct efc_els_io_req *els; 896 struct { 897 struct fc_ct_hdr hdr; 898 struct fc_ns_rft_id rftid; 899 } *ct; 900 901 node_els_trace(); 902 903 els = efc_els_io_alloc(node, sizeof(*ct)); 904 if (!els) { 905 efc_log_err(efc, "IO alloc failed\n"); 906 return -EIO; 907 } 908 909 els->io.iparam.ct.r_ctl = FC_RCTL_ELS_REQ; 910 els->io.iparam.ct.type = FC_TYPE_CT; 911 els->io.iparam.ct.df_ctl = 0; 912 els->io.iparam.ct.timeout = EFC_FC_ELS_SEND_DEFAULT_TIMEOUT; 913 914 els->display_name = "rftid"; 915 916 ct = els->io.req.virt; 917 memset(ct, 0, sizeof(*ct)); 918 fcct_build_req_header(&ct->hdr, FC_NS_RFT_ID, 919 sizeof(struct fc_ns_rft_id)); 920 921 hton24(ct->rftid.fr_fid.fp_fid, node->rnode.nport->fc_id); 922 ct->rftid.fr_fts.ff_type_map[FC_TYPE_FCP / FC_NS_BPW] = 923 cpu_to_be32(1 << (FC_TYPE_FCP % FC_NS_BPW)); 924 925 return efc_els_send_req(node, els, EFC_DISC_IO_CT_REQ); 926} 927 928int 929efc_ns_send_rffid(struct efc_node *node) 930{ 931 struct efc *efc = node->efc; 932 struct efc_els_io_req *els; 933 struct { 934 struct fc_ct_hdr hdr; 935 struct fc_ns_rff_id rffid; 936 } *ct; 937 938 node_els_trace(); 939 940 els = efc_els_io_alloc(node, sizeof(*ct)); 941 if (!els) { 942 efc_log_err(efc, "IO alloc failed\n"); 943 return -EIO; 944 } 945 946 els->io.iparam.ct.r_ctl = FC_RCTL_ELS_REQ; 947 els->io.iparam.ct.type = FC_TYPE_CT; 948 els->io.iparam.ct.df_ctl = 0; 949 els->io.iparam.ct.timeout = EFC_FC_ELS_SEND_DEFAULT_TIMEOUT; 950 951 els->display_name = "rffid"; 952 ct = els->io.req.virt; 953 954 memset(ct, 0, sizeof(*ct)); 955 fcct_build_req_header(&ct->hdr, FC_NS_RFF_ID, 956 sizeof(struct fc_ns_rff_id)); 957 958 hton24(ct->rffid.fr_fid.fp_fid, node->rnode.nport->fc_id); 959 if (node->nport->enable_ini) 960 ct->rffid.fr_feat |= FCP_FEAT_INIT; 961 if (node->nport->enable_tgt) 962 ct->rffid.fr_feat |= FCP_FEAT_TARG; 963 ct->rffid.fr_type = FC_TYPE_FCP; 964 965 return efc_els_send_req(node, els, EFC_DISC_IO_CT_REQ); 966} 967 968int 969efc_ns_send_gidpt(struct efc_node *node) 970{ 971 struct efc_els_io_req *els = NULL; 972 struct efc *efc = node->efc; 973 struct { 974 struct fc_ct_hdr hdr; 975 struct fc_ns_gid_pt gidpt; 976 } *ct; 977 978 node_els_trace(); 979 980 els = efc_els_io_alloc_size(node, sizeof(*ct), EFC_ELS_GID_PT_RSP_LEN); 981 if (!els) { 982 efc_log_err(efc, "IO alloc failed\n"); 983 return -EIO; 984 } 985 986 els->io.iparam.ct.r_ctl = FC_RCTL_ELS_REQ; 987 els->io.iparam.ct.type = FC_TYPE_CT; 988 els->io.iparam.ct.df_ctl = 0; 989 els->io.iparam.ct.timeout = EFC_FC_ELS_SEND_DEFAULT_TIMEOUT; 990 991 els->display_name = "gidpt"; 992 993 ct = els->io.req.virt; 994 995 memset(ct, 0, sizeof(*ct)); 996 fcct_build_req_header(&ct->hdr, FC_NS_GID_PT, 997 sizeof(struct fc_ns_gid_pt)); 998 999 ct->gidpt.fn_pt_type = FC_TYPE_FCP; 1000 1001 return efc_els_send_req(node, els, EFC_DISC_IO_CT_REQ); 1002} 1003 1004void 1005efc_els_io_cleanup(struct efc_els_io_req *els, int evt, void *arg) 1006{ 1007 /* don't want further events that could come; e.g. abort requests 1008 * from the node state machine; thus, disable state machine 1009 */ 1010 els->els_req_free = true; 1011 efc_node_post_els_resp(els->node, evt, arg); 1012 1013 efc_els_io_free(els); 1014} 1015 1016static int 1017efc_ct_acc_cb(void *arg, u32 length, int status, u32 ext_status) 1018{ 1019 struct efc_els_io_req *els = arg; 1020 1021 efc_els_io_free(els); 1022 1023 return 0; 1024} 1025 1026int 1027efc_send_ct_rsp(struct efc *efc, struct efc_node *node, u16 ox_id, 1028 struct fc_ct_hdr *ct_hdr, u32 cmd_rsp_code, 1029 u32 reason_code, u32 reason_code_explanation) 1030{ 1031 struct efc_els_io_req *els = NULL; 1032 struct fc_ct_hdr *rsp = NULL; 1033 1034 els = efc_els_io_alloc(node, 256); 1035 if (!els) { 1036 efc_log_err(efc, "IO alloc failed\n"); 1037 return -EIO; 1038 } 1039 1040 rsp = els->io.rsp.virt; 1041 1042 *rsp = *ct_hdr; 1043 1044 fcct_build_req_header(rsp, cmd_rsp_code, 0); 1045 rsp->ct_reason = reason_code; 1046 rsp->ct_explan = reason_code_explanation; 1047 1048 els->display_name = "ct_rsp"; 1049 els->cb = efc_ct_acc_cb; 1050 1051 /* Prepare the IO request details */ 1052 els->io.io_type = EFC_DISC_IO_CT_RESP; 1053 els->io.xmit_len = sizeof(*rsp); 1054 1055 els->io.rpi = node->rnode.indicator; 1056 els->io.d_id = node->rnode.fc_id; 1057 1058 memset(&els->io.iparam, 0, sizeof(els->io.iparam)); 1059 1060 els->io.iparam.ct.ox_id = ox_id; 1061 els->io.iparam.ct.r_ctl = 3; 1062 els->io.iparam.ct.type = FC_TYPE_CT; 1063 els->io.iparam.ct.df_ctl = 0; 1064 els->io.iparam.ct.timeout = 5; 1065 1066 if (efc->tt.send_els(efc, &els->io)) { 1067 efc_els_io_free(els); 1068 return -EIO; 1069 } 1070 return 0; 1071} 1072 1073int 1074efc_send_bls_acc(struct efc_node *node, struct fc_frame_header *hdr) 1075{ 1076 struct sli_bls_params bls; 1077 struct fc_ba_acc *acc; 1078 struct efc *efc = node->efc; 1079 1080 memset(&bls, 0, sizeof(bls)); 1081 bls.ox_id = be16_to_cpu(hdr->fh_ox_id); 1082 bls.rx_id = be16_to_cpu(hdr->fh_rx_id); 1083 bls.s_id = ntoh24(hdr->fh_d_id); 1084 bls.d_id = node->rnode.fc_id; 1085 bls.rpi = node->rnode.indicator; 1086 bls.vpi = node->nport->indicator; 1087 1088 acc = (void *)bls.payload; 1089 acc->ba_ox_id = cpu_to_be16(bls.ox_id); 1090 acc->ba_rx_id = cpu_to_be16(bls.rx_id); 1091 acc->ba_high_seq_cnt = cpu_to_be16(U16_MAX); 1092 1093 return efc->tt.send_bls(efc, FC_RCTL_BA_ACC, &bls); 1094}