Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3725b1fe authored by Sriram's avatar Sriram Committed by David S. Miller
Browse files

TI DaVinci EMAC: Fix asymmetric handling of packets in NAPI Poll function.



The current implementation of NAPI poll function in the driver does not service
Rx packets, error condition even if a single Tx packet gets serviced in
the napi poll call. This behavior severely affects performance for specific use
cases. This patch modifies the poll function implementation to service tx/rx
packets in an identical manner.

Signed-off-by: default avatarSriramakrishnan <srk@ti.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 84da2658
Loading
Loading
Loading
Loading
+8 −13
Original line number Original line Diff line number Diff line
@@ -2266,7 +2266,7 @@ static int emac_poll(struct napi_struct *napi, int budget)
	struct net_device *ndev = priv->ndev;
	struct net_device *ndev = priv->ndev;
	struct device *emac_dev = &ndev->dev;
	struct device *emac_dev = &ndev->dev;
	u32 status = 0;
	u32 status = 0;
	u32 num_pkts = 0;
	u32 num_tx_pkts = 0, num_rx_pkts = 0;


	/* Check interrupt vectors and call packet processing */
	/* Check interrupt vectors and call packet processing */
	status = emac_read(EMAC_MACINVECTOR);
	status = emac_read(EMAC_MACINVECTOR);
@@ -2277,27 +2277,19 @@ static int emac_poll(struct napi_struct *napi, int budget)
		mask = EMAC_DM646X_MAC_IN_VECTOR_TX_INT_VEC;
		mask = EMAC_DM646X_MAC_IN_VECTOR_TX_INT_VEC;


	if (status & mask) {
	if (status & mask) {
		num_pkts = emac_tx_bdproc(priv, EMAC_DEF_TX_CH,
		num_tx_pkts = emac_tx_bdproc(priv, EMAC_DEF_TX_CH,
					  EMAC_DEF_TX_MAX_SERVICE);
					  EMAC_DEF_TX_MAX_SERVICE);
	} /* TX processing */
	} /* TX processing */


	if (num_pkts)
		return budget;

	mask = EMAC_DM644X_MAC_IN_VECTOR_RX_INT_VEC;
	mask = EMAC_DM644X_MAC_IN_VECTOR_RX_INT_VEC;


	if (priv->version == EMAC_VERSION_2)
	if (priv->version == EMAC_VERSION_2)
		mask = EMAC_DM646X_MAC_IN_VECTOR_RX_INT_VEC;
		mask = EMAC_DM646X_MAC_IN_VECTOR_RX_INT_VEC;


	if (status & mask) {
	if (status & mask) {
		num_pkts = emac_rx_bdproc(priv, EMAC_DEF_RX_CH, budget);
		num_rx_pkts = emac_rx_bdproc(priv, EMAC_DEF_RX_CH, budget);
	} /* RX processing */
	} /* RX processing */


	if (num_pkts < budget) {
		napi_complete(napi);
		emac_int_enable(priv);
	}

	mask = EMAC_DM644X_MAC_IN_VECTOR_HOST_INT;
	mask = EMAC_DM644X_MAC_IN_VECTOR_HOST_INT;
	if (priv->version == EMAC_VERSION_2)
	if (priv->version == EMAC_VERSION_2)
		mask = EMAC_DM646X_MAC_IN_VECTOR_HOST_INT;
		mask = EMAC_DM646X_MAC_IN_VECTOR_HOST_INT;
@@ -2328,9 +2320,12 @@ static int emac_poll(struct napi_struct *napi, int budget)
				dev_err(emac_dev, "RX Host error %s on ch=%d\n",
				dev_err(emac_dev, "RX Host error %s on ch=%d\n",
					&emac_rxhost_errcodes[cause][0], ch);
					&emac_rxhost_errcodes[cause][0], ch);
		}
		}
	} /* Host error processing */
	} else if (num_rx_pkts < budget) {
		napi_complete(napi);
		emac_int_enable(priv);
	}


	return num_pkts;
	return num_rx_pkts;
}
}


#ifdef CONFIG_NET_POLL_CONTROLLER
#ifdef CONFIG_NET_POLL_CONTROLLER