Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 19 Aug 2010 23:07:21 GMT
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 182635 for review
Message-ID:  <201008192307.o7JN7LdD024843@skunkworks.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@182635?ac=10

Change 182635 by hselasky@hselasky_laptop001 on 2010/08/19 23:06:17

	
	USB network (iPhone 3G/3GS/4G ethernet protocol):
		- fix some protocol issues.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb/net/if_ipheth.c#3 edit
.. //depot/projects/usb/src/sys/dev/usb/net/if_iphethvar.h#3 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb/net/if_ipheth.c#3 (text+ko) ====

@@ -108,7 +108,7 @@
 		.direction = UE_DIR_TX,
 		.frames = IPHETH_TX_FRAMES_MAX,
 		.bufsize = (IPHETH_TX_FRAMES_MAX * IPHETH_BUF_SIZE),
-		.flags = {.force_short_xfer = 1,.ext_buffer = 1,},
+		.flags = {.force_short_xfer = 1,},
 		.callback = ipheth_bulk_write_callback,
 		.timeout = IPHETH_TX_TIMEOUT,
 	},
@@ -387,8 +387,8 @@
 {
 	struct ipheth_softc *sc = usbd_xfer_softc(xfer);
 	struct ifnet *ifp = uether_getifp(&sc->sc_ue);
+	struct usb_page_cache *pc;
 	struct mbuf *m;
-	struct mbuf *mt;
 	uint8_t x;
 	int actlen;
 	int aframes;
@@ -417,21 +417,24 @@
 			if (m == NULL)
 				break;
 
-			if (m->m_len != m->m_pkthdr.len) {
-				mt = m_defrag(m, M_DONTWAIT);
-				if (mt == NULL) {
-					m_freem(m);
-					ifp->if_oerrors++;
-					continue;
-				}
-				m = mt;
-			}
-			if (m->m_pkthdr.len > MCLBYTES) {
-				m->m_pkthdr.len = MCLBYTES;
-			}
+			usbd_xfer_set_frame_offset(xfer,
+			    x * IPHETH_BUF_SIZE, x);
+
+			pc = usbd_xfer_get_frame(xfer, x);
+
 			sc->sc_tx_buf[x] = m;
 
-			usbd_xfer_set_frame_data(xfer, x, m->m_data, m->m_len);
+			if (m->m_pkthdr.len > IPHETH_BUF_SIZE)
+				m->m_pkthdr.len = IPHETH_BUF_SIZE;
+
+			usbd_m_copy_in(pc, 0, m, 0, m->m_pkthdr.len);
+
+			usbd_xfer_set_frame_len(xfer, x, IPHETH_BUF_SIZE);
+
+			if (IPHETH_BUF_SIZE != m->m_pkthdr.len) {
+				usbd_frame_zero(pc, m->m_pkthdr.len,
+					IPHETH_BUF_SIZE - m->m_pkthdr.len);
+			}
 
 			/*
 			 * If there's a BPF listener, bounce a copy of
@@ -488,12 +491,16 @@
 			sc->sc_rx_buf[x] = NULL;
 			len = usbd_xfer_frame_len(xfer, x);
 
-			if (len < sizeof(struct ether_header)) {
+			if (len < (sizeof(struct ether_header) +
+			    IPHETH_RX_ADJ)) {
 				m_freem(m);
 				continue;
 			}
+
+			m_adj(m, IPHETH_RX_ADJ);
+
 			/* queue up mbuf */
-			uether_rxmbuf(&sc->sc_ue, m, len);
+			uether_rxmbuf(&sc->sc_ue, m, len - IPHETH_RX_ADJ);
 		}
 
 		/* FALLTHROUGH */

==== //depot/projects/usb/src/sys/dev/usb/net/if_iphethvar.h#3 (text+ko) ====

@@ -49,6 +49,8 @@
 #define	IPHETH_RX_FRAMES_MAX	1
 #define	IPHETH_TX_FRAMES_MAX	8
 
+#define	IPHETH_RX_ADJ		2
+
 #define	IPHETH_CFG_INDEX	0
 #define	IPHETH_IF_INDEX		2
 #define	IPHETH_ALT_INTFNUM      1



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008192307.o7JN7LdD024843>