1
2
3
4
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
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
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
135
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
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
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
158
159
160
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
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
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
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
276
277
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
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
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
306
307
308
309
310
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
321
322
323
324
325 send_plogi = true;
326 }
327
328
329
330
331
332 node->els_io_enabled = true;
333 node->req_free = false;
334
335
336
337
338
339
340 efc_node_init_device(node, send_plogi);
341 }
342
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
377 node->req_free = true;
378
379 switch (node->shutdown_reason) {
380 case EFC_NODE_SHUTDOWN_IMPLICIT_LOGO:
381
382
383
384
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
398
399
400
401
402
403
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
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
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
439
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
455
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
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
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
517 break;
518
519
520 case EFC_EVT_SHUTDOWN:
521
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
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
566 break;
567
568 case EFC_EVT_DOMAIN_ATTACH_OK:
569
570 break;
571
572
573 case EFC_EVT_SHUTDOWN:
574
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
603 if (efc_els_io_list_empty(node, &node->els_ios_list))
604
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
620 if (WARN_ON(!node->els_req_cnt))
621 break;
622 node->els_req_cnt--;
623 break;
624
625
626 case EFC_EVT_SHUTDOWN:
627
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
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
670
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
683
684
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
695
696
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
712
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
737 efc_log_debug(efc, "[%s] (%s) %s sending ELS_RJT\n",
738 node->display_name, funcname,
739 efc_sm_event_name(evt));
740
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
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
779
780
781
782
783
784 if (!node->hold_frames && node->evtdepth == 1)
785 efc_process_node_pending(node);
786
787 node->evtdepth--;
788
789
790
791
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
894
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
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
1002
1003
1004
1005 if (node->hold_frames)
1006 break;
1007
1008 seq = NULL;
1009
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
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
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
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
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}
1103