View | Details | Raw Unified | Return to bug 230434 | Differences between
and this patch

Collapse All | Expand All

(-)sys/dev/usb/controller/dwc_otg.c (-6 / +30 lines)
Lines 1563-1574 Link Here
1563
		hcchar = td->hcchar;
1563
		hcchar = td->hcchar;
1564
		hcchar |= HCCHAR_EPDIR_IN;
1564
		hcchar |= HCCHAR_EPDIR_IN;
1565
1565
1566
		/* receive complete split ASAP */
1566
		if (td->ep_type == UE_ISOCHRONOUS) {
1567
		if ((sc->sc_last_frame_num & 1) != 0 &&
1567
			if (td->hcsplt != 0) {
1568
		    td->ep_type == UE_ISOCHRONOUS)
1568
				/* double buffer */
1569
			hcchar |= HCCHAR_ODDFRM;
1569
				if ((sc->sc_last_frame_num ^ x) & 1)
1570
		else
1570
					hcchar |= HCCHAR_ODDFRM;
1571
				else
1572
					hcchar &= ~HCCHAR_ODDFRM;
1573
			} else {
1574
				/* multi buffer, if any */
1575
				if (sc->sc_last_frame_num & 1)
1576
					hcchar |= HCCHAR_ODDFRM;
1577
				else
1578
					hcchar &= ~HCCHAR_ODDFRM;
1579
			}
1580
		} else {
1571
			hcchar &= ~HCCHAR_ODDFRM;
1581
			hcchar &= ~HCCHAR_ODDFRM;
1582
		}
1572
1583
1573
		/* must enable channel before data can be received */
1584
		/* must enable channel before data can be received */
1574
		DWC_OTG_WRITE_4(sc, DOTG_HCCHAR(channel), hcchar);
1585
		DWC_OTG_WRITE_4(sc, DOTG_HCCHAR(channel), hcchar);
Lines 4875-4887 Link Here
4875
					td->tt_index = parm->udev->device_index;
4886
					td->tt_index = parm->udev->device_index;
4876
				else
4887
				else
4877
					td->tt_index = parm->udev->parent_hs_hub->device_index;
4888
					td->tt_index = parm->udev->parent_hs_hub->device_index;
4889
4890
				if ((xfer->endpointno & UE_DIR_IN) != 0 && ep_type == UE_ISOCHRONOUS)
4891
					td->max_packet_count = 2; /* double buffering */
4892
				else
4893
					td->max_packet_count = xfer->max_packet_count;
4878
			} else {
4894
			} else {
4879
				td->tt_index = parm->udev->device_index;
4895
				td->tt_index = parm->udev->device_index;
4896
				td->max_packet_count = xfer->max_packet_count;
4880
			}
4897
			}
4881
4898
4882
			/* init TD */
4899
			/* init TD */
4883
			td->max_packet_size = xfer->max_packet_size;
4900
			td->max_packet_size = xfer->max_packet_size;
4884
			td->max_packet_count = xfer->max_packet_count;
4885
			/* range check */
4901
			/* range check */
4886
			if (td->max_packet_count == 0 || td->max_packet_count > 3)
4902
			if (td->max_packet_count == 0 || td->max_packet_count > 3)
4887
				td->max_packet_count = 1;
4903
				td->max_packet_count = 1;
Lines 4930-4935 Link Here
4930
				DPRINTFN(-1, "Non-isochronous high bandwidth "
4946
				DPRINTFN(-1, "Non-isochronous high bandwidth "
4931
				    "endpoint not supported\n");
4947
				    "endpoint not supported\n");
4932
				return;
4948
				return;
4949
			} else if (dwc_otg_uses_split(udev) &&
4950
				   (edesc->bEndpointAddress & UE_DIR_IN) != 0 &&
4951
				   UGETW(edesc->wMaxPacketSize) >= (171 * 2) &&
4952
				   (edesc->bmAttributes & UE_XFERTYPE) == UE_ISOCHRONOUS) {
4953
				/* not supported */
4954
				DPRINTFN(-1, "Isochronous full speed "
4955
				    "endpoint not supported\n");
4956
				return;
4933
			}
4957
			}
4934
		}
4958
		}
4935
		if ((edesc->bmAttributes & UE_XFERTYPE) == UE_ISOCHRONOUS)
4959
		if ((edesc->bmAttributes & UE_XFERTYPE) == UE_ISOCHRONOUS)

Return to bug 230434