|
@@ -99,7 +99,8 @@ static void fcoe_destroy_work(struct work_struct *);
|
|
|
static int fcoe_ddp_setup(struct fc_lport *, u16, struct scatterlist *,
|
|
|
unsigned int);
|
|
|
static int fcoe_ddp_done(struct fc_lport *, u16);
|
|
|
-
|
|
|
+static int fcoe_ddp_target(struct fc_lport *, u16, struct scatterlist *,
|
|
|
+ unsigned int);
|
|
|
static int fcoe_cpu_callback(struct notifier_block *, unsigned long, void *);
|
|
|
|
|
|
static bool fcoe_match(struct net_device *netdev);
|
|
@@ -143,6 +144,7 @@ static struct libfc_function_template fcoe_libfc_fcn_templ = {
|
|
|
.frame_send = fcoe_xmit,
|
|
|
.ddp_setup = fcoe_ddp_setup,
|
|
|
.ddp_done = fcoe_ddp_done,
|
|
|
+ .ddp_target = fcoe_ddp_target,
|
|
|
.elsct_send = fcoe_elsct_send,
|
|
|
.get_lesb = fcoe_get_lesb,
|
|
|
.lport_set_port_id = fcoe_set_port_id,
|
|
@@ -886,6 +888,28 @@ static int fcoe_ddp_setup(struct fc_lport *lport, u16 xid,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * fcoe_ddp_target() - Call a LLD's ddp_target through the net device
|
|
|
+ * @lport: The local port to setup DDP for
|
|
|
+ * @xid: The exchange ID for this DDP transfer
|
|
|
+ * @sgl: The scatterlist describing this transfer
|
|
|
+ * @sgc: The number of sg items
|
|
|
+ *
|
|
|
+ * Returns: 0 if the DDP context was not configured
|
|
|
+ */
|
|
|
+static int fcoe_ddp_target(struct fc_lport *lport, u16 xid,
|
|
|
+ struct scatterlist *sgl, unsigned int sgc)
|
|
|
+{
|
|
|
+ struct net_device *netdev = fcoe_netdev(lport);
|
|
|
+
|
|
|
+ if (netdev->netdev_ops->ndo_fcoe_ddp_target)
|
|
|
+ return netdev->netdev_ops->ndo_fcoe_ddp_target(netdev, xid,
|
|
|
+ sgl, sgc);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* fcoe_ddp_done() - Call a LLD's ddp_done through the net device
|
|
|
* @lport: The local port to complete DDP on
|