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:
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);
|
||||
|
|
Loading…
Reference in New Issue