|
@@ -751,12 +751,27 @@ static int fcoe_shost_config(struct fc_lport *lport, struct device *dev)
|
|
|
* The offload EM that this routine is associated with will handle any
|
|
|
* packets that are for SCSI read requests.
|
|
|
*
|
|
|
+ * This has been enhanced to work when FCoE stack is operating in target
|
|
|
+ * mode.
|
|
|
+ *
|
|
|
* Returns: True for read types I/O, otherwise returns false.
|
|
|
*/
|
|
|
bool fcoe_oem_match(struct fc_frame *fp)
|
|
|
{
|
|
|
- return fc_fcp_is_read(fr_fsp(fp)) &&
|
|
|
- (fr_fsp(fp)->data_len > fcoe_ddp_min);
|
|
|
+ struct fc_frame_header *fh = fc_frame_header_get(fp);
|
|
|
+ struct fcp_cmnd *fcp;
|
|
|
+
|
|
|
+ if (fc_fcp_is_read(fr_fsp(fp)) &&
|
|
|
+ (fr_fsp(fp)->data_len > fcoe_ddp_min))
|
|
|
+ return true;
|
|
|
+ else if (!(ntoh24(fh->fh_f_ctl) & FC_FC_EX_CTX)) {
|
|
|
+ fcp = fc_frame_payload_get(fp, sizeof(*fcp));
|
|
|
+ if (ntohs(fh->fh_rx_id) == FC_XID_UNKNOWN &&
|
|
|
+ fcp && (ntohl(fcp->fc_dl) > fcoe_ddp_min) &&
|
|
|
+ (fcp->fc_flags & FCP_CFL_WRDATA))
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
/**
|