kern/87114: [xl] xl0 : watchdog timeout on 6.0 (regression)
Василий Леонидови
Василий Леонидови
Sun Nov 27 14:40:05 GMT 2005
The following reply was made to PR kern/87114; it has been noted by GNATS.
From: =?windows-1251?Q?=C2=E0=F1=E8=EB=E8=E9_=CB=E5=EE=ED=E8=E4=EE=E2=E8?=
=?windows-1251?Q?=F7_=CE=EB=E5=F5=EE=E2?= <olekhov at yandex.ru>
To: bug-followup at FreeBSD.org, befree_fr at mac.com
Cc:
Subject: Re: kern/87114: [xl] xl0 : watchdog timeout on 6.0 (regression)
Date: Sun, 27 Nov 2005 17:32:51 +0300
This is a multi-part message in MIME format.
--------------060607060705050806060607
Content-Type: text/plain; charset=windows-1251; format=flowed
Content-Transfer-Encoding: 7bit
"me too"
Used hardware: HP Omnibook 900b, 440BX chipset (Intel 82443BX),
PIII-450, PCMCIA Card: 3Com 3CXFE575CT
on 6.0-RELEASE networking doesn't work.
portions from dmesg:
> cardbus0: Resource not specified in CIS: id=14, size=80
> cardbus0: Resource not specified in CIS: id=18, size=80
> xl0: <3Com 3c575C Fast Etherlink XL> port 0x1000-0x107f mem 0x88000000-0x8800007f,0x88000080-0x880000ff irq 10 at device 0.0 on cardbus0
> miibus0: <MII bus> on xl0
> tdkphy0: <TDK 78Q2120 media interface> on miibus0
> tdkphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
> xl0: Ethernet address: 00:00:86:3d:b2:d9
> xl0: link state changed to DOWN
> xl0: link state changed to UP
> xl0: watchdog timeout
symptoms:
When the interface xl0 brings up, the led on hub lights up, but nor data
can be transmitted, nor pings, etc.
When I try to assign a used IP address to the interface, system reports
that it is already used by a device with specified MAC address.
Sometimes, very rare, 'pings' get through, but with immense replies,
about 5000msec (5 seconds)
xl0: watchdog timeout occurs about once a minute.
This probably indicates, that low-level protocols are still somehow
functionating.
xl works fine when I boot the notebook with kernel 5.4-RELEASE,
previously compiled on another machine.
backporting of if_xl driver from 5.4-REL to 6.0-REL does not help.
(backport patch attached).
Attaching the device after system boots up does not help. various
combinations:
xl built in kernel:
* boot with device detached, attach after root login
* boot with device attached
xl as module:
* boot with device detached, kldload xl, attach device
* boot with device detached, attach after root login, kldload xl
* boot with device attached, kldload xl after root login
+ same with acpi disabled (some lists indicate that this could help)
It seems, that problem is probably in cardbus driver.
--------------060607060705050806060607
Content-Type: text/plain;
name="if_xl.5.4-REL.ported.to.6.0-REL.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="if_xl.5.4-REL.ported.to.6.0-REL.patch"
Index: if_xl.c
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_xl.c,v
retrieving revision 1.190.2.6
diff -u -r1.190.2.6 if_xl.c
--- if_xl.c 9 Oct 2005 04:11:20 -0000 1.190.2.6
+++ if_xl.c 23 Nov 2005 18:59:02 -0000
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: src/sys/pci/if_xl.c,v 1.179.2.6 2005/03/01 08:11:52 imp Exp $");
/*
* 3Com 3c90x Etherlink XL PCI NIC driver
@@ -101,10 +101,6 @@
* PCI-based NICs.
*/
-#ifdef HAVE_KERNEL_OPTION_HEADERS
-#include "opt_device_polling.h"
-#endif
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/sockio.h>
@@ -113,7 +109,6 @@
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/socket.h>
-#include <sys/taskqueue.h>
#include <net/if.h>
#include <net/if_arp.h>
@@ -232,7 +227,6 @@
static void xl_stats_update_locked(struct xl_softc *);
static int xl_encap(struct xl_softc *, struct xl_chain *, struct mbuf *);
static void xl_rxeof(struct xl_softc *);
-static void xl_rxeof_task(void *, int);
static int xl_rx_resync(struct xl_softc *);
static void xl_txeof(struct xl_softc *);
static void xl_txeof_90xB(struct xl_softc *);
@@ -250,11 +244,6 @@
static int xl_suspend(device_t);
static int xl_resume(device_t);
-#ifdef DEVICE_POLLING
-static void xl_poll(struct ifnet *ifp, enum poll_cmd cmd, int count);
-static void xl_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count);
-#endif
-
static int xl_ifmedia_upd(struct ifnet *);
static void xl_ifmedia_sts(struct ifnet *, struct ifmediareq *);
@@ -462,6 +451,8 @@
{
int i, ack;
+ /*XL_LOCK_ASSERT(sc);*/
+
/* Set up frame for RX. */
frame->mii_stdelim = XL_MII_STARTDELIM;
frame->mii_opcode = XL_MII_READOP;
@@ -530,6 +521,8 @@
xl_mii_writereg(struct xl_softc *sc, struct xl_mii_frame *frame)
{
+ /*XL_LOCK_ASSERT(sc);*/
+
/* Set up frame for TX. */
frame->mii_stdelim = XL_MII_STARTDELIM;
frame->mii_opcode = XL_MII_WRITEOP;
@@ -617,6 +610,8 @@
sc = device_get_softc(dev);
mii = device_get_softc(sc->xl_miibus);
+ /*XL_LOCK_ASSERT(sc);*/
+
xl_setcfg(sc);
/* Set ASIC's duplex mode to match the PHY. */
@@ -649,6 +644,8 @@
mii = device_get_softc(sc->xl_miibus);
ifm = &mii->mii_media;
+ /*XL_LOCK_ASSERT(sc);*/
+
if (sc->xl_media & (XL_MEDIAOPT_AUI | XL_MEDIAOPT_10FL)) {
/*
* Check for a 10baseFL board in disguise.
@@ -712,6 +709,8 @@
int err = 0, i;
u_int16_t word = 0, *ptr;
+ XL_LOCK_ASSERT(sc);
+
#define EEPROM_5BIT_OFFSET(A) ((((A) << 2) & 0x7F00) | ((A) & 0x003F))
#define EEPROM_8BIT_OFFSET(A) ((A) & 0x003F)
/*
@@ -771,10 +770,8 @@
return;
}
- IF_ADDR_LOCK(ifp);
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link)
mcnt++;
- IF_ADDR_UNLOCK(ifp);
if (mcnt)
rxfilt |= XL_RXFILTER_ALLMULTI;
@@ -813,7 +810,6 @@
CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_RX_SET_HASH|i);
/* now program new ones */
- IF_ADDR_LOCK(ifp);
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
if (ifma->ifma_addr->sa_family != AF_LINK)
continue;
@@ -835,7 +831,6 @@
h | XL_CMD_RX_SET_HASH | XL_HASH_SET);
mcnt++;
}
- IF_ADDR_UNLOCK(ifp);
if (mcnt)
rxfilt |= XL_RXFILTER_MULTIHASH;
@@ -898,7 +893,7 @@
u_int16_t mediastat;
char *pmsg = "", *dmsg = "";
- XL_LOCK_ASSERT(sc);
+ /*XL_LOCK_ASSERT(sc);*/
XL_SEL_WIN(4);
mediastat = CSR_READ_2(sc, XL_W4_MEDIA_STATUS);
@@ -1085,6 +1080,8 @@
xl_mediacheck(struct xl_softc *sc)
{
+ XL_LOCK_ASSERT(sc);
+
/*
* If some of the media options bits are set, assume they are
* correct. If not, try to figure it out down below.
@@ -1351,10 +1348,10 @@
ifp->if_softc = sc;
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
- /* Reset the adapter. */
XL_LOCK(sc);
+
+ /* Reset the adapter. */
xl_reset(sc);
- XL_UNLOCK(sc);
/*
* Get station address from the EEPROM.
@@ -1362,12 +1359,14 @@
if (xl_read_eeprom(sc, (caddr_t)&eaddr, XL_EE_OEM_ADR0, 3, 1)) {
device_printf(dev, "failed to read station address\n");
error = ENXIO;
+ XL_UNLOCK(sc);
goto fail;
}
+ XL_UNLOCK(sc);
+
sc->xl_unit = unit;
- callout_init_mtx(&sc->xl_stat_callout, &sc->xl_mtx, 0);
- TASK_INIT(&sc->xl_task, 0, xl_rxeof_task, sc);
+ callout_handle_init(&sc->xl_stat_ch);
/*
* Now allocate a tag for the DMA descriptor lists and a chunk
@@ -1457,6 +1456,8 @@
if (error)
goto fail;
+ XL_LOCK(sc);
+
/*
* Figure out the card type. 3c905B adapters have the
* 'supportsNoTxLength' bit set in the capabilities
@@ -1486,10 +1487,6 @@
ifp->if_capabilities |= IFCAP_HWCSUM;
#endif
}
- ifp->if_capenable = ifp->if_capabilities;
-#ifdef DEVICE_POLLING
- ifp->if_capabilities |= IFCAP_POLLING;
-#endif
ifp->if_start = xl_start;
ifp->if_watchdog = xl_watchdog;
ifp->if_init = xl_init;
@@ -1497,6 +1494,7 @@
IFQ_SET_MAXLEN(&ifp->if_snd, XL_TX_LIST_CNT - 1);
ifp->if_snd.ifq_drv_maxlen = XL_TX_LIST_CNT - 1;
IFQ_SET_READY(&ifp->if_snd);
+ ifp->if_capenable = ifp->if_capabilities;
/*
* Now we have to see what sort of media we have.
@@ -1515,6 +1513,9 @@
xl_mediacheck(sc);
+ /* XXX Downcalls to ifmedia, miibus about to happen. */
+ XL_UNLOCK(sc);
+
if (sc->xl_media & XL_MEDIAOPT_MII ||
sc->xl_media & XL_MEDIAOPT_BTX ||
sc->xl_media & XL_MEDIAOPT_BT4) {
@@ -1535,8 +1536,12 @@
* a 10/100 card of some kind, we need to force the transceiver
* type to something sane.
*/
- if (sc->xl_xcvr == XL_XCVR_AUTO)
+ if (sc->xl_xcvr == XL_XCVR_AUTO) {
+ /* XXX Direct hardware access needs lock coverage. */
+ XL_LOCK(sc);
xl_choose_xcvr(sc, bootverbose);
+ XL_UNLOCK(sc);
+ }
/*
* Do ifmedia setup.
@@ -1585,6 +1590,7 @@
ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_100_FX, 0, NULL);
}
+ /* XXX: Unlocked, leaf will take lock. */
media = IFM_ETHER|IFM_100_TX|IFM_FDX;
xl_choose_media(sc, &media);
@@ -1592,6 +1598,7 @@
ifmedia_set(&sc->ifmedia, media);
done:
+ /* XXX: Unlocked hardware access, narrow race. */
if (sc->xl_flags & XL_FLAG_NO_XCVR_PWR) {
XL_SEL_WIN(0);
CSR_WRITE_2(sc, XL_W0_MFG_ID, XL_NO_XCVR_PWR_MAGICBITS);
@@ -1607,6 +1614,7 @@
if (error) {
device_printf(dev, "couldn't set up irq\n");
ether_ifdetach(ifp);
+ if_free(ifp);
goto fail;
}
@@ -1620,8 +1628,7 @@
/*
* Choose a default media.
* XXX This is a leaf function only called by xl_attach() and
- * acquires/releases the non-recursible driver mutex to
- * satisfy lock assertions.
+ * acquires/releases the non-recursible driver mutex.
*/
static void
xl_choose_media(struct xl_softc *sc, int *media)
@@ -1688,11 +1695,7 @@
ifp = sc->xl_ifp;
KASSERT(mtx_initialized(&sc->xl_mtx), ("xl mutex not initialized"));
-
-#ifdef DEVICE_POLLING
- if (ifp->if_capenable & IFCAP_POLLING)
- ether_poll_deregister(ifp);
-#endif
+ XL_LOCK(sc);
if (sc->xl_flags & XL_FLAG_USE_MMIO) {
rid = XL_PCI_LOMEM;
@@ -1704,16 +1707,11 @@
/* These should only be active if attach succeeded */
if (device_is_attached(dev)) {
- XL_LOCK(sc);
xl_reset(sc);
xl_stop(sc);
- XL_UNLOCK(sc);
- taskqueue_drain(taskqueue_swi, &sc->xl_task);
- callout_drain(&sc->xl_stat_callout);
ether_ifdetach(ifp);
- }
- if (ifp)
if_free(ifp);
+ }
if (sc->xl_miibus)
device_delete_child(dev, sc->xl_miibus);
bus_generic_detach(dev);
@@ -1748,6 +1746,7 @@
bus_dma_tag_destroy(sc->xl_ldata.xl_tx_tag);
}
+ XL_UNLOCK(sc);
mtx_destroy(&sc->xl_mtx);
return (0);
@@ -1963,13 +1962,6 @@
bus_dmamap_sync(sc->xl_ldata.xl_rx_tag, sc->xl_ldata.xl_rx_dmamap,
BUS_DMASYNC_POSTREAD);
while ((rxstat = le32toh(sc->xl_cdata.xl_rx_head->xl_ptr->xl_status))) {
-#ifdef DEVICE_POLLING
- if (ifp->if_capenable & IFCAP_POLLING) {
- if (sc->rxcycles <= 0)
- break;
- sc->rxcycles--;
- }
-#endif
cur_rx = sc->xl_cdata.xl_rx_head;
sc->xl_cdata.xl_rx_head = cur_rx->xl_next;
total_len = rxstat & XL_RXSTAT_LENMASK;
@@ -2057,14 +2049,6 @@
XL_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
XL_LOCK(sc);
-
- /*
- * If we are running from the taskqueue, the interface
- * might have been stopped while we were passing the last
- * packet up the network stack.
- */
- if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
- return;
}
/*
@@ -2091,22 +2075,6 @@
}
/*
- * Taskqueue wrapper for xl_rxeof().
- */
-static void
-xl_rxeof_task(void *arg, int pending)
-{
- struct xl_softc *sc = (struct xl_softc *)arg;
-
- NET_LOCK_GIANT();
- XL_LOCK(sc);
- if (sc->xl_ifp->if_drv_flags & IFF_DRV_RUNNING)
- xl_rxeof(sc);
- XL_UNLOCK(sc);
- NET_UNLOCK_GIANT();
-}
-
-/*
* A frame was downloaded to the chip. It's safe for us to clean up
* the list buffers.
*/
@@ -2278,13 +2246,6 @@
XL_LOCK(sc);
-#ifdef DEVICE_POLLING
- if (ifp->if_capenable & IFCAP_POLLING) {
- XL_UNLOCK(sc);
- return;
- }
-#endif
-
while ((status = CSR_READ_2(sc, XL_STATUS)) & XL_INTRS &&
status != 0xFFFF) {
CSR_WRITE_2(sc, XL_COMMAND,
@@ -2335,67 +2296,6 @@
XL_UNLOCK(sc);
}
-#ifdef DEVICE_POLLING
-static void
-xl_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
-{
- struct xl_softc *sc = ifp->if_softc;
-
- XL_LOCK(sc);
- if (ifp->if_drv_flags & IFF_DRV_RUNNING)
- xl_poll_locked(ifp, cmd, count);
- XL_UNLOCK(sc);
-}
-
-static void
-xl_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count)
-{
- struct xl_softc *sc = ifp->if_softc;
-
- XL_LOCK_ASSERT(sc);
-
- sc->rxcycles = count;
- xl_rxeof(sc);
- if (sc->xl_type == XL_TYPE_905B)
- xl_txeof_90xB(sc);
- else
- xl_txeof(sc);
-
- if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) {
- if (sc->xl_type == XL_TYPE_905B)
- xl_start_90xB_locked(ifp);
- else
- xl_start_locked(ifp);
- }
-
- if (cmd == POLL_AND_CHECK_STATUS) {
- u_int16_t status;
-
- status = CSR_READ_2(sc, XL_STATUS);
- if (status & XL_INTRS && status != 0xFFFF) {
- CSR_WRITE_2(sc, XL_COMMAND,
- XL_CMD_INTR_ACK|(status & XL_INTRS));
-
- if (status & XL_STAT_TX_COMPLETE) {
- ifp->if_oerrors++;
- xl_txeoc(sc);
- }
-
- if (status & XL_STAT_ADFAIL) {
- xl_reset(sc);
- xl_init_locked(sc);
- }
-
- if (status & XL_STAT_STATSOFLOW) {
- sc->xl_stats_no_timeout = 1;
- xl_stats_update_locked(sc);
- sc->xl_stats_no_timeout = 0;
- }
- }
- }
-}
-#endif /* DEVICE_POLLING */
-
/*
* XXX: This is an entry point for callout which needs to take the lock.
*/
@@ -2404,8 +2304,9 @@
{
struct xl_softc *sc = xsc;
- XL_LOCK_ASSERT(sc);
+ XL_LOCK(sc);
xl_stats_update_locked(sc);
+ XL_UNLOCK(sc);
}
static void
@@ -2452,7 +2353,7 @@
XL_SEL_WIN(7);
if (!sc->xl_stats_no_timeout)
- callout_reset(&sc->xl_stat_callout, hz, xl_stats_update, sc);
+ sc->xl_stat_ch = timeout(xl_stats_update, sc, hz);
}
/*
@@ -2677,7 +2578,7 @@
* nature of their chips in all their marketing literature;
* we may as well take advantage of it. :)
*/
- taskqueue_enqueue(taskqueue_swi, &sc->xl_task);
+ xl_rxeof(sc);
}
static void
@@ -2964,12 +2865,6 @@
*/
CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ACK|0xFF);
CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_STAT_ENB|XL_INTRS);
-#ifdef DEVICE_POLLING
- /* Disable interrupts if we are polling. */
- if (ifp->if_capenable & IFCAP_POLLING)
- CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ENB|0);
- else
-#endif
CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ENB|XL_INTRS);
if (sc->xl_flags & XL_FLAG_FUNCREG)
bus_space_write_4(sc->xl_ftag, sc->xl_fhandle, 4, 0x8000);
@@ -2994,7 +2889,7 @@
ifp->if_drv_flags |= IFF_DRV_RUNNING;
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
- callout_reset(&sc->xl_stat_callout, hz, xl_stats_update, sc);
+ sc->xl_stat_ch = timeout(xl_stats_update, sc, hz);
}
/*
@@ -3007,7 +2902,7 @@
struct ifmedia *ifm = NULL;
struct mii_data *mii = NULL;
- XL_LOCK(sc);
+ /*XL_LOCK_ASSERT(sc);*/
if (sc->xl_miibus != NULL)
mii = device_get_softc(sc->xl_miibus);
@@ -3031,13 +2926,11 @@
if (sc->xl_media & XL_MEDIAOPT_MII ||
sc->xl_media & XL_MEDIAOPT_BTX ||
sc->xl_media & XL_MEDIAOPT_BT4) {
- xl_init_locked(sc);
+ xl_init(sc); /* XXX */
} else {
xl_setmode(sc, ifm->ifm_media);
}
- XL_UNLOCK(sc);
-
return (0);
}
@@ -3052,7 +2945,7 @@
u_int16_t status = 0;
struct mii_data *mii = NULL;
- XL_LOCK(sc);
+ /*XL_LOCK_ASSERT(sc);*/
if (sc->xl_miibus != NULL)
mii = device_get_softc(sc->xl_miibus);
@@ -3112,8 +3005,6 @@
if_printf(ifp, "unknown XCVR type: %d\n", icfg);
break;
}
-
- XL_UNLOCK(sc);
}
static int
@@ -3171,6 +3062,8 @@
break;
case SIOCGIFMEDIA:
case SIOCSIFMEDIA:
+ /* XXX Downcall from ifmedia possibly with locks held. */
+ /*XL_LOCK(sc);*/
if (sc->xl_miibus != NULL)
mii = device_get_softc(sc->xl_miibus);
if (mii == NULL)
@@ -3179,37 +3072,9 @@
else
error = ifmedia_ioctl(ifp, ifr,
&mii->mii_media, command);
+ /*XL_UNLOCK(sc);*/
break;
case SIOCSIFCAP:
-#ifdef DEVICE_POLLING
- if (ifr->ifr_reqcap & IFCAP_POLLING &&
- !(ifp->if_capenable & IFCAP_POLLING)) {
- error = ether_poll_register(xl_poll, ifp);
- if (error)
- return(error);
- XL_LOCK(sc);
- /* Disable interrupts */
- CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ENB|0);
- ifp->if_capenable |= IFCAP_POLLING;
- XL_UNLOCK(sc);
- return (error);
-
- }
- if (!(ifr->ifr_reqcap & IFCAP_POLLING) &&
- ifp->if_capenable & IFCAP_POLLING) {
- error = ether_poll_deregister(ifp);
- /* Enable interrupts. */
- XL_LOCK(sc);
- CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ACK|0xFF);
- CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ENB|XL_INTRS);
- if (sc->xl_flags & XL_FLAG_FUNCREG)
- bus_space_write_4(sc->xl_ftag, sc->xl_fhandle,
- 4, 0x8000);
- ifp->if_capenable &= ~IFCAP_POLLING;
- XL_UNLOCK(sc);
- return (error);
- }
-#endif /* DEVICE_POLLING */
XL_LOCK(sc);
ifp->if_capenable = ifr->ifr_reqcap;
if (ifp->if_capenable & IFCAP_TXCSUM)
@@ -3298,7 +3163,7 @@
bus_space_write_4(sc->xl_ftag, sc->xl_fhandle, 4, 0x8000);
/* Stop the stats updater. */
- callout_stop(&sc->xl_stat_callout);
+ untimeout(xl_stats_update, sc, sc->xl_stat_ch);
/*
* Free data in the RX lists.
Index: if_xlreg.h
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_xlreg.h,v
retrieving revision 1.55.2.1
diff -u -r1.55.2.1 if_xlreg.h
--- if_xlreg.h 26 Aug 2005 14:46:22 -0000 1.55.2.1
+++ if_xlreg.h 23 Nov 2005 18:58:46 -0000
@@ -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: src/sys/pci/if_xlreg.h,v 1.50.2.2 2005/01/31 23:26:51 imp Exp $
*/
#define XL_EE_READ 0x0080 /* read, 5 bit address */
@@ -601,16 +601,12 @@
int xl_if_flags;
struct xl_list_data xl_ldata;
struct xl_chain_data xl_cdata;
- struct callout xl_stat_callout;
+ struct callout_handle xl_stat_ch;
int xl_flags;
struct resource *xl_fres;
bus_space_handle_t xl_fhandle;
bus_space_tag_t xl_ftag;
struct mtx xl_mtx;
- struct task xl_task;
-#ifdef DEVICE_POLLING
- int rxcycles;
-#endif
};
#define XL_LOCK(_sc) mtx_lock(&(_sc)->xl_mtx)
--------------060607060705050806060607--
More information about the freebsd-bugs
mailing list