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: David S. Miller <davem@davemloft.net>
This commit is contained in:
Коммит
693aa7dd12
|
@ -1235,6 +1235,8 @@ static void dpaa2_eth_set_rx_taildrop(struct dpaa2_eth_priv *priv, bool 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)
|
||||
{
|
||||
struct dpni_link_state state = {0};
|
||||
|
@ -1261,6 +1263,7 @@ static int link_state_update(struct dpaa2_eth_priv *priv)
|
|||
goto out;
|
||||
|
||||
if (state.up) {
|
||||
update_tx_fqids(priv);
|
||||
netif_carrier_on(priv->net_dev);
|
||||
netif_tx_start_all_queues(priv->net_dev);
|
||||
} else {
|
||||
|
@ -2533,6 +2536,47 @@ static int set_pause(struct dpaa2_eth_priv *priv)
|
|||
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 */
|
||||
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)
|
|||
if (status & DPNI_IRQ_EVENT_LINK_CHANGED)
|
||||
link_state_update(netdev_priv(net_dev));
|
||||
|
||||
if (status & DPNI_IRQ_EVENT_ENDPOINT_CHANGED)
|
||||
set_mac_addr(netdev_priv(net_dev));
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
DPNI_IRQ_INDEX, DPNI_IRQ_EVENT_LINK_CHANGED);
|
||||
DPNI_IRQ_INDEX, DPNI_IRQ_EVENT_LINK_CHANGED |
|
||||
DPNI_IRQ_EVENT_ENDPOINT_CHANGED);
|
||||
if (err < 0) {
|
||||
dev_err(&ls_dev->dev, "dpni_set_irq_mask(): %d\n", err);
|
||||
goto free_irq;
|
||||
|
|
|
@ -133,9 +133,12 @@ int dpni_reset(struct fsl_mc_io *mc_io,
|
|||
*/
|
||||
#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_ENDPOINT_CHANGED 0x00000002
|
||||
|
||||
int dpni_set_irq_enable(struct fsl_mc_io *mc_io,
|
||||
u32 cmd_flags,
|
||||
|
|
Загрузка…
Ссылка в новой задаче