Pull up the following revisions, requested by msaitoh in ticket #1795:

sys/dev/pci/if_wm.c				1.764-1.767 via patch
	sys/dev/pci/if_wmreg.h				1.128

- Workaround for some hypervisor environments. The environments
  cannot stop e1000 interrupt immediately.
- Rename nq_txdesc' member "nqrx_ctx" to "nqtx_ctx". No functional
  change.
- Add comment. Modify comment.
- KNF.
This commit is contained in:
martin 2023-01-23 14:01:25 +00:00
parent e21097e50c
commit d573b15002
2 changed files with 64 additions and 49 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: if_wm.c,v 1.508.4.47 2022/09/08 10:29:36 martin Exp $ */
/* $NetBSD: if_wm.c,v 1.508.4.48 2023/01/23 14:01:25 martin Exp $ */
/*
* Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc.
@ -82,7 +82,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.508.4.47 2022/09/08 10:29:36 martin Exp $");
__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.508.4.48 2023/01/23 14:01:25 martin Exp $");
#ifdef _KERNEL_OPT
#include "opt_net_mpsafe.h"
@ -487,6 +487,7 @@ struct wm_queue {
char sysctlname[32]; /* Name for sysctl */
bool wmq_txrx_use_workqueue;
bool wmq_wq_enqueued;
struct work wmq_cookie;
void *wmq_si;
krndsource_t rnd_source; /* random source */
@ -3794,9 +3795,9 @@ wm_tick(void *arg)
crcerrs + algnerrc + symerrc + rxerrc + sec + cexterr + rlec;
/*
* WMREG_RNBC is incremented when there are no available buffers in host
* memory. It does not mean the number of dropped packets, because an
* Ethernet controller can receive packets in such case if there is
* WMREG_RNBC is incremented when there are no available buffers in
* host memory. It does not mean the number of dropped packets, because
* an Ethernet controller can receive packets in such case if there is
* space in the phy's FIFO.
*
* If you want to know the nubmer of WMREG_RMBC, you should use such as
@ -4750,7 +4751,8 @@ wm_init_lcd_from_nvm(struct wm_softc *sc)
* LCD Write Enable bits are set in the NVM. When both NVM bits
* are cleared, SW will configure them instead.
*/
DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s: Configure SMBus and LED\n",
DPRINTF(sc, WM_DEBUG_INIT,
("%s: %s: Configure SMBus and LED\n",
device_xname(sc->sc_dev), __func__));
wm_write_smbus_addr(sc);
@ -5056,15 +5058,15 @@ wm_initialize_hardware_bits(struct wm_softc *sc)
CSR_WRITE(sc, WMREG_TARC0, tarc0);
switch (sc->sc_type) {
/*
* 8257[12] Errata No.52, 82573 Errata No.43 and some others.
* Avoid RSS Hash Value bug.
*/
case WM_T_82571:
case WM_T_82572:
case WM_T_82573:
case WM_T_80003:
case WM_T_ICH8:
/*
* 8257[12] Errata No.52, 82573 Errata No.43 and some
* others to avoid RSS Hash Value bug.
*/
reg = CSR_READ(sc, WMREG_RFCTL);
reg |= WMREG_RFCTL_NEWIPV6EXDIS |WMREG_RFCTL_IPV6EXDIS;
CSR_WRITE(sc, WMREG_RFCTL, reg);
@ -5468,6 +5470,11 @@ wm_reset(struct wm_softc *sc)
CSR_WRITE(sc, WMREG_CTRL, reg);
/* Don't insert a completion barrier when reset */
delay(20*1000);
/*
* The EXTCNFCTR_MDIO_SW_OWNERSHIP bit is cleared by the reset,
* so don't use sc->phy.release(sc). Release sc_ich_phymtx
* only. See also wm_get_swflag_ich8lan().
*/
mutex_exit(sc->sc_ich_phymtx);
break;
case WM_T_82580:
@ -6168,7 +6175,8 @@ wm_itrs_writereg(struct wm_softc *sc, struct wm_queue *wmq)
* So, overwrite counter field by software.
*/
if (sc->sc_type == WM_T_82575)
eitr |= __SHIFTIN(wmq->wmq_itr, EITR_COUNTER_MASK_82575);
eitr |= __SHIFTIN(wmq->wmq_itr,
EITR_COUNTER_MASK_82575);
else
eitr |= EITR_CNT_INGR;
@ -6269,7 +6277,8 @@ wm_init_sysctls(struct wm_softc *sc)
goto err;
rv = sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
CTLTYPE_BOOL, "txrx_workqueue", SYSCTL_DESCR("Use workqueue for packet processing"),
CTLTYPE_BOOL, "txrx_workqueue",
SYSCTL_DESCR("Use workqueue for packet processing"),
NULL, 0, &sc->sc_txrx_use_workqueue, 0, CTL_CREATE, CTL_EOL);
if (rv != 0)
goto teardown;
@ -8806,12 +8815,12 @@ wm_nq_tx_offload(struct wm_softc *sc, struct wm_txqueue *txq,
* however it does not cause problems.
*/
/* Fill in the context descriptor. */
txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_vl_len =
txq->txq_nq_descs[txq->txq_next].nqtx_ctx.nqtxc_vl_len =
htole32(vl_len);
txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_sn = 0;
txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_cmd =
txq->txq_nq_descs[txq->txq_next].nqtx_ctx.nqtxc_sn = 0;
txq->txq_nq_descs[txq->txq_next].nqtx_ctx.nqtxc_cmd =
htole32(cmdc);
txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_mssidx =
txq->txq_nq_descs[txq->txq_next].nqtx_ctx.nqtxc_mssidx =
htole32(mssidx);
wm_cdtxsync(txq, txq->txq_next, 1, BUS_DMASYNC_PREWRITE);
DPRINTF(sc, WM_DEBUG_TX,
@ -10075,9 +10084,13 @@ static inline void
wm_sched_handle_queue(struct wm_softc *sc, struct wm_queue *wmq)
{
if (wmq->wmq_txrx_use_workqueue)
workqueue_enqueue(sc->sc_queue_wq, &wmq->wmq_cookie, curcpu());
else
if (wmq->wmq_txrx_use_workqueue) {
if (!wmq->wmq_wq_enqueued) {
wmq->wmq_wq_enqueued = true;
workqueue_enqueue(sc->sc_queue_wq, &wmq->wmq_cookie,
curcpu());
}
} else
softint_schedule(wmq->wmq_si);
}
@ -10376,8 +10389,10 @@ wm_handle_queue_work(struct work *wk, void *context)
struct wm_queue *wmq = container_of(wk, struct wm_queue, wmq_cookie);
/*
* "enqueued flag" is not required here.
* Some qemu environment workaround. They don't stop interrupt
* immediately.
*/
wmq->wmq_wq_enqueued = false;
wm_handle_queue(wmq);
}
@ -12191,8 +12206,8 @@ wm_gmii_statchg(struct ifnet *ifp)
CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ? WMREG_OLD_FCRTL
: WMREG_FCRTL, sc->sc_fcrtl);
CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ?
WMREG_OLD_FCRTL : WMREG_FCRTL, sc->sc_fcrtl);
if (sc->sc_type == WM_T_80003) {
switch (IFM_SUBTYPE(mii->mii_media_active)) {
case IFM_1000_T:
@ -15221,8 +15236,8 @@ wm_init_phy_workarounds_pchlan(struct wm_softc *sc)
/* Acquire PHY semaphore */
rv = sc->phy.acquire(sc);
if (rv != 0) {
DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s: failed\n",
device_xname(sc->sc_dev), __func__));
DPRINTF(sc, WM_DEBUG_INIT,
("%s: %s: failed\n", device_xname(sc->sc_dev), __func__));
return rv;
}
@ -15468,8 +15483,8 @@ wm_ulp_disable(struct wm_softc *sc)
/* Acquire semaphore */
rv = sc->phy.acquire(sc);
if (rv != 0) {
DPRINTF(sc, WM_DEBUG_INIT, ("%s: %s: failed\n",
device_xname(sc->sc_dev), __func__));
DPRINTF(sc, WM_DEBUG_INIT,
("%s: %s: failed\n", device_xname(sc->sc_dev), __func__));
return rv;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: if_wmreg.h,v 1.98.6.15 2022/09/07 10:09:20 martin Exp $ */
/* $NetBSD: if_wmreg.h,v 1.98.6.16 2023/01/23 14:01:26 martin Exp $ */
/*
* Copyright (c) 2001 Wasabi Systems, Inc.
@ -1703,7 +1703,7 @@ typedef union nq_txdesc {
uint32_t nqtxc_sn;
uint32_t nqtxc_cmd;
uint32_t nqtxc_mssidx;
} nqrx_ctx;
} nqtx_ctx;
} __packed nq_txdesc_t;