Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Mar 2009 16:01:22 GMT
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 159811 for review
Message-ID:  <200903251601.n2PG1M4g072468@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=159811

Change 159811 by hselasky@hselasky_laptop001 on 2009/03/25 16:00:54

	
	USB core:
	- First patch in a series of memory save patches.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb/usb_device.c#15 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_request.c#6 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_request.h#4 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb/usb_device.c#15 (text+ko) ====

@@ -504,8 +504,9 @@
 	}
 
 	/* free "cdesc" after "ifaces", if any */
-	if (udev->cdesc) {
-		free(udev->cdesc, M_USB);
+	if (udev->cdesc != NULL) {
+		if (udev->flags.usb2_mode != USB_MODE_DEVICE)
+			free(udev->cdesc, M_USB);
 		udev->cdesc = NULL;
 	}
 	/* set unconfigured state */
@@ -569,8 +570,14 @@
 		goto done;
 	}
 	/* get the full config descriptor */
-	err = usb2_req_get_config_desc_full(udev,
-	    NULL, &cdp, M_USB, index);
+	if (udev->flags.usb2_mode == USB_MODE_DEVICE) {
+		/* save some memory */
+		err = usb2_req_get_config_desc_ptr(udev, &cdp, index);
+	} else {
+		/* normal request */
+		err = usb2_req_get_config_desc_full(udev,
+		    NULL, &cdp, M_USB, index);
+	}
 	if (err) {
 		goto done;
 	}
@@ -1713,10 +1720,9 @@
 	udev->ugen_symlink = usb2_alloc_symlink(udev->ugen_name);
 
 	/* Announce device */
-#if USB_HAVE_STRINGS
 	printf("%s: <%s> at %s\n", udev->ugen_name, udev->manufacturer,
 	    device_get_nameunit(udev->bus->bdev));
-#endif
+
 	usb2_notify_addq("+", udev);
 #endif
 done:
@@ -1851,10 +1857,8 @@
 #if USB_HAVE_UGEN
 	usb2_notify_addq("-", udev);
 
-#if USB_HAVE_STRINGS
 	printf("%s: <%s> at %s (disconnected)\n", udev->ugen_name,
 	    udev->manufacturer, device_get_nameunit(bus->bdev));
-#endif
 
 	/* Destroy UGEN symlink, if any */
 	if (udev->ugen_symlink) {

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

@@ -833,6 +833,40 @@
 }
 
 /*------------------------------------------------------------------------*
+ *	usb2_req_get_config_desc_ptr
+ *
+ * This function is used in device side mode to retrieve the pointer
+ * to the generated config descriptor. This saves allocating space for
+ * an additional config descriptor when setting the configuration.
+ *
+ * Returns:
+ *    0: Success
+ * Else: Failure
+ *------------------------------------------------------------------------*/
+usb2_error_t
+usb2_req_get_config_desc_ptr(struct usb2_device *udev,
+    struct usb2_config_descriptor **ppcd, uint8_t config_index)
+{
+	uint16_t len;
+
+	struct usb2_device_request req;
+
+	if (udev->flags.usb2_mode != USB_MODE_DEVICE)
+		return (USB_ERR_INVAL);
+
+	req.bmRequestType = UT_READ_CLASS_DEVICE;
+	req.bRequest = UR_GET_DESCRIPTOR;
+	USETW2(req.wValue, UDESC_CONFIG, config_index);
+	USETW(req.wIndex, 0);
+	USETW(req.wLength, 0);
+
+	(usb2_temp_get_desc_p) (udev, &req, 
+	    __DECONST(const void **, ppcd), &len);
+
+	return (*ppcd ? USB_ERR_NORMAL_COMPLETION : USB_ERR_INVAL);
+}
+
+/*------------------------------------------------------------------------*
  *	usb2_req_get_config_desc
  *
  * Returns:

==== //depot/projects/usb/src/sys/dev/usb/usb_request.h#4 (text+ko) ====

@@ -44,6 +44,8 @@
 		    uint8_t iface_index);
 usb2_error_t usb2_req_get_config(struct usb2_device *udev, struct mtx *mtx,
 		    uint8_t *pconf);
+usb2_error_t usb2_req_get_config_desc_ptr(struct usb2_device *udev,
+		    struct usb2_config_descriptor **ppcd, uint8_t config_index);
 usb2_error_t usb2_req_get_config_desc(struct usb2_device *udev, struct mtx *mtx,
 		    struct usb2_config_descriptor *d, uint8_t conf_index);
 usb2_error_t usb2_req_get_config_desc_full(struct usb2_device *udev,



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200903251601.n2PG1M4g072468>