cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

efc_node.c (26753B)


      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#include "efc.h"
      8
      9int
     10efc_remote_node_cb(void *arg, int event, void *data)
     11{
     12	struct efc *efc = arg;
     13	struct efc_remote_node *rnode = data;
     14	struct efc_node *node = rnode->node;
     15	unsigned long flags = 0;
     16
     17	spin_lock_irqsave(&efc->lock, flags);
     18	efc_node_post_event(node, event, NULL);
     19	spin_unlock_irqrestore(&efc->lock, flags);
     20
     21	return 0;
     22}
     23
     24struct efc_node *
     25efc_node_find(struct efc_nport *nport, u32 port_id)
     26{
     27	/* Find an FC node structure given the FC port ID */
     28	return xa_load(&nport->lookup, port_id);
     29}
     30
     31static void
     32_efc_node_free(struct kref *arg)
     33{
     34	struct efc_node *node = container_of(arg, struct efc_node, ref);
     35	struct efc *efc = node->efc;
     36	struct efc_dma *dma;
     37
     38	dma = &node->sparm_dma_buf;
     39	dma_pool_free(efc->node_dma_pool, dma->virt, dma->phys);
     40	memset(dma, 0, sizeof(struct efc_dma));
     41	mempool_free(node, efc->node_pool);
     42}
     43
     44struct efc_node *efc_node_alloc(struct efc_nport *nport,
     45				u32 port_id, bool init, bool targ)
     46{
     47	int rc;
     48	struct efc_node *node = NULL;
     49	struct efc *efc = nport->efc;
     50	struct efc_dma *dma;
     51
     52	if (nport->shutting_down) {
     53		efc_log_debug(efc, "node allocation when shutting down %06x",
     54			      port_id);
     55		return NULL;
     56	}
     57
     58	node = mempool_alloc(efc->node_pool, GFP_ATOMIC);
     59	if (!node) {
     60		efc_log_err(efc, "node allocation failed %06x", port_id);
     61		return NULL;
     62	}
     63	memset(node, 0, sizeof(*node));
     64
     65	dma = &node->sparm_dma_buf;
     66	dma->size = NODE_SPARAMS_SIZE;
     67	dma->virt = dma_pool_zalloc(efc->node_dma_pool, GFP_ATOMIC, &dma->phys);
     68	if (!dma->virt) {
     69		efc_log_err(efc, "node dma alloc failed\n");
     70		goto dma_fail;
     71	}
     72	node->rnode.indicator = U32_MAX;
     73	node->nport = nport;
     74
     75	node->efc = efc;
     76	node->init = init;
     77	node->targ = targ;
     78
     79	spin_lock_init(&node->pend_frames_lock);
     80	INIT_LIST_HEAD(&node->pend_frames);
     81	spin_lock_init(&node->els_ios_lock);
     82	INIT_LIST_HEAD(&node->els_ios_list);
     83	node->els_io_enabled = true;
     84
     85	rc = efc_cmd_node_alloc(efc, &node->rnode, port_id, nport);
     86	if (rc) {
     87		efc_log_err(efc, "efc_hw_node_alloc failed: %d\n", rc);
     88		goto hw_alloc_fail;
     89	}
     90
     91	node->rnode.node = node;
     92	node->sm.app = node;
     93	node->evtdepth = 0;
     94
     95	efc_node_update_display_name(node);
     96
     97	rc = xa_err(xa_store(&nport->lookup, port_id, node, GFP_ATOMIC));
     98	if (rc) {
     99		efc_log_err(efc, "Node lookup store failed: %d\n", rc);
    100		goto xa_fail;
    101	}
    102
    103	/* initialize refcount */
    104	kref_init(&node->ref);
    105	node->release = _efc_node_free;
    106	kref_get(&nport->ref);
    107
    108	return node;
    109
    110xa_fail:
    111	efc_node_free_resources(efc, &node->rnode);
    112hw_alloc_fail:
    113	dma_pool_free(efc->node_dma_pool, dma->virt, dma->phys);
    114dma_fail:
    115	mempool_free(node, efc->node_pool);
    116	return NULL;
    117}
    118
    119void
    120efc_node_free(struct efc_node *node)
    121{
    122	struct efc_nport *nport;
    123	struct efc *efc;
    124	int rc = 0;
    125	struct efc_node *ns = NULL;
    126
    127	nport = node->nport;
    128	efc = node->efc;
    129
    130	node_printf(node, "Free'd\n");
    131
    132	if (node->refound) {
    133		/*
    134		 * Save the name server node. We will send fake RSCN event at
    135		 * the end to handle ignored RSCN event during node deletion
    136		 */
    137		ns = efc_node_find(node->nport, FC_FID_DIR_SERV);
    138	}
    139
    140	if (!node->nport) {
    141		efc_log_err(efc, "Node already Freed\n");
    142		return;
    143	}
    144
    145	/* Free HW resources */
    146	rc = efc_node_free_resources(efc, &node->rnode);
    147	if (rc < 0)
    148		efc_log_err(efc, "efc_hw_node_free failed: %d\n", rc);
    149
    150	/* if the gidpt_delay_timer is still running, then delete it */
    151	if (timer_pending(&node->gidpt_delay_timer))
    152		del_timer(&node->gidpt_delay_timer);
    153
    154	xa_erase(&nport->lookup, node->rnode.fc_id);
    155
    156	/*
    157	 * If the node_list is empty,
    158	 * then post a ALL_CHILD_NODES_FREE event to the nport,
    159	 * after the lock is released.
    160	 * The nport may be free'd as a result of the event.
    161	 */
    162	if (xa_empty(&nport->lookup))
    163		efc_sm_post_event(&nport->sm, EFC_EVT_ALL_CHILD_NODES_FREE,
    164				  NULL);
    165
    166	node->nport = NULL;
    167	node->sm.current_state = NULL;
    168
    169	kref_put(&nport->ref, nport->release);
    170	kref_put(&node->ref, node->release);
    171
    172	if (ns) {
    173		/* sending fake RSCN event to name server node */
    174		efc_node_post_event(ns, EFC_EVT_RSCN_RCVD, NULL);
    175	}
    176}
    177
    178static void
    179efc_dma_copy_in(struct efc_dma *dma, void *buffer, u32 buffer_length)
    180{
    181	if (!dma || !buffer || !buffer_length)
    182		return;
    183
    184	if (buffer_length > dma->size)
    185		buffer_length = dma->size;
    186
    187	memcpy(dma->virt, buffer, buffer_length);
    188	dma->len = buffer_length;
    189}
    190
    191int
    192efc_node_attach(struct efc_node *node)
    193{
    194	int rc = 0;
    195	struct efc_nport *nport = node->nport;
    196	struct efc_domain *domain = nport->domain;
    197	struct efc *efc = node->efc;
    198
    199	if (!domain->attached) {
    200		efc_log_err(efc, "Warning: unattached domain\n");
    201		return -EIO;
    202	}
    203	/* Update node->wwpn/wwnn */
    204
    205	efc_node_build_eui_name(node->wwpn, sizeof(node->wwpn),
    206				efc_node_get_wwpn(node));
    207	efc_node_build_eui_name(node->wwnn, sizeof(node->wwnn),
    208				efc_node_get_wwnn(node));
    209
    210	efc_dma_copy_in(&node->sparm_dma_buf, node->service_params + 4,
    211			sizeof(node->service_params) - 4);
    212
    213	/* take lock to protect node->rnode.attached */
    214	rc = efc_cmd_node_attach(efc, &node->rnode, &node->sparm_dma_buf);
    215	if (rc < 0)
    216		efc_log_debug(efc, "efc_hw_node_attach failed: %d\n", rc);
    217
    218	return rc;
    219}
    220
    221void
    222efc_node_fcid_display(u32 fc_id, char *buffer, u32 buffer_length)
    223{
    224	switch (fc_id) {
    225	case FC_FID_FLOGI:
    226		snprintf(buffer, buffer_length, "fabric");
    227		break;
    228	case FC_FID_FCTRL:
    229		snprintf(buffer, buffer_length, "fabctl");
    230		break;
    231	case FC_FID_DIR_SERV:
    232		snprintf(buffer, buffer_length, "nserve");
    233		break;
    234	default:
    235		if (fc_id == FC_FID_DOM_MGR) {
    236			snprintf(buffer, buffer_length, "dctl%02x",
    237				 (fc_id & 0x0000ff));
    238		} else {
    239			snprintf(buffer, buffer_length, "%06x", fc_id);
    240		}
    241		break;
    242	}
    243}
    244
    245void
    246efc_node_update_display_name(struct efc_node *node)
    247{
    248	u32 port_id = node->rnode.fc_id;
    249	struct efc_nport *nport = node->nport;
    250	char portid_display[16];
    251
    252	efc_node_fcid_display(port_id, portid_display, sizeof(portid_display));
    253
    254	snprintf(node->display_name, sizeof(node->display_name), "%s.%s",
    255		 nport->display_name, portid_display);
    256}
    257
    258void
    259efc_node_send_ls_io_cleanup(struct efc_node *node)
    260{
    261	if (node->send_ls_acc != EFC_NODE_SEND_LS_ACC_NONE) {
    262		efc_log_debug(node->efc, "[%s] cleaning up LS_ACC oxid=0x%x\n",
    263			      node->display_name, node->ls_acc_oxid);
    264
    265		node->send_ls_acc = EFC_NODE_SEND_LS_ACC_NONE;
    266		node->ls_acc_io = NULL;
    267	}
    268}
    269
    270static void efc_node_handle_implicit_logo(struct efc_node *node)
    271{
    272	int rc;
    273
    274	/*
    275	 * currently, only case for implicit logo is PLOGI
    276	 * recvd. Thus, node's ELS IO pending list won't be
    277	 * empty (PLOGI will be on it)
    278	 */
    279	WARN_ON(node->send_ls_acc != EFC_NODE_SEND_LS_ACC_PLOGI);
    280	node_printf(node, "Reason: implicit logout, re-authenticate\n");
    281
    282	/* Re-attach node with the same HW node resources */
    283	node->req_free = false;
    284	rc = efc_node_attach(node);
    285	efc_node_transition(node, __efc_d_wait_node_attach, NULL);
    286	node->els_io_enabled = true;
    287
    288	if (rc < 0)
    289		efc_node_post_event(node, EFC_EVT_NODE_ATTACH_FAIL, NULL);
    290}
    291
    292static void efc_node_handle_explicit_logo(struct efc_node *node)
    293{
    294	s8 pend_frames_empty;
    295	unsigned long flags = 0;
    296
    297	/* cleanup any pending LS_ACC ELSs */
    298	efc_node_send_ls_io_cleanup(node);
    299
    300	spin_lock_irqsave(&node->pend_frames_lock, flags);
    301	pend_frames_empty = list_empty(&node->pend_frames);
    302	spin_unlock_irqrestore(&node->pend_frames_lock, flags);
    303
    304	/*
    305	 * there are two scenarios where we want to keep
    306	 * this node alive:
    307	 * 1. there are pending frames that need to be
    308	 *    processed or
    309	 * 2. we're an initiator and the remote node is
    310	 *    a target and we need to re-authenticate
    311	 */
    312	node_printf(node, "Shutdown: explicit logo pend=%d ", !pend_frames_empty);
    313	node_printf(node, "nport.ini=%d node.tgt=%d\n",
    314		    node->nport->enable_ini, node->targ);
    315	if (!pend_frames_empty || (node->nport->enable_ini && node->targ)) {
    316		u8 send_plogi = false;
    317
    318		if (node->nport->enable_ini && node->targ) {
    319			/*
    320			 * we're an initiator and
    321			 * node shutting down is a target;
    322			 * we'll need to re-authenticate in
    323			 * initial state
    324			 */
    325			send_plogi = true;
    326		}
    327
    328		/*
    329		 * transition to __efc_d_init
    330		 * (will retain HW node resources)
    331		 */
    332		node->els_io_enabled = true;
    333		node->req_free = false;
    334
    335		/*
    336		 * either pending frames exist or we are re-authenticating
    337		 * with PLOGI (or both); in either case, return to initial
    338		 * state
    339		 */
    340		efc_node_init_device(node, send_plogi);
    341	}
    342	/* else: let node shutdown occur */
    343}
    344
    345static void
    346efc_node_purge_pending(struct efc_node *node)
    347{
    348	struct efc *efc = node->efc;
    349	struct efc_hw_sequence *frame, *next;
    350	unsigned long flags = 0;
    351
    352	spin_lock_irqsave(&node->pend_frames_lock, flags);
    353
    354	list_for_each_entry_safe(frame, next, &node->pend_frames, list_entry) {
    355		list_del(&frame->list_entry);
    356		efc->tt.hw_seq_free(efc, frame);
    357	}
    358
    359	spin_unlock_irqrestore(&node->pend_frames_lock, flags);
    360}
    361
    362void
    363__efc_node_shutdown(struct efc_sm_ctx *ctx,
    364		    enum efc_sm_event evt, void *arg)
    365{
    366	struct efc_node *node = ctx->app;
    367
    368	efc_node_evt_set(ctx, evt, __func__);
    369
    370	node_sm_trace();
    371
    372	switch (evt) {
    373	case EFC_EVT_ENTER: {
    374		efc_node_hold_frames(node);
    375		WARN_ON(!efc_els_io_list_empty(node, &node->els_ios_list));
    376		/* by default, we will be freeing node after we unwind */
    377		node->req_free = true;
    378
    379		switch (node->shutdown_reason) {
    380		case EFC_NODE_SHUTDOWN_IMPLICIT_LOGO:
    381			/* Node shutdown b/c of PLOGI received when node
    382			 * already logged in. We have PLOGI service
    383			 * parameters, so submit node attach; we won't be
    384			 * freeing this node
    385			 */
    386
    387			efc_node_handle_implicit_logo(node);
    388			break;
    389
    390		case EFC_NODE_SHUTDOWN_EXPLICIT_LOGO:
    391			efc_node_handle_explicit_logo(node);
    392			break;
    393
    394		case EFC_NODE_SHUTDOWN_DEFAULT:
    395		default: {
    396			/*
    397			 * shutdown due to link down,
    398			 * node going away (xport event) or
    399			 * nport shutdown, purge pending and
    400			 * proceed to cleanup node
    401			 */
    402
    403			/* cleanup any pending LS_ACC ELSs */
    404			efc_node_send_ls_io_cleanup(node);
    405
    406			node_printf(node,
    407				    "Shutdown reason: default, purge pending\n");
    408			efc_node_purge_pending(node);
    409			break;
    410		}
    411		}
    412
    413		break;
    414	}
    415	case EFC_EVT_EXIT:
    416		efc_node_accept_frames(node);
    417		break;
    418
    419	default:
    420		__efc_node_common(__func__, ctx, evt, arg);
    421	}
    422}
    423
    424static bool
    425efc_node_check_els_quiesced(struct efc_node *node)
    426{
    427	/* check to see if ELS requests, completions are quiesced */
    428	if (node->els_req_cnt == 0 && node->els_cmpl_cnt == 0 &&
    429	    efc_els_io_list_empty(node, &node->els_ios_list)) {
    430		if (!node->attached) {
    431			/* hw node detach already completed, proceed */
    432			node_printf(node, "HW node not attached\n");
    433			efc_node_transition(node,
    434					    __efc_node_wait_ios_shutdown,
    435					     NULL);
    436		} else {
    437			/*
    438			 * hw node detach hasn't completed,
    439			 * transition and wait
    440			 */
    441			node_printf(node, "HW node still attached\n");
    442			efc_node_transition(node, __efc_node_wait_node_free,
    443					    NULL);
    444		}
    445		return true;
    446	}
    447	return false;
    448}
    449
    450void
    451efc_node_initiate_cleanup(struct efc_node *node)
    452{
    453	/*
    454	 * if ELS's have already been quiesced, will move to next state
    455	 * if ELS's have not been quiesced, abort them
    456	 */
    457	if (!efc_node_check_els_quiesced(node)) {
    458		efc_node_hold_frames(node);
    459		efc_node_transition(node, __efc_node_wait_els_shutdown, NULL);
    460	}
    461}
    462
    463void
    464__efc_node_wait_els_shutdown(struct efc_sm_ctx *ctx,
    465			     enum efc_sm_event evt, void *arg)
    466{
    467	bool check_quiesce = false;
    468	struct efc_node *node = ctx->app;
    469
    470	efc_node_evt_set(ctx, evt, __func__);
    471
    472	node_sm_trace();
    473	/* Node state machine: Wait for all ELSs to complete */
    474	switch (evt) {
    475	case EFC_EVT_ENTER:
    476		efc_node_hold_frames(node);
    477		if (efc_els_io_list_empty(node, &node->els_ios_list)) {
    478			node_printf(node, "All ELS IOs complete\n");
    479			check_quiesce = true;
    480		}
    481		break;
    482	case EFC_EVT_EXIT:
    483		efc_node_accept_frames(node);
    484		break;
    485
    486	case EFC_EVT_SRRS_ELS_REQ_OK:
    487	case EFC_EVT_SRRS_ELS_REQ_FAIL:
    488	case EFC_EVT_SRRS_ELS_REQ_RJT:
    489	case EFC_EVT_ELS_REQ_ABORTED:
    490		if (WARN_ON(!node->els_req_cnt))
    491			break;
    492		node->els_req_cnt--;
    493		check_quiesce = true;
    494		break;
    495
    496	case EFC_EVT_SRRS_ELS_CMPL_OK:
    497	case EFC_EVT_SRRS_ELS_CMPL_FAIL:
    498		if (WARN_ON(!node->els_cmpl_cnt))
    499			break;
    500		node->els_cmpl_cnt--;
    501		check_quiesce = true;
    502		break;
    503
    504	case EFC_EVT_ALL_CHILD_NODES_FREE:
    505		/* all ELS IO's complete */
    506		node_printf(node, "All ELS IOs complete\n");
    507		WARN_ON(!efc_els_io_list_empty(node, &node->els_ios_list));
    508		check_quiesce = true;
    509		break;
    510
    511	case EFC_EVT_NODE_ACTIVE_IO_LIST_EMPTY:
    512		check_quiesce = true;
    513		break;
    514
    515	case EFC_EVT_DOMAIN_ATTACH_OK:
    516		/* don't care about domain_attach_ok */
    517		break;
    518
    519	/* ignore shutdown events as we're already in shutdown path */
    520	case EFC_EVT_SHUTDOWN:
    521		/* have default shutdown event take precedence */
    522		node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
    523		fallthrough;
    524
    525	case EFC_EVT_SHUTDOWN_EXPLICIT_LOGO:
    526	case EFC_EVT_SHUTDOWN_IMPLICIT_LOGO:
    527		node_printf(node, "%s received\n", efc_sm_event_name(evt));
    528		break;
    529
    530	default:
    531		__efc_node_common(__func__, ctx, evt, arg);
    532	}
    533
    534	if (check_quiesce)
    535		efc_node_check_els_quiesced(node);
    536}
    537
    538void
    539__efc_node_wait_node_free(struct efc_sm_ctx *ctx,
    540			  enum efc_sm_event evt, void *arg)
    541{
    542	struct efc_node *node = ctx->app;
    543
    544	efc_node_evt_set(ctx, evt, __func__);
    545
    546	node_sm_trace();
    547
    548	switch (evt) {
    549	case EFC_EVT_ENTER:
    550		efc_node_hold_frames(node);
    551		break;
    552
    553	case EFC_EVT_EXIT:
    554		efc_node_accept_frames(node);
    555		break;
    556
    557	case EFC_EVT_NODE_FREE_OK:
    558		/* node is officially no longer attached */
    559		node->attached = false;
    560		efc_node_transition(node, __efc_node_wait_ios_shutdown, NULL);
    561		break;
    562
    563	case EFC_EVT_ALL_CHILD_NODES_FREE:
    564	case EFC_EVT_NODE_ACTIVE_IO_LIST_EMPTY:
    565		/* As IOs and ELS IO's complete we expect to get these events */
    566		break;
    567
    568	case EFC_EVT_DOMAIN_ATTACH_OK:
    569		/* don't care about domain_attach_ok */
    570		break;
    571
    572	/* ignore shutdown events as we're already in shutdown path */
    573	case EFC_EVT_SHUTDOWN:
    574		/* have default shutdown event take precedence */
    575		node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
    576		fallthrough;
    577
    578	case EFC_EVT_SHUTDOWN_EXPLICIT_LOGO:
    579	case EFC_EVT_SHUTDOWN_IMPLICIT_LOGO:
    580		node_printf(node, "%s received\n", efc_sm_event_name(evt));
    581		break;
    582	default:
    583		__efc_node_common(__func__, ctx, evt, arg);
    584	}
    585}
    586
    587void
    588__efc_node_wait_ios_shutdown(struct efc_sm_ctx *ctx,
    589			     enum efc_sm_event evt, void *arg)
    590{
    591	struct efc_node *node = ctx->app;
    592	struct efc *efc = node->efc;
    593
    594	efc_node_evt_set(ctx, evt, __func__);
    595
    596	node_sm_trace();
    597
    598	switch (evt) {
    599	case EFC_EVT_ENTER:
    600		efc_node_hold_frames(node);
    601
    602		/* first check to see if no ELS IOs are outstanding */
    603		if (efc_els_io_list_empty(node, &node->els_ios_list))
    604			/* If there are any active IOS, Free them. */
    605			efc_node_transition(node, __efc_node_shutdown, NULL);
    606		break;
    607
    608	case EFC_EVT_NODE_ACTIVE_IO_LIST_EMPTY:
    609	case EFC_EVT_ALL_CHILD_NODES_FREE:
    610		if (efc_els_io_list_empty(node, &node->els_ios_list))
    611			efc_node_transition(node, __efc_node_shutdown, NULL);
    612		break;
    613
    614	case EFC_EVT_EXIT:
    615		efc_node_accept_frames(node);
    616		break;
    617
    618	case EFC_EVT_SRRS_ELS_REQ_FAIL:
    619		/* Can happen as ELS IO IO's complete */
    620		if (WARN_ON(!node->els_req_cnt))
    621			break;
    622		node->els_req_cnt--;
    623		break;
    624
    625	/* ignore shutdown events as we're already in shutdown path */
    626	case EFC_EVT_SHUTDOWN:
    627		/* have default shutdown event take precedence */
    628		node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
    629		fallthrough;
    630
    631	case EFC_EVT_SHUTDOWN_EXPLICIT_LOGO:
    632	case EFC_EVT_SHUTDOWN_IMPLICIT_LOGO:
    633		efc_log_debug(efc, "[%s] %-20s\n", node->display_name,
    634			      efc_sm_event_name(evt));
    635		break;
    636	case EFC_EVT_DOMAIN_ATTACH_OK:
    637		/* don't care about domain_attach_ok */
    638		break;
    639	default:
    640		__efc_node_common(__func__, ctx, evt, arg);
    641	}
    642}
    643
    644void
    645__efc_node_common(const char *funcname, struct efc_sm_ctx *ctx,
    646		  enum efc_sm_event evt, void *arg)
    647{
    648	struct efc_node *node = NULL;
    649	struct efc *efc = NULL;
    650	struct efc_node_cb *cbdata = arg;
    651
    652	node = ctx->app;
    653	efc = node->efc;
    654
    655	switch (evt) {
    656	case EFC_EVT_ENTER:
    657	case EFC_EVT_REENTER:
    658	case EFC_EVT_EXIT:
    659	case EFC_EVT_NPORT_TOPOLOGY_NOTIFY:
    660	case EFC_EVT_NODE_MISSING:
    661	case EFC_EVT_FCP_CMD_RCVD:
    662		break;
    663
    664	case EFC_EVT_NODE_REFOUND:
    665		node->refound = true;
    666		break;
    667
    668	/*
    669	 * node->attached must be set appropriately
    670	 * for all node attach/detach events
    671	 */
    672	case EFC_EVT_NODE_ATTACH_OK:
    673		node->attached = true;
    674		break;
    675
    676	case EFC_EVT_NODE_FREE_OK:
    677	case EFC_EVT_NODE_ATTACH_FAIL:
    678		node->attached = false;
    679		break;
    680
    681	/*
    682	 * handle any ELS completions that
    683	 * other states either didn't care about
    684	 * or forgot about
    685	 */
    686	case EFC_EVT_SRRS_ELS_CMPL_OK:
    687	case EFC_EVT_SRRS_ELS_CMPL_FAIL:
    688		if (WARN_ON(!node->els_cmpl_cnt))
    689			break;
    690		node->els_cmpl_cnt--;
    691		break;
    692
    693	/*
    694	 * handle any ELS request completions that
    695	 * other states either didn't care about
    696	 * or forgot about
    697	 */
    698	case EFC_EVT_SRRS_ELS_REQ_OK:
    699	case EFC_EVT_SRRS_ELS_REQ_FAIL:
    700	case EFC_EVT_SRRS_ELS_REQ_RJT:
    701	case EFC_EVT_ELS_REQ_ABORTED:
    702		if (WARN_ON(!node->els_req_cnt))
    703			break;
    704		node->els_req_cnt--;
    705		break;
    706
    707	case EFC_EVT_ELS_RCVD: {
    708		struct fc_frame_header *hdr = cbdata->header->dma.virt;
    709
    710		/*
    711		 * Unsupported ELS was received,
    712		 * send LS_RJT, command not supported
    713		 */
    714		efc_log_debug(efc,
    715			      "[%s] (%s) ELS x%02x, LS_RJT not supported\n",
    716			      node->display_name, funcname,
    717			      ((u8 *)cbdata->payload->dma.virt)[0]);
    718
    719		efc_send_ls_rjt(node, be16_to_cpu(hdr->fh_ox_id),
    720				ELS_RJT_UNSUP, ELS_EXPL_NONE, 0);
    721		break;
    722	}
    723
    724	case EFC_EVT_PLOGI_RCVD:
    725	case EFC_EVT_FLOGI_RCVD:
    726	case EFC_EVT_LOGO_RCVD:
    727	case EFC_EVT_PRLI_RCVD:
    728	case EFC_EVT_PRLO_RCVD:
    729	case EFC_EVT_PDISC_RCVD:
    730	case EFC_EVT_FDISC_RCVD:
    731	case EFC_EVT_ADISC_RCVD:
    732	case EFC_EVT_RSCN_RCVD:
    733	case EFC_EVT_SCR_RCVD: {
    734		struct fc_frame_header *hdr = cbdata->header->dma.virt;
    735
    736		/* sm: / send ELS_RJT */
    737		efc_log_debug(efc, "[%s] (%s) %s sending ELS_RJT\n",
    738			      node->display_name, funcname,
    739			      efc_sm_event_name(evt));
    740		/* if we didn't catch this in a state, send generic LS_RJT */
    741		efc_send_ls_rjt(node, be16_to_cpu(hdr->fh_ox_id),
    742				ELS_RJT_UNAB, ELS_EXPL_NONE, 0);
    743		break;
    744	}
    745	case EFC_EVT_ABTS_RCVD: {
    746		efc_log_debug(efc, "[%s] (%s) %s sending BA_ACC\n",
    747			      node->display_name, funcname,
    748			      efc_sm_event_name(evt));
    749
    750		/* sm: / send BA_ACC */
    751		efc_send_bls_acc(node, cbdata->header->dma.virt);
    752		break;
    753	}
    754
    755	default:
    756		efc_log_debug(node->efc, "[%s] %-20s %-20s not handled\n",
    757			      node->display_name, funcname,
    758			      efc_sm_event_name(evt));
    759	}
    760}
    761
    762void
    763efc_node_save_sparms(struct efc_node *node, void *payload)
    764{
    765	memcpy(node->service_params, payload, sizeof(node->service_params));
    766}
    767
    768void
    769efc_node_post_event(struct efc_node *node,
    770		    enum efc_sm_event evt, void *arg)
    771{
    772	bool free_node = false;
    773
    774	node->evtdepth++;
    775
    776	efc_sm_post_event(&node->sm, evt, arg);
    777
    778	/* If our event call depth is one and
    779	 * we're not holding frames
    780	 * then we can dispatch any pending frames.
    781	 * We don't want to allow the efc_process_node_pending()
    782	 * call to recurse.
    783	 */
    784	if (!node->hold_frames && node->evtdepth == 1)
    785		efc_process_node_pending(node);
    786
    787	node->evtdepth--;
    788
    789	/*
    790	 * Free the node object if so requested,
    791	 * and we're at an event call depth of zero
    792	 */
    793	if (node->evtdepth == 0 && node->req_free)
    794		free_node = true;
    795
    796	if (free_node)
    797		efc_node_free(node);
    798}
    799
    800void
    801efc_node_transition(struct efc_node *node,
    802		    void (*state)(struct efc_sm_ctx *,
    803				  enum efc_sm_event, void *), void *data)
    804{
    805	struct efc_sm_ctx *ctx = &node->sm;
    806
    807	if (ctx->current_state == state) {
    808		efc_node_post_event(node, EFC_EVT_REENTER, data);
    809	} else {
    810		efc_node_post_event(node, EFC_EVT_EXIT, data);
    811		ctx->current_state = state;
    812		efc_node_post_event(node, EFC_EVT_ENTER, data);
    813	}
    814}
    815
    816void
    817efc_node_build_eui_name(char *buf, u32 buf_len, uint64_t eui_name)
    818{
    819	memset(buf, 0, buf_len);
    820
    821	snprintf(buf, buf_len, "eui.%016llX", (unsigned long long)eui_name);
    822}
    823
    824u64
    825efc_node_get_wwpn(struct efc_node *node)
    826{
    827	struct fc_els_flogi *sp =
    828			(struct fc_els_flogi *)node->service_params;
    829
    830	return be64_to_cpu(sp->fl_wwpn);
    831}
    832
    833u64
    834efc_node_get_wwnn(struct efc_node *node)
    835{
    836	struct fc_els_flogi *sp =
    837			(struct fc_els_flogi *)node->service_params;
    838
    839	return be64_to_cpu(sp->fl_wwnn);
    840}
    841
    842int
    843efc_node_check_els_req(struct efc_sm_ctx *ctx, enum efc_sm_event evt, void *arg,
    844		u8 cmd, void (*efc_node_common_func)(const char *,
    845				struct efc_sm_ctx *, enum efc_sm_event, void *),
    846		const char *funcname)
    847{
    848	return 0;
    849}
    850
    851int
    852efc_node_check_ns_req(struct efc_sm_ctx *ctx, enum efc_sm_event evt, void *arg,
    853		u16 cmd, void (*efc_node_common_func)(const char *,
    854				struct efc_sm_ctx *, enum efc_sm_event, void *),
    855		const char *funcname)
    856{
    857	return 0;
    858}
    859
    860int
    861efc_els_io_list_empty(struct efc_node *node, struct list_head *list)
    862{
    863	int empty;
    864	unsigned long flags = 0;
    865
    866	spin_lock_irqsave(&node->els_ios_lock, flags);
    867	empty = list_empty(list);
    868	spin_unlock_irqrestore(&node->els_ios_lock, flags);
    869	return empty;
    870}
    871
    872void
    873efc_node_pause(struct efc_node *node,
    874	       void (*state)(struct efc_sm_ctx *,
    875			     enum efc_sm_event, void *))
    876
    877{
    878	node->nodedb_state = state;
    879	efc_node_transition(node, __efc_node_paused, NULL);
    880}
    881
    882void
    883__efc_node_paused(struct efc_sm_ctx *ctx,
    884		  enum efc_sm_event evt, void *arg)
    885{
    886	struct efc_node *node = ctx->app;
    887
    888	efc_node_evt_set(ctx, evt, __func__);
    889
    890	node_sm_trace();
    891
    892	/*
    893	 * This state is entered when a state is "paused". When resumed, the
    894	 * node is transitioned to a previously saved state (node->ndoedb_state)
    895	 */
    896	switch (evt) {
    897	case EFC_EVT_ENTER:
    898		node_printf(node, "Paused\n");
    899		break;
    900
    901	case EFC_EVT_RESUME: {
    902		void (*pf)(struct efc_sm_ctx *ctx,
    903			   enum efc_sm_event evt, void *arg);
    904
    905		pf = node->nodedb_state;
    906
    907		node->nodedb_state = NULL;
    908		efc_node_transition(node, pf, NULL);
    909		break;
    910	}
    911
    912	case EFC_EVT_DOMAIN_ATTACH_OK:
    913		break;
    914
    915	case EFC_EVT_SHUTDOWN:
    916		node->req_free = true;
    917		break;
    918
    919	default:
    920		__efc_node_common(__func__, ctx, evt, arg);
    921	}
    922}
    923
    924void
    925efc_node_recv_els_frame(struct efc_node *node,
    926			struct efc_hw_sequence *seq)
    927{
    928	u32 prli_size = sizeof(struct fc_els_prli) + sizeof(struct fc_els_spp);
    929	struct {
    930		u32 cmd;
    931		enum efc_sm_event evt;
    932		u32 payload_size;
    933	} els_cmd_list[] = {
    934		{ELS_PLOGI, EFC_EVT_PLOGI_RCVD,	sizeof(struct fc_els_flogi)},
    935		{ELS_FLOGI, EFC_EVT_FLOGI_RCVD,	sizeof(struct fc_els_flogi)},
    936		{ELS_LOGO, EFC_EVT_LOGO_RCVD, sizeof(struct fc_els_ls_acc)},
    937		{ELS_PRLI, EFC_EVT_PRLI_RCVD, prli_size},
    938		{ELS_PRLO, EFC_EVT_PRLO_RCVD, prli_size},
    939		{ELS_PDISC, EFC_EVT_PDISC_RCVD,	MAX_ACC_REJECT_PAYLOAD},
    940		{ELS_FDISC, EFC_EVT_FDISC_RCVD,	MAX_ACC_REJECT_PAYLOAD},
    941		{ELS_ADISC, EFC_EVT_ADISC_RCVD,	sizeof(struct fc_els_adisc)},
    942		{ELS_RSCN, EFC_EVT_RSCN_RCVD, MAX_ACC_REJECT_PAYLOAD},
    943		{ELS_SCR, EFC_EVT_SCR_RCVD, MAX_ACC_REJECT_PAYLOAD},
    944	};
    945	struct efc_node_cb cbdata;
    946	u8 *buf = seq->payload->dma.virt;
    947	enum efc_sm_event evt = EFC_EVT_ELS_RCVD;
    948	u32 i;
    949
    950	memset(&cbdata, 0, sizeof(cbdata));
    951	cbdata.header = seq->header;
    952	cbdata.payload = seq->payload;
    953
    954	/* find a matching event for the ELS command */
    955	for (i = 0; i < ARRAY_SIZE(els_cmd_list); i++) {
    956		if (els_cmd_list[i].cmd == buf[0]) {
    957			evt = els_cmd_list[i].evt;
    958			break;
    959		}
    960	}
    961
    962	efc_node_post_event(node, evt, &cbdata);
    963}
    964
    965void
    966efc_node_recv_ct_frame(struct efc_node *node,
    967		       struct efc_hw_sequence *seq)
    968{
    969	struct fc_ct_hdr *iu = seq->payload->dma.virt;
    970	struct fc_frame_header *hdr = seq->header->dma.virt;
    971	struct efc *efc = node->efc;
    972	u16 gscmd = be16_to_cpu(iu->ct_cmd);
    973
    974	efc_log_err(efc, "[%s] Received cmd :%x sending CT_REJECT\n",
    975		    node->display_name, gscmd);
    976	efc_send_ct_rsp(efc, node, be16_to_cpu(hdr->fh_ox_id), iu,
    977			FC_FS_RJT, FC_FS_RJT_UNSUP, 0);
    978}
    979
    980void
    981efc_node_recv_fcp_cmd(struct efc_node *node, struct efc_hw_sequence *seq)
    982{
    983	struct efc_node_cb cbdata;
    984
    985	memset(&cbdata, 0, sizeof(cbdata));
    986	cbdata.header = seq->header;
    987	cbdata.payload = seq->payload;
    988
    989	efc_node_post_event(node, EFC_EVT_FCP_CMD_RCVD, &cbdata);
    990}
    991
    992void
    993efc_process_node_pending(struct efc_node *node)
    994{
    995	struct efc *efc = node->efc;
    996	struct efc_hw_sequence *seq = NULL;
    997	u32 pend_frames_processed = 0;
    998	unsigned long flags = 0;
    999
   1000	for (;;) {
   1001		/* need to check for hold frames condition after each frame
   1002		 * processed because any given frame could cause a transition
   1003		 * to a state that holds frames
   1004		 */
   1005		if (node->hold_frames)
   1006			break;
   1007
   1008		seq = NULL;
   1009		/* Get next frame/sequence */
   1010		spin_lock_irqsave(&node->pend_frames_lock, flags);
   1011
   1012		if (!list_empty(&node->pend_frames)) {
   1013			seq = list_first_entry(&node->pend_frames,
   1014					struct efc_hw_sequence, list_entry);
   1015			list_del(&seq->list_entry);
   1016		}
   1017		spin_unlock_irqrestore(&node->pend_frames_lock, flags);
   1018
   1019		if (!seq) {
   1020			pend_frames_processed =	node->pend_frames_processed;
   1021			node->pend_frames_processed = 0;
   1022			break;
   1023		}
   1024		node->pend_frames_processed++;
   1025
   1026		/* now dispatch frame(s) to dispatch function */
   1027		efc_node_dispatch_frame(node, seq);
   1028		efc->tt.hw_seq_free(efc, seq);
   1029	}
   1030
   1031	if (pend_frames_processed != 0)
   1032		efc_log_debug(efc, "%u node frames held and processed\n",
   1033			      pend_frames_processed);
   1034}
   1035
   1036void
   1037efc_scsi_sess_reg_complete(struct efc_node *node, u32 status)
   1038{
   1039	unsigned long flags = 0;
   1040	enum efc_sm_event evt = EFC_EVT_NODE_SESS_REG_OK;
   1041	struct efc *efc = node->efc;
   1042
   1043	if (status)
   1044		evt = EFC_EVT_NODE_SESS_REG_FAIL;
   1045
   1046	spin_lock_irqsave(&efc->lock, flags);
   1047	/* Notify the node to resume */
   1048	efc_node_post_event(node, evt, NULL);
   1049	spin_unlock_irqrestore(&efc->lock, flags);
   1050}
   1051
   1052void
   1053efc_scsi_del_initiator_complete(struct efc *efc, struct efc_node *node)
   1054{
   1055	unsigned long flags = 0;
   1056
   1057	spin_lock_irqsave(&efc->lock, flags);
   1058	/* Notify the node to resume */
   1059	efc_node_post_event(node, EFC_EVT_NODE_DEL_INI_COMPLETE, NULL);
   1060	spin_unlock_irqrestore(&efc->lock, flags);
   1061}
   1062
   1063void
   1064efc_scsi_del_target_complete(struct efc *efc, struct efc_node *node)
   1065{
   1066	unsigned long flags = 0;
   1067
   1068	spin_lock_irqsave(&efc->lock, flags);
   1069	/* Notify the node to resume */
   1070	efc_node_post_event(node, EFC_EVT_NODE_DEL_TGT_COMPLETE, NULL);
   1071	spin_unlock_irqrestore(&efc->lock, flags);
   1072}
   1073
   1074void
   1075efc_scsi_io_list_empty(struct efc *efc, struct efc_node *node)
   1076{
   1077	unsigned long flags = 0;
   1078
   1079	spin_lock_irqsave(&efc->lock, flags);
   1080	efc_node_post_event(node, EFC_EVT_NODE_ACTIVE_IO_LIST_EMPTY, NULL);
   1081	spin_unlock_irqrestore(&efc->lock, flags);
   1082}
   1083
   1084void efc_node_post_els_resp(struct efc_node *node, u32 evt, void *arg)
   1085{
   1086	struct efc *efc = node->efc;
   1087	unsigned long flags = 0;
   1088
   1089	spin_lock_irqsave(&efc->lock, flags);
   1090	efc_node_post_event(node, evt, arg);
   1091	spin_unlock_irqrestore(&efc->lock, flags);
   1092}
   1093
   1094void efc_node_post_shutdown(struct efc_node *node, void *arg)
   1095{
   1096	unsigned long flags = 0;
   1097	struct efc *efc = node->efc;
   1098
   1099	spin_lock_irqsave(&efc->lock, flags);
   1100	efc_node_post_event(node, EFC_EVT_SHUTDOWN, arg);
   1101	spin_unlock_irqrestore(&efc->lock, flags);
   1102}