Date: Tue, 10 Sep 2013 11:40:00 GMT 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: <201309101140.r8ABe0T8006384@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR usb/181987; it has been noted by GNATS. From: SAITOU Toshihide <toshi@ruby.ocn.ne.jp> To: bug-followup@FreeBSD.org Cc: Subject: Re: usb/181987: USB isochronous transfer of the USB driver (Mentor Graphics OTG: musb_otg) is not working. Date: Tue, 10 Sep 2013 20:37:53 +0900 (JST) A missing patch.txt of the previous mail is here: --- musb_otg.c.orig 2013-09-10 19:57:53.000000000 +0900 +++ musb_otg.c 2013-09-10 19:57:53.000000000 +0900 @@ -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,7 +1725,10 @@ 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); @@ -1797,11 +1799,10 @@ /* * Check for short or invalid packet: */ - if (count != td->max_frame_size) { + if (count < td->max_frame_size) { if (count < td->max_frame_size) { /* we have a short packet */ td->short_pkt = 1; - got_short = 1; } else { /* invalid USB packet */ td->error = 1; @@ -1884,13 +1885,18 @@ 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) { + if (td->remainder != 0) { + /* not short_pkt and now getting DATA2 or DATA1 */ + td->transaction_started = 0; + return (1); + } } /* Reset transaction state and restart */ @@ -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)) @@ -4116,7 +4122,10 @@ td = USB_ADD_BYTES(parm->buf, parm->size[0]); /* init TD */ - td->max_frame_size = xfer->max_frame_size; + if (parm->methods == &musbotg_device_isoc_methods) + td->max_frame_size = xfer->max_frame_size/3; + else + td->max_frame_size = xfer->max_frame_size; td->ep_no = ep_no; td->obj_next = last_obj;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201309101140.r8ABe0T8006384>