* [PATCH 1/7] net: add ETH_P_FCOE for Fibre Channel over Ethernet (FCoE) [not found] <20090219194734.22270.8445.stgit@zychengdu.jf.intel.com> @ 2009-02-19 19:49 ` Yi Zou 2009-02-19 19:49 ` [PATCH 2/7] net: add FCoE offload support through net_device Yi Zou ` (5 subsequent siblings) 6 siblings, 0 replies; 13+ messages in thread From: Yi Zou @ 2009-02-19 19:49 UTC (permalink / raw) To: linux-scsi, netdev This adds eth type ETH_P_FCOE for Fibre Channel over Ethernet (FCoE) Signed-off-by: Yi Zou <yi.zou@intel.com> --- include/linux/if_ether.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h index 7f3c735..59d197c 100644 --- a/include/linux/if_ether.h +++ b/include/linux/if_ether.h @@ -78,6 +78,7 @@ #define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ #define ETH_P_AOE 0x88A2 /* ATA over Ethernet */ #define ETH_P_TIPC 0x88CA /* TIPC */ +#define ETH_P_FCOE 0x8906 /* Fibre Channel over Ethernet */ #define ETH_P_EDSA 0xDADA /* Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ] */ /* ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 2/7] net: add FCoE offload support through net_device [not found] <20090219194734.22270.8445.stgit@zychengdu.jf.intel.com> 2009-02-19 19:49 ` [PATCH 1/7] net: add ETH_P_FCOE for Fibre Channel over Ethernet (FCoE) Yi Zou @ 2009-02-19 19:49 ` Yi Zou 2009-02-19 21:24 ` Stephen Hemminger 2009-02-19 19:49 ` [PATCH 3/7] fcoe: check offload features from LLD through netdev Yi Zou ` (4 subsequent siblings) 6 siblings, 1 reply; 13+ messages in thread From: Yi Zou @ 2009-02-19 19:49 UTC (permalink / raw) To: linux-scsi, netdev This adds a "struct net_fcoe_ops *fcoe_ops" to net_device struct so any network adapter driver can provide Fiber Channle over Ethernet (FCoE) offload support through net_device. The fcoe_ops is only available when FCoE is enabled in kernel as built-in or module driver. Signed-off-by: Yi Zou <yi.zou@intel.com> --- include/linux/netdevice.h | 8 ++++++++ include/linux/netfcoe.h | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 0 deletions(-) create mode 100644 include/linux/netfcoe.h diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index ec54785..faf85be 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -47,6 +47,10 @@ #include <net/dcbnl.h> #endif +#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) +#include <linux/netfcoe.h> +#endif + struct vlan_group; struct ethtool_ops; struct netpoll_info; @@ -840,6 +844,10 @@ struct net_device struct dcbnl_rtnl_ops *dcbnl_ops; #endif +#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) + struct net_fcoe_ops *fcoe_ops; +#endif + #ifdef CONFIG_COMPAT_NET_DEV_OPS struct { int (*init)(struct net_device *dev); diff --git a/include/linux/netfcoe.h b/include/linux/netfcoe.h new file mode 100644 index 0000000..9d6d64d --- /dev/null +++ b/include/linux/netfcoe.h @@ -0,0 +1,36 @@ +/* + * Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. + * + * Maintained at www.Open-FCoE.org + */ +#ifndef __NET_FCOE_H__ +#define __NET_FCOE_H__ + +#define NET_FCOE_CRC (1 << 0) /* FC CRC32 offload */ +#define NET_FCOE_LSO (1 << 1) /* Large send offload */ +#define NET_FCOE_LRO (1 << 2) /* Large receive offload */ +/* + * Ops struct for FCoE enabled drivers to callback through the netdevice struct + */ +struct net_fcoe_ops { + u16 lro_xid; + u32 features; + int (*ddp_setup)(struct net_device *netdev, u16 xid, + struct scatterlist *sgl, unsigned int nents); + int (*ddp_done)(struct net_device *netdev, u16 xid); +}; + +#endif /* __NET_FCOE_H__ */ ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 2/7] net: add FCoE offload support through net_device 2009-02-19 19:49 ` [PATCH 2/7] net: add FCoE offload support through net_device Yi Zou @ 2009-02-19 21:24 ` Stephen Hemminger 2009-02-19 21:32 ` Zou, Yi 0 siblings, 1 reply; 13+ messages in thread From: Stephen Hemminger @ 2009-02-19 21:24 UTC (permalink / raw) To: Yi Zou; +Cc: linux-scsi, netdev On Thu, 19 Feb 2009 12:49:49 -0700 Yi Zou <yi.zou@intel.com> wrote: > This adds a "struct net_fcoe_ops *fcoe_ops" to net_device struct so any > network adapter driver can provide Fiber Channle over Ethernet (FCoE) offload > support through net_device. The fcoe_ops is only available when FCoE is > enabled in kernel as built-in or module driver. > > Signed-off-by: Yi Zou <yi.zou@intel.com> Rather than adding another _ops structure please add to existing netdevice_ops. You don't need the flags that way. If netdevice_ops has fcoe_setup, then device can do it... ^ permalink raw reply [flat|nested] 13+ messages in thread
* RE: [PATCH 2/7] net: add FCoE offload support through net_device 2009-02-19 21:24 ` Stephen Hemminger @ 2009-02-19 21:32 ` Zou, Yi 2009-02-20 23:21 ` Zou, Yi 0 siblings, 1 reply; 13+ messages in thread From: Zou, Yi @ 2009-02-19 21:32 UTC (permalink / raw) To: Stephen Hemminger; +Cc: linux-scsi@vger.kernel.org, netdev@vger.kernel.org >On Thu, 19 Feb 2009 12:49:49 -0700 >Yi Zou <yi.zou@intel.com> wrote: > >> This adds a "struct net_fcoe_ops *fcoe_ops" to net_device struct so >any >> network adapter driver can provide Fiber Channle over Ethernet (FCoE) >offload >> support through net_device. The fcoe_ops is only available when FCoE >is >> enabled in kernel as built-in or module driver. >> >> Signed-off-by: Yi Zou <yi.zou@intel.com> > >Rather than adding another _ops structure please add to existing >netdevice_ops. You don't need the flags that way. If netdevice_ops >has fcoe_setup, then device can do it... The comments in struct net_device_ops says for management hooks, if that's an ok place for net_fcoe_ops, then, I am all for it. Thanks. yi ^ permalink raw reply [flat|nested] 13+ messages in thread
* RE: [PATCH 2/7] net: add FCoE offload support through net_device 2009-02-19 21:32 ` Zou, Yi @ 2009-02-20 23:21 ` Zou, Yi 2009-02-20 23:27 ` Stephen Hemminger 0 siblings, 1 reply; 13+ messages in thread From: Zou, Yi @ 2009-02-20 23:21 UTC (permalink / raw) To: Stephen Hemminger; +Cc: linux-scsi@vger.kernel.org, netdev@vger.kernel.org >>On Thu, 19 Feb 2009 12:49:49 -0700 >>Yi Zou <yi.zou@intel.com> wrote: >> >>> This adds a "struct net_fcoe_ops *fcoe_ops" to net_device struct so >>any >>> network adapter driver can provide Fiber Channle over Ethernet (FCoE) >>offload >>> support through net_device. The fcoe_ops is only available when FCoE >>is >>> enabled in kernel as built-in or module driver. >>> >>> Signed-off-by: Yi Zou <yi.zou@intel.com> >> >>Rather than adding another _ops structure please add to existing >>netdevice_ops. You don't need the flags that way. If netdevice_ops >>has fcoe_setup, then device can do it... >The comments in struct net_device_ops says for management hooks, if >that's an ok place for net_fcoe_ops, then, I am all for it. > >Thanks. > >yi Hi, Stephen, Regarding your comment about adding net_fcoe_ops to net_device_ops, the net_fcoe_ops contains function pointers ad well as data members, where net_device_ops seems to me is the placeholder only for function pointers. So I think it is still better to still leave the net_fcoe_ops to net_device. Let me know what you think. Thanks, yi ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/7] net: add FCoE offload support through net_device 2009-02-20 23:21 ` Zou, Yi @ 2009-02-20 23:27 ` Stephen Hemminger 0 siblings, 0 replies; 13+ messages in thread From: Stephen Hemminger @ 2009-02-20 23:27 UTC (permalink / raw) To: Zou, Yi; +Cc: linux-scsi@vger.kernel.org, netdev@vger.kernel.org On Fri, 20 Feb 2009 15:21:42 -0800 "Zou, Yi" <yi.zou@intel.com> wrote: > >>On Thu, 19 Feb 2009 12:49:49 -0700 > >>Yi Zou <yi.zou@intel.com> wrote: > >> > >>> This adds a "struct net_fcoe_ops *fcoe_ops" to net_device struct so > >>any > >>> network adapter driver can provide Fiber Channle over Ethernet (FCoE) > >>offload > >>> support through net_device. The fcoe_ops is only available when FCoE > >>is > >>> enabled in kernel as built-in or module driver. > >>> > >>> Signed-off-by: Yi Zou <yi.zou@intel.com> > >> > >>Rather than adding another _ops structure please add to existing > >>netdevice_ops. You don't need the flags that way. If netdevice_ops > >>has fcoe_setup, then device can do it... > >The comments in struct net_device_ops says for management hooks, if > >that's an ok place for net_fcoe_ops, then, I am all for it. > > > >Thanks. > > > >yi > > Hi, Stephen, > Regarding your comment about adding net_fcoe_ops to net_device_ops, > the net_fcoe_ops contains function pointers ad well as data members, > where net_device_ops seems to me is the placeholder only for function > pointers. So I think it is still better to still leave > the net_fcoe_ops to net_device. Let me know what you think. > > Thanks, > yi Data members go in net_device (because they are per device instance). Put fcoe stuff in net_device_ops. Ideally, it should look like TSO and GRO; with standard ethtool type config? ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 3/7] fcoe: check offload features from LLD through netdev [not found] <20090219194734.22270.8445.stgit@zychengdu.jf.intel.com> 2009-02-19 19:49 ` [PATCH 1/7] net: add ETH_P_FCOE for Fibre Channel over Ethernet (FCoE) Yi Zou 2009-02-19 19:49 ` [PATCH 2/7] net: add FCoE offload support through net_device Yi Zou @ 2009-02-19 19:49 ` Yi Zou 2009-02-19 19:50 ` [PATCH 4/7] libfc: add support of large receive offload by ddp in fc_fcp Yi Zou ` (3 subsequent siblings) 6 siblings, 0 replies; 13+ messages in thread From: Yi Zou @ 2009-02-19 19:49 UTC (permalink / raw) To: linux-scsi, netdev This checkes if net_devices supports net_fcoe_ops, if it does, then sets up the corresponding flags in the associated fc_lport. Note that large sequence offload is already supported in the current libfc/fcoe, only thing needed is to tell the corresponding fc_lport that LLD is capabale of doing so by using fcoe_ops->features. Signed-off-by: Yi Zou <yi.zou@intel.com> --- drivers/scsi/fcoe/fcoe_sw.c | 27 +++++++++++++++++++++++++++ 1 files changed, 27 insertions(+), 0 deletions(-) diff --git a/drivers/scsi/fcoe/fcoe_sw.c b/drivers/scsi/fcoe/fcoe_sw.c index fe1bcaa..7632d7e 100644 --- a/drivers/scsi/fcoe/fcoe_sw.c +++ b/drivers/scsi/fcoe/fcoe_sw.c @@ -188,6 +188,33 @@ static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev) if (fc->real_dev->features & NETIF_F_SG) lp->sg_supp = 1; + lp->crc_offload = 0; + lp->seq_offload = 0; + lp->lro_enabled = 0; + if (netdev->fcoe_ops) { + struct net_fcoe_ops *fops = netdev->fcoe_ops; + + if (fops->features & NET_FCOE_CRC) { + lp->crc_offload = 1; + FCOE_DBG("%s supports FCoE FCCRC offload\n", + netdev->name); + } + + if (fops->features & NET_FCOE_LSO) { + lp->seq_offload = 1; + FCOE_DBG("%s supports FCoE large send offload\n", + netdev->name); + } + + if ((fops->features & NET_FCOE_LRO) && + (fops->lro_xid)) { + lp->lro_enabled = 1; + lp->lro_xid = fops->lro_xid; + FCOE_DBG("%s supports FCoE large receive offload " + "with max read exchange id for ddp %d\n", + netdev->name, lp->lro_xid); + } + } skb_queue_head_init(&fc->fcoe_pending_queue); ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 4/7] libfc: add support of large receive offload by ddp in fc_fcp [not found] <20090219194734.22270.8445.stgit@zychengdu.jf.intel.com> ` (2 preceding siblings ...) 2009-02-19 19:49 ` [PATCH 3/7] fcoe: check offload features from LLD through netdev Yi Zou @ 2009-02-19 19:50 ` Yi Zou 2009-02-19 19:50 ` [PATCH 5/7] fcoe: add support to net_fcoe_ops in fcoe_sw Yi Zou ` (2 subsequent siblings) 6 siblings, 0 replies; 13+ messages in thread From: Yi Zou @ 2009-02-19 19:50 UTC (permalink / raw) To: linux-scsi, netdev 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. Summary of changes: 1. Added ddp_setup()/ddp_done() to libfc_function_template and they are expected to be impleted by fcoe layer 2. Added exch_send() to seperate exch_alloc() from exch_seq_send in fc_fcp_cmd_send() since that's where we call ddp_setup() and we have to have know the exchange xid. 3. Added calling lp->tt.ddp_setup() for read I/O if lro_enabled is set. When ddp_setup is successful, xfer_ddp stores the corresponding exchange xid. 4. Added calling lp->tt.ddp_done() to fc_fcp_resp() to update the xfer_len for the case of a normal complete ddp and let the LLD release ddp resource. 5. Added calling lp->tt.ddp_done() to fc_fcp_recv_data() to update the xfer_len for the case of an incomplete ddp 6. Added calling lp->tt.ddp_done() to fc_io_compl() for an ddped I/O to make sure ddp resource is released in case of abort 7. Also removed clearing of lro_enabled flag in fc_exch_mgr_alloc() since that is taken care of by fcoe_sw_netdev_config() now. Signed-off-by: Yi Zou <yi.zou@intel.com> --- drivers/scsi/libfc/fc_exch.c | 46 +++++++++++++++++++++++++++--------------- drivers/scsi/libfc/fc_fcp.c | 36 +++++++++++++++++++++++++++++++-- include/scsi/libfc.h | 46 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 18 deletions(-) diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c index 2fb2282..8faf5e8 100644 --- a/drivers/scsi/libfc/fc_exch.c +++ b/drivers/scsi/libfc/fc_exch.c @@ -1753,9 +1753,6 @@ struct fc_exch_mgr *fc_exch_mgr_alloc(struct fc_lport *lp, mp->max_read = lp->lro_xid; mp->last_read = min_xid - 1; mp->last_xid = mp->max_read; - } else { - /* disable lro if no xid control over read */ - lp->lro_enabled = 0; } INIT_LIST_HEAD(&mp->ex_list); @@ -1795,24 +1792,19 @@ struct fc_exch *fc_exch_get(struct fc_lport *lp, struct fc_frame *fp) } EXPORT_SYMBOL(fc_exch_get); -struct fc_seq *fc_exch_seq_send(struct fc_lport *lp, - struct fc_frame *fp, - void (*resp)(struct fc_seq *, - struct fc_frame *fp, - void *arg), - void (*destructor)(struct fc_seq *, void *), - void *arg, u32 timer_msec) +struct fc_seq *fc_exch_send(struct fc_lport *lp, + struct fc_exch *ep, + struct fc_frame *fp, + void (*resp)(struct fc_seq *, + struct fc_frame *fp, + void *arg), + void (*destructor)(struct fc_seq *, void *), + void *arg, u32 timer_msec) { - struct fc_exch *ep; struct fc_seq *sp = NULL; struct fc_frame_header *fh; int rc = 1; - ep = lp->tt.exch_get(lp, fp); - if (!ep) { - fc_frame_free(fp); - return NULL; - } ep->esb_stat |= ESB_ST_SEQ_INIT; fh = fc_frame_header_get(fp); fc_exch_set_addr(ep, ntoh24(fh->fh_s_id), ntoh24(fh->fh_d_id)); @@ -1846,6 +1838,25 @@ err: fc_exch_mgr_delete_ep(ep); return NULL; } +EXPORT_SYMBOL(fc_exch_send); + +struct fc_seq *fc_exch_seq_send(struct fc_lport *lp, + struct fc_frame *fp, + void (*resp)(struct fc_seq *, + struct fc_frame *fp, + void *arg), + void (*destructor)(struct fc_seq *, void *), + void *arg, u32 timer_msec) +{ + struct fc_exch *ep; + + ep = lp->tt.exch_get(lp, fp); + if (!ep) { + fc_frame_free(fp); + return NULL; + } + return fc_exch_send(lp, ep, fp, resp, destructor, arg, timer_msec); +} EXPORT_SYMBOL(fc_exch_seq_send); /* @@ -1906,6 +1917,9 @@ int fc_exch_init(struct fc_lport *lp) if (!lp->tt.seq_start_next) lp->tt.seq_start_next = fc_seq_start_next; + if (!lp->tt.exch_send) + lp->tt.exch_send = fc_exch_send; + if (!lp->tt.exch_seq_send) lp->tt.exch_seq_send = fc_exch_seq_send; diff --git a/drivers/scsi/libfc/fc_fcp.c b/drivers/scsi/libfc/fc_fcp.c index 92a72c7..c6ef7fe 100644 --- a/drivers/scsi/libfc/fc_fcp.c +++ b/drivers/scsi/libfc/fc_fcp.c @@ -285,6 +285,11 @@ static void fc_fcp_recv_data(struct fc_fcp_pkt *fsp, struct fc_frame *fp) len = fr_len(fp) - sizeof(*fh); buf = fc_frame_payload_get(fp, 0); + /* if this I/O is ddped, update xfer len */ + if (fsp->xfer_ddp && lp->tt.ddp_done) { + fsp->xfer_len = lp->tt.ddp_done(lp, fsp->xfer_ddp); + fsp->xfer_ddp = 0; + } if (offset + len > fsp->data_len) { /* this should never happen */ if ((fr_flags(fp) & FCPHF_CRC_UNCHECKED) && @@ -740,6 +745,12 @@ static void fc_fcp_resp(struct fc_fcp_pkt *fsp, struct fc_frame *fp) fsp->scsi_comp_flags = flags; expected_len = fsp->data_len; + /* if ddp, update xfer len */ + if (fsp->xfer_ddp && fsp->lp->tt.ddp_done) { + fsp->xfer_len = fsp->lp->tt.ddp_done(fsp->lp, fsp->xfer_ddp); + fsp->xfer_ddp = 0; + } + if (unlikely((flags & ~FCP_CONF_REQ) || fc_rp->fr_status)) { rp_ex = (void *)(fc_rp + 1); if (flags & (FCP_RSP_LEN_VAL | FCP_SNS_LEN_VAL)) { @@ -987,6 +998,7 @@ static int fc_fcp_cmd_send(struct fc_lport *lp, struct fc_fcp_pkt *fsp, { struct fc_frame *fp; struct fc_seq *seq; + struct fc_exch *ep; struct fc_rport *rport; struct fc_rport_libfc_priv *rp; const size_t len = sizeof(fsp->cdb_cmd); @@ -1011,7 +1023,21 @@ static int fc_fcp_cmd_send(struct fc_lport *lp, struct fc_fcp_pkt *fsp, fc_host_port_id(rp->local_port->host), FC_TYPE_FCP, FC_FC_FIRST_SEQ | FC_FC_END_SEQ | FC_FC_SEQ_INIT, 0); - seq = lp->tt.exch_seq_send(lp, fp, resp, fc_fcp_pkt_destroy, fsp, 0); + ep = lp->tt.exch_get(lp, fp); + if (!ep) { + fc_frame_free(fp); + goto unlock; + rc = -1; + } + + if ((fsp->req_flags & FC_SRB_READ) && + (lp->lro_enabled) && (lp->tt.ddp_setup)) { + if (lp->tt.ddp_setup(lp, ep->xid, scsi_sglist(fsp->cmd), + scsi_sg_count(fsp->cmd))) + fsp->xfer_ddp = ep->xid; + } + + seq = lp->tt.exch_send(lp, ep, fp, resp, fc_fcp_pkt_destroy, fsp, 0); if (!seq) { fc_frame_free(fp); rc = -1; @@ -1736,6 +1762,13 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp) struct fc_lport *lp; unsigned long flags; + /* release outstanding ddp context */ + lp = fsp->lp; + if (fsp->xfer_ddp && lp->tt.ddp_done) { + lp->tt.ddp_done(lp, fsp->xfer_ddp); + fsp->xfer_ddp = 0; + } + fsp->state |= FC_SRB_COMPL; if (!(fsp->state & FC_SRB_FCP_PROCESSING_TMO)) { spin_unlock_bh(&fsp->scsi_pkt_lock); @@ -1743,7 +1776,6 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp) spin_lock_bh(&fsp->scsi_pkt_lock); } - lp = fsp->lp; si = fc_get_scsi_internal(lp); spin_lock_irqsave(lp->host->host_lock, flags); if (!fsp->cmd) { diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h index a4c6050..c7fc122 100644 --- a/include/scsi/libfc.h +++ b/include/scsi/libfc.h @@ -274,6 +274,7 @@ struct fc_fcp_pkt { */ struct fcp_cmnd cdb_cmd; size_t xfer_len; + u16 xfer_ddp; /* this xfer is ddped */ u32 xfer_contig_end; /* offset of end of contiguous xfer */ u16 max_payload; /* max payload size in bytes */ @@ -429,6 +430,37 @@ struct libfc_function_template { void *arg, unsigned int timer_msec); /* + * This does the same job like exch_seq_send() except that the caller + * must allocate the exchange itself and pass it to exch_send() + * + * STATUS: OPTIONAL + */ + struct fc_seq *(*exch_send)(struct fc_lport *lp, + struct fc_exch *ep, + struct fc_frame *fp, + void (*resp)(struct fc_seq *sp, + struct fc_frame *fp, + void *arg), + void (*destructor)(struct fc_seq *sp, + void *arg), + void *arg, unsigned int timer_msec); + + /* + * Sets up the DDP context for a given exchange id on the given + * scatterlist if LLD supports DDP for large receive. + * + * STATUS: OPTIONAL + */ + int (*ddp_setup)(struct fc_lport *lp, u16 xid, + struct scatterlist *sgl, unsigned int sgc); + /* + * Completes the DDP transfer and returns the length of data DDPed + * for the given exchange id. + * + * STATUS: OPTIONAL + */ + int (*ddp_done)(struct fc_lport *lp, u16 xid); + /* * Send a frame using an existing sequence and exchange. * * STATUS: OPTIONAL @@ -917,6 +949,20 @@ struct fc_seq *fc_exch_seq_send(struct fc_lport *lp, void (*destructor)(struct fc_seq *sp, void *arg), void *arg, u32 timer_msec); +/* + * This function is for exch_send function pointer in + * struct libfc_function_template, see comment block on + * exch_send for description of this function. + */ +struct fc_seq *fc_exch_send(struct fc_lport *lp, + struct fc_exch *ep, + struct fc_frame *fp, + void (*resp)(struct fc_seq *sp, + struct fc_frame *fp, + void *arg), + void (*destructor)(struct fc_seq *sp, + void *arg), + void *arg, u32 timer_msec); /* * send a frame using existing sequence and exchange. ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 5/7] fcoe: add support to net_fcoe_ops in fcoe_sw [not found] <20090219194734.22270.8445.stgit@zychengdu.jf.intel.com> ` (3 preceding siblings ...) 2009-02-19 19:50 ` [PATCH 4/7] libfc: add support of large receive offload by ddp in fc_fcp Yi Zou @ 2009-02-19 19:50 ` Yi Zou 2009-02-19 19:50 ` [PATCH 6/7] fcoe: remove ETH_P_FCOE from fc_fcoe.h Yi Zou 2009-02-19 19:50 ` [PATCH 7/7] fcoe: fcoe fc crc offload indication by skb->ip_summed Yi Zou 6 siblings, 0 replies; 13+ messages in thread From: Yi Zou @ 2009-02-19 19:50 UTC (permalink / raw) To: linux-scsi, netdev This adds implementation of ddp_setup()/ddp_done() in fcoe_sw for its fcoe_sw_libfc_fcn_templ. Signed-off-by: Yi Zou <yi.zou@intel.com> --- drivers/scsi/fcoe/fcoe_sw.c | 37 +++++++++++++++++++++++++++++++++++++ 1 files changed, 37 insertions(+), 0 deletions(-) diff --git a/drivers/scsi/fcoe/fcoe_sw.c b/drivers/scsi/fcoe/fcoe_sw.c index 7632d7e..57f7a51 100644 --- a/drivers/scsi/fcoe/fcoe_sw.c +++ b/drivers/scsi/fcoe/fcoe_sw.c @@ -373,8 +373,45 @@ static int fcoe_sw_destroy(struct net_device *netdev) return 0; } +/* + * fcoe_sw_ddp_setup - calls LLD's ddp_setup through net_device + * @lp: the corresponding fc_lport + * @xid: the exchange id for this ddp transfer + * @sgl: the scatterlist describing this transfer + * @sgc: number of sg items + * + * Returns : 0 no ddp + */ +static int fcoe_sw_ddp_setup(struct fc_lport *lp, u16 xid, + struct scatterlist *sgl, unsigned int sgc) +{ + struct net_device *ndev = fcoe_netdev(lp); + + if (ndev->fcoe_ops && ndev->fcoe_ops->ddp_setup) + return ndev->fcoe_ops->ddp_setup(ndev, xid, sgl, sgc); + return 0; +} + +/* + * fcoe_sw_ddp_done - calls LLD's ddp_done through net_device + * @lp: the corresponding fc_lport + * @xid: the exchange id for this ddp transfer + * + * Returns : the length of data that have been completed by ddp + */ +static int fcoe_sw_ddp_done(struct fc_lport *lp, u16 xid) +{ + struct net_device *ndev = fcoe_netdev(lp); + + if (ndev->fcoe_ops && ndev->fcoe_ops->ddp_done) + return ndev->fcoe_ops->ddp_done(ndev, xid); + return 0; +} + static struct libfc_function_template fcoe_sw_libfc_fcn_templ = { .frame_send = fcoe_xmit, + .ddp_setup = fcoe_sw_ddp_setup, + .ddp_done = fcoe_sw_ddp_done, }; /** ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 6/7] fcoe: remove ETH_P_FCOE from fc_fcoe.h [not found] <20090219194734.22270.8445.stgit@zychengdu.jf.intel.com> ` (4 preceding siblings ...) 2009-02-19 19:50 ` [PATCH 5/7] fcoe: add support to net_fcoe_ops in fcoe_sw Yi Zou @ 2009-02-19 19:50 ` Yi Zou 2009-02-19 21:25 ` Stephen Hemminger 2009-02-19 19:50 ` [PATCH 7/7] fcoe: fcoe fc crc offload indication by skb->ip_summed Yi Zou 6 siblings, 1 reply; 13+ messages in thread From: Yi Zou @ 2009-02-19 19:50 UTC (permalink / raw) To: linux-scsi, netdev No need to have ETH_P_FCOE in fc_fcoe.h as it is now defined in if_ether.h Signed-off-by: Yi Zou <yi.zou@intel.com> --- include/scsi/fc/fc_fcoe.h | 7 ------- 1 files changed, 0 insertions(+), 7 deletions(-) diff --git a/include/scsi/fc/fc_fcoe.h b/include/scsi/fc/fc_fcoe.h index f271d9c..ccb3dbe 100644 --- a/include/scsi/fc/fc_fcoe.h +++ b/include/scsi/fc/fc_fcoe.h @@ -25,13 +25,6 @@ */ /* - * The FCoE ethertype eventually goes in net/if_ether.h. - */ -#ifndef ETH_P_FCOE -#define ETH_P_FCOE 0x8906 /* FCOE ether type */ -#endif - -/* * FC_FCOE_OUI hasn't been standardized yet. XXX TBD. */ #ifndef FC_FCOE_OUI ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 6/7] fcoe: remove ETH_P_FCOE from fc_fcoe.h 2009-02-19 19:50 ` [PATCH 6/7] fcoe: remove ETH_P_FCOE from fc_fcoe.h Yi Zou @ 2009-02-19 21:25 ` Stephen Hemminger 2009-02-19 21:49 ` Zou, Yi 0 siblings, 1 reply; 13+ messages in thread From: Stephen Hemminger @ 2009-02-19 21:25 UTC (permalink / raw) To: Yi Zou; +Cc: linux-scsi, netdev On Thu, 19 Feb 2009 12:50:23 -0700 Yi Zou <yi.zou@intel.com> wrote: > No need to have ETH_P_FCOE in fc_fcoe.h as it is now defined in if_ether.h > > Signed-off-by: Yi Zou <yi.zou@intel.com> > --- > > include/scsi/fc/fc_fcoe.h | 7 ------- > 1 files changed, 0 insertions(+), 7 deletions(-) > > diff --git a/include/scsi/fc/fc_fcoe.h b/include/scsi/fc/fc_fcoe.h > index f271d9c..ccb3dbe 100644 > --- a/include/scsi/fc/fc_fcoe.h > +++ b/include/scsi/fc/fc_fcoe.h > @@ -25,13 +25,6 @@ > */ > > /* > - * The FCoE ethertype eventually goes in net/if_ether.h. > - */ > -#ifndef ETH_P_FCOE > -#define ETH_P_FCOE 0x8906 /* FCOE ether type */ > -#endif > - > Just do the move from fc_fcoe.h to if_ether.h in one patch. ^ permalink raw reply [flat|nested] 13+ messages in thread
* RE: [PATCH 6/7] fcoe: remove ETH_P_FCOE from fc_fcoe.h 2009-02-19 21:25 ` Stephen Hemminger @ 2009-02-19 21:49 ` Zou, Yi 0 siblings, 0 replies; 13+ messages in thread From: Zou, Yi @ 2009-02-19 21:49 UTC (permalink / raw) To: Stephen Hemminger; +Cc: linux-scsi@vger.kernel.org, netdev@vger.kernel.org >On Thu, 19 Feb 2009 12:50:23 -0700 >Yi Zou <yi.zou@intel.com> wrote: > >> No need to have ETH_P_FCOE in fc_fcoe.h as it is now defined in >if_ether.h >> >> Signed-off-by: Yi Zou <yi.zou@intel.com> >> --- >> >> include/scsi/fc/fc_fcoe.h | 7 ------- >> 1 files changed, 0 insertions(+), 7 deletions(-) >> >> diff --git a/include/scsi/fc/fc_fcoe.h b/include/scsi/fc/fc_fcoe.h >> index f271d9c..ccb3dbe 100644 >> --- a/include/scsi/fc/fc_fcoe.h >> +++ b/include/scsi/fc/fc_fcoe.h >> @@ -25,13 +25,6 @@ >> */ >> >> /* >> - * The FCoE ethertype eventually goes in net/if_ether.h. >> - */ >> -#ifndef ETH_P_FCOE >> -#define ETH_P_FCOE 0x8906 /* FCOE ether type */ >> -#endif >> - >> >Just do the move from fc_fcoe.h to if_ether.h in one patch. Good point, I'll fix that. Thanks. yi ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 7/7] fcoe: fcoe fc crc offload indication by skb->ip_summed [not found] <20090219194734.22270.8445.stgit@zychengdu.jf.intel.com> ` (5 preceding siblings ...) 2009-02-19 19:50 ` [PATCH 6/7] fcoe: remove ETH_P_FCOE from fc_fcoe.h Yi Zou @ 2009-02-19 19:50 ` Yi Zou 6 siblings, 0 replies; 13+ messages in thread From: Yi Zou @ 2009-02-19 19:50 UTC (permalink / raw) To: linux-scsi, netdev If LLD supports FCCRC offload, it should set ip_summed to be CHECKSUM_UNNECESSARY so we don't have to do CRC check again. Signed-off-by: Yi Zou <yi.zou@intel.com> --- drivers/scsi/fcoe/libfcoe.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/scsi/fcoe/libfcoe.c b/drivers/scsi/fcoe/libfcoe.c index 3072428..2a34832 100644 --- a/drivers/scsi/fcoe/libfcoe.c +++ b/drivers/scsi/fcoe/libfcoe.c @@ -624,7 +624,7 @@ int fcoe_percpu_receive_thread(void *arg) * it's solicited data, in which case, the FCP layer would * check it during the copy. */ - if (lp->crc_offload) + if (lp->crc_offload && skb->ip_summed == CHECKSUM_UNNECESSARY) fr_flags(fp) &= ~FCPHF_CRC_UNCHECKED; else fr_flags(fp) |= FCPHF_CRC_UNCHECKED; ^ permalink raw reply related [flat|nested] 13+ messages in thread
end of thread, other threads:[~2009-02-20 23:28 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20090219194734.22270.8445.stgit@zychengdu.jf.intel.com>
2009-02-19 19:49 ` [PATCH 1/7] net: add ETH_P_FCOE for Fibre Channel over Ethernet (FCoE) Yi Zou
2009-02-19 19:49 ` [PATCH 2/7] net: add FCoE offload support through net_device Yi Zou
2009-02-19 21:24 ` Stephen Hemminger
2009-02-19 21:32 ` Zou, Yi
2009-02-20 23:21 ` Zou, Yi
2009-02-20 23:27 ` Stephen Hemminger
2009-02-19 19:49 ` [PATCH 3/7] fcoe: check offload features from LLD through netdev Yi Zou
2009-02-19 19:50 ` [PATCH 4/7] libfc: add support of large receive offload by ddp in fc_fcp Yi Zou
2009-02-19 19:50 ` [PATCH 5/7] fcoe: add support to net_fcoe_ops in fcoe_sw Yi Zou
2009-02-19 19:50 ` [PATCH 6/7] fcoe: remove ETH_P_FCOE from fc_fcoe.h Yi Zou
2009-02-19 21:25 ` Stephen Hemminger
2009-02-19 21:49 ` Zou, Yi
2009-02-19 19:50 ` [PATCH 7/7] fcoe: fcoe fc crc offload indication by skb->ip_summed Yi Zou
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).