net: enetc: make enetc_refill_rx_ring update the consumer index
Since commitfd5736bf9f("enetc: Workaround for MDIO register access issue"), enetc_refill_rx_ring no longer updates the RX BD ring's consumer index, that is left to be done by the caller. This has led to bugs such as the ones found in96a5223b91("net: enetc: remove bogus write to SIRXIDR from enetc_setup_rxbdr") and3a5d12c9be("net: enetc: keep RX ring consumer index in sync with hardware"), so it is desirable that we move back the update of the consumer index into enetc_refill_rx_ring. The trouble with that is the different MDIO locking context for the two callers of enetc_refill_rx_ring: - enetc_clean_rx_ring runs under enetc_lock_mdio() - enetc_setup_rxbdr runs outside enetc_lock_mdio() Simplify the callers of enetc_refill_rx_ring by making enetc_setup_rxbdr explicitly take enetc_lock_mdio() around the call. It will be the only place in need of ensuring the hot accessors can be used. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
0486185ee2
commit
7a5222cb7a
@@ -435,6 +435,9 @@ static int enetc_refill_rx_ring(struct enetc_bdr *rx_ring, const int buff_cnt)
|
||||
if (likely(j)) {
|
||||
rx_ring->next_to_alloc = i; /* keep track from page reuse */
|
||||
rx_ring->next_to_use = i;
|
||||
|
||||
/* update ENETC's consumer index */
|
||||
enetc_wr_reg_hot(rx_ring->rcir, rx_ring->next_to_use);
|
||||
}
|
||||
|
||||
return j;
|
||||
@@ -620,13 +623,9 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
|
||||
u32 bd_status;
|
||||
u16 size;
|
||||
|
||||
if (cleaned_cnt >= ENETC_RXBD_BUNDLE) {
|
||||
int count = enetc_refill_rx_ring(rx_ring, cleaned_cnt);
|
||||
|
||||
/* update ENETC's consumer index */
|
||||
enetc_wr_reg_hot(rx_ring->rcir, rx_ring->next_to_use);
|
||||
cleaned_cnt -= count;
|
||||
}
|
||||
if (cleaned_cnt >= ENETC_RXBD_BUNDLE)
|
||||
cleaned_cnt -= enetc_refill_rx_ring(rx_ring,
|
||||
cleaned_cnt);
|
||||
|
||||
rxbd = enetc_rxbd(rx_ring, i);
|
||||
bd_status = le32_to_cpu(rxbd->r.lstatus);
|
||||
@@ -1118,9 +1117,9 @@ static void enetc_setup_rxbdr(struct enetc_hw *hw, struct enetc_bdr *rx_ring)
|
||||
rx_ring->rcir = hw->reg + ENETC_BDR(RX, idx, ENETC_RBCIR);
|
||||
rx_ring->idr = hw->reg + ENETC_SIRXIDR;
|
||||
|
||||
enetc_lock_mdio();
|
||||
enetc_refill_rx_ring(rx_ring, enetc_bd_unused(rx_ring));
|
||||
/* update ENETC's consumer index */
|
||||
enetc_rxbdr_wr(hw, idx, ENETC_RBCIR, rx_ring->next_to_use);
|
||||
enetc_unlock_mdio();
|
||||
|
||||
/* enable ring */
|
||||
enetc_rxbdr_wr(hw, idx, ENETC_RBMR, rbmr);
|
||||
|
||||
Reference in New Issue
Block a user