From 1d12d4b55df30877efadf3dec117fafaa5d990e6 Mon Sep 17 00:00:00 2001 From: Alexander Egorenkov Date: Sat, 13 Feb 2010 12:09:52 +0100 Subject: [PATCH] Added statistic counters for Tx data queue full --- rt2860.c | 40 ++++++++++++++++++++++++++++++++++++++++ rt2860_softc.h | 2 ++ 2 files changed, 42 insertions(+) diff --git a/rt2860.c b/rt2860.c index 54c4a0d..9b4a2f2 100644 --- a/rt2860.c +++ b/rt2860.c @@ -1673,15 +1673,21 @@ static void rt2860_start(struct ifnet *ifp) m_freem(m); ieee80211_free_node(ni); + ifp->if_drv_flags |= IFF_DRV_OACTIVE; ifp->if_oerrors++; + + sc->tx_data_queue_full[qid]++; + break; } if (rt2860_tx_data(sc, m, ni, qid) != 0) { ieee80211_free_node(ni); + ifp->if_oerrors++; + break; } @@ -2531,8 +2537,10 @@ static int rt2860_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { RT2860_SOFTC_UNLOCK(sc); + m_freem(m); ieee80211_free_node(ni); + return ENETDOWN; } @@ -2543,17 +2551,25 @@ static int rt2860_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, device_get_nameunit(sc->dev), sc->tx_ring_mgtqid); ifp->if_drv_flags |= IFF_DRV_OACTIVE; + RT2860_SOFTC_UNLOCK(sc); + m_freem(m); ieee80211_free_node(ni); + + sc->tx_data_queue_full[sc->tx_ring_mgtqid]++; + return ENOBUFS; } if (rt2860_tx_mgmt(sc, m, ni, sc->tx_ring_mgtqid) != 0) { ifp->if_oerrors++; + RT2860_SOFTC_UNLOCK(sc); + ieee80211_free_node(ni); + return EIO; } @@ -6183,6 +6199,30 @@ static void rt2860_sysctl_attach(struct rt2860_softc *sc) "Tx AC0 data queued"); SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, + "tx_mgmt_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[5], 0, + "Tx MGMT data queue full"); + + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, + "tx_hcca_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[4], 0, + "Tx HCCA data queue full"); + + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, + "tx_ac3_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[3], 0, + "Tx AC3 data queue full"); + + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, + "tx_ac2_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[2], 0, + "Tx AC2 data queue full"); + + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, + "tx_ac1_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[1], 0, + "Tx AC1 data queue full"); + + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, + "tx_ac0_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[0], 0, + "Tx AC0 data queue full"); + + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, "tx_watchdog_timeouts", CTLFLAG_RD, &sc->tx_watchdog_timeouts, 0, "Tx watchdog timeouts"); diff --git a/rt2860_softc.h b/rt2860_softc.h index e554123..070db61 100644 --- a/rt2860_softc.h +++ b/rt2860_softc.h @@ -319,6 +319,8 @@ struct rt2860_softc unsigned long auto_wakeup_interrupts; unsigned long gp_timer_interrupts; + unsigned long tx_data_queue_full[RT2860_SOFTC_TX_RING_COUNT]; + unsigned long tx_watchdog_timeouts; unsigned long tx_defrag_packets; -- 2.11.4.GIT