Author: hselasky
Date: Thu Oct 24 07:38:32 2013
New Revision: 257043
URL: http://svnweb.freebsd.org/changeset/base/257043

Log:
  MFC r256548:
  Correct programming of XXX_MAXP register. This register is 16-bit wide
  and not 8-bit. Fix support for isochronous transfers in USB host mode.
  Fix a whitespace while at it.
  
  PR:           usb/181987
  Approved by:  re (Xin Li)

Modified:
  stable/10/sys/dev/usb/controller/musb_otg.c
  stable/10/sys/dev/usb/controller/musb_otg.h
Directory Properties:
  stable/10/sys/   (props changed)

Modified: stable/10/sys/dev/usb/controller/musb_otg.c
==============================================================================
--- stable/10/sys/dev/usb/controller/musb_otg.c Thu Oct 24 06:25:52 2013        
(r257042)
+++ stable/10/sys/dev/usb/controller/musb_otg.c Thu Oct 24 07:38:32 2013        
(r257043)
@@ -1661,7 +1661,7 @@ repeat:
        }
 
        /* Max packet size */
-       MUSB2_WRITE_1(sc, MUSB2_REG_TXMAXP, td->max_packet);
+       MUSB2_WRITE_2(sc, MUSB2_REG_TXMAXP, td->reg_max_packet);
 
        /* write command */
        MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
@@ -1726,13 +1726,16 @@ repeat:
                    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_2(sc, MUSB2_REG_RXMAXP, td->reg_max_packet);
 
                /* Data Toggle */
                csrh = MUSB2_READ_1(sc, MUSB2_REG_RXCSRH);
@@ -1938,7 +1941,7 @@ musbotg_host_data_tx(struct musbotg_td *
                return (0);     /* complete */
        }
 
-       if (csr & MUSB2_MASK_CSRL_TXNAKTO ) {
+       if (csr & MUSB2_MASK_CSRL_TXNAKTO) {
                /* 
                 * Flush TX FIFO before clearing NAK TO
                 */
@@ -2069,13 +2072,16 @@ musbotg_host_data_tx(struct musbotg_td *
            td->hport);
 
        /* TX NAK timeout */
-       MUSB2_WRITE_1(sc, MUSB2_REG_TXNAKLIMIT, MAX_NAK_TO);
+       if (td->transfer_type & MUSB2_MASK_TI_PROTO_ISOC)
+               MUSB2_WRITE_1(sc, MUSB2_REG_TXNAKLIMIT, 0);
+       else
+               MUSB2_WRITE_1(sc, MUSB2_REG_TXNAKLIMIT, MAX_NAK_TO);
 
        /* Protocol, speed, device endpoint */
        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_2(sc, MUSB2_REG_TXMAXP, td->reg_max_packet);
 
        if (!td->transaction_started) {
                csrh = MUSB2_READ_1(sc, MUSB2_REG_TXCSRH);
@@ -2406,7 +2412,6 @@ musbotg_setup_standard_chain(struct usb_
 
        if (xfer->flags_int.usb_mode == USB_MODE_HOST) {
                speed =  usbd_get_speed(xfer->xroot->udev);
-               xfer_type = xfer->endpoint->edesc->bmAttributes & UE_XFERTYPE;
 
                switch (speed) {
                        case USB_SPEED_LOW:
@@ -2444,7 +2449,6 @@ musbotg_setup_standard_chain(struct usb_
                }
 
                temp.transfer_type |= ep_no;
-               td->max_packet = xfer->max_packet_size;
                td->toggle = xfer->endpoint->toggle_next;
        }
 
@@ -2469,9 +2473,9 @@ musbotg_setup_standard_chain(struct usb_
                x = 0;
        }
 
-       if (x != xfer->nframes) {
-               tx = 0;
+       tx = 0;
 
+       if (x != xfer->nframes) {
                if (xfer->endpointno & UE_DIR_IN)
                        tx = 1;
 
@@ -2532,9 +2536,14 @@ musbotg_setup_standard_chain(struct usb_
 
                } else {
 
-                       /* regular data transfer */
-
-                       temp.short_pkt = (xfer->flags.force_short_xfer) ? 0 : 1;
+                       if (xfer->flags_int.isochronous_xfr) {
+                               /* isochronous data transfer */
+                               /* don't force short */
+                               temp.short_pkt = 1;
+                       } else {
+                               /* regular data transfer */
+                               temp.short_pkt = (xfer->flags.force_short_xfer 
? 0 : 1);
+                       }
                }
 
                musbotg_setup_standard_chain_sub(&temp);
@@ -3158,7 +3167,12 @@ musbotg_init(struct musbotg_softc *sc)
 
                if (dynfifo) {
                        if (frx && (temp <= nrx)) {
-                               if (temp < 8) {
+                               if (temp == 1) {
+                                       frx = 12;       /* 4K */
+                                       MUSB2_WRITE_1(sc, MUSB2_REG_RXFIFOSZ, 
+                                           MUSB2_VAL_FIFOSZ_4096 |
+                                           MUSB2_MASK_FIFODB);
+                               } else if (temp < 8) {
                                        frx = 10;       /* 1K */
                                        MUSB2_WRITE_1(sc, MUSB2_REG_RXFIFOSZ, 
                                            MUSB2_VAL_FIFOSZ_512 |
@@ -3175,7 +3189,12 @@ musbotg_init(struct musbotg_softc *sc)
                                offset += (1 << frx);
                        }
                        if (ftx && (temp <= ntx)) {
-                               if (temp < 8) {
+                               if (temp == 1) {
+                                       ftx = 12;       /* 4K */
+                                       MUSB2_WRITE_1(sc, MUSB2_REG_TXFIFOSZ,
+                                           MUSB2_VAL_FIFOSZ_4096 |
+                                           MUSB2_MASK_FIFODB);
+                               } else if (temp < 8) {
                                        ftx = 10;       /* 1K */
                                        MUSB2_WRITE_1(sc, MUSB2_REG_TXFIFOSZ,
                                            MUSB2_VAL_FIFOSZ_512 |
@@ -4042,7 +4061,7 @@ musbotg_xfer_setup(struct usb_setup_para
         * 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 +4136,8 @@ musbotg_xfer_setup(struct usb_setup_para
 
                        /* init TD */
                        td->max_frame_size = xfer->max_frame_size;
+                       td->reg_max_packet = xfer->max_packet_size |
+                           ((xfer->max_packet_count - 1) << 11);
                        td->ep_no = ep_no;
                        td->obj_next = last_obj;
 

Modified: stable/10/sys/dev/usb/controller/musb_otg.h
==============================================================================
--- stable/10/sys/dev/usb/controller/musb_otg.h Thu Oct 24 06:25:52 2013        
(r257042)
+++ stable/10/sys/dev/usb/controller/musb_otg.h Thu Oct 24 07:38:32 2013        
(r257043)
@@ -316,9 +316,9 @@ struct musbotg_td {
        uint32_t offset;
        uint32_t remainder;
        uint16_t max_frame_size;        /* packet_size * mult */
+       uint16_t reg_max_packet;
        uint8_t ep_no;
        uint8_t transfer_type;
-       uint8_t max_packet;
        uint8_t error:1;
        uint8_t alt_next:1;
        uint8_t short_pkt:1;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to