[SCSI] libfc: add support of large receive offload by ddp in fc_fcp

When LLD supports direct data placement (ddp) for large receive of an scsi
i/o coming into fc_fcp, we call into libfc_function_template's ddp_setup()
to prepare for a ddp of large receive for this read I/O. When I/O is complete,
we call the corresponding ddp_done() to get the length of data ddped as well
as to let LLD do clean up.

fc_fcp_ddp_setup()/fc_fcp_ddp_done() are added to setup and complete a ddped
read I/O described by the given fc_fcp_pkt. They would call into corresponding
ddp_setup/ddp_done implemented by the fcoe layer. Eventually, fcoe layer calls
into LLD's ddp_setup/ddp_done provided through net_device

Signed-off-by: Yi Zou <yi.zou@intel.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
Yi Zou
2009-02-27 14:07:21 -08:00
committed by James Bottomley
parent 39ca9a065a
commit b277d2aa9a
5 changed files with 95 additions and 37 deletions

View File

@@ -124,24 +124,6 @@ static inline u16 skb_fc_rxid(const struct sk_buff *skb)
return be16_to_cpu(skb_fc_header(skb)->fh_rx_id);
}
/* FIXME - DMA_BIDIRECTIONAL ? */
#define skb_cb(skb) ((struct fcoe_rcv_info *)&((skb)->cb[0]))
#define skb_cmd(skb) (skb_cb(skb)->fr_cmd)
#define skb_dir(skb) (skb_cmd(skb)->sc_data_direction)
static inline bool skb_fc_is_read(const struct sk_buff *skb)
{
if (skb_fc_is_cmd(skb) && skb_cmd(skb))
return skb_dir(skb) == DMA_FROM_DEVICE;
return false;
}
static inline bool skb_fc_is_write(const struct sk_buff *skb)
{
if (skb_fc_is_cmd(skb) && skb_cmd(skb))
return skb_dir(skb) == DMA_TO_DEVICE;
return false;
}
/* libfcoe funcs */
int fcoe_reset(struct Scsi_Host *shost);
u64 fcoe_wwn_from_mac(unsigned char mac[MAX_ADDR_LEN],