Commit 693aa7dd authored by David S. Miller's avatar David S. Miller

Merge branch 'dpaa2-eth-misc-fixes'

Ioana Ciornei says:

====================
dpaa2-eth: misc fixes

This patch set adds a couple of fixes around updating configuration on MAC
change.  Depending on when MC connects the DPNI to a MAC, both the MAC
address and TX FQIDs should be updated everytime there is a change in
configuration.

Changes in v2:
 - used reverse christmas tree ordering in patch 2/2
Changes in v3:
 - add a missing new line
 - go back to FQ based enqueueing after a transient error
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents af0de130 a690af4f
...@@ -1235,6 +1235,8 @@ static void dpaa2_eth_set_rx_taildrop(struct dpaa2_eth_priv *priv, bool enable) ...@@ -1235,6 +1235,8 @@ static void dpaa2_eth_set_rx_taildrop(struct dpaa2_eth_priv *priv, bool enable)
priv->rx_td_enabled = enable; priv->rx_td_enabled = enable;
} }
static void update_tx_fqids(struct dpaa2_eth_priv *priv);
static int link_state_update(struct dpaa2_eth_priv *priv) static int link_state_update(struct dpaa2_eth_priv *priv)
{ {
struct dpni_link_state state = {0}; struct dpni_link_state state = {0};
...@@ -1261,6 +1263,7 @@ static int link_state_update(struct dpaa2_eth_priv *priv) ...@@ -1261,6 +1263,7 @@ static int link_state_update(struct dpaa2_eth_priv *priv)
goto out; goto out;
if (state.up) { if (state.up) {
update_tx_fqids(priv);
netif_carrier_on(priv->net_dev); netif_carrier_on(priv->net_dev);
netif_tx_start_all_queues(priv->net_dev); netif_tx_start_all_queues(priv->net_dev);
} else { } else {
...@@ -2533,6 +2536,47 @@ static int set_pause(struct dpaa2_eth_priv *priv) ...@@ -2533,6 +2536,47 @@ static int set_pause(struct dpaa2_eth_priv *priv)
return 0; return 0;
} }
static void update_tx_fqids(struct dpaa2_eth_priv *priv)
{
struct dpni_queue_id qid = {0};
struct dpaa2_eth_fq *fq;
struct dpni_queue queue;
int i, j, err;
/* We only use Tx FQIDs for FQID-based enqueue, so check
* if DPNI version supports it before updating FQIDs
*/
if (dpaa2_eth_cmp_dpni_ver(priv, DPNI_ENQUEUE_FQID_VER_MAJOR,
DPNI_ENQUEUE_FQID_VER_MINOR) < 0)
return;
for (i = 0; i < priv->num_fqs; i++) {
fq = &priv->fq[i];
if (fq->type != DPAA2_TX_CONF_FQ)
continue;
for (j = 0; j < dpaa2_eth_tc_count(priv); j++) {
err = dpni_get_queue(priv->mc_io, 0, priv->mc_token,
DPNI_QUEUE_TX, j, fq->flowid,
&queue, &qid);
if (err)
goto out_err;
fq->tx_fqid[j] = qid.fqid;
if (fq->tx_fqid[j] == 0)
goto out_err;
}
}
priv->enqueue = dpaa2_eth_enqueue_fq;
return;
out_err:
netdev_info(priv->net_dev,
"Error reading Tx FQID, fallback to QDID-based enqueue\n");
priv->enqueue = dpaa2_eth_enqueue_qd;
}
/* Configure the DPNI object this interface is associated with */ /* Configure the DPNI object this interface is associated with */
static int setup_dpni(struct fsl_mc_device *ls_dev) static int setup_dpni(struct fsl_mc_device *ls_dev)
{ {
...@@ -3306,6 +3350,9 @@ static irqreturn_t dpni_irq0_handler_thread(int irq_num, void *arg) ...@@ -3306,6 +3350,9 @@ static irqreturn_t dpni_irq0_handler_thread(int irq_num, void *arg)
if (status & DPNI_IRQ_EVENT_LINK_CHANGED) if (status & DPNI_IRQ_EVENT_LINK_CHANGED)
link_state_update(netdev_priv(net_dev)); link_state_update(netdev_priv(net_dev));
if (status & DPNI_IRQ_EVENT_ENDPOINT_CHANGED)
set_mac_addr(netdev_priv(net_dev));
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -3331,7 +3378,8 @@ static int setup_irqs(struct fsl_mc_device *ls_dev) ...@@ -3331,7 +3378,8 @@ static int setup_irqs(struct fsl_mc_device *ls_dev)
} }
err = dpni_set_irq_mask(ls_dev->mc_io, 0, ls_dev->mc_handle, err = dpni_set_irq_mask(ls_dev->mc_io, 0, ls_dev->mc_handle,
DPNI_IRQ_INDEX, DPNI_IRQ_EVENT_LINK_CHANGED); DPNI_IRQ_INDEX, DPNI_IRQ_EVENT_LINK_CHANGED |
DPNI_IRQ_EVENT_ENDPOINT_CHANGED);
if (err < 0) { if (err < 0) {
dev_err(&ls_dev->dev, "dpni_set_irq_mask(): %d\n", err); dev_err(&ls_dev->dev, "dpni_set_irq_mask(): %d\n", err);
goto free_irq; goto free_irq;
......
...@@ -133,9 +133,12 @@ int dpni_reset(struct fsl_mc_io *mc_io, ...@@ -133,9 +133,12 @@ int dpni_reset(struct fsl_mc_io *mc_io,
*/ */
#define DPNI_IRQ_INDEX 0 #define DPNI_IRQ_INDEX 0
/** /**
* IRQ event - indicates a change in link state * IRQ events:
* indicates a change in link state
* indicates a change in endpoint
*/ */
#define DPNI_IRQ_EVENT_LINK_CHANGED 0x00000001 #define DPNI_IRQ_EVENT_LINK_CHANGED 0x00000001
#define DPNI_IRQ_EVENT_ENDPOINT_CHANGED 0x00000002
int dpni_set_irq_enable(struct fsl_mc_io *mc_io, int dpni_set_irq_enable(struct fsl_mc_io *mc_io,
u32 cmd_flags, u32 cmd_flags,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment