mirror of
https://github.com/apache/nuttx.git
synced 2026-06-02 01:21:26 +08:00
drivers/net/{e1000|igc}: fix reinit for RX/TX rings
Descriptor head is managed by HW and should not be modified by SW unless: 1. device is after a reset 2. device is before enabling TX or RX Also set correct tail for RX which should point at the end of ring (descriptor ring is zero-indexed). Signed-off-by: p-szafonimateusz <p-szafonimateusz@xiaomi.com>
This commit is contained in:
committed by
Xiang Xiao
parent
bdde180d7a
commit
0f537dcb97
+13
-5
@@ -484,6 +484,9 @@ static void e1000_dump_mem(FAR struct e1000_driver_s *priv,
|
|||||||
* Returned Value:
|
* Returned Value:
|
||||||
* None
|
* None
|
||||||
*
|
*
|
||||||
|
* Assumption:
|
||||||
|
* This function can be called only after card reset and when TX is disabled
|
||||||
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
static void e1000_txclean(FAR struct e1000_driver_s *priv)
|
static void e1000_txclean(FAR struct e1000_driver_s *priv)
|
||||||
@@ -524,6 +527,9 @@ static void e1000_txclean(FAR struct e1000_driver_s *priv)
|
|||||||
* Returned Value:
|
* Returned Value:
|
||||||
* None
|
* None
|
||||||
*
|
*
|
||||||
|
* Assumption:
|
||||||
|
* This function can be called only after card reset and when RX is disabled
|
||||||
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
static void e1000_rxclean(FAR struct e1000_driver_s *priv)
|
static void e1000_rxclean(FAR struct e1000_driver_s *priv)
|
||||||
@@ -531,7 +537,7 @@ static void e1000_rxclean(FAR struct e1000_driver_s *priv)
|
|||||||
priv->rx_now = 0;
|
priv->rx_now = 0;
|
||||||
|
|
||||||
e1000_putreg_mem(priv, E1000_RDH, 0);
|
e1000_putreg_mem(priv, E1000_RDH, 0);
|
||||||
e1000_putreg_mem(priv, E1000_RDT, 0);
|
e1000_putreg_mem(priv, E1000_RDT, E1000_RX_DESC - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
@@ -1179,6 +1185,12 @@ static void e1000_disable(FAR struct e1000_driver_s *priv)
|
|||||||
|
|
||||||
e1000_putreg_mem(priv, E1000_RCTL, 0);
|
e1000_putreg_mem(priv, E1000_RCTL, 0);
|
||||||
|
|
||||||
|
/* We have to reset device, otherwise writing to RDH and THD corrupts
|
||||||
|
* the device state.
|
||||||
|
*/
|
||||||
|
|
||||||
|
e1000_putreg_mem(priv, E1000_CTRL, E1000_CTRL_RST);
|
||||||
|
|
||||||
/* Reset Tx tail */
|
/* Reset Tx tail */
|
||||||
|
|
||||||
e1000_txclean(priv);
|
e1000_txclean(priv);
|
||||||
@@ -1287,10 +1299,6 @@ static void e1000_enable(FAR struct e1000_driver_s *priv)
|
|||||||
|
|
||||||
e1000_rxclean(priv);
|
e1000_rxclean(priv);
|
||||||
|
|
||||||
/* All RX descriptors available */
|
|
||||||
|
|
||||||
e1000_putreg_mem(priv, E1000_RDT, E1000_RX_DESC);
|
|
||||||
|
|
||||||
/* Enable interrupts */
|
/* Enable interrupts */
|
||||||
|
|
||||||
e1000_putreg_mem(priv, E1000_IMS, priv->irqs);
|
e1000_putreg_mem(priv, E1000_IMS, priv->irqs);
|
||||||
|
|||||||
+13
-5
@@ -438,6 +438,9 @@ static void igc_dump_mem(FAR struct igc_driver_s *priv, FAR const char *msg)
|
|||||||
* Returned Value:
|
* Returned Value:
|
||||||
* None
|
* None
|
||||||
*
|
*
|
||||||
|
* Assumption:
|
||||||
|
* This function can be called only after card reset and when TX is disabled
|
||||||
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
static void igc_txclean(FAR struct igc_driver_s *priv)
|
static void igc_txclean(FAR struct igc_driver_s *priv)
|
||||||
@@ -478,6 +481,9 @@ static void igc_txclean(FAR struct igc_driver_s *priv)
|
|||||||
* Returned Value:
|
* Returned Value:
|
||||||
* None
|
* None
|
||||||
*
|
*
|
||||||
|
* Assumption:
|
||||||
|
* This function can be called only after card reset and when RX is disabled
|
||||||
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
static void igc_rxclean(FAR struct igc_driver_s *priv)
|
static void igc_rxclean(FAR struct igc_driver_s *priv)
|
||||||
@@ -485,7 +491,7 @@ static void igc_rxclean(FAR struct igc_driver_s *priv)
|
|||||||
priv->rx_now = 0;
|
priv->rx_now = 0;
|
||||||
|
|
||||||
igc_putreg_mem(priv, IGC_RDH0, 0);
|
igc_putreg_mem(priv, IGC_RDH0, 0);
|
||||||
igc_putreg_mem(priv, IGC_RDT0, 0);
|
igc_putreg_mem(priv, IGC_RDT0, IGC_RX_DESC - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
@@ -1061,6 +1067,12 @@ static void igc_disable(FAR struct igc_driver_s *priv)
|
|||||||
|
|
||||||
igc_putreg_mem(priv, IGC_RCTL, 0);
|
igc_putreg_mem(priv, IGC_RCTL, 0);
|
||||||
|
|
||||||
|
/* We have to reset device, otherwise writing to RDH and THD corrupts
|
||||||
|
* the device state.
|
||||||
|
*/
|
||||||
|
|
||||||
|
igc_putreg_mem(priv, IGC_CTRL, IGC_CTRL_DEVRST);
|
||||||
|
|
||||||
/* Reset Tx tail */
|
/* Reset Tx tail */
|
||||||
|
|
||||||
igc_txclean(priv);
|
igc_txclean(priv);
|
||||||
@@ -1214,10 +1226,6 @@ static void igc_enable(FAR struct igc_driver_s *priv)
|
|||||||
|
|
||||||
igc_rxclean(priv);
|
igc_rxclean(priv);
|
||||||
|
|
||||||
/* All RX descriptors available */
|
|
||||||
|
|
||||||
igc_putreg_mem(priv, IGC_RDT0, IGC_RX_DESC);
|
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_NET_INFO
|
#ifdef CONFIG_DEBUG_NET_INFO
|
||||||
/* Dump memory */
|
/* Dump memory */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user