Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
[pandora-kernel.git] / drivers / scsi / libfc / fc_rport.c
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;
200         else
201                 rport->dev_loss_tmo = 1;
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);