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>