summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCamelia Groza <camelia.groza@freescale.com>2015-09-24 10:09:51 (GMT)
committerCamelia Groza <camelia.groza@freescale.com>2015-09-24 10:09:51 (GMT)
commitf33567a9c61d2bb43e696070e0e143e6f6c6f9c6 (patch)
tree00b8d57077ee9d84761779eb56a01bcdd64e32f1
parente48b8585c32e91f831c43692dd24e9fee5924a03 (diff)
downloadlinux-fsl-qoriq-f33567a9c61d2bb43e696070e0e143e6f6c6f9c6.tar.xz
dpaa_eth: Add a configurable dpa_tx call
Signed-off-by: Camelia Groza <camelia.groza@freescale.com>
-rw-r--r--drivers/net/ethernet/freescale/dpa/dpaa_eth.h20
-rw-r--r--drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c14
-rw-r--r--drivers/net/ethernet/freescale/dpa/dpaa_eth_sg.c31
-rw-r--r--drivers/net/ethernet/freescale/dpa/dpaa_eth_shared.c6
4 files changed, 46 insertions, 25 deletions
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: