svn commit: r188260 - in stable/7/sys: . contrib/pf dev/ath/ath_hal
dev/cxgb dev/usb
Andrew Thompson
thompsa at FreeBSD.org
Fri Feb 6 17:43:05 PST 2009
Author: thompsa
Date: Sat Feb 7 01:43:04 2009
New Revision: 188260
URL: http://svn.freebsd.org/changeset/base/188260
Log:
MFC r173522, r176910, r178975
- Add private tx/rx buffer management to support large frame sizes and update
the rx code to handle multiple frames in a single usb transfer. AX772 parts
(at least) exhibit many input errors when operated with a 2K rx buffer and
no errors w/ a 4K rx buffer (it's unclear what the cause of the errors is
for 2K so this may just be covering up the real issue). Larger rx buffer
sizes show no significant performance improvement for AX772. Bypassing the
common buffer management routines also eliminates an extra context switch on
every packet which noticeably improves performance (TCP netperf rx goes from
45 Mb/s to 85 MB/s).
- Apply le*toh() or htole*() to the variables of which we use the address as
the buffer pointer in the call to axe_cmd(). This is needed to make the code
work on big-endian machines.
- Add support for the Apple USB Ethernet adapter. Work around the "latch in
at the first working PHY address hack", that fails for this adapter because
it returns 0xffff when reading from lower PHY addresses. Also add more
debugging printfs
Modified:
stable/7/sys/ (props changed)
stable/7/sys/contrib/pf/ (props changed)
stable/7/sys/dev/ath/ath_hal/ (props changed)
stable/7/sys/dev/cxgb/ (props changed)
stable/7/sys/dev/usb/if_axe.c
stable/7/sys/dev/usb/if_axereg.h
stable/7/sys/dev/usb/usbdevs
Modified: stable/7/sys/dev/usb/if_axe.c
==============================================================================
--- stable/7/sys/dev/usb/if_axe.c Sat Feb 7 01:15:13 2009 (r188259)
+++ stable/7/sys/dev/usb/if_axe.c Sat Feb 7 01:43:04 2009 (r188260)
@@ -104,6 +104,21 @@ __FBSDID("$FreeBSD$");
/* "device miibus" required. See GENERIC if you get errors here. */
#include "miibus_if.h"
+/*
+ * AXE_178_MAX_FRAME_BURST
+ * max frame burst size for Ax88178 and Ax88772
+ * 0 2048 bytes
+ * 1 4096 bytes
+ * 2 8192 bytes
+ * 3 16384 bytes
+ * use the largest your system can handle without usb stalling.
+ *
+ * NB: 88772 parts appear to generate lots of input errors with
+ * a 2K rx buffer and 8K is only slightly faster than 4K on an
+ * EHCI port on a T42 so change at your own risk.
+ */
+#define AXE_178_MAX_FRAME_BURST 1
+
#include <dev/usb/if_axereg.h>
/*
@@ -112,6 +127,7 @@ __FBSDID("$FreeBSD$");
const struct axe_type axe_devs[] = {
{ { USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_UF200}, 0 },
{ { USB_VENDOR_ACERCM, USB_PRODUCT_ACERCM_EP1427X2}, 0 },
+ { { USB_VENDOR_APPLE, USB_PRODUCT_APPLE_ETHERNET}, AX772 },
{ { USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88172}, 0 },
{ { USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88772}, AX772 },
{ { USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88178}, AX178 },
@@ -151,7 +167,6 @@ static void axe_rxeof(usbd_xfer_handle,
static void axe_txeof(usbd_xfer_handle, usbd_private_handle, usbd_status);
static void axe_tick(void *);
static void axe_tick_task(void *);
-static void axe_rxstart(struct ifnet *);
static void axe_start(struct ifnet *);
static int axe_ioctl(struct ifnet *, u_long, caddr_t);
static void axe_init(void *);
@@ -259,10 +274,10 @@ axe_miibus_readreg(device_t dev, int phy
return(-1);
}
- if (val)
+ if (val && val != 0xffff)
sc->axe_phyaddrs[0] = phy;
- return (val);
+ return (le16toh(val));
}
static int
@@ -277,6 +292,7 @@ axe_miibus_writereg(device_t dev, int ph
AXE_SLEEPLOCKASSERT(sc);
AXE_LOCK(sc);
axe_cmd(sc, AXE_CMD_MII_OPMODE_SW, 0, 0, NULL);
+ val = htole32(val);
err = axe_cmd(sc, AXE_CMD_MII_WRITE_REG, reg, phy, (void *)&val);
axe_cmd(sc, AXE_CMD_MII_OPMODE_HW, 0, 0, NULL);
AXE_UNLOCK(sc);
@@ -367,6 +383,7 @@ axe_setmulti(struct axe_softc *sc)
AXE_LOCK(sc);
axe_cmd(sc, AXE_CMD_RXCTL_READ, 0, 0, (void *)&rxmode);
+ rxmode = le16toh(rxmode);
if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
rxmode |= AXE_RXCMD_ALLMULTI;
@@ -403,6 +420,7 @@ axe_ax88178_init(struct axe_softc *sc)
axe_cmd(sc, AXE_CMD_SROM_WR_ENABLE, 0, 0, NULL);
/* XXX magic */
axe_cmd(sc, AXE_CMD_SROM_READ, 0, 0x0017, &eeprom);
+ eeprom = le16toh(eeprom);
axe_cmd(sc, AXE_CMD_SROM_WR_DISABLE, 0, 0, NULL);
/* if EEPROM is invalid we have to use to GPIO0 */
@@ -548,7 +566,6 @@ axe_attach(device_t self)
}
sc->axe_boundary = 64;
-#if 0
if (sc->axe_flags & (AX178|AX772)) {
if (sc->axe_udev->speed == USB_SPEED_HIGH) {
sc->axe_bufsz = AXE_178_MAX_BUFSZ;
@@ -556,10 +573,7 @@ axe_attach(device_t self)
} else
sc->axe_bufsz = AXE_178_MIN_BUFSZ;
} else
- sc->axe_bufsz = AXE_172_BUFSZ
-#else
- sc->axe_bufsz = AXE_172_BUFSZ;
-#endif
+ sc->axe_bufsz = AXE_172_BUFSZ;
{ /* XXX debug */
device_printf(sc->axe_dev, "%s, bufsz %d, boundary %d\n",
sc->axe_flags & AX178 ? "AX88178" :
@@ -643,9 +657,6 @@ device_printf(sc->axe_dev, "%s, bufsz %d
ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN;
IFQ_SET_READY(&ifp->if_snd);
- sc->axe_qdat.ifp = ifp;
- sc->axe_qdat.if_rxstart = axe_rxstart;
-
if (mii_phy_probe(self, &sc->axe_miibus,
axe_ifmedia_upd, axe_ifmedia_sts)) {
device_printf(sc->axe_dev, "MII without any PHY!\n");
@@ -704,33 +715,97 @@ axe_detach(device_t dev)
return(0);
}
+static int
+axe_rx_list_init(struct axe_softc *sc)
+{
+ struct axe_cdata *cd;
+ struct axe_chain *c;
+ int i;
+
+ cd = &sc->axe_cdata;
+ for (i = 0; i < AXE_RX_LIST_CNT; i++) {
+ c = &cd->axe_rx_chain[i];
+ c->axe_sc = sc;
+ c->axe_idx = i;
+ c->axe_mbuf = NULL;
+ if (c->axe_xfer == NULL) {
+ c->axe_xfer = usbd_alloc_xfer(sc->axe_udev);
+ if (c->axe_xfer == NULL)
+ return (ENOBUFS);
+ c->axe_buf = usbd_alloc_buffer(c->axe_xfer,
+ sc->axe_bufsz);
+ if (c->axe_buf == NULL) {
+ usbd_free_xfer(c->axe_xfer);
+ return (ENOBUFS);
+ }
+ }
+ }
+
+ return (0);
+}
+
static void
-axe_rxstart(struct ifnet *ifp)
+axe_rx_list_free(struct axe_softc *sc)
{
- struct axe_softc *sc;
- struct ue_chain *c;
+ int i;
- sc = ifp->if_softc;
- AXE_LOCK(sc);
- c = &sc->axe_cdata.ue_rx_chain[sc->axe_cdata.ue_rx_prod];
+ for (i = 0; i < AXE_RX_LIST_CNT; i++) {
+ if (sc->axe_cdata.axe_rx_chain[i].axe_mbuf != NULL) {
+ m_freem(sc->axe_cdata.axe_rx_chain[i].axe_mbuf);
+ sc->axe_cdata.axe_rx_chain[i].axe_mbuf = NULL;
+ }
+ if (sc->axe_cdata.axe_rx_chain[i].axe_xfer != NULL) {
+ usbd_free_xfer(sc->axe_cdata.axe_rx_chain[i].axe_xfer);
+ sc->axe_cdata.axe_rx_chain[i].axe_xfer = NULL;
+ }
+ }
+}
- c->ue_mbuf = usb_ether_newbuf();
- if (c->ue_mbuf == NULL) {
- device_printf(sc->axe_dev, "no memory for rx list "
- "-- packet dropped!\n");
- ifp->if_ierrors++;
- AXE_UNLOCK(sc);
- return;
+static int
+axe_tx_list_init(struct axe_softc *sc)
+{
+ struct axe_cdata *cd;
+ struct axe_chain *c;
+ int i;
+
+ cd = &sc->axe_cdata;
+ for (i = 0; i < AXE_TX_LIST_CNT; i++) {
+ c = &cd->axe_tx_chain[i];
+ c->axe_sc = sc;
+ c->axe_idx = i;
+ c->axe_mbuf = NULL;
+ if (c->axe_xfer == NULL) {
+ c->axe_xfer = usbd_alloc_xfer(sc->axe_udev);
+ if (c->axe_xfer == NULL)
+ return (ENOBUFS);
+ c->axe_buf = usbd_alloc_buffer(c->axe_xfer,
+ sc->axe_bufsz);
+ if (c->axe_buf == NULL) {
+ usbd_free_xfer(c->axe_xfer);
+ return (ENOBUFS);
+ }
+ }
}
- /* Setup new transfer. */
- usbd_setup_xfer(c->ue_xfer, sc->axe_ep[AXE_ENDPT_RX],
- c, mtod(c->ue_mbuf, char *), UE_BUFSZ, USBD_SHORT_XFER_OK,
- USBD_NO_TIMEOUT, axe_rxeof);
- usbd_transfer(c->ue_xfer);
- AXE_UNLOCK(sc);
+ return (0);
+}
- return;
+static void
+axe_tx_list_free(struct axe_softc *sc)
+{
+ int i;
+
+ /* Free TX resources. */
+ for (i = 0; i < AXE_TX_LIST_CNT; i++) {
+ if (sc->axe_cdata.axe_tx_chain[i].axe_mbuf != NULL) {
+ m_freem(sc->axe_cdata.axe_tx_chain[i].axe_mbuf);
+ sc->axe_cdata.axe_tx_chain[i].axe_mbuf = NULL;
+ }
+ if (sc->axe_cdata.axe_tx_chain[i].axe_xfer != NULL) {
+ usbd_free_xfer(sc->axe_cdata.axe_tx_chain[i].axe_xfer);
+ sc->axe_cdata.axe_tx_chain[i].axe_xfer = NULL;
+ }
+ }
}
/*
@@ -741,14 +816,15 @@ static void
axe_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
{
struct axe_softc *sc;
- struct ue_chain *c;
+ struct axe_chain *c = (struct axe_chain *) priv;
struct mbuf *m;
+ u_char *buf;
struct ifnet *ifp;
- struct axe_sframe_hdr hdr;
- int total_len = 0, pktlen;
+ struct axe_sframe_hdr *hdr;
+ int total_len = 0;
+ int pktlen = 0;
- c = priv;
- sc = c->ue_sc;
+ sc = c->axe_sc;
AXE_LOCK(sc);
ifp = sc->axe_ifp;
@@ -772,49 +848,61 @@ axe_rxeof(usbd_xfer_handle xfer, usbd_pr
usbd_get_xfer_status(xfer, NULL, NULL, &total_len, NULL);
- m = c->ue_mbuf;
- /* XXX don't handle multiple packets in one transfer */
- if (sc->axe_flags & (AX178|AX772)) {
- if (total_len < sizeof(hdr)) {
- ifp->if_ierrors++;
- goto done;
- }
- m_copydata(m, 0, sizeof(hdr), (caddr_t) &hdr);
- total_len -= sizeof(hdr);
+ buf = c->axe_buf;
- if ((hdr.len ^ hdr.ilen) != 0xffff) {
- ifp->if_ierrors++;
- goto done;
+ do {
+ if (sc->axe_flags & (AX178|AX772)) {
+ if (total_len < sizeof(struct axe_sframe_hdr)) {
+ ifp->if_ierrors++;
+ goto done;
+ }
+ if ((pktlen % 2) != 0)
+ pktlen++;
+ buf += pktlen;
+
+ hdr = (struct axe_sframe_hdr *) buf;
+ total_len -= sizeof(struct axe_sframe_hdr);
+ if ((hdr->len ^ hdr->ilen) != 0xffff) {
+ ifp->if_ierrors++;
+ goto done;
+ }
+ pktlen = le16toh(hdr->len);
+ if (pktlen > total_len) {
+ ifp->if_ierrors++;
+ goto done;
+ }
+
+ buf += sizeof(struct axe_sframe_hdr);
+ total_len -= pktlen + (pktlen % 2);
+ } else {
+ pktlen = total_len;
+ total_len = 0;
}
- pktlen = le16toh(hdr.len);
- if (pktlen > total_len) {
+
+ if (pktlen < sizeof(struct ether_header)) {
ifp->if_ierrors++;
goto done;
}
- m_adj(m, sizeof(hdr));
- } else {
- if (total_len < sizeof(struct ether_header)) {
+ m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
+ if (m == NULL) {
ifp->if_ierrors++;
goto done;
}
- pktlen = total_len;
- }
-
- ifp->if_ipackets++;
- m->m_pkthdr.rcvif = (void *)&sc->axe_qdat;
- m->m_pkthdr.len = m->m_len = pktlen;
-
- /* Put the packet on the special USB input queue. */
- usb_ether_input(m);
- AXE_UNLOCK(sc);
-
- return;
+ m->m_data += ETHER_ALIGN;
+ memcpy(mtod(m, void *), buf, pktlen);
+ m->m_pkthdr.len = m->m_len = pktlen;
+ m->m_pkthdr.rcvif = ifp;
+
+ ifp->if_input(ifp, m);
+ ifp->if_ipackets++;
+ } while (total_len > 0);
+ /* fall thru... */
done:
/* Setup new transfer. */
- usbd_setup_xfer(c->ue_xfer, sc->axe_ep[AXE_ENDPT_RX],
- c, mtod(c->ue_mbuf, char *), UE_BUFSZ, USBD_SHORT_XFER_OK,
+ usbd_setup_xfer(xfer, sc->axe_ep[AXE_ENDPT_RX],
+ c, c->axe_buf, sc->axe_bufsz, USBD_SHORT_XFER_OK | USBD_NO_COPY,
USBD_NO_TIMEOUT, axe_rxeof);
- usbd_transfer(c->ue_xfer);
+ usbd_transfer(xfer);
AXE_UNLOCK(sc);
return;
@@ -829,12 +917,12 @@ static void
axe_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
{
struct axe_softc *sc;
- struct ue_chain *c;
+ struct axe_chain *c;
struct ifnet *ifp;
usbd_status err;
c = priv;
- sc = c->ue_sc;
+ sc = c->axe_sc;
AXE_LOCK(sc);
ifp = sc->axe_ifp;
@@ -853,12 +941,11 @@ axe_txeof(usbd_xfer_handle xfer, usbd_pr
ifp->if_timer = 0;
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
- usbd_get_xfer_status(c->ue_xfer, NULL, NULL, NULL, &err);
+ usbd_get_xfer_status(c->axe_xfer, NULL, NULL, NULL, &err);
- if (c->ue_mbuf != NULL) {
- c->ue_mbuf->m_pkthdr.rcvif = ifp;
- usb_tx_done(c->ue_mbuf);
- c->ue_mbuf = NULL;
+ if (c->axe_mbuf != NULL) {
+ m_freem(c->axe_mbuf);
+ c->axe_mbuf = NULL;
}
if (err)
@@ -868,6 +955,9 @@ axe_txeof(usbd_xfer_handle xfer, usbd_pr
AXE_UNLOCK(sc);
+ if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
+ axe_start(ifp);
+
return;
}
@@ -927,12 +1017,12 @@ axe_tick_task(void *xsc)
static int
axe_encap(struct axe_softc *sc, struct mbuf *m, int idx)
{
- struct ue_chain *c;
+ struct axe_chain *c;
usbd_status err;
struct axe_sframe_hdr hdr;
int length;
- c = &sc->axe_cdata.ue_tx_chain[idx];
+ c = &sc->axe_cdata.axe_tx_chain[idx];
/*
* Copy the mbuf data into a contiguous buffer, leaving two
@@ -942,29 +1032,29 @@ axe_encap(struct axe_softc *sc, struct m
hdr.len = htole16(m->m_pkthdr.len);
hdr.ilen = ~hdr.len;
- memcpy(c->ue_buf, &hdr, sizeof(hdr));
+ memcpy(c->axe_buf, &hdr, sizeof(hdr));
length = sizeof(hdr);
- m_copydata(m, 0, m->m_pkthdr.len, c->ue_buf + sizeof(hdr));
+ m_copydata(m, 0, m->m_pkthdr.len, c->axe_buf + length);
length += m->m_pkthdr.len;
if ((length % sc->axe_boundary) == 0) {
hdr.len = 0;
hdr.ilen = 0xffff;
- memcpy(c->ue_buf + length, &hdr, sizeof(hdr));
+ memcpy(c->axe_buf + length, &hdr, sizeof(hdr));
length += sizeof(hdr);
}
} else {
- m_copydata(m, 0, m->m_pkthdr.len, c->ue_buf);
+ m_copydata(m, 0, m->m_pkthdr.len, c->axe_buf);
length = m->m_pkthdr.len;
}
- c->ue_mbuf = m;
+ c->axe_mbuf = m;
- usbd_setup_xfer(c->ue_xfer, sc->axe_ep[AXE_ENDPT_TX],
- c, c->ue_buf, length, USBD_FORCE_SHORT_XFER, 10000, axe_txeof);
+ usbd_setup_xfer(c->axe_xfer, sc->axe_ep[AXE_ENDPT_TX],
+ c, c->axe_buf, length, USBD_FORCE_SHORT_XFER, 10000, axe_txeof);
/* Transmit */
- err = usbd_transfer(c->ue_xfer);
+ err = usbd_transfer(c->axe_xfer);
if (err != USBD_IN_PROGRESS) {
/* XXX probably don't want to sleep here */
AXE_SLEEPLOCK(sc);
@@ -973,7 +1063,7 @@ axe_encap(struct axe_softc *sc, struct m
return(EIO);
}
- sc->axe_cdata.ue_tx_cnt++;
+ sc->axe_cdata.axe_tx_cnt++;
return(0);
}
@@ -1032,7 +1122,7 @@ axe_init(void *xsc)
{
struct axe_softc *sc = xsc;
struct ifnet *ifp = sc->axe_ifp;
- struct ue_chain *c;
+ struct axe_chain *c;
usbd_status err;
int i;
int rxmode;
@@ -1057,8 +1147,7 @@ axe_init(void *xsc)
/* Enable RX logic. */
/* Init TX ring. */
- if (usb_ether_tx_list_init(sc, &sc->axe_cdata,
- sc->axe_udev) == ENOBUFS) {
+ if (axe_tx_list_init(sc) == ENOBUFS) {
device_printf(sc->axe_dev, "tx list init failed\n");
AXE_UNLOCK(sc);
AXE_SLEEPUNLOCK(sc);
@@ -1066,8 +1155,7 @@ axe_init(void *xsc)
}
/* Init RX ring. */
- if (usb_ether_rx_list_init(sc, &sc->axe_cdata,
- sc->axe_udev) == ENOBUFS) {
+ if (axe_rx_list_init(sc) == ENOBUFS) {
device_printf(sc->axe_dev, "rx list init failed\n");
AXE_UNLOCK(sc);
AXE_SLEEPUNLOCK(sc);
@@ -1088,7 +1176,7 @@ axe_init(void *xsc)
rxmode = AXE_RXCMD_MULTICAST|AXE_RXCMD_ENABLE;
if (sc->axe_flags & (AX178|AX772)) {
if (sc->axe_bufsz == AXE_178_MAX_BUFSZ)
- rxmode |= AXE_178_RXCMD_MFB_16384;
+ rxmode |= AXE_178_RXCMD_MFB;
} else
rxmode |= AXE_172_RXCMD_UNICAST;
@@ -1126,12 +1214,13 @@ axe_init(void *xsc)
}
/* Start up the receive pipe. */
- for (i = 0; i < UE_RX_LIST_CNT; i++) {
- c = &sc->axe_cdata.ue_rx_chain[i];
- usbd_setup_xfer(c->ue_xfer, sc->axe_ep[AXE_ENDPT_RX],
- c, mtod(c->ue_mbuf, char *), UE_BUFSZ,
- USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, axe_rxeof);
- usbd_transfer(c->ue_xfer);
+ for (i = 0; i < AXE_RX_LIST_CNT; i++) {
+ c = &sc->axe_cdata.axe_rx_chain[i];
+ usbd_setup_xfer(c->axe_xfer, sc->axe_ep[AXE_ENDPT_RX],
+ c, c->axe_buf, sc->axe_bufsz,
+ USBD_SHORT_XFER_OK | USBD_NO_COPY,
+ USBD_NO_TIMEOUT, axe_rxeof);
+ usbd_transfer(c->axe_xfer);
}
ifp->if_drv_flags |= IFF_DRV_RUNNING;
@@ -1164,6 +1253,7 @@ axe_ioctl(struct ifnet *ifp, u_long comm
AXE_LOCK(sc);
axe_cmd(sc, AXE_CMD_RXCTL_READ,
0, 0, (void *)&rxmode);
+ rxmode = le16toh(rxmode);
rxmode |= AXE_RXCMD_PROMISC;
axe_cmd(sc, AXE_CMD_RXCTL_WRITE,
0, rxmode, NULL);
@@ -1177,6 +1267,7 @@ axe_ioctl(struct ifnet *ifp, u_long comm
AXE_LOCK(sc);
axe_cmd(sc, AXE_CMD_RXCTL_READ,
0, 0, (void *)&rxmode);
+ rxmode = le16toh(rxmode);
rxmode &= ~AXE_RXCMD_PROMISC;
axe_cmd(sc, AXE_CMD_RXCTL_WRITE,
0, rxmode, NULL);
@@ -1222,7 +1313,7 @@ static void
axe_watchdog(struct ifnet *ifp)
{
struct axe_softc *sc;
- struct ue_chain *c;
+ struct axe_chain *c;
usbd_status stat;
sc = ifp->if_softc;
@@ -1231,9 +1322,9 @@ axe_watchdog(struct ifnet *ifp)
ifp->if_oerrors++;
device_printf(sc->axe_dev, "watchdog timeout\n");
- c = &sc->axe_cdata.ue_tx_chain[0];
- usbd_get_xfer_status(c->ue_xfer, NULL, NULL, NULL, &stat);
- axe_txeof(c->ue_xfer, c, stat);
+ c = &sc->axe_cdata.axe_tx_chain[0];
+ usbd_get_xfer_status(c->axe_xfer, NULL, NULL, NULL, &stat);
+ axe_txeof(c->axe_xfer, c, stat);
AXE_UNLOCK(sc);
@@ -1307,9 +1398,9 @@ axe_stop(struct axe_softc *sc)
axe_reset(sc);
/* Free RX resources. */
- usb_ether_rx_list_free(&sc->axe_cdata);
+ axe_rx_list_free(sc);
/* Free TX resources. */
- usb_ether_tx_list_free(&sc->axe_cdata);
+ axe_tx_list_free(sc);
ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
sc->axe_link = 0;
Modified: stable/7/sys/dev/usb/if_axereg.h
==============================================================================
--- stable/7/sys/dev/usb/if_axereg.h Sat Feb 7 01:15:13 2009 (r188259)
+++ stable/7/sys/dev/usb/if_axereg.h Sat Feb 7 01:43:04 2009 (r188260)
@@ -129,11 +129,10 @@
#define AXE_RXCMD_MULTICAST 0x0010
#define AXE_178_RXCMD_AP 0x0020
#define AXE_RXCMD_ENABLE 0x0080
-#define AXE_178_RXCMD_MFB 0x0300 /* Max Frame Burst */
-#define AXE_178_RXCMD_MFB_2048 0x0000
-#define AXE_178_RXCMD_MFB_4096 0x0100
-#define AXE_178_RXCMD_MFB_8192 0x0200
-#define AXE_178_RXCMD_MFB_16384 0x0300
+#define AXE_178_RXCMD_MFB_2048 0x0000 /* 2K max frame burst */
+#define AXE_178_RXCMD_MFB_4096 0x0100 /* 4K max frame burst */
+#define AXE_178_RXCMD_MFB_8192 0x0200 /* 8K max frame burst */
+#define AXE_178_RXCMD_MFB_16384 0x0300 /* 16K max frame burst*/
#define AXE_NOPHY 0xE0
#define AXE_INTPHY 0x10
@@ -141,14 +140,45 @@
#define AXE_TIMEOUT 1000
#define AXE_172_BUFSZ 1536
#define AXE_178_MIN_BUFSZ 2048
-#define AXE_178_MAX_BUFSZ 16384
#define AXE_MIN_FRAMELEN 60
#define AXE_RX_FRAMES 1
#define AXE_TX_FRAMES 1
+#if AXE_178_MAX_FRAME_BURST == 0
+#define AXE_178_RXCMD_MFB AXE_178_RXCMD_MFB_2048
+#define AXE_178_MAX_BUFSZ 2048
+#elif AXE_178_MAX_FRAME_BURST == 1
+#define AXE_178_RXCMD_MFB AXE_178_RXCMD_MFB_4096
+#define AXE_178_MAX_BUFSZ 4096
+#elif AXE_178_MAX_FRAME_BURST == 2
+#define AXE_178_RXCMD_MFB AXE_178_RXCMD_MFB_8192
+#define AXE_178_MAX_BUFSZ 8192
+#else
+#define AXE_178_RXCMD_MFB AXE_178_RXCMD_MFB_16384
+#define AXE_178_MAX_BUFSZ 16384
+#endif
+
#define AXE_RX_LIST_CNT 1
#define AXE_TX_LIST_CNT 1
+struct axe_chain {
+ struct axe_softc *axe_sc;
+ usbd_xfer_handle axe_xfer;
+ char *axe_buf;
+ struct mbuf *axe_mbuf;
+ int axe_accum;
+ int axe_idx;
+};
+
+struct axe_cdata {
+ struct axe_chain axe_tx_chain[AXE_TX_LIST_CNT];
+ struct axe_chain axe_rx_chain[AXE_RX_LIST_CNT];
+ int axe_tx_prod;
+ int axe_tx_cons;
+ int axe_tx_cnt;
+ int axe_rx_prod;
+};
+
#define AXE_CTL_READ 0x01
#define AXE_CTL_WRITE 0x02
@@ -198,7 +228,7 @@ struct axe_softc {
int axe_ed[AXE_ENDPT_MAX];
usbd_pipe_handle axe_ep[AXE_ENDPT_MAX];
int axe_if_flags;
- struct ue_cdata axe_cdata;
+ struct axe_cdata axe_cdata;
struct callout_handle axe_stat_ch;
struct mtx axe_mtx;
struct sx axe_sleeplock;
@@ -207,7 +237,6 @@ struct axe_softc {
unsigned char axe_ipgs[3];
unsigned char axe_phyaddrs[2];
struct timeval axe_rx_notice;
- struct usb_qdat axe_qdat;
struct usb_task axe_tick_task;
int axe_bufsz;
int axe_boundary;
Modified: stable/7/sys/dev/usb/usbdevs
==============================================================================
--- stable/7/sys/dev/usb/usbdevs Sat Feb 7 01:15:13 2009 (r188259)
+++ stable/7/sys/dev/usb/usbdevs Sat Feb 7 01:43:04 2009 (r188260)
@@ -856,6 +856,7 @@ product APPLE IPODVIDEO 0x1209 iPod Vid
product APPLE IPODNANO 0x120a iPod Nano
product APPLE IPHONE 0x1290 iPhone
product APPLE IPHONE_3G 0x1292 iPhone 3G
+product APPLE ETHERNET 0x1402 Ethernet A1277
/* Arkmicro Technologies */
product ARKMICRO ARK3116 0x0232 ARK3116 Serial
More information about the svn-src-all
mailing list