efc_device.c 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602
  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. * device_sm Node State Machine: Remote Device States
  8. */
  9. #include "efc.h"
  10. #include "efc_device.h"
  11. #include "efc_fabric.h"
  12. void
  13. efc_d_send_prli_rsp(struct efc_node *node, u16 ox_id)
  14. {
  15. int rc = EFC_SCSI_CALL_COMPLETE;
  16. struct efc *efc = node->efc;
  17. node->ls_acc_oxid = ox_id;
  18. node->send_ls_acc = EFC_NODE_SEND_LS_ACC_PRLI;
  19. /*
  20. * Wait for backend session registration
  21. * to complete before sending PRLI resp
  22. */
  23. if (node->init) {
  24. efc_log_info(efc, "[%s] found(initiator) WWPN:%s WWNN:%s\n",
  25. node->display_name, node->wwpn, node->wwnn);
  26. if (node->nport->enable_tgt)
  27. rc = efc->tt.scsi_new_node(efc, node);
  28. }
  29. if (rc < 0)
  30. efc_node_post_event(node, EFC_EVT_NODE_SESS_REG_FAIL, NULL);
  31. if (rc == EFC_SCSI_CALL_COMPLETE)
  32. efc_node_post_event(node, EFC_EVT_NODE_SESS_REG_OK, NULL);
  33. }
  34. static void
  35. __efc_d_common(const char *funcname, struct efc_sm_ctx *ctx,
  36. enum efc_sm_event evt, void *arg)
  37. {
  38. struct efc_node *node = NULL;
  39. struct efc *efc = NULL;
  40. node = ctx->app;
  41. efc = node->efc;
  42. switch (evt) {
  43. /* Handle shutdown events */
  44. case EFC_EVT_SHUTDOWN:
  45. efc_log_debug(efc, "[%s] %-20s %-20s\n", node->display_name,
  46. funcname, efc_sm_event_name(evt));
  47. node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
  48. efc_node_transition(node, __efc_d_initiate_shutdown, NULL);
  49. break;
  50. case EFC_EVT_SHUTDOWN_EXPLICIT_LOGO:
  51. efc_log_debug(efc, "[%s] %-20s %-20s\n",
  52. node->display_name, funcname,
  53. efc_sm_event_name(evt));
  54. node->shutdown_reason = EFC_NODE_SHUTDOWN_EXPLICIT_LOGO;
  55. efc_node_transition(node, __efc_d_initiate_shutdown, NULL);
  56. break;
  57. case EFC_EVT_SHUTDOWN_IMPLICIT_LOGO:
  58. efc_log_debug(efc, "[%s] %-20s %-20s\n", node->display_name,
  59. funcname, efc_sm_event_name(evt));
  60. node->shutdown_reason = EFC_NODE_SHUTDOWN_IMPLICIT_LOGO;
  61. efc_node_transition(node, __efc_d_initiate_shutdown, NULL);
  62. break;
  63. default:
  64. /* call default event handler common to all nodes */
  65. __efc_node_common(funcname, ctx, evt, arg);
  66. }
  67. }
  68. static void
  69. __efc_d_wait_del_node(struct efc_sm_ctx *ctx,
  70. enum efc_sm_event evt, void *arg)
  71. {
  72. struct efc_node *node = ctx->app;
  73. efc_node_evt_set(ctx, evt, __func__);
  74. /*
  75. * State is entered when a node sends a delete initiator/target call
  76. * to the target-server/initiator-client and needs to wait for that
  77. * work to complete.
  78. */
  79. node_sm_trace();
  80. switch (evt) {
  81. case EFC_EVT_ENTER:
  82. efc_node_hold_frames(node);
  83. fallthrough;
  84. case EFC_EVT_NODE_ACTIVE_IO_LIST_EMPTY:
  85. case EFC_EVT_ALL_CHILD_NODES_FREE:
  86. /* These are expected events. */
  87. break;
  88. case EFC_EVT_NODE_DEL_INI_COMPLETE:
  89. case EFC_EVT_NODE_DEL_TGT_COMPLETE:
  90. /*
  91. * node has either been detached or is in the process
  92. * of being detached,
  93. * call common node's initiate cleanup function
  94. */
  95. efc_node_initiate_cleanup(node);
  96. break;
  97. case EFC_EVT_EXIT:
  98. efc_node_accept_frames(node);
  99. break;
  100. case EFC_EVT_SRRS_ELS_REQ_FAIL:
  101. /* Can happen as ELS IO IO's complete */
  102. WARN_ON(!node->els_req_cnt);
  103. node->els_req_cnt--;
  104. break;
  105. /* ignore shutdown events as we're already in shutdown path */
  106. case EFC_EVT_SHUTDOWN:
  107. /* have default shutdown event take precedence */
  108. node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
  109. fallthrough;
  110. case EFC_EVT_SHUTDOWN_EXPLICIT_LOGO:
  111. case EFC_EVT_SHUTDOWN_IMPLICIT_LOGO:
  112. node_printf(node, "%s received\n", efc_sm_event_name(evt));
  113. break;
  114. case EFC_EVT_DOMAIN_ATTACH_OK:
  115. /* don't care about domain_attach_ok */
  116. break;
  117. default:
  118. __efc_d_common(__func__, ctx, evt, arg);
  119. }
  120. }
  121. static void
  122. __efc_d_wait_del_ini_tgt(struct efc_sm_ctx *ctx,
  123. enum efc_sm_event evt, void *arg)
  124. {
  125. struct efc_node *node = ctx->app;
  126. efc_node_evt_set(ctx, evt, __func__);
  127. node_sm_trace();
  128. switch (evt) {
  129. case EFC_EVT_ENTER:
  130. efc_node_hold_frames(node);
  131. fallthrough;
  132. case EFC_EVT_NODE_ACTIVE_IO_LIST_EMPTY:
  133. case EFC_EVT_ALL_CHILD_NODES_FREE:
  134. /* These are expected events. */
  135. break;
  136. case EFC_EVT_NODE_DEL_INI_COMPLETE:
  137. case EFC_EVT_NODE_DEL_TGT_COMPLETE:
  138. efc_node_transition(node, __efc_d_wait_del_node, NULL);
  139. break;
  140. case EFC_EVT_EXIT:
  141. efc_node_accept_frames(node);
  142. break;
  143. case EFC_EVT_SRRS_ELS_REQ_FAIL:
  144. /* Can happen as ELS IO IO's complete */
  145. WARN_ON(!node->els_req_cnt);
  146. node->els_req_cnt--;
  147. break;
  148. /* ignore shutdown events as we're already in shutdown path */
  149. case EFC_EVT_SHUTDOWN:
  150. /* have default shutdown event take precedence */
  151. node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
  152. fallthrough;
  153. case EFC_EVT_SHUTDOWN_EXPLICIT_LOGO:
  154. case EFC_EVT_SHUTDOWN_IMPLICIT_LOGO:
  155. node_printf(node, "%s received\n", efc_sm_event_name(evt));
  156. break;
  157. case EFC_EVT_DOMAIN_ATTACH_OK:
  158. /* don't care about domain_attach_ok */
  159. break;
  160. default:
  161. __efc_d_common(__func__, ctx, evt, arg);
  162. }
  163. }
  164. void
  165. __efc_d_initiate_shutdown(struct efc_sm_ctx *ctx,
  166. enum efc_sm_event evt, void *arg)
  167. {
  168. struct efc_node *node = ctx->app;
  169. struct efc *efc = node->efc;
  170. efc_node_evt_set(ctx, evt, __func__);
  171. node_sm_trace();
  172. switch (evt) {
  173. case EFC_EVT_ENTER: {
  174. int rc = EFC_SCSI_CALL_COMPLETE;
  175. /* assume no wait needed */
  176. node->els_io_enabled = false;
  177. /* make necessary delete upcall(s) */
  178. if (node->init && !node->targ) {
  179. efc_log_info(node->efc,
  180. "[%s] delete (initiator) WWPN %s WWNN %s\n",
  181. node->display_name,
  182. node->wwpn, node->wwnn);
  183. efc_node_transition(node,
  184. __efc_d_wait_del_node,
  185. NULL);
  186. if (node->nport->enable_tgt)
  187. rc = efc->tt.scsi_del_node(efc, node,
  188. EFC_SCSI_INITIATOR_DELETED);
  189. if (rc == EFC_SCSI_CALL_COMPLETE || rc < 0)
  190. efc_node_post_event(node,
  191. EFC_EVT_NODE_DEL_INI_COMPLETE, NULL);
  192. } else if (node->targ && !node->init) {
  193. efc_log_info(node->efc,
  194. "[%s] delete (target) WWPN %s WWNN %s\n",
  195. node->display_name,
  196. node->wwpn, node->wwnn);
  197. efc_node_transition(node,
  198. __efc_d_wait_del_node,
  199. NULL);
  200. if (node->nport->enable_ini)
  201. rc = efc->tt.scsi_del_node(efc, node,
  202. EFC_SCSI_TARGET_DELETED);
  203. if (rc == EFC_SCSI_CALL_COMPLETE)
  204. efc_node_post_event(node,
  205. EFC_EVT_NODE_DEL_TGT_COMPLETE, NULL);
  206. } else if (node->init && node->targ) {
  207. efc_log_info(node->efc,
  208. "[%s] delete (I+T) WWPN %s WWNN %s\n",
  209. node->display_name, node->wwpn, node->wwnn);
  210. efc_node_transition(node, __efc_d_wait_del_ini_tgt,
  211. NULL);
  212. if (node->nport->enable_tgt)
  213. rc = efc->tt.scsi_del_node(efc, node,
  214. EFC_SCSI_INITIATOR_DELETED);
  215. if (rc == EFC_SCSI_CALL_COMPLETE)
  216. efc_node_post_event(node,
  217. EFC_EVT_NODE_DEL_INI_COMPLETE, NULL);
  218. /* assume no wait needed */
  219. rc = EFC_SCSI_CALL_COMPLETE;
  220. if (node->nport->enable_ini)
  221. rc = efc->tt.scsi_del_node(efc, node,
  222. EFC_SCSI_TARGET_DELETED);
  223. if (rc == EFC_SCSI_CALL_COMPLETE)
  224. efc_node_post_event(node,
  225. EFC_EVT_NODE_DEL_TGT_COMPLETE, NULL);
  226. }
  227. /* we've initiated the upcalls as needed, now kick off the node
  228. * detach to precipitate the aborting of outstanding exchanges
  229. * associated with said node
  230. *
  231. * Beware: if we've made upcall(s), we've already transitioned
  232. * to a new state by the time we execute this.
  233. * consider doing this before the upcalls?
  234. */
  235. if (node->attached) {
  236. /* issue hw node free; don't care if succeeds right
  237. * away or sometime later, will check node->attached
  238. * later in shutdown process
  239. */
  240. rc = efc_cmd_node_detach(efc, &node->rnode);
  241. if (rc < 0)
  242. node_printf(node,
  243. "Failed freeing HW node, rc=%d\n",
  244. rc);
  245. }
  246. /* if neither initiator nor target, proceed to cleanup */
  247. if (!node->init && !node->targ) {
  248. /*
  249. * node has either been detached or is in
  250. * the process of being detached,
  251. * call common node's initiate cleanup function
  252. */
  253. efc_node_initiate_cleanup(node);
  254. }
  255. break;
  256. }
  257. case EFC_EVT_ALL_CHILD_NODES_FREE:
  258. /* Ignore, this can happen if an ELS is
  259. * aborted while in a delay/retry state
  260. */
  261. break;
  262. default:
  263. __efc_d_common(__func__, ctx, evt, arg);
  264. }
  265. }
  266. void
  267. __efc_d_wait_loop(struct efc_sm_ctx *ctx,
  268. enum efc_sm_event evt, void *arg)
  269. {
  270. struct efc_node *node = ctx->app;
  271. efc_node_evt_set(ctx, evt, __func__);
  272. node_sm_trace();
  273. switch (evt) {
  274. case EFC_EVT_ENTER:
  275. efc_node_hold_frames(node);
  276. break;
  277. case EFC_EVT_EXIT:
  278. efc_node_accept_frames(node);
  279. break;
  280. case EFC_EVT_DOMAIN_ATTACH_OK: {
  281. /* send PLOGI automatically if initiator */
  282. efc_node_init_device(node, true);
  283. break;
  284. }
  285. default:
  286. __efc_d_common(__func__, ctx, evt, arg);
  287. }
  288. }
  289. void
  290. efc_send_ls_acc_after_attach(struct efc_node *node,
  291. struct fc_frame_header *hdr,
  292. enum efc_node_send_ls_acc ls)
  293. {
  294. u16 ox_id = be16_to_cpu(hdr->fh_ox_id);
  295. /* Save the OX_ID for sending LS_ACC sometime later */
  296. WARN_ON(node->send_ls_acc != EFC_NODE_SEND_LS_ACC_NONE);
  297. node->ls_acc_oxid = ox_id;
  298. node->send_ls_acc = ls;
  299. node->ls_acc_did = ntoh24(hdr->fh_d_id);
  300. }
  301. void
  302. efc_process_prli_payload(struct efc_node *node, void *prli)
  303. {
  304. struct {
  305. struct fc_els_prli prli;
  306. struct fc_els_spp sp;
  307. } *pp;
  308. pp = prli;
  309. node->init = (pp->sp.spp_flags & FCP_SPPF_INIT_FCN) != 0;
  310. node->targ = (pp->sp.spp_flags & FCP_SPPF_TARG_FCN) != 0;
  311. }
  312. void
  313. __efc_d_wait_plogi_acc_cmpl(struct efc_sm_ctx *ctx,
  314. enum efc_sm_event evt, void *arg)
  315. {
  316. struct efc_node *node = ctx->app;
  317. efc_node_evt_set(ctx, evt, __func__);
  318. node_sm_trace();
  319. switch (evt) {
  320. case EFC_EVT_ENTER:
  321. efc_node_hold_frames(node);
  322. break;
  323. case EFC_EVT_EXIT:
  324. efc_node_accept_frames(node);
  325. break;
  326. case EFC_EVT_SRRS_ELS_CMPL_FAIL:
  327. WARN_ON(!node->els_cmpl_cnt);
  328. node->els_cmpl_cnt--;
  329. node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
  330. efc_node_transition(node, __efc_d_initiate_shutdown, NULL);
  331. break;
  332. case EFC_EVT_SRRS_ELS_CMPL_OK: /* PLOGI ACC completions */
  333. WARN_ON(!node->els_cmpl_cnt);
  334. node->els_cmpl_cnt--;
  335. efc_node_transition(node, __efc_d_port_logged_in, NULL);
  336. break;
  337. default:
  338. __efc_d_common(__func__, ctx, evt, arg);
  339. }
  340. }
  341. void
  342. __efc_d_wait_logo_rsp(struct efc_sm_ctx *ctx,
  343. enum efc_sm_event evt, void *arg)
  344. {
  345. struct efc_node *node = ctx->app;
  346. efc_node_evt_set(ctx, evt, __func__);
  347. node_sm_trace();
  348. switch (evt) {
  349. case EFC_EVT_ENTER:
  350. efc_node_hold_frames(node);
  351. break;
  352. case EFC_EVT_EXIT:
  353. efc_node_accept_frames(node);
  354. break;
  355. case EFC_EVT_SRRS_ELS_REQ_OK:
  356. case EFC_EVT_SRRS_ELS_REQ_RJT:
  357. case EFC_EVT_SRRS_ELS_REQ_FAIL:
  358. /* LOGO response received, sent shutdown */
  359. if (efc_node_check_els_req(ctx, evt, arg, ELS_LOGO,
  360. __efc_d_common, __func__))
  361. return;
  362. WARN_ON(!node->els_req_cnt);
  363. node->els_req_cnt--;
  364. node_printf(node,
  365. "LOGO sent (evt=%s), shutdown node\n",
  366. efc_sm_event_name(evt));
  367. /* sm: / post explicit logout */
  368. efc_node_post_event(node, EFC_EVT_SHUTDOWN_EXPLICIT_LOGO,
  369. NULL);
  370. break;
  371. default:
  372. __efc_d_common(__func__, ctx, evt, arg);
  373. }
  374. }
  375. void
  376. efc_node_init_device(struct efc_node *node, bool send_plogi)
  377. {
  378. node->send_plogi = send_plogi;
  379. if ((node->efc->nodedb_mask & EFC_NODEDB_PAUSE_NEW_NODES) &&
  380. (node->rnode.fc_id != FC_FID_DOM_MGR)) {
  381. node->nodedb_state = __efc_d_init;
  382. efc_node_transition(node, __efc_node_paused, NULL);
  383. } else {
  384. efc_node_transition(node, __efc_d_init, NULL);
  385. }
  386. }
  387. static void
  388. efc_d_check_plogi_topology(struct efc_node *node, u32 d_id)
  389. {
  390. switch (node->nport->topology) {
  391. case EFC_NPORT_TOPO_P2P:
  392. /* we're not attached and nport is p2p,
  393. * need to attach
  394. */
  395. efc_domain_attach(node->nport->domain, d_id);
  396. efc_node_transition(node, __efc_d_wait_domain_attach, NULL);
  397. break;
  398. case EFC_NPORT_TOPO_FABRIC:
  399. /* we're not attached and nport is fabric, domain
  400. * attach should have already been requested as part
  401. * of the fabric state machine, wait for it
  402. */
  403. efc_node_transition(node, __efc_d_wait_domain_attach, NULL);
  404. break;
  405. case EFC_NPORT_TOPO_UNKNOWN:
  406. /* Two possibilities:
  407. * 1. received a PLOGI before our FLOGI has completed
  408. * (possible since completion comes in on another
  409. * CQ), thus we don't know what we're connected to
  410. * yet; transition to a state to wait for the
  411. * fabric node to tell us;
  412. * 2. PLOGI received before link went down and we
  413. * haven't performed domain attach yet.
  414. * Note: we cannot distinguish between 1. and 2.
  415. * so have to assume PLOGI
  416. * was received after link back up.
  417. */
  418. node_printf(node, "received PLOGI, unknown topology did=0x%x\n",
  419. d_id);
  420. efc_node_transition(node, __efc_d_wait_topology_notify, NULL);
  421. break;
  422. default:
  423. node_printf(node, "received PLOGI, unexpected topology %d\n",
  424. node->nport->topology);
  425. }
  426. }
  427. void
  428. __efc_d_init(struct efc_sm_ctx *ctx, enum efc_sm_event evt, void *arg)
  429. {
  430. struct efc_node_cb *cbdata = arg;
  431. struct efc_node *node = ctx->app;
  432. efc_node_evt_set(ctx, evt, __func__);
  433. node_sm_trace();
  434. /*
  435. * This state is entered when a node is instantiated,
  436. * either having been discovered from a name services query,
  437. * or having received a PLOGI/FLOGI.
  438. */
  439. switch (evt) {
  440. case EFC_EVT_ENTER:
  441. if (!node->send_plogi)
  442. break;
  443. /* only send if we have initiator capability,
  444. * and domain is attached
  445. */
  446. if (node->nport->enable_ini &&
  447. node->nport->domain->attached) {
  448. efc_send_plogi(node);
  449. efc_node_transition(node, __efc_d_wait_plogi_rsp, NULL);
  450. } else {
  451. node_printf(node, "not sending plogi nport.ini=%d,",
  452. node->nport->enable_ini);
  453. node_printf(node, "domain attached=%d\n",
  454. node->nport->domain->attached);
  455. }
  456. break;
  457. case EFC_EVT_PLOGI_RCVD: {
  458. /* T, or I+T */
  459. struct fc_frame_header *hdr = cbdata->header->dma.virt;
  460. int rc;
  461. efc_node_save_sparms(node, cbdata->payload->dma.virt);
  462. efc_send_ls_acc_after_attach(node,
  463. cbdata->header->dma.virt,
  464. EFC_NODE_SEND_LS_ACC_PLOGI);
  465. /* domain not attached; several possibilities: */
  466. if (!node->nport->domain->attached) {
  467. efc_d_check_plogi_topology(node, ntoh24(hdr->fh_d_id));
  468. break;
  469. }
  470. /* domain already attached */
  471. rc = efc_node_attach(node);
  472. efc_node_transition(node, __efc_d_wait_node_attach, NULL);
  473. if (rc < 0)
  474. efc_node_post_event(node, EFC_EVT_NODE_ATTACH_FAIL, NULL);
  475. break;
  476. }
  477. case EFC_EVT_FDISC_RCVD: {
  478. __efc_d_common(__func__, ctx, evt, arg);
  479. break;
  480. }
  481. case EFC_EVT_FLOGI_RCVD: {
  482. struct fc_frame_header *hdr = cbdata->header->dma.virt;
  483. u32 d_id = ntoh24(hdr->fh_d_id);
  484. /* sm: / save sparams, send FLOGI acc */
  485. memcpy(node->nport->domain->flogi_service_params,
  486. cbdata->payload->dma.virt,
  487. sizeof(struct fc_els_flogi));
  488. /* send FC LS_ACC response, override s_id */
  489. efc_fabric_set_topology(node, EFC_NPORT_TOPO_P2P);
  490. efc_send_flogi_p2p_acc(node, be16_to_cpu(hdr->fh_ox_id), d_id);
  491. if (efc_p2p_setup(node->nport)) {
  492. node_printf(node, "p2p failed, shutting down node\n");
  493. efc_node_post_event(node, EFC_EVT_SHUTDOWN, NULL);
  494. break;
  495. }
  496. efc_node_transition(node, __efc_p2p_wait_flogi_acc_cmpl, NULL);
  497. break;
  498. }
  499. case EFC_EVT_LOGO_RCVD: {
  500. struct fc_frame_header *hdr = cbdata->header->dma.virt;
  501. if (!node->nport->domain->attached) {
  502. /* most likely a frame left over from before a link
  503. * down; drop and
  504. * shut node down w/ "explicit logout" so pending
  505. * frames are processed
  506. */
  507. node_printf(node, "%s domain not attached, dropping\n",
  508. efc_sm_event_name(evt));
  509. efc_node_post_event(node,
  510. EFC_EVT_SHUTDOWN_EXPLICIT_LOGO, NULL);
  511. break;
  512. }
  513. efc_send_logo_acc(node, be16_to_cpu(hdr->fh_ox_id));
  514. efc_node_transition(node, __efc_d_wait_logo_acc_cmpl, NULL);
  515. break;
  516. }
  517. case EFC_EVT_PRLI_RCVD:
  518. case EFC_EVT_PRLO_RCVD:
  519. case EFC_EVT_PDISC_RCVD:
  520. case EFC_EVT_ADISC_RCVD:
  521. case EFC_EVT_RSCN_RCVD: {
  522. struct fc_frame_header *hdr = cbdata->header->dma.virt;
  523. if (!node->nport->domain->attached) {
  524. /* most likely a frame left over from before a link
  525. * down; drop and shut node down w/ "explicit logout"
  526. * so pending frames are processed
  527. */
  528. node_printf(node, "%s domain not attached, dropping\n",
  529. efc_sm_event_name(evt));
  530. efc_node_post_event(node,
  531. EFC_EVT_SHUTDOWN_EXPLICIT_LOGO,
  532. NULL);
  533. break;
  534. }
  535. node_printf(node, "%s received, sending reject\n",
  536. efc_sm_event_name(evt));
  537. efc_send_ls_rjt(node, be16_to_cpu(hdr->fh_ox_id),
  538. ELS_RJT_UNAB, ELS_EXPL_PLOGI_REQD, 0);
  539. break;
  540. }
  541. case EFC_EVT_FCP_CMD_RCVD: {
  542. /* note: problem, we're now expecting an ELS REQ completion
  543. * from both the LOGO and PLOGI
  544. */
  545. if (!node->nport->domain->attached) {
  546. /* most likely a frame left over from before a
  547. * link down; drop and
  548. * shut node down w/ "explicit logout" so pending
  549. * frames are processed
  550. */
  551. node_printf(node, "%s domain not attached, dropping\n",
  552. efc_sm_event_name(evt));
  553. efc_node_post_event(node,
  554. EFC_EVT_SHUTDOWN_EXPLICIT_LOGO,
  555. NULL);
  556. break;
  557. }
  558. /* Send LOGO */
  559. node_printf(node, "FCP_CMND received, send LOGO\n");
  560. if (efc_send_logo(node)) {
  561. /*
  562. * failed to send LOGO, go ahead and cleanup node
  563. * anyways
  564. */
  565. node_printf(node, "Failed to send LOGO\n");
  566. efc_node_post_event(node,
  567. EFC_EVT_SHUTDOWN_EXPLICIT_LOGO,
  568. NULL);
  569. } else {
  570. /* sent LOGO, wait for response */
  571. efc_node_transition(node,
  572. __efc_d_wait_logo_rsp, NULL);
  573. }
  574. break;
  575. }
  576. case EFC_EVT_DOMAIN_ATTACH_OK:
  577. /* don't care about domain_attach_ok */
  578. break;
  579. default:
  580. __efc_d_common(__func__, ctx, evt, arg);
  581. }
  582. }
  583. void
  584. __efc_d_wait_plogi_rsp(struct efc_sm_ctx *ctx,
  585. enum efc_sm_event evt, void *arg)
  586. {
  587. int rc;
  588. struct efc_node_cb *cbdata = arg;
  589. struct efc_node *node = ctx->app;
  590. efc_node_evt_set(ctx, evt, __func__);
  591. node_sm_trace();
  592. switch (evt) {
  593. case EFC_EVT_PLOGI_RCVD: {
  594. /* T, or I+T */
  595. /* received PLOGI with svc parms, go ahead and attach node
  596. * when PLOGI that was sent ultimately completes, it'll be a
  597. * no-op
  598. *
  599. * If there is an outstanding PLOGI sent, can we set a flag
  600. * to indicate that we don't want to retry it if it times out?
  601. */
  602. efc_node_save_sparms(node, cbdata->payload->dma.virt);
  603. efc_send_ls_acc_after_attach(node,
  604. cbdata->header->dma.virt,
  605. EFC_NODE_SEND_LS_ACC_PLOGI);
  606. /* sm: domain->attached / efc_node_attach */
  607. rc = efc_node_attach(node);
  608. efc_node_transition(node, __efc_d_wait_node_attach, NULL);
  609. if (rc < 0)
  610. efc_node_post_event(node,
  611. EFC_EVT_NODE_ATTACH_FAIL, NULL);
  612. break;
  613. }
  614. case EFC_EVT_PRLI_RCVD:
  615. /* I, or I+T */
  616. /* sent PLOGI and before completion was seen, received the
  617. * PRLI from the remote node (WCQEs and RCQEs come in on
  618. * different queues and order of processing cannot be assumed)
  619. * Save OXID so PRLI can be sent after the attach and continue
  620. * to wait for PLOGI response
  621. */
  622. efc_process_prli_payload(node, cbdata->payload->dma.virt);
  623. efc_send_ls_acc_after_attach(node,
  624. cbdata->header->dma.virt,
  625. EFC_NODE_SEND_LS_ACC_PRLI);
  626. efc_node_transition(node, __efc_d_wait_plogi_rsp_recvd_prli,
  627. NULL);
  628. break;
  629. case EFC_EVT_LOGO_RCVD: /* why don't we do a shutdown here?? */
  630. case EFC_EVT_PRLO_RCVD:
  631. case EFC_EVT_PDISC_RCVD:
  632. case EFC_EVT_FDISC_RCVD:
  633. case EFC_EVT_ADISC_RCVD:
  634. case EFC_EVT_RSCN_RCVD:
  635. case EFC_EVT_SCR_RCVD: {
  636. struct fc_frame_header *hdr = cbdata->header->dma.virt;
  637. node_printf(node, "%s received, sending reject\n",
  638. efc_sm_event_name(evt));
  639. efc_send_ls_rjt(node, be16_to_cpu(hdr->fh_ox_id),
  640. ELS_RJT_UNAB, ELS_EXPL_PLOGI_REQD, 0);
  641. break;
  642. }
  643. case EFC_EVT_SRRS_ELS_REQ_OK: /* PLOGI response received */
  644. /* Completion from PLOGI sent */
  645. if (efc_node_check_els_req(ctx, evt, arg, ELS_PLOGI,
  646. __efc_d_common, __func__))
  647. return;
  648. WARN_ON(!node->els_req_cnt);
  649. node->els_req_cnt--;
  650. /* sm: / save sparams, efc_node_attach */
  651. efc_node_save_sparms(node, cbdata->els_rsp.virt);
  652. rc = efc_node_attach(node);
  653. efc_node_transition(node, __efc_d_wait_node_attach, NULL);
  654. if (rc < 0)
  655. efc_node_post_event(node,
  656. EFC_EVT_NODE_ATTACH_FAIL, NULL);
  657. break;
  658. case EFC_EVT_SRRS_ELS_REQ_FAIL: /* PLOGI response received */
  659. /* PLOGI failed, shutdown the node */
  660. if (efc_node_check_els_req(ctx, evt, arg, ELS_PLOGI,
  661. __efc_d_common, __func__))
  662. return;
  663. WARN_ON(!node->els_req_cnt);
  664. node->els_req_cnt--;
  665. efc_node_post_event(node, EFC_EVT_SHUTDOWN, NULL);
  666. break;
  667. case EFC_EVT_SRRS_ELS_REQ_RJT:
  668. /* Our PLOGI was rejected, this is ok in some cases */
  669. if (efc_node_check_els_req(ctx, evt, arg, ELS_PLOGI,
  670. __efc_d_common, __func__))
  671. return;
  672. WARN_ON(!node->els_req_cnt);
  673. node->els_req_cnt--;
  674. break;
  675. case EFC_EVT_FCP_CMD_RCVD: {
  676. /* not logged in yet and outstanding PLOGI so don't send LOGO,
  677. * just drop
  678. */
  679. node_printf(node, "FCP_CMND received, drop\n");
  680. break;
  681. }
  682. default:
  683. __efc_d_common(__func__, ctx, evt, arg);
  684. }
  685. }
  686. void
  687. __efc_d_wait_plogi_rsp_recvd_prli(struct efc_sm_ctx *ctx,
  688. enum efc_sm_event evt, void *arg)
  689. {
  690. int rc;
  691. struct efc_node_cb *cbdata = arg;
  692. struct efc_node *node = ctx->app;
  693. efc_node_evt_set(ctx, evt, __func__);
  694. node_sm_trace();
  695. switch (evt) {
  696. case EFC_EVT_ENTER:
  697. /*
  698. * Since we've received a PRLI, we have a port login and will
  699. * just need to wait for the PLOGI response to do the node
  700. * attach and then we can send the LS_ACC for the PRLI. If,
  701. * during this time, we receive FCP_CMNDs (which is possible
  702. * since we've already sent a PRLI and our peer may have
  703. * accepted). At this time, we are not waiting on any other
  704. * unsolicited frames to continue with the login process. Thus,
  705. * it will not hurt to hold frames here.
  706. */
  707. efc_node_hold_frames(node);
  708. break;
  709. case EFC_EVT_EXIT:
  710. efc_node_accept_frames(node);
  711. break;
  712. case EFC_EVT_SRRS_ELS_REQ_OK: /* PLOGI response received */
  713. /* Completion from PLOGI sent */
  714. if (efc_node_check_els_req(ctx, evt, arg, ELS_PLOGI,
  715. __efc_d_common, __func__))
  716. return;
  717. WARN_ON(!node->els_req_cnt);
  718. node->els_req_cnt--;
  719. /* sm: / save sparams, efc_node_attach */
  720. efc_node_save_sparms(node, cbdata->els_rsp.virt);
  721. rc = efc_node_attach(node);
  722. efc_node_transition(node, __efc_d_wait_node_attach, NULL);
  723. if (rc < 0)
  724. efc_node_post_event(node, EFC_EVT_NODE_ATTACH_FAIL,
  725. NULL);
  726. break;
  727. case EFC_EVT_SRRS_ELS_REQ_FAIL: /* PLOGI response received */
  728. case EFC_EVT_SRRS_ELS_REQ_RJT:
  729. /* PLOGI failed, shutdown the node */
  730. if (efc_node_check_els_req(ctx, evt, arg, ELS_PLOGI,
  731. __efc_d_common, __func__))
  732. return;
  733. WARN_ON(!node->els_req_cnt);
  734. node->els_req_cnt--;
  735. efc_node_post_event(node, EFC_EVT_SHUTDOWN, NULL);
  736. break;
  737. default:
  738. __efc_d_common(__func__, ctx, evt, arg);
  739. }
  740. }
  741. void
  742. __efc_d_wait_domain_attach(struct efc_sm_ctx *ctx,
  743. enum efc_sm_event evt, void *arg)
  744. {
  745. int rc;
  746. struct efc_node *node = ctx->app;
  747. efc_node_evt_set(ctx, evt, __func__);
  748. node_sm_trace();
  749. switch (evt) {
  750. case EFC_EVT_ENTER:
  751. efc_node_hold_frames(node);
  752. break;
  753. case EFC_EVT_EXIT:
  754. efc_node_accept_frames(node);
  755. break;
  756. case EFC_EVT_DOMAIN_ATTACH_OK:
  757. WARN_ON(!node->nport->domain->attached);
  758. /* sm: / efc_node_attach */
  759. rc = efc_node_attach(node);
  760. efc_node_transition(node, __efc_d_wait_node_attach, NULL);
  761. if (rc < 0)
  762. efc_node_post_event(node, EFC_EVT_NODE_ATTACH_FAIL,
  763. NULL);
  764. break;
  765. default:
  766. __efc_d_common(__func__, ctx, evt, arg);
  767. }
  768. }
  769. void
  770. __efc_d_wait_topology_notify(struct efc_sm_ctx *ctx,
  771. enum efc_sm_event evt, void *arg)
  772. {
  773. int rc;
  774. struct efc_node *node = ctx->app;
  775. efc_node_evt_set(ctx, evt, __func__);
  776. node_sm_trace();
  777. switch (evt) {
  778. case EFC_EVT_ENTER:
  779. efc_node_hold_frames(node);
  780. break;
  781. case EFC_EVT_EXIT:
  782. efc_node_accept_frames(node);
  783. break;
  784. case EFC_EVT_NPORT_TOPOLOGY_NOTIFY: {
  785. enum efc_nport_topology *topology = arg;
  786. WARN_ON(node->nport->domain->attached);
  787. WARN_ON(node->send_ls_acc != EFC_NODE_SEND_LS_ACC_PLOGI);
  788. node_printf(node, "topology notification, topology=%d\n",
  789. *topology);
  790. /* At the time the PLOGI was received, the topology was unknown,
  791. * so we didn't know which node would perform the domain attach:
  792. * 1. The node from which the PLOGI was sent (p2p) or
  793. * 2. The node to which the FLOGI was sent (fabric).
  794. */
  795. if (*topology == EFC_NPORT_TOPO_P2P) {
  796. /* if this is p2p, need to attach to the domain using
  797. * the d_id from the PLOGI received
  798. */
  799. efc_domain_attach(node->nport->domain,
  800. node->ls_acc_did);
  801. }
  802. /* else, if this is fabric, the domain attach
  803. * should be performed by the fabric node (node sending FLOGI);
  804. * just wait for attach to complete
  805. */
  806. efc_node_transition(node, __efc_d_wait_domain_attach, NULL);
  807. break;
  808. }
  809. case EFC_EVT_DOMAIN_ATTACH_OK:
  810. WARN_ON(!node->nport->domain->attached);
  811. node_printf(node, "domain attach ok\n");
  812. /* sm: / efc_node_attach */
  813. rc = efc_node_attach(node);
  814. efc_node_transition(node, __efc_d_wait_node_attach, NULL);
  815. if (rc < 0)
  816. efc_node_post_event(node,
  817. EFC_EVT_NODE_ATTACH_FAIL, NULL);
  818. break;
  819. default:
  820. __efc_d_common(__func__, ctx, evt, arg);
  821. }
  822. }
  823. void
  824. __efc_d_wait_node_attach(struct efc_sm_ctx *ctx,
  825. enum efc_sm_event evt, void *arg)
  826. {
  827. struct efc_node *node = ctx->app;
  828. efc_node_evt_set(ctx, evt, __func__);
  829. node_sm_trace();
  830. switch (evt) {
  831. case EFC_EVT_ENTER:
  832. efc_node_hold_frames(node);
  833. break;
  834. case EFC_EVT_EXIT:
  835. efc_node_accept_frames(node);
  836. break;
  837. case EFC_EVT_NODE_ATTACH_OK:
  838. node->attached = true;
  839. switch (node->send_ls_acc) {
  840. case EFC_NODE_SEND_LS_ACC_PLOGI: {
  841. /* sm: send_plogi_acc is set / send PLOGI acc */
  842. /* Normal case for T, or I+T */
  843. efc_send_plogi_acc(node, node->ls_acc_oxid);
  844. efc_node_transition(node, __efc_d_wait_plogi_acc_cmpl,
  845. NULL);
  846. node->send_ls_acc = EFC_NODE_SEND_LS_ACC_NONE;
  847. node->ls_acc_io = NULL;
  848. break;
  849. }
  850. case EFC_NODE_SEND_LS_ACC_PRLI: {
  851. efc_d_send_prli_rsp(node, node->ls_acc_oxid);
  852. node->send_ls_acc = EFC_NODE_SEND_LS_ACC_NONE;
  853. node->ls_acc_io = NULL;
  854. break;
  855. }
  856. case EFC_NODE_SEND_LS_ACC_NONE:
  857. default:
  858. /* Normal case for I */
  859. /* sm: send_plogi_acc is not set / send PLOGI acc */
  860. efc_node_transition(node,
  861. __efc_d_port_logged_in, NULL);
  862. break;
  863. }
  864. break;
  865. case EFC_EVT_NODE_ATTACH_FAIL:
  866. /* node attach failed, shutdown the node */
  867. node->attached = false;
  868. node_printf(node, "node attach failed\n");
  869. node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
  870. efc_node_transition(node, __efc_d_initiate_shutdown, NULL);
  871. break;
  872. /* Handle shutdown events */
  873. case EFC_EVT_SHUTDOWN:
  874. node_printf(node, "%s received\n", efc_sm_event_name(evt));
  875. node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
  876. efc_node_transition(node, __efc_d_wait_attach_evt_shutdown,
  877. NULL);
  878. break;
  879. case EFC_EVT_SHUTDOWN_EXPLICIT_LOGO:
  880. node_printf(node, "%s received\n", efc_sm_event_name(evt));
  881. node->shutdown_reason = EFC_NODE_SHUTDOWN_EXPLICIT_LOGO;
  882. efc_node_transition(node, __efc_d_wait_attach_evt_shutdown,
  883. NULL);
  884. break;
  885. case EFC_EVT_SHUTDOWN_IMPLICIT_LOGO:
  886. node_printf(node, "%s received\n", efc_sm_event_name(evt));
  887. node->shutdown_reason = EFC_NODE_SHUTDOWN_IMPLICIT_LOGO;
  888. efc_node_transition(node,
  889. __efc_d_wait_attach_evt_shutdown, NULL);
  890. break;
  891. default:
  892. __efc_d_common(__func__, ctx, evt, arg);
  893. }
  894. }
  895. void
  896. __efc_d_wait_attach_evt_shutdown(struct efc_sm_ctx *ctx,
  897. enum efc_sm_event evt, void *arg)
  898. {
  899. struct efc_node *node = ctx->app;
  900. efc_node_evt_set(ctx, evt, __func__);
  901. node_sm_trace();
  902. switch (evt) {
  903. case EFC_EVT_ENTER:
  904. efc_node_hold_frames(node);
  905. break;
  906. case EFC_EVT_EXIT:
  907. efc_node_accept_frames(node);
  908. break;
  909. /* wait for any of these attach events and then shutdown */
  910. case EFC_EVT_NODE_ATTACH_OK:
  911. node->attached = true;
  912. node_printf(node, "Attach evt=%s, proceed to shutdown\n",
  913. efc_sm_event_name(evt));
  914. efc_node_transition(node, __efc_d_initiate_shutdown, NULL);
  915. break;
  916. case EFC_EVT_NODE_ATTACH_FAIL:
  917. /* node attach failed, shutdown the node */
  918. node->attached = false;
  919. node_printf(node, "Attach evt=%s, proceed to shutdown\n",
  920. efc_sm_event_name(evt));
  921. efc_node_transition(node, __efc_d_initiate_shutdown, NULL);
  922. break;
  923. /* ignore shutdown events as we're already in shutdown path */
  924. case EFC_EVT_SHUTDOWN:
  925. /* have default shutdown event take precedence */
  926. node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
  927. fallthrough;
  928. case EFC_EVT_SHUTDOWN_EXPLICIT_LOGO:
  929. case EFC_EVT_SHUTDOWN_IMPLICIT_LOGO:
  930. node_printf(node, "%s received\n", efc_sm_event_name(evt));
  931. break;
  932. default:
  933. __efc_d_common(__func__, ctx, evt, arg);
  934. }
  935. }
  936. void
  937. __efc_d_port_logged_in(struct efc_sm_ctx *ctx,
  938. enum efc_sm_event evt, void *arg)
  939. {
  940. struct efc_node_cb *cbdata = arg;
  941. struct efc_node *node = ctx->app;
  942. efc_node_evt_set(ctx, evt, __func__);
  943. node_sm_trace();
  944. switch (evt) {
  945. case EFC_EVT_ENTER:
  946. /* Normal case for I or I+T */
  947. if (node->nport->enable_ini &&
  948. !(node->rnode.fc_id != FC_FID_DOM_MGR)) {
  949. /* sm: if enable_ini / send PRLI */
  950. efc_send_prli(node);
  951. /* can now expect ELS_REQ_OK/FAIL/RJT */
  952. }
  953. break;
  954. case EFC_EVT_FCP_CMD_RCVD: {
  955. break;
  956. }
  957. case EFC_EVT_PRLI_RCVD: {
  958. /* Normal case for T or I+T */
  959. struct fc_frame_header *hdr = cbdata->header->dma.virt;
  960. struct {
  961. struct fc_els_prli prli;
  962. struct fc_els_spp sp;
  963. } *pp;
  964. pp = cbdata->payload->dma.virt;
  965. if (pp->sp.spp_type != FC_TYPE_FCP) {
  966. /*Only FCP is supported*/
  967. efc_send_ls_rjt(node, be16_to_cpu(hdr->fh_ox_id),
  968. ELS_RJT_UNAB, ELS_EXPL_UNSUPR, 0);
  969. break;
  970. }
  971. efc_process_prli_payload(node, cbdata->payload->dma.virt);
  972. efc_d_send_prli_rsp(node, be16_to_cpu(hdr->fh_ox_id));
  973. break;
  974. }
  975. case EFC_EVT_NODE_SESS_REG_OK:
  976. if (node->send_ls_acc == EFC_NODE_SEND_LS_ACC_PRLI)
  977. efc_send_prli_acc(node, node->ls_acc_oxid);
  978. node->send_ls_acc = EFC_NODE_SEND_LS_ACC_NONE;
  979. efc_node_transition(node, __efc_d_device_ready, NULL);
  980. break;
  981. case EFC_EVT_NODE_SESS_REG_FAIL:
  982. efc_send_ls_rjt(node, node->ls_acc_oxid, ELS_RJT_UNAB,
  983. ELS_EXPL_UNSUPR, 0);
  984. node->send_ls_acc = EFC_NODE_SEND_LS_ACC_NONE;
  985. break;
  986. case EFC_EVT_SRRS_ELS_REQ_OK: { /* PRLI response */
  987. /* Normal case for I or I+T */
  988. if (efc_node_check_els_req(ctx, evt, arg, ELS_PRLI,
  989. __efc_d_common, __func__))
  990. return;
  991. WARN_ON(!node->els_req_cnt);
  992. node->els_req_cnt--;
  993. /* sm: / process PRLI payload */
  994. efc_process_prli_payload(node, cbdata->els_rsp.virt);
  995. efc_node_transition(node, __efc_d_device_ready, NULL);
  996. break;
  997. }
  998. case EFC_EVT_SRRS_ELS_REQ_FAIL: { /* PRLI response failed */
  999. /* I, I+T, assume some link failure, shutdown node */
  1000. if (efc_node_check_els_req(ctx, evt, arg, ELS_PRLI,
  1001. __efc_d_common, __func__))
  1002. return;
  1003. WARN_ON(!node->els_req_cnt);
  1004. node->els_req_cnt--;
  1005. efc_node_post_event(node, EFC_EVT_SHUTDOWN, NULL);
  1006. break;
  1007. }
  1008. case EFC_EVT_SRRS_ELS_REQ_RJT: {
  1009. /* PRLI rejected by remote
  1010. * Normal for I, I+T (connected to an I)
  1011. * Node doesn't want to be a target, stay here and wait for a
  1012. * PRLI from the remote node
  1013. * if it really wants to connect to us as target
  1014. */
  1015. if (efc_node_check_els_req(ctx, evt, arg, ELS_PRLI,
  1016. __efc_d_common, __func__))
  1017. return;
  1018. WARN_ON(!node->els_req_cnt);
  1019. node->els_req_cnt--;
  1020. break;
  1021. }
  1022. case EFC_EVT_SRRS_ELS_CMPL_OK: {
  1023. /* Normal T, I+T, target-server rejected the process login */
  1024. /* This would be received only in the case where we sent
  1025. * LS_RJT for the PRLI, so
  1026. * do nothing. (note: as T only we could shutdown the node)
  1027. */
  1028. WARN_ON(!node->els_cmpl_cnt);
  1029. node->els_cmpl_cnt--;
  1030. break;
  1031. }
  1032. case EFC_EVT_PLOGI_RCVD: {
  1033. /*sm: / save sparams, set send_plogi_acc,
  1034. *post implicit logout
  1035. * Save plogi parameters
  1036. */
  1037. efc_node_save_sparms(node, cbdata->payload->dma.virt);
  1038. efc_send_ls_acc_after_attach(node,
  1039. cbdata->header->dma.virt,
  1040. EFC_NODE_SEND_LS_ACC_PLOGI);
  1041. /* Restart node attach with new service parameters,
  1042. * and send ACC
  1043. */
  1044. efc_node_post_event(node, EFC_EVT_SHUTDOWN_IMPLICIT_LOGO,
  1045. NULL);
  1046. break;
  1047. }
  1048. case EFC_EVT_LOGO_RCVD: {
  1049. /* I, T, I+T */
  1050. struct fc_frame_header *hdr = cbdata->header->dma.virt;
  1051. node_printf(node, "%s received attached=%d\n",
  1052. efc_sm_event_name(evt),
  1053. node->attached);
  1054. /* sm: / send LOGO acc */
  1055. efc_send_logo_acc(node, be16_to_cpu(hdr->fh_ox_id));
  1056. efc_node_transition(node, __efc_d_wait_logo_acc_cmpl, NULL);
  1057. break;
  1058. }
  1059. default:
  1060. __efc_d_common(__func__, ctx, evt, arg);
  1061. }
  1062. }
  1063. void
  1064. __efc_d_wait_logo_acc_cmpl(struct efc_sm_ctx *ctx,
  1065. enum efc_sm_event evt, void *arg)
  1066. {
  1067. struct efc_node *node = ctx->app;
  1068. efc_node_evt_set(ctx, evt, __func__);
  1069. node_sm_trace();
  1070. switch (evt) {
  1071. case EFC_EVT_ENTER:
  1072. efc_node_hold_frames(node);
  1073. break;
  1074. case EFC_EVT_EXIT:
  1075. efc_node_accept_frames(node);
  1076. break;
  1077. case EFC_EVT_SRRS_ELS_CMPL_OK:
  1078. case EFC_EVT_SRRS_ELS_CMPL_FAIL:
  1079. /* sm: / post explicit logout */
  1080. WARN_ON(!node->els_cmpl_cnt);
  1081. node->els_cmpl_cnt--;
  1082. efc_node_post_event(node,
  1083. EFC_EVT_SHUTDOWN_EXPLICIT_LOGO, NULL);
  1084. break;
  1085. default:
  1086. __efc_d_common(__func__, ctx, evt, arg);
  1087. }
  1088. }
  1089. void
  1090. __efc_d_device_ready(struct efc_sm_ctx *ctx,
  1091. enum efc_sm_event evt, void *arg)
  1092. {
  1093. struct efc_node_cb *cbdata = arg;
  1094. struct efc_node *node = ctx->app;
  1095. struct efc *efc = node->efc;
  1096. efc_node_evt_set(ctx, evt, __func__);
  1097. if (evt != EFC_EVT_FCP_CMD_RCVD)
  1098. node_sm_trace();
  1099. switch (evt) {
  1100. case EFC_EVT_ENTER:
  1101. node->fcp_enabled = true;
  1102. if (node->targ) {
  1103. efc_log_info(efc,
  1104. "[%s] found (target) WWPN %s WWNN %s\n",
  1105. node->display_name,
  1106. node->wwpn, node->wwnn);
  1107. if (node->nport->enable_ini)
  1108. efc->tt.scsi_new_node(efc, node);
  1109. }
  1110. break;
  1111. case EFC_EVT_EXIT:
  1112. node->fcp_enabled = false;
  1113. break;
  1114. case EFC_EVT_PLOGI_RCVD: {
  1115. /* sm: / save sparams, set send_plogi_acc, post implicit
  1116. * logout
  1117. * Save plogi parameters
  1118. */
  1119. efc_node_save_sparms(node, cbdata->payload->dma.virt);
  1120. efc_send_ls_acc_after_attach(node,
  1121. cbdata->header->dma.virt,
  1122. EFC_NODE_SEND_LS_ACC_PLOGI);
  1123. /*
  1124. * Restart node attach with new service parameters,
  1125. * and send ACC
  1126. */
  1127. efc_node_post_event(node,
  1128. EFC_EVT_SHUTDOWN_IMPLICIT_LOGO, NULL);
  1129. break;
  1130. }
  1131. case EFC_EVT_PRLI_RCVD: {
  1132. /* T, I+T: remote initiator is slow to get started */
  1133. struct fc_frame_header *hdr = cbdata->header->dma.virt;
  1134. struct {
  1135. struct fc_els_prli prli;
  1136. struct fc_els_spp sp;
  1137. } *pp;
  1138. pp = cbdata->payload->dma.virt;
  1139. if (pp->sp.spp_type != FC_TYPE_FCP) {
  1140. /*Only FCP is supported*/
  1141. efc_send_ls_rjt(node, be16_to_cpu(hdr->fh_ox_id),
  1142. ELS_RJT_UNAB, ELS_EXPL_UNSUPR, 0);
  1143. break;
  1144. }
  1145. efc_process_prli_payload(node, cbdata->payload->dma.virt);
  1146. efc_send_prli_acc(node, be16_to_cpu(hdr->fh_ox_id));
  1147. break;
  1148. }
  1149. case EFC_EVT_PRLO_RCVD: {
  1150. struct fc_frame_header *hdr = cbdata->header->dma.virt;
  1151. /* sm: / send PRLO acc */
  1152. efc_send_prlo_acc(node, be16_to_cpu(hdr->fh_ox_id));
  1153. /* need implicit logout? */
  1154. break;
  1155. }
  1156. case EFC_EVT_LOGO_RCVD: {
  1157. struct fc_frame_header *hdr = cbdata->header->dma.virt;
  1158. node_printf(node, "%s received attached=%d\n",
  1159. efc_sm_event_name(evt), node->attached);
  1160. /* sm: / send LOGO acc */
  1161. efc_send_logo_acc(node, be16_to_cpu(hdr->fh_ox_id));
  1162. efc_node_transition(node, __efc_d_wait_logo_acc_cmpl, NULL);
  1163. break;
  1164. }
  1165. case EFC_EVT_ADISC_RCVD: {
  1166. struct fc_frame_header *hdr = cbdata->header->dma.virt;
  1167. /* sm: / send ADISC acc */
  1168. efc_send_adisc_acc(node, be16_to_cpu(hdr->fh_ox_id));
  1169. break;
  1170. }
  1171. case EFC_EVT_ABTS_RCVD:
  1172. /* sm: / process ABTS */
  1173. efc_log_err(efc, "Unexpected event:%s\n",
  1174. efc_sm_event_name(evt));
  1175. break;
  1176. case EFC_EVT_NODE_ACTIVE_IO_LIST_EMPTY:
  1177. break;
  1178. case EFC_EVT_NODE_REFOUND:
  1179. break;
  1180. case EFC_EVT_NODE_MISSING:
  1181. if (node->nport->enable_rscn)
  1182. efc_node_transition(node, __efc_d_device_gone, NULL);
  1183. break;
  1184. case EFC_EVT_SRRS_ELS_CMPL_OK:
  1185. /* T, or I+T, PRLI accept completed ok */
  1186. WARN_ON(!node->els_cmpl_cnt);
  1187. node->els_cmpl_cnt--;
  1188. break;
  1189. case EFC_EVT_SRRS_ELS_CMPL_FAIL:
  1190. /* T, or I+T, PRLI accept failed to complete */
  1191. WARN_ON(!node->els_cmpl_cnt);
  1192. node->els_cmpl_cnt--;
  1193. node_printf(node, "Failed to send PRLI LS_ACC\n");
  1194. break;
  1195. default:
  1196. __efc_d_common(__func__, ctx, evt, arg);
  1197. }
  1198. }
  1199. void
  1200. __efc_d_device_gone(struct efc_sm_ctx *ctx,
  1201. enum efc_sm_event evt, void *arg)
  1202. {
  1203. struct efc_node_cb *cbdata = arg;
  1204. struct efc_node *node = ctx->app;
  1205. struct efc *efc = node->efc;
  1206. efc_node_evt_set(ctx, evt, __func__);
  1207. node_sm_trace();
  1208. switch (evt) {
  1209. case EFC_EVT_ENTER: {
  1210. int rc = EFC_SCSI_CALL_COMPLETE;
  1211. int rc_2 = EFC_SCSI_CALL_COMPLETE;
  1212. static const char * const labels[] = {
  1213. "none", "initiator", "target", "initiator+target"
  1214. };
  1215. efc_log_info(efc, "[%s] missing (%s) WWPN %s WWNN %s\n",
  1216. node->display_name,
  1217. labels[(node->targ << 1) | (node->init)],
  1218. node->wwpn, node->wwnn);
  1219. switch (efc_node_get_enable(node)) {
  1220. case EFC_NODE_ENABLE_T_TO_T:
  1221. case EFC_NODE_ENABLE_I_TO_T:
  1222. case EFC_NODE_ENABLE_IT_TO_T:
  1223. rc = efc->tt.scsi_del_node(efc, node,
  1224. EFC_SCSI_TARGET_MISSING);
  1225. break;
  1226. case EFC_NODE_ENABLE_T_TO_I:
  1227. case EFC_NODE_ENABLE_I_TO_I:
  1228. case EFC_NODE_ENABLE_IT_TO_I:
  1229. rc = efc->tt.scsi_del_node(efc, node,
  1230. EFC_SCSI_INITIATOR_MISSING);
  1231. break;
  1232. case EFC_NODE_ENABLE_T_TO_IT:
  1233. rc = efc->tt.scsi_del_node(efc, node,
  1234. EFC_SCSI_INITIATOR_MISSING);
  1235. break;
  1236. case EFC_NODE_ENABLE_I_TO_IT:
  1237. rc = efc->tt.scsi_del_node(efc, node,
  1238. EFC_SCSI_TARGET_MISSING);
  1239. break;
  1240. case EFC_NODE_ENABLE_IT_TO_IT:
  1241. rc = efc->tt.scsi_del_node(efc, node,
  1242. EFC_SCSI_INITIATOR_MISSING);
  1243. rc_2 = efc->tt.scsi_del_node(efc, node,
  1244. EFC_SCSI_TARGET_MISSING);
  1245. break;
  1246. default:
  1247. rc = EFC_SCSI_CALL_COMPLETE;
  1248. break;
  1249. }
  1250. if (rc == EFC_SCSI_CALL_COMPLETE &&
  1251. rc_2 == EFC_SCSI_CALL_COMPLETE)
  1252. efc_node_post_event(node, EFC_EVT_SHUTDOWN, NULL);
  1253. break;
  1254. }
  1255. case EFC_EVT_NODE_REFOUND:
  1256. /* two approaches, reauthenticate with PLOGI/PRLI, or ADISC */
  1257. /* reauthenticate with PLOGI/PRLI */
  1258. /* efc_node_transition(node, __efc_d_discovered, NULL); */
  1259. /* reauthenticate with ADISC */
  1260. /* sm: / send ADISC */
  1261. efc_send_adisc(node);
  1262. efc_node_transition(node, __efc_d_wait_adisc_rsp, NULL);
  1263. break;
  1264. case EFC_EVT_PLOGI_RCVD: {
  1265. /* sm: / save sparams, set send_plogi_acc, post implicit
  1266. * logout
  1267. * Save plogi parameters
  1268. */
  1269. efc_node_save_sparms(node, cbdata->payload->dma.virt);
  1270. efc_send_ls_acc_after_attach(node,
  1271. cbdata->header->dma.virt,
  1272. EFC_NODE_SEND_LS_ACC_PLOGI);
  1273. /*
  1274. * Restart node attach with new service parameters, and send
  1275. * ACC
  1276. */
  1277. efc_node_post_event(node, EFC_EVT_SHUTDOWN_IMPLICIT_LOGO,
  1278. NULL);
  1279. break;
  1280. }
  1281. case EFC_EVT_FCP_CMD_RCVD: {
  1282. /* most likely a stale frame (received prior to link down),
  1283. * if attempt to send LOGO, will probably timeout and eat
  1284. * up 20s; thus, drop FCP_CMND
  1285. */
  1286. node_printf(node, "FCP_CMND received, drop\n");
  1287. break;
  1288. }
  1289. case EFC_EVT_LOGO_RCVD: {
  1290. /* I, T, I+T */
  1291. struct fc_frame_header *hdr = cbdata->header->dma.virt;
  1292. node_printf(node, "%s received attached=%d\n",
  1293. efc_sm_event_name(evt), node->attached);
  1294. /* sm: / send LOGO acc */
  1295. efc_send_logo_acc(node, be16_to_cpu(hdr->fh_ox_id));
  1296. efc_node_transition(node, __efc_d_wait_logo_acc_cmpl, NULL);
  1297. break;
  1298. }
  1299. default:
  1300. __efc_d_common(__func__, ctx, evt, arg);
  1301. }
  1302. }
  1303. void
  1304. __efc_d_wait_adisc_rsp(struct efc_sm_ctx *ctx,
  1305. enum efc_sm_event evt, void *arg)
  1306. {
  1307. struct efc_node_cb *cbdata = arg;
  1308. struct efc_node *node = ctx->app;
  1309. efc_node_evt_set(ctx, evt, __func__);
  1310. node_sm_trace();
  1311. switch (evt) {
  1312. case EFC_EVT_SRRS_ELS_REQ_OK:
  1313. if (efc_node_check_els_req(ctx, evt, arg, ELS_ADISC,
  1314. __efc_d_common, __func__))
  1315. return;
  1316. WARN_ON(!node->els_req_cnt);
  1317. node->els_req_cnt--;
  1318. efc_node_transition(node, __efc_d_device_ready, NULL);
  1319. break;
  1320. case EFC_EVT_SRRS_ELS_REQ_RJT:
  1321. /* received an LS_RJT, in this case, send shutdown
  1322. * (explicit logo) event which will unregister the node,
  1323. * and start over with PLOGI
  1324. */
  1325. if (efc_node_check_els_req(ctx, evt, arg, ELS_ADISC,
  1326. __efc_d_common, __func__))
  1327. return;
  1328. WARN_ON(!node->els_req_cnt);
  1329. node->els_req_cnt--;
  1330. /* sm: / post explicit logout */
  1331. efc_node_post_event(node,
  1332. EFC_EVT_SHUTDOWN_EXPLICIT_LOGO,
  1333. NULL);
  1334. break;
  1335. case EFC_EVT_LOGO_RCVD: {
  1336. /* In this case, we have the equivalent of an LS_RJT for
  1337. * the ADISC, so we need to abort the ADISC, and re-login
  1338. * with PLOGI
  1339. */
  1340. /* sm: / request abort, send LOGO acc */
  1341. struct fc_frame_header *hdr = cbdata->header->dma.virt;
  1342. node_printf(node, "%s received attached=%d\n",
  1343. efc_sm_event_name(evt), node->attached);
  1344. efc_send_logo_acc(node, be16_to_cpu(hdr->fh_ox_id));
  1345. efc_node_transition(node, __efc_d_wait_logo_acc_cmpl, NULL);
  1346. break;
  1347. }
  1348. default:
  1349. __efc_d_common(__func__, ctx, evt, arg);
  1350. }
  1351. }