Module Name: src Committed By: knakahara Date: Wed Mar 1 08:31:06 UTC 2017
Modified Files: src/sys/dev/pci: if_wm.c Log Message: divide ITR/EITR value from wm_softc to wm_queue as EITR register is bound to each H/W queue. To generate a diff of this commit: cvs rdiff -u -r1.489 -r1.490 src/sys/dev/pci/if_wm.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_wm.c diff -u src/sys/dev/pci/if_wm.c:1.489 src/sys/dev/pci/if_wm.c:1.490 --- src/sys/dev/pci/if_wm.c:1.489 Tue Feb 28 09:55:47 2017 +++ src/sys/dev/pci/if_wm.c Wed Mar 1 08:31:06 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wm.c,v 1.489 2017/02/28 09:55:47 knakahara Exp $ */ +/* $NetBSD: if_wm.c,v 1.490 2017/03/01 08:31:06 knakahara Exp $ */ /* * Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc. @@ -84,7 +84,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.489 2017/02/28 09:55:47 knakahara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.490 2017/03/01 08:31:06 knakahara Exp $"); #ifdef _KERNEL_OPT #include "opt_net_mpsafe.h" @@ -402,6 +402,8 @@ struct wm_queue { int wmq_id; /* index of transmit and receive queues */ int wmq_intr_idx; /* index of MSI-X tables */ + uint32_t wmq_itr; /* interrupt interval per queue. */ + struct wm_txqueue wmq_txq; struct wm_rxqueue wmq_rxq; @@ -503,7 +505,7 @@ struct wm_softc { uint32_t sc_ctrl_ext; /* prototype CTRL_EXT register */ #endif uint32_t sc_icr; /* prototype interrupt bits */ - uint32_t sc_itr; /* prototype intr throttling reg */ + uint32_t sc_itr_init; /* prototype intr throttling reg */ uint32_t sc_tctl; /* prototype TCTL register */ uint32_t sc_rctl; /* prototype RCTL register */ uint32_t sc_txcw; /* prototype TXCW register */ @@ -4886,7 +4888,7 @@ wm_init_locked(struct ifnet *ifp) * For N interrupts/sec, set this value to: * 1,000,000 / N in contrast to ITR throttoling value. */ - sc->sc_itr = 450; + sc->sc_itr_init = 450; } else if (sc->sc_type >= WM_T_82543) { /* * Set up the interrupt throttling register (units of 256ns) @@ -4906,7 +4908,7 @@ wm_init_locked(struct ifnet *ifp) * absolute and packet timer values to this value * divided by 4 to get "simple timer" behavior. */ - sc->sc_itr = 1500; /* 2604 ints/sec */ + sc->sc_itr_init = 1500; /* 2604 ints/sec */ } error = wm_init_txrx_queues(sc); @@ -5206,7 +5208,7 @@ wm_init_locked(struct ifnet *ifp) int qidx; for (qidx = 0; qidx < sc->sc_nqueues; qidx++) { struct wm_queue *wmq = &sc->sc_queue[qidx]; - uint32_t eitr = __SHIFTIN(sc->sc_itr, + uint32_t eitr = __SHIFTIN(wmq->wmq_itr, EITR_ITR_INT_MASK); /* @@ -5214,7 +5216,7 @@ wm_init_locked(struct ifnet *ifp) * So, overwrite counter field by software. */ if (sc->sc_type == WM_T_82575) { - eitr |= __SHIFTIN(sc->sc_itr, + eitr |= __SHIFTIN(wmq->wmq_itr, EITR_COUNTER_MASK_82575); } else { eitr |= EITR_CNT_INGR; @@ -5238,10 +5240,10 @@ wm_init_locked(struct ifnet *ifp) struct wm_queue *wmq = &sc->sc_queue[qidx]; CSR_WRITE(sc, WMREG_EITR_82574(wmq->wmq_intr_idx), - sc->sc_itr & EITR_ITR_INT_MASK_82574); + wmq->wmq_itr & EITR_ITR_INT_MASK_82574); } } else - CSR_WRITE(sc, WMREG_ITR, sc->sc_itr); + CSR_WRITE(sc, WMREG_ITR, sc->sc_queue[0].wmq_itr); } /* Set the VLAN ethernetype. */ @@ -6096,11 +6098,11 @@ wm_init_tx_regs(struct wm_softc *sc, str | TXDCTL_PTHRESH(0) | TXDCTL_HTHRESH(0) | TXDCTL_WTHRESH(0)); else { - /* ITR / 4 */ - CSR_WRITE(sc, WMREG_TIDV, sc->sc_itr / 4); + /* XXX should update with AIM? */ + CSR_WRITE(sc, WMREG_TIDV, wmq->wmq_itr / 4); if (sc->sc_type >= WM_T_82540) { /* should be same */ - CSR_WRITE(sc, WMREG_TADV, sc->sc_itr / 4); + CSR_WRITE(sc, WMREG_TADV, wmq->wmq_itr / 4); } CSR_WRITE(sc, WMREG_TDT(qid), 0); @@ -6194,10 +6196,10 @@ wm_init_rx_regs(struct wm_softc *sc, str } else { CSR_WRITE(sc, WMREG_RDH(qid), 0); CSR_WRITE(sc, WMREG_RDT(qid), 0); - /* ITR / 4 */ - CSR_WRITE(sc, WMREG_RDTR, (sc->sc_itr / 4) | RDTR_FPD); + /* XXX should update with AIM? */ + CSR_WRITE(sc, WMREG_RDTR, (wmq->wmq_itr / 4) | RDTR_FPD); /* MUST be same */ - CSR_WRITE(sc, WMREG_RADV, sc->sc_itr / 4); + CSR_WRITE(sc, WMREG_RADV, wmq->wmq_itr / 4); CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_PTHRESH(0) | RXDCTL_HTHRESH(0) | RXDCTL_WTHRESH(1)); } @@ -6280,6 +6282,8 @@ wm_init_txrx_queues(struct wm_softc *sc) struct wm_txqueue *txq = &wmq->wmq_txq; struct wm_rxqueue *rxq = &wmq->wmq_rxq; + wmq->wmq_itr = sc->sc_itr_init; + mutex_enter(txq->txq_lock); wm_init_tx_queue(sc, wmq, txq); mutex_exit(txq->txq_lock);