MFp4 //depot/projects/usb@159811

First patch in a series of memory save patches.

Submitted by:	Hans Petter Selasky
This commit is contained in:
Andrew Thompson 2009-04-05 18:19:19 +00:00
parent ab32485fd9
commit 7efaaa9a91
3 changed files with 48 additions and 8 deletions

View file

@ -504,8 +504,9 @@ usb2_free_iface_data(struct usb2_device *udev)
}
/* 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 *udev, uint8_t index)
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 *udev)
#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) {

View file

@ -832,6 +832,40 @@ usb2_req_get_string_desc(struct usb2_device *udev, struct mtx *mtx, void *sdesc,
UDESC_STRING, string_index, 0));
}
/*------------------------------------------------------------------------*
* 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
*

View file

@ -44,6 +44,8 @@ usb2_error_t usb2_req_get_alt_interface_no(struct usb2_device *udev,
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,