Module Name: src
Committed By: martin
Date: Tue Feb 19 15:05:52 UTC 2019
Modified Files:
src/sys/dev/usb [netbsd-8]: if_axen.c if_axenreg.h
Log Message:
Pull up following revision(s) (requested by rin in ticket #1191):
sys/dev/usb/if_axen.c: revision 1.28
sys/dev/usb/if_axen.c: revision 1.29
sys/dev/usb/if_axenreg.h: revision 1.4
sys/dev/usb/if_axenreg.h: revision 1.5
sys/dev/usb/if_axen.c: revision 1.19
sys/dev/usb/if_axenreg.h: revision 1.8
sys/dev/usb/if_axen.c: revision 1.30
sys/dev/usb/if_axen.c: revision 1.31
sys/dev/usb/if_axen.c: revision 1.36
sys/dev/usb/if_axen.c: revision 1.20
sys/dev/usb/if_axen.c: revision 1.23
sys/dev/usb/if_axen.c: revision 1.25
Fix HW checksum offloading.
- Enable ones specified in if_capenable and remove AXEN_TOE macro.
- Check correct bit and set appropriate csum_flags.
- Pass packets of wrong checksum to upper layer instead of dropping them.
- Fix value of AXEN_RXHDR_L3_TYPE_MASK.
Tested on ASIX Elec. Corp. (0xb95) AX88179 (0x1790).
Fix previous:
- axen_coe() should be called from axen_init(), not axen_ax88179_init().
- Simplify logic in axen_coe(); AXEN_[RT]XCOE_OFF = 0.
Enable hash-table-based multicast filter:
- Drop AXEN_RXCTL_ACPT_PHY_MCAST bit (neither Linux nor FreeBSD sets it).
- 0x0010 bit is not AXEN_RXCTL_ACPT_BCAST ("accept broadcast") but
AXEN_RXCTL_ACPT_MCAST ("accept multicast (hash-table-based)").
Remove useless memset.
Fix padding for a full length USB packet in TX:
- Update boundary length for SS mode, taken from OpenBSD.
- Make sure everything passed to the adapter is little endian.
- Specify padding bits in a similar manner to Linux.
XXX I wonder whether this is really necessary...
Support TSOv4 (They call it LSOv1).
The adapter does not support TSOv6 (aka LSOv2).
Fix previous.
Oops, fix previous again. Really support TSOv4.
Use unsigned variables for buffer length to avoid compiler warnings.
To generate a diff of this commit:
cvs rdiff -u -r1.11.8.4 -r1.11.8.5 src/sys/dev/usb/if_axen.c
cvs rdiff -u -r1.3 -r1.3.10.1 src/sys/dev/usb/if_axenreg.h
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/usb/if_axen.c
diff -u src/sys/dev/usb/if_axen.c:1.11.8.4 src/sys/dev/usb/if_axen.c:1.11.8.5
--- src/sys/dev/usb/if_axen.c:1.11.8.4 Tue Feb 19 14:51:24 2019
+++ src/sys/dev/usb/if_axen.c Tue Feb 19 15:05:52 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: if_axen.c,v 1.11.8.4 2019/02/19 14:51:24 martin Exp $ */
+/* $NetBSD: if_axen.c,v 1.11.8.5 2019/02/19 15:05:52 martin Exp $ */
/* $OpenBSD: if_axen.c,v 1.3 2013/10/21 10:10:22 yuo Exp $ */
/*
@@ -23,7 +23,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.11.8.4 2019/02/19 14:51:24 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.11.8.5 2019/02/19 15:05:52 martin Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -50,6 +50,9 @@ __KERNEL_RCSID(0, "$NetBSD: if_axen.c,v
#include <net/bpf.h>
+#include <netinet/in.h> /* XXX for netinet/ip.h */
+#include <netinet/ip.h> /* XXX for IP_MAXPACKET */
+
#include <dev/mii/mii.h>
#include <dev/mii/miivar.h>
@@ -70,8 +73,6 @@ int axendebug = 0;
#define DPRINTFN(n,x)
#endif
-#define AXEN_TOE /* enable checksum offload function */
-
/*
* Various supported device vendors/products.
*/
@@ -98,6 +99,7 @@ static int axen_rx_list_init(struct axen
static struct mbuf *axen_newbuf(void);
static int axen_encap(struct axen_softc *, struct mbuf *, int);
static void axen_rxeof(struct usbd_xfer *, void *, usbd_status);
+static int axen_csum_flags_rx(struct ifnet *, uint32_t);
static void axen_txeof(struct usbd_xfer *, void *, usbd_status);
static void axen_tick(void *);
static void axen_tick_task(void *);
@@ -122,6 +124,7 @@ static void axen_lock_mii(struct axen_so
static void axen_unlock_mii(struct axen_softc *);
static void axen_ax88179_init(struct axen_softc *);
+static void axen_setcoe(struct axen_softc *);
/* Get exclusive access to the MII registers */
static void
@@ -353,32 +356,38 @@ axen_iff(struct axen_softc *sc)
axen_lock_mii(sc);
axen_cmd(sc, AXEN_CMD_MAC_READ2, 2, AXEN_MAC_RXCTL, &wval);
rxmode = le16toh(wval);
- rxmode &= ~(AXEN_RXCTL_ACPT_ALL_MCAST | AXEN_RXCTL_ACPT_PHY_MCAST |
- AXEN_RXCTL_PROMISC);
+ rxmode &= ~(AXEN_RXCTL_ACPT_ALL_MCAST | AXEN_RXCTL_PROMISC |
+ AXEN_RXCTL_ACPT_MCAST);
ifp->if_flags &= ~IFF_ALLMULTI;
- /*
- * Always accept broadcast frames.
- * Always accept frames destined to our station address.
- */
- rxmode |= AXEN_RXCTL_ACPT_BCAST;
-
- if (ifp->if_flags & IFF_PROMISC || ec->ec_multicnt > 0 /* XXX */) {
- ifp->if_flags |= IFF_ALLMULTI;
- rxmode |= AXEN_RXCTL_ACPT_ALL_MCAST | AXEN_RXCTL_ACPT_PHY_MCAST;
- if (ifp->if_flags & IFF_PROMISC)
- rxmode |= AXEN_RXCTL_PROMISC;
+ if (ifp->if_flags & IFF_PROMISC) {
+ DPRINTF(("%s: promisc\n", device_xname(sc->axen_dev)));
+ rxmode |= AXEN_RXCTL_PROMISC;
+allmulti: ifp->if_flags |= IFF_ALLMULTI;
+ rxmode |= AXEN_RXCTL_ACPT_ALL_MCAST
+ /* | AXEN_RXCTL_ACPT_PHY_MCAST */;
} else {
- rxmode |= AXEN_RXCTL_ACPT_ALL_MCAST | AXEN_RXCTL_ACPT_PHY_MCAST;
-
/* now program new ones */
+ DPRINTF(("%s: initializing hash table\n",
+ device_xname(sc->axen_dev)));
ETHER_FIRST_MULTI(step, ec, enm);
while (enm != NULL) {
+ if (memcmp(enm->enm_addrlo, enm->enm_addrhi,
+ ETHER_ADDR_LEN)) {
+ DPRINTF(("%s: allmulti\n",
+ device_xname(sc->axen_dev)));
+ memset(hashtbl, 0, sizeof(hashtbl));
+ goto allmulti;
+ }
h = ether_crc32_be(enm->enm_addrlo,
ETHER_ADDR_LEN) >> 26;
hashtbl[h / 8] |= 1 << (h % 8);
+ DPRINTF(("%s: %s added\n",
+ device_xname(sc->axen_dev),
+ ether_sprintf(enm->enm_addrlo)));
ETHER_NEXT_MULTI(step, enm);
}
+ rxmode |= AXEN_RXCTL_ACPT_MCAST;
}
axen_cmd(sc, AXEN_CMD_MAC_WRITE_FILTER, 8, AXEN_FILTER_MULTI, hashtbl);
@@ -567,26 +576,8 @@ axen_ax88179_init(struct axen_softc *sc)
axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_PAUSE_HIGH_WATERMARK, &val);
/* Set RX/TX configuration. */
- /* Offloadng enable */
-#ifdef AXEN_TOE
- val = AXEN_RXCOE_IPv4 | AXEN_RXCOE_TCPv4 | AXEN_RXCOE_UDPv4 |
- AXEN_RXCOE_TCPv6 | AXEN_RXCOE_UDPv6;
-#else
- val = AXEN_RXCOE_OFF;
-#endif
- axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_RX_COE, &val);
-
-#ifdef AXEN_TOE
- val = AXEN_TXCOE_IPv4 | AXEN_TXCOE_TCPv4 | AXEN_TXCOE_UDPv4 |
- AXEN_TXCOE_TCPv6 | AXEN_TXCOE_UDPv6;
-#else
- val = AXEN_TXCOE_OFF;
-#endif
- axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_TX_COE, &val);
-
/* Set RX control register */
ctl = AXEN_RXCTL_IPE | AXEN_RXCTL_DROPCRCERR | AXEN_RXCTL_AUTOB;
- ctl |= AXEN_RXCTL_ACPT_PHY_MCAST | AXEN_RXCTL_ACPT_ALL_MCAST;
wval = htole16(ctl);
axen_cmd(sc, AXEN_CMD_MAC_WRITE2, 2, AXEN_MAC_RXCTL, &wval);
@@ -631,6 +622,44 @@ axen_ax88179_init(struct axen_softc *sc)
#endif
}
+static void
+axen_setcoe(struct axen_softc *sc)
+{
+ struct ifnet *ifp = GET_IFP(sc);
+ uint64_t enabled = ifp->if_capenable;
+ uint8_t val;
+
+ axen_lock_mii(sc);
+
+ val = AXEN_RXCOE_OFF;
+ if (enabled & IFCAP_CSUM_IPv4_Rx)
+ val |= AXEN_RXCOE_IPv4;
+ if (enabled & IFCAP_CSUM_TCPv4_Rx)
+ val |= AXEN_RXCOE_TCPv4;
+ if (enabled & IFCAP_CSUM_UDPv4_Rx)
+ val |= AXEN_RXCOE_UDPv4;
+ if (enabled & IFCAP_CSUM_TCPv6_Rx)
+ val |= AXEN_RXCOE_TCPv6;
+ if (enabled & IFCAP_CSUM_UDPv6_Rx)
+ val |= AXEN_RXCOE_UDPv6;
+ axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_RX_COE, &val);
+
+ val = AXEN_TXCOE_OFF;
+ if (enabled & IFCAP_CSUM_IPv4_Tx)
+ val |= AXEN_TXCOE_IPv4;
+ if (enabled & IFCAP_CSUM_TCPv4_Tx)
+ val |= AXEN_TXCOE_TCPv4;
+ if (enabled & IFCAP_CSUM_UDPv4_Tx)
+ val |= AXEN_TXCOE_UDPv4;
+ if (enabled & IFCAP_CSUM_TCPv6_Tx)
+ val |= AXEN_TXCOE_TCPv6;
+ if (enabled & IFCAP_CSUM_UDPv6_Tx)
+ val |= AXEN_TXCOE_UDPv6;
+ axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_TX_COE, &val);
+
+ axen_unlock_mii(sc);
+}
+
static int
axen_match(device_t parent, cfdata_t match, void *aux)
{
@@ -692,16 +721,20 @@ axen_attach(device_t parent, device_t se
/* decide on what our bufsize will be */
switch (sc->axen_udev->ud_speed) {
case USB_SPEED_SUPER:
- sc->axen_bufsz = AXEN_BUFSZ_SS * 1024;
+ sc->axen_rx_bufsz = AXEN_BUFSZ_SS * 1024;
break;
case USB_SPEED_HIGH:
- sc->axen_bufsz = AXEN_BUFSZ_HS * 1024;
+ sc->axen_rx_bufsz = AXEN_BUFSZ_HS * 1024;
break;
default:
- sc->axen_bufsz = AXEN_BUFSZ_LS * 1024;
+ sc->axen_rx_bufsz = AXEN_BUFSZ_LS * 1024;
break;
}
+ sc->axen_tx_bufsz = IP_MAXPACKET +
+ ETHER_HDR_LEN + ETHER_CRC_LEN + ETHER_VLAN_ENCAP_LEN +
+ sizeof(struct axen_sframe_hdr);
+
/* Find endpoints. */
for (i = 0; i < id->bNumEndpoints; i++) {
ed = usbd_interface2endpoint_descriptor(sc->axen_iface, i);
@@ -765,13 +798,14 @@ axen_attach(device_t parent, device_t se
IFQ_SET_READY(&ifp->if_snd);
sc->axen_ec.ec_capabilities = ETHERCAP_VLAN_MTU;
-#ifdef AXEN_TOE
- ifp->if_capabilities |= IFCAP_CSUM_IPv4_Rx | IFCAP_CSUM_IPv4_Tx |
+
+ /* Adapter does not support TSOv6 (They call it LSOv2). */
+ ifp->if_capabilities |= IFCAP_TSOv4 |
+ IFCAP_CSUM_IPv4_Rx | IFCAP_CSUM_IPv4_Tx |
IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_TCPv4_Tx |
IFCAP_CSUM_UDPv4_Rx | IFCAP_CSUM_UDPv4_Tx |
IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_TCPv6_Tx |
IFCAP_CSUM_UDPv6_Rx | IFCAP_CSUM_UDPv6_Tx;
-#endif
/* Initialize MII/media info. */
mii = &sc->axen_mii;
@@ -919,7 +953,7 @@ axen_rx_list_init(struct axen_softc *sc)
c->axen_idx = i;
if (c->axen_xfer == NULL) {
int err = usbd_create_xfer(sc->axen_ep[AXEN_ENDPT_RX],
- sc->axen_bufsz, 0, 0, &c->axen_xfer);
+ sc->axen_rx_bufsz, 0, 0, &c->axen_xfer);
if (err)
return err;
c->axen_buf = usbd_get_buffer(c->axen_xfer);
@@ -945,7 +979,7 @@ axen_tx_list_init(struct axen_softc *sc)
c->axen_idx = i;
if (c->axen_xfer == NULL) {
int err = usbd_create_xfer(sc->axen_ep[AXEN_ENDPT_TX],
- sc->axen_bufsz, USBD_FORCE_SHORT_XFER, 0,
+ sc->axen_tx_bufsz, USBD_FORCE_SHORT_XFER, 0,
&c->axen_xfer);
if (err)
return err;
@@ -1013,7 +1047,7 @@ axen_rxeof(struct usbd_xfer *xfer, void
hdr_offset = (uint16_t)(rx_hdr >> 16);
pkt_count = (uint16_t)(rx_hdr & 0xffff);
- if (total_len > sc->axen_bufsz) {
+ if (total_len > sc->axen_rx_bufsz) {
aprint_error_dev(sc->axen_dev, "rxeof: too large transfer\n");
goto done;
}
@@ -1077,27 +1111,7 @@ axen_rxeof(struct usbd_xfer *xfer, void
m_set_rcvif(m, ifp);
m->m_pkthdr.len = m->m_len = pkt_len - 6;
-#ifdef AXEN_TOE
- /* cheksum err */
- if ((pkt_hdr & AXEN_RXHDR_L3CSUM_ERR) ||
- (pkt_hdr & AXEN_RXHDR_L4CSUM_ERR)) {
- aprint_error_dev(sc->axen_dev,
- "checksum err (pkt#%d)\n", pkt_count);
- goto nextpkt;
- } else {
- m->m_pkthdr.csum_flags |= M_CSUM_IPv4;
- }
-
- int l4_type = (pkt_hdr & AXEN_RXHDR_L4_TYPE_MASK) >>
- AXEN_RXHDR_L4_TYPE_OFFSET;
-
- if ((l4_type == AXEN_RXHDR_L4_TYPE_TCP) ||
- (l4_type == AXEN_RXHDR_L4_TYPE_UDP)) {
- m->m_pkthdr.csum_flags |= M_CSUM_TCPv4 |
- M_CSUM_UDPv4; /* XXX v6? */
- }
-#endif
-
+ m->m_pkthdr.csum_flags = axen_csum_flags_rx(ifp, pkt_hdr);
memcpy(mtod(m, char *), buf + 2, pkt_len - 6);
/* push the packet up */
@@ -1118,17 +1132,59 @@ nextpkt:
} while( pkt_count > 0);
done:
- /* clear buffer for next transaction */
- memset(c->axen_buf, 0, sc->axen_bufsz);
-
/* Setup new transfer. */
- usbd_setup_xfer(xfer, c, c->axen_buf, sc->axen_bufsz,
+ usbd_setup_xfer(xfer, c, c->axen_buf, sc->axen_rx_bufsz,
USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, axen_rxeof);
usbd_transfer(xfer);
DPRINTFN(10,("%s: %s: start rx\n",device_xname(sc->axen_dev),__func__));
}
+static int
+axen_csum_flags_rx(struct ifnet *ifp, uint32_t pkt_hdr)
+{
+ int enabled_flags = ifp->if_csum_flags_rx;
+ int csum_flags = 0;
+ int l3_type, l4_type;
+
+ if (enabled_flags == 0)
+ return 0;
+
+ l3_type = (pkt_hdr & AXEN_RXHDR_L3_TYPE_MASK) >>
+ AXEN_RXHDR_L3_TYPE_OFFSET;
+
+ if (l3_type == AXEN_RXHDR_L3_TYPE_IPV4)
+ csum_flags |= M_CSUM_IPv4;
+
+ l4_type = (pkt_hdr & AXEN_RXHDR_L4_TYPE_MASK) >>
+ AXEN_RXHDR_L4_TYPE_OFFSET;
+
+ switch (l4_type) {
+ case AXEN_RXHDR_L4_TYPE_TCP:
+ if (l3_type == AXEN_RXHDR_L3_TYPE_IPV4)
+ csum_flags |= M_CSUM_TCPv4;
+ else
+ csum_flags |= M_CSUM_TCPv6;
+ break;
+ case AXEN_RXHDR_L4_TYPE_UDP:
+ if (l3_type == AXEN_RXHDR_L3_TYPE_IPV4)
+ csum_flags |= M_CSUM_UDPv4;
+ else
+ csum_flags |= M_CSUM_UDPv6;
+ break;
+ default:
+ break;
+ }
+
+ csum_flags &= enabled_flags;
+ if ((csum_flags & M_CSUM_IPv4) && (pkt_hdr & AXEN_RXHDR_L3CSUM_ERR))
+ csum_flags |= M_CSUM_IPv4_BAD;
+ if ((csum_flags & ~M_CSUM_IPv4) && (pkt_hdr & AXEN_RXHDR_L4CSUM_ERR))
+ csum_flags |= M_CSUM_TCP_UDP_BAD;
+
+ return csum_flags;
+}
+
/*
* A frame was downloaded to the chip. It's safe for us to clean up
* the list buffers.
@@ -1226,27 +1282,38 @@ axen_encap(struct axen_softc *sc, struct
struct axen_chain *c;
usbd_status err;
struct axen_sframe_hdr hdr;
- int length, boundary;
+ u_int length, boundary;
c = &sc->axen_cdata.axen_tx_chain[idx];
- boundary = (sc->axen_udev->ud_speed == USB_SPEED_HIGH) ? 512 : 64;
-
- hdr.plen = htole32(m->m_pkthdr.len);
- hdr.gso = 0; /* disable segmentation offloading */
+ /* XXX Is this need? */
+ switch (sc->axen_udev->ud_speed) {
+ case USB_SPEED_SUPER:
+ boundary = 4096;
+ break;
+ case USB_SPEED_HIGH:
+ boundary = 512;
+ break;
+ default:
+ boundary = 64;
+ break;
+ }
- memcpy(c->axen_buf, &hdr, sizeof(hdr));
- length = sizeof(hdr);
+ length = m->m_pkthdr.len + sizeof(hdr);
+ KASSERT(length <= sc->axen_tx_bufsz);
- m_copydata(m, 0, m->m_pkthdr.len, c->axen_buf + length);
- length += m->m_pkthdr.len;
+ hdr.plen = htole32(m->m_pkthdr.len);
+ hdr.gso = (m->m_pkthdr.csum_flags & M_CSUM_TSOv4) ?
+ m->m_pkthdr.segsz : 0;
if ((length % boundary) == 0) {
- hdr.plen = 0x0;
- hdr.gso |= 0x80008000; /* enable padding */
- memcpy(c->axen_buf + length, &hdr, sizeof(hdr));
- length += sizeof(hdr);
+ DPRINTF(("%s: boundary hit\n", device_xname(sc->axen_dev)));
+ hdr.gso |= 0x80008000; /* XXX enable padding */
}
+ hdr.gso = htole32(hdr.gso);
+
+ memcpy(c->axen_buf, &hdr, sizeof(hdr));
+ m_copydata(m, 0, m->m_pkthdr.len, c->axen_buf + sizeof(hdr));
usbd_setup_xfer(c->axen_xfer, c, c->axen_buf, length,
USBD_FORCE_SHORT_XFER, 10000, axen_txeof);
@@ -1329,6 +1396,9 @@ axen_init(struct ifnet *ifp)
axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_UNK_28, &bval);
axen_unlock_mii(sc);
+ /* Configure offloading engine. */
+ axen_setcoe(sc);
+
/* Program promiscuous mode and multicast filters. */
axen_iff(sc);
@@ -1378,7 +1448,7 @@ axen_init(struct ifnet *ifp)
for (i = 0; i < AXEN_RX_LIST_CNT; i++) {
c = &sc->axen_cdata.axen_rx_chain[i];
- usbd_setup_xfer(c->axen_xfer, c, c->axen_buf, sc->axen_bufsz,
+ usbd_setup_xfer(c->axen_xfer, c, c->axen_buf, sc->axen_rx_bufsz,
USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, axen_rxeof);
usbd_transfer(c->axen_xfer);
}
@@ -1428,9 +1498,17 @@ axen_ioctl(struct ifnet *ifp, u_long cmd
break;
error = 0;
-
- if (cmd == SIOCADDMULTI || cmd == SIOCDELMULTI)
+ switch(cmd) {
+ case SIOCADDMULTI:
+ case SIOCDELMULTI:
axen_iff(sc);
+ break;
+ case SIOCSIFCAP:
+ axen_setcoe(sc);
+ break;
+ default:
+ break;
+ }
break;
}
splx(s);
Index: src/sys/dev/usb/if_axenreg.h
diff -u src/sys/dev/usb/if_axenreg.h:1.3 src/sys/dev/usb/if_axenreg.h:1.3.10.1
--- src/sys/dev/usb/if_axenreg.h:1.3 Sat Apr 23 10:15:31 2016
+++ src/sys/dev/usb/if_axenreg.h Tue Feb 19 15:05:52 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: if_axenreg.h,v 1.3 2016/04/23 10:15:31 skrll Exp $ */
+/* $NetBSD: if_axenreg.h,v 1.3.10.1 2019/02/19 15:05:52 martin Exp $ */
/* $OpenBSD: if_axenreg.h,v 1.1 2013/10/07 05:37:41 yuo Exp $ */
/*
@@ -72,7 +72,7 @@
#define AXEN_RXHDR_L4_TYPE_TCP 0x4
/* L3 packet type (2bit) */
-#define AXEN_RXHDR_L3_TYPE_MASK 0x00000600
+#define AXEN_RXHDR_L3_TYPE_MASK 0x00000060
#define AXEN_RXHDR_L3_TYPE_OFFSET 5
#define AXEN_RXHDR_L3_TYPE_UNDEF 0x0
#define AXEN_RXHDR_L3_TYPE_IPV4 0x1
@@ -153,7 +153,7 @@
#define AXEN_RXCTL_ACPT_ALL_MCAST 0x0002
#define AXEN_RXCTL_HA8B 0x0004
#define AXEN_RXCTL_AUTOB 0x0008
-#define AXEN_RXCTL_ACPT_BCAST 0x0010
+#define AXEN_RXCTL_ACPT_MCAST 0x0010
#define AXEN_RXCTL_ACPT_PHY_MCAST 0x0020
#define AXEN_RXCTL_START 0x0080
#define AXEN_RXCTL_DROPCRCERR 0x0100
@@ -296,7 +296,8 @@ struct axen_softc {
uint8_t axen_ipgs[3];
int axen_phyno;
struct timeval axen_rx_notice;
- u_int axen_bufsz;
+ u_int axen_rx_bufsz;
+ u_int axen_tx_bufsz;
int axen_rev;
#define sc_if axen_ec.ec_if