aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/libfc/fc_exch.c25
-rw-r--r--include/scsi/libfc.h7
2 files changed, 32 insertions, 0 deletions
diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c
index 61eabd3ce436..027042a6de3b 100644
--- a/drivers/scsi/libfc/fc_exch.c
+++ b/drivers/scsi/libfc/fc_exch.c
@@ -1231,6 +1231,28 @@ free:
1231} 1231}
1232 1232
1233/** 1233/**
1234 * fc_seq_assign() - Assign exchange and sequence for incoming request
1235 * @lport: The local port that received the request
1236 * @fp: The request frame
1237 *
1238 * On success, the sequence pointer will be returned and also in fr_seq(@fp).
1239 */
1240static struct fc_seq *fc_seq_assign(struct fc_lport *lport, struct fc_frame *fp)
1241{
1242 struct fc_exch_mgr_anchor *ema;
1243
1244 WARN_ON(lport != fr_dev(fp));
1245 WARN_ON(fr_seq(fp));
1246 fr_seq(fp) = NULL;
1247
1248 list_for_each_entry(ema, &lport->ema_list, ema_list)
1249 if ((!ema->match || ema->match(fp)) &&
1250 fc_seq_lookup_recip(lport, ema->mp, fp) != FC_RJT_NONE)
1251 break;
1252 return fr_seq(fp);
1253}
1254
1255/**
1234 * fc_exch_recv_req() - Handler for an incoming request where is other 1256 * fc_exch_recv_req() - Handler for an incoming request where is other
1235 * end is originating the sequence 1257 * end is originating the sequence
1236 * @lport: The local port that received the request 1258 * @lport: The local port that received the request
@@ -2283,6 +2305,9 @@ int fc_exch_init(struct fc_lport *lport)
2283 if (!lport->tt.seq_exch_abort) 2305 if (!lport->tt.seq_exch_abort)
2284 lport->tt.seq_exch_abort = fc_seq_exch_abort; 2306 lport->tt.seq_exch_abort = fc_seq_exch_abort;
2285 2307
2308 if (!lport->tt.seq_assign)
2309 lport->tt.seq_assign = fc_seq_assign;
2310
2286 return 0; 2311 return 0;
2287} 2312}
2288EXPORT_SYMBOL(fc_exch_init); 2313EXPORT_SYMBOL(fc_exch_init);
diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h
index a6414ec63809..605f1d7861a7 100644
--- a/include/scsi/libfc.h
+++ b/include/scsi/libfc.h
@@ -556,6 +556,13 @@ struct libfc_function_template {
556 struct fc_seq *(*seq_start_next)(struct fc_seq *); 556 struct fc_seq *(*seq_start_next)(struct fc_seq *);
557 557
558 /* 558 /*
559 * Assign a sequence for an incoming request frame.
560 *
561 * STATUS: OPTIONAL
562 */
563 struct fc_seq *(*seq_assign)(struct fc_lport *, struct fc_frame *);
564
565 /*
559 * Reset an exchange manager, completing all sequences and exchanges. 566 * Reset an exchange manager, completing all sequences and exchanges.
560 * If s_id is non-zero, reset only exchanges originating from that FID. 567 * If s_id is non-zero, reset only exchanges originating from that FID.
561 * If d_id is non-zero, reset only exchanges sending to that FID. 568 * If d_id is non-zero, reset only exchanges sending to that FID.