xref: /linux/drivers/scsi/libfc/fc_rport.c (revision a234ca0faa65dcd5cc473915bd925130ebb7b74b)
1 /*
2  * Copyright(c) 2007 - 2008 Intel Corporation. All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms and conditions of the GNU General Public License,
6  * version 2, as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope it will be useful, but WITHOUT
9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
11  * more details.
12  *
13  * You should have received a copy of the GNU General Public License along with
14  * this program; if not, write to the Free Software Foundation, Inc.,
15  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
16  *
17  * Maintained at www.Open-FCoE.org
18  */
19 
20 /*
21  * RPORT GENERAL INFO
22  *
23  * This file contains all processing regarding fc_rports. It contains the
24  * rport state machine and does all rport interaction with the transport class.
25  * There should be no other places in libfc that interact directly with the
26  * transport class in regards to adding and deleting rports.
27  *
28  * fc_rport's represent N_Port's within the fabric.
29  */
30 
31 /*
32  * RPORT LOCKING
33  *
34  * The rport should never hold the rport mutex and then attempt to acquire
35  * either the lport or disc mutexes. The rport's mutex is considered lesser
36  * than both the lport's mutex and the disc mutex. Refer to fc_lport.c for
37  * more comments on the hierarchy.
38  *
39  * The locking strategy is similar to the lport's strategy. The lock protects
40  * the rport's states and is held and released by the entry points to the rport
41  * block. All _enter_* functions correspond to rport states and expect the rport
42  * mutex to be locked before calling them. This means that rports only handle
43  * one request or response at a time, since they're not critical for the I/O
44  * path this potential over-use of the mutex is acceptable.
45  */
46 
47 #include <linux/kernel.h>
48 #include <linux/spinlock.h>
49 #include <linux/interrupt.h>
50 #include <linux/slab.h>
51 #include <linux/rcupdate.h>
52 #include <linux/timer.h>
53 #include <linux/workqueue.h>
54 #include <asm/unaligned.h>
55 
56 #include <scsi/libfc.h>
57 #include <scsi/fc_encode.h>
58 
59 #include "fc_libfc.h"
60 
61 struct workqueue_struct *rport_event_queue;
62 
63 static void fc_rport_enter_flogi(struct fc_rport_priv *);
64 static void fc_rport_enter_plogi(struct fc_rport_priv *);
65 static void fc_rport_enter_prli(struct fc_rport_priv *);
66 static void fc_rport_enter_rtv(struct fc_rport_priv *);
67 static void fc_rport_enter_ready(struct fc_rport_priv *);
68 static void fc_rport_enter_logo(struct fc_rport_priv *);
69 static void fc_rport_enter_adisc(struct fc_rport_priv *);
70 
71 static void fc_rport_recv_plogi_req(struct fc_lport *, struct fc_frame *);
72 static void fc_rport_recv_prli_req(struct fc_rport_priv *, struct fc_frame *);
73 static void fc_rport_recv_prlo_req(struct fc_rport_priv *, struct fc_frame *);
74 static void fc_rport_recv_logo_req(struct fc_lport *, struct fc_frame *);
75 static void fc_rport_timeout(struct work_struct *);
76 static void fc_rport_error(struct fc_rport_priv *, struct fc_frame *);
77 static void fc_rport_error_retry(struct fc_rport_priv *, struct fc_frame *);
78 static void fc_rport_work(struct work_struct *);
79 
80 static const char *fc_rport_state_names[] = {
81 	[RPORT_ST_INIT] = "Init",
82 	[RPORT_ST_FLOGI] = "FLOGI",
83 	[RPORT_ST_PLOGI_WAIT] = "PLOGI_WAIT",
84 	[RPORT_ST_PLOGI] = "PLOGI",
85 	[RPORT_ST_PRLI] = "PRLI",
86 	[RPORT_ST_RTV] = "RTV",
87 	[RPORT_ST_READY] = "Ready",
88 	[RPORT_ST_ADISC] = "ADISC",
89 	[RPORT_ST_DELETE] = "Delete",
90 };
91 
92 /**
93  * fc_rport_lookup() - Lookup a remote port by port_id
94  * @lport:   The local port to lookup the remote port on
95  * @port_id: The remote port ID to look up
96  *
97  * The caller must hold either disc_mutex or rcu_read_lock().
98  */
99 static struct fc_rport_priv *fc_rport_lookup(const struct fc_lport *lport,
100 					     u32 port_id)
101 {
102 	struct fc_rport_priv *rdata;
103 
104 	list_for_each_entry_rcu(rdata, &lport->disc.rports, peers)
105 		if (rdata->ids.port_id == port_id)
106 			return rdata;
107 	return NULL;
108 }
109 
110 /**
111  * fc_rport_create() - Create a new remote port
112  * @lport: The local port this remote port will be associated with
113  * @ids:   The identifiers for the new remote port
114  *
115  * The remote port will start in the INIT state.
116  *
117  * Locking note:  must be called with the disc_mutex held.
118  */
119 static struct fc_rport_priv *fc_rport_create(struct fc_lport *lport,
120 					     u32 port_id)
121 {
122 	struct fc_rport_priv *rdata;
123 
124 	rdata = lport->tt.rport_lookup(lport, port_id);
125 	if (rdata)
126 		return rdata;
127 
128 	rdata = kzalloc(sizeof(*rdata) + lport->rport_priv_size, GFP_KERNEL);
129 	if (!rdata)
130 		return NULL;
131 
132 	rdata->ids.node_name = -1;
133 	rdata->ids.port_name = -1;
134 	rdata->ids.port_id = port_id;
135 	rdata->ids.roles = FC_RPORT_ROLE_UNKNOWN;
136 
137 	kref_init(&rdata->kref);
138 	mutex_init(&rdata->rp_mutex);
139 	rdata->local_port = lport;
140 	rdata->rp_state = RPORT_ST_INIT;
141 	rdata->event = RPORT_EV_NONE;
142 	rdata->flags = FC_RP_FLAGS_REC_SUPPORTED;
143 	rdata->e_d_tov = lport->e_d_tov;
144 	rdata->r_a_tov = lport->r_a_tov;
145 	rdata->maxframe_size = FC_MIN_MAX_PAYLOAD;
146 	INIT_DELAYED_WORK(&rdata->retry_work, fc_rport_timeout);
147 	INIT_WORK(&rdata->event_work, fc_rport_work);
148 	if (port_id != FC_FID_DIR_SERV)
149 		list_add_rcu(&rdata->peers, &lport->disc.rports);
150 	return rdata;
151 }
152 
153 /**
154  * fc_rport_free_rcu() - Free a remote port
155  * @rcu: The rcu_head structure inside the remote port
156  */
157 static void fc_rport_free_rcu(struct rcu_head *rcu)
158 {
159 	struct fc_rport_priv *rdata;
160 
161 	rdata = container_of(rcu, struct fc_rport_priv, rcu);
162 	kfree(rdata);
163 }
164 
165 /**
166  * fc_rport_destroy() - Free a remote port after last reference is released
167  * @kref: The remote port's kref
168  */
169 static void fc_rport_destroy(struct kref *kref)
170 {
171 	struct fc_rport_priv *rdata;
172 
173 	rdata = container_of(kref, struct fc_rport_priv, kref);
174 	call_rcu(&rdata->rcu, fc_rport_free_rcu);
175 }
176 
177 /**
178  * fc_rport_state() - Return a string identifying the remote port's state
179  * @rdata: The remote port
180  */
181 static const char *fc_rport_state(struct fc_rport_priv *rdata)
182 {
183 	const char *cp;
184 
185 	cp = fc_rport_state_names[rdata->rp_state];
186 	if (!cp)
187 		cp = "Unknown";
188 	return cp;
189 }
190 
191 /**
192  * fc_set_rport_loss_tmo() - Set the remote port loss timeout
193  * @rport:   The remote port that gets a new timeout value
194  * @timeout: The new timeout value (in seconds)
195  */
196 void fc_set_rport_loss_tmo(struct fc_rport *rport, u32 timeout)
197 {
198 	if (timeout)
199 		rport->dev_loss_tmo = timeout + 5;
200 	else
201 		rport->dev_loss_tmo = 30;
202 }
203 EXPORT_SYMBOL(fc_set_rport_loss_tmo);
204 
205 /**
206  * fc_plogi_get_maxframe() - Get the maximum payload from the common service
207  *			     parameters in a FLOGI frame
208  * @flp:    The FLOGI or PLOGI payload
209  * @maxval: The maximum frame size upper limit; this may be less than what
210  *	    is in the service parameters
211  */
212 static unsigned int fc_plogi_get_maxframe(struct fc_els_flogi *flp,
213 					  unsigned int maxval)
214 {
215 	unsigned int mfs;
216 
217 	/*
218 	 * Get max payload from the common service parameters and the
219 	 * class 3 receive data field size.
220 	 */
221 	mfs = ntohs(flp->fl_csp.sp_bb_data) & FC_SP_BB_DATA_MASK;
222 	if (mfs >= FC_SP_MIN_MAX_PAYLOAD && mfs < maxval)
223 		maxval = mfs;
224 	mfs = ntohs(flp->fl_cssp[3 - 1].cp_rdfs);
225 	if (mfs >= FC_SP_MIN_MAX_PAYLOAD && mfs < maxval)
226 		maxval = mfs;
227 	return maxval;
228 }
229 
230 /**
231  * fc_rport_state_enter() - Change the state of a remote port
232  * @rdata: The remote port whose state should change
233  * @new:   The new state
234  *
235  * Locking Note: Called with the rport lock held
236  */
237 static void fc_rport_state_enter(struct fc_rport_priv *rdata,
238 				 enum fc_rport_state new)
239 {
240 	if (rdata->rp_state != new)
241 		rdata->retries = 0;
242 	rdata->rp_state = new;
243 }
244 
245 /**
246  * fc_rport_work() - Handler for remote port events in the rport_event_queue
247  * @work: Handle to the remote port being dequeued
248  */
249 static void fc_rport_work(struct work_struct *work)
250 {
251 	u32 port_id;
252 	struct fc_rport_priv *rdata =
253 		container_of(work, struct fc_rport_priv, event_work);
254 	struct fc_rport_libfc_priv *rpriv;
255 	enum fc_rport_event event;
256 	struct fc_lport *lport = rdata->local_port;
257 	struct fc_rport_operations *rport_ops;
258 	struct fc_rport_identifiers ids;
259 	struct fc_rport *rport;
260 
261 	mutex_lock(&rdata->rp_mutex);
262 	event = rdata->event;
263 	rport_ops = rdata->ops;
264 	rport = rdata->rport;
265 
266 	FC_RPORT_DBG(rdata, "work event %u\n", event);
267 
268 	switch (event) {
269 	case RPORT_EV_READY:
270 		ids = rdata->ids;
271 		rdata->event = RPORT_EV_NONE;
272 		rdata->major_retries = 0;
273 		kref_get(&rdata->kref);
274 		mutex_unlock(&rdata->rp_mutex);
275 
276 		if (!rport)
277 			rport = fc_remote_port_add(lport->host, 0, &ids);
278 		if (!rport) {
279 			FC_RPORT_DBG(rdata, "Failed to add the rport\n");
280 			lport->tt.rport_logoff(rdata);
281 			kref_put(&rdata->kref, lport->tt.rport_destroy);
282 			return;
283 		}
284 		mutex_lock(&rdata->rp_mutex);
285 		if (rdata->rport)
286 			FC_RPORT_DBG(rdata, "rport already allocated\n");
287 		rdata->rport = rport;
288 		rport->maxframe_size = rdata->maxframe_size;
289 		rport->supported_classes = rdata->supported_classes;
290 
291 		rpriv = rport->dd_data;
292 		rpriv->local_port = lport;
293 		rpriv->rp_state = rdata->rp_state;
294 		rpriv->flags = rdata->flags;
295 		rpriv->e_d_tov = rdata->e_d_tov;
296 		rpriv->r_a_tov = rdata->r_a_tov;
297 		mutex_unlock(&rdata->rp_mutex);
298 
299 		if (rport_ops && rport_ops->event_callback) {
300 			FC_RPORT_DBG(rdata, "callback ev %d\n", event);
301 			rport_ops->event_callback(lport, rdata, event);
302 		}
303 		kref_put(&rdata->kref, lport->tt.rport_destroy);
304 		break;
305 
306 	case RPORT_EV_FAILED:
307 	case RPORT_EV_LOGO:
308 	case RPORT_EV_STOP:
309 		port_id = rdata->ids.port_id;
310 		mutex_unlock(&rdata->rp_mutex);
311 
312 		if (rport_ops && rport_ops->event_callback) {
313 			FC_RPORT_DBG(rdata, "callback ev %d\n", event);
314 			rport_ops->event_callback(lport, rdata, event);
315 		}
316 		cancel_delayed_work_sync(&rdata->retry_work);
317 
318 		/*
319 		 * Reset any outstanding exchanges before freeing rport.
320 		 */
321 		lport->tt.exch_mgr_reset(lport, 0, port_id);
322 		lport->tt.exch_mgr_reset(lport, port_id, 0);
323 
324 		if (rport) {
325 			rpriv = rport->dd_data;
326 			rpriv->rp_state = RPORT_ST_DELETE;
327 			mutex_lock(&rdata->rp_mutex);
328 			rdata->rport = NULL;
329 			mutex_unlock(&rdata->rp_mutex);
330 			fc_remote_port_delete(rport);
331 		}
332 
333 		mutex_lock(&lport->disc.disc_mutex);
334 		mutex_lock(&rdata->rp_mutex);
335 		if (rdata->rp_state == RPORT_ST_DELETE) {
336 			if (port_id == FC_FID_DIR_SERV) {
337 				rdata->event = RPORT_EV_NONE;
338 				mutex_unlock(&rdata->rp_mutex);
339 			} else if ((rdata->flags & FC_RP_STARTED) &&
340 				   rdata->major_retries <
341 				   lport->max_rport_retry_count) {
342 				rdata->major_retries++;
343 				rdata->event = RPORT_EV_NONE;
344 				FC_RPORT_DBG(rdata, "work restart\n");
345 				fc_rport_enter_flogi(rdata);
346 				mutex_unlock(&rdata->rp_mutex);
347 			} else {
348 				FC_RPORT_DBG(rdata, "work delete\n");
349 				list_del_rcu(&rdata->peers);
350 				mutex_unlock(&rdata->rp_mutex);
351 				kref_put(&rdata->kref, lport->tt.rport_destroy);
352 			}
353 		} else {
354 			/*
355 			 * Re-open for events.  Reissue READY event if ready.
356 			 */
357 			rdata->event = RPORT_EV_NONE;
358 			if (rdata->rp_state == RPORT_ST_READY)
359 				fc_rport_enter_ready(rdata);
360 			mutex_unlock(&rdata->rp_mutex);
361 		}
362 		mutex_unlock(&lport->disc.disc_mutex);
363 		break;
364 
365 	default:
366 		mutex_unlock(&rdata->rp_mutex);
367 		break;
368 	}
369 }
370 
371 /**
372  * fc_rport_login() - Start the remote port login state machine
373  * @rdata: The remote port to be logged in to
374  *
375  * Locking Note: Called without the rport lock held. This
376  * function will hold the rport lock, call an _enter_*
377  * function and then unlock the rport.
378  *
379  * This indicates the intent to be logged into the remote port.
380  * If it appears we are already logged in, ADISC is used to verify
381  * the setup.
382  */
383 int fc_rport_login(struct fc_rport_priv *rdata)
384 {
385 	mutex_lock(&rdata->rp_mutex);
386 
387 	rdata->flags |= FC_RP_STARTED;
388 	switch (rdata->rp_state) {
389 	case RPORT_ST_READY:
390 		FC_RPORT_DBG(rdata, "ADISC port\n");
391 		fc_rport_enter_adisc(rdata);
392 		break;
393 	case RPORT_ST_DELETE:
394 		FC_RPORT_DBG(rdata, "Restart deleted port\n");
395 		break;
396 	default:
397 		FC_RPORT_DBG(rdata, "Login to port\n");
398 		fc_rport_enter_flogi(rdata);
399 		break;
400 	}
401 	mutex_unlock(&rdata->rp_mutex);
402 
403 	return 0;
404 }
405 
406 /**
407  * fc_rport_enter_delete() - Schedule a remote port to be deleted
408  * @rdata: The remote port to be deleted
409  * @event: The event to report as the reason for deletion
410  *
411  * Locking Note: Called with the rport lock held.
412  *
413  * Allow state change into DELETE only once.
414  *
415  * Call queue_work only if there's no event already pending.
416  * Set the new event so that the old pending event will not occur.
417  * Since we have the mutex, even if fc_rport_work() is already started,
418  * it'll see the new event.
419  */
420 static void fc_rport_enter_delete(struct fc_rport_priv *rdata,
421 				  enum fc_rport_event event)
422 {
423 	if (rdata->rp_state == RPORT_ST_DELETE)
424 		return;
425 
426 	FC_RPORT_DBG(rdata, "Delete port\n");
427 
428 	fc_rport_state_enter(rdata, RPORT_ST_DELETE);
429 
430 	if (rdata->event == RPORT_EV_NONE)
431 		queue_work(rport_event_queue, &rdata->event_work);
432 	rdata->event = event;
433 }
434 
435 /**
436  * fc_rport_logoff() - Logoff and remove a remote port
437  * @rdata: The remote port to be logged off of
438  *
439  * Locking Note: Called without the rport lock held. This
440  * function will hold the rport lock, call an _enter_*
441  * function and then unlock the rport.
442  */
443 int fc_rport_logoff(struct fc_rport_priv *rdata)
444 {
445 	mutex_lock(&rdata->rp_mutex);
446 
447 	FC_RPORT_DBG(rdata, "Remove port\n");
448 
449 	rdata->flags &= ~FC_RP_STARTED;
450 	if (rdata->rp_state == RPORT_ST_DELETE) {
451 		FC_RPORT_DBG(rdata, "Port in Delete state, not removing\n");
452 		goto out;
453 	}
454 	fc_rport_enter_logo(rdata);
455 
456 	/*
457 	 * Change the state to Delete so that we discard
458 	 * the response.
459 	 */
460 	fc_rport_enter_delete(rdata, RPORT_EV_STOP);
461 out:
462 	mutex_unlock(&rdata->rp_mutex);
463 	return 0;
464 }
465 
466 /**
467  * fc_rport_enter_ready() - Transition to the RPORT_ST_READY state
468  * @rdata: The remote port that is ready
469  *
470  * Locking Note: The rport lock is expected to be held before calling
471  * this routine.
472  */
473 static void fc_rport_enter_ready(struct fc_rport_priv *rdata)
474 {
475 	fc_rport_state_enter(rdata, RPORT_ST_READY);
476 
477 	FC_RPORT_DBG(rdata, "Port is Ready\n");
478 
479 	if (rdata->event == RPORT_EV_NONE)
480 		queue_work(rport_event_queue, &rdata->event_work);
481 	rdata->event = RPORT_EV_READY;
482 }
483 
484 /**
485  * fc_rport_timeout() - Handler for the retry_work timer
486  * @work: Handle to the remote port that has timed out
487  *
488  * Locking Note: Called without the rport lock held. This
489  * function will hold the rport lock, call an _enter_*
490  * function and then unlock the rport.
491  */
492 static void fc_rport_timeout(struct work_struct *work)
493 {
494 	struct fc_rport_priv *rdata =
495 		container_of(work, struct fc_rport_priv, retry_work.work);
496 
497 	mutex_lock(&rdata->rp_mutex);
498 
499 	switch (rdata->rp_state) {
500 	case RPORT_ST_FLOGI:
501 		fc_rport_enter_flogi(rdata);
502 		break;
503 	case RPORT_ST_PLOGI:
504 		fc_rport_enter_plogi(rdata);
505 		break;
506 	case RPORT_ST_PRLI:
507 		fc_rport_enter_prli(rdata);
508 		break;
509 	case RPORT_ST_RTV:
510 		fc_rport_enter_rtv(rdata);
511 		break;
512 	case RPORT_ST_ADISC:
513 		fc_rport_enter_adisc(rdata);
514 		break;
515 	case RPORT_ST_PLOGI_WAIT:
516 	case RPORT_ST_READY:
517 	case RPORT_ST_INIT:
518 	case RPORT_ST_DELETE:
519 		break;
520 	}
521 
522 	mutex_unlock(&rdata->rp_mutex);
523 }
524 
525 /**
526  * fc_rport_error() - Error handler, called once retries have been exhausted
527  * @rdata: The remote port the error is happened on
528  * @fp:	   The error code encapsulated in a frame pointer
529  *
530  * Locking Note: The rport lock is expected to be held before
531  * calling this routine
532  */
533 static void fc_rport_error(struct fc_rport_priv *rdata, struct fc_frame *fp)
534 {
535 	FC_RPORT_DBG(rdata, "Error %ld in state %s, retries %d\n",
536 		     IS_ERR(fp) ? -PTR_ERR(fp) : 0,
537 		     fc_rport_state(rdata), rdata->retries);
538 
539 	switch (rdata->rp_state) {
540 	case RPORT_ST_FLOGI:
541 	case RPORT_ST_PLOGI:
542 		rdata->flags &= ~FC_RP_STARTED;
543 		fc_rport_enter_delete(rdata, RPORT_EV_FAILED);
544 		break;
545 	case RPORT_ST_RTV:
546 		fc_rport_enter_ready(rdata);
547 		break;
548 	case RPORT_ST_PRLI:
549 	case RPORT_ST_ADISC:
550 		fc_rport_enter_logo(rdata);
551 		break;
552 	case RPORT_ST_PLOGI_WAIT:
553 	case RPORT_ST_DELETE:
554 	case RPORT_ST_READY:
555 	case RPORT_ST_INIT:
556 		break;
557 	}
558 }
559 
560 /**
561  * fc_rport_error_retry() - Handler for remote port state retries
562  * @rdata: The remote port whose state is to be retried
563  * @fp:	   The error code encapsulated in a frame pointer
564  *
565  * If the error was an exchange timeout retry immediately,
566  * otherwise wait for E_D_TOV.
567  *
568  * Locking Note: The rport lock is expected to be held before
569  * calling this routine
570  */
571 static void fc_rport_error_retry(struct fc_rport_priv *rdata,
572 				 struct fc_frame *fp)
573 {
574 	unsigned long delay = FC_DEF_E_D_TOV;
575 
576 	/* make sure this isn't an FC_EX_CLOSED error, never retry those */
577 	if (PTR_ERR(fp) == -FC_EX_CLOSED)
578 		return fc_rport_error(rdata, fp);
579 
580 	if (rdata->retries < rdata->local_port->max_rport_retry_count) {
581 		FC_RPORT_DBG(rdata, "Error %ld in state %s, retrying\n",
582 			     PTR_ERR(fp), fc_rport_state(rdata));
583 		rdata->retries++;
584 		/* no additional delay on exchange timeouts */
585 		if (PTR_ERR(fp) == -FC_EX_TIMEOUT)
586 			delay = 0;
587 		schedule_delayed_work(&rdata->retry_work, delay);
588 		return;
589 	}
590 
591 	return fc_rport_error(rdata, fp);
592 }
593 
594 /**
595  * fc_rport_login_complete() - Handle parameters and completion of p-mp login.
596  * @rdata:  The remote port which we logged into or which logged into us.
597  * @fp:     The FLOGI or PLOGI request or response frame
598  *
599  * Returns non-zero error if a problem is detected with the frame.
600  * Does not free the frame.
601  *
602  * This is only used in point-to-multipoint mode for FIP currently.
603  */
604 static int fc_rport_login_complete(struct fc_rport_priv *rdata,
605 				   struct fc_frame *fp)
606 {
607 	struct fc_lport *lport = rdata->local_port;
608 	struct fc_els_flogi *flogi;
609 	unsigned int e_d_tov;
610 	u16 csp_flags;
611 
612 	flogi = fc_frame_payload_get(fp, sizeof(*flogi));
613 	if (!flogi)
614 		return -EINVAL;
615 
616 	csp_flags = ntohs(flogi->fl_csp.sp_features);
617 
618 	if (fc_frame_payload_op(fp) == ELS_FLOGI) {
619 		if (csp_flags & FC_SP_FT_FPORT) {
620 			FC_RPORT_DBG(rdata, "Fabric bit set in FLOGI\n");
621 			return -EINVAL;
622 		}
623 	} else {
624 
625 		/*
626 		 * E_D_TOV is not valid on an incoming FLOGI request.
627 		 */
628 		e_d_tov = ntohl(flogi->fl_csp.sp_e_d_tov);
629 		if (csp_flags & FC_SP_FT_EDTR)
630 			e_d_tov /= 1000000;
631 		if (e_d_tov > rdata->e_d_tov)
632 			rdata->e_d_tov = e_d_tov;
633 	}
634 	rdata->maxframe_size = fc_plogi_get_maxframe(flogi, lport->mfs);
635 	return 0;
636 }
637 
638 /**
639  * fc_rport_flogi_resp() - Handle response to FLOGI request for p-mp mode
640  * @sp:	    The sequence that the FLOGI was on
641  * @fp:	    The FLOGI response frame
642  * @rp_arg: The remote port that received the FLOGI response
643  */
644 void fc_rport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp,
645 			 void *rp_arg)
646 {
647 	struct fc_rport_priv *rdata = rp_arg;
648 	struct fc_lport *lport = rdata->local_port;
649 	struct fc_els_flogi *flogi;
650 	unsigned int r_a_tov;
651 
652 	FC_RPORT_DBG(rdata, "Received a FLOGI %s\n", fc_els_resp_type(fp));
653 
654 	if (fp == ERR_PTR(-FC_EX_CLOSED))
655 		return;
656 
657 	mutex_lock(&rdata->rp_mutex);
658 
659 	if (rdata->rp_state != RPORT_ST_FLOGI) {
660 		FC_RPORT_DBG(rdata, "Received a FLOGI response, but in state "
661 			     "%s\n", fc_rport_state(rdata));
662 		if (IS_ERR(fp))
663 			goto err;
664 		goto out;
665 	}
666 
667 	if (IS_ERR(fp)) {
668 		fc_rport_error(rdata, fp);
669 		goto err;
670 	}
671 
672 	if (fc_frame_payload_op(fp) != ELS_LS_ACC)
673 		goto bad;
674 	if (fc_rport_login_complete(rdata, fp))
675 		goto bad;
676 
677 	flogi = fc_frame_payload_get(fp, sizeof(*flogi));
678 	if (!flogi)
679 		goto bad;
680 	r_a_tov = ntohl(flogi->fl_csp.sp_r_a_tov);
681 	if (r_a_tov > rdata->r_a_tov)
682 		rdata->r_a_tov = r_a_tov;
683 
684 	if (rdata->ids.port_name < lport->wwpn)
685 		fc_rport_enter_plogi(rdata);
686 	else
687 		fc_rport_state_enter(rdata, RPORT_ST_PLOGI_WAIT);
688 out:
689 	fc_frame_free(fp);
690 err:
691 	mutex_unlock(&rdata->rp_mutex);
692 	kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy);
693 	return;
694 bad:
695 	FC_RPORT_DBG(rdata, "Bad FLOGI response\n");
696 	fc_rport_error_retry(rdata, fp);
697 	goto out;
698 }
699 
700 /**
701  * fc_rport_enter_flogi() - Send a FLOGI request to the remote port for p-mp
702  * @rdata: The remote port to send a FLOGI to
703  *
704  * Locking Note: The rport lock is expected to be held before calling
705  * this routine.
706  */
707 static void fc_rport_enter_flogi(struct fc_rport_priv *rdata)
708 {
709 	struct fc_lport *lport = rdata->local_port;
710 	struct fc_frame *fp;
711 
712 	if (!lport->point_to_multipoint)
713 		return fc_rport_enter_plogi(rdata);
714 
715 	FC_RPORT_DBG(rdata, "Entered FLOGI state from %s state\n",
716 		     fc_rport_state(rdata));
717 
718 	fc_rport_state_enter(rdata, RPORT_ST_FLOGI);
719 
720 	fp = fc_frame_alloc(lport, sizeof(struct fc_els_flogi));
721 	if (!fp)
722 		return fc_rport_error_retry(rdata, fp);
723 
724 	if (!lport->tt.elsct_send(lport, rdata->ids.port_id, fp, ELS_FLOGI,
725 				  fc_rport_flogi_resp, rdata,
726 				  2 * lport->r_a_tov))
727 		fc_rport_error_retry(rdata, NULL);
728 	else
729 		kref_get(&rdata->kref);
730 }
731 
732 /**
733  * fc_rport_recv_flogi_req() - Handle Fabric Login (FLOGI) request in p-mp mode
734  * @lport: The local port that received the PLOGI request
735  * @rx_fp: The PLOGI request frame
736  */
737 static void fc_rport_recv_flogi_req(struct fc_lport *lport,
738 				    struct fc_frame *rx_fp)
739 {
740 	struct fc_disc *disc;
741 	struct fc_els_flogi *flp;
742 	struct fc_rport_priv *rdata;
743 	struct fc_frame *fp = rx_fp;
744 	struct fc_seq_els_data rjt_data;
745 	u32 sid;
746 
747 	sid = fc_frame_sid(fp);
748 
749 	FC_RPORT_ID_DBG(lport, sid, "Received FLOGI request\n");
750 
751 	disc = &lport->disc;
752 	mutex_lock(&disc->disc_mutex);
753 
754 	if (!lport->point_to_multipoint) {
755 		rjt_data.reason = ELS_RJT_UNSUP;
756 		rjt_data.explan = ELS_EXPL_NONE;
757 		goto reject;
758 	}
759 
760 	flp = fc_frame_payload_get(fp, sizeof(*flp));
761 	if (!flp) {
762 		rjt_data.reason = ELS_RJT_LOGIC;
763 		rjt_data.explan = ELS_EXPL_INV_LEN;
764 		goto reject;
765 	}
766 
767 	rdata = lport->tt.rport_lookup(lport, sid);
768 	if (!rdata) {
769 		rjt_data.reason = ELS_RJT_FIP;
770 		rjt_data.explan = ELS_EXPL_NOT_NEIGHBOR;
771 		goto reject;
772 	}
773 	mutex_lock(&rdata->rp_mutex);
774 
775 	FC_RPORT_DBG(rdata, "Received FLOGI in %s state\n",
776 		     fc_rport_state(rdata));
777 
778 	switch (rdata->rp_state) {
779 	case RPORT_ST_INIT:
780 	case RPORT_ST_DELETE:
781 		mutex_unlock(&rdata->rp_mutex);
782 		rjt_data.reason = ELS_RJT_FIP;
783 		rjt_data.explan = ELS_EXPL_NOT_NEIGHBOR;
784 		goto reject;
785 	case RPORT_ST_FLOGI:
786 	case RPORT_ST_PLOGI_WAIT:
787 	case RPORT_ST_PLOGI:
788 		break;
789 	case RPORT_ST_PRLI:
790 	case RPORT_ST_RTV:
791 	case RPORT_ST_READY:
792 	case RPORT_ST_ADISC:
793 		/*
794 		 * Set the remote port to be deleted and to then restart.
795 		 * This queues work to be sure exchanges are reset.
796 		 */
797 		fc_rport_enter_delete(rdata, RPORT_EV_LOGO);
798 		mutex_unlock(&rdata->rp_mutex);
799 		rjt_data.reason = ELS_RJT_BUSY;
800 		rjt_data.explan = ELS_EXPL_NONE;
801 		goto reject;
802 	}
803 	if (fc_rport_login_complete(rdata, fp)) {
804 		mutex_unlock(&rdata->rp_mutex);
805 		rjt_data.reason = ELS_RJT_LOGIC;
806 		rjt_data.explan = ELS_EXPL_NONE;
807 		goto reject;
808 	}
809 
810 	fp = fc_frame_alloc(lport, sizeof(*flp));
811 	if (!fp)
812 		goto out;
813 
814 	fc_flogi_fill(lport, fp);
815 	flp = fc_frame_payload_get(fp, sizeof(*flp));
816 	flp->fl_cmd = ELS_LS_ACC;
817 
818 	fc_fill_reply_hdr(fp, rx_fp, FC_RCTL_ELS_REP, 0);
819 	lport->tt.frame_send(lport, fp);
820 
821 	if (rdata->ids.port_name < lport->wwpn)
822 		fc_rport_enter_plogi(rdata);
823 	else
824 		fc_rport_state_enter(rdata, RPORT_ST_PLOGI_WAIT);
825 out:
826 	mutex_unlock(&rdata->rp_mutex);
827 	mutex_unlock(&disc->disc_mutex);
828 	fc_frame_free(rx_fp);
829 	return;
830 
831 reject:
832 	mutex_unlock(&disc->disc_mutex);
833 	lport->tt.seq_els_rsp_send(rx_fp, ELS_LS_RJT, &rjt_data);
834 	fc_frame_free(rx_fp);
835 }
836 
837 /**
838  * fc_rport_plogi_resp() - Handler for ELS PLOGI responses
839  * @sp:	       The sequence the PLOGI is on
840  * @fp:	       The PLOGI response frame
841  * @rdata_arg: The remote port that sent the PLOGI response
842  *
843  * Locking Note: This function will be called without the rport lock
844  * held, but it will lock, call an _enter_* function or fc_rport_error
845  * and then unlock the rport.
846  */
847 static void fc_rport_plogi_resp(struct fc_seq *sp, struct fc_frame *fp,
848 				void *rdata_arg)
849 {
850 	struct fc_rport_priv *rdata = rdata_arg;
851 	struct fc_lport *lport = rdata->local_port;
852 	struct fc_els_flogi *plp = NULL;
853 	u16 csp_seq;
854 	u16 cssp_seq;
855 	u8 op;
856 
857 	mutex_lock(&rdata->rp_mutex);
858 
859 	FC_RPORT_DBG(rdata, "Received a PLOGI %s\n", fc_els_resp_type(fp));
860 
861 	if (rdata->rp_state != RPORT_ST_PLOGI) {
862 		FC_RPORT_DBG(rdata, "Received a PLOGI response, but in state "
863 			     "%s\n", fc_rport_state(rdata));
864 		if (IS_ERR(fp))
865 			goto err;
866 		goto out;
867 	}
868 
869 	if (IS_ERR(fp)) {
870 		fc_rport_error_retry(rdata, fp);
871 		goto err;
872 	}
873 
874 	op = fc_frame_payload_op(fp);
875 	if (op == ELS_LS_ACC &&
876 	    (plp = fc_frame_payload_get(fp, sizeof(*plp))) != NULL) {
877 		rdata->ids.port_name = get_unaligned_be64(&plp->fl_wwpn);
878 		rdata->ids.node_name = get_unaligned_be64(&plp->fl_wwnn);
879 
880 		if (lport->point_to_multipoint)
881 			fc_rport_login_complete(rdata, fp);
882 		csp_seq = ntohs(plp->fl_csp.sp_tot_seq);
883 		cssp_seq = ntohs(plp->fl_cssp[3 - 1].cp_con_seq);
884 		if (cssp_seq < csp_seq)
885 			csp_seq = cssp_seq;
886 		rdata->max_seq = csp_seq;
887 		rdata->maxframe_size = fc_plogi_get_maxframe(plp, lport->mfs);
888 		fc_rport_enter_prli(rdata);
889 	} else
890 		fc_rport_error_retry(rdata, fp);
891 
892 out:
893 	fc_frame_free(fp);
894 err:
895 	mutex_unlock(&rdata->rp_mutex);
896 	kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy);
897 }
898 
899 /**
900  * fc_rport_enter_plogi() - Send Port Login (PLOGI) request
901  * @rdata: The remote port to send a PLOGI to
902  *
903  * Locking Note: The rport lock is expected to be held before calling
904  * this routine.
905  */
906 static void fc_rport_enter_plogi(struct fc_rport_priv *rdata)
907 {
908 	struct fc_lport *lport = rdata->local_port;
909 	struct fc_frame *fp;
910 
911 	FC_RPORT_DBG(rdata, "Port entered PLOGI state from %s state\n",
912 		     fc_rport_state(rdata));
913 
914 	fc_rport_state_enter(rdata, RPORT_ST_PLOGI);
915 
916 	rdata->maxframe_size = FC_MIN_MAX_PAYLOAD;
917 	fp = fc_frame_alloc(lport, sizeof(struct fc_els_flogi));
918 	if (!fp) {
919 		FC_RPORT_DBG(rdata, "%s frame alloc failed\n", __func__);
920 		fc_rport_error_retry(rdata, fp);
921 		return;
922 	}
923 	rdata->e_d_tov = lport->e_d_tov;
924 
925 	if (!lport->tt.elsct_send(lport, rdata->ids.port_id, fp, ELS_PLOGI,
926 				  fc_rport_plogi_resp, rdata,
927 				  2 * lport->r_a_tov))
928 		fc_rport_error_retry(rdata, NULL);
929 	else
930 		kref_get(&rdata->kref);
931 }
932 
933 /**
934  * fc_rport_prli_resp() - Process Login (PRLI) response handler
935  * @sp:	       The sequence the PRLI response was on
936  * @fp:	       The PRLI response frame
937  * @rdata_arg: The remote port that sent the PRLI response
938  *
939  * Locking Note: This function will be called without the rport lock
940  * held, but it will lock, call an _enter_* function or fc_rport_error
941  * and then unlock the rport.
942  */
943 static void fc_rport_prli_resp(struct fc_seq *sp, struct fc_frame *fp,
944 			       void *rdata_arg)
945 {
946 	struct fc_rport_priv *rdata = rdata_arg;
947 	struct {
948 		struct fc_els_prli prli;
949 		struct fc_els_spp spp;
950 	} *pp;
951 	u32 roles = FC_RPORT_ROLE_UNKNOWN;
952 	u32 fcp_parm = 0;
953 	u8 op;
954 	u8 resp_code = 0;
955 
956 	mutex_lock(&rdata->rp_mutex);
957 
958 	FC_RPORT_DBG(rdata, "Received a PRLI %s\n", fc_els_resp_type(fp));
959 
960 	if (rdata->rp_state != RPORT_ST_PRLI) {
961 		FC_RPORT_DBG(rdata, "Received a PRLI response, but in state "
962 			     "%s\n", fc_rport_state(rdata));
963 		if (IS_ERR(fp))
964 			goto err;
965 		goto out;
966 	}
967 
968 	if (IS_ERR(fp)) {
969 		fc_rport_error_retry(rdata, fp);
970 		goto err;
971 	}
972 
973 	/* reinitialize remote port roles */
974 	rdata->ids.roles = FC_RPORT_ROLE_UNKNOWN;
975 
976 	op = fc_frame_payload_op(fp);
977 	if (op == ELS_LS_ACC) {
978 		pp = fc_frame_payload_get(fp, sizeof(*pp));
979 		if (!pp)
980 			goto out;
981 
982 		resp_code = (pp->spp.spp_flags & FC_SPP_RESP_MASK);
983 		FC_RPORT_DBG(rdata, "PRLI spp_flags = 0x%x\n",
984 			     pp->spp.spp_flags);
985 		if (resp_code != FC_SPP_RESP_ACK) {
986 			if (resp_code == FC_SPP_RESP_CONF)
987 				fc_rport_error(rdata, fp);
988 			else
989 				fc_rport_error_retry(rdata, fp);
990 			goto out;
991 		}
992 		if (pp->prli.prli_spp_len < sizeof(pp->spp))
993 			goto out;
994 
995 		fcp_parm = ntohl(pp->spp.spp_params);
996 		if (fcp_parm & FCP_SPPF_RETRY)
997 			rdata->flags |= FC_RP_FLAGS_RETRY;
998 
999 		rdata->supported_classes = FC_COS_CLASS3;
1000 		if (fcp_parm & FCP_SPPF_INIT_FCN)
1001 			roles |= FC_RPORT_ROLE_FCP_INITIATOR;
1002 		if (fcp_parm & FCP_SPPF_TARG_FCN)
1003 			roles |= FC_RPORT_ROLE_FCP_TARGET;
1004 
1005 		rdata->ids.roles = roles;
1006 		fc_rport_enter_rtv(rdata);
1007 
1008 	} else {
1009 		FC_RPORT_DBG(rdata, "Bad ELS response for PRLI command\n");
1010 		fc_rport_error_retry(rdata, fp);
1011 	}
1012 
1013 out:
1014 	fc_frame_free(fp);
1015 err:
1016 	mutex_unlock(&rdata->rp_mutex);
1017 	kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy);
1018 }
1019 
1020 /**
1021  * fc_rport_enter_prli() - Send Process Login (PRLI) request
1022  * @rdata: The remote port to send the PRLI request to
1023  *
1024  * Locking Note: The rport lock is expected to be held before calling
1025  * this routine.
1026  */
1027 static void fc_rport_enter_prli(struct fc_rport_priv *rdata)
1028 {
1029 	struct fc_lport *lport = rdata->local_port;
1030 	struct {
1031 		struct fc_els_prli prli;
1032 		struct fc_els_spp spp;
1033 	} *pp;
1034 	struct fc_frame *fp;
1035 
1036 	/*
1037 	 * If the rport is one of the well known addresses
1038 	 * we skip PRLI and RTV and go straight to READY.
1039 	 */
1040 	if (rdata->ids.port_id >= FC_FID_DOM_MGR) {
1041 		fc_rport_enter_ready(rdata);
1042 		return;
1043 	}
1044 
1045 	FC_RPORT_DBG(rdata, "Port entered PRLI state from %s state\n",
1046 		     fc_rport_state(rdata));
1047 
1048 	fc_rport_state_enter(rdata, RPORT_ST_PRLI);
1049 
1050 	fp = fc_frame_alloc(lport, sizeof(*pp));
1051 	if (!fp) {
1052 		fc_rport_error_retry(rdata, fp);
1053 		return;
1054 	}
1055 
1056 	if (!lport->tt.elsct_send(lport, rdata->ids.port_id, fp, ELS_PRLI,
1057 				  fc_rport_prli_resp, rdata,
1058 				  2 * lport->r_a_tov))
1059 		fc_rport_error_retry(rdata, NULL);
1060 	else
1061 		kref_get(&rdata->kref);
1062 }
1063 
1064 /**
1065  * fc_rport_els_rtv_resp() - Handler for Request Timeout Value (RTV) responses
1066  * @sp:	       The sequence the RTV was on
1067  * @fp:	       The RTV response frame
1068  * @rdata_arg: The remote port that sent the RTV response
1069  *
1070  * Many targets don't seem to support this.
1071  *
1072  * Locking Note: This function will be called without the rport lock
1073  * held, but it will lock, call an _enter_* function or fc_rport_error
1074  * and then unlock the rport.
1075  */
1076 static void fc_rport_rtv_resp(struct fc_seq *sp, struct fc_frame *fp,
1077 			      void *rdata_arg)
1078 {
1079 	struct fc_rport_priv *rdata = rdata_arg;
1080 	u8 op;
1081 
1082 	mutex_lock(&rdata->rp_mutex);
1083 
1084 	FC_RPORT_DBG(rdata, "Received a RTV %s\n", fc_els_resp_type(fp));
1085 
1086 	if (rdata->rp_state != RPORT_ST_RTV) {
1087 		FC_RPORT_DBG(rdata, "Received a RTV response, but in state "
1088 			     "%s\n", fc_rport_state(rdata));
1089 		if (IS_ERR(fp))
1090 			goto err;
1091 		goto out;
1092 	}
1093 
1094 	if (IS_ERR(fp)) {
1095 		fc_rport_error(rdata, fp);
1096 		goto err;
1097 	}
1098 
1099 	op = fc_frame_payload_op(fp);
1100 	if (op == ELS_LS_ACC) {
1101 		struct fc_els_rtv_acc *rtv;
1102 		u32 toq;
1103 		u32 tov;
1104 
1105 		rtv = fc_frame_payload_get(fp, sizeof(*rtv));
1106 		if (rtv) {
1107 			toq = ntohl(rtv->rtv_toq);
1108 			tov = ntohl(rtv->rtv_r_a_tov);
1109 			if (tov == 0)
1110 				tov = 1;
1111 			rdata->r_a_tov = tov;
1112 			tov = ntohl(rtv->rtv_e_d_tov);
1113 			if (toq & FC_ELS_RTV_EDRES)
1114 				tov /= 1000000;
1115 			if (tov == 0)
1116 				tov = 1;
1117 			rdata->e_d_tov = tov;
1118 		}
1119 	}
1120 
1121 	fc_rport_enter_ready(rdata);
1122 
1123 out:
1124 	fc_frame_free(fp);
1125 err:
1126 	mutex_unlock(&rdata->rp_mutex);
1127 	kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy);
1128 }
1129 
1130 /**
1131  * fc_rport_enter_rtv() - Send Request Timeout Value (RTV) request
1132  * @rdata: The remote port to send the RTV request to
1133  *
1134  * Locking Note: The rport lock is expected to be held before calling
1135  * this routine.
1136  */
1137 static void fc_rport_enter_rtv(struct fc_rport_priv *rdata)
1138 {
1139 	struct fc_frame *fp;
1140 	struct fc_lport *lport = rdata->local_port;
1141 
1142 	FC_RPORT_DBG(rdata, "Port entered RTV state from %s state\n",
1143 		     fc_rport_state(rdata));
1144 
1145 	fc_rport_state_enter(rdata, RPORT_ST_RTV);
1146 
1147 	fp = fc_frame_alloc(lport, sizeof(struct fc_els_rtv));
1148 	if (!fp) {
1149 		fc_rport_error_retry(rdata, fp);
1150 		return;
1151 	}
1152 
1153 	if (!lport->tt.elsct_send(lport, rdata->ids.port_id, fp, ELS_RTV,
1154 				  fc_rport_rtv_resp, rdata,
1155 				  2 * lport->r_a_tov))
1156 		fc_rport_error_retry(rdata, NULL);
1157 	else
1158 		kref_get(&rdata->kref);
1159 }
1160 
1161 /**
1162  * fc_rport_logo_resp() - Handler for logout (LOGO) responses
1163  * @sp:	       The sequence the LOGO was on
1164  * @fp:	       The LOGO response frame
1165  * @lport_arg: The local port
1166  */
1167 static void fc_rport_logo_resp(struct fc_seq *sp, struct fc_frame *fp,
1168 			       void *lport_arg)
1169 {
1170 	struct fc_lport *lport = lport_arg;
1171 
1172 	FC_RPORT_ID_DBG(lport, fc_seq_exch(sp)->did,
1173 			"Received a LOGO %s\n", fc_els_resp_type(fp));
1174 	if (IS_ERR(fp))
1175 		return;
1176 	fc_frame_free(fp);
1177 }
1178 
1179 /**
1180  * fc_rport_enter_logo() - Send a logout (LOGO) request
1181  * @rdata: The remote port to send the LOGO request to
1182  *
1183  * Locking Note: The rport lock is expected to be held before calling
1184  * this routine.
1185  */
1186 static void fc_rport_enter_logo(struct fc_rport_priv *rdata)
1187 {
1188 	struct fc_lport *lport = rdata->local_port;
1189 	struct fc_frame *fp;
1190 
1191 	FC_RPORT_DBG(rdata, "Port sending LOGO from %s state\n",
1192 		     fc_rport_state(rdata));
1193 
1194 	fp = fc_frame_alloc(lport, sizeof(struct fc_els_logo));
1195 	if (!fp)
1196 		return;
1197 	(void)lport->tt.elsct_send(lport, rdata->ids.port_id, fp, ELS_LOGO,
1198 				   fc_rport_logo_resp, lport, 0);
1199 }
1200 
1201 /**
1202  * fc_rport_els_adisc_resp() - Handler for Address Discovery (ADISC) responses
1203  * @sp:	       The sequence the ADISC response was on
1204  * @fp:	       The ADISC response frame
1205  * @rdata_arg: The remote port that sent the ADISC response
1206  *
1207  * Locking Note: This function will be called without the rport lock
1208  * held, but it will lock, call an _enter_* function or fc_rport_error
1209  * and then unlock the rport.
1210  */
1211 static void fc_rport_adisc_resp(struct fc_seq *sp, struct fc_frame *fp,
1212 				void *rdata_arg)
1213 {
1214 	struct fc_rport_priv *rdata = rdata_arg;
1215 	struct fc_els_adisc *adisc;
1216 	u8 op;
1217 
1218 	mutex_lock(&rdata->rp_mutex);
1219 
1220 	FC_RPORT_DBG(rdata, "Received a ADISC response\n");
1221 
1222 	if (rdata->rp_state != RPORT_ST_ADISC) {
1223 		FC_RPORT_DBG(rdata, "Received a ADISC resp but in state %s\n",
1224 			     fc_rport_state(rdata));
1225 		if (IS_ERR(fp))
1226 			goto err;
1227 		goto out;
1228 	}
1229 
1230 	if (IS_ERR(fp)) {
1231 		fc_rport_error(rdata, fp);
1232 		goto err;
1233 	}
1234 
1235 	/*
1236 	 * If address verification failed.  Consider us logged out of the rport.
1237 	 * Since the rport is still in discovery, we want to be
1238 	 * logged in, so go to PLOGI state.  Otherwise, go back to READY.
1239 	 */
1240 	op = fc_frame_payload_op(fp);
1241 	adisc = fc_frame_payload_get(fp, sizeof(*adisc));
1242 	if (op != ELS_LS_ACC || !adisc ||
1243 	    ntoh24(adisc->adisc_port_id) != rdata->ids.port_id ||
1244 	    get_unaligned_be64(&adisc->adisc_wwpn) != rdata->ids.port_name ||
1245 	    get_unaligned_be64(&adisc->adisc_wwnn) != rdata->ids.node_name) {
1246 		FC_RPORT_DBG(rdata, "ADISC error or mismatch\n");
1247 		fc_rport_enter_flogi(rdata);
1248 	} else {
1249 		FC_RPORT_DBG(rdata, "ADISC OK\n");
1250 		fc_rport_enter_ready(rdata);
1251 	}
1252 out:
1253 	fc_frame_free(fp);
1254 err:
1255 	mutex_unlock(&rdata->rp_mutex);
1256 	kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy);
1257 }
1258 
1259 /**
1260  * fc_rport_enter_adisc() - Send Address Discover (ADISC) request
1261  * @rdata: The remote port to send the ADISC request to
1262  *
1263  * Locking Note: The rport lock is expected to be held before calling
1264  * this routine.
1265  */
1266 static void fc_rport_enter_adisc(struct fc_rport_priv *rdata)
1267 {
1268 	struct fc_lport *lport = rdata->local_port;
1269 	struct fc_frame *fp;
1270 
1271 	FC_RPORT_DBG(rdata, "sending ADISC from %s state\n",
1272 		     fc_rport_state(rdata));
1273 
1274 	fc_rport_state_enter(rdata, RPORT_ST_ADISC);
1275 
1276 	fp = fc_frame_alloc(lport, sizeof(struct fc_els_adisc));
1277 	if (!fp) {
1278 		fc_rport_error_retry(rdata, fp);
1279 		return;
1280 	}
1281 	if (!lport->tt.elsct_send(lport, rdata->ids.port_id, fp, ELS_ADISC,
1282 				  fc_rport_adisc_resp, rdata,
1283 				  2 * lport->r_a_tov))
1284 		fc_rport_error_retry(rdata, NULL);
1285 	else
1286 		kref_get(&rdata->kref);
1287 }
1288 
1289 /**
1290  * fc_rport_recv_adisc_req() - Handler for Address Discovery (ADISC) requests
1291  * @rdata: The remote port that sent the ADISC request
1292  * @in_fp: The ADISC request frame
1293  *
1294  * Locking Note:  Called with the lport and rport locks held.
1295  */
1296 static void fc_rport_recv_adisc_req(struct fc_rport_priv *rdata,
1297 				    struct fc_frame *in_fp)
1298 {
1299 	struct fc_lport *lport = rdata->local_port;
1300 	struct fc_frame *fp;
1301 	struct fc_els_adisc *adisc;
1302 	struct fc_seq_els_data rjt_data;
1303 
1304 	FC_RPORT_DBG(rdata, "Received ADISC request\n");
1305 
1306 	adisc = fc_frame_payload_get(in_fp, sizeof(*adisc));
1307 	if (!adisc) {
1308 		rjt_data.reason = ELS_RJT_PROT;
1309 		rjt_data.explan = ELS_EXPL_INV_LEN;
1310 		lport->tt.seq_els_rsp_send(in_fp, ELS_LS_RJT, &rjt_data);
1311 		goto drop;
1312 	}
1313 
1314 	fp = fc_frame_alloc(lport, sizeof(*adisc));
1315 	if (!fp)
1316 		goto drop;
1317 	fc_adisc_fill(lport, fp);
1318 	adisc = fc_frame_payload_get(fp, sizeof(*adisc));
1319 	adisc->adisc_cmd = ELS_LS_ACC;
1320 	fc_fill_reply_hdr(fp, in_fp, FC_RCTL_ELS_REP, 0);
1321 	lport->tt.frame_send(lport, fp);
1322 drop:
1323 	fc_frame_free(in_fp);
1324 }
1325 
1326 /**
1327  * fc_rport_recv_rls_req() - Handle received Read Link Status request
1328  * @rdata: The remote port that sent the RLS request
1329  * @rx_fp: The PRLI request frame
1330  *
1331  * Locking Note: The rport lock is expected to be held before calling
1332  * this function.
1333  */
1334 static void fc_rport_recv_rls_req(struct fc_rport_priv *rdata,
1335 				  struct fc_frame *rx_fp)
1336 
1337 {
1338 	struct fc_lport *lport = rdata->local_port;
1339 	struct fc_frame *fp;
1340 	struct fc_els_rls *rls;
1341 	struct fc_els_rls_resp *rsp;
1342 	struct fc_els_lesb *lesb;
1343 	struct fc_seq_els_data rjt_data;
1344 	struct fc_host_statistics *hst;
1345 
1346 	FC_RPORT_DBG(rdata, "Received RLS request while in state %s\n",
1347 		     fc_rport_state(rdata));
1348 
1349 	rls = fc_frame_payload_get(rx_fp, sizeof(*rls));
1350 	if (!rls) {
1351 		rjt_data.reason = ELS_RJT_PROT;
1352 		rjt_data.explan = ELS_EXPL_INV_LEN;
1353 		goto out_rjt;
1354 	}
1355 
1356 	fp = fc_frame_alloc(lport, sizeof(*rsp));
1357 	if (!fp) {
1358 		rjt_data.reason = ELS_RJT_UNAB;
1359 		rjt_data.explan = ELS_EXPL_INSUF_RES;
1360 		goto out_rjt;
1361 	}
1362 
1363 	rsp = fc_frame_payload_get(fp, sizeof(*rsp));
1364 	memset(rsp, 0, sizeof(*rsp));
1365 	rsp->rls_cmd = ELS_LS_ACC;
1366 	lesb = &rsp->rls_lesb;
1367 	if (lport->tt.get_lesb) {
1368 		/* get LESB from LLD if it supports it */
1369 		lport->tt.get_lesb(lport, lesb);
1370 	} else {
1371 		fc_get_host_stats(lport->host);
1372 		hst = &lport->host_stats;
1373 		lesb->lesb_link_fail = htonl(hst->link_failure_count);
1374 		lesb->lesb_sync_loss = htonl(hst->loss_of_sync_count);
1375 		lesb->lesb_sig_loss = htonl(hst->loss_of_signal_count);
1376 		lesb->lesb_prim_err = htonl(hst->prim_seq_protocol_err_count);
1377 		lesb->lesb_inv_word = htonl(hst->invalid_tx_word_count);
1378 		lesb->lesb_inv_crc = htonl(hst->invalid_crc_count);
1379 	}
1380 
1381 	fc_fill_reply_hdr(fp, rx_fp, FC_RCTL_ELS_REP, 0);
1382 	lport->tt.frame_send(lport, fp);
1383 	goto out;
1384 
1385 out_rjt:
1386 	lport->tt.seq_els_rsp_send(rx_fp, ELS_LS_RJT, &rjt_data);
1387 out:
1388 	fc_frame_free(rx_fp);
1389 }
1390 
1391 /**
1392  * fc_rport_recv_els_req() - Handler for validated ELS requests
1393  * @lport: The local port that received the ELS request
1394  * @fp:	   The ELS request frame
1395  *
1396  * Handle incoming ELS requests that require port login.
1397  * The ELS opcode has already been validated by the caller.
1398  *
1399  * Locking Note: Called with the lport lock held.
1400  */
1401 static void fc_rport_recv_els_req(struct fc_lport *lport, struct fc_frame *fp)
1402 {
1403 	struct fc_rport_priv *rdata;
1404 	struct fc_seq_els_data els_data;
1405 
1406 	mutex_lock(&lport->disc.disc_mutex);
1407 	rdata = lport->tt.rport_lookup(lport, fc_frame_sid(fp));
1408 	if (!rdata) {
1409 		mutex_unlock(&lport->disc.disc_mutex);
1410 		goto reject;
1411 	}
1412 	mutex_lock(&rdata->rp_mutex);
1413 	mutex_unlock(&lport->disc.disc_mutex);
1414 
1415 	switch (rdata->rp_state) {
1416 	case RPORT_ST_PRLI:
1417 	case RPORT_ST_RTV:
1418 	case RPORT_ST_READY:
1419 	case RPORT_ST_ADISC:
1420 		break;
1421 	default:
1422 		mutex_unlock(&rdata->rp_mutex);
1423 		goto reject;
1424 	}
1425 
1426 	switch (fc_frame_payload_op(fp)) {
1427 	case ELS_PRLI:
1428 		fc_rport_recv_prli_req(rdata, fp);
1429 		break;
1430 	case ELS_PRLO:
1431 		fc_rport_recv_prlo_req(rdata, fp);
1432 		break;
1433 	case ELS_ADISC:
1434 		fc_rport_recv_adisc_req(rdata, fp);
1435 		break;
1436 	case ELS_RRQ:
1437 		lport->tt.seq_els_rsp_send(fp, ELS_RRQ, NULL);
1438 		fc_frame_free(fp);
1439 		break;
1440 	case ELS_REC:
1441 		lport->tt.seq_els_rsp_send(fp, ELS_REC, NULL);
1442 		fc_frame_free(fp);
1443 		break;
1444 	case ELS_RLS:
1445 		fc_rport_recv_rls_req(rdata, fp);
1446 		break;
1447 	default:
1448 		fc_frame_free(fp);	/* can't happen */
1449 		break;
1450 	}
1451 
1452 	mutex_unlock(&rdata->rp_mutex);
1453 	return;
1454 
1455 reject:
1456 	els_data.reason = ELS_RJT_UNAB;
1457 	els_data.explan = ELS_EXPL_PLOGI_REQD;
1458 	lport->tt.seq_els_rsp_send(fp, ELS_LS_RJT, &els_data);
1459 	fc_frame_free(fp);
1460 }
1461 
1462 /**
1463  * fc_rport_recv_req() - Handler for requests
1464  * @lport: The local port that received the request
1465  * @fp:	   The request frame
1466  *
1467  * Locking Note: Called with the lport lock held.
1468  */
1469 void fc_rport_recv_req(struct fc_lport *lport, struct fc_frame *fp)
1470 {
1471 	struct fc_seq_els_data els_data;
1472 
1473 	/*
1474 	 * Handle FLOGI, PLOGI and LOGO requests separately, since they
1475 	 * don't require prior login.
1476 	 * Check for unsupported opcodes first and reject them.
1477 	 * For some ops, it would be incorrect to reject with "PLOGI required".
1478 	 */
1479 	switch (fc_frame_payload_op(fp)) {
1480 	case ELS_FLOGI:
1481 		fc_rport_recv_flogi_req(lport, fp);
1482 		break;
1483 	case ELS_PLOGI:
1484 		fc_rport_recv_plogi_req(lport, fp);
1485 		break;
1486 	case ELS_LOGO:
1487 		fc_rport_recv_logo_req(lport, fp);
1488 		break;
1489 	case ELS_PRLI:
1490 	case ELS_PRLO:
1491 	case ELS_ADISC:
1492 	case ELS_RRQ:
1493 	case ELS_REC:
1494 	case ELS_RLS:
1495 		fc_rport_recv_els_req(lport, fp);
1496 		break;
1497 	default:
1498 		els_data.reason = ELS_RJT_UNSUP;
1499 		els_data.explan = ELS_EXPL_NONE;
1500 		lport->tt.seq_els_rsp_send(fp, ELS_LS_RJT, &els_data);
1501 		fc_frame_free(fp);
1502 		break;
1503 	}
1504 }
1505 
1506 /**
1507  * fc_rport_recv_plogi_req() - Handler for Port Login (PLOGI) requests
1508  * @lport: The local port that received the PLOGI request
1509  * @rx_fp: The PLOGI request frame
1510  *
1511  * Locking Note: The rport lock is held before calling this function.
1512  */
1513 static void fc_rport_recv_plogi_req(struct fc_lport *lport,
1514 				    struct fc_frame *rx_fp)
1515 {
1516 	struct fc_disc *disc;
1517 	struct fc_rport_priv *rdata;
1518 	struct fc_frame *fp = rx_fp;
1519 	struct fc_els_flogi *pl;
1520 	struct fc_seq_els_data rjt_data;
1521 	u32 sid;
1522 
1523 	sid = fc_frame_sid(fp);
1524 
1525 	FC_RPORT_ID_DBG(lport, sid, "Received PLOGI request\n");
1526 
1527 	pl = fc_frame_payload_get(fp, sizeof(*pl));
1528 	if (!pl) {
1529 		FC_RPORT_ID_DBG(lport, sid, "Received PLOGI too short\n");
1530 		rjt_data.reason = ELS_RJT_PROT;
1531 		rjt_data.explan = ELS_EXPL_INV_LEN;
1532 		goto reject;
1533 	}
1534 
1535 	disc = &lport->disc;
1536 	mutex_lock(&disc->disc_mutex);
1537 	rdata = lport->tt.rport_create(lport, sid);
1538 	if (!rdata) {
1539 		mutex_unlock(&disc->disc_mutex);
1540 		rjt_data.reason = ELS_RJT_UNAB;
1541 		rjt_data.explan = ELS_EXPL_INSUF_RES;
1542 		goto reject;
1543 	}
1544 
1545 	mutex_lock(&rdata->rp_mutex);
1546 	mutex_unlock(&disc->disc_mutex);
1547 
1548 	rdata->ids.port_name = get_unaligned_be64(&pl->fl_wwpn);
1549 	rdata->ids.node_name = get_unaligned_be64(&pl->fl_wwnn);
1550 
1551 	/*
1552 	 * If the rport was just created, possibly due to the incoming PLOGI,
1553 	 * set the state appropriately and accept the PLOGI.
1554 	 *
1555 	 * If we had also sent a PLOGI, and if the received PLOGI is from a
1556 	 * higher WWPN, we accept it, otherwise an LS_RJT is sent with reason
1557 	 * "command already in progress".
1558 	 *
1559 	 * XXX TBD: If the session was ready before, the PLOGI should result in
1560 	 * all outstanding exchanges being reset.
1561 	 */
1562 	switch (rdata->rp_state) {
1563 	case RPORT_ST_INIT:
1564 		FC_RPORT_DBG(rdata, "Received PLOGI in INIT state\n");
1565 		break;
1566 	case RPORT_ST_PLOGI_WAIT:
1567 		FC_RPORT_DBG(rdata, "Received PLOGI in PLOGI_WAIT state\n");
1568 		break;
1569 	case RPORT_ST_PLOGI:
1570 		FC_RPORT_DBG(rdata, "Received PLOGI in PLOGI state\n");
1571 		if (rdata->ids.port_name < lport->wwpn) {
1572 			mutex_unlock(&rdata->rp_mutex);
1573 			rjt_data.reason = ELS_RJT_INPROG;
1574 			rjt_data.explan = ELS_EXPL_NONE;
1575 			goto reject;
1576 		}
1577 		break;
1578 	case RPORT_ST_PRLI:
1579 	case RPORT_ST_RTV:
1580 	case RPORT_ST_READY:
1581 	case RPORT_ST_ADISC:
1582 		FC_RPORT_DBG(rdata, "Received PLOGI in logged-in state %d "
1583 			     "- ignored for now\n", rdata->rp_state);
1584 		/* XXX TBD - should reset */
1585 		break;
1586 	case RPORT_ST_FLOGI:
1587 	case RPORT_ST_DELETE:
1588 		FC_RPORT_DBG(rdata, "Received PLOGI in state %s - send busy\n",
1589 			     fc_rport_state(rdata));
1590 		mutex_unlock(&rdata->rp_mutex);
1591 		rjt_data.reason = ELS_RJT_BUSY;
1592 		rjt_data.explan = ELS_EXPL_NONE;
1593 		goto reject;
1594 	}
1595 
1596 	/*
1597 	 * Get session payload size from incoming PLOGI.
1598 	 */
1599 	rdata->maxframe_size = fc_plogi_get_maxframe(pl, lport->mfs);
1600 
1601 	/*
1602 	 * Send LS_ACC.	 If this fails, the originator should retry.
1603 	 */
1604 	fp = fc_frame_alloc(lport, sizeof(*pl));
1605 	if (!fp)
1606 		goto out;
1607 
1608 	fc_plogi_fill(lport, fp, ELS_LS_ACC);
1609 	fc_fill_reply_hdr(fp, rx_fp, FC_RCTL_ELS_REP, 0);
1610 	lport->tt.frame_send(lport, fp);
1611 	fc_rport_enter_prli(rdata);
1612 out:
1613 	mutex_unlock(&rdata->rp_mutex);
1614 	fc_frame_free(rx_fp);
1615 	return;
1616 
1617 reject:
1618 	lport->tt.seq_els_rsp_send(fp, ELS_LS_RJT, &rjt_data);
1619 	fc_frame_free(fp);
1620 }
1621 
1622 /**
1623  * fc_rport_recv_prli_req() - Handler for process login (PRLI) requests
1624  * @rdata: The remote port that sent the PRLI request
1625  * @rx_fp: The PRLI request frame
1626  *
1627  * Locking Note: The rport lock is exected to be held before calling
1628  * this function.
1629  */
1630 static void fc_rport_recv_prli_req(struct fc_rport_priv *rdata,
1631 				   struct fc_frame *rx_fp)
1632 {
1633 	struct fc_lport *lport = rdata->local_port;
1634 	struct fc_frame *fp;
1635 	struct {
1636 		struct fc_els_prli prli;
1637 		struct fc_els_spp spp;
1638 	} *pp;
1639 	struct fc_els_spp *rspp;	/* request service param page */
1640 	struct fc_els_spp *spp;	/* response spp */
1641 	unsigned int len;
1642 	unsigned int plen;
1643 	enum fc_els_spp_resp resp;
1644 	struct fc_seq_els_data rjt_data;
1645 	u32 fcp_parm;
1646 	u32 roles = FC_RPORT_ROLE_UNKNOWN;
1647 
1648 	FC_RPORT_DBG(rdata, "Received PRLI request while in state %s\n",
1649 		     fc_rport_state(rdata));
1650 
1651 	len = fr_len(rx_fp) - sizeof(struct fc_frame_header);
1652 	pp = fc_frame_payload_get(rx_fp, sizeof(*pp));
1653 	if (!pp)
1654 		goto reject_len;
1655 	plen = ntohs(pp->prli.prli_len);
1656 	if ((plen % 4) != 0 || plen > len || plen < 16)
1657 		goto reject_len;
1658 	if (plen < len)
1659 		len = plen;
1660 	plen = pp->prli.prli_spp_len;
1661 	if ((plen % 4) != 0 || plen < sizeof(*spp) ||
1662 	    plen > len || len < sizeof(*pp) || plen < 12)
1663 		goto reject_len;
1664 	rspp = &pp->spp;
1665 
1666 	fp = fc_frame_alloc(lport, len);
1667 	if (!fp) {
1668 		rjt_data.reason = ELS_RJT_UNAB;
1669 		rjt_data.explan = ELS_EXPL_INSUF_RES;
1670 		goto reject;
1671 	}
1672 	pp = fc_frame_payload_get(fp, len);
1673 	WARN_ON(!pp);
1674 	memset(pp, 0, len);
1675 	pp->prli.prli_cmd = ELS_LS_ACC;
1676 	pp->prli.prli_spp_len = plen;
1677 	pp->prli.prli_len = htons(len);
1678 	len -= sizeof(struct fc_els_prli);
1679 
1680 	/* reinitialize remote port roles */
1681 	rdata->ids.roles = FC_RPORT_ROLE_UNKNOWN;
1682 
1683 	/*
1684 	 * Go through all the service parameter pages and build
1685 	 * response.  If plen indicates longer SPP than standard,
1686 	 * use that.  The entire response has been pre-cleared above.
1687 	 */
1688 	spp = &pp->spp;
1689 	while (len >= plen) {
1690 		spp->spp_type = rspp->spp_type;
1691 		spp->spp_type_ext = rspp->spp_type_ext;
1692 		spp->spp_flags = rspp->spp_flags & FC_SPP_EST_IMG_PAIR;
1693 		resp = FC_SPP_RESP_ACK;
1694 
1695 		switch (rspp->spp_type) {
1696 		case 0:	/* common to all FC-4 types */
1697 			break;
1698 		case FC_TYPE_FCP:
1699 			fcp_parm = ntohl(rspp->spp_params);
1700 			if (fcp_parm & FCP_SPPF_RETRY)
1701 				rdata->flags |= FC_RP_FLAGS_RETRY;
1702 			rdata->supported_classes = FC_COS_CLASS3;
1703 			if (fcp_parm & FCP_SPPF_INIT_FCN)
1704 				roles |= FC_RPORT_ROLE_FCP_INITIATOR;
1705 			if (fcp_parm & FCP_SPPF_TARG_FCN)
1706 				roles |= FC_RPORT_ROLE_FCP_TARGET;
1707 			rdata->ids.roles = roles;
1708 
1709 			spp->spp_params = htonl(lport->service_params);
1710 			break;
1711 		default:
1712 			resp = FC_SPP_RESP_INVL;
1713 			break;
1714 		}
1715 		spp->spp_flags |= resp;
1716 		len -= plen;
1717 		rspp = (struct fc_els_spp *)((char *)rspp + plen);
1718 		spp = (struct fc_els_spp *)((char *)spp + plen);
1719 	}
1720 
1721 	/*
1722 	 * Send LS_ACC.	 If this fails, the originator should retry.
1723 	 */
1724 	fc_fill_reply_hdr(fp, rx_fp, FC_RCTL_ELS_REP, 0);
1725 	lport->tt.frame_send(lport, fp);
1726 
1727 	switch (rdata->rp_state) {
1728 	case RPORT_ST_PRLI:
1729 		fc_rport_enter_ready(rdata);
1730 		break;
1731 	default:
1732 		break;
1733 	}
1734 	goto drop;
1735 
1736 reject_len:
1737 	rjt_data.reason = ELS_RJT_PROT;
1738 	rjt_data.explan = ELS_EXPL_INV_LEN;
1739 reject:
1740 	lport->tt.seq_els_rsp_send(rx_fp, ELS_LS_RJT, &rjt_data);
1741 drop:
1742 	fc_frame_free(rx_fp);
1743 }
1744 
1745 /**
1746  * fc_rport_recv_prlo_req() - Handler for process logout (PRLO) requests
1747  * @rdata: The remote port that sent the PRLO request
1748  * @rx_fp: The PRLO request frame
1749  *
1750  * Locking Note: The rport lock is exected to be held before calling
1751  * this function.
1752  */
1753 static void fc_rport_recv_prlo_req(struct fc_rport_priv *rdata,
1754 				   struct fc_frame *rx_fp)
1755 {
1756 	struct fc_lport *lport = rdata->local_port;
1757 	struct fc_frame *fp;
1758 	struct {
1759 		struct fc_els_prlo prlo;
1760 		struct fc_els_spp spp;
1761 	} *pp;
1762 	struct fc_els_spp *rspp;	/* request service param page */
1763 	struct fc_els_spp *spp;		/* response spp */
1764 	unsigned int len;
1765 	unsigned int plen;
1766 	struct fc_seq_els_data rjt_data;
1767 
1768 	FC_RPORT_DBG(rdata, "Received PRLO request while in state %s\n",
1769 		     fc_rport_state(rdata));
1770 
1771 	len = fr_len(rx_fp) - sizeof(struct fc_frame_header);
1772 	pp = fc_frame_payload_get(rx_fp, sizeof(*pp));
1773 	if (!pp)
1774 		goto reject_len;
1775 	plen = ntohs(pp->prlo.prlo_len);
1776 	if (plen != 20)
1777 		goto reject_len;
1778 	if (plen < len)
1779 		len = plen;
1780 
1781 	rspp = &pp->spp;
1782 
1783 	fp = fc_frame_alloc(lport, len);
1784 	if (!fp) {
1785 		rjt_data.reason = ELS_RJT_UNAB;
1786 		rjt_data.explan = ELS_EXPL_INSUF_RES;
1787 		goto reject;
1788 	}
1789 
1790 	pp = fc_frame_payload_get(fp, len);
1791 	WARN_ON(!pp);
1792 	memset(pp, 0, len);
1793 	pp->prlo.prlo_cmd = ELS_LS_ACC;
1794 	pp->prlo.prlo_obs = 0x10;
1795 	pp->prlo.prlo_len = htons(len);
1796 	spp = &pp->spp;
1797 	spp->spp_type = rspp->spp_type;
1798 	spp->spp_type_ext = rspp->spp_type_ext;
1799 	spp->spp_flags = FC_SPP_RESP_ACK;
1800 
1801 	fc_rport_enter_delete(rdata, RPORT_EV_LOGO);
1802 
1803 	fc_fill_reply_hdr(fp, rx_fp, FC_RCTL_ELS_REP, 0);
1804 	lport->tt.frame_send(lport, fp);
1805 	goto drop;
1806 
1807 reject_len:
1808 	rjt_data.reason = ELS_RJT_PROT;
1809 	rjt_data.explan = ELS_EXPL_INV_LEN;
1810 reject:
1811 	lport->tt.seq_els_rsp_send(rx_fp, ELS_LS_RJT, &rjt_data);
1812 drop:
1813 	fc_frame_free(rx_fp);
1814 }
1815 
1816 /**
1817  * fc_rport_recv_logo_req() - Handler for logout (LOGO) requests
1818  * @lport: The local port that received the LOGO request
1819  * @fp:	   The LOGO request frame
1820  *
1821  * Locking Note: The rport lock is exected to be held before calling
1822  * this function.
1823  */
1824 static void fc_rport_recv_logo_req(struct fc_lport *lport, struct fc_frame *fp)
1825 {
1826 	struct fc_rport_priv *rdata;
1827 	u32 sid;
1828 
1829 	lport->tt.seq_els_rsp_send(fp, ELS_LS_ACC, NULL);
1830 
1831 	sid = fc_frame_sid(fp);
1832 
1833 	mutex_lock(&lport->disc.disc_mutex);
1834 	rdata = lport->tt.rport_lookup(lport, sid);
1835 	if (rdata) {
1836 		mutex_lock(&rdata->rp_mutex);
1837 		FC_RPORT_DBG(rdata, "Received LOGO request while in state %s\n",
1838 			     fc_rport_state(rdata));
1839 
1840 		fc_rport_enter_delete(rdata, RPORT_EV_LOGO);
1841 		mutex_unlock(&rdata->rp_mutex);
1842 	} else
1843 		FC_RPORT_ID_DBG(lport, sid,
1844 				"Received LOGO from non-logged-in port\n");
1845 	mutex_unlock(&lport->disc.disc_mutex);
1846 	fc_frame_free(fp);
1847 }
1848 
1849 /**
1850  * fc_rport_flush_queue() - Flush the rport_event_queue
1851  */
1852 static void fc_rport_flush_queue(void)
1853 {
1854 	flush_workqueue(rport_event_queue);
1855 }
1856 
1857 /**
1858  * fc_rport_init() - Initialize the remote port layer for a local port
1859  * @lport: The local port to initialize the remote port layer for
1860  */
1861 int fc_rport_init(struct fc_lport *lport)
1862 {
1863 	if (!lport->tt.rport_lookup)
1864 		lport->tt.rport_lookup = fc_rport_lookup;
1865 
1866 	if (!lport->tt.rport_create)
1867 		lport->tt.rport_create = fc_rport_create;
1868 
1869 	if (!lport->tt.rport_login)
1870 		lport->tt.rport_login = fc_rport_login;
1871 
1872 	if (!lport->tt.rport_logoff)
1873 		lport->tt.rport_logoff = fc_rport_logoff;
1874 
1875 	if (!lport->tt.rport_recv_req)
1876 		lport->tt.rport_recv_req = fc_rport_recv_req;
1877 
1878 	if (!lport->tt.rport_flush_queue)
1879 		lport->tt.rport_flush_queue = fc_rport_flush_queue;
1880 
1881 	if (!lport->tt.rport_destroy)
1882 		lport->tt.rport_destroy = fc_rport_destroy;
1883 
1884 	return 0;
1885 }
1886 EXPORT_SYMBOL(fc_rport_init);
1887 
1888 /**
1889  * fc_setup_rport() - Initialize the rport_event_queue
1890  */
1891 int fc_setup_rport()
1892 {
1893 	rport_event_queue = create_singlethread_workqueue("fc_rport_eq");
1894 	if (!rport_event_queue)
1895 		return -ENOMEM;
1896 	return 0;
1897 }
1898 
1899 /**
1900  * fc_destroy_rport() - Destroy the rport_event_queue
1901  */
1902 void fc_destroy_rport()
1903 {
1904 	destroy_workqueue(rport_event_queue);
1905 }
1906 
1907 /**
1908  * fc_rport_terminate_io() - Stop all outstanding I/O on a remote port
1909  * @rport: The remote port whose I/O should be terminated
1910  */
1911 void fc_rport_terminate_io(struct fc_rport *rport)
1912 {
1913 	struct fc_rport_libfc_priv *rpriv = rport->dd_data;
1914 	struct fc_lport *lport = rpriv->local_port;
1915 
1916 	lport->tt.exch_mgr_reset(lport, 0, rport->port_id);
1917 	lport->tt.exch_mgr_reset(lport, rport->port_id, 0);
1918 }
1919 EXPORT_SYMBOL(fc_rport_terminate_io);
1920