In message: <522f517d.8040...@bitfrost.no>
            Hans Petter Selasky <h...@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
_______________________________________________
freebsd-usb@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-usb
To unsubscribe, send any mail to "freebsd-usb-unsubscr...@freebsd.org"

Reply via email to