mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 22:50:41 +00:00
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:
commit
693aa7dd12
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
*/
|
*/
|
||||||
#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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user