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
Tue Sep 10 11:40:01 UTC 2013


The following reply was made to PR usb/181987; it has been noted by GNATS.

From: SAITOU Toshihide <toshi at ruby.ocn.ne.jp>
To: bug-followup at 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;
  


More information about the freebsd-usb mailing list