From owner-freebsd-usb@FreeBSD.ORG Wed Sep 11 12:50:19 2013 Return-Path: Delivered-To: freebsd-usb@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 8D1B0CC6 for ; Wed, 11 Sep 2013 12:50:19 +0000 (UTC) (envelope-from toshi@ruby.ocn.ne.jp) Received: from defer113.ocn.ad.jp (defer113.ocn.ad.jp [122.28.15.167]) by mx1.freebsd.org (Postfix) with ESMTP id 4209729F3 for ; Wed, 11 Sep 2013 12:50:18 +0000 (UTC) Received: from msgw001-04.ocn.ad.jp (msgw001-04.ocn.ad.jp [180.37.203.73]) by defer113.ocn.ad.jp (Postfix) with ESMTP id D006626E90E for ; Wed, 11 Sep 2013 21:30:50 +0900 (JST) Received: from localhost (p10180-ipngn100303sizuokaden.shizuoka.ocn.ne.jp [114.176.33.180]) by msgw001-04.ocn.ad.jp (Postfix) with ESMTP id ADCE3833E91; Wed, 11 Sep 2013 21:30:43 +0900 (JST) Date: Wed, 11 Sep 2013 21:30:10 +0900 (JST) Message-Id: <20130911.213010.71085465.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. From: SAITOU Toshihide In-Reply-To: <522F517D.8040102@bitfrost.no> References: <201309101140.r8ABe0T8006384@freefall.freebsd.org> <522F517D.8040102@bitfrost.no> X-GPG-fingerprint: 34B3 0B6A 8520 F5B0 EBC7 69F6 C055 9F8A 0D49 F8FC X-Mailer: Mew version 6.2.51 on Emacs 22.3 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 11 Sep 2013 12:50:19 -0000 In message: <522F517D.8040102@bitfrost.no> Hans Petter Selasky 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