Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 Sep 2013 21:30:10 +0900 (JST)
From:      SAITOU Toshihide <toshi@ruby.ocn.ne.jp>
To:        freebsd-usb@FreeBSD.org
Subject:   Re: usb/181987: USB isochronous transfer of the USB driver (Mentor Graphics OTG: musb_otg) is not working.
Message-ID:  <20130911.213010.71085465.toshi@ruby.ocn.ne.jp>
In-Reply-To: <522F517D.8040102@bitfrost.no>
References:  <201309101140.r8ABe0T8006384@freefall.freebsd.org> <522F517D.8040102@bitfrost.no>

next in thread | previous in thread | raw e-mail | index | archive | help
In message: <522F517D.8040102@bitfrost.no>
            Hans Petter Selasky <hps@bitfrost.no> writes:
> 
> Is this feature urgent for 10.0, because 10 is now in a code
> slush state?

No, I'm not in a hurry, just intended to file a pr.
I'm sorry for sending pr in this period.

> BTW: You should not divide the max_frame_size by 3. You
> should check that the other options, for packet multiplier =
> 1 and 2 also work. See max_packet_size instead of
> max_frame_size!

I attach the patch using max_packet_size instead of
max_frame_size.  This is probably not good but I hope it
will trigger off the isochronous support for beaglebone
black.


--- musb_otg.h.orig	2013-09-11 21:25:45.000000000 +0900
+++ musb_otg.h	2013-09-11 21:25:45.000000000 +0900
@@ -318,7 +318,8 @@
 	uint16_t max_frame_size;	/* packet_size * mult */
 	uint8_t	ep_no;
 	uint8_t	transfer_type;
-	uint8_t	max_packet;
+	uint16_t max_packet_size;
+	int8_t data_seq;		/* sequence of DATA packet */
 	uint8_t	error:1;
 	uint8_t	alt_next:1;
 	uint8_t	short_pkt:1;
--- musb_otg.c.orig	2013-09-11 21:25:45.000000000 +0900
+++ musb_otg.c	2013-09-11 21:25:45.000000000 +0900
@@ -1661,7 +1661,7 @@
 	}
 
 	/* Max packet size */
-	MUSB2_WRITE_1(sc, MUSB2_REG_TXMAXP, td->max_packet);
+	MUSB2_WRITE_1(sc, MUSB2_REG_TXMAXP, td->max_packet_size);
 
 	/* write command */
 	MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
@@ -1689,7 +1689,6 @@
 	uint16_t count;
 	uint8_t csr, csrh;
 	uint8_t to;
-	uint8_t got_short;
 
 	/* get pointer to softc */
 	sc = MUSBOTG_PC2SC(td->pc);
@@ -1704,7 +1703,7 @@
 	DPRINTFN(1, "ep_no=%d\n", td->channel);
 
 	to = 8;				/* don't loop forever! */
-	got_short = 0;
+	td->short_pkt = 0;
 
 	/* select endpoint */
 	MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, td->channel);
@@ -1726,13 +1725,16 @@
 		    td->hport);
 
 		/* RX NAK timeout */
-		MUSB2_WRITE_1(sc, MUSB2_REG_RXNAKLIMIT, MAX_NAK_TO);
+		if (td->transfer_type & MUSB2_MASK_TI_PROTO_ISOC)
+			MUSB2_WRITE_1(sc, MUSB2_REG_RXNAKLIMIT, 0);
+		else
+			MUSB2_WRITE_1(sc, MUSB2_REG_RXNAKLIMIT, MAX_NAK_TO);
 
 		/* Protocol, speed, device endpoint */
 		MUSB2_WRITE_1(sc, MUSB2_REG_RXTI, td->transfer_type);
 
 		/* Max packet size */
-		MUSB2_WRITE_1(sc, MUSB2_REG_RXMAXP, td->max_packet);
+		MUSB2_WRITE_1(sc, MUSB2_REG_RXMAXP, td->max_packet_size);
 
 		/* Data Toggle */
 		csrh = MUSB2_READ_1(sc, MUSB2_REG_RXCSRH);
@@ -1797,11 +1799,13 @@
 	/*
 	 * Check for short or invalid packet:
 	 */
-	if (count != td->max_frame_size) {
-		if (count < td->max_frame_size) {
+	if (count != td->max_packet_size) {
+		if (td->transfer_type & MUSB2_MASK_TI_PROTO_ISOC && td->data_seq < 2) {
+			/* allow short packet of DATA2 and DATA1 in isochronous transfer */
+		}
+		else if (count < td->max_packet_size) {
 			/* we have a short packet */
 			td->short_pkt = 1;
-			got_short = 1;
 		} else {
 			/* invalid USB packet */
 			td->error = 1;
@@ -1884,13 +1888,15 @@
 	MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL, 0);
 
 	/* check if we are complete */
-	if ((td->remainder == 0) || got_short) {
-		if (td->short_pkt) {
-			/* we are complete */
-			musbotg_channel_free(sc, td);
-			return (0);
-		}
-		/* else need to receive a zero length packet */
+        if (td->remainder == 0 || td->short_pkt) {
+		/* we are complete */
+                musbotg_channel_free(sc, td);
+                return (0);
+        }
+
+        else if (td->transfer_type & MUSB2_MASK_TI_PROTO_ISOC && td->data_seq < 2) {
+		/* getting DATA2 or DATA1 */
+		td->data_seq++;
 	}
 
 	/* Reset transaction state and restart */
@@ -2075,7 +2081,7 @@
 	MUSB2_WRITE_1(sc, MUSB2_REG_TXTI, td->transfer_type);
 
 	/* Max packet size */
-	MUSB2_WRITE_1(sc, MUSB2_REG_TXMAXP, td->max_packet);
+	MUSB2_WRITE_1(sc, MUSB2_REG_TXMAXP, td->max_packet_size);
 
 	if (!td->transaction_started) {
 		csrh = MUSB2_READ_1(sc, MUSB2_REG_TXCSRH);
@@ -2444,7 +2450,7 @@
 		}
 
 		temp.transfer_type |= ep_no;
-		td->max_packet = xfer->max_packet_size;
+		td->max_packet_size = xfer->max_packet_size;
 		td->toggle = xfer->endpoint->toggle_next;
 	}
 
@@ -3159,9 +3165,9 @@
 		if (dynfifo) {
 			if (frx && (temp <= nrx)) {
 				if (temp < 8) {
-					frx = 10;	/* 1K */
+					frx = 12;	/* 4K */
 					MUSB2_WRITE_1(sc, MUSB2_REG_RXFIFOSZ, 
-					    MUSB2_VAL_FIFOSZ_512 |
+					    MUSB2_VAL_FIFOSZ_4096 |
 					    MUSB2_MASK_FIFODB);
 				} else {
 					frx = 7;	/* 128 bytes */
@@ -4042,7 +4048,7 @@
 	 * reasonable dummies:
 	 */
 	parm->hc_max_packet_size = 0x400;
-	parm->hc_max_frame_size = 0x400;
+	parm->hc_max_frame_size = 0xc00;
 
 	if ((parm->methods == &musbotg_device_isoc_methods) ||
 	    (parm->methods == &musbotg_device_intr_methods))
@@ -4117,6 +4123,8 @@
 
 			/* init TD */
 			td->max_frame_size = xfer->max_frame_size;
+			td->max_packet_size = xfer->max_packet_size;
+			td->data_seq = 0;
 			td->ep_no = ep_no;
 			td->obj_next = last_obj;
 
--
SAITOU Toshihide



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