usb/181987: USB isochronous transfer of the USB driver (Mentor Graphics OTG: musb_otg) is not working.
SAITOU Toshihide
toshi at ruby.ocn.ne.jp
Wed Sep 11 12:50:19 UTC 2013
In message: <522F517D.8040102 at bitfrost.no>
Hans Petter Selasky <hps at 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
More information about the freebsd-usb
mailing list