aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c
diff options
context:
space:
mode:
authorJohn Crispin <blogic@openwrt.org>2015-02-09 19:34:49 +0000
committerJohn Crispin <blogic@openwrt.org>2015-02-09 19:34:49 +0000
commitd8e190575f99359deb58db67addf225904d32147 (patch)
treee1edaf23d87d3efed3307a026740682fa8c602a9 /target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c
parent52a82a73ae6d700f03cd8435f9070f154de30918 (diff)
downloadmaster-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.c19
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))) {