Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 00dad7fa authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'usb-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6: (28 commits)
  Revert "USB: xhci: Use GFP_ATOMIC under spin_lock"
  USB: ohci-jz4740: Fix spelling in MODULE_ALIAS
  UWB: Return UWB_RSV_ALLOC_NOT_FOUND rather than crashing on NULL dereference if kzalloc fails
  usb: core: fix information leak to userland
  usb: misc: iowarrior: fix information leak to userland
  usb: misc: sisusbvga: fix information leak to userland
  usb: subtle increased memory usage in u_serial
  USB: option: fix when the driver is loaded incorrectly for some Huawei devices.
  USB: xhci: Use GFP_ATOMIC under spin_lock
  usb: gadget: goku_udc: add registered flag bit, fixing build
  USB: ehci/mxc: compile fix
  USB: Fix FSL USB driver on non Open Firmware systems
  USB: the development of the usb tree is now in git
  usb: musb: fail unaligned DMA transfers on v1.8 and above
  USB: ftdi_sio: add device IDs for Milkymist One JTAG/serial
  usb.h: fix ioctl kernel-doc info
  usb: musb: gadget: kill duplicate code in musb_gadget_queue()
  usb: musb: Fix handling of spurious SESSREQ
  usb: musb: fix kernel oops when loading musb_hdrc module for the 2nd time
  USB: musb: blackfin: push clkin value to platform resources
  ...
parents edaa4d66 86871975
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -6233,7 +6233,7 @@ USB SUBSYSTEM
M:	Greg Kroah-Hartman <gregkh@suse.de>
M:	Greg Kroah-Hartman <gregkh@suse.de>
L:	linux-usb@vger.kernel.org
L:	linux-usb@vger.kernel.org
W:	http://www.linux-usb.org
W:	http://www.linux-usb.org
T:	quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6.git
S:	Supported
S:	Supported
F:	Documentation/usb/
F:	Documentation/usb/
F:	drivers/net/usb/
F:	drivers/net/usb/
+4 −3
Original line number Original line Diff line number Diff line
@@ -965,10 +965,11 @@ static int proc_getdriver(struct dev_state *ps, void __user *arg)


static int proc_connectinfo(struct dev_state *ps, void __user *arg)
static int proc_connectinfo(struct dev_state *ps, void __user *arg)
{
{
	struct usbdevfs_connectinfo ci;
	struct usbdevfs_connectinfo ci = {
		.devnum = ps->dev->devnum,
		.slow = ps->dev->speed == USB_SPEED_LOW
	};


	ci.devnum = ps->dev->devnum;
	ci.slow = ps->dev->speed == USB_SPEED_LOW;
	if (copy_to_user(arg, &ci, sizeof(ci)))
	if (copy_to_user(arg, &ci, sizeof(ci)))
		return -EFAULT;
		return -EFAULT;
	return 0;
	return 0;
+1 −1
Original line number Original line Diff line number Diff line
@@ -158,7 +158,7 @@ config USB_GADGET_FSL_USB2
	boolean "Freescale Highspeed USB DR Peripheral Controller"
	boolean "Freescale Highspeed USB DR Peripheral Controller"
	depends on FSL_SOC || ARCH_MXC
	depends on FSL_SOC || ARCH_MXC
	select USB_GADGET_DUALSPEED
	select USB_GADGET_DUALSPEED
	select USB_FSL_MPH_DR_OF
	select USB_FSL_MPH_DR_OF if OF
	help
	help
	   Some of Freescale PowerPC processors have a High Speed
	   Some of Freescale PowerPC processors have a High Speed
	   Dual-Role(DR) USB controller, which supports device mode.
	   Dual-Role(DR) USB controller, which supports device mode.
+2 −1
Original line number Original line Diff line number Diff line
@@ -251,7 +251,8 @@ struct goku_udc {
					got_region:1,
					got_region:1,
					req_config:1,
					req_config:1,
					configured:1,
					configured:1,
					enabled:1;
					enabled:1,
					registered:1;


	/* pci state used to access those endpoints */
	/* pci state used to access those endpoints */
	struct pci_dev			*pdev;
	struct pci_dev			*pdev;
+40 −14
Original line number Original line Diff line number Diff line
@@ -105,11 +105,15 @@ struct gs_port {
	wait_queue_head_t	close_wait;	/* wait for last close */
	wait_queue_head_t	close_wait;	/* wait for last close */


	struct list_head	read_pool;
	struct list_head	read_pool;
	int read_started;
	int read_allocated;
	struct list_head	read_queue;
	struct list_head	read_queue;
	unsigned		n_read;
	unsigned		n_read;
	struct tasklet_struct	push;
	struct tasklet_struct	push;


	struct list_head	write_pool;
	struct list_head	write_pool;
	int write_started;
	int write_allocated;
	struct gs_buf		port_write_buf;
	struct gs_buf		port_write_buf;
	wait_queue_head_t	drain_wait;	/* wait while writes drain */
	wait_queue_head_t	drain_wait;	/* wait while writes drain */


@@ -363,6 +367,9 @@ __acquires(&port->port_lock)
		struct usb_request	*req;
		struct usb_request	*req;
		int			len;
		int			len;


		if (port->write_started >= QUEUE_SIZE)
			break;

		req = list_entry(pool->next, struct usb_request, list);
		req = list_entry(pool->next, struct usb_request, list);
		len = gs_send_packet(port, req->buf, in->maxpacket);
		len = gs_send_packet(port, req->buf, in->maxpacket);
		if (len == 0) {
		if (len == 0) {
@@ -397,6 +404,8 @@ __acquires(&port->port_lock)
			break;
			break;
		}
		}


		port->write_started++;

		/* abort immediately after disconnect */
		/* abort immediately after disconnect */
		if (!port->port_usb)
		if (!port->port_usb)
			break;
			break;
@@ -418,7 +427,6 @@ __acquires(&port->port_lock)
{
{
	struct list_head	*pool = &port->read_pool;
	struct list_head	*pool = &port->read_pool;
	struct usb_ep		*out = port->port_usb->out;
	struct usb_ep		*out = port->port_usb->out;
	unsigned		started = 0;


	while (!list_empty(pool)) {
	while (!list_empty(pool)) {
		struct usb_request	*req;
		struct usb_request	*req;
@@ -430,6 +438,9 @@ __acquires(&port->port_lock)
		if (!tty)
		if (!tty)
			break;
			break;


		if (port->read_started >= QUEUE_SIZE)
			break;

		req = list_entry(pool->next, struct usb_request, list);
		req = list_entry(pool->next, struct usb_request, list);
		list_del(&req->list);
		list_del(&req->list);
		req->length = out->maxpacket;
		req->length = out->maxpacket;
@@ -447,13 +458,13 @@ __acquires(&port->port_lock)
			list_add(&req->list, pool);
			list_add(&req->list, pool);
			break;
			break;
		}
		}
		started++;
		port->read_started++;


		/* abort immediately after disconnect */
		/* abort immediately after disconnect */
		if (!port->port_usb)
		if (!port->port_usb)
			break;
			break;
	}
	}
	return started;
	return port->read_started;
}
}


/*
/*
@@ -535,6 +546,7 @@ static void gs_rx_push(unsigned long _port)
		}
		}
recycle:
recycle:
		list_move(&req->list, &port->read_pool);
		list_move(&req->list, &port->read_pool);
		port->read_started--;
	}
	}


	/* Push from tty to ldisc; without low_latency set this is handled by
	/* Push from tty to ldisc; without low_latency set this is handled by
@@ -587,6 +599,7 @@ static void gs_write_complete(struct usb_ep *ep, struct usb_request *req)


	spin_lock(&port->port_lock);
	spin_lock(&port->port_lock);
	list_add(&req->list, &port->write_pool);
	list_add(&req->list, &port->write_pool);
	port->write_started--;


	switch (req->status) {
	switch (req->status) {
	default:
	default:
@@ -608,7 +621,8 @@ static void gs_write_complete(struct usb_ep *ep, struct usb_request *req)
	spin_unlock(&port->port_lock);
	spin_unlock(&port->port_lock);
}
}


static void gs_free_requests(struct usb_ep *ep, struct list_head *head)
static void gs_free_requests(struct usb_ep *ep, struct list_head *head,
							 int *allocated)
{
{
	struct usb_request	*req;
	struct usb_request	*req;


@@ -616,25 +630,31 @@ static void gs_free_requests(struct usb_ep *ep, struct list_head *head)
		req = list_entry(head->next, struct usb_request, list);
		req = list_entry(head->next, struct usb_request, list);
		list_del(&req->list);
		list_del(&req->list);
		gs_free_req(ep, req);
		gs_free_req(ep, req);
		if (allocated)
			(*allocated)--;
	}
	}
}
}


static int gs_alloc_requests(struct usb_ep *ep, struct list_head *head,
static int gs_alloc_requests(struct usb_ep *ep, struct list_head *head,
		void (*fn)(struct usb_ep *, struct usb_request *))
		void (*fn)(struct usb_ep *, struct usb_request *),
		int *allocated)
{
{
	int			i;
	int			i;
	struct usb_request	*req;
	struct usb_request	*req;
	int n = allocated ? QUEUE_SIZE - *allocated : QUEUE_SIZE;


	/* Pre-allocate up to QUEUE_SIZE transfers, but if we can't
	/* Pre-allocate up to QUEUE_SIZE transfers, but if we can't
	 * do quite that many this time, don't fail ... we just won't
	 * do quite that many this time, don't fail ... we just won't
	 * be as speedy as we might otherwise be.
	 * be as speedy as we might otherwise be.
	 */
	 */
	for (i = 0; i < QUEUE_SIZE; i++) {
	for (i = 0; i < n; i++) {
		req = gs_alloc_req(ep, ep->maxpacket, GFP_ATOMIC);
		req = gs_alloc_req(ep, ep->maxpacket, GFP_ATOMIC);
		if (!req)
		if (!req)
			return list_empty(head) ? -ENOMEM : 0;
			return list_empty(head) ? -ENOMEM : 0;
		req->complete = fn;
		req->complete = fn;
		list_add_tail(&req->list, head);
		list_add_tail(&req->list, head);
		if (allocated)
			(*allocated)++;
	}
	}
	return 0;
	return 0;
}
}
@@ -661,14 +681,15 @@ static int gs_start_io(struct gs_port *port)
	 * configurations may use different endpoints with a given port;
	 * configurations may use different endpoints with a given port;
	 * and high speed vs full speed changes packet sizes too.
	 * and high speed vs full speed changes packet sizes too.
	 */
	 */
	status = gs_alloc_requests(ep, head, gs_read_complete);
	status = gs_alloc_requests(ep, head, gs_read_complete,
		&port->read_allocated);
	if (status)
	if (status)
		return status;
		return status;


	status = gs_alloc_requests(port->port_usb->in, &port->write_pool,
	status = gs_alloc_requests(port->port_usb->in, &port->write_pool,
			gs_write_complete);
			gs_write_complete, &port->write_allocated);
	if (status) {
	if (status) {
		gs_free_requests(ep, head);
		gs_free_requests(ep, head, &port->read_allocated);
		return status;
		return status;
	}
	}


@@ -680,8 +701,9 @@ static int gs_start_io(struct gs_port *port)
	if (started) {
	if (started) {
		tty_wakeup(port->port_tty);
		tty_wakeup(port->port_tty);
	} else {
	} else {
		gs_free_requests(ep, head);
		gs_free_requests(ep, head, &port->read_allocated);
		gs_free_requests(port->port_usb->in, &port->write_pool);
		gs_free_requests(port->port_usb->in, &port->write_pool,
			&port->write_allocated);
		status = -EIO;
		status = -EIO;
	}
	}


@@ -1315,8 +1337,12 @@ void gserial_disconnect(struct gserial *gser)
	spin_lock_irqsave(&port->port_lock, flags);
	spin_lock_irqsave(&port->port_lock, flags);
	if (port->open_count == 0 && !port->openclose)
	if (port->open_count == 0 && !port->openclose)
		gs_buf_free(&port->port_write_buf);
		gs_buf_free(&port->port_write_buf);
	gs_free_requests(gser->out, &port->read_pool);
	gs_free_requests(gser->out, &port->read_pool, NULL);
	gs_free_requests(gser->out, &port->read_queue);
	gs_free_requests(gser->out, &port->read_queue, NULL);
	gs_free_requests(gser->in, &port->write_pool);
	gs_free_requests(gser->in, &port->write_pool, NULL);

	port->read_allocated = port->read_started =
		port->write_allocated = port->write_started = 0;

	spin_unlock_irqrestore(&port->port_lock, flags);
	spin_unlock_irqrestore(&port->port_lock, flags);
}
}
Loading