summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/freescale
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/freescale')
-rw-r--r--drivers/net/ethernet/freescale/dpa/dpaa_eth.h36
-rw-r--r--drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c68
-rw-r--r--drivers/net/ethernet/freescale/dpa/dpaa_eth_sg.c14
-rw-r--r--drivers/net/ethernet/freescale/dpa/dpaa_eth_sysfs.c5
4 files changed, 32 insertions, 91 deletions
diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth.h b/drivers/net/ethernet/freescale/dpa/dpaa_eth.h
index ca5ad85..9187e84 100644
--- a/drivers/net/ethernet/freescale/dpa/dpaa_eth.h
+++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth.h
@@ -215,9 +215,6 @@ enum dpa_fq_type {
FQ_TYPE_TX_CONFIRM, /* Tx default Conf FQ (actually an Rx FQ) */
FQ_TYPE_TX_CONF_MQ, /* Tx conf FQs (one for each Tx FQ) */
FQ_TYPE_TX_ERROR, /* Tx Error FQs (these are actually Rx FQs) */
-#ifdef CONFIG_FMAN_T4240
- FQ_TYPE_TX_RECYCLE, /* Tx FQs for recycleable frames only */
-#endif
};
struct dpa_fq {
@@ -336,9 +333,6 @@ struct dpa_priv_s {
uint16_t channel; /* "fsl,qman-channel-id" */
struct list_head dpa_fq_list;
-#ifdef CONFIG_FMAN_T4240
- struct qman_fq *recycle_fqs[DPAA_ETH_TX_QUEUES];
-#endif
#ifdef CONFIG_FSL_DPAA_ETH_DEBUGFS
struct dentry *debugfs_file;
@@ -526,6 +520,19 @@ 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,
+ 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 NULL;
+}
+
static inline int __hot dpa_xmit(struct dpa_priv_s *priv,
struct rtnl_link_stats64 *percpu_stats, int queue,
struct qm_fd *fd)
@@ -533,17 +540,11 @@ static inline int __hot dpa_xmit(struct dpa_priv_s *priv,
int err, i;
struct qman_fq *egress_fq;
-#ifdef CONFIG_FMAN_T4240
- /* Choose egress fq based on whether we want
- * to recycle the frame or not
- */
- if (fd->cmd & FM_FD_CMD_FCO)
- egress_fq = priv->recycle_fqs[queue];
- else
- egress_fq = priv->egress_fqs[queue];
-#else
egress_fq = priv->egress_fqs[queue];
-#endif
+ if (fd->bpid == 0xff)
+ fd->cmd |= qman_fq_fqid(
+ _dpa_get_tx_conf_queue(priv, egress_fq)
+ );
/* Trace this Tx fd */
trace_dpa_tx_fd(priv->net_dev, egress_fq, fd);
@@ -587,9 +588,6 @@ static inline void _dpa_assign_wq(struct dpa_fq *fq)
break;
case FQ_TYPE_RX_DEFAULT:
case FQ_TYPE_TX:
-#ifdef CONFIG_FMAN_T4240
- case FQ_TYPE_TX_RECYCLE:
-#endif
case FQ_TYPE_RX_PCD:
fq->wq = 3;
break;
diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c
index 5a899b7..57b488a 100644
--- a/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c
+++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c
@@ -69,12 +69,6 @@ static const struct fqid_cell tx_confirm_fqids[] = {
{0, DPAA_ETH_TX_QUEUES}
};
-#ifdef CONFIG_FMAN_T4240
-static const struct fqid_cell tx_recycle_fqids[] = {
- {0, DPAA_ETH_TX_QUEUES}
-};
-#endif
-
static const struct fqid_cell default_fqids[][3] = {
[RX] = { {0, 1}, {0, 1}, {0, DPAA_ETH_RX_QUEUES} },
[TX] = { {0, 1}, {0, 1}, {0, DPAA_ETH_TX_QUEUES} }
@@ -892,13 +886,6 @@ int dpa_fq_probe_mac(struct device *dev, struct list_head *list,
if (!dpa_fq_alloc(dev, tx_confirm_fqids, list,
FQ_TYPE_TX_CONF_MQ))
goto fq_alloc_failed;
-
-#ifdef CONFIG_FMAN_T4240
- /* per-core Tx queues for recyclable frames (FManv3 only) */
- if (!dpa_fq_alloc(dev, tx_recycle_fqids, list,
- FQ_TYPE_TX_RECYCLE))
- goto fq_alloc_failed;
-#endif
}
fqids = of_get_property(np, fsl_qman_frame_queues[ptype], &lenp);
@@ -1105,9 +1092,6 @@ void dpa_fq_setup(struct dpa_priv_s *priv, const struct dpa_fq_cbs_t *fq_cbs,
uint32_t pcd_fqid;
const cpumask_t *affine_cpus = qman_affine_cpus();
int egress_cnt = 0, conf_cnt = 0;
-#ifdef CONFIG_FMAN_T4240
- int recycle_cnt = 0;
-#endif
/* Prepare for PCD FQs init */
for_each_cpu(cpu, affine_cpus)
@@ -1161,14 +1145,6 @@ void dpa_fq_setup(struct dpa_priv_s *priv, const struct dpa_fq_cbs_t *fq_cbs,
BUG_ON(!priv->mac_dev);
dpa_setup_ingress(priv, fq, &fq_cbs->tx_errq);
break;
-#ifdef CONFIG_FMAN_T4240
- case FQ_TYPE_TX_RECYCLE:
- BUG_ON(!priv->mac_dev);
- dpa_setup_egress(priv, fq, tx_port,
- &fq_cbs->egress_ern);
- priv->recycle_fqs[recycle_cnt++] = &fq->fq_base;
- break;
-#endif
default:
dev_warn(priv->net_dev->dev.parent,
"Unknown FQ type detected!\n");
@@ -1192,18 +1168,6 @@ void dpa_fq_setup(struct dpa_priv_s *priv, const struct dpa_fq_cbs_t *fq_cbs,
}
}
-static struct qman_fq *_dpa_get_tx_conf_queue(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 NULL;
-}
-
int dpa_fq_init(struct dpa_fq *dpa_fq, bool td_enable)
{
int _errno;
@@ -1286,34 +1250,16 @@ int dpa_fq_init(struct dpa_fq *dpa_fq, bool td_enable)
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 |
- QM_INITFQ_WE_CONTEXTB;
- /* CTXA[OVFQ] = 1 */
- initfq.fqd.context_a.hi = 0x80000000;
- initfq.fqd.context_a.lo = 0x0;
- initfq.fqd.context_b = qman_fq_fqid(confq);
- }
- }
-
-#ifdef CONFIG_FMAN_T4240
- /* Configure the Tx queues for recycled frames, such that the
- * buffers are released by FMan and no confirmation is sent
- */
- if (dpa_fq->fq_type == FQ_TYPE_TX_RECYCLE) {
- initfq.we_mask |= QM_INITFQ_WE_CONTEXTA |
- QM_INITFQ_WE_CONTEXTB;
- /* ContextA: OVFQ=1 (use ContextB FQID for confirmation)
- * OVOM=1 (use contextA2 bits instead of ICAD)
- * A2V=1 (contextA A2 field is valid)
- * B0V=1 (contextB field is valid)
+ 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)
* ContextA A2: EBD=1 (deallocate buffers inside FMan)
- * ContextB: Confirmation FQID = 0
*/
- initfq.fqd.context_a.hi = 0x96000000;
- initfq.fqd.context_a.lo = 0x80000000;
- initfq.fqd.context_b = 0;
+ initfq.fqd.context_a.hi = 0x1a000000;
+ initfq.fqd.context_a.lo = 0x80000000;
+ }
}
-#endif
/* Put all *private* ingress queues in our "ingress CGR". */
if (priv->use_ingress_cgr &&
diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth_sg.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth_sg.c
index 2b49ab0..95eb17c 100644
--- a/drivers/net/ethernet/freescale/dpa/dpaa_eth_sg.c
+++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth_sg.c
@@ -234,7 +234,6 @@ struct sk_buff *_dpa_cleanup_tx_fd(const struct dpa_priv_s *priv,
const enum dma_data_direction dma_dir = DMA_TO_DEVICE;
int nr_frags;
- DPA_BUG_ON(fd->cmd & FM_FD_CMD_FCO);
dma_unmap_single(dpa_bp->dev, addr, dpa_bp->size, dma_dir);
/* retrieve skb back pointer */
@@ -664,7 +663,6 @@ static int __hot skb_to_contig_fd(struct dpa_priv_s *priv,
/* Buffer is recyclable; use the new start address
* and set fd parameters and DMA mapping direction
*/
- fd->cmd |= FM_FD_CMD_FCO;
fd->bpid = dpa_bp->bpid;
DPA_BUG_ON(skb->data - buffer_start > DPA_MAX_FD_OFFSET);
fd->offset = (uint16_t)(skb->data - buffer_start);
@@ -679,6 +677,7 @@ static int __hot skb_to_contig_fd(struct dpa_priv_s *priv,
* We are guaranteed to have at least tx_headroom bytes
* available, so just use that for offset.
*/
+ fd->bpid = 0xff;
buffer_start = skb->data - priv->tx_headroom;
fd->offset = priv->tx_headroom;
dma_dir = DMA_TO_DEVICE;
@@ -706,6 +705,7 @@ static int __hot skb_to_contig_fd(struct dpa_priv_s *priv,
/* Fill in the rest of the FD fields */
fd->format = qm_fd_contig;
fd->length20 = skb->len;
+ fd->cmd |= FM_FD_CMD_FCO;
/* Map the entire buffer size that may be seen by FMan, but no more */
addr = dma_map_single(dpa_bp->dev, skbh,
@@ -762,7 +762,7 @@ static int __hot skb_to_sg_fd(struct dpa_priv_s *priv,
}
sgt = (struct qm_sg_entry *)(sgt_buf + priv->tx_headroom);
- sgt[0].bpid = dpa_bp->bpid;
+ sgt[0].bpid = 0xff;
sgt[0].offset = 0;
sgt[0].length = skb_headlen(skb);
sgt[0].extension = 0;
@@ -780,8 +780,7 @@ static int __hot skb_to_sg_fd(struct dpa_priv_s *priv,
/* populate the rest of SGT entries */
for (i = 1; i <= nr_frags; i++) {
frag = &skb_shinfo(skb)->frags[i - 1];
- sgt[i].bpid = dpa_bp->bpid;
-
+ sgt[i].bpid = 0xff;
sgt[i].offset = 0;
sgt[i].length = frag->size;
sgt[i].extension = 0;
@@ -819,6 +818,9 @@ static int __hot skb_to_sg_fd(struct dpa_priv_s *priv,
err = -EINVAL;
goto sgt_map_failed;
}
+
+ fd->bpid = 0xff;
+ fd->cmd |= FM_FD_CMD_FCO;
fd->addr_hi = upper_32_bits(addr);
fd->addr_lo = lower_32_bits(addr);
@@ -927,7 +929,7 @@ int __hot dpa_tx(struct sk_buff *skb, struct net_device *net_dev)
if (unlikely(err < 0))
goto skb_to_fd_failed;
- if (fd.cmd & FM_FD_CMD_FCO) {
+ if (fd.bpid != 0xff) {
skb_recycle(skb);
/* skb_recycle() reserves NET_SKB_PAD as skb headroom,
* but we need the skb to look as if returned by build_skb().
diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth_sysfs.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth_sysfs.c
index bf01677..cd8b7d1 100644
--- a/drivers/net/ethernet/freescale/dpa/dpaa_eth_sysfs.c
+++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth_sysfs.c
@@ -102,11 +102,6 @@ static ssize_t dpaa_eth_show_fqids(struct device *dev,
case FQ_TYPE_TX:
str = "Tx";
break;
-#ifdef CONFIG_FMAN_T4240
- case FQ_TYPE_TX_RECYCLE:
- str = "Tx(recycling)";
- break;
-#endif
default:
str = "Unknown";
}