usb/181987: commit references a PR

dfilter service dfilter at FreeBSD.ORG
Thu Oct 24 07:40:02 UTC 2013


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

From: dfilter at FreeBSD.ORG (dfilter service)
To: bug-followup at FreeBSD.org
Cc:  
Subject: Re: usb/181987: commit references a PR
Date: Thu, 24 Oct 2013 07:38:40 +0000 (UTC)

 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 at freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
 


More information about the freebsd-usb mailing list