diff options
author | Joe Eykholt <jeykholt@cisco.com> | 2009-11-03 11:49:00 -0800 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2009-12-04 12:01:17 -0600 |
commit | 52a6690d3f0cb7414c34b1e26c569b32d4987662 (patch) | |
tree | cbb8ff950e319b9d3f7125ce882cf9eeea22ef3b /drivers | |
parent | 5f9a056db9c7973c46337ec8d034323aa72bf206 (diff) | |
download | blackbird-op-linux-52a6690d3f0cb7414c34b1e26c569b32d4987662.tar.gz blackbird-op-linux-52a6690d3f0cb7414c34b1e26c569b32d4987662.zip |
[SCSI] libfc: fix fc_els_resp_type to correct display of CT responses
Local port debug messages were using fc_els_resp_type() which showed
all CT responses as rejects.
Handle CT responses correctly based by inspecting fh_type.
I decided not to rename the function to keep the patch smaller.
We could call it just fc_resp_type() or fc_elsct_resp_type().
Signed-off-by: Joe Eykholt <jeykholt@cisco.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/libfc/fc_elsct.c | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/drivers/scsi/libfc/fc_elsct.c b/drivers/scsi/libfc/fc_elsct.c index 01be43f80f34..53748724f2c5 100644 --- a/drivers/scsi/libfc/fc_elsct.c +++ b/drivers/scsi/libfc/fc_elsct.c @@ -90,6 +90,9 @@ EXPORT_SYMBOL(fc_elsct_init); const char *fc_els_resp_type(struct fc_frame *fp) { const char *msg; + struct fc_frame_header *fh; + struct fc_ct_hdr *ct; + if (IS_ERR(fp)) { switch (-PTR_ERR(fp)) { case FC_NO_ERR: @@ -106,15 +109,41 @@ const char *fc_els_resp_type(struct fc_frame *fp) break; } } else { - switch (fc_frame_payload_op(fp)) { - case ELS_LS_ACC: - msg = "accept"; + fh = fc_frame_header_get(fp); + switch (fh->fh_type) { + case FC_TYPE_ELS: + switch (fc_frame_payload_op(fp)) { + case ELS_LS_ACC: + msg = "accept"; + break; + case ELS_LS_RJT: + msg = "reject"; + break; + default: + msg = "response unknown ELS"; + break; + } break; - case ELS_LS_RJT: - msg = "reject"; + case FC_TYPE_CT: + ct = fc_frame_payload_get(fp, sizeof(*ct)); + if (ct) { + switch (ntohs(ct->ct_cmd)) { + case FC_FS_ACC: + msg = "CT accept"; + break; + case FC_FS_RJT: + msg = "CT reject"; + break; + default: + msg = "response unknown CT"; + break; + } + } else { + msg = "short CT response"; + } break; default: - msg = "response unknown ELS"; + msg = "response not ELS or CT"; break; } } |