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