File Index
Files and directories
Sign in
FILE

efc_els.c

File preview with syntax highlighting.

linux-6.19.14/drivers/scsi/elx/libefc/efc_els.c C
   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 = timer_container_of(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}
~/ Read-only file preview.