Deleted Added
sdiff udiff text old ( 250204 ) new ( 250207 )
full compact
1/* $FreeBSD: head/sys/dev/usb/usb_request.c 250207 2013-05-03 11:10:04Z hselasky $ */
2/*-
3 * Copyright (c) 1998 The NetBSD Foundation, Inc. All rights reserved.
4 * Copyright (c) 1998 Lennart Augustsson. All rights reserved.
5 * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:

--- 1245 unchanged lines hidden (view full) ---

1255 if (UGETW(d->wTotalLength) < (uint16_t)sizeof(*d)) {
1256 err = USB_ERR_INVAL;
1257 }
1258done:
1259 return (err);
1260}
1261
1262/*------------------------------------------------------------------------*
1263 * usbd_alloc_config_desc
1264 *
1265 * This function is used to allocate a zeroed configuration
1266 * descriptor.
1267 *
1268 * Returns:
1269 * NULL: Failure
1270 * Else: Success
1271 *------------------------------------------------------------------------*/
1272void *
1273usbd_alloc_config_desc(struct usb_device *udev, uint32_t size)
1274{
1275 if (size > USB_CONFIG_MAX) {
1276 DPRINTF("Configuration descriptor too big\n");
1277 return (NULL);
1278 }
1279#if (USB_HAVE_FIXED_CONFIG == 0)
1280 return (malloc(size, M_USBDEV, M_ZERO | M_WAITOK));
1281#else
1282 memset(udev->config_data, 0, sizeof(udev->config_data));
1283 return (udev->config_data);
1284#endif
1285}
1286
1287/*------------------------------------------------------------------------*
1288 * usbd_alloc_config_desc
1289 *
1290 * This function is used to free a configuration descriptor.
1291 *------------------------------------------------------------------------*/
1292void
1293usbd_free_config_desc(struct usb_device *udev, void *ptr)
1294{
1295#if (USB_HAVE_FIXED_CONFIG == 0)
1296 free(ptr, M_USBDEV);
1297#endif
1298}
1299
1300/*------------------------------------------------------------------------*
1301 * usbd_req_get_config_desc_full
1302 *
1303 * This function gets the complete USB configuration descriptor and
1304 * ensures that "wTotalLength" is correct. The returned configuration
1305 * descriptor is freed by calling "usbd_free_config_desc()".
1306 *
1307 * Returns:
1308 * 0: Success
1309 * Else: Failure
1310 *------------------------------------------------------------------------*/
1311usb_error_t
1312usbd_req_get_config_desc_full(struct usb_device *udev, struct mtx *mtx,
1313 struct usb_config_descriptor **ppcd, uint8_t index)
1314{
1315 struct usb_config_descriptor cd;
1316 struct usb_config_descriptor *cdesc;
1317 uint32_t len;
1318 usb_error_t err;
1319
1320 DPRINTFN(4, "index=%d\n", index);
1321

--- 7 unchanged lines hidden (view full) ---

1329 len = UGETW(cd.wTotalLength);
1330 if (len < (uint32_t)sizeof(*cdesc)) {
1331 /* corrupt descriptor */
1332 return (USB_ERR_INVAL);
1333 } else if (len > USB_CONFIG_MAX) {
1334 DPRINTF("Configuration descriptor was truncated\n");
1335 len = USB_CONFIG_MAX;
1336 }
1337 cdesc = usbd_alloc_config_desc(udev, len);
1338 if (cdesc == NULL)
1339 return (USB_ERR_NOMEM);
1340 err = usbd_req_get_desc(udev, mtx, NULL, cdesc, len, len, 0,
1341 UDESC_CONFIG, index, 3);
1342 if (err) {
1343 usbd_free_config_desc(udev, cdesc);
1344 return (err);
1345 }
1346 /* make sure that the device is not fooling us: */
1347 USETW(cdesc->wTotalLength, len);
1348
1349 *ppcd = cdesc;
1350
1351 return (0); /* success */

--- 920 unchanged lines hidden ---