Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 5 Apr 2009 18:19:20 +0000 (UTC)
From:      Andrew Thompson <thompsa@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r190727 - head/sys/dev/usb
Message-ID:  <200904051819.n35IJKWS027589@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: thompsa
Date: Sun Apr  5 18:19:19 2009
New Revision: 190727
URL: http://svn.freebsd.org/changeset/base/190727

Log:
  MFp4 //depot/projects/usb@159811
  
  First patch in a series of memory save patches.
  
  Submitted by:	Hans Petter Selasky

Modified:
  head/sys/dev/usb/usb_device.c
  head/sys/dev/usb/usb_request.c
  head/sys/dev/usb/usb_request.h

Modified: head/sys/dev/usb/usb_device.c
==============================================================================
--- head/sys/dev/usb/usb_device.c	Sun Apr  5 18:19:10 2009	(r190726)
+++ head/sys/dev/usb/usb_device.c	Sun Apr  5 18:19:19 2009	(r190727)
@@ -504,8 +504,9 @@ usb2_free_iface_data(struct usb2_device 
 	}
 
 	/* 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 @@ usb2_set_config_index(struct usb2_device
 		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 @@ repeat_set_config:
 	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 @@ usb2_free_device(struct usb2_device *ude
 #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) {

Modified: head/sys/dev/usb/usb_request.c
==============================================================================
--- head/sys/dev/usb/usb_request.c	Sun Apr  5 18:19:10 2009	(r190726)
+++ head/sys/dev/usb/usb_request.c	Sun Apr  5 18:19:19 2009	(r190727)
@@ -833,6 +833,40 @@ usb2_req_get_string_desc(struct usb2_dev
 }
 
 /*------------------------------------------------------------------------*
+ *	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:

Modified: head/sys/dev/usb/usb_request.h
==============================================================================
--- head/sys/dev/usb/usb_request.h	Sun Apr  5 18:19:10 2009	(r190726)
+++ head/sys/dev/usb/usb_request.h	Sun Apr  5 18:19:19 2009	(r190727)
@@ -44,6 +44,8 @@ usb2_error_t usb2_req_get_alt_interface_
 		    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?200904051819.n35IJKWS027589>