Files
scst/fcst/linux-patches/20-seq-set-resp
Joe Eykholt ac5618b07e Adding patches for 2.6.36. These are similar to the 2.6.35 patches
except for line number changes and a few interface changes imposed
by differences in libfc between 2.6.35 and 2.6.36, mostly due to the
change which doesn't allocate an exchange and sequence for incoming
requests.


git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@2804 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2010-11-23 17:56:35 +00:00

85 lines
2.5 KiB
Plaintext

libfc: add method for setting handler for incoming exchange
Add a method for setting handler for incoming exchange.
For multi-sequence exchanges, this allows the target driver
to add a response handler for handling subsequent sequences,
and exchange manager resets.
The new function is called fc_seq_set_resp().
Signed-off-by: Joe Eykholt <jeykholt@cisco.com>
---
drivers/scsi/libfc/fc_exch.c | 19 +++++++++++++++++++
include/scsi/libfc.h | 11 ++++++++++-
2 files changed, 29 insertions(+), 1 deletions(-)
---
diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c
index ec2a1ae..0000ddf 100644
--- a/drivers/scsi/libfc/fc_exch.c
+++ b/drivers/scsi/libfc/fc_exch.c
@@ -544,6 +544,22 @@ static struct fc_seq *fc_seq_start_next(struct fc_seq *sp)
return sp;
}
+/*
+ * Set the response handler for the exchange associated with a sequence.
+ */
+static void fc_seq_set_resp(struct fc_seq *sp,
+ void (*resp)(struct fc_seq *, struct fc_frame *,
+ void *),
+ void *arg)
+{
+ struct fc_exch *ep = fc_seq_exch(sp);
+
+ spin_lock_bh(&ep->ex_lock);
+ ep->resp = resp;
+ ep->arg = arg;
+ spin_unlock_bh(&ep->ex_lock);
+}
+
/**
* fc_seq_exch_abort() - Abort an exchange and sequence
* @req_sp: The sequence to be aborted
@@ -2297,6 +2313,9 @@ int fc_exch_init(struct fc_lport *lport)
if (!lport->tt.seq_start_next)
lport->tt.seq_start_next = fc_seq_start_next;
+ if (!lport->tt.seq_set_resp)
+ lport->tt.seq_set_resp = fc_seq_set_resp;
+
if (!lport->tt.exch_seq_send)
lport->tt.exch_seq_send = fc_exch_seq_send;
diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h
index 8b907e1..06cabab 100644
--- a/include/scsi/libfc.h
+++ b/include/scsi/libfc.h
@@ -564,6 +564,16 @@ struct libfc_function_template {
struct fc_seq *(*seq_assign)(struct fc_lport *, struct fc_frame *);
/*
+ * Set a response handler for the exchange of the sequence.
+ *
+ * STATUS: OPTIONAL
+ */
+ void (*seq_set_resp)(struct fc_seq *sp,
+ void (*resp)(struct fc_seq *, struct fc_frame *,
+ void *),
+ void *arg);
+
+ /*
* Reset an exchange manager, completing all sequences and exchanges.
* If s_id is non-zero, reset only exchanges originating from that FID.
* If d_id is non-zero, reset only exchanges sending to that FID.
@@ -1059,7 +1069,6 @@ void fc_fill_reply_hdr(struct fc_frame *, const struct fc_frame *,
void fc_fill_hdr(struct fc_frame *, const struct fc_frame *,
enum fc_rctl, u32 f_ctl, u16 seq_cnt, u32 parm_offset);
-
/*
* EXCHANGE MANAGER LAYER
*****************************/