From f33567a9c61d2bb43e696070e0e143e6f6c6f9c6 Mon Sep 17 00:00:00 2001 From: Camelia Groza Date: Thu, 24 Sep 2015 13:09:51 +0300 Subject: dpaa_eth: Add a configurable dpa_tx call Signed-off-by: Camelia Groza diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth.h b/drivers/net/ethernet/freescale/dpa/dpaa_eth.h index f57b68a..ba650e0 100644 --- a/drivers/net/ethernet/freescale/dpa/dpaa_eth.h +++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth.h @@ -426,6 +426,8 @@ void __hot _dpa_rx(struct net_device *net_dev, u32 fqid, int *count_ptr); int __hot dpa_tx(struct sk_buff *skb, struct net_device *net_dev); +int __hot dpa_tx_extended(struct sk_buff *skb, struct net_device *net_dev, + struct qman_fq *egress_fq, struct qman_fq *conf_fq); struct sk_buff *_dpa_cleanup_tx_fd(const struct dpa_priv_s *priv, const struct qm_fd *fd); void __hot _dpa_process_parse_results(const fm_prs_result_t *parse_results, @@ -549,31 +551,27 @@ static inline void clear_fd(struct qm_fd *fd) fd->cmd = 0; } -static inline struct qman_fq *_dpa_get_tx_conf_queue( - const struct dpa_priv_s *priv, +static inline int _dpa_tx_fq_to_id(const struct dpa_priv_s *priv, struct qman_fq *tx_fq) { int i; for (i = 0; i < DPAA_ETH_TX_QUEUES; i++) if (priv->egress_fqs[i] == tx_fq) - return priv->conf_fqs[i]; + return i; - return NULL; + return -EINVAL; } static inline int __hot dpa_xmit(struct dpa_priv_s *priv, - struct rtnl_link_stats64 *percpu_stats, int queue, - struct qm_fd *fd) + struct rtnl_link_stats64 *percpu_stats, + struct qm_fd *fd, struct qman_fq *egress_fq, + struct qman_fq *conf_fq) { int err, i; - struct qman_fq *egress_fq; - egress_fq = priv->egress_fqs[queue]; if (fd->bpid == 0xff) - fd->cmd |= qman_fq_fqid( - _dpa_get_tx_conf_queue(priv, egress_fq) - ); + fd->cmd |= qman_fq_fqid(conf_fq); /* Trace this Tx fd */ trace_dpa_tx_fd(priv->net_dev, egress_fq, fd); diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c index 06ada5f..83daf96 100644 --- a/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c +++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c @@ -1252,6 +1252,7 @@ int dpa_fq_init(struct dpa_fq *dpa_fq, bool td_enable) struct qman_fq *fq; struct qm_mcc_initfq initfq; struct qman_fq *confq; + int queue_id; priv = netdev_priv(dpa_fq->net_dev); dev = dpa_fq->net_dev->dev.parent; @@ -1326,9 +1327,11 @@ int dpa_fq_init(struct dpa_fq *dpa_fq, bool td_enable) * which Tx queue it pairs with. */ if (dpa_fq->fq_type == FQ_TYPE_TX) { - confq = _dpa_get_tx_conf_queue(priv, &dpa_fq->fq_base); - if (confq) { - initfq.we_mask |= QM_INITFQ_WE_CONTEXTA; + queue_id = _dpa_tx_fq_to_id(priv, &dpa_fq->fq_base); + if (queue_id >= 0) { + confq = priv->conf_fqs[queue_id]; + if (confq) { + initfq.we_mask |= QM_INITFQ_WE_CONTEXTA; /* ContextA: OVOM=1 (use contextA2 bits instead of ICAD) * A2V=1 (contextA A2 field is valid) * A0V=1 (contextA A0 field is valid) @@ -1336,8 +1339,9 @@ int dpa_fq_init(struct dpa_fq *dpa_fq, bool td_enable) * ContextA A2: EBD=1 (deallocate buffers inside FMan) * ContextB B0(ASPID): 0 (absolute Virtual Storage ID) */ - initfq.fqd.context_a.hi = 0x1e000000; - initfq.fqd.context_a.lo = 0x80000000; + initfq.fqd.context_a.hi = 0x1e000000; + initfq.fqd.context_a.lo = 0x80000000; + } } } diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth_sg.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth_sg.c index b26914a..593c9a8 100644 --- a/drivers/net/ethernet/freescale/dpa/dpaa_eth_sg.c +++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth_sg.c @@ -836,13 +836,9 @@ EXPORT_SYMBOL(skb_to_sg_fd); int __hot dpa_tx(struct sk_buff *skb, struct net_device *net_dev) { struct dpa_priv_s *priv; - struct qm_fd fd; - struct dpa_percpu_priv_s *percpu_priv; - struct rtnl_link_stats64 *percpu_stats; - int err = 0; const int queue_mapping = dpa_get_queue_mapping(skb); - const bool nonlinear = skb_is_nonlinear(skb); - int *countptr, offset = 0; + struct qman_fq *egress_fq, *conf_fq; + #ifdef CONFIG_FSL_DPAA_HOOKS /* If there is a Tx hook, run it. */ if (dpaa_eth_hooks.tx && @@ -850,6 +846,25 @@ int __hot dpa_tx(struct sk_buff *skb, struct net_device *net_dev) /* won't update any Tx stats */ return NETDEV_TX_OK; #endif + + priv = netdev_priv(net_dev); + egress_fq = priv->egress_fqs[queue_mapping]; + conf_fq = priv->conf_fqs[queue_mapping]; + + return dpa_tx_extended(skb, net_dev, egress_fq, conf_fq); +} + +int __hot dpa_tx_extended(struct sk_buff *skb, struct net_device *net_dev, + struct qman_fq *egress_fq, struct qman_fq *conf_fq) +{ + struct dpa_priv_s *priv; + struct qm_fd fd; + struct dpa_percpu_priv_s *percpu_priv; + struct rtnl_link_stats64 *percpu_stats; + int err = 0; + const bool nonlinear = skb_is_nonlinear(skb); + int *countptr, offset = 0; + priv = netdev_priv(net_dev); /* Non-migratable context, safe to use __this_cpu_ptr */ percpu_priv = __this_cpu_ptr(priv->percpu_priv); @@ -937,7 +952,7 @@ int __hot dpa_tx(struct sk_buff *skb, struct net_device *net_dev) percpu_priv->tx_returned++; } - if (unlikely(dpa_xmit(priv, percpu_stats, queue_mapping, &fd) < 0)) + if (unlikely(dpa_xmit(priv, percpu_stats, &fd, egress_fq, conf_fq) < 0)) goto xmit_failed; net_dev->trans_start = jiffies; @@ -958,4 +973,4 @@ enomem: dev_kfree_skb(skb); return NETDEV_TX_OK; } - +EXPORT_SYMBOL(dpa_tx_extended); diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth_shared.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth_shared.c index 8f26f7b..3025218 100644 --- a/drivers/net/ethernet/freescale/dpa/dpaa_eth_shared.c +++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth_shared.c @@ -460,6 +460,7 @@ int __hot dpa_shared_tx(struct sk_buff *skb, struct net_device *net_dev) void *dpa_bp_vaddr; fm_prs_result_t parse_results; fm_prs_result_t *parse_results_ref; + struct qman_fq *egress_fq, *conf_fq; priv = netdev_priv(net_dev); percpu_priv = __this_cpu_ptr(priv->percpu_priv); @@ -570,7 +571,10 @@ int __hot dpa_shared_tx(struct sk_buff *skb, struct net_device *net_dev) dpa_fd_length(&fd)); } - err = dpa_xmit(priv, &percpu_priv->stats, queue_mapping, &fd); + egress_fq = priv->egress_fqs[queue_mapping]; + conf_fq = priv->conf_fqs[queue_mapping]; + + err = dpa_xmit(priv, &percpu_priv->stats, &fd, egress_fq, conf_fq); l3_l4_csum_failed: bpools_too_small_error: -- cgit v0.10.2