From owner-svn-src-all@FreeBSD.ORG Fri May 3 09:23:08 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 849F2C1B; Fri, 3 May 2013 09:23:08 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 683C7110A; Fri, 3 May 2013 09:23:08 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.6/8.14.6) with ESMTP id r439N8XD086665; Fri, 3 May 2013 09:23:08 GMT (envelope-from hselasky@svn.freebsd.org) Received: (from hselasky@localhost) by svn.freebsd.org (8.14.6/8.14.5/Submit) id r439N7cp086657; Fri, 3 May 2013 09:23:07 GMT (envelope-from hselasky@svn.freebsd.org) Message-Id: <201305030923.r439N7cp086657@svn.freebsd.org> From: Hans Petter Selasky Date: Fri, 3 May 2013 09:23:07 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r250204 - head/sys/dev/usb X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 May 2013 09:23:08 -0000 Author: hselasky Date: Fri May 3 09:23:06 2013 New Revision: 250204 URL: http://svnweb.freebsd.org/changeset/base/250204 Log: Add some defines to limit USB memory usage in reduced memory systems. Modified: head/sys/dev/usb/usb_device.c head/sys/dev/usb/usb_device.h head/sys/dev/usb/usb_freebsd.h head/sys/dev/usb/usb_freebsd_loader.h head/sys/dev/usb/usb_parse.c head/sys/dev/usb/usb_request.c Modified: head/sys/dev/usb/usb_device.c ============================================================================== --- head/sys/dev/usb/usb_device.c Fri May 3 08:20:10 2013 (r250203) +++ head/sys/dev/usb/usb_device.c Fri May 3 09:23:06 2013 (r250204) @@ -729,10 +729,6 @@ usb_config_parse(struct usb_device *udev while ((id = usb_idesc_foreach(udev->cdesc, &ips))) { - /* check for interface overflow */ - if (ips.iface_index == USB_IFACE_MAX) - break; /* crazy */ - iface = udev->ifaces + ips.iface_index; /* check for specific interface match */ @@ -779,8 +775,11 @@ usb_config_parse(struct usb_device *udev /* iterate all the endpoint descriptors */ while ((ed = usb_edesc_foreach(udev->cdesc, ed))) { - if (temp == USB_EP_MAX) - break; /* crazy */ + /* check if endpoint limit has been reached */ + if (temp >= USB_MAX_EP_UNITS) { + DPRINTF("Endpoint limit reached\n"); + break; + } ep = udev->endpoints + temp; @@ -810,6 +809,7 @@ usb_config_parse(struct usb_device *udev if (cmd == USB_CFG_ALLOC) { udev->ifaces_max = ips.iface_index; +#if (USB_HAVE_FIXED_IFACE == 0) udev->ifaces = NULL; if (udev->ifaces_max != 0) { udev->ifaces = malloc(sizeof(*iface) * udev->ifaces_max, @@ -819,6 +819,8 @@ usb_config_parse(struct usb_device *udev goto done; } } +#endif +#if (USB_HAVE_FIXED_ENDPOINT == 0) if (ep_max != 0) { udev->endpoints = malloc(sizeof(*ep) * ep_max, M_USB, M_WAITOK | M_ZERO); @@ -829,6 +831,7 @@ usb_config_parse(struct usb_device *udev } else { udev->endpoints = NULL; } +#endif USB_BUS_LOCK(udev->bus); udev->endpoints_max = ep_max; /* reset any ongoing clear-stall */ @@ -846,14 +849,14 @@ cleanup: udev->ep_curr = NULL; USB_BUS_UNLOCK(udev->bus); - /* cleanup */ - if (udev->ifaces != NULL) - free(udev->ifaces, M_USB); - if (udev->endpoints != NULL) - free(udev->endpoints, M_USB); - +#if (USB_HAVE_FIXED_IFACE == 0) + free(udev->ifaces, M_USB); udev->ifaces = NULL; +#endif +#if (USB_HAVE_FIXED_ENDPOINT == 0) + free(udev->endpoints, M_USB); udev->endpoints = NULL; +#endif udev->ifaces_max = 0; } } Modified: head/sys/dev/usb/usb_device.h ============================================================================== --- head/sys/dev/usb/usb_device.h Fri May 3 08:20:10 2013 (r250203) +++ head/sys/dev/usb/usb_device.h Fri May 3 09:23:06 2013 (r250204) @@ -186,9 +186,17 @@ struct usb_device { struct mtx device_mtx; struct cv ctrlreq_cv; struct cv ref_cv; +#if (USB_HAVE_FIXED_IFACE == 0) struct usb_interface *ifaces; +#else + struct usb_interface ifaces[USB_IFACE_MAX]; +#endif struct usb_endpoint ctrl_ep; /* Control Endpoint 0 */ +#if (USB_HAVE_FIXED_ENDPOINT == 0) struct usb_endpoint *endpoints; +#else + struct usb_endpoint endpoints[USB_MAX_EP_UNITS]; +#endif struct usb_power_save pwr_save;/* power save data */ struct usb_bus *bus; /* our USB BUS */ device_t parent_dev; /* parent device */ Modified: head/sys/dev/usb/usb_freebsd.h ============================================================================== --- head/sys/dev/usb/usb_freebsd.h Fri May 3 08:20:10 2013 (r250203) +++ head/sys/dev/usb/usb_freebsd.h Fri May 3 09:23:06 2013 (r250204) @@ -45,6 +45,8 @@ #define USB_HAVE_ROOT_MOUNT_HOLD 1 #define USB_HAVE_ID_SECTION 1 #define USB_HAVE_PER_BUS_PROCESS 1 +#define USB_HAVE_FIXED_ENDPOINT 0 +#define USB_HAVE_FIXED_IFACE 0 #define USB_TD_GET_PROC(td) (td)->td_proc #define USB_PROC_GET_GID(td) (td)->p_pgid @@ -61,9 +63,11 @@ #define USB_FS_ISOC_UFRAME_MAX 4 /* exclusive unit */ #define USB_BUS_MAX 256 /* units */ #define USB_MAX_DEVICES 128 /* units */ +#define USB_CONFIG_MAX 65535 /* bytes */ #define USB_IFACE_MAX 32 /* units */ #define USB_FIFO_MAX 128 /* units */ #define USB_MAX_EP_STREAMS 8 /* units */ +#define USB_MAX_EP_UNITS 32 /* units */ #define USB_MAX_FS_ISOC_FRAMES_PER_XFER (120) /* units */ #define USB_MAX_HS_ISOC_FRAMES_PER_XFER (8*120) /* units */ Modified: head/sys/dev/usb/usb_freebsd_loader.h ============================================================================== --- head/sys/dev/usb/usb_freebsd_loader.h Fri May 3 08:20:10 2013 (r250203) +++ head/sys/dev/usb/usb_freebsd_loader.h Fri May 3 09:23:06 2013 (r250204) @@ -45,6 +45,8 @@ #define USB_HAVE_ROOT_MOUNT_HOLD 0 #define USB_HAVE_ID_SECTION 0 #define USB_HAVE_PER_BUS_PROCESS 0 +#define USB_HAVE_FIXED_ENDPOINT 0 +#define USB_HAVE_FIXED_IFACE 0 #define USB_TD_GET_PROC(td) (td)->td_proc #define USB_PROC_GET_GID(td) (td)->p_pgid @@ -61,8 +63,10 @@ #define USB_FS_ISOC_UFRAME_MAX 4 /* exclusive unit */ #define USB_BUS_MAX 256 /* units */ #define USB_MAX_DEVICES 128 /* units */ +#define USB_CONFIG_MAX 65535 /* bytes */ #define USB_IFACE_MAX 32 /* units */ #define USB_FIFO_MAX 128 /* units */ +#define USB_MAX_EP_UNITS 32 /* units */ #define USB_MAX_EP_STREAMS 8 /* units */ #define USB_MAX_FS_ISOC_FRAMES_PER_XFER (120) /* units */ Modified: head/sys/dev/usb/usb_parse.c ============================================================================== --- head/sys/dev/usb/usb_parse.c Fri May 3 08:20:10 2013 (r250203) +++ head/sys/dev/usb/usb_parse.c Fri May 3 09:23:06 2013 (r250204) @@ -49,6 +49,11 @@ #include #include #include + +#define USB_DEBUG_VAR usb_debug + +#include +#include #endif /* USB_GLOBAL_INCLUDE_FILE */ /*------------------------------------------------------------------------* @@ -142,7 +147,7 @@ usb_idesc_foreach(struct usb_config_desc } if (ps->desc == NULL) { - /* first time */ + /* first time or zero descriptors */ } else if (new_iface) { /* new interface */ ps->iface_index ++; @@ -151,6 +156,14 @@ usb_idesc_foreach(struct usb_config_desc /* new alternate interface */ ps->iface_index_alt ++; } +#if (USB_IFACE_MAX <= 0) +#error "USB_IFACE_MAX must be defined greater than zero" +#endif + /* check for too many interfaces */ + if (ps->iface_index >= USB_IFACE_MAX) { + DPRINTF("Interface limit reached\n"); + id = NULL; + } /* store and return current descriptor */ ps->desc = (struct usb_descriptor *)id; Modified: head/sys/dev/usb/usb_request.c ============================================================================== --- head/sys/dev/usb/usb_request.c Fri May 3 08:20:10 2013 (r250203) +++ head/sys/dev/usb/usb_request.c Fri May 3 09:23:06 2013 (r250204) @@ -1276,7 +1276,7 @@ usbd_req_get_config_desc_full(struct usb { struct usb_config_descriptor cd; struct usb_config_descriptor *cdesc; - uint16_t len; + uint32_t len; usb_error_t err; DPRINTFN(4, "index=%d\n", index); @@ -1284,19 +1284,21 @@ usbd_req_get_config_desc_full(struct usb *ppcd = NULL; err = usbd_req_get_config_desc(udev, mtx, &cd, index); - if (err) { + if (err) return (err); - } + /* get full descriptor */ len = UGETW(cd.wTotalLength); - if (len < sizeof(*cdesc)) { + if (len < (uint32_t)sizeof(*cdesc)) { /* corrupt descriptor */ return (USB_ERR_INVAL); + } else if (len > USB_CONFIG_MAX) { + DPRINTF("Configuration descriptor was truncated\n"); + len = USB_CONFIG_MAX; } cdesc = malloc(len, mtype, M_WAITOK); - if (cdesc == NULL) { + if (cdesc == NULL) return (USB_ERR_NOMEM); - } err = usbd_req_get_desc(udev, mtx, NULL, cdesc, len, len, 0, UDESC_CONFIG, index, 3); if (err) {