1 /* 2 * Copyright(c) 2007 Intel Corporation. All rights reserved. 3 * Copyright(c) 2008 Red Hat, Inc. All rights reserved. 4 * Copyright(c) 2008 Mike Christie 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms and conditions of the GNU General Public License, 8 * version 2, as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 * more details. 14 * 15 * You should have received a copy of the GNU General Public License along with 16 * this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Maintained at www.Open-FCoE.org 20 */ 21 22 /* 23 * Fibre Channel exchange and sequence handling. 24 */ 25 26 #include <linux/timer.h> 27 #include <linux/slab.h> 28 #include <linux/err.h> 29 30 #include <scsi/fc/fc_fc2.h> 31 32 #include <scsi/libfc.h> 33 #include <scsi/fc_encode.h> 34 35 #include "fc_libfc.h" 36 37 u16 fc_cpu_mask; /* cpu mask for possible cpus */ 38 EXPORT_SYMBOL(fc_cpu_mask); 39 static u16 fc_cpu_order; /* 2's power to represent total possible cpus */ 40 static struct kmem_cache *fc_em_cachep; /* cache for exchanges */ 41 static struct workqueue_struct *fc_exch_workqueue; 42 43 /* 44 * Structure and function definitions for managing Fibre Channel Exchanges 45 * and Sequences. 46 * 47 * The three primary structures used here are fc_exch_mgr, fc_exch, and fc_seq. 48 * 49 * fc_exch_mgr holds the exchange state for an N port 50 * 51 * fc_exch holds state for one exchange and links to its active sequence. 52 * 53 * fc_seq holds the state for an individual sequence. 54 */ 55 56 /** 57 * struct fc_exch_pool - Per cpu exchange pool 58 * @next_index: Next possible free exchange index 59 * @total_exches: Total allocated exchanges 60 * @lock: Exch pool lock 61 * @ex_list: List of exchanges 62 * 63 * This structure manages per cpu exchanges in array of exchange pointers. 64 * This array is allocated followed by struct fc_exch_pool memory for 65 * assigned range of exchanges to per cpu pool. 66 */ 67 struct fc_exch_pool { 68 u16 next_index; 69 u16 total_exches; 70 71 /* two cache of free slot in exch array */ 72 u16 left; 73 u16 right; 74 75 spinlock_t lock; 76 struct list_head ex_list; 77 }; 78 79 /** 80 * struct fc_exch_mgr - The Exchange Manager (EM). 81 * @class: Default class for new sequences 82 * @kref: Reference counter 83 * @min_xid: Minimum exchange ID 84 * @max_xid: Maximum exchange ID 85 * @ep_pool: Reserved exchange pointers 86 * @pool_max_index: Max exch array index in exch pool 87 * @pool: Per cpu exch pool 88 * @stats: Statistics structure 89 * 90 * This structure is the center for creating exchanges and sequences. 91 * It manages the allocation of exchange IDs. 92 */ 93 struct fc_exch_mgr { 94 enum fc_class class; 95 struct kref kref; 96 u16 min_xid; 97 u16 max_xid; 98 mempool_t *ep_pool; 99 u16 pool_max_index; 100 struct fc_exch_pool *pool; 101 102 /* 103 * currently exchange mgr stats are updated but not used. 104 * either stats can be expose via sysfs or remove them 105 * all together if not used XXX 106 */ 107 struct { 108 atomic_t no_free_exch; 109 atomic_t no_free_exch_xid; 110 atomic_t xid_not_found; 111 atomic_t xid_busy; 112 atomic_t seq_not_found; 113 atomic_t non_bls_resp; 114 } stats; 115 }; 116 117 /** 118 * struct fc_exch_mgr_anchor - primary structure for list of EMs 119 * @ema_list: Exchange Manager Anchor list 120 * @mp: Exchange Manager associated with this anchor 121 * @match: Routine to determine if this anchor's EM should be used 122 * 123 * When walking the list of anchors the match routine will be called 124 * for each anchor to determine if that EM should be used. The last 125 * anchor in the list will always match to handle any exchanges not 126 * handled by other EMs. The non-default EMs would be added to the 127 * anchor list by HW that provides FCoE offloads. 128 */ 129 struct fc_exch_mgr_anchor { 130 struct list_head ema_list; 131 struct fc_exch_mgr *mp; 132 bool (*match)(struct fc_frame *); 133 }; 134 135 static void fc_exch_rrq(struct fc_exch *); 136 static void fc_seq_ls_acc(struct fc_frame *); 137 static void fc_seq_ls_rjt(struct fc_frame *, enum fc_els_rjt_reason, 138 enum fc_els_rjt_explan); 139 static void fc_exch_els_rec(struct fc_frame *); 140 static void fc_exch_els_rrq(struct fc_frame *); 141 142 /* 143 * Internal implementation notes. 144 * 145 * The exchange manager is one by default in libfc but LLD may choose 146 * to have one per CPU. The sequence manager is one per exchange manager 147 * and currently never separated. 148 * 149 * Section 9.8 in FC-FS-2 specifies: "The SEQ_ID is a one-byte field 150 * assigned by the Sequence Initiator that shall be unique for a specific 151 * D_ID and S_ID pair while the Sequence is open." Note that it isn't 152 * qualified by exchange ID, which one might think it would be. 153 * In practice this limits the number of open sequences and exchanges to 256 154 * per session. For most targets we could treat this limit as per exchange. 155 * 156 * The exchange and its sequence are freed when the last sequence is received. 157 * It's possible for the remote port to leave an exchange open without 158 * sending any sequences. 159 * 160 * Notes on reference counts: 161 * 162 * Exchanges are reference counted and exchange gets freed when the reference 163 * count becomes zero. 164 * 165 * Timeouts: 166 * Sequences are timed out for E_D_TOV and R_A_TOV. 167 * 168 * Sequence event handling: 169 * 170 * The following events may occur on initiator sequences: 171 * 172 * Send. 173 * For now, the whole thing is sent. 174 * Receive ACK 175 * This applies only to class F. 176 * The sequence is marked complete. 177 * ULP completion. 178 * The upper layer calls fc_exch_done() when done 179 * with exchange and sequence tuple. 180 * RX-inferred completion. 181 * When we receive the next sequence on the same exchange, we can 182 * retire the previous sequence ID. (XXX not implemented). 183 * Timeout. 184 * R_A_TOV frees the sequence ID. If we're waiting for ACK, 185 * E_D_TOV causes abort and calls upper layer response handler 186 * with FC_EX_TIMEOUT error. 187 * Receive RJT 188 * XXX defer. 189 * Send ABTS 190 * On timeout. 191 * 192 * The following events may occur on recipient sequences: 193 * 194 * Receive 195 * Allocate sequence for first frame received. 196 * Hold during receive handler. 197 * Release when final frame received. 198 * Keep status of last N of these for the ELS RES command. XXX TBD. 199 * Receive ABTS 200 * Deallocate sequence 201 * Send RJT 202 * Deallocate 203 * 204 * For now, we neglect conditions where only part of a sequence was 205 * received or transmitted, or where out-of-order receipt is detected. 206 */ 207 208 /* 209 * Locking notes: 210 * 211 * The EM code run in a per-CPU worker thread. 212 * 213 * To protect against concurrency between a worker thread code and timers, 214 * sequence allocation and deallocation must be locked. 215 * - exchange refcnt can be done atomicly without locks. 216 * - sequence allocation must be locked by exch lock. 217 * - If the EM pool lock and ex_lock must be taken at the same time, then the 218 * EM pool lock must be taken before the ex_lock. 219 */ 220 221 /* 222 * opcode names for debugging. 223 */ 224 static char *fc_exch_rctl_names[] = FC_RCTL_NAMES_INIT; 225 226 /** 227 * fc_exch_name_lookup() - Lookup name by opcode 228 * @op: Opcode to be looked up 229 * @table: Opcode/name table 230 * @max_index: Index not to be exceeded 231 * 232 * This routine is used to determine a human-readable string identifying 233 * a R_CTL opcode. 234 */ 235 static inline const char *fc_exch_name_lookup(unsigned int op, char **table, 236 unsigned int max_index) 237 { 238 const char *name = NULL; 239 240 if (op < max_index) 241 name = table[op]; 242 if (!name) 243 name = "unknown"; 244 return name; 245 } 246 247 /** 248 * fc_exch_rctl_name() - Wrapper routine for fc_exch_name_lookup() 249 * @op: The opcode to be looked up 250 */ 251 static const char *fc_exch_rctl_name(unsigned int op) 252 { 253 return fc_exch_name_lookup(op, fc_exch_rctl_names, 254 ARRAY_SIZE(fc_exch_rctl_names)); 255 } 256 257 /** 258 * fc_exch_hold() - Increment an exchange's reference count 259 * @ep: Echange to be held 260 */ 261 static inline void fc_exch_hold(struct fc_exch *ep) 262 { 263 atomic_inc(&ep->ex_refcnt); 264 } 265 266 /** 267 * fc_exch_setup_hdr() - Initialize a FC header by initializing some fields 268 * and determine SOF and EOF. 269 * @ep: The exchange to that will use the header 270 * @fp: The frame whose header is to be modified 271 * @f_ctl: F_CTL bits that will be used for the frame header 272 * 273 * The fields initialized by this routine are: fh_ox_id, fh_rx_id, 274 * fh_seq_id, fh_seq_cnt and the SOF and EOF. 275 */ 276 static void fc_exch_setup_hdr(struct fc_exch *ep, struct fc_frame *fp, 277 u32 f_ctl) 278 { 279 struct fc_frame_header *fh = fc_frame_header_get(fp); 280 u16 fill; 281 282 fr_sof(fp) = ep->class; 283 if (ep->seq.cnt) 284 fr_sof(fp) = fc_sof_normal(ep->class); 285 286 if (f_ctl & FC_FC_END_SEQ) { 287 fr_eof(fp) = FC_EOF_T; 288 if (fc_sof_needs_ack(ep->class)) 289 fr_eof(fp) = FC_EOF_N; 290 /* 291 * From F_CTL. 292 * The number of fill bytes to make the length a 4-byte 293 * multiple is the low order 2-bits of the f_ctl. 294 * The fill itself will have been cleared by the frame 295 * allocation. 296 * After this, the length will be even, as expected by 297 * the transport. 298 */ 299 fill = fr_len(fp) & 3; 300 if (fill) { 301 fill = 4 - fill; 302 /* TODO, this may be a problem with fragmented skb */ 303 skb_put(fp_skb(fp), fill); 304 hton24(fh->fh_f_ctl, f_ctl | fill); 305 } 306 } else { 307 WARN_ON(fr_len(fp) % 4 != 0); /* no pad to non last frame */ 308 fr_eof(fp) = FC_EOF_N; 309 } 310 311 /* 312 * Initialize remainig fh fields 313 * from fc_fill_fc_hdr 314 */ 315 fh->fh_ox_id = htons(ep->oxid); 316 fh->fh_rx_id = htons(ep->rxid); 317 fh->fh_seq_id = ep->seq.id; 318 fh->fh_seq_cnt = htons(ep->seq.cnt); 319 } 320 321 /** 322 * fc_exch_release() - Decrement an exchange's reference count 323 * @ep: Exchange to be released 324 * 325 * If the reference count reaches zero and the exchange is complete, 326 * it is freed. 327 */ 328 static void fc_exch_release(struct fc_exch *ep) 329 { 330 struct fc_exch_mgr *mp; 331 332 if (atomic_dec_and_test(&ep->ex_refcnt)) { 333 mp = ep->em; 334 if (ep->destructor) 335 ep->destructor(&ep->seq, ep->arg); 336 WARN_ON(!(ep->esb_stat & ESB_ST_COMPLETE)); 337 mempool_free(ep, mp->ep_pool); 338 } 339 } 340 341 /** 342 * fc_exch_done_locked() - Complete an exchange with the exchange lock held 343 * @ep: The exchange that is complete 344 */ 345 static int fc_exch_done_locked(struct fc_exch *ep) 346 { 347 int rc = 1; 348 349 /* 350 * We must check for completion in case there are two threads 351 * tyring to complete this. But the rrq code will reuse the 352 * ep, and in that case we only clear the resp and set it as 353 * complete, so it can be reused by the timer to send the rrq. 354 */ 355 ep->resp = NULL; 356 if (ep->state & FC_EX_DONE) 357 return rc; 358 ep->esb_stat |= ESB_ST_COMPLETE; 359 360 if (!(ep->esb_stat & ESB_ST_REC_QUAL)) { 361 ep->state |= FC_EX_DONE; 362 if (cancel_delayed_work(&ep->timeout_work)) 363 atomic_dec(&ep->ex_refcnt); /* drop hold for timer */ 364 rc = 0; 365 } 366 return rc; 367 } 368 369 /** 370 * fc_exch_ptr_get() - Return an exchange from an exchange pool 371 * @pool: Exchange Pool to get an exchange from 372 * @index: Index of the exchange within the pool 373 * 374 * Use the index to get an exchange from within an exchange pool. exches 375 * will point to an array of exchange pointers. The index will select 376 * the exchange within the array. 377 */ 378 static inline struct fc_exch *fc_exch_ptr_get(struct fc_exch_pool *pool, 379 u16 index) 380 { 381 struct fc_exch **exches = (struct fc_exch **)(pool + 1); 382 return exches[index]; 383 } 384 385 /** 386 * fc_exch_ptr_set() - Assign an exchange to a slot in an exchange pool 387 * @pool: The pool to assign the exchange to 388 * @index: The index in the pool where the exchange will be assigned 389 * @ep: The exchange to assign to the pool 390 */ 391 static inline void fc_exch_ptr_set(struct fc_exch_pool *pool, u16 index, 392 struct fc_exch *ep) 393 { 394 ((struct fc_exch **)(pool + 1))[index] = ep; 395 } 396 397 /** 398 * fc_exch_delete() - Delete an exchange 399 * @ep: The exchange to be deleted 400 */ 401 static void fc_exch_delete(struct fc_exch *ep) 402 { 403 struct fc_exch_pool *pool; 404 u16 index; 405 406 pool = ep->pool; 407 spin_lock_bh(&pool->lock); 408 WARN_ON(pool->total_exches <= 0); 409 pool->total_exches--; 410 411 /* update cache of free slot */ 412 index = (ep->xid - ep->em->min_xid) >> fc_cpu_order; 413 if (pool->left == FC_XID_UNKNOWN) 414 pool->left = index; 415 else if (pool->right == FC_XID_UNKNOWN) 416 pool->right = index; 417 else 418 pool->next_index = index; 419 420 fc_exch_ptr_set(pool, index, NULL); 421 list_del(&ep->ex_list); 422 spin_unlock_bh(&pool->lock); 423 fc_exch_release(ep); /* drop hold for exch in mp */ 424 } 425 426 /** 427 * fc_exch_timer_set_locked() - Start a timer for an exchange w/ the 428 * the exchange lock held 429 * @ep: The exchange whose timer will start 430 * @timer_msec: The timeout period 431 * 432 * Used for upper level protocols to time out the exchange. 433 * The timer is cancelled when it fires or when the exchange completes. 434 */ 435 static inline void fc_exch_timer_set_locked(struct fc_exch *ep, 436 unsigned int timer_msec) 437 { 438 if (ep->state & (FC_EX_RST_CLEANUP | FC_EX_DONE)) 439 return; 440 441 FC_EXCH_DBG(ep, "Exchange timer armed\n"); 442 443 if (queue_delayed_work(fc_exch_workqueue, &ep->timeout_work, 444 msecs_to_jiffies(timer_msec))) 445 fc_exch_hold(ep); /* hold for timer */ 446 } 447 448 /** 449 * fc_exch_timer_set() - Lock the exchange and set the timer 450 * @ep: The exchange whose timer will start 451 * @timer_msec: The timeout period 452 */ 453 static void fc_exch_timer_set(struct fc_exch *ep, unsigned int timer_msec) 454 { 455 spin_lock_bh(&ep->ex_lock); 456 fc_exch_timer_set_locked(ep, timer_msec); 457 spin_unlock_bh(&ep->ex_lock); 458 } 459 460 /** 461 * fc_seq_send() - Send a frame using existing sequence/exchange pair 462 * @lport: The local port that the exchange will be sent on 463 * @sp: The sequence to be sent 464 * @fp: The frame to be sent on the exchange 465 */ 466 static int fc_seq_send(struct fc_lport *lport, struct fc_seq *sp, 467 struct fc_frame *fp) 468 { 469 struct fc_exch *ep; 470 struct fc_frame_header *fh = fc_frame_header_get(fp); 471 int error; 472 u32 f_ctl; 473 474 ep = fc_seq_exch(sp); 475 WARN_ON((ep->esb_stat & ESB_ST_SEQ_INIT) != ESB_ST_SEQ_INIT); 476 477 f_ctl = ntoh24(fh->fh_f_ctl); 478 fc_exch_setup_hdr(ep, fp, f_ctl); 479 fr_encaps(fp) = ep->encaps; 480 481 /* 482 * update sequence count if this frame is carrying 483 * multiple FC frames when sequence offload is enabled 484 * by LLD. 485 */ 486 if (fr_max_payload(fp)) 487 sp->cnt += DIV_ROUND_UP((fr_len(fp) - sizeof(*fh)), 488 fr_max_payload(fp)); 489 else 490 sp->cnt++; 491 492 /* 493 * Send the frame. 494 */ 495 error = lport->tt.frame_send(lport, fp); 496 497 /* 498 * Update the exchange and sequence flags, 499 * assuming all frames for the sequence have been sent. 500 * We can only be called to send once for each sequence. 501 */ 502 spin_lock_bh(&ep->ex_lock); 503 ep->f_ctl = f_ctl & ~FC_FC_FIRST_SEQ; /* not first seq */ 504 if (f_ctl & FC_FC_SEQ_INIT) 505 ep->esb_stat &= ~ESB_ST_SEQ_INIT; 506 spin_unlock_bh(&ep->ex_lock); 507 return error; 508 } 509 510 /** 511 * fc_seq_alloc() - Allocate a sequence for a given exchange 512 * @ep: The exchange to allocate a new sequence for 513 * @seq_id: The sequence ID to be used 514 * 515 * We don't support multiple originated sequences on the same exchange. 516 * By implication, any previously originated sequence on this exchange 517 * is complete, and we reallocate the same sequence. 518 */ 519 static struct fc_seq *fc_seq_alloc(struct fc_exch *ep, u8 seq_id) 520 { 521 struct fc_seq *sp; 522 523 sp = &ep->seq; 524 sp->ssb_stat = 0; 525 sp->cnt = 0; 526 sp->id = seq_id; 527 return sp; 528 } 529 530 /** 531 * fc_seq_start_next_locked() - Allocate a new sequence on the same 532 * exchange as the supplied sequence 533 * @sp: The sequence/exchange to get a new sequence for 534 */ 535 static struct fc_seq *fc_seq_start_next_locked(struct fc_seq *sp) 536 { 537 struct fc_exch *ep = fc_seq_exch(sp); 538 539 sp = fc_seq_alloc(ep, ep->seq_id++); 540 FC_EXCH_DBG(ep, "f_ctl %6x seq %2x\n", 541 ep->f_ctl, sp->id); 542 return sp; 543 } 544 545 /** 546 * fc_seq_start_next() - Lock the exchange and get a new sequence 547 * for a given sequence/exchange pair 548 * @sp: The sequence/exchange to get a new exchange for 549 */ 550 static struct fc_seq *fc_seq_start_next(struct fc_seq *sp) 551 { 552 struct fc_exch *ep = fc_seq_exch(sp); 553 554 spin_lock_bh(&ep->ex_lock); 555 sp = fc_seq_start_next_locked(sp); 556 spin_unlock_bh(&ep->ex_lock); 557 558 return sp; 559 } 560 561 /* 562 * Set the response handler for the exchange associated with a sequence. 563 */ 564 static void fc_seq_set_resp(struct fc_seq *sp, 565 void (*resp)(struct fc_seq *, struct fc_frame *, 566 void *), 567 void *arg) 568 { 569 struct fc_exch *ep = fc_seq_exch(sp); 570 571 spin_lock_bh(&ep->ex_lock); 572 ep->resp = resp; 573 ep->arg = arg; 574 spin_unlock_bh(&ep->ex_lock); 575 } 576 577 /** 578 * fc_seq_exch_abort() - Abort an exchange and sequence 579 * @req_sp: The sequence to be aborted 580 * @timer_msec: The period of time to wait before aborting 581 * 582 * Generally called because of a timeout or an abort from the upper layer. 583 */ 584 static int fc_seq_exch_abort(const struct fc_seq *req_sp, 585 unsigned int timer_msec) 586 { 587 struct fc_seq *sp; 588 struct fc_exch *ep; 589 struct fc_frame *fp; 590 int error; 591 592 ep = fc_seq_exch(req_sp); 593 594 spin_lock_bh(&ep->ex_lock); 595 if (ep->esb_stat & (ESB_ST_COMPLETE | ESB_ST_ABNORMAL) || 596 ep->state & (FC_EX_DONE | FC_EX_RST_CLEANUP)) { 597 spin_unlock_bh(&ep->ex_lock); 598 return -ENXIO; 599 } 600 601 /* 602 * Send the abort on a new sequence if possible. 603 */ 604 sp = fc_seq_start_next_locked(&ep->seq); 605 if (!sp) { 606 spin_unlock_bh(&ep->ex_lock); 607 return -ENOMEM; 608 } 609 610 ep->esb_stat |= ESB_ST_SEQ_INIT | ESB_ST_ABNORMAL; 611 if (timer_msec) 612 fc_exch_timer_set_locked(ep, timer_msec); 613 spin_unlock_bh(&ep->ex_lock); 614 615 /* 616 * If not logged into the fabric, don't send ABTS but leave 617 * sequence active until next timeout. 618 */ 619 if (!ep->sid) 620 return 0; 621 622 /* 623 * Send an abort for the sequence that timed out. 624 */ 625 fp = fc_frame_alloc(ep->lp, 0); 626 if (fp) { 627 fc_fill_fc_hdr(fp, FC_RCTL_BA_ABTS, ep->did, ep->sid, 628 FC_TYPE_BLS, FC_FC_END_SEQ | FC_FC_SEQ_INIT, 0); 629 error = fc_seq_send(ep->lp, sp, fp); 630 } else 631 error = -ENOBUFS; 632 return error; 633 } 634 635 /** 636 * fc_exch_timeout() - Handle exchange timer expiration 637 * @work: The work_struct identifying the exchange that timed out 638 */ 639 static void fc_exch_timeout(struct work_struct *work) 640 { 641 struct fc_exch *ep = container_of(work, struct fc_exch, 642 timeout_work.work); 643 struct fc_seq *sp = &ep->seq; 644 void (*resp)(struct fc_seq *, struct fc_frame *fp, void *arg); 645 void *arg; 646 u32 e_stat; 647 int rc = 1; 648 649 FC_EXCH_DBG(ep, "Exchange timed out\n"); 650 651 spin_lock_bh(&ep->ex_lock); 652 if (ep->state & (FC_EX_RST_CLEANUP | FC_EX_DONE)) 653 goto unlock; 654 655 e_stat = ep->esb_stat; 656 if (e_stat & ESB_ST_COMPLETE) { 657 ep->esb_stat = e_stat & ~ESB_ST_REC_QUAL; 658 spin_unlock_bh(&ep->ex_lock); 659 if (e_stat & ESB_ST_REC_QUAL) 660 fc_exch_rrq(ep); 661 goto done; 662 } else { 663 resp = ep->resp; 664 arg = ep->arg; 665 ep->resp = NULL; 666 if (e_stat & ESB_ST_ABNORMAL) 667 rc = fc_exch_done_locked(ep); 668 spin_unlock_bh(&ep->ex_lock); 669 if (!rc) 670 fc_exch_delete(ep); 671 if (resp) 672 resp(sp, ERR_PTR(-FC_EX_TIMEOUT), arg); 673 fc_seq_exch_abort(sp, 2 * ep->r_a_tov); 674 goto done; 675 } 676 unlock: 677 spin_unlock_bh(&ep->ex_lock); 678 done: 679 /* 680 * This release matches the hold taken when the timer was set. 681 */ 682 fc_exch_release(ep); 683 } 684 685 /** 686 * fc_exch_em_alloc() - Allocate an exchange from a specified EM. 687 * @lport: The local port that the exchange is for 688 * @mp: The exchange manager that will allocate the exchange 689 * 690 * Returns pointer to allocated fc_exch with exch lock held. 691 */ 692 static struct fc_exch *fc_exch_em_alloc(struct fc_lport *lport, 693 struct fc_exch_mgr *mp) 694 { 695 struct fc_exch *ep; 696 unsigned int cpu; 697 u16 index; 698 struct fc_exch_pool *pool; 699 700 /* allocate memory for exchange */ 701 ep = mempool_alloc(mp->ep_pool, GFP_ATOMIC); 702 if (!ep) { 703 atomic_inc(&mp->stats.no_free_exch); 704 goto out; 705 } 706 memset(ep, 0, sizeof(*ep)); 707 708 cpu = get_cpu(); 709 pool = per_cpu_ptr(mp->pool, cpu); 710 spin_lock_bh(&pool->lock); 711 put_cpu(); 712 713 /* peek cache of free slot */ 714 if (pool->left != FC_XID_UNKNOWN) { 715 index = pool->left; 716 pool->left = FC_XID_UNKNOWN; 717 goto hit; 718 } 719 if (pool->right != FC_XID_UNKNOWN) { 720 index = pool->right; 721 pool->right = FC_XID_UNKNOWN; 722 goto hit; 723 } 724 725 index = pool->next_index; 726 /* allocate new exch from pool */ 727 while (fc_exch_ptr_get(pool, index)) { 728 index = index == mp->pool_max_index ? 0 : index + 1; 729 if (index == pool->next_index) 730 goto err; 731 } 732 pool->next_index = index == mp->pool_max_index ? 0 : index + 1; 733 hit: 734 fc_exch_hold(ep); /* hold for exch in mp */ 735 spin_lock_init(&ep->ex_lock); 736 /* 737 * Hold exch lock for caller to prevent fc_exch_reset() 738 * from releasing exch while fc_exch_alloc() caller is 739 * still working on exch. 740 */ 741 spin_lock_bh(&ep->ex_lock); 742 743 fc_exch_ptr_set(pool, index, ep); 744 list_add_tail(&ep->ex_list, &pool->ex_list); 745 fc_seq_alloc(ep, ep->seq_id++); 746 pool->total_exches++; 747 spin_unlock_bh(&pool->lock); 748 749 /* 750 * update exchange 751 */ 752 ep->oxid = ep->xid = (index << fc_cpu_order | cpu) + mp->min_xid; 753 ep->em = mp; 754 ep->pool = pool; 755 ep->lp = lport; 756 ep->f_ctl = FC_FC_FIRST_SEQ; /* next seq is first seq */ 757 ep->rxid = FC_XID_UNKNOWN; 758 ep->class = mp->class; 759 INIT_DELAYED_WORK(&ep->timeout_work, fc_exch_timeout); 760 out: 761 return ep; 762 err: 763 spin_unlock_bh(&pool->lock); 764 atomic_inc(&mp->stats.no_free_exch_xid); 765 mempool_free(ep, mp->ep_pool); 766 return NULL; 767 } 768 769 /** 770 * fc_exch_alloc() - Allocate an exchange from an EM on a 771 * local port's list of EMs. 772 * @lport: The local port that will own the exchange 773 * @fp: The FC frame that the exchange will be for 774 * 775 * This function walks the list of exchange manager(EM) 776 * anchors to select an EM for a new exchange allocation. The 777 * EM is selected when a NULL match function pointer is encountered 778 * or when a call to a match function returns true. 779 */ 780 static inline struct fc_exch *fc_exch_alloc(struct fc_lport *lport, 781 struct fc_frame *fp) 782 { 783 struct fc_exch_mgr_anchor *ema; 784 785 list_for_each_entry(ema, &lport->ema_list, ema_list) 786 if (!ema->match || ema->match(fp)) 787 return fc_exch_em_alloc(lport, ema->mp); 788 return NULL; 789 } 790 791 /** 792 * fc_exch_find() - Lookup and hold an exchange 793 * @mp: The exchange manager to lookup the exchange from 794 * @xid: The XID of the exchange to look up 795 */ 796 static struct fc_exch *fc_exch_find(struct fc_exch_mgr *mp, u16 xid) 797 { 798 struct fc_exch_pool *pool; 799 struct fc_exch *ep = NULL; 800 801 if ((xid >= mp->min_xid) && (xid <= mp->max_xid)) { 802 pool = per_cpu_ptr(mp->pool, xid & fc_cpu_mask); 803 spin_lock_bh(&pool->lock); 804 ep = fc_exch_ptr_get(pool, (xid - mp->min_xid) >> fc_cpu_order); 805 if (ep) { 806 fc_exch_hold(ep); 807 WARN_ON(ep->xid != xid); 808 } 809 spin_unlock_bh(&pool->lock); 810 } 811 return ep; 812 } 813 814 815 /** 816 * fc_exch_done() - Indicate that an exchange/sequence tuple is complete and 817 * the memory allocated for the related objects may be freed. 818 * @sp: The sequence that has completed 819 */ 820 static void fc_exch_done(struct fc_seq *sp) 821 { 822 struct fc_exch *ep = fc_seq_exch(sp); 823 int rc; 824 825 spin_lock_bh(&ep->ex_lock); 826 rc = fc_exch_done_locked(ep); 827 spin_unlock_bh(&ep->ex_lock); 828 if (!rc) 829 fc_exch_delete(ep); 830 } 831 832 /** 833 * fc_exch_resp() - Allocate a new exchange for a response frame 834 * @lport: The local port that the exchange was for 835 * @mp: The exchange manager to allocate the exchange from 836 * @fp: The response frame 837 * 838 * Sets the responder ID in the frame header. 839 */ 840 static struct fc_exch *fc_exch_resp(struct fc_lport *lport, 841 struct fc_exch_mgr *mp, 842 struct fc_frame *fp) 843 { 844 struct fc_exch *ep; 845 struct fc_frame_header *fh; 846 847 ep = fc_exch_alloc(lport, fp); 848 if (ep) { 849 ep->class = fc_frame_class(fp); 850 851 /* 852 * Set EX_CTX indicating we're responding on this exchange. 853 */ 854 ep->f_ctl |= FC_FC_EX_CTX; /* we're responding */ 855 ep->f_ctl &= ~FC_FC_FIRST_SEQ; /* not new */ 856 fh = fc_frame_header_get(fp); 857 ep->sid = ntoh24(fh->fh_d_id); 858 ep->did = ntoh24(fh->fh_s_id); 859 ep->oid = ep->did; 860 861 /* 862 * Allocated exchange has placed the XID in the 863 * originator field. Move it to the responder field, 864 * and set the originator XID from the frame. 865 */ 866 ep->rxid = ep->xid; 867 ep->oxid = ntohs(fh->fh_ox_id); 868 ep->esb_stat |= ESB_ST_RESP | ESB_ST_SEQ_INIT; 869 if ((ntoh24(fh->fh_f_ctl) & FC_FC_SEQ_INIT) == 0) 870 ep->esb_stat &= ~ESB_ST_SEQ_INIT; 871 872 fc_exch_hold(ep); /* hold for caller */ 873 spin_unlock_bh(&ep->ex_lock); /* lock from fc_exch_alloc */ 874 } 875 return ep; 876 } 877 878 /** 879 * fc_seq_lookup_recip() - Find a sequence where the other end 880 * originated the sequence 881 * @lport: The local port that the frame was sent to 882 * @mp: The Exchange Manager to lookup the exchange from 883 * @fp: The frame associated with the sequence we're looking for 884 * 885 * If fc_pf_rjt_reason is FC_RJT_NONE then this function will have a hold 886 * on the ep that should be released by the caller. 887 */ 888 static enum fc_pf_rjt_reason fc_seq_lookup_recip(struct fc_lport *lport, 889 struct fc_exch_mgr *mp, 890 struct fc_frame *fp) 891 { 892 struct fc_frame_header *fh = fc_frame_header_get(fp); 893 struct fc_exch *ep = NULL; 894 struct fc_seq *sp = NULL; 895 enum fc_pf_rjt_reason reject = FC_RJT_NONE; 896 u32 f_ctl; 897 u16 xid; 898 899 f_ctl = ntoh24(fh->fh_f_ctl); 900 WARN_ON((f_ctl & FC_FC_SEQ_CTX) != 0); 901 902 /* 903 * Lookup or create the exchange if we will be creating the sequence. 904 */ 905 if (f_ctl & FC_FC_EX_CTX) { 906 xid = ntohs(fh->fh_ox_id); /* we originated exch */ 907 ep = fc_exch_find(mp, xid); 908 if (!ep) { 909 atomic_inc(&mp->stats.xid_not_found); 910 reject = FC_RJT_OX_ID; 911 goto out; 912 } 913 if (ep->rxid == FC_XID_UNKNOWN) 914 ep->rxid = ntohs(fh->fh_rx_id); 915 else if (ep->rxid != ntohs(fh->fh_rx_id)) { 916 reject = FC_RJT_OX_ID; 917 goto rel; 918 } 919 } else { 920 xid = ntohs(fh->fh_rx_id); /* we are the responder */ 921 922 /* 923 * Special case for MDS issuing an ELS TEST with a 924 * bad rxid of 0. 925 * XXX take this out once we do the proper reject. 926 */ 927 if (xid == 0 && fh->fh_r_ctl == FC_RCTL_ELS_REQ && 928 fc_frame_payload_op(fp) == ELS_TEST) { 929 fh->fh_rx_id = htons(FC_XID_UNKNOWN); 930 xid = FC_XID_UNKNOWN; 931 } 932 933 /* 934 * new sequence - find the exchange 935 */ 936 ep = fc_exch_find(mp, xid); 937 if ((f_ctl & FC_FC_FIRST_SEQ) && fc_sof_is_init(fr_sof(fp))) { 938 if (ep) { 939 atomic_inc(&mp->stats.xid_busy); 940 reject = FC_RJT_RX_ID; 941 goto rel; 942 } 943 ep = fc_exch_resp(lport, mp, fp); 944 if (!ep) { 945 reject = FC_RJT_EXCH_EST; /* XXX */ 946 goto out; 947 } 948 xid = ep->xid; /* get our XID */ 949 } else if (!ep) { 950 atomic_inc(&mp->stats.xid_not_found); 951 reject = FC_RJT_RX_ID; /* XID not found */ 952 goto out; 953 } 954 } 955 956 /* 957 * At this point, we have the exchange held. 958 * Find or create the sequence. 959 */ 960 if (fc_sof_is_init(fr_sof(fp))) { 961 sp = &ep->seq; 962 sp->ssb_stat |= SSB_ST_RESP; 963 sp->id = fh->fh_seq_id; 964 } else { 965 sp = &ep->seq; 966 if (sp->id != fh->fh_seq_id) { 967 atomic_inc(&mp->stats.seq_not_found); 968 reject = FC_RJT_SEQ_ID; /* sequence/exch should exist */ 969 goto rel; 970 } 971 } 972 WARN_ON(ep != fc_seq_exch(sp)); 973 974 if (f_ctl & FC_FC_SEQ_INIT) 975 ep->esb_stat |= ESB_ST_SEQ_INIT; 976 977 fr_seq(fp) = sp; 978 out: 979 return reject; 980 rel: 981 fc_exch_done(&ep->seq); 982 fc_exch_release(ep); /* hold from fc_exch_find/fc_exch_resp */ 983 return reject; 984 } 985 986 /** 987 * fc_seq_lookup_orig() - Find a sequence where this end 988 * originated the sequence 989 * @mp: The Exchange Manager to lookup the exchange from 990 * @fp: The frame associated with the sequence we're looking for 991 * 992 * Does not hold the sequence for the caller. 993 */ 994 static struct fc_seq *fc_seq_lookup_orig(struct fc_exch_mgr *mp, 995 struct fc_frame *fp) 996 { 997 struct fc_frame_header *fh = fc_frame_header_get(fp); 998 struct fc_exch *ep; 999 struct fc_seq *sp = NULL; 1000 u32 f_ctl; 1001 u16 xid; 1002 1003 f_ctl = ntoh24(fh->fh_f_ctl); 1004 WARN_ON((f_ctl & FC_FC_SEQ_CTX) != FC_FC_SEQ_CTX); 1005 xid = ntohs((f_ctl & FC_FC_EX_CTX) ? fh->fh_ox_id : fh->fh_rx_id); 1006 ep = fc_exch_find(mp, xid); 1007 if (!ep) 1008 return NULL; 1009 if (ep->seq.id == fh->fh_seq_id) { 1010 /* 1011 * Save the RX_ID if we didn't previously know it. 1012 */ 1013 sp = &ep->seq; 1014 if ((f_ctl & FC_FC_EX_CTX) != 0 && 1015 ep->rxid == FC_XID_UNKNOWN) { 1016 ep->rxid = ntohs(fh->fh_rx_id); 1017 } 1018 } 1019 fc_exch_release(ep); 1020 return sp; 1021 } 1022 1023 /** 1024 * fc_exch_set_addr() - Set the source and destination IDs for an exchange 1025 * @ep: The exchange to set the addresses for 1026 * @orig_id: The originator's ID 1027 * @resp_id: The responder's ID 1028 * 1029 * Note this must be done before the first sequence of the exchange is sent. 1030 */ 1031 static void fc_exch_set_addr(struct fc_exch *ep, 1032 u32 orig_id, u32 resp_id) 1033 { 1034 ep->oid = orig_id; 1035 if (ep->esb_stat & ESB_ST_RESP) { 1036 ep->sid = resp_id; 1037 ep->did = orig_id; 1038 } else { 1039 ep->sid = orig_id; 1040 ep->did = resp_id; 1041 } 1042 } 1043 1044 /** 1045 * fc_seq_els_rsp_send() - Send an ELS response using information from 1046 * the existing sequence/exchange. 1047 * @fp: The received frame 1048 * @els_cmd: The ELS command to be sent 1049 * @els_data: The ELS data to be sent 1050 * 1051 * The received frame is not freed. 1052 */ 1053 static void fc_seq_els_rsp_send(struct fc_frame *fp, enum fc_els_cmd els_cmd, 1054 struct fc_seq_els_data *els_data) 1055 { 1056 switch (els_cmd) { 1057 case ELS_LS_RJT: 1058 fc_seq_ls_rjt(fp, els_data->reason, els_data->explan); 1059 break; 1060 case ELS_LS_ACC: 1061 fc_seq_ls_acc(fp); 1062 break; 1063 case ELS_RRQ: 1064 fc_exch_els_rrq(fp); 1065 break; 1066 case ELS_REC: 1067 fc_exch_els_rec(fp); 1068 break; 1069 default: 1070 FC_LPORT_DBG(fr_dev(fp), "Invalid ELS CMD:%x\n", els_cmd); 1071 } 1072 } 1073 1074 /** 1075 * fc_seq_send_last() - Send a sequence that is the last in the exchange 1076 * @sp: The sequence that is to be sent 1077 * @fp: The frame that will be sent on the sequence 1078 * @rctl: The R_CTL information to be sent 1079 * @fh_type: The frame header type 1080 */ 1081 static void fc_seq_send_last(struct fc_seq *sp, struct fc_frame *fp, 1082 enum fc_rctl rctl, enum fc_fh_type fh_type) 1083 { 1084 u32 f_ctl; 1085 struct fc_exch *ep = fc_seq_exch(sp); 1086 1087 f_ctl = FC_FC_LAST_SEQ | FC_FC_END_SEQ | FC_FC_SEQ_INIT; 1088 f_ctl |= ep->f_ctl; 1089 fc_fill_fc_hdr(fp, rctl, ep->did, ep->sid, fh_type, f_ctl, 0); 1090 fc_seq_send(ep->lp, sp, fp); 1091 } 1092 1093 /** 1094 * fc_seq_send_ack() - Send an acknowledgement that we've received a frame 1095 * @sp: The sequence to send the ACK on 1096 * @rx_fp: The received frame that is being acknoledged 1097 * 1098 * Send ACK_1 (or equiv.) indicating we received something. 1099 */ 1100 static void fc_seq_send_ack(struct fc_seq *sp, const struct fc_frame *rx_fp) 1101 { 1102 struct fc_frame *fp; 1103 struct fc_frame_header *rx_fh; 1104 struct fc_frame_header *fh; 1105 struct fc_exch *ep = fc_seq_exch(sp); 1106 struct fc_lport *lport = ep->lp; 1107 unsigned int f_ctl; 1108 1109 /* 1110 * Don't send ACKs for class 3. 1111 */ 1112 if (fc_sof_needs_ack(fr_sof(rx_fp))) { 1113 fp = fc_frame_alloc(lport, 0); 1114 if (!fp) 1115 return; 1116 1117 fh = fc_frame_header_get(fp); 1118 fh->fh_r_ctl = FC_RCTL_ACK_1; 1119 fh->fh_type = FC_TYPE_BLS; 1120 1121 /* 1122 * Form f_ctl by inverting EX_CTX and SEQ_CTX (bits 23, 22). 1123 * Echo FIRST_SEQ, LAST_SEQ, END_SEQ, END_CONN, SEQ_INIT. 1124 * Bits 9-8 are meaningful (retransmitted or unidirectional). 1125 * Last ACK uses bits 7-6 (continue sequence), 1126 * bits 5-4 are meaningful (what kind of ACK to use). 1127 */ 1128 rx_fh = fc_frame_header_get(rx_fp); 1129 f_ctl = ntoh24(rx_fh->fh_f_ctl); 1130 f_ctl &= FC_FC_EX_CTX | FC_FC_SEQ_CTX | 1131 FC_FC_FIRST_SEQ | FC_FC_LAST_SEQ | 1132 FC_FC_END_SEQ | FC_FC_END_CONN | FC_FC_SEQ_INIT | 1133 FC_FC_RETX_SEQ | FC_FC_UNI_TX; 1134 f_ctl ^= FC_FC_EX_CTX | FC_FC_SEQ_CTX; 1135 hton24(fh->fh_f_ctl, f_ctl); 1136 1137 fc_exch_setup_hdr(ep, fp, f_ctl); 1138 fh->fh_seq_id = rx_fh->fh_seq_id; 1139 fh->fh_seq_cnt = rx_fh->fh_seq_cnt; 1140 fh->fh_parm_offset = htonl(1); /* ack single frame */ 1141 1142 fr_sof(fp) = fr_sof(rx_fp); 1143 if (f_ctl & FC_FC_END_SEQ) 1144 fr_eof(fp) = FC_EOF_T; 1145 else 1146 fr_eof(fp) = FC_EOF_N; 1147 1148 lport->tt.frame_send(lport, fp); 1149 } 1150 } 1151 1152 /** 1153 * fc_exch_send_ba_rjt() - Send BLS Reject 1154 * @rx_fp: The frame being rejected 1155 * @reason: The reason the frame is being rejected 1156 * @explan: The explanation for the rejection 1157 * 1158 * This is for rejecting BA_ABTS only. 1159 */ 1160 static void fc_exch_send_ba_rjt(struct fc_frame *rx_fp, 1161 enum fc_ba_rjt_reason reason, 1162 enum fc_ba_rjt_explan explan) 1163 { 1164 struct fc_frame *fp; 1165 struct fc_frame_header *rx_fh; 1166 struct fc_frame_header *fh; 1167 struct fc_ba_rjt *rp; 1168 struct fc_lport *lport; 1169 unsigned int f_ctl; 1170 1171 lport = fr_dev(rx_fp); 1172 fp = fc_frame_alloc(lport, sizeof(*rp)); 1173 if (!fp) 1174 return; 1175 fh = fc_frame_header_get(fp); 1176 rx_fh = fc_frame_header_get(rx_fp); 1177 1178 memset(fh, 0, sizeof(*fh) + sizeof(*rp)); 1179 1180 rp = fc_frame_payload_get(fp, sizeof(*rp)); 1181 rp->br_reason = reason; 1182 rp->br_explan = explan; 1183 1184 /* 1185 * seq_id, cs_ctl, df_ctl and param/offset are zero. 1186 */ 1187 memcpy(fh->fh_s_id, rx_fh->fh_d_id, 3); 1188 memcpy(fh->fh_d_id, rx_fh->fh_s_id, 3); 1189 fh->fh_ox_id = rx_fh->fh_ox_id; 1190 fh->fh_rx_id = rx_fh->fh_rx_id; 1191 fh->fh_seq_cnt = rx_fh->fh_seq_cnt; 1192 fh->fh_r_ctl = FC_RCTL_BA_RJT; 1193 fh->fh_type = FC_TYPE_BLS; 1194 1195 /* 1196 * Form f_ctl by inverting EX_CTX and SEQ_CTX (bits 23, 22). 1197 * Echo FIRST_SEQ, LAST_SEQ, END_SEQ, END_CONN, SEQ_INIT. 1198 * Bits 9-8 are meaningful (retransmitted or unidirectional). 1199 * Last ACK uses bits 7-6 (continue sequence), 1200 * bits 5-4 are meaningful (what kind of ACK to use). 1201 * Always set LAST_SEQ, END_SEQ. 1202 */ 1203 f_ctl = ntoh24(rx_fh->fh_f_ctl); 1204 f_ctl &= FC_FC_EX_CTX | FC_FC_SEQ_CTX | 1205 FC_FC_END_CONN | FC_FC_SEQ_INIT | 1206 FC_FC_RETX_SEQ | FC_FC_UNI_TX; 1207 f_ctl ^= FC_FC_EX_CTX | FC_FC_SEQ_CTX; 1208 f_ctl |= FC_FC_LAST_SEQ | FC_FC_END_SEQ; 1209 f_ctl &= ~FC_FC_FIRST_SEQ; 1210 hton24(fh->fh_f_ctl, f_ctl); 1211 1212 fr_sof(fp) = fc_sof_class(fr_sof(rx_fp)); 1213 fr_eof(fp) = FC_EOF_T; 1214 if (fc_sof_needs_ack(fr_sof(fp))) 1215 fr_eof(fp) = FC_EOF_N; 1216 1217 lport->tt.frame_send(lport, fp); 1218 } 1219 1220 /** 1221 * fc_exch_recv_abts() - Handle an incoming ABTS 1222 * @ep: The exchange the abort was on 1223 * @rx_fp: The ABTS frame 1224 * 1225 * This would be for target mode usually, but could be due to lost 1226 * FCP transfer ready, confirm or RRQ. We always handle this as an 1227 * exchange abort, ignoring the parameter. 1228 */ 1229 static void fc_exch_recv_abts(struct fc_exch *ep, struct fc_frame *rx_fp) 1230 { 1231 struct fc_frame *fp; 1232 struct fc_ba_acc *ap; 1233 struct fc_frame_header *fh; 1234 struct fc_seq *sp; 1235 1236 if (!ep) 1237 goto reject; 1238 spin_lock_bh(&ep->ex_lock); 1239 if (ep->esb_stat & ESB_ST_COMPLETE) { 1240 spin_unlock_bh(&ep->ex_lock); 1241 goto reject; 1242 } 1243 if (!(ep->esb_stat & ESB_ST_REC_QUAL)) 1244 fc_exch_hold(ep); /* hold for REC_QUAL */ 1245 ep->esb_stat |= ESB_ST_ABNORMAL | ESB_ST_REC_QUAL; 1246 fc_exch_timer_set_locked(ep, ep->r_a_tov); 1247 1248 fp = fc_frame_alloc(ep->lp, sizeof(*ap)); 1249 if (!fp) { 1250 spin_unlock_bh(&ep->ex_lock); 1251 goto free; 1252 } 1253 fh = fc_frame_header_get(fp); 1254 ap = fc_frame_payload_get(fp, sizeof(*ap)); 1255 memset(ap, 0, sizeof(*ap)); 1256 sp = &ep->seq; 1257 ap->ba_high_seq_cnt = htons(0xffff); 1258 if (sp->ssb_stat & SSB_ST_RESP) { 1259 ap->ba_seq_id = sp->id; 1260 ap->ba_seq_id_val = FC_BA_SEQ_ID_VAL; 1261 ap->ba_high_seq_cnt = fh->fh_seq_cnt; 1262 ap->ba_low_seq_cnt = htons(sp->cnt); 1263 } 1264 sp = fc_seq_start_next_locked(sp); 1265 spin_unlock_bh(&ep->ex_lock); 1266 fc_seq_send_last(sp, fp, FC_RCTL_BA_ACC, FC_TYPE_BLS); 1267 fc_frame_free(rx_fp); 1268 return; 1269 1270 reject: 1271 fc_exch_send_ba_rjt(rx_fp, FC_BA_RJT_UNABLE, FC_BA_RJT_INV_XID); 1272 free: 1273 fc_frame_free(rx_fp); 1274 } 1275 1276 /** 1277 * fc_seq_assign() - Assign exchange and sequence for incoming request 1278 * @lport: The local port that received the request 1279 * @fp: The request frame 1280 * 1281 * On success, the sequence pointer will be returned and also in fr_seq(@fp). 1282 * A reference will be held on the exchange/sequence for the caller, which 1283 * must call fc_seq_release(). 1284 */ 1285 static struct fc_seq *fc_seq_assign(struct fc_lport *lport, struct fc_frame *fp) 1286 { 1287 struct fc_exch_mgr_anchor *ema; 1288 1289 WARN_ON(lport != fr_dev(fp)); 1290 WARN_ON(fr_seq(fp)); 1291 fr_seq(fp) = NULL; 1292 1293 list_for_each_entry(ema, &lport->ema_list, ema_list) 1294 if ((!ema->match || ema->match(fp)) && 1295 fc_seq_lookup_recip(lport, ema->mp, fp) == FC_RJT_NONE) 1296 break; 1297 return fr_seq(fp); 1298 } 1299 1300 /** 1301 * fc_seq_release() - Release the hold 1302 * @sp: The sequence. 1303 */ 1304 static void fc_seq_release(struct fc_seq *sp) 1305 { 1306 fc_exch_release(fc_seq_exch(sp)); 1307 } 1308 1309 /** 1310 * fc_exch_recv_req() - Handler for an incoming request 1311 * @lport: The local port that received the request 1312 * @mp: The EM that the exchange is on 1313 * @fp: The request frame 1314 * 1315 * This is used when the other end is originating the exchange 1316 * and the sequence. 1317 */ 1318 static void fc_exch_recv_req(struct fc_lport *lport, struct fc_exch_mgr *mp, 1319 struct fc_frame *fp) 1320 { 1321 struct fc_frame_header *fh = fc_frame_header_get(fp); 1322 struct fc_seq *sp = NULL; 1323 struct fc_exch *ep = NULL; 1324 enum fc_pf_rjt_reason reject; 1325 1326 /* We can have the wrong fc_lport at this point with NPIV, which is a 1327 * problem now that we know a new exchange needs to be allocated 1328 */ 1329 lport = fc_vport_id_lookup(lport, ntoh24(fh->fh_d_id)); 1330 if (!lport) { 1331 fc_frame_free(fp); 1332 return; 1333 } 1334 fr_dev(fp) = lport; 1335 1336 BUG_ON(fr_seq(fp)); /* XXX remove later */ 1337 1338 /* 1339 * If the RX_ID is 0xffff, don't allocate an exchange. 1340 * The upper-level protocol may request one later, if needed. 1341 */ 1342 if (fh->fh_rx_id == htons(FC_XID_UNKNOWN)) 1343 return lport->tt.lport_recv(lport, fp); 1344 1345 reject = fc_seq_lookup_recip(lport, mp, fp); 1346 if (reject == FC_RJT_NONE) { 1347 sp = fr_seq(fp); /* sequence will be held */ 1348 ep = fc_seq_exch(sp); 1349 fc_seq_send_ack(sp, fp); 1350 ep->encaps = fr_encaps(fp); 1351 1352 /* 1353 * Call the receive function. 1354 * 1355 * The receive function may allocate a new sequence 1356 * over the old one, so we shouldn't change the 1357 * sequence after this. 1358 * 1359 * The frame will be freed by the receive function. 1360 * If new exch resp handler is valid then call that 1361 * first. 1362 */ 1363 if (ep->resp) 1364 ep->resp(sp, fp, ep->arg); 1365 else 1366 lport->tt.lport_recv(lport, fp); 1367 fc_exch_release(ep); /* release from lookup */ 1368 } else { 1369 FC_LPORT_DBG(lport, "exch/seq lookup failed: reject %x\n", 1370 reject); 1371 fc_frame_free(fp); 1372 } 1373 } 1374 1375 /** 1376 * fc_exch_recv_seq_resp() - Handler for an incoming response where the other 1377 * end is the originator of the sequence that is a 1378 * response to our initial exchange 1379 * @mp: The EM that the exchange is on 1380 * @fp: The response frame 1381 */ 1382 static void fc_exch_recv_seq_resp(struct fc_exch_mgr *mp, struct fc_frame *fp) 1383 { 1384 struct fc_frame_header *fh = fc_frame_header_get(fp); 1385 struct fc_seq *sp; 1386 struct fc_exch *ep; 1387 enum fc_sof sof; 1388 u32 f_ctl; 1389 void (*resp)(struct fc_seq *, struct fc_frame *fp, void *arg); 1390 void *ex_resp_arg; 1391 int rc; 1392 1393 ep = fc_exch_find(mp, ntohs(fh->fh_ox_id)); 1394 if (!ep) { 1395 atomic_inc(&mp->stats.xid_not_found); 1396 goto out; 1397 } 1398 if (ep->esb_stat & ESB_ST_COMPLETE) { 1399 atomic_inc(&mp->stats.xid_not_found); 1400 goto rel; 1401 } 1402 if (ep->rxid == FC_XID_UNKNOWN) 1403 ep->rxid = ntohs(fh->fh_rx_id); 1404 if (ep->sid != 0 && ep->sid != ntoh24(fh->fh_d_id)) { 1405 atomic_inc(&mp->stats.xid_not_found); 1406 goto rel; 1407 } 1408 if (ep->did != ntoh24(fh->fh_s_id) && 1409 ep->did != FC_FID_FLOGI) { 1410 atomic_inc(&mp->stats.xid_not_found); 1411 goto rel; 1412 } 1413 sof = fr_sof(fp); 1414 sp = &ep->seq; 1415 if (fc_sof_is_init(sof)) { 1416 sp->ssb_stat |= SSB_ST_RESP; 1417 sp->id = fh->fh_seq_id; 1418 } else if (sp->id != fh->fh_seq_id) { 1419 atomic_inc(&mp->stats.seq_not_found); 1420 goto rel; 1421 } 1422 1423 f_ctl = ntoh24(fh->fh_f_ctl); 1424 fr_seq(fp) = sp; 1425 if (f_ctl & FC_FC_SEQ_INIT) 1426 ep->esb_stat |= ESB_ST_SEQ_INIT; 1427 1428 if (fc_sof_needs_ack(sof)) 1429 fc_seq_send_ack(sp, fp); 1430 resp = ep->resp; 1431 ex_resp_arg = ep->arg; 1432 1433 if (fh->fh_type != FC_TYPE_FCP && fr_eof(fp) == FC_EOF_T && 1434 (f_ctl & (FC_FC_LAST_SEQ | FC_FC_END_SEQ)) == 1435 (FC_FC_LAST_SEQ | FC_FC_END_SEQ)) { 1436 spin_lock_bh(&ep->ex_lock); 1437 resp = ep->resp; 1438 rc = fc_exch_done_locked(ep); 1439 WARN_ON(fc_seq_exch(sp) != ep); 1440 spin_unlock_bh(&ep->ex_lock); 1441 if (!rc) 1442 fc_exch_delete(ep); 1443 } 1444 1445 /* 1446 * Call the receive function. 1447 * The sequence is held (has a refcnt) for us, 1448 * but not for the receive function. 1449 * 1450 * The receive function may allocate a new sequence 1451 * over the old one, so we shouldn't change the 1452 * sequence after this. 1453 * 1454 * The frame will be freed by the receive function. 1455 * If new exch resp handler is valid then call that 1456 * first. 1457 */ 1458 if (resp) 1459 resp(sp, fp, ex_resp_arg); 1460 else 1461 fc_frame_free(fp); 1462 fc_exch_release(ep); 1463 return; 1464 rel: 1465 fc_exch_release(ep); 1466 out: 1467 fc_frame_free(fp); 1468 } 1469 1470 /** 1471 * fc_exch_recv_resp() - Handler for a sequence where other end is 1472 * responding to our sequence 1473 * @mp: The EM that the exchange is on 1474 * @fp: The response frame 1475 */ 1476 static void fc_exch_recv_resp(struct fc_exch_mgr *mp, struct fc_frame *fp) 1477 { 1478 struct fc_seq *sp; 1479 1480 sp = fc_seq_lookup_orig(mp, fp); /* doesn't hold sequence */ 1481 1482 if (!sp) 1483 atomic_inc(&mp->stats.xid_not_found); 1484 else 1485 atomic_inc(&mp->stats.non_bls_resp); 1486 1487 fc_frame_free(fp); 1488 } 1489 1490 /** 1491 * fc_exch_abts_resp() - Handler for a response to an ABT 1492 * @ep: The exchange that the frame is on 1493 * @fp: The response frame 1494 * 1495 * This response would be to an ABTS cancelling an exchange or sequence. 1496 * The response can be either BA_ACC or BA_RJT 1497 */ 1498 static void fc_exch_abts_resp(struct fc_exch *ep, struct fc_frame *fp) 1499 { 1500 void (*resp)(struct fc_seq *, struct fc_frame *fp, void *arg); 1501 void *ex_resp_arg; 1502 struct fc_frame_header *fh; 1503 struct fc_ba_acc *ap; 1504 struct fc_seq *sp; 1505 u16 low; 1506 u16 high; 1507 int rc = 1, has_rec = 0; 1508 1509 fh = fc_frame_header_get(fp); 1510 FC_EXCH_DBG(ep, "exch: BLS rctl %x - %s\n", fh->fh_r_ctl, 1511 fc_exch_rctl_name(fh->fh_r_ctl)); 1512 1513 if (cancel_delayed_work_sync(&ep->timeout_work)) 1514 fc_exch_release(ep); /* release from pending timer hold */ 1515 1516 spin_lock_bh(&ep->ex_lock); 1517 switch (fh->fh_r_ctl) { 1518 case FC_RCTL_BA_ACC: 1519 ap = fc_frame_payload_get(fp, sizeof(*ap)); 1520 if (!ap) 1521 break; 1522 1523 /* 1524 * Decide whether to establish a Recovery Qualifier. 1525 * We do this if there is a non-empty SEQ_CNT range and 1526 * SEQ_ID is the same as the one we aborted. 1527 */ 1528 low = ntohs(ap->ba_low_seq_cnt); 1529 high = ntohs(ap->ba_high_seq_cnt); 1530 if ((ep->esb_stat & ESB_ST_REC_QUAL) == 0 && 1531 (ap->ba_seq_id_val != FC_BA_SEQ_ID_VAL || 1532 ap->ba_seq_id == ep->seq_id) && low != high) { 1533 ep->esb_stat |= ESB_ST_REC_QUAL; 1534 fc_exch_hold(ep); /* hold for recovery qualifier */ 1535 has_rec = 1; 1536 } 1537 break; 1538 case FC_RCTL_BA_RJT: 1539 break; 1540 default: 1541 break; 1542 } 1543 1544 resp = ep->resp; 1545 ex_resp_arg = ep->arg; 1546 1547 /* do we need to do some other checks here. Can we reuse more of 1548 * fc_exch_recv_seq_resp 1549 */ 1550 sp = &ep->seq; 1551 /* 1552 * do we want to check END_SEQ as well as LAST_SEQ here? 1553 */ 1554 if (ep->fh_type != FC_TYPE_FCP && 1555 ntoh24(fh->fh_f_ctl) & FC_FC_LAST_SEQ) 1556 rc = fc_exch_done_locked(ep); 1557 spin_unlock_bh(&ep->ex_lock); 1558 if (!rc) 1559 fc_exch_delete(ep); 1560 1561 if (resp) 1562 resp(sp, fp, ex_resp_arg); 1563 else 1564 fc_frame_free(fp); 1565 1566 if (has_rec) 1567 fc_exch_timer_set(ep, ep->r_a_tov); 1568 1569 } 1570 1571 /** 1572 * fc_exch_recv_bls() - Handler for a BLS sequence 1573 * @mp: The EM that the exchange is on 1574 * @fp: The request frame 1575 * 1576 * The BLS frame is always a sequence initiated by the remote side. 1577 * We may be either the originator or recipient of the exchange. 1578 */ 1579 static void fc_exch_recv_bls(struct fc_exch_mgr *mp, struct fc_frame *fp) 1580 { 1581 struct fc_frame_header *fh; 1582 struct fc_exch *ep; 1583 u32 f_ctl; 1584 1585 fh = fc_frame_header_get(fp); 1586 f_ctl = ntoh24(fh->fh_f_ctl); 1587 fr_seq(fp) = NULL; 1588 1589 ep = fc_exch_find(mp, (f_ctl & FC_FC_EX_CTX) ? 1590 ntohs(fh->fh_ox_id) : ntohs(fh->fh_rx_id)); 1591 if (ep && (f_ctl & FC_FC_SEQ_INIT)) { 1592 spin_lock_bh(&ep->ex_lock); 1593 ep->esb_stat |= ESB_ST_SEQ_INIT; 1594 spin_unlock_bh(&ep->ex_lock); 1595 } 1596 if (f_ctl & FC_FC_SEQ_CTX) { 1597 /* 1598 * A response to a sequence we initiated. 1599 * This should only be ACKs for class 2 or F. 1600 */ 1601 switch (fh->fh_r_ctl) { 1602 case FC_RCTL_ACK_1: 1603 case FC_RCTL_ACK_0: 1604 break; 1605 default: 1606 FC_EXCH_DBG(ep, "BLS rctl %x - %s received", 1607 fh->fh_r_ctl, 1608 fc_exch_rctl_name(fh->fh_r_ctl)); 1609 break; 1610 } 1611 fc_frame_free(fp); 1612 } else { 1613 switch (fh->fh_r_ctl) { 1614 case FC_RCTL_BA_RJT: 1615 case FC_RCTL_BA_ACC: 1616 if (ep) 1617 fc_exch_abts_resp(ep, fp); 1618 else 1619 fc_frame_free(fp); 1620 break; 1621 case FC_RCTL_BA_ABTS: 1622 fc_exch_recv_abts(ep, fp); 1623 break; 1624 default: /* ignore junk */ 1625 fc_frame_free(fp); 1626 break; 1627 } 1628 } 1629 if (ep) 1630 fc_exch_release(ep); /* release hold taken by fc_exch_find */ 1631 } 1632 1633 /** 1634 * fc_seq_ls_acc() - Accept sequence with LS_ACC 1635 * @rx_fp: The received frame, not freed here. 1636 * 1637 * If this fails due to allocation or transmit congestion, assume the 1638 * originator will repeat the sequence. 1639 */ 1640 static void fc_seq_ls_acc(struct fc_frame *rx_fp) 1641 { 1642 struct fc_lport *lport; 1643 struct fc_els_ls_acc *acc; 1644 struct fc_frame *fp; 1645 1646 lport = fr_dev(rx_fp); 1647 fp = fc_frame_alloc(lport, sizeof(*acc)); 1648 if (!fp) 1649 return; 1650 acc = fc_frame_payload_get(fp, sizeof(*acc)); 1651 memset(acc, 0, sizeof(*acc)); 1652 acc->la_cmd = ELS_LS_ACC; 1653 fc_fill_reply_hdr(fp, rx_fp, FC_RCTL_ELS_REP, 0); 1654 lport->tt.frame_send(lport, fp); 1655 } 1656 1657 /** 1658 * fc_seq_ls_rjt() - Reject a sequence with ELS LS_RJT 1659 * @rx_fp: The received frame, not freed here. 1660 * @reason: The reason the sequence is being rejected 1661 * @explan: The explanation for the rejection 1662 * 1663 * If this fails due to allocation or transmit congestion, assume the 1664 * originator will repeat the sequence. 1665 */ 1666 static void fc_seq_ls_rjt(struct fc_frame *rx_fp, enum fc_els_rjt_reason reason, 1667 enum fc_els_rjt_explan explan) 1668 { 1669 struct fc_lport *lport; 1670 struct fc_els_ls_rjt *rjt; 1671 struct fc_frame *fp; 1672 1673 lport = fr_dev(rx_fp); 1674 fp = fc_frame_alloc(lport, sizeof(*rjt)); 1675 if (!fp) 1676 return; 1677 rjt = fc_frame_payload_get(fp, sizeof(*rjt)); 1678 memset(rjt, 0, sizeof(*rjt)); 1679 rjt->er_cmd = ELS_LS_RJT; 1680 rjt->er_reason = reason; 1681 rjt->er_explan = explan; 1682 fc_fill_reply_hdr(fp, rx_fp, FC_RCTL_ELS_REP, 0); 1683 lport->tt.frame_send(lport, fp); 1684 } 1685 1686 /** 1687 * fc_exch_reset() - Reset an exchange 1688 * @ep: The exchange to be reset 1689 */ 1690 static void fc_exch_reset(struct fc_exch *ep) 1691 { 1692 struct fc_seq *sp; 1693 void (*resp)(struct fc_seq *, struct fc_frame *, void *); 1694 void *arg; 1695 int rc = 1; 1696 1697 spin_lock_bh(&ep->ex_lock); 1698 ep->state |= FC_EX_RST_CLEANUP; 1699 if (cancel_delayed_work(&ep->timeout_work)) 1700 atomic_dec(&ep->ex_refcnt); /* drop hold for timer */ 1701 resp = ep->resp; 1702 ep->resp = NULL; 1703 if (ep->esb_stat & ESB_ST_REC_QUAL) 1704 atomic_dec(&ep->ex_refcnt); /* drop hold for rec_qual */ 1705 ep->esb_stat &= ~ESB_ST_REC_QUAL; 1706 arg = ep->arg; 1707 sp = &ep->seq; 1708 rc = fc_exch_done_locked(ep); 1709 spin_unlock_bh(&ep->ex_lock); 1710 if (!rc) 1711 fc_exch_delete(ep); 1712 1713 if (resp) 1714 resp(sp, ERR_PTR(-FC_EX_CLOSED), arg); 1715 } 1716 1717 /** 1718 * fc_exch_pool_reset() - Reset a per cpu exchange pool 1719 * @lport: The local port that the exchange pool is on 1720 * @pool: The exchange pool to be reset 1721 * @sid: The source ID 1722 * @did: The destination ID 1723 * 1724 * Resets a per cpu exches pool, releasing all of its sequences 1725 * and exchanges. If sid is non-zero then reset only exchanges 1726 * we sourced from the local port's FID. If did is non-zero then 1727 * only reset exchanges destined for the local port's FID. 1728 */ 1729 static void fc_exch_pool_reset(struct fc_lport *lport, 1730 struct fc_exch_pool *pool, 1731 u32 sid, u32 did) 1732 { 1733 struct fc_exch *ep; 1734 struct fc_exch *next; 1735 1736 spin_lock_bh(&pool->lock); 1737 restart: 1738 list_for_each_entry_safe(ep, next, &pool->ex_list, ex_list) { 1739 if ((lport == ep->lp) && 1740 (sid == 0 || sid == ep->sid) && 1741 (did == 0 || did == ep->did)) { 1742 fc_exch_hold(ep); 1743 spin_unlock_bh(&pool->lock); 1744 1745 fc_exch_reset(ep); 1746 1747 fc_exch_release(ep); 1748 spin_lock_bh(&pool->lock); 1749 1750 /* 1751 * must restart loop incase while lock 1752 * was down multiple eps were released. 1753 */ 1754 goto restart; 1755 } 1756 } 1757 spin_unlock_bh(&pool->lock); 1758 } 1759 1760 /** 1761 * fc_exch_mgr_reset() - Reset all EMs of a local port 1762 * @lport: The local port whose EMs are to be reset 1763 * @sid: The source ID 1764 * @did: The destination ID 1765 * 1766 * Reset all EMs associated with a given local port. Release all 1767 * sequences and exchanges. If sid is non-zero then reset only the 1768 * exchanges sent from the local port's FID. If did is non-zero then 1769 * reset only exchanges destined for the local port's FID. 1770 */ 1771 void fc_exch_mgr_reset(struct fc_lport *lport, u32 sid, u32 did) 1772 { 1773 struct fc_exch_mgr_anchor *ema; 1774 unsigned int cpu; 1775 1776 list_for_each_entry(ema, &lport->ema_list, ema_list) { 1777 for_each_possible_cpu(cpu) 1778 fc_exch_pool_reset(lport, 1779 per_cpu_ptr(ema->mp->pool, cpu), 1780 sid, did); 1781 } 1782 } 1783 EXPORT_SYMBOL(fc_exch_mgr_reset); 1784 1785 /** 1786 * fc_exch_lookup() - find an exchange 1787 * @lport: The local port 1788 * @xid: The exchange ID 1789 * 1790 * Returns exchange pointer with hold for caller, or NULL if not found. 1791 */ 1792 static struct fc_exch *fc_exch_lookup(struct fc_lport *lport, u32 xid) 1793 { 1794 struct fc_exch_mgr_anchor *ema; 1795 1796 list_for_each_entry(ema, &lport->ema_list, ema_list) 1797 if (ema->mp->min_xid <= xid && xid <= ema->mp->max_xid) 1798 return fc_exch_find(ema->mp, xid); 1799 return NULL; 1800 } 1801 1802 /** 1803 * fc_exch_els_rec() - Handler for ELS REC (Read Exchange Concise) requests 1804 * @rfp: The REC frame, not freed here. 1805 * 1806 * Note that the requesting port may be different than the S_ID in the request. 1807 */ 1808 static void fc_exch_els_rec(struct fc_frame *rfp) 1809 { 1810 struct fc_lport *lport; 1811 struct fc_frame *fp; 1812 struct fc_exch *ep; 1813 struct fc_els_rec *rp; 1814 struct fc_els_rec_acc *acc; 1815 enum fc_els_rjt_reason reason = ELS_RJT_LOGIC; 1816 enum fc_els_rjt_explan explan; 1817 u32 sid; 1818 u16 rxid; 1819 u16 oxid; 1820 1821 lport = fr_dev(rfp); 1822 rp = fc_frame_payload_get(rfp, sizeof(*rp)); 1823 explan = ELS_EXPL_INV_LEN; 1824 if (!rp) 1825 goto reject; 1826 sid = ntoh24(rp->rec_s_id); 1827 rxid = ntohs(rp->rec_rx_id); 1828 oxid = ntohs(rp->rec_ox_id); 1829 1830 ep = fc_exch_lookup(lport, 1831 sid == fc_host_port_id(lport->host) ? oxid : rxid); 1832 explan = ELS_EXPL_OXID_RXID; 1833 if (!ep) 1834 goto reject; 1835 if (ep->oid != sid || oxid != ep->oxid) 1836 goto rel; 1837 if (rxid != FC_XID_UNKNOWN && rxid != ep->rxid) 1838 goto rel; 1839 fp = fc_frame_alloc(lport, sizeof(*acc)); 1840 if (!fp) 1841 goto out; 1842 1843 acc = fc_frame_payload_get(fp, sizeof(*acc)); 1844 memset(acc, 0, sizeof(*acc)); 1845 acc->reca_cmd = ELS_LS_ACC; 1846 acc->reca_ox_id = rp->rec_ox_id; 1847 memcpy(acc->reca_ofid, rp->rec_s_id, 3); 1848 acc->reca_rx_id = htons(ep->rxid); 1849 if (ep->sid == ep->oid) 1850 hton24(acc->reca_rfid, ep->did); 1851 else 1852 hton24(acc->reca_rfid, ep->sid); 1853 acc->reca_fc4value = htonl(ep->seq.rec_data); 1854 acc->reca_e_stat = htonl(ep->esb_stat & (ESB_ST_RESP | 1855 ESB_ST_SEQ_INIT | 1856 ESB_ST_COMPLETE)); 1857 fc_fill_reply_hdr(fp, rfp, FC_RCTL_ELS_REP, 0); 1858 lport->tt.frame_send(lport, fp); 1859 out: 1860 fc_exch_release(ep); 1861 return; 1862 1863 rel: 1864 fc_exch_release(ep); 1865 reject: 1866 fc_seq_ls_rjt(rfp, reason, explan); 1867 } 1868 1869 /** 1870 * fc_exch_rrq_resp() - Handler for RRQ responses 1871 * @sp: The sequence that the RRQ is on 1872 * @fp: The RRQ frame 1873 * @arg: The exchange that the RRQ is on 1874 * 1875 * TODO: fix error handler. 1876 */ 1877 static void fc_exch_rrq_resp(struct fc_seq *sp, struct fc_frame *fp, void *arg) 1878 { 1879 struct fc_exch *aborted_ep = arg; 1880 unsigned int op; 1881 1882 if (IS_ERR(fp)) { 1883 int err = PTR_ERR(fp); 1884 1885 if (err == -FC_EX_CLOSED || err == -FC_EX_TIMEOUT) 1886 goto cleanup; 1887 FC_EXCH_DBG(aborted_ep, "Cannot process RRQ, " 1888 "frame error %d\n", err); 1889 return; 1890 } 1891 1892 op = fc_frame_payload_op(fp); 1893 fc_frame_free(fp); 1894 1895 switch (op) { 1896 case ELS_LS_RJT: 1897 FC_EXCH_DBG(aborted_ep, "LS_RJT for RRQ"); 1898 /* fall through */ 1899 case ELS_LS_ACC: 1900 goto cleanup; 1901 default: 1902 FC_EXCH_DBG(aborted_ep, "unexpected response op %x " 1903 "for RRQ", op); 1904 return; 1905 } 1906 1907 cleanup: 1908 fc_exch_done(&aborted_ep->seq); 1909 /* drop hold for rec qual */ 1910 fc_exch_release(aborted_ep); 1911 } 1912 1913 1914 /** 1915 * fc_exch_seq_send() - Send a frame using a new exchange and sequence 1916 * @lport: The local port to send the frame on 1917 * @fp: The frame to be sent 1918 * @resp: The response handler for this request 1919 * @destructor: The destructor for the exchange 1920 * @arg: The argument to be passed to the response handler 1921 * @timer_msec: The timeout period for the exchange 1922 * 1923 * The frame pointer with some of the header's fields must be 1924 * filled before calling this routine, those fields are: 1925 * 1926 * - routing control 1927 * - FC port did 1928 * - FC port sid 1929 * - FC header type 1930 * - frame control 1931 * - parameter or relative offset 1932 */ 1933 static struct fc_seq *fc_exch_seq_send(struct fc_lport *lport, 1934 struct fc_frame *fp, 1935 void (*resp)(struct fc_seq *, 1936 struct fc_frame *fp, 1937 void *arg), 1938 void (*destructor)(struct fc_seq *, 1939 void *), 1940 void *arg, u32 timer_msec) 1941 { 1942 struct fc_exch *ep; 1943 struct fc_seq *sp = NULL; 1944 struct fc_frame_header *fh; 1945 int rc = 1; 1946 1947 ep = fc_exch_alloc(lport, fp); 1948 if (!ep) { 1949 fc_frame_free(fp); 1950 return NULL; 1951 } 1952 ep->esb_stat |= ESB_ST_SEQ_INIT; 1953 fh = fc_frame_header_get(fp); 1954 fc_exch_set_addr(ep, ntoh24(fh->fh_s_id), ntoh24(fh->fh_d_id)); 1955 ep->resp = resp; 1956 ep->destructor = destructor; 1957 ep->arg = arg; 1958 ep->r_a_tov = FC_DEF_R_A_TOV; 1959 ep->lp = lport; 1960 sp = &ep->seq; 1961 1962 ep->fh_type = fh->fh_type; /* save for possbile timeout handling */ 1963 ep->f_ctl = ntoh24(fh->fh_f_ctl); 1964 fc_exch_setup_hdr(ep, fp, ep->f_ctl); 1965 sp->cnt++; 1966 1967 if (ep->xid <= lport->lro_xid && fh->fh_r_ctl == FC_RCTL_DD_UNSOL_CMD) 1968 fc_fcp_ddp_setup(fr_fsp(fp), ep->xid); 1969 1970 if (unlikely(lport->tt.frame_send(lport, fp))) 1971 goto err; 1972 1973 if (timer_msec) 1974 fc_exch_timer_set_locked(ep, timer_msec); 1975 ep->f_ctl &= ~FC_FC_FIRST_SEQ; /* not first seq */ 1976 1977 if (ep->f_ctl & FC_FC_SEQ_INIT) 1978 ep->esb_stat &= ~ESB_ST_SEQ_INIT; 1979 spin_unlock_bh(&ep->ex_lock); 1980 return sp; 1981 err: 1982 fc_fcp_ddp_done(fr_fsp(fp)); 1983 rc = fc_exch_done_locked(ep); 1984 spin_unlock_bh(&ep->ex_lock); 1985 if (!rc) 1986 fc_exch_delete(ep); 1987 return NULL; 1988 } 1989 1990 /** 1991 * fc_exch_rrq() - Send an ELS RRQ (Reinstate Recovery Qualifier) command 1992 * @ep: The exchange to send the RRQ on 1993 * 1994 * This tells the remote port to stop blocking the use of 1995 * the exchange and the seq_cnt range. 1996 */ 1997 static void fc_exch_rrq(struct fc_exch *ep) 1998 { 1999 struct fc_lport *lport; 2000 struct fc_els_rrq *rrq; 2001 struct fc_frame *fp; 2002 u32 did; 2003 2004 lport = ep->lp; 2005 2006 fp = fc_frame_alloc(lport, sizeof(*rrq)); 2007 if (!fp) 2008 goto retry; 2009 2010 rrq = fc_frame_payload_get(fp, sizeof(*rrq)); 2011 memset(rrq, 0, sizeof(*rrq)); 2012 rrq->rrq_cmd = ELS_RRQ; 2013 hton24(rrq->rrq_s_id, ep->sid); 2014 rrq->rrq_ox_id = htons(ep->oxid); 2015 rrq->rrq_rx_id = htons(ep->rxid); 2016 2017 did = ep->did; 2018 if (ep->esb_stat & ESB_ST_RESP) 2019 did = ep->sid; 2020 2021 fc_fill_fc_hdr(fp, FC_RCTL_ELS_REQ, did, 2022 lport->port_id, FC_TYPE_ELS, 2023 FC_FC_FIRST_SEQ | FC_FC_END_SEQ | FC_FC_SEQ_INIT, 0); 2024 2025 if (fc_exch_seq_send(lport, fp, fc_exch_rrq_resp, NULL, ep, 2026 lport->e_d_tov)) 2027 return; 2028 2029 retry: 2030 spin_lock_bh(&ep->ex_lock); 2031 if (ep->state & (FC_EX_RST_CLEANUP | FC_EX_DONE)) { 2032 spin_unlock_bh(&ep->ex_lock); 2033 /* drop hold for rec qual */ 2034 fc_exch_release(ep); 2035 return; 2036 } 2037 ep->esb_stat |= ESB_ST_REC_QUAL; 2038 fc_exch_timer_set_locked(ep, ep->r_a_tov); 2039 spin_unlock_bh(&ep->ex_lock); 2040 } 2041 2042 /** 2043 * fc_exch_els_rrq() - Handler for ELS RRQ (Reset Recovery Qualifier) requests 2044 * @fp: The RRQ frame, not freed here. 2045 */ 2046 static void fc_exch_els_rrq(struct fc_frame *fp) 2047 { 2048 struct fc_lport *lport; 2049 struct fc_exch *ep = NULL; /* request or subject exchange */ 2050 struct fc_els_rrq *rp; 2051 u32 sid; 2052 u16 xid; 2053 enum fc_els_rjt_explan explan; 2054 2055 lport = fr_dev(fp); 2056 rp = fc_frame_payload_get(fp, sizeof(*rp)); 2057 explan = ELS_EXPL_INV_LEN; 2058 if (!rp) 2059 goto reject; 2060 2061 /* 2062 * lookup subject exchange. 2063 */ 2064 sid = ntoh24(rp->rrq_s_id); /* subject source */ 2065 xid = fc_host_port_id(lport->host) == sid ? 2066 ntohs(rp->rrq_ox_id) : ntohs(rp->rrq_rx_id); 2067 ep = fc_exch_lookup(lport, xid); 2068 explan = ELS_EXPL_OXID_RXID; 2069 if (!ep) 2070 goto reject; 2071 spin_lock_bh(&ep->ex_lock); 2072 if (ep->oxid != ntohs(rp->rrq_ox_id)) 2073 goto unlock_reject; 2074 if (ep->rxid != ntohs(rp->rrq_rx_id) && 2075 ep->rxid != FC_XID_UNKNOWN) 2076 goto unlock_reject; 2077 explan = ELS_EXPL_SID; 2078 if (ep->sid != sid) 2079 goto unlock_reject; 2080 2081 /* 2082 * Clear Recovery Qualifier state, and cancel timer if complete. 2083 */ 2084 if (ep->esb_stat & ESB_ST_REC_QUAL) { 2085 ep->esb_stat &= ~ESB_ST_REC_QUAL; 2086 atomic_dec(&ep->ex_refcnt); /* drop hold for rec qual */ 2087 } 2088 if (ep->esb_stat & ESB_ST_COMPLETE) { 2089 if (cancel_delayed_work(&ep->timeout_work)) 2090 atomic_dec(&ep->ex_refcnt); /* drop timer hold */ 2091 } 2092 2093 spin_unlock_bh(&ep->ex_lock); 2094 2095 /* 2096 * Send LS_ACC. 2097 */ 2098 fc_seq_ls_acc(fp); 2099 goto out; 2100 2101 unlock_reject: 2102 spin_unlock_bh(&ep->ex_lock); 2103 reject: 2104 fc_seq_ls_rjt(fp, ELS_RJT_LOGIC, explan); 2105 out: 2106 if (ep) 2107 fc_exch_release(ep); /* drop hold from fc_exch_find */ 2108 } 2109 2110 /** 2111 * fc_exch_mgr_add() - Add an exchange manager to a local port's list of EMs 2112 * @lport: The local port to add the exchange manager to 2113 * @mp: The exchange manager to be added to the local port 2114 * @match: The match routine that indicates when this EM should be used 2115 */ 2116 struct fc_exch_mgr_anchor *fc_exch_mgr_add(struct fc_lport *lport, 2117 struct fc_exch_mgr *mp, 2118 bool (*match)(struct fc_frame *)) 2119 { 2120 struct fc_exch_mgr_anchor *ema; 2121 2122 ema = kmalloc(sizeof(*ema), GFP_ATOMIC); 2123 if (!ema) 2124 return ema; 2125 2126 ema->mp = mp; 2127 ema->match = match; 2128 /* add EM anchor to EM anchors list */ 2129 list_add_tail(&ema->ema_list, &lport->ema_list); 2130 kref_get(&mp->kref); 2131 return ema; 2132 } 2133 EXPORT_SYMBOL(fc_exch_mgr_add); 2134 2135 /** 2136 * fc_exch_mgr_destroy() - Destroy an exchange manager 2137 * @kref: The reference to the EM to be destroyed 2138 */ 2139 static void fc_exch_mgr_destroy(struct kref *kref) 2140 { 2141 struct fc_exch_mgr *mp = container_of(kref, struct fc_exch_mgr, kref); 2142 2143 mempool_destroy(mp->ep_pool); 2144 free_percpu(mp->pool); 2145 kfree(mp); 2146 } 2147 2148 /** 2149 * fc_exch_mgr_del() - Delete an EM from a local port's list 2150 * @ema: The exchange manager anchor identifying the EM to be deleted 2151 */ 2152 void fc_exch_mgr_del(struct fc_exch_mgr_anchor *ema) 2153 { 2154 /* remove EM anchor from EM anchors list */ 2155 list_del(&ema->ema_list); 2156 kref_put(&ema->mp->kref, fc_exch_mgr_destroy); 2157 kfree(ema); 2158 } 2159 EXPORT_SYMBOL(fc_exch_mgr_del); 2160 2161 /** 2162 * fc_exch_mgr_list_clone() - Share all exchange manager objects 2163 * @src: Source lport to clone exchange managers from 2164 * @dst: New lport that takes references to all the exchange managers 2165 */ 2166 int fc_exch_mgr_list_clone(struct fc_lport *src, struct fc_lport *dst) 2167 { 2168 struct fc_exch_mgr_anchor *ema, *tmp; 2169 2170 list_for_each_entry(ema, &src->ema_list, ema_list) { 2171 if (!fc_exch_mgr_add(dst, ema->mp, ema->match)) 2172 goto err; 2173 } 2174 return 0; 2175 err: 2176 list_for_each_entry_safe(ema, tmp, &dst->ema_list, ema_list) 2177 fc_exch_mgr_del(ema); 2178 return -ENOMEM; 2179 } 2180 EXPORT_SYMBOL(fc_exch_mgr_list_clone); 2181 2182 /** 2183 * fc_exch_mgr_alloc() - Allocate an exchange manager 2184 * @lport: The local port that the new EM will be associated with 2185 * @class: The default FC class for new exchanges 2186 * @min_xid: The minimum XID for exchanges from the new EM 2187 * @max_xid: The maximum XID for exchanges from the new EM 2188 * @match: The match routine for the new EM 2189 */ 2190 struct fc_exch_mgr *fc_exch_mgr_alloc(struct fc_lport *lport, 2191 enum fc_class class, 2192 u16 min_xid, u16 max_xid, 2193 bool (*match)(struct fc_frame *)) 2194 { 2195 struct fc_exch_mgr *mp; 2196 u16 pool_exch_range; 2197 size_t pool_size; 2198 unsigned int cpu; 2199 struct fc_exch_pool *pool; 2200 2201 if (max_xid <= min_xid || max_xid == FC_XID_UNKNOWN || 2202 (min_xid & fc_cpu_mask) != 0) { 2203 FC_LPORT_DBG(lport, "Invalid min_xid 0x:%x and max_xid 0x:%x\n", 2204 min_xid, max_xid); 2205 return NULL; 2206 } 2207 2208 /* 2209 * allocate memory for EM 2210 */ 2211 mp = kzalloc(sizeof(struct fc_exch_mgr), GFP_ATOMIC); 2212 if (!mp) 2213 return NULL; 2214 2215 mp->class = class; 2216 /* adjust em exch xid range for offload */ 2217 mp->min_xid = min_xid; 2218 mp->max_xid = max_xid; 2219 2220 mp->ep_pool = mempool_create_slab_pool(2, fc_em_cachep); 2221 if (!mp->ep_pool) 2222 goto free_mp; 2223 2224 /* 2225 * Setup per cpu exch pool with entire exchange id range equally 2226 * divided across all cpus. The exch pointers array memory is 2227 * allocated for exch range per pool. 2228 */ 2229 pool_exch_range = (mp->max_xid - mp->min_xid + 1) / (fc_cpu_mask + 1); 2230 mp->pool_max_index = pool_exch_range - 1; 2231 2232 /* 2233 * Allocate and initialize per cpu exch pool 2234 */ 2235 pool_size = sizeof(*pool) + pool_exch_range * sizeof(struct fc_exch *); 2236 mp->pool = __alloc_percpu(pool_size, __alignof__(struct fc_exch_pool)); 2237 if (!mp->pool) 2238 goto free_mempool; 2239 for_each_possible_cpu(cpu) { 2240 pool = per_cpu_ptr(mp->pool, cpu); 2241 pool->left = FC_XID_UNKNOWN; 2242 pool->right = FC_XID_UNKNOWN; 2243 spin_lock_init(&pool->lock); 2244 INIT_LIST_HEAD(&pool->ex_list); 2245 } 2246 2247 kref_init(&mp->kref); 2248 if (!fc_exch_mgr_add(lport, mp, match)) { 2249 free_percpu(mp->pool); 2250 goto free_mempool; 2251 } 2252 2253 /* 2254 * Above kref_init() sets mp->kref to 1 and then 2255 * call to fc_exch_mgr_add incremented mp->kref again, 2256 * so adjust that extra increment. 2257 */ 2258 kref_put(&mp->kref, fc_exch_mgr_destroy); 2259 return mp; 2260 2261 free_mempool: 2262 mempool_destroy(mp->ep_pool); 2263 free_mp: 2264 kfree(mp); 2265 return NULL; 2266 } 2267 EXPORT_SYMBOL(fc_exch_mgr_alloc); 2268 2269 /** 2270 * fc_exch_mgr_free() - Free all exchange managers on a local port 2271 * @lport: The local port whose EMs are to be freed 2272 */ 2273 void fc_exch_mgr_free(struct fc_lport *lport) 2274 { 2275 struct fc_exch_mgr_anchor *ema, *next; 2276 2277 flush_workqueue(fc_exch_workqueue); 2278 list_for_each_entry_safe(ema, next, &lport->ema_list, ema_list) 2279 fc_exch_mgr_del(ema); 2280 } 2281 EXPORT_SYMBOL(fc_exch_mgr_free); 2282 2283 /** 2284 * fc_find_ema() - Lookup and return appropriate Exchange Manager Anchor depending 2285 * upon 'xid'. 2286 * @f_ctl: f_ctl 2287 * @lport: The local port the frame was received on 2288 * @fh: The received frame header 2289 */ 2290 static struct fc_exch_mgr_anchor *fc_find_ema(u32 f_ctl, 2291 struct fc_lport *lport, 2292 struct fc_frame_header *fh) 2293 { 2294 struct fc_exch_mgr_anchor *ema; 2295 u16 xid; 2296 2297 if (f_ctl & FC_FC_EX_CTX) 2298 xid = ntohs(fh->fh_ox_id); 2299 else { 2300 xid = ntohs(fh->fh_rx_id); 2301 if (xid == FC_XID_UNKNOWN) 2302 return list_entry(lport->ema_list.prev, 2303 typeof(*ema), ema_list); 2304 } 2305 2306 list_for_each_entry(ema, &lport->ema_list, ema_list) { 2307 if ((xid >= ema->mp->min_xid) && 2308 (xid <= ema->mp->max_xid)) 2309 return ema; 2310 } 2311 return NULL; 2312 } 2313 /** 2314 * fc_exch_recv() - Handler for received frames 2315 * @lport: The local port the frame was received on 2316 * @fp: The received frame 2317 */ 2318 void fc_exch_recv(struct fc_lport *lport, struct fc_frame *fp) 2319 { 2320 struct fc_frame_header *fh = fc_frame_header_get(fp); 2321 struct fc_exch_mgr_anchor *ema; 2322 u32 f_ctl; 2323 2324 /* lport lock ? */ 2325 if (!lport || lport->state == LPORT_ST_DISABLED) { 2326 FC_LPORT_DBG(lport, "Receiving frames for an lport that " 2327 "has not been initialized correctly\n"); 2328 fc_frame_free(fp); 2329 return; 2330 } 2331 2332 f_ctl = ntoh24(fh->fh_f_ctl); 2333 ema = fc_find_ema(f_ctl, lport, fh); 2334 if (!ema) { 2335 FC_LPORT_DBG(lport, "Unable to find Exchange Manager Anchor," 2336 "fc_ctl <0x%x>, xid <0x%x>\n", 2337 f_ctl, 2338 (f_ctl & FC_FC_EX_CTX) ? 2339 ntohs(fh->fh_ox_id) : 2340 ntohs(fh->fh_rx_id)); 2341 fc_frame_free(fp); 2342 return; 2343 } 2344 2345 /* 2346 * If frame is marked invalid, just drop it. 2347 */ 2348 switch (fr_eof(fp)) { 2349 case FC_EOF_T: 2350 if (f_ctl & FC_FC_END_SEQ) 2351 skb_trim(fp_skb(fp), fr_len(fp) - FC_FC_FILL(f_ctl)); 2352 /* fall through */ 2353 case FC_EOF_N: 2354 if (fh->fh_type == FC_TYPE_BLS) 2355 fc_exch_recv_bls(ema->mp, fp); 2356 else if ((f_ctl & (FC_FC_EX_CTX | FC_FC_SEQ_CTX)) == 2357 FC_FC_EX_CTX) 2358 fc_exch_recv_seq_resp(ema->mp, fp); 2359 else if (f_ctl & FC_FC_SEQ_CTX) 2360 fc_exch_recv_resp(ema->mp, fp); 2361 else /* no EX_CTX and no SEQ_CTX */ 2362 fc_exch_recv_req(lport, ema->mp, fp); 2363 break; 2364 default: 2365 FC_LPORT_DBG(lport, "dropping invalid frame (eof %x)", 2366 fr_eof(fp)); 2367 fc_frame_free(fp); 2368 } 2369 } 2370 EXPORT_SYMBOL(fc_exch_recv); 2371 2372 /** 2373 * fc_exch_init() - Initialize the exchange layer for a local port 2374 * @lport: The local port to initialize the exchange layer for 2375 */ 2376 int fc_exch_init(struct fc_lport *lport) 2377 { 2378 if (!lport->tt.seq_start_next) 2379 lport->tt.seq_start_next = fc_seq_start_next; 2380 2381 if (!lport->tt.seq_set_resp) 2382 lport->tt.seq_set_resp = fc_seq_set_resp; 2383 2384 if (!lport->tt.exch_seq_send) 2385 lport->tt.exch_seq_send = fc_exch_seq_send; 2386 2387 if (!lport->tt.seq_send) 2388 lport->tt.seq_send = fc_seq_send; 2389 2390 if (!lport->tt.seq_els_rsp_send) 2391 lport->tt.seq_els_rsp_send = fc_seq_els_rsp_send; 2392 2393 if (!lport->tt.exch_done) 2394 lport->tt.exch_done = fc_exch_done; 2395 2396 if (!lport->tt.exch_mgr_reset) 2397 lport->tt.exch_mgr_reset = fc_exch_mgr_reset; 2398 2399 if (!lport->tt.seq_exch_abort) 2400 lport->tt.seq_exch_abort = fc_seq_exch_abort; 2401 2402 if (!lport->tt.seq_assign) 2403 lport->tt.seq_assign = fc_seq_assign; 2404 2405 if (!lport->tt.seq_release) 2406 lport->tt.seq_release = fc_seq_release; 2407 2408 return 0; 2409 } 2410 EXPORT_SYMBOL(fc_exch_init); 2411 2412 /** 2413 * fc_setup_exch_mgr() - Setup an exchange manager 2414 */ 2415 int fc_setup_exch_mgr(void) 2416 { 2417 fc_em_cachep = kmem_cache_create("libfc_em", sizeof(struct fc_exch), 2418 0, SLAB_HWCACHE_ALIGN, NULL); 2419 if (!fc_em_cachep) 2420 return -ENOMEM; 2421 2422 /* 2423 * Initialize fc_cpu_mask and fc_cpu_order. The 2424 * fc_cpu_mask is set for nr_cpu_ids rounded up 2425 * to order of 2's * power and order is stored 2426 * in fc_cpu_order as this is later required in 2427 * mapping between an exch id and exch array index 2428 * in per cpu exch pool. 2429 * 2430 * This round up is required to align fc_cpu_mask 2431 * to exchange id's lower bits such that all incoming 2432 * frames of an exchange gets delivered to the same 2433 * cpu on which exchange originated by simple bitwise 2434 * AND operation between fc_cpu_mask and exchange id. 2435 */ 2436 fc_cpu_mask = 1; 2437 fc_cpu_order = 0; 2438 while (fc_cpu_mask < nr_cpu_ids) { 2439 fc_cpu_mask <<= 1; 2440 fc_cpu_order++; 2441 } 2442 fc_cpu_mask--; 2443 2444 fc_exch_workqueue = create_singlethread_workqueue("fc_exch_workqueue"); 2445 if (!fc_exch_workqueue) 2446 return -ENOMEM; 2447 return 0; 2448 } 2449 2450 /** 2451 * fc_destroy_exch_mgr() - Destroy an exchange manager 2452 */ 2453 void fc_destroy_exch_mgr(void) 2454 { 2455 destroy_workqueue(fc_exch_workqueue); 2456 kmem_cache_destroy(fc_em_cachep); 2457 } 2458