aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/fcoe
diff options
context:
space:
mode:
authorKiran Patil <kiran.patil@intel.com>2011-06-20 19:59:15 -0400
committerJames Bottomley <JBottomley@Parallels.com>2011-06-29 17:29:24 -0400
commit1ff9918b625457ce20d450d00f9ed0a12ba191b7 (patch)
tree221a8ce7f34b6b98bd4f29c7eeefdb115a2618c1 /drivers/scsi/fcoe
parent71f894915aa6680dbce2ff727fb9237c4f7ac373 (diff)
[SCSI] fcoe: Unable to select the exchangeID from offload pool for storage targets
Problem: When initiator sends write command to target, target tries to assign new sequence. It allocates new exchangeID (RX_ID) always from non-offloaded pool (Non-offload EMA) Fix: Enhanced fcoe_oem_match routine to look at F_CTL flags and if it is exchange responder and command type is WRITEDATA, then function returns TRUE instead of FALSE. This function is used to determine which pool to use (offload pool of exchange is used only if this function returns TRUE). Technical Notes: N/A Signed-off-by: Kiran Patil <kiran.patil@intel.com> Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/fcoe')
-rw-r--r--drivers/scsi/fcoe/fcoe.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
index f76a321ecb15..6378c5883514 100644
--- a/drivers/scsi/fcoe/fcoe.c
+++ b/drivers/scsi/fcoe/fcoe.c
@@ -751,12 +751,27 @@ static int fcoe_shost_config(struct fc_lport *lport, struct device *dev)
751 * The offload EM that this routine is associated with will handle any 751 * The offload EM that this routine is associated with will handle any
752 * packets that are for SCSI read requests. 752 * packets that are for SCSI read requests.
753 * 753 *
754 * This has been enhanced to work when FCoE stack is operating in target
755 * mode.
756 *
754 * Returns: True for read types I/O, otherwise returns false. 757 * Returns: True for read types I/O, otherwise returns false.
755 */ 758 */
756bool fcoe_oem_match(struct fc_frame *fp) 759bool fcoe_oem_match(struct fc_frame *fp)
757{ 760{
758 return fc_fcp_is_read(fr_fsp(fp)) && 761 struct fc_frame_header *fh = fc_frame_header_get(fp);
759 (fr_fsp(fp)->data_len > fcoe_ddp_min); 762 struct fcp_cmnd *fcp;
763
764 if (fc_fcp_is_read(fr_fsp(fp)) &&
765 (fr_fsp(fp)->data_len > fcoe_ddp_min))
766 return true;
767 else if (!(ntoh24(fh->fh_f_ctl) & FC_FC_EX_CTX)) {
768 fcp = fc_frame_payload_get(fp, sizeof(*fcp));
769 if (ntohs(fh->fh_rx_id) == FC_XID_UNKNOWN &&
770 fcp && (ntohl(fcp->fc_dl) > fcoe_ddp_min) &&
771 (fcp->fc_flags & FCP_CFL_WRDATA))
772 return true;
773 }
774 return false;
760} 775}
761 776
762/** 777/**