via_rhine: Sync with FreeBSD 11.1.
Untested, but the changes are minimal, and the FreeBSD 9 driver worked on an old tower that I wasn't bothered to boot up just to test this. The new driver uses an interrupt filter to boot, so we don't even need that glue anymore. Also make the build system logic closer to the other FreeBSD drivers.
This commit is contained in:
@@ -21,7 +21,6 @@ SubInclude HAIKU_TOP src add-ons kernel drivers network wb840 ;
|
||||
# FreeBSD 9.2 drivers
|
||||
SubInclude HAIKU_TOP src add-ons kernel drivers network 3com ;
|
||||
SubInclude HAIKU_TOP src add-ons kernel drivers network dec21xxx ;
|
||||
SubInclude HAIKU_TOP src add-ons kernel drivers network via_rhine ;
|
||||
|
||||
# FreeBSD 9.3 drivers
|
||||
SubInclude HAIKU_TOP src add-ons kernel drivers network jmicron2x0 ;
|
||||
@@ -42,4 +41,5 @@ SubInclude HAIKU_TOP src add-ons kernel drivers network rdc ;
|
||||
SubInclude HAIKU_TOP src add-ons kernel drivers network rtl8139 ;
|
||||
SubInclude HAIKU_TOP src add-ons kernel drivers network rtl81xx ;
|
||||
SubInclude HAIKU_TOP src add-ons kernel drivers network syskonnect ;
|
||||
SubInclude HAIKU_TOP src add-ons kernel drivers network via_rhine ;
|
||||
SubInclude HAIKU_TOP src add-ons kernel drivers network vt612x ;
|
||||
|
||||
@@ -1,3 +1,27 @@
|
||||
SubDir HAIKU_TOP src add-ons kernel drivers network via_rhine ;
|
||||
|
||||
SubInclude HAIKU_TOP src add-ons kernel drivers network via_rhine dev ;
|
||||
UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd11_network compat ]
|
||||
: true ;
|
||||
UsePrivateHeaders net system ;
|
||||
UsePrivateKernelHeaders ;
|
||||
|
||||
SubDirCcFlags [ FDefines _KERNEL=1 FBSD_DRIVER=1 ] ;
|
||||
|
||||
UseHeaders [ FDirName $(SUBDIR) ] : true ;
|
||||
|
||||
SEARCH_SOURCE += [ FDirName $(SUBDIR) dev mii ] ;
|
||||
SEARCH_SOURCE += [ FDirName $(SUBDIR) dev vr ] ;
|
||||
|
||||
KernelAddon via_rhine :
|
||||
glue.c
|
||||
ciphy.c
|
||||
ukphy.c
|
||||
ukphy_subr.c
|
||||
if_vr.c
|
||||
: libfreebsd11_network.a
|
||||
;
|
||||
|
||||
ObjectHdrs [ FGristFiles ciphy$(SUFOBJ) ukphy$(SUFOBJ) ]
|
||||
: [ FDirName $(TARGET_COMMON_DEBUG_OBJECT_DIR_$(TARGET_PACKAGING_ARCH)) libs
|
||||
compat freebsd11_network ] ;
|
||||
Includes [ FGristFiles ciphy.c ukphy.c ] : <src!libs!compat!freebsd11_network>miidevs.h ;
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
SubDir HAIKU_TOP src add-ons kernel drivers network via_rhine dev ;
|
||||
|
||||
SubInclude HAIKU_TOP src add-ons kernel drivers network via_rhine dev mii ;
|
||||
SubInclude HAIKU_TOP src add-ons kernel drivers network via_rhine dev vr ;
|
||||
@@ -1,22 +0,0 @@
|
||||
SubDir HAIKU_TOP src add-ons kernel drivers network via_rhine dev mii ;
|
||||
|
||||
UseHeaders [ FDirName $(SUBDIR) .. .. ] : true ;
|
||||
UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_network compat ] : true ;
|
||||
|
||||
UsePrivateHeaders net system ;
|
||||
UsePrivateKernelHeaders ;
|
||||
|
||||
SubDirCcFlags [ FDefines _KERNEL=1 FBSD_DRIVER=1 ] ;
|
||||
|
||||
KernelStaticLibrary via_rhine_mii.a
|
||||
:
|
||||
ciphy.c
|
||||
ukphy.c
|
||||
ukphy_subr.c
|
||||
;
|
||||
|
||||
ObjectHdrs [ FGristFiles ciphy$(SUFOBJ) ukphy$(SUFOBJ) ]
|
||||
: [ FDirName $(TARGET_COMMON_DEBUG_OBJECT_DIR_$(TARGET_PACKAGING_ARCH)) libs
|
||||
compat freebsd_network ] ;
|
||||
Includes [ FGristFiles ciphy.c ukphy.c ] : <src!libs!compat!freebsd_network>miidevs.h ;
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
__FBSDID("$FreeBSD: releng/11.1/sys/dev/mii/ciphy.c 277093 2015-01-12 22:27:38Z glebius $");
|
||||
|
||||
/*
|
||||
* Driver for the Cicada/Vitesse CS/VSC8xxx 10/100/1000 copper PHY.
|
||||
@@ -91,8 +91,10 @@ static const struct mii_phydesc ciphys[] = {
|
||||
MII_PHY_DESC(xxCICADA, CS8201B),
|
||||
MII_PHY_DESC(xxCICADA, CS8204),
|
||||
MII_PHY_DESC(xxCICADA, VSC8211),
|
||||
MII_PHY_DESC(xxCICADA, VSC8221),
|
||||
MII_PHY_DESC(xxCICADA, CS8244),
|
||||
MII_PHY_DESC(xxVITESSE, VSC8601),
|
||||
MII_PHY_DESC(xxVITESSE, VSC8641),
|
||||
MII_PHY_END
|
||||
};
|
||||
|
||||
@@ -129,12 +131,6 @@ ciphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
|
||||
break;
|
||||
|
||||
case MII_MEDIACHG:
|
||||
/*
|
||||
* If the interface is not up, don't do anything.
|
||||
*/
|
||||
if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
|
||||
break;
|
||||
|
||||
ciphy_fixup(sc); /* XXX hardware bug work-around */
|
||||
|
||||
switch (IFM_SUBTYPE(ife->ifm_media)) {
|
||||
@@ -184,12 +180,6 @@ setit:
|
||||
break;
|
||||
|
||||
case MII_TICK:
|
||||
/*
|
||||
* Is the interface even up?
|
||||
*/
|
||||
if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Only used for autonegotiation.
|
||||
*/
|
||||
@@ -313,8 +303,7 @@ ciphy_fixup(struct mii_softc *sc)
|
||||
status = PHY_READ(sc, CIPHY_MII_AUXCSR);
|
||||
speed = status & CIPHY_AUXCSR_SPEED;
|
||||
|
||||
if (strcmp(device_get_name(device_get_parent(sc->mii_dev)),
|
||||
"nfe") == 0) {
|
||||
if (mii_phy_mac_match(sc, "nfe")) {
|
||||
/* need to set for 2.5V RGMII for NVIDIA adapters */
|
||||
val = PHY_READ(sc, CIPHY_MII_ECTL1);
|
||||
val &= ~(CIPHY_ECTL1_IOVOL | CIPHY_ECTL1_INTSEL);
|
||||
@@ -368,8 +357,10 @@ ciphy_fixup(struct mii_softc *sc)
|
||||
|
||||
break;
|
||||
case MII_MODEL_xxCICADA_VSC8211:
|
||||
case MII_MODEL_xxCICADA_VSC8221:
|
||||
case MII_MODEL_xxCICADA_CS8244:
|
||||
case MII_MODEL_xxVITESSE_VSC8601:
|
||||
case MII_MODEL_xxVITESSE_VSC8641:
|
||||
break;
|
||||
default:
|
||||
device_printf(sc->mii_dev, "unknown CICADA PHY model %x\n",
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $FreeBSD: releng/11.1/sys/dev/mii/ciphyreg.h 220938 2011-04-22 09:22:27Z marius $
|
||||
*/
|
||||
|
||||
#ifndef _DEV_MII_CIPHYREG_H_
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
__FBSDID("$FreeBSD: releng/11.1/sys/dev/mii/ukphy.c 257184 2013-10-26 18:40:17Z glebius $");
|
||||
|
||||
/*
|
||||
* driver for generic unknown PHYs
|
||||
@@ -140,12 +140,6 @@ ukphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
|
||||
break;
|
||||
|
||||
case MII_MEDIACHG:
|
||||
/*
|
||||
* If the interface is not up, don't do anything.
|
||||
*/
|
||||
if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
|
||||
break;
|
||||
|
||||
mii_phy_setmedia(sc);
|
||||
break;
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
__FBSDID("$FreeBSD: releng/11.1/sys/dev/mii/ukphy_subr.c 215297 2010-11-14 13:26:10Z marius $");
|
||||
|
||||
/*
|
||||
* Subroutines shared by the ukphy driver and other PHY drivers.
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
SubDir HAIKU_TOP src add-ons kernel drivers network via_rhine dev vr ;
|
||||
|
||||
UseHeaders [ FDirName $(SUBDIR) $(DOTDOT) $(DOTDOT) ] : true ;
|
||||
UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_network compat ] : true ;
|
||||
|
||||
UsePrivateHeaders net system ;
|
||||
UsePrivateKernelHeaders ;
|
||||
|
||||
SubDirCcFlags [ FDefines _KERNEL=1 FBSD_DRIVER=1 ] ;
|
||||
|
||||
KernelAddon via_rhine :
|
||||
if_vr.c
|
||||
glue.c
|
||||
: libfreebsd_network.a via_rhine_mii.a
|
||||
;
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
__FBSDID("$FreeBSD: releng/11.1/sys/dev/vr/if_vr.c 296272 2016-03-01 17:47:32Z jhb $");
|
||||
|
||||
/*
|
||||
* VIA Rhine fast ethernet PCI NIC driver
|
||||
@@ -80,6 +80,7 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#include <net/bpf.h>
|
||||
#include <net/if.h>
|
||||
#include <net/if_var.h>
|
||||
#include <net/ethernet.h>
|
||||
#include <net/if_dl.h>
|
||||
#include <net/if_media.h>
|
||||
@@ -165,7 +166,8 @@ static void vr_txeof(struct vr_softc *);
|
||||
static void vr_tick(void *);
|
||||
static int vr_error(struct vr_softc *, uint16_t);
|
||||
static void vr_tx_underrun(struct vr_softc *);
|
||||
static void vr_intr(void *);
|
||||
static int vr_intr(void *);
|
||||
static void vr_int_task(void *, int);
|
||||
static void vr_start(struct ifnet *);
|
||||
static void vr_start_locked(struct ifnet *);
|
||||
static int vr_encap(struct vr_softc *, struct mbuf **);
|
||||
@@ -236,31 +238,6 @@ static devclass_t vr_devclass;
|
||||
DRIVER_MODULE(vr, pci, vr_driver, vr_devclass, 0, 0);
|
||||
DRIVER_MODULE(miibus, vr, miibus_driver, miibus_devclass, 0, 0);
|
||||
|
||||
|
||||
#ifdef __HAIKU__
|
||||
int
|
||||
__haiku_disable_interrupts(device_t dev)
|
||||
{
|
||||
struct vr_softc *sc = device_get_softc(dev);
|
||||
|
||||
if (CSR_READ_2(sc, VR_ISR) == 0)
|
||||
return 0;
|
||||
|
||||
CSR_WRITE_2(sc, VR_IMR, 0x0000);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
__haiku_reenable_interrupts(device_t dev)
|
||||
{
|
||||
struct vr_softc *sc = device_get_softc(dev);
|
||||
|
||||
CSR_WRITE_2(sc, VR_IMR, VR_INTRS);
|
||||
}
|
||||
#endif /* __HAIKU__ */
|
||||
|
||||
|
||||
static int
|
||||
vr_miibus_readreg(device_t dev, int phy, int reg)
|
||||
{
|
||||
@@ -683,6 +660,8 @@ vr_attach(device_t dev)
|
||||
ifp->if_snd.ifq_maxlen = VR_TX_RING_CNT - 1;
|
||||
IFQ_SET_READY(&ifp->if_snd);
|
||||
|
||||
TASK_INIT(&sc->vr_inttask, 0, vr_int_task, sc);
|
||||
|
||||
/* Configure Tx FIFO threshold. */
|
||||
sc->vr_txthresh = VR_TXTHRESH_MIN;
|
||||
if (sc->vr_revid < REV_ID_VT6105_A0) {
|
||||
@@ -805,11 +784,11 @@ vr_attach(device_t dev)
|
||||
* Must appear after the call to ether_ifattach() because
|
||||
* ether_ifattach() sets ifi_hdrlen to the default value.
|
||||
*/
|
||||
ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
|
||||
ifp->if_hdrlen = sizeof(struct ether_vlan_header);
|
||||
|
||||
/* Hook interrupt last to avoid having to lock softc. */
|
||||
error = bus_setup_intr(dev, sc->vr_irq, INTR_TYPE_NET | INTR_MPSAFE,
|
||||
NULL, vr_intr, sc, &sc->vr_intrhand);
|
||||
vr_intr, NULL, sc, &sc->vr_intrhand);
|
||||
|
||||
if (error) {
|
||||
device_printf(dev, "couldn't set up irq\n");
|
||||
@@ -851,6 +830,7 @@ vr_detach(device_t dev)
|
||||
vr_stop(sc);
|
||||
VR_UNLOCK(sc);
|
||||
callout_drain(&sc->vr_stat_callout);
|
||||
taskqueue_drain(taskqueue_fast, &sc->vr_inttask);
|
||||
ether_ifdetach(ifp);
|
||||
}
|
||||
if (sc->vr_miibus)
|
||||
@@ -1080,31 +1060,29 @@ vr_dma_free(struct vr_softc *sc)
|
||||
|
||||
/* Tx ring. */
|
||||
if (sc->vr_cdata.vr_tx_ring_tag) {
|
||||
if (sc->vr_cdata.vr_tx_ring_map)
|
||||
if (sc->vr_rdata.vr_tx_ring_paddr)
|
||||
bus_dmamap_unload(sc->vr_cdata.vr_tx_ring_tag,
|
||||
sc->vr_cdata.vr_tx_ring_map);
|
||||
if (sc->vr_cdata.vr_tx_ring_map &&
|
||||
sc->vr_rdata.vr_tx_ring)
|
||||
if (sc->vr_rdata.vr_tx_ring)
|
||||
bus_dmamem_free(sc->vr_cdata.vr_tx_ring_tag,
|
||||
sc->vr_rdata.vr_tx_ring,
|
||||
sc->vr_cdata.vr_tx_ring_map);
|
||||
sc->vr_rdata.vr_tx_ring = NULL;
|
||||
sc->vr_cdata.vr_tx_ring_map = NULL;
|
||||
sc->vr_rdata.vr_tx_ring_paddr = 0;
|
||||
bus_dma_tag_destroy(sc->vr_cdata.vr_tx_ring_tag);
|
||||
sc->vr_cdata.vr_tx_ring_tag = NULL;
|
||||
}
|
||||
/* Rx ring. */
|
||||
if (sc->vr_cdata.vr_rx_ring_tag) {
|
||||
if (sc->vr_cdata.vr_rx_ring_map)
|
||||
if (sc->vr_rdata.vr_rx_ring_paddr)
|
||||
bus_dmamap_unload(sc->vr_cdata.vr_rx_ring_tag,
|
||||
sc->vr_cdata.vr_rx_ring_map);
|
||||
if (sc->vr_cdata.vr_rx_ring_map &&
|
||||
sc->vr_rdata.vr_rx_ring)
|
||||
if (sc->vr_rdata.vr_rx_ring)
|
||||
bus_dmamem_free(sc->vr_cdata.vr_rx_ring_tag,
|
||||
sc->vr_rdata.vr_rx_ring,
|
||||
sc->vr_cdata.vr_rx_ring_map);
|
||||
sc->vr_rdata.vr_rx_ring = NULL;
|
||||
sc->vr_cdata.vr_rx_ring_map = NULL;
|
||||
sc->vr_rdata.vr_rx_ring_paddr = 0;
|
||||
bus_dma_tag_destroy(sc->vr_cdata.vr_rx_ring_tag);
|
||||
sc->vr_cdata.vr_rx_ring_tag = NULL;
|
||||
}
|
||||
@@ -1347,7 +1325,7 @@ vr_rxeof(struct vr_softc *sc)
|
||||
if ((rxstat & VR_RXSTAT_RX_OK) == 0 ||
|
||||
(rxstat & (VR_RXSTAT_FIRSTFRAG | VR_RXSTAT_LASTFRAG)) !=
|
||||
(VR_RXSTAT_FIRSTFRAG | VR_RXSTAT_LASTFRAG)) {
|
||||
ifp->if_ierrors++;
|
||||
if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
|
||||
sc->vr_stat.rx_errors++;
|
||||
if (rxstat & VR_RXSTAT_CRCERR)
|
||||
sc->vr_stat.rx_crc_errors++;
|
||||
@@ -1370,7 +1348,7 @@ vr_rxeof(struct vr_softc *sc)
|
||||
}
|
||||
|
||||
if (vr_newbuf(sc, cons) != 0) {
|
||||
ifp->if_iqdrops++;
|
||||
if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
|
||||
sc->vr_stat.rx_errors++;
|
||||
sc->vr_stat.rx_no_mbufs++;
|
||||
vr_discard_rxbuf(rxd);
|
||||
@@ -1398,7 +1376,7 @@ vr_rxeof(struct vr_softc *sc)
|
||||
vr_fixup_rx(m);
|
||||
#endif
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
ifp->if_ipackets++;
|
||||
if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
|
||||
sc->vr_stat.rx_ok++;
|
||||
if ((ifp->if_capenable & IFCAP_RXCSUM) != 0 &&
|
||||
(rxstat & VR_RXSTAT_FRAG) == 0 &&
|
||||
@@ -1488,7 +1466,7 @@ vr_txeof(struct vr_softc *sc)
|
||||
__func__));
|
||||
|
||||
if ((txstat & VR_TXSTAT_ERRSUM) != 0) {
|
||||
ifp->if_oerrors++;
|
||||
if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
|
||||
sc->vr_stat.tx_errors++;
|
||||
if ((txstat & VR_TXSTAT_ABRT) != 0) {
|
||||
/* Give up and restart Tx. */
|
||||
@@ -1526,28 +1504,28 @@ vr_txeof(struct vr_softc *sc)
|
||||
return;
|
||||
}
|
||||
if ((txstat & VR_TXSTAT_DEFER) != 0) {
|
||||
ifp->if_collisions++;
|
||||
if_inc_counter(ifp, IFCOUNTER_COLLISIONS, 1);
|
||||
sc->vr_stat.tx_collisions++;
|
||||
}
|
||||
if ((txstat & VR_TXSTAT_LATECOLL) != 0) {
|
||||
ifp->if_collisions++;
|
||||
if_inc_counter(ifp, IFCOUNTER_COLLISIONS, 1);
|
||||
sc->vr_stat.tx_late_collisions++;
|
||||
}
|
||||
} else {
|
||||
sc->vr_stat.tx_ok++;
|
||||
ifp->if_opackets++;
|
||||
if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
|
||||
}
|
||||
|
||||
bus_dmamap_sync(sc->vr_cdata.vr_tx_tag, txd->tx_dmamap,
|
||||
BUS_DMASYNC_POSTWRITE);
|
||||
bus_dmamap_unload(sc->vr_cdata.vr_tx_tag, txd->tx_dmamap);
|
||||
if (sc->vr_revid < REV_ID_VT3071_A) {
|
||||
ifp->if_collisions +=
|
||||
(txstat & VR_TXSTAT_COLLCNT) >> 3;
|
||||
if_inc_counter(ifp, IFCOUNTER_COLLISIONS,
|
||||
(txstat & VR_TXSTAT_COLLCNT) >> 3);
|
||||
sc->vr_stat.tx_collisions +=
|
||||
(txstat & VR_TXSTAT_COLLCNT) >> 3;
|
||||
} else {
|
||||
ifp->if_collisions += (txstat & 0x0f);
|
||||
if_inc_counter(ifp, IFCOUNTER_COLLISIONS, (txstat & 0x0f));
|
||||
sc->vr_stat.tx_collisions += (txstat & 0x0f);
|
||||
}
|
||||
m_freem(txd->tx_m);
|
||||
@@ -1678,8 +1656,28 @@ vr_tx_underrun(struct vr_softc *sc)
|
||||
vr_tx_start(sc);
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
vr_intr(void *arg)
|
||||
{
|
||||
struct vr_softc *sc;
|
||||
uint16_t status;
|
||||
|
||||
sc = (struct vr_softc *)arg;
|
||||
|
||||
status = CSR_READ_2(sc, VR_ISR);
|
||||
if (status == 0 || status == 0xffff || (status & VR_INTRS) == 0)
|
||||
return (FILTER_STRAY);
|
||||
|
||||
/* Disable interrupts. */
|
||||
CSR_WRITE_2(sc, VR_IMR, 0x0000);
|
||||
|
||||
taskqueue_enqueue(taskqueue_fast, &sc->vr_inttask);
|
||||
|
||||
return (FILTER_HANDLED);
|
||||
}
|
||||
|
||||
static void
|
||||
vr_int_task(void *arg, int npending)
|
||||
{
|
||||
struct vr_softc *sc;
|
||||
struct ifnet *ifp;
|
||||
@@ -1693,9 +1691,6 @@ vr_intr(void *arg)
|
||||
goto done_locked;
|
||||
|
||||
status = CSR_READ_2(sc, VR_ISR);
|
||||
if (status == 0 || status == 0xffff || (status & VR_INTRS) == 0)
|
||||
goto done_locked;
|
||||
|
||||
ifp = sc->vr_ifp;
|
||||
#ifdef DEVICE_POLLING
|
||||
if ((ifp->if_capenable & IFCAP_POLLING) != 0)
|
||||
@@ -1710,9 +1705,6 @@ vr_intr(void *arg)
|
||||
goto done_locked;
|
||||
}
|
||||
|
||||
/* Disable interrupts. */
|
||||
CSR_WRITE_2(sc, VR_IMR, 0x0000);
|
||||
|
||||
for (; (status & VR_INTRS) != 0;) {
|
||||
CSR_WRITE_2(sc, VR_ISR, status);
|
||||
if ((status & (VR_ISR_BUSERR | VR_ISR_LINKSTAT2 |
|
||||
@@ -1732,15 +1724,16 @@ vr_intr(void *arg)
|
||||
vr_rx_start(sc);
|
||||
}
|
||||
vr_txeof(sc);
|
||||
|
||||
if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
|
||||
vr_start_locked(ifp);
|
||||
|
||||
status = CSR_READ_2(sc, VR_ISR);
|
||||
}
|
||||
|
||||
/* Re-enable interrupts. */
|
||||
CSR_WRITE_2(sc, VR_IMR, VR_INTRS);
|
||||
|
||||
if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
|
||||
vr_start_locked(ifp);
|
||||
|
||||
done_locked:
|
||||
VR_UNLOCK(sc);
|
||||
}
|
||||
@@ -2325,13 +2318,13 @@ vr_watchdog(struct vr_softc *sc)
|
||||
if (bootverbose)
|
||||
if_printf(sc->vr_ifp, "watchdog timeout "
|
||||
"(missed link)\n");
|
||||
ifp->if_oerrors++;
|
||||
if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
|
||||
ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
|
||||
vr_init_locked(sc);
|
||||
return;
|
||||
}
|
||||
|
||||
ifp->if_oerrors++;
|
||||
if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
|
||||
if_printf(ifp, "watchdog timeout\n");
|
||||
|
||||
ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
* $FreeBSD: releng/11.1/sys/dev/vr/if_vrreg.h 235334 2012-05-12 14:37:25Z rpaulo $
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -738,6 +738,7 @@ struct vr_softc {
|
||||
#ifdef DEVICE_POLLING
|
||||
int rxcycles;
|
||||
#endif
|
||||
struct task vr_inttask;
|
||||
};
|
||||
|
||||
#define VR_LOCK(_sc) mtx_lock(&(_sc)->vr_mtx)
|
||||
|
||||
+3
-2
@@ -8,7 +8,9 @@
|
||||
|
||||
|
||||
HAIKU_FBSD_DRIVER_GLUE(via_rhine, vr, pci);
|
||||
HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_SWI_TASKQUEUE);
|
||||
HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_FAST_TASKQUEUE);
|
||||
NO_HAIKU_CHECK_DISABLE_INTERRUPTS();
|
||||
NO_HAIKU_REENABLE_INTERRUPTS();
|
||||
|
||||
|
||||
extern driver_t *DRIVER_MODULE_NAME(ciphy, miibus);
|
||||
@@ -26,4 +28,3 @@ __haiku_select_miibus_driver(device_t dev)
|
||||
|
||||
return __haiku_probe_miibus(dev, drivers);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user