PERFORCE change 159811 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Wed Mar 25 09:01:24 PDT 2009
http://perforce.freebsd.org/chv.cgi?CH=159811
Change 159811 by hselasky at 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,
More information about the p4-projects
mailing list