diff options
author | John Crispin <blogic@openwrt.org> | 2015-02-09 19:34:49 +0000 |
---|---|---|
committer | John Crispin <blogic@openwrt.org> | 2015-02-09 19:34:49 +0000 |
commit | d8e190575f99359deb58db67addf225904d32147 (patch) | |
tree | e1edaf23d87d3efed3307a026740682fa8c602a9 /target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c | |
parent | 52a82a73ae6d700f03cd8435f9070f154de30918 (diff) | |
download | master-187ad058-d8e190575f99359deb58db67addf225904d32147.tar.gz master-187ad058-d8e190575f99359deb58db67addf225904d32147.tar.bz2 master-187ad058-d8e190575f99359deb58db67addf225904d32147.zip |
ralink: fix hw status almost full not work on mt7620 and mt7621
the old FE_INT_STATUS register becomes two registers.
FE_INT_STATUS and INT_STATUS. so the hw status almost full
must change to read from FE_INT_STATUS register.
tx/rx done read from INT_STATUS register.
mt7620 datasheet define CNT_GDM1_AF at BIT(29).
but after test it should be BIT(13). why?
Signed-off-by: michael lee <igvtee@gmail.com>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@44371 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c')
-rw-r--r-- | target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c b/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c index 14a950a003..3a8475a63d 100644 --- a/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c +++ b/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c @@ -923,26 +923,33 @@ static int fe_poll(struct napi_struct *napi, int budget) struct fe_priv *priv = container_of(napi, struct fe_priv, rx_napi); struct fe_hw_stats *hwstat = priv->hw_stats; int tx_done, rx_done; - u32 status, mask; - u32 tx_intr, rx_intr; + u32 status, fe_status, status_reg, mask; + u32 tx_intr, rx_intr, status_intr; - status = fe_reg_r32(FE_REG_FE_INT_STATUS); + fe_status = status = fe_reg_r32(FE_REG_FE_INT_STATUS); tx_intr = priv->soc->tx_int; rx_intr = priv->soc->rx_int; + status_intr = priv->soc->status_int; tx_done = rx_done = 0; + if (fe_reg_table[FE_REG_FE_INT_STATUS2]) { + fe_status = fe_reg_r32(FE_REG_FE_INT_STATUS2); + status_reg = FE_REG_FE_INT_STATUS2; + } else + status_reg = FE_REG_FE_INT_STATUS; + if (status & tx_intr) tx_done = fe_poll_tx(priv, budget, tx_intr); if (status & rx_intr) rx_done = fe_poll_rx(napi, budget, priv, rx_intr); - if (unlikely(hwstat && (status & FE_CNT_GDM_AF))) { - if (spin_trylock(&hwstat->stats_lock)) { + if (unlikely(fe_status & status_intr)) { + if (hwstat && spin_trylock(&hwstat->stats_lock)) { fe_stats_update(priv); spin_unlock(&hwstat->stats_lock); } - fe_reg_w32(FE_CNT_GDM_AF, FE_REG_FE_INT_STATUS); + fe_reg_w32(status_intr, status_reg); } if (unlikely(netif_msg_intr(priv))) { |