PERFORCE change 149588 for review

Hans Petter Selasky hselasky at FreeBSD.org
Thu Sep 11 07:58:04 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=149588

Change 149588 by hselasky at hselasky_laptop001 on 2008/09/11 07:57:17

	
	Add support for preselected endpoint numbers.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb2/template/usb2_template.c#10 edit
.. //depot/projects/usb/src/sys/dev/usb2/template/usb2_template.h#5 edit
.. //depot/projects/usb/src/sys/dev/usb2/template/usb2_template_cdce.c#7 edit
.. //depot/projects/usb/src/sys/dev/usb2/template/usb2_template_msc.c#6 edit
.. //depot/projects/usb/src/sys/dev/usb2/template/usb2_template_mtp.c#6 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb2/template/usb2_template.c#10 (text+ko) ====

@@ -164,7 +164,7 @@
 		/* escape for Zero Max Packet Size */
 		mps = 0;
 	}
-	ea = (ted->direction & (UE_DIR_IN | UE_DIR_OUT));
+	ea = (ted->bEndpointAddress & (UE_ADDR | UE_DIR_IN | UE_DIR_OUT));
 	et = (ted->bmAttributes & UE_XFERTYPE);
 
 	/*
@@ -503,7 +503,12 @@
 	distance = 0xFFFF;
 	best_n = 0;
 
+	if ((!ep->needs_in) && (!ep->needs_out)) {
+		return (0);		/* we are done */
+	}
 	if (ep->needs_ep_type == UE_CONTROL) {
+		ep->needs_in = 0;
+		ep->needs_out = 0;
 		dir_in = 1;
 		dir_out = 1;
 	} else {
@@ -572,12 +577,6 @@
 		/* get the correct profile */
 		pf = ep->pf;
 
-		/* get maximum frame size */
-		if (dir_in)
-			max_frame_size = pf->max_in_frame_size;
-		else
-			max_frame_size = pf->max_out_frame_size;
-
 		/* reserve IN-endpoint */
 		if (dir_in || pf->is_simplex) {
 			ues->bmInAlloc[best_n / 8] |=
@@ -609,6 +608,7 @@
 usb2_hw_ep_get_needs(struct usb2_hw_ep_scratch *ues,
     uint8_t ep_type, uint8_t is_complete)
 {
+	const struct usb2_hw_ep_profile *pf;
 	struct usb2_hw_ep_scratch_sub *ep_iface;
 	struct usb2_hw_ep_scratch_sub *ep_curr;
 	struct usb2_hw_ep_scratch_sub *ep_max;
@@ -619,6 +619,7 @@
 	uint16_t wMaxPacketSize;
 	uint16_t temp;
 	uint8_t speed;
+	uint8_t ep_no;
 
 	ep_iface = ues->ep_max;
 	ep_curr = ues->ep_max;
@@ -670,13 +671,58 @@
 			/* handle packet multiplier */
 			temp = (wMaxPacketSize >> 11) & 3;
 			wMaxPacketSize &= 0x7FF;
-			if (temp == 2) {
+			if (temp == 1) {
 				wMaxPacketSize *= 2;
 			} else {
 				wMaxPacketSize *= 3;
 			}
 		}
-		if (is_complete) {
+		/*
+		 * Check if we have a fixed endpoint number, else the
+		 * endpoint number is allocated dynamically:
+		 */
+		ep_no = (ed->bEndpointAddress & UE_ADDR);
+		if (ep_no != 0) {
+
+			/* get HW endpoint profile */
+			(ues->methods->get_hw_ep_profile)
+			    (ues->udev, &pf, ep_no);
+			if (pf == NULL) {
+				/* HW profile does not exist - failure */
+				DPRINTFN(0, "Endpoint profile %u "
+				    "does not exist\n", ep_no);
+				return (1);
+			}
+			/* reserve fixed endpoint number */
+			if (ep_type == UE_CONTROL) {
+				ues->bmInAlloc[ep_no / 8] |=
+				    (1 << (ep_no % 8));
+				ues->bmOutAlloc[ep_no / 8] |=
+				    (1 << (ep_no % 8));
+				if ((pf->max_in_frame_size < wMaxPacketSize) ||
+				    (pf->max_out_frame_size < wMaxPacketSize)) {
+					DPRINTFN(0, "Endpoint profile %u "
+					    "has too small buffer!\n", ep_no);
+					return (1);
+				}
+			} else if (ed->bEndpointAddress & UE_DIR_IN) {
+				ues->bmInAlloc[ep_no / 8] |=
+				    (1 << (ep_no % 8));
+				if (pf->max_in_frame_size < wMaxPacketSize) {
+					DPRINTFN(0, "Endpoint profile %u "
+					    "has too small buffer!\n", ep_no);
+					return (1);
+				}
+			} else {
+				ues->bmOutAlloc[ep_no / 8] |=
+				    (1 << (ep_no % 8));
+				if (pf->max_out_frame_size < wMaxPacketSize) {
+					DPRINTFN(0, "Endpoint profile %u "
+					    "has too small buffer!\n", ep_no);
+					return (1);
+				}
+			}
+		} else if (is_complete) {
 
 			/* check if we have enough buffer space */
 			if (wMaxPacketSize >

==== //depot/projects/usb/src/sys/dev/usb2/template/usb2_template.h#5 (text+ko) ====

@@ -45,7 +45,12 @@
 	const void **ppRawDesc;
 	const struct usb2_temp_packet_size *pPacketSize;
 	const struct usb2_temp_interval *pIntervals;
-	uint8_t	direction;		/* UE_DIR_IN or UE_DIR_OUT */
+	/*
+	 * If (bEndpointAddress & UE_ADDR) is non-zero the endpoint number
+	 * is pre-selected for this endpoint descriptor. Else an endpoint
+	 * number is automatically chosen.
+	 */
+	uint8_t	bEndpointAddress;	/* UE_DIR_IN or UE_DIR_OUT */
 	uint8_t	bmAttributes;
 };
 

==== //depot/projects/usb/src/sys/dev/usb2/template/usb2_template_cdce.c#7 (text+ko) ====

@@ -184,19 +184,27 @@
 
 static const struct usb2_temp_endpoint_desc bulk_in_ep = {
 	.pPacketSize = &bulk_mps,
-	.direction = UE_DIR_IN,
+#ifdef USB_HIP_IN_EP_0
+	.bEndpointAddress = USB_HIP_IN_EP_0,
+#else
+	.bEndpointAddress = UE_DIR_IN,
+#endif
 	.bmAttributes = UE_BULK,
 };
 
 static const struct usb2_temp_endpoint_desc bulk_out_ep = {
 	.pPacketSize = &bulk_mps,
-	.direction = UE_DIR_OUT,
+#ifdef USB_HIP_OUT_EP_0
+	.bEndpointAddress = USB_HIP_OUT_EP_0,
+#else
+	.bEndpointAddress = UE_DIR_OUT,
+#endif
 	.bmAttributes = UE_BULK,
 };
 
 static const struct usb2_temp_endpoint_desc intr_in_ep = {
 	.pPacketSize = &intr_mps,
-	.direction = UE_DIR_IN,
+	.bEndpointAddress = UE_DIR_IN,
 	.bmAttributes = UE_INTERRUPT,
 };
 

==== //depot/projects/usb/src/sys/dev/usb2/template/usb2_template_msc.c#6 (text+ko) ====

@@ -104,13 +104,21 @@
 
 static const struct usb2_temp_endpoint_desc bulk_in_ep = {
 	.pPacketSize = &bulk_mps,
-	.direction = UE_DIR_IN,
+#ifdef USB_HIP_IN_EP_0
+	.bEndpointAddress = USB_HIP_IN_EP_0,
+#else
+	.bEndpointAddress = UE_DIR_IN,
+#endif
 	.bmAttributes = UE_BULK,
 };
 
 static const struct usb2_temp_endpoint_desc bulk_out_ep = {
 	.pPacketSize = &bulk_mps,
-	.direction = UE_DIR_OUT,
+#ifdef USB_HIP_OUT_EP_0
+	.bEndpointAddress = USB_HIP_OUT_EP_0,
+#else
+	.bEndpointAddress = UE_DIR_OUT,
+#endif
 	.bmAttributes = UE_BULK,
 };
 

==== //depot/projects/usb/src/sys/dev/usb2/template/usb2_template_mtp.c#6 (text+ko) ====

@@ -108,21 +108,34 @@
 	.mps[USB_SPEED_HIGH] = 512,
 };
 
+static const struct usb2_temp_packet_size intr_mps = {
+	.mps[USB_SPEED_FULL] = 64,
+	.mps[USB_SPEED_HIGH] = 64,
+};
+
 static const struct usb2_temp_endpoint_desc bulk_out_ep = {
 	.pPacketSize = &bulk_mps,
-	.direction = UE_DIR_OUT,
+#ifdef USB_HIP_OUT_EP_0
+	.bEndpointAddress = USB_HIP_OUT_EP_0,
+#else
+	.bEndpointAddress = UE_DIR_OUT,
+#endif
 	.bmAttributes = UE_BULK,
 };
 
 static const struct usb2_temp_endpoint_desc intr_in_ep = {
-	.pPacketSize = &bulk_mps,
-	.direction = UE_DIR_IN,
+	.pPacketSize = &intr_mps,
+	.bEndpointAddress = UE_DIR_IN,
 	.bmAttributes = UE_INTERRUPT,
 };
 
 static const struct usb2_temp_endpoint_desc bulk_in_ep = {
 	.pPacketSize = &bulk_mps,
-	.direction = UE_DIR_IN,
+#ifdef USB_HIP_IN_EP_0
+	.bEndpointAddress = USB_HIP_IN_EP_0,
+#else
+	.bEndpointAddress = UE_DIR_IN,
+#endif
 	.bmAttributes = UE_BULK,
 };
 


More information about the p4-projects mailing list