提交 7a9b1492 编写于 作者: L Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6: (229 commits)
  USB: remove unused usb_buffer_alloc and usb_buffer_free macros
  usb: musb: update gfp/slab.h includes
  USB: ftdi_sio: fix legacy SIO-device header
  USB: kl5usb105: reimplement using generic framework
  USB: kl5usb105: minor clean ups
  USB: kl5usb105: fix memory leak
  USB: io_ti: use kfifo to implement write buffering
  USB: io_ti: remove unsused private counter
  USB: ti_usb: use kfifo to implement write buffering
  USB: ir-usb: fix incorrect write-buffer length
  USB: aircable: fix incorrect write-buffer length
  USB: safe_serial: straighten out read processing
  USB: safe_serial: reimplement read using generic framework
  USB: safe_serial: reimplement write using generic framework
  usb-storage: always print quirks
  USB: usb-storage: trivial debug improvements
  USB: oti6858: use port write fifo
  USB: oti6858: use kfifo to implement write buffering
  USB: cypress_m8: use kfifo to implement write buffering
  USB: cypress_m8: remove unused drain define
  ...

Fix up conflicts (due to usb_buffer_alloc/free renaming) in
	drivers/input/tablet/acecad.c
	drivers/input/tablet/kbtab.c
	drivers/input/tablet/wacom_sys.c
	drivers/media/video/gspca/gspca.c
	sound/usb/usbaudio.c
What: /sys/bus/usb/devices/.../power/level
Date: March 2007
KernelVersion: 2.6.21
Contact: Alan Stern <stern@rowland.harvard.edu>
Description:
Each USB device directory will contain a file named
power/level. This file holds a power-level setting for
the device, either "on" or "auto".
"on" means that the device is not allowed to autosuspend,
although normal suspends for system sleep will still
be honored. "auto" means the device will autosuspend
and autoresume in the usual manner, according to the
capabilities of its driver.
During normal use, devices should be left in the "auto"
level. The "on" level is meant for administrative uses.
If you want to suspend a device immediately but leave it
free to wake up in response to I/O requests, you should
write "0" to power/autosuspend.
Device not capable of proper suspend and resume should be
left in the "on" level. Although the USB spec requires
devices to support suspend/resume, many of them do not.
In fact so many don't that by default, the USB core
initializes all non-hub devices in the "on" level. Some
drivers may change this setting when they are bound.
This file is deprecated and will be removed after 2010.
Use the power/control file instead; it does exactly the
same thing.
...@@ -14,34 +14,6 @@ Description: ...@@ -14,34 +14,6 @@ Description:
The autosuspend delay for newly-created devices is set to The autosuspend delay for newly-created devices is set to
the value of the usbcore.autosuspend module parameter. the value of the usbcore.autosuspend module parameter.
What: /sys/bus/usb/devices/.../power/level
Date: March 2007
KernelVersion: 2.6.21
Contact: Alan Stern <stern@rowland.harvard.edu>
Description:
Each USB device directory will contain a file named
power/level. This file holds a power-level setting for
the device, either "on" or "auto".
"on" means that the device is not allowed to autosuspend,
although normal suspends for system sleep will still
be honored. "auto" means the device will autosuspend
and autoresume in the usual manner, according to the
capabilities of its driver.
During normal use, devices should be left in the "auto"
level. The "on" level is meant for administrative uses.
If you want to suspend a device immediately but leave it
free to wake up in response to I/O requests, you should
write "0" to power/autosuspend.
Device not capable of proper suspend and resume should be
left in the "on" level. Although the USB spec requires
devices to support suspend/resume, many of them do not.
In fact so many don't that by default, the USB core
initializes all non-hub devices in the "on" level. Some
drivers may change this setting when they are bound.
What: /sys/bus/usb/devices/.../power/persist What: /sys/bus/usb/devices/.../power/persist
Date: May 2007 Date: May 2007
KernelVersion: 2.6.23 KernelVersion: 2.6.23
......
What: /sys/devices/platform/_UDC_/gadget/suspended
Date: April 2010
Contact: Fabien Chouteau <fabien.chouteau@barco.com>
Description:
Show the suspend state of an USB composite gadget.
1 -> suspended
0 -> resumed
(_UDC_ is the name of the USB Device Controller driver)
...@@ -342,7 +342,7 @@ static inline void skel_delete (struct usb_skel *dev) ...@@ -342,7 +342,7 @@ static inline void skel_delete (struct usb_skel *dev)
{ {
kfree (dev->bulk_in_buffer); kfree (dev->bulk_in_buffer);
if (dev->bulk_out_buffer != NULL) if (dev->bulk_out_buffer != NULL)
usb_buffer_free (dev->udev, dev->bulk_out_size, usb_free_coherent (dev->udev, dev->bulk_out_size,
dev->bulk_out_buffer, dev->bulk_out_buffer,
dev->write_urb->transfer_dma); dev->write_urb->transfer_dma);
usb_free_urb (dev->write_urb); usb_free_urb (dev->write_urb);
......
Background
==========
Bulk endpoint streams were added in the USB 3.0 specification. Streams allow a
device driver to overload a bulk endpoint so that multiple transfers can be
queued at once.
Streams are defined in sections 4.4.6.4 and 8.12.1.4 of the Universal Serial Bus
3.0 specification at http://www.usb.org/developers/docs/ The USB Attached SCSI
Protocol, which uses streams to queue multiple SCSI commands, can be found on
the T10 website (http://t10.org/).
Device-side implications
========================
Once a buffer has been queued to a stream ring, the device is notified (through
an out-of-band mechanism on another endpoint) that data is ready for that stream
ID. The device then tells the host which "stream" it wants to start. The host
can also initiate a transfer on a stream without the device asking, but the
device can refuse that transfer. Devices can switch between streams at any
time.
Driver implications
===================
int usb_alloc_streams(struct usb_interface *interface,
struct usb_host_endpoint **eps, unsigned int num_eps,
unsigned int num_streams, gfp_t mem_flags);
Device drivers will call this API to request that the host controller driver
allocate memory so the driver can use up to num_streams stream IDs. They must
pass an array of usb_host_endpoints that need to be setup with similar stream
IDs. This is to ensure that a UASP driver will be able to use the same stream
ID for the bulk IN and OUT endpoints used in a Bi-directional command sequence.
The return value is an error condition (if one of the endpoints doesn't support
streams, or the xHCI driver ran out of memory), or the number of streams the
host controller allocated for this endpoint. The xHCI host controller hardware
declares how many stream IDs it can support, and each bulk endpoint on a
SuperSpeed device will say how many stream IDs it can handle. Therefore,
drivers should be able to deal with being allocated less stream IDs than they
requested.
Do NOT call this function if you have URBs enqueued for any of the endpoints
passed in as arguments. Do not call this function to request less than two
streams.
Drivers will only be allowed to call this API once for the same endpoint
without calling usb_free_streams(). This is a simplification for the xHCI host
controller driver, and may change in the future.
Picking new Stream IDs to use
============================
Stream ID 0 is reserved, and should not be used to communicate with devices. If
usb_alloc_streams() returns with a value of N, you may use streams 1 though N.
To queue an URB for a specific stream, set the urb->stream_id value. If the
endpoint does not support streams, an error will be returned.
Note that new API to choose the next stream ID will have to be added if the xHCI
driver supports secondary stream IDs.
Clean up
========
If a driver wishes to stop using streams to communicate with the device, it
should call
void usb_free_streams(struct usb_interface *interface,
struct usb_host_endpoint **eps, unsigned int num_eps,
gfp_t mem_flags);
All stream IDs will be deallocated when the driver releases the interface, to
ensure that drivers that don't support streams will be able to use the endpoint.
...@@ -16,11 +16,11 @@ OR: they can now be DMA-aware. ...@@ -16,11 +16,11 @@ OR: they can now be DMA-aware.
manage dma mappings for existing dma-ready buffers (see below). manage dma mappings for existing dma-ready buffers (see below).
- URBs have an additional "transfer_dma" field, as well as a transfer_flags - URBs have an additional "transfer_dma" field, as well as a transfer_flags
bit saying if it's valid. (Control requests also have "setup_dma" and a bit saying if it's valid. (Control requests also have "setup_dma", but
corresponding transfer_flags bit.) drivers must not use it.)
- "usbcore" will map those DMA addresses, if a DMA-aware driver didn't do - "usbcore" will map this DMA address, if a DMA-aware driver didn't do
it first and set URB_NO_TRANSFER_DMA_MAP or URB_NO_SETUP_DMA_MAP. HCDs it first and set URB_NO_TRANSFER_DMA_MAP. HCDs
don't manage dma mappings for URBs. don't manage dma mappings for URBs.
- There's a new "generic DMA API", parts of which are usable by USB device - There's a new "generic DMA API", parts of which are usable by USB device
...@@ -43,22 +43,16 @@ and effects like cache-trashing can impose subtle penalties. ...@@ -43,22 +43,16 @@ and effects like cache-trashing can impose subtle penalties.
kind of addresses to store in urb->transfer_buffer and urb->transfer_dma. kind of addresses to store in urb->transfer_buffer and urb->transfer_dma.
You'd also set URB_NO_TRANSFER_DMA_MAP in urb->transfer_flags: You'd also set URB_NO_TRANSFER_DMA_MAP in urb->transfer_flags:
void *usb_buffer_alloc (struct usb_device *dev, size_t size, void *usb_alloc_coherent (struct usb_device *dev, size_t size,
int mem_flags, dma_addr_t *dma); int mem_flags, dma_addr_t *dma);
void usb_buffer_free (struct usb_device *dev, size_t size, void usb_free_coherent (struct usb_device *dev, size_t size,
void *addr, dma_addr_t dma); void *addr, dma_addr_t dma);
Most drivers should *NOT* be using these primitives; they don't need Most drivers should *NOT* be using these primitives; they don't need
to use this type of memory ("dma-coherent"), and memory returned from to use this type of memory ("dma-coherent"), and memory returned from
kmalloc() will work just fine. kmalloc() will work just fine.
For control transfers you can use the buffer primitives or not for each
of the transfer buffer and setup buffer independently. Set the flag bits
URB_NO_TRANSFER_DMA_MAP and URB_NO_SETUP_DMA_MAP to indicate which
buffers you have prepared. For non-control transfers URB_NO_SETUP_DMA_MAP
is ignored.
The memory buffer returned is "dma-coherent"; sometimes you might need to The memory buffer returned is "dma-coherent"; sometimes you might need to
force a consistent memory access ordering by using memory barriers. It's force a consistent memory access ordering by using memory barriers. It's
not using a streaming DMA mapping, so it's good for small transfers on not using a streaming DMA mapping, so it's good for small transfers on
...@@ -130,8 +124,8 @@ of Documentation/PCI/PCI-DMA-mapping.txt, titled "What memory is DMA-able?") ...@@ -130,8 +124,8 @@ of Documentation/PCI/PCI-DMA-mapping.txt, titled "What memory is DMA-able?")
void usb_buffer_unmap (struct urb *urb); void usb_buffer_unmap (struct urb *urb);
The calls manage urb->transfer_dma for you, and set URB_NO_TRANSFER_DMA_MAP The calls manage urb->transfer_dma for you, and set URB_NO_TRANSFER_DMA_MAP
so that usbcore won't map or unmap the buffer. The same goes for so that usbcore won't map or unmap the buffer. They cannot be used for
urb->setup_dma and URB_NO_SETUP_DMA_MAP for control requests. setup_packet buffers in control requests.
Note that several of those interfaces are currently commented out, since Note that several of those interfaces are currently commented out, since
they don't have current users. See the source code. Other than the dmasync they don't have current users. See the source code. Other than the dmasync
......
Linux USB HID gadget driver
Introduction
The HID Gadget driver provides emulation of USB Human Interface
Devices (HID). The basic HID handling is done in the kernel,
and HID reports can be sent/received through I/O on the
/dev/hidgX character devices.
For more details about HID, see the developer page on
http://www.usb.org/developers/hidpage/
Configuration
g_hid is a platform driver, so to use it you need to add
struct platform_device(s) to your platform code defining the
HID function descriptors you want to use - E.G. something
like:
#include <linux/platform_device.h>
#include <linux/usb/g_hid.h>
/* hid descriptor for a keyboard */
static struct hidg_func_descriptor my_hid_data = {
.subclass = 0, /* No subclass */
.protocol = 1, /* Keyboard */
.report_length = 8,
.report_desc_length = 63,
.report_desc = {
0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
0x09, 0x06, /* USAGE (Keyboard) */
0xa1, 0x01, /* COLLECTION (Application) */
0x05, 0x07, /* USAGE_PAGE (Keyboard) */
0x19, 0xe0, /* USAGE_MINIMUM (Keyboard LeftControl) */
0x29, 0xe7, /* USAGE_MAXIMUM (Keyboard Right GUI) */
0x15, 0x00, /* LOGICAL_MINIMUM (0) */
0x25, 0x01, /* LOGICAL_MAXIMUM (1) */
0x75, 0x01, /* REPORT_SIZE (1) */
0x95, 0x08, /* REPORT_COUNT (8) */
0x81, 0x02, /* INPUT (Data,Var,Abs) */
0x95, 0x01, /* REPORT_COUNT (1) */
0x75, 0x08, /* REPORT_SIZE (8) */
0x81, 0x03, /* INPUT (Cnst,Var,Abs) */
0x95, 0x05, /* REPORT_COUNT (5) */
0x75, 0x01, /* REPORT_SIZE (1) */
0x05, 0x08, /* USAGE_PAGE (LEDs) */
0x19, 0x01, /* USAGE_MINIMUM (Num Lock) */
0x29, 0x05, /* USAGE_MAXIMUM (Kana) */
0x91, 0x02, /* OUTPUT (Data,Var,Abs) */
0x95, 0x01, /* REPORT_COUNT (1) */
0x75, 0x03, /* REPORT_SIZE (3) */
0x91, 0x03, /* OUTPUT (Cnst,Var,Abs) */
0x95, 0x06, /* REPORT_COUNT (6) */
0x75, 0x08, /* REPORT_SIZE (8) */
0x15, 0x00, /* LOGICAL_MINIMUM (0) */
0x25, 0x65, /* LOGICAL_MAXIMUM (101) */
0x05, 0x07, /* USAGE_PAGE (Keyboard) */
0x19, 0x00, /* USAGE_MINIMUM (Reserved) */
0x29, 0x65, /* USAGE_MAXIMUM (Keyboard Application) */
0x81, 0x00, /* INPUT (Data,Ary,Abs) */
0xc0 /* END_COLLECTION */
}
};
static struct platform_device my_hid = {
.name = "hidg",
.id = 0,
.num_resources = 0,
.resource = 0,
.dev.platform_data = &my_hid_data,
};
You can add as many HID functions as you want, only limited by
the amount of interrupt endpoints your gadget driver supports.
Send and receive HID reports
HID reports can be sent/received using read/write on the
/dev/hidgX character devices. See below for an example program
to do this.
hid_gadget_test is a small interactive program to test the HID
gadget driver. To use, point it at a hidg device and set the
device type (keyboard / mouse / joystick) - E.G.:
# hid_gadget_test /dev/hidg0 keyboard
You are now in the prompt of hid_gadget_test. You can type any
combination of options and values. Available options and
values are listed at program start. In keyboard mode you can
send up to six values.
For example type: g i s t r --left-shift
Hit return and the corresponding report will be sent by the
HID gadget.
Another interesting example is the caps lock test. Type
-–caps-lock and hit return. A report is then sent by the
gadget and you should receive the host answer, corresponding
to the caps lock LED status.
--caps-lock
recv report:2
With this command:
# hid_gadget_test /dev/hidg1 mouse
You can test the mouse emulation. Values are two signed numbers.
Sample code
/* hid_gadget_test */
#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define BUF_LEN 512
struct options {
const char *opt;
unsigned char val;
};
static struct options kmod[] = {
{.opt = "--left-ctrl", .val = 0x01},
{.opt = "--right-ctrl", .val = 0x10},
{.opt = "--left-shift", .val = 0x02},
{.opt = "--right-shift", .val = 0x20},
{.opt = "--left-alt", .val = 0x04},
{.opt = "--right-alt", .val = 0x40},
{.opt = "--left-meta", .val = 0x08},
{.opt = "--right-meta", .val = 0x80},
{.opt = NULL}
};
static struct options kval[] = {
{.opt = "--return", .val = 0x28},
{.opt = "--esc", .val = 0x29},
{.opt = "--bckspc", .val = 0x2a},
{.opt = "--tab", .val = 0x2b},
{.opt = "--spacebar", .val = 0x2c},
{.opt = "--caps-lock", .val = 0x39},
{.opt = "--f1", .val = 0x3a},
{.opt = "--f2", .val = 0x3b},
{.opt = "--f3", .val = 0x3c},
{.opt = "--f4", .val = 0x3d},
{.opt = "--f5", .val = 0x3e},
{.opt = "--f6", .val = 0x3f},
{.opt = "--f7", .val = 0x40},
{.opt = "--f8", .val = 0x41},
{.opt = "--f9", .val = 0x42},
{.opt = "--f10", .val = 0x43},
{.opt = "--f11", .val = 0x44},
{.opt = "--f12", .val = 0x45},
{.opt = "--insert", .val = 0x49},
{.opt = "--home", .val = 0x4a},
{.opt = "--pageup", .val = 0x4b},
{.opt = "--del", .val = 0x4c},
{.opt = "--end", .val = 0x4d},
{.opt = "--pagedown", .val = 0x4e},
{.opt = "--right", .val = 0x4f},
{.opt = "--left", .val = 0x50},
{.opt = "--down", .val = 0x51},
{.opt = "--kp-enter", .val = 0x58},
{.opt = "--up", .val = 0x52},
{.opt = "--num-lock", .val = 0x53},
{.opt = NULL}
};
int keyboard_fill_report(char report[8], char buf[BUF_LEN], int *hold)
{
char *tok = strtok(buf, " ");
int key = 0;
int i = 0;
for (; tok != NULL; tok = strtok(NULL, " ")) {
if (strcmp(tok, "--quit") == 0)
return -1;
if (strcmp(tok, "--hold") == 0) {
*hold = 1;
continue;
}
if (key < 6) {
for (i = 0; kval[i].opt != NULL; i++)
if (strcmp(tok, kval[i].opt) == 0) {
report[2 + key++] = kval[i].val;
break;
}
if (kval[i].opt != NULL)
continue;
}
if (key < 6)
if (islower(tok[0])) {
report[2 + key++] = (tok[0] - ('a' - 0x04));
continue;
}
for (i = 0; kmod[i].opt != NULL; i++)
if (strcmp(tok, kmod[i].opt) == 0) {
report[0] = report[0] | kmod[i].val;
break;
}
if (kmod[i].opt != NULL)
continue;
if (key < 6)
fprintf(stderr, "unknown option: %s\n", tok);
}
return 8;
}
static struct options mmod[] = {
{.opt = "--b1", .val = 0x01},
{.opt = "--b2", .val = 0x02},
{.opt = "--b3", .val = 0x04},
{.opt = NULL}
};
int mouse_fill_report(char report[8], char buf[BUF_LEN], int *hold)
{
char *tok = strtok(buf, " ");
int mvt = 0;
int i = 0;
for (; tok != NULL; tok = strtok(NULL, " ")) {
if (strcmp(tok, "--quit") == 0)
return -1;
if (strcmp(tok, "--hold") == 0) {
*hold = 1;
continue;
}
for (i = 0; mmod[i].opt != NULL; i++)
if (strcmp(tok, mmod[i].opt) == 0) {
report[0] = report[0] | mmod[i].val;
break;
}
if (mmod[i].opt != NULL)
continue;
if (!(tok[0] == '-' && tok[1] == '-') && mvt < 2) {
errno = 0;
report[1 + mvt++] = (char)strtol(tok, NULL, 0);
if (errno != 0) {
fprintf(stderr, "Bad value:'%s'\n", tok);
report[1 + mvt--] = 0;
}
continue;
}
fprintf(stderr, "unknown option: %s\n", tok);
}
return 3;
}
static struct options jmod[] = {
{.opt = "--b1", .val = 0x10},
{.opt = "--b2", .val = 0x20},
{.opt = "--b3", .val = 0x40},
{.opt = "--b4", .val = 0x80},
{.opt = "--hat1", .val = 0x00},
{.opt = "--hat2", .val = 0x01},
{.opt = "--hat3", .val = 0x02},
{.opt = "--hat4", .val = 0x03},
{.opt = "--hatneutral", .val = 0x04},
{.opt = NULL}
};
int joystick_fill_report(char report[8], char buf[BUF_LEN], int *hold)
{
char *tok = strtok(buf, " ");
int mvt = 0;
int i = 0;
*hold = 1;
/* set default hat position: neutral */
report[3] = 0x04;
for (; tok != NULL; tok = strtok(NULL, " ")) {
if (strcmp(tok, "--quit") == 0)
return -1;
for (i = 0; jmod[i].opt != NULL; i++)
if (strcmp(tok, jmod[i].opt) == 0) {
report[3] = (report[3] & 0xF0) | jmod[i].val;
break;
}
if (jmod[i].opt != NULL)
continue;
if (!(tok[0] == '-' && tok[1] == '-') && mvt < 3) {
errno = 0;
report[mvt++] = (char)strtol(tok, NULL, 0);
if (errno != 0) {
fprintf(stderr, "Bad value:'%s'\n", tok);
report[mvt--] = 0;
}
continue;
}
fprintf(stderr, "unknown option: %s\n", tok);
}
return 4;
}
void print_options(char c)
{
int i = 0;
if (c == 'k') {
printf(" keyboard options:\n"
" --hold\n");
for (i = 0; kmod[i].opt != NULL; i++)
printf("\t\t%s\n", kmod[i].opt);
printf("\n keyboard values:\n"
" [a-z] or\n");
for (i = 0; kval[i].opt != NULL; i++)
printf("\t\t%-8s%s", kval[i].opt, i % 2 ? "\n" : "");
printf("\n");
} else if (c == 'm') {
printf(" mouse options:\n"
" --hold\n");
for (i = 0; mmod[i].opt != NULL; i++)
printf("\t\t%s\n", mmod[i].opt);
printf("\n mouse values:\n"
" Two signed numbers\n"
"--quit to close\n");
} else {
printf(" joystick options:\n");
for (i = 0; jmod[i].opt != NULL; i++)
printf("\t\t%s\n", jmod[i].opt);
printf("\n joystick values:\n"
" three signed numbers\n"
"--quit to close\n");
}
}
int main(int argc, const char *argv[])
{
const char *filename = NULL;
int fd = 0;
char buf[BUF_LEN];
int cmd_len;
char report[8];
int to_send = 8;
int hold = 0;
fd_set rfds;
int retval, i;
if (argc < 3) {
fprintf(stderr, "Usage: %s devname mouse|keyboard|joystick\n",
argv[0]);
return 1;
}
if (argv[2][0] != 'k' && argv[2][0] != 'm' && argv[2][0] != 'j')
return 2;
filename = argv[1];
if ((fd = open(filename, O_RDWR, 0666)) == -1) {
perror(filename);
return 3;
}
print_options(argv[2][0]);
while (42) {
FD_ZERO(&rfds);
FD_SET(STDIN_FILENO, &rfds);
FD_SET(fd, &rfds);
retval = select(fd + 1, &rfds, NULL, NULL, NULL);
if (retval == -1 && errno == EINTR)
continue;
if (retval < 0) {
perror("select()");
return 4;
}
if (FD_ISSET(fd, &rfds)) {
cmd_len = read(fd, buf, BUF_LEN - 1);
printf("recv report:");
for (i = 0; i < cmd_len; i++)
printf(" %02x", buf[i]);
printf("\n");
}
if (FD_ISSET(STDIN_FILENO, &rfds)) {
memset(report, 0x0, sizeof(report));
cmd_len = read(STDIN_FILENO, buf, BUF_LEN - 1);
if (cmd_len == 0)
break;
buf[cmd_len - 1] = '\0';
hold = 0;
memset(report, 0x0, sizeof(report));
if (argv[2][0] == 'k')
to_send = keyboard_fill_report(report, buf, &hold);
else if (argv[2][0] == 'm')
to_send = mouse_fill_report(report, buf, &hold);
else
to_send = joystick_fill_report(report, buf, &hold);
if (to_send == -1)
break;
if (write(fd, report, to_send) != to_send) {
perror(filename);
return 5;
}
if (!hold) {
memset(report, 0x0, sizeof(report));
if (write(fd, report, to_send) != to_send) {
perror(filename);
return 6;
}
}
}
}
close(fd);
return 0;
}
...@@ -107,7 +107,9 @@ allowed to issue dynamic suspends. ...@@ -107,7 +107,9 @@ allowed to issue dynamic suspends.
The user interface for controlling dynamic PM is located in the power/ The user interface for controlling dynamic PM is located in the power/
subdirectory of each USB device's sysfs directory, that is, in subdirectory of each USB device's sysfs directory, that is, in
/sys/bus/usb/devices/.../power/ where "..." is the device's ID. The /sys/bus/usb/devices/.../power/ where "..." is the device's ID. The
relevant attribute files are: wakeup, level, and autosuspend. relevant attribute files are: wakeup, control, and autosuspend.
(There may also be a file named "level"; this file was deprecated
as of the 2.6.35 kernel and replaced by the "control" file.)
power/wakeup power/wakeup
...@@ -120,7 +122,7 @@ relevant attribute files are: wakeup, level, and autosuspend. ...@@ -120,7 +122,7 @@ relevant attribute files are: wakeup, level, and autosuspend.
while the device is suspended, the change won't take while the device is suspended, the change won't take
effect until the following suspend.) effect until the following suspend.)
power/level power/control
This file contains one of two words: "on" or "auto". This file contains one of two words: "on" or "auto".
You can write those words to the file to change the You can write those words to the file to change the
...@@ -148,14 +150,15 @@ relevant attribute files are: wakeup, level, and autosuspend. ...@@ -148,14 +150,15 @@ relevant attribute files are: wakeup, level, and autosuspend.
never to autosuspend. You can write a number to the never to autosuspend. You can write a number to the
file to change the autosuspend idle-delay time. file to change the autosuspend idle-delay time.
Writing "-1" to power/autosuspend and writing "on" to power/level do Writing "-1" to power/autosuspend and writing "on" to power/control do
essentially the same thing -- they both prevent the device from being essentially the same thing -- they both prevent the device from being
autosuspended. Yes, this is a redundancy in the API. autosuspended. Yes, this is a redundancy in the API.
(In 2.6.21 writing "0" to power/autosuspend would prevent the device (In 2.6.21 writing "0" to power/autosuspend would prevent the device
from being autosuspended; the behavior was changed in 2.6.22. The from being autosuspended; the behavior was changed in 2.6.22. The
power/autosuspend attribute did not exist prior to 2.6.21, and the power/autosuspend attribute did not exist prior to 2.6.21, and the
power/level attribute did not exist prior to 2.6.22.) power/level attribute did not exist prior to 2.6.22. power/control
was added in 2.6.34.)
Changing the default idle-delay time Changing the default idle-delay time
...@@ -212,7 +215,7 @@ among printers and scanners, but plenty of other types of device have ...@@ -212,7 +215,7 @@ among printers and scanners, but plenty of other types of device have
the same deficiency. the same deficiency.
For this reason, by default the kernel disables autosuspend (the For this reason, by default the kernel disables autosuspend (the
power/level attribute is initialized to "on") for all devices other power/control attribute is initialized to "on") for all devices other
than hubs. Hubs, at least, appear to be reasonably well-behaved in than hubs. Hubs, at least, appear to be reasonably well-behaved in
this regard. this regard.
...@@ -373,7 +376,7 @@ usb_autopm_put_interface() in its close or release routine. But other ...@@ -373,7 +376,7 @@ usb_autopm_put_interface() in its close or release routine. But other
patterns are possible. patterns are possible.
The autosuspend attempts mentioned above will often fail for one The autosuspend attempts mentioned above will often fail for one
reason or another. For example, the power/level attribute might be reason or another. For example, the power/control attribute might be
set to "on", or another interface in the same device might not be set to "on", or another interface in the same device might not be
idle. This is perfectly normal. If the reason for failure was that idle. This is perfectly normal. If the reason for failure was that
the device hasn't been idle for long enough, a timer is scheduled to the device hasn't been idle for long enough, a timer is scheduled to
...@@ -394,12 +397,12 @@ Drivers can enable autosuspend for their devices by calling ...@@ -394,12 +397,12 @@ Drivers can enable autosuspend for their devices by calling
in their probe() routine, if they know that the device is capable of in their probe() routine, if they know that the device is capable of
suspending and resuming correctly. This is exactly equivalent to suspending and resuming correctly. This is exactly equivalent to
writing "auto" to the device's power/level attribute. Likewise, writing "auto" to the device's power/control attribute. Likewise,
drivers can disable autosuspend by calling drivers can disable autosuspend by calling
usb_disable_autosuspend(struct usb_device *udev); usb_disable_autosuspend(struct usb_device *udev);
This is exactly the same as writing "on" to the power/level attribute. This is exactly the same as writing "on" to the power/control attribute.
Sometimes a driver needs to make sure that remote wakeup is enabled Sometimes a driver needs to make sure that remote wakeup is enabled
during autosuspend. For example, there's not much point during autosuspend. For example, there's not much point
......
...@@ -194,6 +194,10 @@ FTDI Single Port Serial Driver ...@@ -194,6 +194,10 @@ FTDI Single Port Serial Driver
This is a single port DB-25 serial adapter. This is a single port DB-25 serial adapter.
Devices supported include:
-TripNav TN-200 USB GPS
-Navis Engineering Bureau CH-4711 USB GPS
For any questions or problems with this driver, please contact Bill Ryder. For any questions or problems with this driver, please contact Bill Ryder.
...@@ -216,7 +220,7 @@ Cypress M8 CY4601 Family Serial Driver ...@@ -216,7 +220,7 @@ Cypress M8 CY4601 Family Serial Driver
Devices supported: Devices supported:
-DeLorme's USB Earthmate (SiRF Star II lp arch) -DeLorme's USB Earthmate GPS (SiRF Star II lp arch)
-Cypress HID->COM RS232 adapter -Cypress HID->COM RS232 adapter
Note: Cypress Semiconductor claims no affiliation with the Note: Cypress Semiconductor claims no affiliation with the
...@@ -392,9 +396,10 @@ REINER SCT cyberJack pinpad/e-com USB chipcard reader ...@@ -392,9 +396,10 @@ REINER SCT cyberJack pinpad/e-com USB chipcard reader
Prolific PL2303 Driver Prolific PL2303 Driver
This driver supports any device that has the PL2303 chip from Prolific This driver supports any device that has the PL2303 chip from Prolific
in it. This includes a number of single port USB to serial in it. This includes a number of single port USB to serial converters,
converters and USB GPS devices. Devices from Aten (the UC-232) and more than 70% of USB GPS devices (in 2010), and some USB UPSes. Devices
IO-Data work with this driver, as does the DCU-11 mobile-phone cable. from Aten (the UC-232) and IO-Data work with this driver, as does
the DCU-11 mobile-phone cable.
For any questions or problems with this driver, please contact Greg For any questions or problems with this driver, please contact Greg
Kroah-Hartman at greg@kroah.com Kroah-Hartman at greg@kroah.com
...@@ -435,6 +440,22 @@ Winchiphead CH341 Driver ...@@ -435,6 +440,22 @@ Winchiphead CH341 Driver
For any questions or problems with this driver, please contact For any questions or problems with this driver, please contact
frank@kingswood-consulting.co.uk. frank@kingswood-consulting.co.uk.
Moschip MCS7720, MCS7715 driver
These chips are present in devices sold by various manufacturers, such as Syba
and Cables Unlimited. There may be others. The 7720 provides two serial
ports, and the 7715 provides one serial and one standard PC parallel port.
Support for the 7715's parallel port is enabled by a separate option, which
will not appear unless parallel port support is first enabled at the top-level
of the Device Drivers config menu. Currently only compatibility mode is
supported on the parallel port (no ECP/EPP).
TODO:
- Implement ECP/EPP modes for the parallel port.
- Baud rates higher than 115200 are currently broken.
- Devices with a single serial port based on the Moschip MCS7703 may work
with this driver with a simple addition to the usb_device_id table. I
don't have one of these devices, so I can't say for sure.
Generic Serial driver Generic Serial driver
......
...@@ -702,6 +702,9 @@ static void __init omap3_evm_init(void) ...@@ -702,6 +702,9 @@ static void __init omap3_evm_init(void)
omap_mux_init_gpio(21, OMAP_PIN_INPUT_PULLUP); omap_mux_init_gpio(21, OMAP_PIN_INPUT_PULLUP);
ehci_pdata.reset_gpio_port[1] = 21; ehci_pdata.reset_gpio_port[1] = 21;
/* EVM REV >= E can supply 500mA with EXTVBUS programming */
musb_board_data.power = 500;
musb_board_data.extvbus = 1;
} else { } else {
/* setup EHCI phy reset on MDC */ /* setup EHCI phy reset on MDC */
omap_mux_init_gpio(135, OMAP_PIN_OUTPUT); omap_mux_init_gpio(135, OMAP_PIN_OUTPUT);
......
...@@ -236,3 +236,158 @@ void __init usb_ehci_init(const struct ehci_hcd_omap_platform_data *pdata) ...@@ -236,3 +236,158 @@ void __init usb_ehci_init(const struct ehci_hcd_omap_platform_data *pdata)
#endif /* CONFIG_USB_EHCI_HCD */ #endif /* CONFIG_USB_EHCI_HCD */
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
static struct resource ohci_resources[] = {
{
.start = OMAP34XX_OHCI_BASE,
.end = OMAP34XX_OHCI_BASE + SZ_1K - 1,
.flags = IORESOURCE_MEM,
},
{
.start = OMAP34XX_UHH_CONFIG_BASE,
.end = OMAP34XX_UHH_CONFIG_BASE + SZ_1K - 1,
.flags = IORESOURCE_MEM,
},
{
.start = OMAP34XX_USBTLL_BASE,
.end = OMAP34XX_USBTLL_BASE + SZ_4K - 1,
.flags = IORESOURCE_MEM,
},
{ /* general IRQ */
.start = INT_34XX_OHCI_IRQ,
.flags = IORESOURCE_IRQ,
}
};
static u64 ohci_dmamask = DMA_BIT_MASK(32);
static struct platform_device ohci_device = {
.name = "ohci-omap3",
.id = 0,
.dev = {
.dma_mask = &ohci_dmamask,
.coherent_dma_mask = 0xffffffff,
},
.num_resources = ARRAY_SIZE(ohci_resources),
.resource = ohci_resources,
};
static void setup_ohci_io_mux(const enum ohci_omap3_port_mode *port_mode)
{
switch (port_mode[0]) {
case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0:
case OMAP_OHCI_PORT_MODE_PHY_6PIN_DPDM:
case OMAP_OHCI_PORT_MODE_TLL_6PIN_DATSE0:
case OMAP_OHCI_PORT_MODE_TLL_6PIN_DPDM:
omap_mux_init_signal("mm1_rxdp",
OMAP_PIN_INPUT_PULLDOWN);
omap_mux_init_signal("mm1_rxdm",
OMAP_PIN_INPUT_PULLDOWN);
/* FALLTHROUGH */
case OMAP_OHCI_PORT_MODE_PHY_4PIN_DPDM:
case OMAP_OHCI_PORT_MODE_TLL_4PIN_DPDM:
omap_mux_init_signal("mm1_rxrcv",
OMAP_PIN_INPUT_PULLDOWN);
/* FALLTHROUGH */
case OMAP_OHCI_PORT_MODE_PHY_3PIN_DATSE0:
case OMAP_OHCI_PORT_MODE_TLL_3PIN_DATSE0:
omap_mux_init_signal("mm1_txen_n", OMAP_PIN_OUTPUT);
/* FALLTHROUGH */
case OMAP_OHCI_PORT_MODE_TLL_2PIN_DATSE0:
case OMAP_OHCI_PORT_MODE_TLL_2PIN_DPDM:
omap_mux_init_signal("mm1_txse0",
OMAP_PIN_INPUT_PULLDOWN);
omap_mux_init_signal("mm1_txdat",
OMAP_PIN_INPUT_PULLDOWN);
break;
case OMAP_OHCI_PORT_MODE_UNUSED:
/* FALLTHROUGH */
default:
break;
}
switch (port_mode[1]) {
case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0:
case OMAP_OHCI_PORT_MODE_PHY_6PIN_DPDM:
case OMAP_OHCI_PORT_MODE_TLL_6PIN_DATSE0:
case OMAP_OHCI_PORT_MODE_TLL_6PIN_DPDM:
omap_mux_init_signal("mm2_rxdp",
OMAP_PIN_INPUT_PULLDOWN);
omap_mux_init_signal("mm2_rxdm",
OMAP_PIN_INPUT_PULLDOWN);
/* FALLTHROUGH */
case OMAP_OHCI_PORT_MODE_PHY_4PIN_DPDM:
case OMAP_OHCI_PORT_MODE_TLL_4PIN_DPDM:
omap_mux_init_signal("mm2_rxrcv",
OMAP_PIN_INPUT_PULLDOWN);
/* FALLTHROUGH */
case OMAP_OHCI_PORT_MODE_PHY_3PIN_DATSE0:
case OMAP_OHCI_PORT_MODE_TLL_3PIN_DATSE0:
omap_mux_init_signal("mm2_txen_n", OMAP_PIN_OUTPUT);
/* FALLTHROUGH */
case OMAP_OHCI_PORT_MODE_TLL_2PIN_DATSE0:
case OMAP_OHCI_PORT_MODE_TLL_2PIN_DPDM:
omap_mux_init_signal("mm2_txse0",
OMAP_PIN_INPUT_PULLDOWN);
omap_mux_init_signal("mm2_txdat",
OMAP_PIN_INPUT_PULLDOWN);
break;
case OMAP_OHCI_PORT_MODE_UNUSED:
/* FALLTHROUGH */
default:
break;
}
switch (port_mode[2]) {
case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0:
case OMAP_OHCI_PORT_MODE_PHY_6PIN_DPDM:
case OMAP_OHCI_PORT_MODE_TLL_6PIN_DATSE0:
case OMAP_OHCI_PORT_MODE_TLL_6PIN_DPDM:
omap_mux_init_signal("mm3_rxdp",
OMAP_PIN_INPUT_PULLDOWN);
omap_mux_init_signal("mm3_rxdm",
OMAP_PIN_INPUT_PULLDOWN);
/* FALLTHROUGH */
case OMAP_OHCI_PORT_MODE_PHY_4PIN_DPDM:
case OMAP_OHCI_PORT_MODE_TLL_4PIN_DPDM:
omap_mux_init_signal("mm3_rxrcv",
OMAP_PIN_INPUT_PULLDOWN);
/* FALLTHROUGH */
case OMAP_OHCI_PORT_MODE_PHY_3PIN_DATSE0:
case OMAP_OHCI_PORT_MODE_TLL_3PIN_DATSE0:
omap_mux_init_signal("mm3_txen_n", OMAP_PIN_OUTPUT);
/* FALLTHROUGH */
case OMAP_OHCI_PORT_MODE_TLL_2PIN_DATSE0:
case OMAP_OHCI_PORT_MODE_TLL_2PIN_DPDM:
omap_mux_init_signal("mm3_txse0",
OMAP_PIN_INPUT_PULLDOWN);
omap_mux_init_signal("mm3_txdat",
OMAP_PIN_INPUT_PULLDOWN);
break;
case OMAP_OHCI_PORT_MODE_UNUSED:
/* FALLTHROUGH */
default:
break;
}
}
void __init usb_ohci_init(const struct ohci_hcd_omap_platform_data *pdata)
{
platform_device_add_data(&ohci_device, pdata, sizeof(*pdata));
/* Setup Pin IO MUX for OHCI */
if (cpu_is_omap34xx())
setup_ohci_io_mux(pdata->port_mode);
if (platform_device_register(&ohci_device) < 0) {
pr_err("Unable to register FS-USB (OHCI) device\n");
return;
}
}
#else
void __init usb_ohci_init(const struct ohci_hcd_omap_platform_data *pdata)
{
}
#endif /* CONFIG_USB_OHCI_HCD */
...@@ -107,6 +107,7 @@ void __init usb_musb_init(struct omap_musb_board_data *board_data) ...@@ -107,6 +107,7 @@ void __init usb_musb_init(struct omap_musb_board_data *board_data)
musb_plat.board_data = board_data; musb_plat.board_data = board_data;
musb_plat.power = board_data->power >> 1; musb_plat.power = board_data->power >> 1;
musb_plat.mode = board_data->mode; musb_plat.mode = board_data->mode;
musb_plat.extvbus = board_data->extvbus;
if (platform_device_register(&musb_device) < 0) if (platform_device_register(&musb_device) < 0)
printk(KERN_ERR "Unable to register HS-USB (MUSB) device\n"); printk(KERN_ERR "Unable to register HS-USB (MUSB) device\n");
......
...@@ -13,6 +13,20 @@ enum ehci_hcd_omap_mode { ...@@ -13,6 +13,20 @@ enum ehci_hcd_omap_mode {
EHCI_HCD_OMAP_MODE_TLL, EHCI_HCD_OMAP_MODE_TLL,
}; };
enum ohci_omap3_port_mode {
OMAP_OHCI_PORT_MODE_UNUSED,
OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0,
OMAP_OHCI_PORT_MODE_PHY_6PIN_DPDM,
OMAP_OHCI_PORT_MODE_PHY_3PIN_DATSE0,
OMAP_OHCI_PORT_MODE_PHY_4PIN_DPDM,
OMAP_OHCI_PORT_MODE_TLL_6PIN_DATSE0,
OMAP_OHCI_PORT_MODE_TLL_6PIN_DPDM,
OMAP_OHCI_PORT_MODE_TLL_3PIN_DATSE0,
OMAP_OHCI_PORT_MODE_TLL_4PIN_DPDM,
OMAP_OHCI_PORT_MODE_TLL_2PIN_DATSE0,
OMAP_OHCI_PORT_MODE_TLL_2PIN_DPDM,
};
struct ehci_hcd_omap_platform_data { struct ehci_hcd_omap_platform_data {
enum ehci_hcd_omap_mode port_mode[OMAP3_HS_USB_PORTS]; enum ehci_hcd_omap_mode port_mode[OMAP3_HS_USB_PORTS];
unsigned phy_reset:1; unsigned phy_reset:1;
...@@ -21,6 +35,13 @@ struct ehci_hcd_omap_platform_data { ...@@ -21,6 +35,13 @@ struct ehci_hcd_omap_platform_data {
int reset_gpio_port[OMAP3_HS_USB_PORTS]; int reset_gpio_port[OMAP3_HS_USB_PORTS];
}; };
struct ohci_hcd_omap_platform_data {
enum ohci_omap3_port_mode port_mode[OMAP3_HS_USB_PORTS];
/* Set this to true for ES2.x silicon */
unsigned es2_compatibility:1;
};
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
#define OMAP1_OTG_BASE 0xfffb0400 #define OMAP1_OTG_BASE 0xfffb0400
...@@ -47,6 +68,7 @@ struct omap_musb_board_data { ...@@ -47,6 +68,7 @@ struct omap_musb_board_data {
u8 interface_type; u8 interface_type;
u8 mode; u8 mode;
u16 power; u16 power;
unsigned extvbus:1;
}; };
enum musb_interface {MUSB_INTERFACE_ULPI, MUSB_INTERFACE_UTMI}; enum musb_interface {MUSB_INTERFACE_ULPI, MUSB_INTERFACE_UTMI};
...@@ -55,6 +77,8 @@ extern void usb_musb_init(struct omap_musb_board_data *board_data); ...@@ -55,6 +77,8 @@ extern void usb_musb_init(struct omap_musb_board_data *board_data);
extern void usb_ehci_init(const struct ehci_hcd_omap_platform_data *pdata); extern void usb_ehci_init(const struct ehci_hcd_omap_platform_data *pdata);
extern void usb_ohci_init(const struct ohci_hcd_omap_platform_data *pdata);
#endif #endif
void omap_usb_init(struct omap_usb_config *pdata); void omap_usb_init(struct omap_usb_config *pdata);
......
...@@ -783,13 +783,12 @@ static int hid_alloc_buffers(struct usb_device *dev, struct hid_device *hid) ...@@ -783,13 +783,12 @@ static int hid_alloc_buffers(struct usb_device *dev, struct hid_device *hid)
{ {
struct usbhid_device *usbhid = hid->driver_data; struct usbhid_device *usbhid = hid->driver_data;
usbhid->inbuf = usb_buffer_alloc(dev, usbhid->bufsize, GFP_KERNEL, usbhid->inbuf = usb_alloc_coherent(dev, usbhid->bufsize, GFP_KERNEL,
&usbhid->inbuf_dma); &usbhid->inbuf_dma);
usbhid->outbuf = usb_buffer_alloc(dev, usbhid->bufsize, GFP_KERNEL, usbhid->outbuf = usb_alloc_coherent(dev, usbhid->bufsize, GFP_KERNEL,
&usbhid->outbuf_dma); &usbhid->outbuf_dma);
usbhid->cr = usb_buffer_alloc(dev, sizeof(*usbhid->cr), GFP_KERNEL, usbhid->cr = kmalloc(sizeof(*usbhid->cr), GFP_KERNEL);
&usbhid->cr_dma); usbhid->ctrlbuf = usb_alloc_coherent(dev, usbhid->bufsize, GFP_KERNEL,
usbhid->ctrlbuf = usb_buffer_alloc(dev, usbhid->bufsize, GFP_KERNEL,
&usbhid->ctrlbuf_dma); &usbhid->ctrlbuf_dma);
if (!usbhid->inbuf || !usbhid->outbuf || !usbhid->cr || if (!usbhid->inbuf || !usbhid->outbuf || !usbhid->cr ||
!usbhid->ctrlbuf) !usbhid->ctrlbuf)
...@@ -844,10 +843,10 @@ static void hid_free_buffers(struct usb_device *dev, struct hid_device *hid) ...@@ -844,10 +843,10 @@ static void hid_free_buffers(struct usb_device *dev, struct hid_device *hid)
{ {
struct usbhid_device *usbhid = hid->driver_data; struct usbhid_device *usbhid = hid->driver_data;
usb_buffer_free(dev, usbhid->bufsize, usbhid->inbuf, usbhid->inbuf_dma); usb_free_coherent(dev, usbhid->bufsize, usbhid->inbuf, usbhid->inbuf_dma);
usb_buffer_free(dev, usbhid->bufsize, usbhid->outbuf, usbhid->outbuf_dma); usb_free_coherent(dev, usbhid->bufsize, usbhid->outbuf, usbhid->outbuf_dma);
usb_buffer_free(dev, sizeof(*(usbhid->cr)), usbhid->cr, usbhid->cr_dma); kfree(usbhid->cr);
usb_buffer_free(dev, usbhid->bufsize, usbhid->ctrlbuf, usbhid->ctrlbuf_dma); usb_free_coherent(dev, usbhid->bufsize, usbhid->ctrlbuf, usbhid->ctrlbuf_dma);
} }
static int usbhid_parse(struct hid_device *hid) static int usbhid_parse(struct hid_device *hid)
...@@ -1007,9 +1006,8 @@ static int usbhid_start(struct hid_device *hid) ...@@ -1007,9 +1006,8 @@ static int usbhid_start(struct hid_device *hid)
usb_fill_control_urb(usbhid->urbctrl, dev, 0, (void *) usbhid->cr, usb_fill_control_urb(usbhid->urbctrl, dev, 0, (void *) usbhid->cr,
usbhid->ctrlbuf, 1, hid_ctrl, hid); usbhid->ctrlbuf, 1, hid_ctrl, hid);
usbhid->urbctrl->setup_dma = usbhid->cr_dma;
usbhid->urbctrl->transfer_dma = usbhid->ctrlbuf_dma; usbhid->urbctrl->transfer_dma = usbhid->ctrlbuf_dma;
usbhid->urbctrl->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP); usbhid->urbctrl->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
if (!(hid->quirks & HID_QUIRK_NO_INIT_REPORTS)) if (!(hid->quirks & HID_QUIRK_NO_INIT_REPORTS))
usbhid_init_reports(hid); usbhid_init_reports(hid);
......
...@@ -75,7 +75,6 @@ struct usbhid_device { ...@@ -75,7 +75,6 @@ struct usbhid_device {
struct urb *urbctrl; /* Control URB */ struct urb *urbctrl; /* Control URB */
struct usb_ctrlrequest *cr; /* Control request struct */ struct usb_ctrlrequest *cr; /* Control request struct */
dma_addr_t cr_dma; /* Control request struct dma */
struct hid_control_fifo ctrl[HID_CONTROL_FIFO_SIZE]; /* Control fifo */ struct hid_control_fifo ctrl[HID_CONTROL_FIFO_SIZE]; /* Control fifo */
unsigned char ctrlhead, ctrltail; /* Control fifo head & tail */ unsigned char ctrlhead, ctrltail; /* Control fifo head & tail */
char *ctrlbuf; /* Control buffer */ char *ctrlbuf; /* Control buffer */
......
...@@ -74,7 +74,6 @@ struct usb_kbd { ...@@ -74,7 +74,6 @@ struct usb_kbd {
unsigned char *new; unsigned char *new;
struct usb_ctrlrequest *cr; struct usb_ctrlrequest *cr;
unsigned char *leds; unsigned char *leds;
dma_addr_t cr_dma;
dma_addr_t new_dma; dma_addr_t new_dma;
dma_addr_t leds_dma; dma_addr_t leds_dma;
}; };
...@@ -197,11 +196,11 @@ static int usb_kbd_alloc_mem(struct usb_device *dev, struct usb_kbd *kbd) ...@@ -197,11 +196,11 @@ static int usb_kbd_alloc_mem(struct usb_device *dev, struct usb_kbd *kbd)
return -1; return -1;
if (!(kbd->led = usb_alloc_urb(0, GFP_KERNEL))) if (!(kbd->led = usb_alloc_urb(0, GFP_KERNEL)))
return -1; return -1;
if (!(kbd->new = usb_buffer_alloc(dev, 8, GFP_ATOMIC, &kbd->new_dma))) if (!(kbd->new = usb_alloc_coherent(dev, 8, GFP_ATOMIC, &kbd->new_dma)))
return -1; return -1;
if (!(kbd->cr = usb_buffer_alloc(dev, sizeof(struct usb_ctrlrequest), GFP_ATOMIC, &kbd->cr_dma))) if (!(kbd->cr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL)))
return -1; return -1;
if (!(kbd->leds = usb_buffer_alloc(dev, 1, GFP_ATOMIC, &kbd->leds_dma))) if (!(kbd->leds = usb_alloc_coherent(dev, 1, GFP_ATOMIC, &kbd->leds_dma)))
return -1; return -1;
return 0; return 0;
...@@ -211,9 +210,9 @@ static void usb_kbd_free_mem(struct usb_device *dev, struct usb_kbd *kbd) ...@@ -211,9 +210,9 @@ static void usb_kbd_free_mem(struct usb_device *dev, struct usb_kbd *kbd)
{ {
usb_free_urb(kbd->irq); usb_free_urb(kbd->irq);
usb_free_urb(kbd->led); usb_free_urb(kbd->led);
usb_buffer_free(dev, 8, kbd->new, kbd->new_dma); usb_free_coherent(dev, 8, kbd->new, kbd->new_dma);
usb_buffer_free(dev, sizeof(struct usb_ctrlrequest), kbd->cr, kbd->cr_dma); kfree(kbd->cr);
usb_buffer_free(dev, 1, kbd->leds, kbd->leds_dma); usb_free_coherent(dev, 1, kbd->leds, kbd->leds_dma);
} }
static int usb_kbd_probe(struct usb_interface *iface, static int usb_kbd_probe(struct usb_interface *iface,
...@@ -304,9 +303,8 @@ static int usb_kbd_probe(struct usb_interface *iface, ...@@ -304,9 +303,8 @@ static int usb_kbd_probe(struct usb_interface *iface,
usb_fill_control_urb(kbd->led, dev, usb_sndctrlpipe(dev, 0), usb_fill_control_urb(kbd->led, dev, usb_sndctrlpipe(dev, 0),
(void *) kbd->cr, kbd->leds, 1, (void *) kbd->cr, kbd->leds, 1,
usb_kbd_led, kbd); usb_kbd_led, kbd);
kbd->led->setup_dma = kbd->cr_dma;
kbd->led->transfer_dma = kbd->leds_dma; kbd->led->transfer_dma = kbd->leds_dma;
kbd->led->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP); kbd->led->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
error = input_register_device(kbd->dev); error = input_register_device(kbd->dev);
if (error) if (error)
......
...@@ -142,7 +142,7 @@ static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_i ...@@ -142,7 +142,7 @@ static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_i
if (!mouse || !input_dev) if (!mouse || !input_dev)
goto fail1; goto fail1;
mouse->data = usb_buffer_alloc(dev, 8, GFP_ATOMIC, &mouse->data_dma); mouse->data = usb_alloc_coherent(dev, 8, GFP_ATOMIC, &mouse->data_dma);
if (!mouse->data) if (!mouse->data)
goto fail1; goto fail1;
...@@ -205,7 +205,7 @@ static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_i ...@@ -205,7 +205,7 @@ static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_i
fail3: fail3:
usb_free_urb(mouse->irq); usb_free_urb(mouse->irq);
fail2: fail2:
usb_buffer_free(dev, 8, mouse->data, mouse->data_dma); usb_free_coherent(dev, 8, mouse->data, mouse->data_dma);
fail1: fail1:
input_free_device(input_dev); input_free_device(input_dev);
kfree(mouse); kfree(mouse);
...@@ -221,7 +221,7 @@ static void usb_mouse_disconnect(struct usb_interface *intf) ...@@ -221,7 +221,7 @@ static void usb_mouse_disconnect(struct usb_interface *intf)
usb_kill_urb(mouse->irq); usb_kill_urb(mouse->irq);
input_unregister_device(mouse->dev); input_unregister_device(mouse->dev);
usb_free_urb(mouse->irq); usb_free_urb(mouse->irq);
usb_buffer_free(interface_to_usbdev(intf), 8, mouse->data, mouse->data_dma); usb_free_coherent(interface_to_usbdev(intf), 8, mouse->data, mouse->data_dma);
kfree(mouse); kfree(mouse);
} }
} }
......
...@@ -533,8 +533,8 @@ static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) ...@@ -533,8 +533,8 @@ static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad)
if (xpad->xtype != XTYPE_XBOX360 && xpad->xtype != XTYPE_XBOX) if (xpad->xtype != XTYPE_XBOX360 && xpad->xtype != XTYPE_XBOX)
return 0; return 0;
xpad->odata = usb_buffer_alloc(xpad->udev, XPAD_PKT_LEN, xpad->odata = usb_alloc_coherent(xpad->udev, XPAD_PKT_LEN,
GFP_KERNEL, &xpad->odata_dma); GFP_KERNEL, &xpad->odata_dma);
if (!xpad->odata) if (!xpad->odata)
goto fail1; goto fail1;
...@@ -554,7 +554,7 @@ static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) ...@@ -554,7 +554,7 @@ static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad)
return 0; return 0;
fail2: usb_buffer_free(xpad->udev, XPAD_PKT_LEN, xpad->odata, xpad->odata_dma); fail2: usb_free_coherent(xpad->udev, XPAD_PKT_LEN, xpad->odata, xpad->odata_dma);
fail1: return error; fail1: return error;
} }
...@@ -568,7 +568,7 @@ static void xpad_deinit_output(struct usb_xpad *xpad) ...@@ -568,7 +568,7 @@ static void xpad_deinit_output(struct usb_xpad *xpad)
{ {
if (xpad->xtype == XTYPE_XBOX360 || xpad->xtype == XTYPE_XBOX) { if (xpad->xtype == XTYPE_XBOX360 || xpad->xtype == XTYPE_XBOX) {
usb_free_urb(xpad->irq_out); usb_free_urb(xpad->irq_out);
usb_buffer_free(xpad->udev, XPAD_PKT_LEN, usb_free_coherent(xpad->udev, XPAD_PKT_LEN,
xpad->odata, xpad->odata_dma); xpad->odata, xpad->odata_dma);
} }
} }
...@@ -788,8 +788,8 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id ...@@ -788,8 +788,8 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
if (!xpad || !input_dev) if (!xpad || !input_dev)
goto fail1; goto fail1;
xpad->idata = usb_buffer_alloc(udev, XPAD_PKT_LEN, xpad->idata = usb_alloc_coherent(udev, XPAD_PKT_LEN,
GFP_KERNEL, &xpad->idata_dma); GFP_KERNEL, &xpad->idata_dma);
if (!xpad->idata) if (!xpad->idata)
goto fail1; goto fail1;
...@@ -942,7 +942,7 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id ...@@ -942,7 +942,7 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
fail5: usb_kill_urb(xpad->irq_in); fail5: usb_kill_urb(xpad->irq_in);
fail4: usb_free_urb(xpad->irq_in); fail4: usb_free_urb(xpad->irq_in);
fail3: xpad_deinit_output(xpad); fail3: xpad_deinit_output(xpad);
fail2: usb_buffer_free(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma); fail2: usb_free_coherent(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma);
fail1: input_free_device(input_dev); fail1: input_free_device(input_dev);
kfree(xpad); kfree(xpad);
return error; return error;
...@@ -964,7 +964,7 @@ static void xpad_disconnect(struct usb_interface *intf) ...@@ -964,7 +964,7 @@ static void xpad_disconnect(struct usb_interface *intf)
usb_kill_urb(xpad->irq_in); usb_kill_urb(xpad->irq_in);
} }
usb_free_urb(xpad->irq_in); usb_free_urb(xpad->irq_in);
usb_buffer_free(xpad->udev, XPAD_PKT_LEN, usb_free_coherent(xpad->udev, XPAD_PKT_LEN,
xpad->idata, xpad->idata_dma); xpad->idata, xpad->idata_dma);
kfree(xpad); kfree(xpad);
} }
......
...@@ -624,13 +624,13 @@ static void ati_remote_irq_in(struct urb *urb) ...@@ -624,13 +624,13 @@ static void ati_remote_irq_in(struct urb *urb)
static int ati_remote_alloc_buffers(struct usb_device *udev, static int ati_remote_alloc_buffers(struct usb_device *udev,
struct ati_remote *ati_remote) struct ati_remote *ati_remote)
{ {
ati_remote->inbuf = usb_buffer_alloc(udev, DATA_BUFSIZE, GFP_ATOMIC, ati_remote->inbuf = usb_alloc_coherent(udev, DATA_BUFSIZE, GFP_ATOMIC,
&ati_remote->inbuf_dma); &ati_remote->inbuf_dma);
if (!ati_remote->inbuf) if (!ati_remote->inbuf)
return -1; return -1;
ati_remote->outbuf = usb_buffer_alloc(udev, DATA_BUFSIZE, GFP_ATOMIC, ati_remote->outbuf = usb_alloc_coherent(udev, DATA_BUFSIZE, GFP_ATOMIC,
&ati_remote->outbuf_dma); &ati_remote->outbuf_dma);
if (!ati_remote->outbuf) if (!ati_remote->outbuf)
return -1; return -1;
...@@ -653,10 +653,10 @@ static void ati_remote_free_buffers(struct ati_remote *ati_remote) ...@@ -653,10 +653,10 @@ static void ati_remote_free_buffers(struct ati_remote *ati_remote)
usb_free_urb(ati_remote->irq_urb); usb_free_urb(ati_remote->irq_urb);
usb_free_urb(ati_remote->out_urb); usb_free_urb(ati_remote->out_urb);
usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, usb_free_coherent(ati_remote->udev, DATA_BUFSIZE,
ati_remote->inbuf, ati_remote->inbuf_dma); ati_remote->inbuf, ati_remote->inbuf_dma);
usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, usb_free_coherent(ati_remote->udev, DATA_BUFSIZE,
ati_remote->outbuf, ati_remote->outbuf_dma); ati_remote->outbuf, ati_remote->outbuf_dma);
} }
......
...@@ -589,7 +589,7 @@ static int ati_remote2_urb_init(struct ati_remote2 *ar2) ...@@ -589,7 +589,7 @@ static int ati_remote2_urb_init(struct ati_remote2 *ar2)
int i, pipe, maxp; int i, pipe, maxp;
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
ar2->buf[i] = usb_buffer_alloc(udev, 4, GFP_KERNEL, &ar2->buf_dma[i]); ar2->buf[i] = usb_alloc_coherent(udev, 4, GFP_KERNEL, &ar2->buf_dma[i]);
if (!ar2->buf[i]) if (!ar2->buf[i])
return -ENOMEM; return -ENOMEM;
...@@ -617,7 +617,7 @@ static void ati_remote2_urb_cleanup(struct ati_remote2 *ar2) ...@@ -617,7 +617,7 @@ static void ati_remote2_urb_cleanup(struct ati_remote2 *ar2)
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
usb_free_urb(ar2->urb[i]); usb_free_urb(ar2->urb[i]);
usb_buffer_free(ar2->udev, 4, ar2->buf[i], ar2->buf_dma[i]); usb_free_coherent(ar2->udev, 4, ar2->buf[i], ar2->buf_dma[i]);
} }
} }
......
...@@ -102,7 +102,6 @@ struct cm109_dev { ...@@ -102,7 +102,6 @@ struct cm109_dev {
struct cm109_ctl_packet *ctl_data; struct cm109_ctl_packet *ctl_data;
dma_addr_t ctl_dma; dma_addr_t ctl_dma;
struct usb_ctrlrequest *ctl_req; struct usb_ctrlrequest *ctl_req;
dma_addr_t ctl_req_dma;
struct urb *urb_ctl; struct urb *urb_ctl;
/* /*
* The 3 bitfields below are protected by ctl_submit_lock. * The 3 bitfields below are protected by ctl_submit_lock.
...@@ -629,15 +628,13 @@ static const struct usb_device_id cm109_usb_table[] = { ...@@ -629,15 +628,13 @@ static const struct usb_device_id cm109_usb_table[] = {
static void cm109_usb_cleanup(struct cm109_dev *dev) static void cm109_usb_cleanup(struct cm109_dev *dev)
{ {
if (dev->ctl_req) kfree(dev->ctl_req);
usb_buffer_free(dev->udev, sizeof(*(dev->ctl_req)),
dev->ctl_req, dev->ctl_req_dma);
if (dev->ctl_data) if (dev->ctl_data)
usb_buffer_free(dev->udev, USB_PKT_LEN, usb_free_coherent(dev->udev, USB_PKT_LEN,
dev->ctl_data, dev->ctl_dma); dev->ctl_data, dev->ctl_dma);
if (dev->irq_data) if (dev->irq_data)
usb_buffer_free(dev->udev, USB_PKT_LEN, usb_free_coherent(dev->udev, USB_PKT_LEN,
dev->irq_data, dev->irq_dma); dev->irq_data, dev->irq_dma);
usb_free_urb(dev->urb_irq); /* parameter validation in core/urb */ usb_free_urb(dev->urb_irq); /* parameter validation in core/urb */
usb_free_urb(dev->urb_ctl); /* parameter validation in core/urb */ usb_free_urb(dev->urb_ctl); /* parameter validation in core/urb */
...@@ -686,18 +683,17 @@ static int cm109_usb_probe(struct usb_interface *intf, ...@@ -686,18 +683,17 @@ static int cm109_usb_probe(struct usb_interface *intf,
goto err_out; goto err_out;
/* allocate usb buffers */ /* allocate usb buffers */
dev->irq_data = usb_buffer_alloc(udev, USB_PKT_LEN, dev->irq_data = usb_alloc_coherent(udev, USB_PKT_LEN,
GFP_KERNEL, &dev->irq_dma); GFP_KERNEL, &dev->irq_dma);
if (!dev->irq_data) if (!dev->irq_data)
goto err_out; goto err_out;
dev->ctl_data = usb_buffer_alloc(udev, USB_PKT_LEN, dev->ctl_data = usb_alloc_coherent(udev, USB_PKT_LEN,
GFP_KERNEL, &dev->ctl_dma); GFP_KERNEL, &dev->ctl_dma);
if (!dev->ctl_data) if (!dev->ctl_data)
goto err_out; goto err_out;
dev->ctl_req = usb_buffer_alloc(udev, sizeof(*(dev->ctl_req)), dev->ctl_req = kmalloc(sizeof(*(dev->ctl_req)), GFP_KERNEL);
GFP_KERNEL, &dev->ctl_req_dma);
if (!dev->ctl_req) if (!dev->ctl_req)
goto err_out; goto err_out;
...@@ -735,10 +731,8 @@ static int cm109_usb_probe(struct usb_interface *intf, ...@@ -735,10 +731,8 @@ static int cm109_usb_probe(struct usb_interface *intf,
usb_fill_control_urb(dev->urb_ctl, udev, usb_sndctrlpipe(udev, 0), usb_fill_control_urb(dev->urb_ctl, udev, usb_sndctrlpipe(udev, 0),
(void *)dev->ctl_req, dev->ctl_data, USB_PKT_LEN, (void *)dev->ctl_req, dev->ctl_data, USB_PKT_LEN,
cm109_urb_ctl_callback, dev); cm109_urb_ctl_callback, dev);
dev->urb_ctl->setup_dma = dev->ctl_req_dma;
dev->urb_ctl->transfer_dma = dev->ctl_dma; dev->urb_ctl->transfer_dma = dev->ctl_dma;
dev->urb_ctl->transfer_flags |= URB_NO_SETUP_DMA_MAP | dev->urb_ctl->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
URB_NO_TRANSFER_DMA_MAP;
dev->urb_ctl->dev = udev; dev->urb_ctl->dev = udev;
/* find out the physical bus location */ /* find out the physical bus location */
......
...@@ -464,7 +464,7 @@ static int keyspan_probe(struct usb_interface *interface, const struct usb_devic ...@@ -464,7 +464,7 @@ static int keyspan_probe(struct usb_interface *interface, const struct usb_devic
remote->in_endpoint = endpoint; remote->in_endpoint = endpoint;
remote->toggle = -1; /* Set to -1 so we will always not match the toggle from the first remote message. */ remote->toggle = -1; /* Set to -1 so we will always not match the toggle from the first remote message. */
remote->in_buffer = usb_buffer_alloc(udev, RECV_SIZE, GFP_ATOMIC, &remote->in_dma); remote->in_buffer = usb_alloc_coherent(udev, RECV_SIZE, GFP_ATOMIC, &remote->in_dma);
if (!remote->in_buffer) { if (!remote->in_buffer) {
error = -ENOMEM; error = -ENOMEM;
goto fail1; goto fail1;
...@@ -543,7 +543,7 @@ static int keyspan_probe(struct usb_interface *interface, const struct usb_devic ...@@ -543,7 +543,7 @@ static int keyspan_probe(struct usb_interface *interface, const struct usb_devic
return 0; return 0;
fail3: usb_free_urb(remote->irq_urb); fail3: usb_free_urb(remote->irq_urb);
fail2: usb_buffer_free(udev, RECV_SIZE, remote->in_buffer, remote->in_dma); fail2: usb_free_coherent(udev, RECV_SIZE, remote->in_buffer, remote->in_dma);
fail1: kfree(remote); fail1: kfree(remote);
input_free_device(input_dev); input_free_device(input_dev);
...@@ -564,7 +564,7 @@ static void keyspan_disconnect(struct usb_interface *interface) ...@@ -564,7 +564,7 @@ static void keyspan_disconnect(struct usb_interface *interface)
input_unregister_device(remote->input); input_unregister_device(remote->input);
usb_kill_urb(remote->irq_urb); usb_kill_urb(remote->irq_urb);
usb_free_urb(remote->irq_urb); usb_free_urb(remote->irq_urb);
usb_buffer_free(remote->udev, RECV_SIZE, remote->in_buffer, remote->in_dma); usb_free_coherent(remote->udev, RECV_SIZE, remote->in_buffer, remote->in_dma);
kfree(remote); kfree(remote);
} }
} }
......
...@@ -64,7 +64,6 @@ struct powermate_device { ...@@ -64,7 +64,6 @@ struct powermate_device {
dma_addr_t data_dma; dma_addr_t data_dma;
struct urb *irq, *config; struct urb *irq, *config;
struct usb_ctrlrequest *configcr; struct usb_ctrlrequest *configcr;
dma_addr_t configcr_dma;
struct usb_device *udev; struct usb_device *udev;
struct input_dev *input; struct input_dev *input;
spinlock_t lock; spinlock_t lock;
...@@ -182,8 +181,6 @@ static void powermate_sync_state(struct powermate_device *pm) ...@@ -182,8 +181,6 @@ static void powermate_sync_state(struct powermate_device *pm)
usb_fill_control_urb(pm->config, pm->udev, usb_sndctrlpipe(pm->udev, 0), usb_fill_control_urb(pm->config, pm->udev, usb_sndctrlpipe(pm->udev, 0),
(void *) pm->configcr, NULL, 0, (void *) pm->configcr, NULL, 0,
powermate_config_complete, pm); powermate_config_complete, pm);
pm->config->setup_dma = pm->configcr_dma;
pm->config->transfer_flags |= URB_NO_SETUP_DMA_MAP;
if (usb_submit_urb(pm->config, GFP_ATOMIC)) if (usb_submit_urb(pm->config, GFP_ATOMIC))
printk(KERN_ERR "powermate: usb_submit_urb(config) failed"); printk(KERN_ERR "powermate: usb_submit_urb(config) failed");
...@@ -276,13 +273,12 @@ static int powermate_input_event(struct input_dev *dev, unsigned int type, unsig ...@@ -276,13 +273,12 @@ static int powermate_input_event(struct input_dev *dev, unsigned int type, unsig
static int powermate_alloc_buffers(struct usb_device *udev, struct powermate_device *pm) static int powermate_alloc_buffers(struct usb_device *udev, struct powermate_device *pm)
{ {
pm->data = usb_buffer_alloc(udev, POWERMATE_PAYLOAD_SIZE_MAX, pm->data = usb_alloc_coherent(udev, POWERMATE_PAYLOAD_SIZE_MAX,
GFP_ATOMIC, &pm->data_dma); GFP_ATOMIC, &pm->data_dma);
if (!pm->data) if (!pm->data)
return -1; return -1;
pm->configcr = usb_buffer_alloc(udev, sizeof(*(pm->configcr)), pm->configcr = kmalloc(sizeof(*(pm->configcr)), GFP_KERNEL);
GFP_ATOMIC, &pm->configcr_dma);
if (!pm->configcr) if (!pm->configcr)
return -1; return -1;
...@@ -291,10 +287,9 @@ static int powermate_alloc_buffers(struct usb_device *udev, struct powermate_dev ...@@ -291,10 +287,9 @@ static int powermate_alloc_buffers(struct usb_device *udev, struct powermate_dev
static void powermate_free_buffers(struct usb_device *udev, struct powermate_device *pm) static void powermate_free_buffers(struct usb_device *udev, struct powermate_device *pm)
{ {
usb_buffer_free(udev, POWERMATE_PAYLOAD_SIZE_MAX, usb_free_coherent(udev, POWERMATE_PAYLOAD_SIZE_MAX,
pm->data, pm->data_dma); pm->data, pm->data_dma);
usb_buffer_free(udev, sizeof(*(pm->configcr)), kfree(pm->configcr);
pm->configcr, pm->configcr_dma);
} }
/* Called whenever a USB device matching one in our supported devices table is connected */ /* Called whenever a USB device matching one in our supported devices table is connected */
......
...@@ -111,7 +111,6 @@ struct yealink_dev { ...@@ -111,7 +111,6 @@ struct yealink_dev {
struct yld_ctl_packet *ctl_data; struct yld_ctl_packet *ctl_data;
dma_addr_t ctl_dma; dma_addr_t ctl_dma;
struct usb_ctrlrequest *ctl_req; struct usb_ctrlrequest *ctl_req;
dma_addr_t ctl_req_dma;
struct urb *urb_ctl; struct urb *urb_ctl;
char phys[64]; /* physical device path */ char phys[64]; /* physical device path */
...@@ -836,12 +835,9 @@ static int usb_cleanup(struct yealink_dev *yld, int err) ...@@ -836,12 +835,9 @@ static int usb_cleanup(struct yealink_dev *yld, int err)
usb_free_urb(yld->urb_irq); usb_free_urb(yld->urb_irq);
usb_free_urb(yld->urb_ctl); usb_free_urb(yld->urb_ctl);
usb_buffer_free(yld->udev, sizeof(*(yld->ctl_req)), kfree(yld->ctl_req);
yld->ctl_req, yld->ctl_req_dma); usb_free_coherent(yld->udev, USB_PKT_LEN, yld->ctl_data, yld->ctl_dma);
usb_buffer_free(yld->udev, USB_PKT_LEN, usb_free_coherent(yld->udev, USB_PKT_LEN, yld->irq_data, yld->irq_dma);
yld->ctl_data, yld->ctl_dma);
usb_buffer_free(yld->udev, USB_PKT_LEN,
yld->irq_data, yld->irq_dma);
kfree(yld); kfree(yld);
return err; return err;
...@@ -886,18 +882,17 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id) ...@@ -886,18 +882,17 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
return usb_cleanup(yld, -ENOMEM); return usb_cleanup(yld, -ENOMEM);
/* allocate usb buffers */ /* allocate usb buffers */
yld->irq_data = usb_buffer_alloc(udev, USB_PKT_LEN, yld->irq_data = usb_alloc_coherent(udev, USB_PKT_LEN,
GFP_ATOMIC, &yld->irq_dma); GFP_ATOMIC, &yld->irq_dma);
if (yld->irq_data == NULL) if (yld->irq_data == NULL)
return usb_cleanup(yld, -ENOMEM); return usb_cleanup(yld, -ENOMEM);
yld->ctl_data = usb_buffer_alloc(udev, USB_PKT_LEN, yld->ctl_data = usb_alloc_coherent(udev, USB_PKT_LEN,
GFP_ATOMIC, &yld->ctl_dma); GFP_ATOMIC, &yld->ctl_dma);
if (!yld->ctl_data) if (!yld->ctl_data)
return usb_cleanup(yld, -ENOMEM); return usb_cleanup(yld, -ENOMEM);
yld->ctl_req = usb_buffer_alloc(udev, sizeof(*(yld->ctl_req)), yld->ctl_req = kmalloc(sizeof(*(yld->ctl_req)), GFP_KERNEL);
GFP_ATOMIC, &yld->ctl_req_dma);
if (yld->ctl_req == NULL) if (yld->ctl_req == NULL)
return usb_cleanup(yld, -ENOMEM); return usb_cleanup(yld, -ENOMEM);
...@@ -936,10 +931,8 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id) ...@@ -936,10 +931,8 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
usb_fill_control_urb(yld->urb_ctl, udev, usb_sndctrlpipe(udev, 0), usb_fill_control_urb(yld->urb_ctl, udev, usb_sndctrlpipe(udev, 0),
(void *)yld->ctl_req, yld->ctl_data, USB_PKT_LEN, (void *)yld->ctl_req, yld->ctl_data, USB_PKT_LEN,
urb_ctl_callback, yld); urb_ctl_callback, yld);
yld->urb_ctl->setup_dma = yld->ctl_req_dma;
yld->urb_ctl->transfer_dma = yld->ctl_dma; yld->urb_ctl->transfer_dma = yld->ctl_dma;
yld->urb_ctl->transfer_flags |= URB_NO_SETUP_DMA_MAP | yld->urb_ctl->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
URB_NO_TRANSFER_DMA_MAP;
yld->urb_ctl->dev = udev; yld->urb_ctl->dev = udev;
/* find out the physical bus location */ /* find out the physical bus location */
......
...@@ -806,8 +806,8 @@ static int atp_probe(struct usb_interface *iface, ...@@ -806,8 +806,8 @@ static int atp_probe(struct usb_interface *iface,
if (!dev->urb) if (!dev->urb)
goto err_free_devs; goto err_free_devs;
dev->data = usb_buffer_alloc(dev->udev, dev->info->datalen, GFP_KERNEL, dev->data = usb_alloc_coherent(dev->udev, dev->info->datalen, GFP_KERNEL,
&dev->urb->transfer_dma); &dev->urb->transfer_dma);
if (!dev->data) if (!dev->data)
goto err_free_urb; goto err_free_urb;
...@@ -862,8 +862,8 @@ static int atp_probe(struct usb_interface *iface, ...@@ -862,8 +862,8 @@ static int atp_probe(struct usb_interface *iface,
return 0; return 0;
err_free_buffer: err_free_buffer:
usb_buffer_free(dev->udev, dev->info->datalen, usb_free_coherent(dev->udev, dev->info->datalen,
dev->data, dev->urb->transfer_dma); dev->data, dev->urb->transfer_dma);
err_free_urb: err_free_urb:
usb_free_urb(dev->urb); usb_free_urb(dev->urb);
err_free_devs: err_free_devs:
...@@ -881,8 +881,8 @@ static void atp_disconnect(struct usb_interface *iface) ...@@ -881,8 +881,8 @@ static void atp_disconnect(struct usb_interface *iface)
if (dev) { if (dev) {
usb_kill_urb(dev->urb); usb_kill_urb(dev->urb);
input_unregister_device(dev->input); input_unregister_device(dev->input);
usb_buffer_free(dev->udev, dev->info->datalen, usb_free_coherent(dev->udev, dev->info->datalen,
dev->data, dev->urb->transfer_dma); dev->data, dev->urb->transfer_dma);
usb_free_urb(dev->urb); usb_free_urb(dev->urb);
kfree(dev); kfree(dev);
} }
......
...@@ -715,15 +715,15 @@ static int bcm5974_probe(struct usb_interface *iface, ...@@ -715,15 +715,15 @@ static int bcm5974_probe(struct usb_interface *iface,
if (!dev->tp_urb) if (!dev->tp_urb)
goto err_free_bt_urb; goto err_free_bt_urb;
dev->bt_data = usb_buffer_alloc(dev->udev, dev->bt_data = usb_alloc_coherent(dev->udev,
dev->cfg.bt_datalen, GFP_KERNEL, dev->cfg.bt_datalen, GFP_KERNEL,
&dev->bt_urb->transfer_dma); &dev->bt_urb->transfer_dma);
if (!dev->bt_data) if (!dev->bt_data)
goto err_free_urb; goto err_free_urb;
dev->tp_data = usb_buffer_alloc(dev->udev, dev->tp_data = usb_alloc_coherent(dev->udev,
dev->cfg.tp_datalen, GFP_KERNEL, dev->cfg.tp_datalen, GFP_KERNEL,
&dev->tp_urb->transfer_dma); &dev->tp_urb->transfer_dma);
if (!dev->tp_data) if (!dev->tp_data)
goto err_free_bt_buffer; goto err_free_bt_buffer;
...@@ -765,10 +765,10 @@ static int bcm5974_probe(struct usb_interface *iface, ...@@ -765,10 +765,10 @@ static int bcm5974_probe(struct usb_interface *iface,
return 0; return 0;
err_free_buffer: err_free_buffer:
usb_buffer_free(dev->udev, dev->cfg.tp_datalen, usb_free_coherent(dev->udev, dev->cfg.tp_datalen,
dev->tp_data, dev->tp_urb->transfer_dma); dev->tp_data, dev->tp_urb->transfer_dma);
err_free_bt_buffer: err_free_bt_buffer:
usb_buffer_free(dev->udev, dev->cfg.bt_datalen, usb_free_coherent(dev->udev, dev->cfg.bt_datalen,
dev->bt_data, dev->bt_urb->transfer_dma); dev->bt_data, dev->bt_urb->transfer_dma);
err_free_urb: err_free_urb:
usb_free_urb(dev->tp_urb); usb_free_urb(dev->tp_urb);
...@@ -788,10 +788,10 @@ static void bcm5974_disconnect(struct usb_interface *iface) ...@@ -788,10 +788,10 @@ static void bcm5974_disconnect(struct usb_interface *iface)
usb_set_intfdata(iface, NULL); usb_set_intfdata(iface, NULL);
input_unregister_device(dev->input); input_unregister_device(dev->input);
usb_buffer_free(dev->udev, dev->cfg.tp_datalen, usb_free_coherent(dev->udev, dev->cfg.tp_datalen,
dev->tp_data, dev->tp_urb->transfer_dma); dev->tp_data, dev->tp_urb->transfer_dma);
usb_buffer_free(dev->udev, dev->cfg.bt_datalen, usb_free_coherent(dev->udev, dev->cfg.bt_datalen,
dev->bt_data, dev->bt_urb->transfer_dma); dev->bt_data, dev->bt_urb->transfer_dma);
usb_free_urb(dev->tp_urb); usb_free_urb(dev->tp_urb);
usb_free_urb(dev->bt_urb); usb_free_urb(dev->bt_urb);
kfree(dev); kfree(dev);
......
...@@ -155,7 +155,7 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_ ...@@ -155,7 +155,7 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_
goto fail1; goto fail1;
} }
acecad->data = usb_buffer_alloc(dev, 8, GFP_KERNEL, &acecad->data_dma); acecad->data = usb_alloc_coherent(dev, 8, GFP_KERNEL, &acecad->data_dma);
if (!acecad->data) { if (!acecad->data) {
err= -ENOMEM; err= -ENOMEM;
goto fail1; goto fail1;
...@@ -235,7 +235,7 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_ ...@@ -235,7 +235,7 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_
return 0; return 0;
fail2: usb_buffer_free(dev, 8, acecad->data, acecad->data_dma); fail2: usb_free_coherent(dev, 8, acecad->data, acecad->data_dma);
fail1: input_free_device(input_dev); fail1: input_free_device(input_dev);
kfree(acecad); kfree(acecad);
return err; return err;
...@@ -249,7 +249,7 @@ static void usb_acecad_disconnect(struct usb_interface *intf) ...@@ -249,7 +249,7 @@ static void usb_acecad_disconnect(struct usb_interface *intf)
input_unregister_device(acecad->input); input_unregister_device(acecad->input);
usb_free_urb(acecad->irq); usb_free_urb(acecad->irq);
usb_buffer_free(acecad->usbdev, 8, acecad->data, acecad->data_dma); usb_free_coherent(acecad->usbdev, 8, acecad->data, acecad->data_dma);
kfree(acecad); kfree(acecad);
} }
......
...@@ -1711,8 +1711,8 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id) ...@@ -1711,8 +1711,8 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
goto fail1; goto fail1;
} }
aiptek->data = usb_buffer_alloc(usbdev, AIPTEK_PACKET_LENGTH, aiptek->data = usb_alloc_coherent(usbdev, AIPTEK_PACKET_LENGTH,
GFP_ATOMIC, &aiptek->data_dma); GFP_ATOMIC, &aiptek->data_dma);
if (!aiptek->data) { if (!aiptek->data) {
dev_warn(&intf->dev, "cannot allocate usb buffer\n"); dev_warn(&intf->dev, "cannot allocate usb buffer\n");
goto fail1; goto fail1;
...@@ -1884,8 +1884,8 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id) ...@@ -1884,8 +1884,8 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
fail4: sysfs_remove_group(&intf->dev.kobj, &aiptek_attribute_group); fail4: sysfs_remove_group(&intf->dev.kobj, &aiptek_attribute_group);
fail3: usb_free_urb(aiptek->urb); fail3: usb_free_urb(aiptek->urb);
fail2: usb_buffer_free(usbdev, AIPTEK_PACKET_LENGTH, aiptek->data, fail2: usb_free_coherent(usbdev, AIPTEK_PACKET_LENGTH, aiptek->data,
aiptek->data_dma); aiptek->data_dma);
fail1: usb_set_intfdata(intf, NULL); fail1: usb_set_intfdata(intf, NULL);
input_free_device(inputdev); input_free_device(inputdev);
kfree(aiptek); kfree(aiptek);
...@@ -1909,9 +1909,9 @@ static void aiptek_disconnect(struct usb_interface *intf) ...@@ -1909,9 +1909,9 @@ static void aiptek_disconnect(struct usb_interface *intf)
input_unregister_device(aiptek->inputdev); input_unregister_device(aiptek->inputdev);
sysfs_remove_group(&intf->dev.kobj, &aiptek_attribute_group); sysfs_remove_group(&intf->dev.kobj, &aiptek_attribute_group);
usb_free_urb(aiptek->urb); usb_free_urb(aiptek->urb);
usb_buffer_free(interface_to_usbdev(intf), usb_free_coherent(interface_to_usbdev(intf),
AIPTEK_PACKET_LENGTH, AIPTEK_PACKET_LENGTH,
aiptek->data, aiptek->data_dma); aiptek->data, aiptek->data_dma);
kfree(aiptek); kfree(aiptek);
} }
} }
......
...@@ -850,8 +850,8 @@ static int gtco_probe(struct usb_interface *usbinterface, ...@@ -850,8 +850,8 @@ static int gtco_probe(struct usb_interface *usbinterface,
gtco->usbdev = usb_get_dev(interface_to_usbdev(usbinterface)); gtco->usbdev = usb_get_dev(interface_to_usbdev(usbinterface));
/* Allocate some data for incoming reports */ /* Allocate some data for incoming reports */
gtco->buffer = usb_buffer_alloc(gtco->usbdev, REPORT_MAX_SIZE, gtco->buffer = usb_alloc_coherent(gtco->usbdev, REPORT_MAX_SIZE,
GFP_KERNEL, &gtco->buf_dma); GFP_KERNEL, &gtco->buf_dma);
if (!gtco->buffer) { if (!gtco->buffer) {
err("No more memory for us buffers"); err("No more memory for us buffers");
error = -ENOMEM; error = -ENOMEM;
...@@ -982,8 +982,8 @@ static int gtco_probe(struct usb_interface *usbinterface, ...@@ -982,8 +982,8 @@ static int gtco_probe(struct usb_interface *usbinterface,
err_free_urb: err_free_urb:
usb_free_urb(gtco->urbinfo); usb_free_urb(gtco->urbinfo);
err_free_buf: err_free_buf:
usb_buffer_free(gtco->usbdev, REPORT_MAX_SIZE, usb_free_coherent(gtco->usbdev, REPORT_MAX_SIZE,
gtco->buffer, gtco->buf_dma); gtco->buffer, gtco->buf_dma);
err_free_devs: err_free_devs:
input_free_device(input_dev); input_free_device(input_dev);
kfree(gtco); kfree(gtco);
...@@ -1005,8 +1005,8 @@ static void gtco_disconnect(struct usb_interface *interface) ...@@ -1005,8 +1005,8 @@ static void gtco_disconnect(struct usb_interface *interface)
input_unregister_device(gtco->inputdevice); input_unregister_device(gtco->inputdevice);
usb_kill_urb(gtco->urbinfo); usb_kill_urb(gtco->urbinfo);
usb_free_urb(gtco->urbinfo); usb_free_urb(gtco->urbinfo);
usb_buffer_free(gtco->usbdev, REPORT_MAX_SIZE, usb_free_coherent(gtco->usbdev, REPORT_MAX_SIZE,
gtco->buffer, gtco->buf_dma); gtco->buffer, gtco->buf_dma);
kfree(gtco); kfree(gtco);
} }
......
...@@ -122,7 +122,7 @@ static int kbtab_probe(struct usb_interface *intf, const struct usb_device_id *i ...@@ -122,7 +122,7 @@ static int kbtab_probe(struct usb_interface *intf, const struct usb_device_id *i
if (!kbtab || !input_dev) if (!kbtab || !input_dev)
goto fail1; goto fail1;
kbtab->data = usb_buffer_alloc(dev, 8, GFP_KERNEL, &kbtab->data_dma); kbtab->data = usb_alloc_coherent(dev, 8, GFP_KERNEL, &kbtab->data_dma);
if (!kbtab->data) if (!kbtab->data)
goto fail1; goto fail1;
...@@ -173,7 +173,7 @@ static int kbtab_probe(struct usb_interface *intf, const struct usb_device_id *i ...@@ -173,7 +173,7 @@ static int kbtab_probe(struct usb_interface *intf, const struct usb_device_id *i
return 0; return 0;
fail3: usb_free_urb(kbtab->irq); fail3: usb_free_urb(kbtab->irq);
fail2: usb_buffer_free(dev, 8, kbtab->data, kbtab->data_dma); fail2: usb_free_coherent(dev, 8, kbtab->data, kbtab->data_dma);
fail1: input_free_device(input_dev); fail1: input_free_device(input_dev);
kfree(kbtab); kfree(kbtab);
return error; return error;
...@@ -187,7 +187,7 @@ static void kbtab_disconnect(struct usb_interface *intf) ...@@ -187,7 +187,7 @@ static void kbtab_disconnect(struct usb_interface *intf)
input_unregister_device(kbtab->dev); input_unregister_device(kbtab->dev);
usb_free_urb(kbtab->irq); usb_free_urb(kbtab->irq);
usb_buffer_free(kbtab->usbdev, 8, kbtab->data, kbtab->data_dma); usb_free_coherent(kbtab->usbdev, 8, kbtab->data, kbtab->data_dma);
kfree(kbtab); kfree(kbtab);
} }
......
...@@ -465,8 +465,8 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i ...@@ -465,8 +465,8 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
goto fail1; goto fail1;
} }
wacom_wac->data = usb_buffer_alloc(dev, WACOM_PKGLEN_MAX, wacom_wac->data = usb_alloc_coherent(dev, WACOM_PKGLEN_MAX,
GFP_KERNEL, &wacom->data_dma); GFP_KERNEL, &wacom->data_dma);
if (!wacom_wac->data) { if (!wacom_wac->data) {
error = -ENOMEM; error = -ENOMEM;
goto fail1; goto fail1;
...@@ -536,7 +536,7 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i ...@@ -536,7 +536,7 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
fail4: wacom_remove_shared_data(wacom_wac); fail4: wacom_remove_shared_data(wacom_wac);
fail3: usb_free_urb(wacom->irq); fail3: usb_free_urb(wacom->irq);
fail2: usb_buffer_free(dev, WACOM_PKGLEN_MAX, wacom_wac->data, wacom->data_dma); fail2: usb_free_coherent(dev, WACOM_PKGLEN_MAX, wacom_wac->data, wacom->data_dma);
fail1: input_free_device(input_dev); fail1: input_free_device(input_dev);
kfree(wacom); kfree(wacom);
return error; return error;
...@@ -551,7 +551,7 @@ static void wacom_disconnect(struct usb_interface *intf) ...@@ -551,7 +551,7 @@ static void wacom_disconnect(struct usb_interface *intf)
usb_kill_urb(wacom->irq); usb_kill_urb(wacom->irq);
input_unregister_device(wacom->wacom_wac.input); input_unregister_device(wacom->wacom_wac.input);
usb_free_urb(wacom->irq); usb_free_urb(wacom->irq);
usb_buffer_free(interface_to_usbdev(intf), WACOM_PKGLEN_MAX, usb_free_coherent(interface_to_usbdev(intf), WACOM_PKGLEN_MAX,
wacom->wacom_wac.data, wacom->data_dma); wacom->wacom_wac.data, wacom->data_dma);
wacom_remove_shared_data(&wacom->wacom_wac); wacom_remove_shared_data(&wacom->wacom_wac);
kfree(wacom); kfree(wacom);
......
...@@ -1290,8 +1290,8 @@ static void usbtouch_close(struct input_dev *input) ...@@ -1290,8 +1290,8 @@ static void usbtouch_close(struct input_dev *input)
static void usbtouch_free_buffers(struct usb_device *udev, static void usbtouch_free_buffers(struct usb_device *udev,
struct usbtouch_usb *usbtouch) struct usbtouch_usb *usbtouch)
{ {
usb_buffer_free(udev, usbtouch->type->rept_size, usb_free_coherent(udev, usbtouch->type->rept_size,
usbtouch->data, usbtouch->data_dma); usbtouch->data, usbtouch->data_dma);
kfree(usbtouch->buffer); kfree(usbtouch->buffer);
} }
...@@ -1335,8 +1335,8 @@ static int usbtouch_probe(struct usb_interface *intf, ...@@ -1335,8 +1335,8 @@ static int usbtouch_probe(struct usb_interface *intf,
if (!type->process_pkt) if (!type->process_pkt)
type->process_pkt = usbtouch_process_pkt; type->process_pkt = usbtouch_process_pkt;
usbtouch->data = usb_buffer_alloc(udev, type->rept_size, usbtouch->data = usb_alloc_coherent(udev, type->rept_size,
GFP_KERNEL, &usbtouch->data_dma); GFP_KERNEL, &usbtouch->data_dma);
if (!usbtouch->data) if (!usbtouch->data)
goto out_free; goto out_free;
......
...@@ -96,8 +96,9 @@ static int usb_free_stream_buffers(struct usb_data_stream *stream) ...@@ -96,8 +96,9 @@ static int usb_free_stream_buffers(struct usb_data_stream *stream)
while (stream->buf_num) { while (stream->buf_num) {
stream->buf_num--; stream->buf_num--;
deb_mem("freeing buffer %d\n",stream->buf_num); deb_mem("freeing buffer %d\n",stream->buf_num);
usb_buffer_free(stream->udev, stream->buf_size, usb_free_coherent(stream->udev, stream->buf_size,
stream->buf_list[stream->buf_num], stream->dma_addr[stream->buf_num]); stream->buf_list[stream->buf_num],
stream->dma_addr[stream->buf_num]);
} }
} }
...@@ -116,7 +117,7 @@ static int usb_allocate_stream_buffers(struct usb_data_stream *stream, int num, ...@@ -116,7 +117,7 @@ static int usb_allocate_stream_buffers(struct usb_data_stream *stream, int num,
for (stream->buf_num = 0; stream->buf_num < num; stream->buf_num++) { for (stream->buf_num = 0; stream->buf_num < num; stream->buf_num++) {
deb_mem("allocating buffer %d\n",stream->buf_num); deb_mem("allocating buffer %d\n",stream->buf_num);
if (( stream->buf_list[stream->buf_num] = if (( stream->buf_list[stream->buf_num] =
usb_buffer_alloc(stream->udev, size, GFP_ATOMIC, usb_alloc_coherent(stream->udev, size, GFP_ATOMIC,
&stream->dma_addr[stream->buf_num]) ) == NULL) { &stream->dma_addr[stream->buf_num]) ) == NULL) {
deb_mem("not enough memory for urb-buffer allocation.\n"); deb_mem("not enough memory for urb-buffer allocation.\n");
usb_free_stream_buffers(stream); usb_free_stream_buffers(stream);
......
...@@ -1257,7 +1257,7 @@ static int ttusb_dec_init_usb(struct ttusb_dec *dec) ...@@ -1257,7 +1257,7 @@ static int ttusb_dec_init_usb(struct ttusb_dec *dec)
if(!dec->irq_urb) { if(!dec->irq_urb) {
return -ENOMEM; return -ENOMEM;
} }
dec->irq_buffer = usb_buffer_alloc(dec->udev,IRQ_PACKET_SIZE, dec->irq_buffer = usb_alloc_coherent(dec->udev,IRQ_PACKET_SIZE,
GFP_ATOMIC, &dec->irq_dma_handle); GFP_ATOMIC, &dec->irq_dma_handle);
if(!dec->irq_buffer) { if(!dec->irq_buffer) {
usb_free_urb(dec->irq_urb); usb_free_urb(dec->irq_urb);
...@@ -1550,8 +1550,8 @@ static void ttusb_dec_exit_rc(struct ttusb_dec *dec) ...@@ -1550,8 +1550,8 @@ static void ttusb_dec_exit_rc(struct ttusb_dec *dec)
usb_free_urb(dec->irq_urb); usb_free_urb(dec->irq_urb);
usb_buffer_free(dec->udev,IRQ_PACKET_SIZE, usb_free_coherent(dec->udev,IRQ_PACKET_SIZE,
dec->irq_buffer, dec->irq_dma_handle); dec->irq_buffer, dec->irq_dma_handle);
if (dec->rc_input_dev) { if (dec->rc_input_dev) {
input_unregister_device(dec->rc_input_dev); input_unregister_device(dec->rc_input_dev);
......
...@@ -177,7 +177,7 @@ void au0828_uninit_isoc(struct au0828_dev *dev) ...@@ -177,7 +177,7 @@ void au0828_uninit_isoc(struct au0828_dev *dev)
usb_unlink_urb(urb); usb_unlink_urb(urb);
if (dev->isoc_ctl.transfer_buffer[i]) { if (dev->isoc_ctl.transfer_buffer[i]) {
usb_buffer_free(dev->usbdev, usb_free_coherent(dev->usbdev,
urb->transfer_buffer_length, urb->transfer_buffer_length,
dev->isoc_ctl.transfer_buffer[i], dev->isoc_ctl.transfer_buffer[i],
urb->transfer_dma); urb->transfer_dma);
...@@ -247,7 +247,7 @@ int au0828_init_isoc(struct au0828_dev *dev, int max_packets, ...@@ -247,7 +247,7 @@ int au0828_init_isoc(struct au0828_dev *dev, int max_packets,
} }
dev->isoc_ctl.urb[i] = urb; dev->isoc_ctl.urb[i] = urb;
dev->isoc_ctl.transfer_buffer[i] = usb_buffer_alloc(dev->usbdev, dev->isoc_ctl.transfer_buffer[i] = usb_alloc_coherent(dev->usbdev,
sb_size, GFP_KERNEL, &urb->transfer_dma); sb_size, GFP_KERNEL, &urb->transfer_dma);
if (!dev->isoc_ctl.transfer_buffer[i]) { if (!dev->isoc_ctl.transfer_buffer[i]) {
printk("unable to allocate %i bytes for transfer" printk("unable to allocate %i bytes for transfer"
......
...@@ -676,11 +676,11 @@ void cx231xx_uninit_isoc(struct cx231xx *dev) ...@@ -676,11 +676,11 @@ void cx231xx_uninit_isoc(struct cx231xx *dev)
usb_unlink_urb(urb); usb_unlink_urb(urb);
if (dev->video_mode.isoc_ctl.transfer_buffer[i]) { if (dev->video_mode.isoc_ctl.transfer_buffer[i]) {
usb_buffer_free(dev->udev, usb_free_coherent(dev->udev,
urb->transfer_buffer_length, urb->transfer_buffer_length,
dev->video_mode.isoc_ctl. dev->video_mode.isoc_ctl.
transfer_buffer[i], transfer_buffer[i],
urb->transfer_dma); urb->transfer_dma);
} }
usb_free_urb(urb); usb_free_urb(urb);
dev->video_mode.isoc_ctl.urb[i] = NULL; dev->video_mode.isoc_ctl.urb[i] = NULL;
...@@ -767,8 +767,8 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets, ...@@ -767,8 +767,8 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
dev->video_mode.isoc_ctl.urb[i] = urb; dev->video_mode.isoc_ctl.urb[i] = urb;
dev->video_mode.isoc_ctl.transfer_buffer[i] = dev->video_mode.isoc_ctl.transfer_buffer[i] =
usb_buffer_alloc(dev->udev, sb_size, GFP_KERNEL, usb_alloc_coherent(dev->udev, sb_size, GFP_KERNEL,
&urb->transfer_dma); &urb->transfer_dma);
if (!dev->video_mode.isoc_ctl.transfer_buffer[i]) { if (!dev->video_mode.isoc_ctl.transfer_buffer[i]) {
cx231xx_err("unable to allocate %i bytes for transfer" cx231xx_err("unable to allocate %i bytes for transfer"
" buffer %i%s\n", " buffer %i%s\n",
......
...@@ -970,7 +970,7 @@ void em28xx_uninit_isoc(struct em28xx *dev) ...@@ -970,7 +970,7 @@ void em28xx_uninit_isoc(struct em28xx *dev)
usb_unlink_urb(urb); usb_unlink_urb(urb);
if (dev->isoc_ctl.transfer_buffer[i]) { if (dev->isoc_ctl.transfer_buffer[i]) {
usb_buffer_free(dev->udev, usb_free_coherent(dev->udev,
urb->transfer_buffer_length, urb->transfer_buffer_length,
dev->isoc_ctl.transfer_buffer[i], dev->isoc_ctl.transfer_buffer[i],
urb->transfer_dma); urb->transfer_dma);
...@@ -1045,7 +1045,7 @@ int em28xx_init_isoc(struct em28xx *dev, int max_packets, ...@@ -1045,7 +1045,7 @@ int em28xx_init_isoc(struct em28xx *dev, int max_packets,
} }
dev->isoc_ctl.urb[i] = urb; dev->isoc_ctl.urb[i] = urb;
dev->isoc_ctl.transfer_buffer[i] = usb_buffer_alloc(dev->udev, dev->isoc_ctl.transfer_buffer[i] = usb_alloc_coherent(dev->udev,
sb_size, GFP_KERNEL, &urb->transfer_dma); sb_size, GFP_KERNEL, &urb->transfer_dma);
if (!dev->isoc_ctl.transfer_buffer[i]) { if (!dev->isoc_ctl.transfer_buffer[i]) {
em28xx_err("unable to allocate %i bytes for transfer" em28xx_err("unable to allocate %i bytes for transfer"
......
...@@ -117,13 +117,13 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -117,13 +117,13 @@ static int sd_start(struct gspca_dev *gspca_dev)
return -ENOMEM; return -ENOMEM;
} }
gspca_dev->urb[n] = urb; gspca_dev->urb[n] = urb;
urb->transfer_buffer = usb_buffer_alloc(gspca_dev->dev, urb->transfer_buffer = usb_alloc_coherent(gspca_dev->dev,
SD_PKT_SZ * SD_NPKT, SD_PKT_SZ * SD_NPKT,
GFP_KERNEL, GFP_KERNEL,
&urb->transfer_dma); &urb->transfer_dma);
if (urb->transfer_buffer == NULL) { if (urb->transfer_buffer == NULL) {
err("usb_buffer_alloc failed"); err("usb_alloc_coherent failed");
return -ENOMEM; return -ENOMEM;
} }
urb->dev = gspca_dev->dev; urb->dev = gspca_dev->dev;
......
...@@ -213,7 +213,7 @@ static int alloc_and_submit_int_urb(struct gspca_dev *gspca_dev, ...@@ -213,7 +213,7 @@ static int alloc_and_submit_int_urb(struct gspca_dev *gspca_dev,
goto error; goto error;
} }
buffer = usb_buffer_alloc(dev, buffer_len, buffer = usb_alloc_coherent(dev, buffer_len,
GFP_KERNEL, &urb->transfer_dma); GFP_KERNEL, &urb->transfer_dma);
if (!buffer) { if (!buffer) {
ret = -ENOMEM; ret = -ENOMEM;
...@@ -232,10 +232,10 @@ static int alloc_and_submit_int_urb(struct gspca_dev *gspca_dev, ...@@ -232,10 +232,10 @@ static int alloc_and_submit_int_urb(struct gspca_dev *gspca_dev,
return ret; return ret;
error_submit: error_submit:
usb_buffer_free(dev, usb_free_coherent(dev,
urb->transfer_buffer_length, urb->transfer_buffer_length,
urb->transfer_buffer, urb->transfer_buffer,
urb->transfer_dma); urb->transfer_dma);
error_buffer: error_buffer:
usb_free_urb(urb); usb_free_urb(urb);
error: error:
...@@ -272,10 +272,10 @@ static void gspca_input_destroy_urb(struct gspca_dev *gspca_dev) ...@@ -272,10 +272,10 @@ static void gspca_input_destroy_urb(struct gspca_dev *gspca_dev)
if (urb) { if (urb) {
gspca_dev->int_urb = NULL; gspca_dev->int_urb = NULL;
usb_kill_urb(urb); usb_kill_urb(urb);
usb_buffer_free(gspca_dev->dev, usb_free_coherent(gspca_dev->dev,
urb->transfer_buffer_length, urb->transfer_buffer_length,
urb->transfer_buffer, urb->transfer_buffer,
urb->transfer_dma); urb->transfer_dma);
usb_free_urb(urb); usb_free_urb(urb);
} }
} }
...@@ -605,10 +605,10 @@ static void destroy_urbs(struct gspca_dev *gspca_dev) ...@@ -605,10 +605,10 @@ static void destroy_urbs(struct gspca_dev *gspca_dev)
gspca_dev->urb[i] = NULL; gspca_dev->urb[i] = NULL;
usb_kill_urb(urb); usb_kill_urb(urb);
if (urb->transfer_buffer != NULL) if (urb->transfer_buffer != NULL)
usb_buffer_free(gspca_dev->dev, usb_free_coherent(gspca_dev->dev,
urb->transfer_buffer_length, urb->transfer_buffer_length,
urb->transfer_buffer, urb->transfer_buffer,
urb->transfer_dma); urb->transfer_dma);
usb_free_urb(urb); usb_free_urb(urb);
} }
} }
...@@ -760,13 +760,13 @@ static int create_urbs(struct gspca_dev *gspca_dev, ...@@ -760,13 +760,13 @@ static int create_urbs(struct gspca_dev *gspca_dev,
return -ENOMEM; return -ENOMEM;
} }
gspca_dev->urb[n] = urb; gspca_dev->urb[n] = urb;
urb->transfer_buffer = usb_buffer_alloc(gspca_dev->dev, urb->transfer_buffer = usb_alloc_coherent(gspca_dev->dev,
bsize, bsize,
GFP_KERNEL, GFP_KERNEL,
&urb->transfer_dma); &urb->transfer_dma);
if (urb->transfer_buffer == NULL) { if (urb->transfer_buffer == NULL) {
err("usb_buffer_alloc failed"); err("usb_alloc_coherent failed");
return -ENOMEM; return -ENOMEM;
} }
urb->dev = gspca_dev->dev; urb->dev = gspca_dev->dev;
......
...@@ -92,8 +92,8 @@ static int hdpvr_free_queue(struct list_head *q) ...@@ -92,8 +92,8 @@ static int hdpvr_free_queue(struct list_head *q)
buf = list_entry(p, struct hdpvr_buffer, buff_list); buf = list_entry(p, struct hdpvr_buffer, buff_list);
urb = buf->urb; urb = buf->urb;
usb_buffer_free(urb->dev, urb->transfer_buffer_length, usb_free_coherent(urb->dev, urb->transfer_buffer_length,
urb->transfer_buffer, urb->transfer_dma); urb->transfer_buffer, urb->transfer_dma);
usb_free_urb(urb); usb_free_urb(urb);
tmp = p->next; tmp = p->next;
list_del(p); list_del(p);
...@@ -143,8 +143,8 @@ int hdpvr_alloc_buffers(struct hdpvr_device *dev, uint count) ...@@ -143,8 +143,8 @@ int hdpvr_alloc_buffers(struct hdpvr_device *dev, uint count)
} }
buf->urb = urb; buf->urb = urb;
mem = usb_buffer_alloc(dev->udev, dev->bulk_in_size, GFP_KERNEL, mem = usb_alloc_coherent(dev->udev, dev->bulk_in_size, GFP_KERNEL,
&urb->transfer_dma); &urb->transfer_dma);
if (!mem) { if (!mem) {
v4l2_err(&dev->v4l2_dev, v4l2_err(&dev->v4l2_dev,
"cannot allocate usb transfer buffer\n"); "cannot allocate usb transfer buffer\n");
......
...@@ -454,8 +454,8 @@ static int poseidon_probe(struct usb_interface *interface, ...@@ -454,8 +454,8 @@ static int poseidon_probe(struct usb_interface *interface,
device_init_wakeup(&udev->dev, 1); device_init_wakeup(&udev->dev, 1);
#ifdef CONFIG_PM #ifdef CONFIG_PM
pd->udev->autosuspend_disabled = 0;
pd->udev->autosuspend_delay = HZ * PM_SUSPEND_DELAY; pd->udev->autosuspend_delay = HZ * PM_SUSPEND_DELAY;
usb_enable_autosuspend(pd->udev);
if (in_hibernation(pd)) { if (in_hibernation(pd)) {
INIT_WORK(&pd->pm_work, hibernation_resume); INIT_WORK(&pd->pm_work, hibernation_resume);
......
...@@ -478,10 +478,10 @@ static int prepare_iso_urb(struct video_data *video) ...@@ -478,10 +478,10 @@ static int prepare_iso_urb(struct video_data *video)
goto out; goto out;
video->urb_array[i] = urb; video->urb_array[i] = urb;
mem = usb_buffer_alloc(udev, mem = usb_alloc_coherent(udev,
ISO_PKT_SIZE * PK_PER_URB, ISO_PKT_SIZE * PK_PER_URB,
GFP_KERNEL, GFP_KERNEL,
&urb->transfer_dma); &urb->transfer_dma);
urb->complete = urb_complete_iso; /* handler */ urb->complete = urb_complete_iso; /* handler */
urb->dev = udev; urb->dev = udev;
...@@ -521,8 +521,8 @@ int alloc_bulk_urbs_generic(struct urb **urb_array, int num, ...@@ -521,8 +521,8 @@ int alloc_bulk_urbs_generic(struct urb **urb_array, int num,
if (urb == NULL) if (urb == NULL)
return i; return i;
mem = usb_buffer_alloc(udev, buf_size, gfp_flags, mem = usb_alloc_coherent(udev, buf_size, gfp_flags,
&urb->transfer_dma); &urb->transfer_dma);
if (mem == NULL) if (mem == NULL)
return i; return i;
...@@ -542,7 +542,7 @@ void free_all_urb_generic(struct urb **urb_array, int num) ...@@ -542,7 +542,7 @@ void free_all_urb_generic(struct urb **urb_array, int num)
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
urb = urb_array[i]; urb = urb_array[i];
if (urb) { if (urb) {
usb_buffer_free(urb->dev, usb_free_coherent(urb->dev,
urb->transfer_buffer_length, urb->transfer_buffer_length,
urb->transfer_buffer, urb->transfer_buffer,
urb->transfer_dma); urb->transfer_dma);
......
...@@ -2493,10 +2493,10 @@ int usbvision_init_isoc(struct usb_usbvision *usbvision) ...@@ -2493,10 +2493,10 @@ int usbvision_init_isoc(struct usb_usbvision *usbvision)
} }
usbvision->sbuf[bufIdx].urb = urb; usbvision->sbuf[bufIdx].urb = urb;
usbvision->sbuf[bufIdx].data = usbvision->sbuf[bufIdx].data =
usb_buffer_alloc(usbvision->dev, usb_alloc_coherent(usbvision->dev,
sb_size, sb_size,
GFP_KERNEL, GFP_KERNEL,
&urb->transfer_dma); &urb->transfer_dma);
urb->dev = dev; urb->dev = dev;
urb->context = usbvision; urb->context = usbvision;
urb->pipe = usb_rcvisocpipe(dev, usbvision->video_endp); urb->pipe = usb_rcvisocpipe(dev, usbvision->video_endp);
...@@ -2552,10 +2552,10 @@ void usbvision_stop_isoc(struct usb_usbvision *usbvision) ...@@ -2552,10 +2552,10 @@ void usbvision_stop_isoc(struct usb_usbvision *usbvision)
for (bufIdx = 0; bufIdx < USBVISION_NUMSBUF; bufIdx++) { for (bufIdx = 0; bufIdx < USBVISION_NUMSBUF; bufIdx++) {
usb_kill_urb(usbvision->sbuf[bufIdx].urb); usb_kill_urb(usbvision->sbuf[bufIdx].urb);
if (usbvision->sbuf[bufIdx].data){ if (usbvision->sbuf[bufIdx].data){
usb_buffer_free(usbvision->dev, usb_free_coherent(usbvision->dev,
sb_size, sb_size,
usbvision->sbuf[bufIdx].data, usbvision->sbuf[bufIdx].data,
usbvision->sbuf[bufIdx].urb->transfer_dma); usbvision->sbuf[bufIdx].urb->transfer_dma);
} }
usb_free_urb(usbvision->sbuf[bufIdx].urb); usb_free_urb(usbvision->sbuf[bufIdx].urb);
usbvision->sbuf[bufIdx].urb = NULL; usbvision->sbuf[bufIdx].urb = NULL;
......
...@@ -739,7 +739,7 @@ static void uvc_free_urb_buffers(struct uvc_streaming *stream) ...@@ -739,7 +739,7 @@ static void uvc_free_urb_buffers(struct uvc_streaming *stream)
for (i = 0; i < UVC_URBS; ++i) { for (i = 0; i < UVC_URBS; ++i) {
if (stream->urb_buffer[i]) { if (stream->urb_buffer[i]) {
usb_buffer_free(stream->dev->udev, stream->urb_size, usb_free_coherent(stream->dev->udev, stream->urb_size,
stream->urb_buffer[i], stream->urb_dma[i]); stream->urb_buffer[i], stream->urb_dma[i]);
stream->urb_buffer[i] = NULL; stream->urb_buffer[i] = NULL;
} }
...@@ -780,7 +780,7 @@ static int uvc_alloc_urb_buffers(struct uvc_streaming *stream, ...@@ -780,7 +780,7 @@ static int uvc_alloc_urb_buffers(struct uvc_streaming *stream,
for (; npackets > 1; npackets /= 2) { for (; npackets > 1; npackets /= 2) {
for (i = 0; i < UVC_URBS; ++i) { for (i = 0; i < UVC_URBS; ++i) {
stream->urb_size = psize * npackets; stream->urb_size = psize * npackets;
stream->urb_buffer[i] = usb_buffer_alloc( stream->urb_buffer[i] = usb_alloc_coherent(
stream->dev->udev, stream->urb_size, stream->dev->udev, stream->urb_size,
gfp_flags | __GFP_NOWARN, &stream->urb_dma[i]); gfp_flags | __GFP_NOWARN, &stream->urb_dma[i]);
if (!stream->urb_buffer[i]) { if (!stream->urb_buffer[i]) {
......
...@@ -512,8 +512,8 @@ static void ems_usb_write_bulk_callback(struct urb *urb) ...@@ -512,8 +512,8 @@ static void ems_usb_write_bulk_callback(struct urb *urb)
netdev = dev->netdev; netdev = dev->netdev;
/* free up our allocated buffer */ /* free up our allocated buffer */
usb_buffer_free(urb->dev, urb->transfer_buffer_length, usb_free_coherent(urb->dev, urb->transfer_buffer_length,
urb->transfer_buffer, urb->transfer_dma); urb->transfer_buffer, urb->transfer_dma);
atomic_dec(&dev->active_tx_urbs); atomic_dec(&dev->active_tx_urbs);
...@@ -610,8 +610,8 @@ static int ems_usb_start(struct ems_usb *dev) ...@@ -610,8 +610,8 @@ static int ems_usb_start(struct ems_usb *dev)
return -ENOMEM; return -ENOMEM;
} }
buf = usb_buffer_alloc(dev->udev, RX_BUFFER_SIZE, GFP_KERNEL, buf = usb_alloc_coherent(dev->udev, RX_BUFFER_SIZE, GFP_KERNEL,
&urb->transfer_dma); &urb->transfer_dma);
if (!buf) { if (!buf) {
dev_err(netdev->dev.parent, dev_err(netdev->dev.parent,
"No memory left for USB buffer\n"); "No memory left for USB buffer\n");
...@@ -631,8 +631,8 @@ static int ems_usb_start(struct ems_usb *dev) ...@@ -631,8 +631,8 @@ static int ems_usb_start(struct ems_usb *dev)
netif_device_detach(dev->netdev); netif_device_detach(dev->netdev);
usb_unanchor_urb(urb); usb_unanchor_urb(urb);
usb_buffer_free(dev->udev, RX_BUFFER_SIZE, buf, usb_free_coherent(dev->udev, RX_BUFFER_SIZE, buf,
urb->transfer_dma); urb->transfer_dma);
break; break;
} }
...@@ -773,7 +773,7 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne ...@@ -773,7 +773,7 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne
goto nomem; goto nomem;
} }
buf = usb_buffer_alloc(dev->udev, size, GFP_ATOMIC, &urb->transfer_dma); buf = usb_alloc_coherent(dev->udev, size, GFP_ATOMIC, &urb->transfer_dma);
if (!buf) { if (!buf) {
dev_err(netdev->dev.parent, "No memory left for USB buffer\n"); dev_err(netdev->dev.parent, "No memory left for USB buffer\n");
usb_free_urb(urb); usb_free_urb(urb);
...@@ -816,7 +816,7 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne ...@@ -816,7 +816,7 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne
*/ */
if (!context) { if (!context) {
usb_unanchor_urb(urb); usb_unanchor_urb(urb);
usb_buffer_free(dev->udev, size, buf, urb->transfer_dma); usb_free_coherent(dev->udev, size, buf, urb->transfer_dma);
dev_warn(netdev->dev.parent, "couldn't find free context\n"); dev_warn(netdev->dev.parent, "couldn't find free context\n");
...@@ -841,7 +841,7 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne ...@@ -841,7 +841,7 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne
can_free_echo_skb(netdev, context->echo_index); can_free_echo_skb(netdev, context->echo_index);
usb_unanchor_urb(urb); usb_unanchor_urb(urb);
usb_buffer_free(dev->udev, size, buf, urb->transfer_dma); usb_free_coherent(dev->udev, size, buf, urb->transfer_dma);
dev_kfree_skb(skb); dev_kfree_skb(skb);
atomic_dec(&dev->active_tx_urbs); atomic_dec(&dev->active_tx_urbs);
......
...@@ -128,17 +128,13 @@ static int ipheth_alloc_urbs(struct ipheth_device *iphone) ...@@ -128,17 +128,13 @@ static int ipheth_alloc_urbs(struct ipheth_device *iphone)
if (rx_urb == NULL) if (rx_urb == NULL)
goto free_tx_urb; goto free_tx_urb;
tx_buf = usb_buffer_alloc(iphone->udev, tx_buf = usb_alloc_coherent(iphone->udev, IPHETH_BUF_SIZE,
IPHETH_BUF_SIZE, GFP_KERNEL, &tx_urb->transfer_dma);
GFP_KERNEL,
&tx_urb->transfer_dma);
if (tx_buf == NULL) if (tx_buf == NULL)
goto free_rx_urb; goto free_rx_urb;
rx_buf = usb_buffer_alloc(iphone->udev, rx_buf = usb_alloc_coherent(iphone->udev, IPHETH_BUF_SIZE,
IPHETH_BUF_SIZE, GFP_KERNEL, &rx_urb->transfer_dma);
GFP_KERNEL,
&rx_urb->transfer_dma);
if (rx_buf == NULL) if (rx_buf == NULL)
goto free_tx_buf; goto free_tx_buf;
...@@ -150,8 +146,8 @@ static int ipheth_alloc_urbs(struct ipheth_device *iphone) ...@@ -150,8 +146,8 @@ static int ipheth_alloc_urbs(struct ipheth_device *iphone)
return 0; return 0;
free_tx_buf: free_tx_buf:
usb_buffer_free(iphone->udev, IPHETH_BUF_SIZE, tx_buf, usb_free_coherent(iphone->udev, IPHETH_BUF_SIZE, tx_buf,
tx_urb->transfer_dma); tx_urb->transfer_dma);
free_rx_urb: free_rx_urb:
usb_free_urb(rx_urb); usb_free_urb(rx_urb);
free_tx_urb: free_tx_urb:
...@@ -162,10 +158,10 @@ static int ipheth_alloc_urbs(struct ipheth_device *iphone) ...@@ -162,10 +158,10 @@ static int ipheth_alloc_urbs(struct ipheth_device *iphone)
static void ipheth_free_urbs(struct ipheth_device *iphone) static void ipheth_free_urbs(struct ipheth_device *iphone)
{ {
usb_buffer_free(iphone->udev, IPHETH_BUF_SIZE, iphone->rx_buf, usb_free_coherent(iphone->udev, IPHETH_BUF_SIZE, iphone->rx_buf,
iphone->rx_urb->transfer_dma); iphone->rx_urb->transfer_dma);
usb_buffer_free(iphone->udev, IPHETH_BUF_SIZE, iphone->tx_buf, usb_free_coherent(iphone->udev, IPHETH_BUF_SIZE, iphone->tx_buf,
iphone->tx_urb->transfer_dma); iphone->tx_urb->transfer_dma);
usb_free_urb(iphone->rx_urb); usb_free_urb(iphone->rx_urb);
usb_free_urb(iphone->tx_urb); usb_free_urb(iphone->tx_urb);
} }
......
...@@ -1155,13 +1155,13 @@ static int kaweth_probe( ...@@ -1155,13 +1155,13 @@ static int kaweth_probe(
if (!kaweth->irq_urb) if (!kaweth->irq_urb)
goto err_tx_and_rx; goto err_tx_and_rx;
kaweth->intbuffer = usb_buffer_alloc( kaweth->dev, kaweth->intbuffer = usb_alloc_coherent( kaweth->dev,
INTBUFFERSIZE, INTBUFFERSIZE,
GFP_KERNEL, GFP_KERNEL,
&kaweth->intbufferhandle); &kaweth->intbufferhandle);
if (!kaweth->intbuffer) if (!kaweth->intbuffer)
goto err_tx_and_rx_and_irq; goto err_tx_and_rx_and_irq;
kaweth->rx_buf = usb_buffer_alloc( kaweth->dev, kaweth->rx_buf = usb_alloc_coherent( kaweth->dev,
KAWETH_BUF_SIZE, KAWETH_BUF_SIZE,
GFP_KERNEL, GFP_KERNEL,
&kaweth->rxbufferhandle); &kaweth->rxbufferhandle);
...@@ -1202,9 +1202,9 @@ static int kaweth_probe( ...@@ -1202,9 +1202,9 @@ static int kaweth_probe(
err_intfdata: err_intfdata:
usb_set_intfdata(intf, NULL); usb_set_intfdata(intf, NULL);
usb_buffer_free(kaweth->dev, KAWETH_BUF_SIZE, (void *)kaweth->rx_buf, kaweth->rxbufferhandle); usb_free_coherent(kaweth->dev, KAWETH_BUF_SIZE, (void *)kaweth->rx_buf, kaweth->rxbufferhandle);
err_all_but_rxbuf: err_all_but_rxbuf:
usb_buffer_free(kaweth->dev, INTBUFFERSIZE, (void *)kaweth->intbuffer, kaweth->intbufferhandle); usb_free_coherent(kaweth->dev, INTBUFFERSIZE, (void *)kaweth->intbuffer, kaweth->intbufferhandle);
err_tx_and_rx_and_irq: err_tx_and_rx_and_irq:
usb_free_urb(kaweth->irq_urb); usb_free_urb(kaweth->irq_urb);
err_tx_and_rx: err_tx_and_rx:
...@@ -1241,8 +1241,8 @@ static void kaweth_disconnect(struct usb_interface *intf) ...@@ -1241,8 +1241,8 @@ static void kaweth_disconnect(struct usb_interface *intf)
usb_free_urb(kaweth->tx_urb); usb_free_urb(kaweth->tx_urb);
usb_free_urb(kaweth->irq_urb); usb_free_urb(kaweth->irq_urb);
usb_buffer_free(kaweth->dev, KAWETH_BUF_SIZE, (void *)kaweth->rx_buf, kaweth->rxbufferhandle); usb_free_coherent(kaweth->dev, KAWETH_BUF_SIZE, (void *)kaweth->rx_buf, kaweth->rxbufferhandle);
usb_buffer_free(kaweth->dev, INTBUFFERSIZE, (void *)kaweth->intbuffer, kaweth->intbufferhandle); usb_free_coherent(kaweth->dev, INTBUFFERSIZE, (void *)kaweth->intbuffer, kaweth->intbufferhandle);
free_netdev(netdev); free_netdev(netdev);
} }
......
...@@ -514,7 +514,7 @@ int i2400mu_probe(struct usb_interface *iface, ...@@ -514,7 +514,7 @@ int i2400mu_probe(struct usb_interface *iface,
iface->needs_remote_wakeup = 1; /* autosuspend (15s delay) */ iface->needs_remote_wakeup = 1; /* autosuspend (15s delay) */
device_init_wakeup(dev, 1); device_init_wakeup(dev, 1);
usb_dev->autosuspend_delay = 15 * HZ; usb_dev->autosuspend_delay = 15 * HZ;
usb_dev->autosuspend_disabled = 0; usb_enable_autosuspend(usb_dev);
#endif #endif
result = i2400m_setup(i2400m, I2400M_BRI_MAC_REINIT); result = i2400m_setup(i2400m, I2400M_BRI_MAC_REINIT);
......
...@@ -215,7 +215,7 @@ static void ar9170_usb_irq_completed(struct urb *urb) ...@@ -215,7 +215,7 @@ static void ar9170_usb_irq_completed(struct urb *urb)
return; return;
free: free:
usb_buffer_free(aru->udev, 64, urb->transfer_buffer, urb->transfer_dma); usb_free_coherent(aru->udev, 64, urb->transfer_buffer, urb->transfer_dma);
} }
static void ar9170_usb_rx_completed(struct urb *urb) static void ar9170_usb_rx_completed(struct urb *urb)
...@@ -296,7 +296,7 @@ static int ar9170_usb_alloc_rx_irq_urb(struct ar9170_usb *aru) ...@@ -296,7 +296,7 @@ static int ar9170_usb_alloc_rx_irq_urb(struct ar9170_usb *aru)
if (!urb) if (!urb)
goto out; goto out;
ibuf = usb_buffer_alloc(aru->udev, 64, GFP_KERNEL, &urb->transfer_dma); ibuf = usb_alloc_coherent(aru->udev, 64, GFP_KERNEL, &urb->transfer_dma);
if (!ibuf) if (!ibuf)
goto out; goto out;
...@@ -309,8 +309,8 @@ static int ar9170_usb_alloc_rx_irq_urb(struct ar9170_usb *aru) ...@@ -309,8 +309,8 @@ static int ar9170_usb_alloc_rx_irq_urb(struct ar9170_usb *aru)
err = usb_submit_urb(urb, GFP_KERNEL); err = usb_submit_urb(urb, GFP_KERNEL);
if (err) { if (err) {
usb_unanchor_urb(urb); usb_unanchor_urb(urb);
usb_buffer_free(aru->udev, 64, urb->transfer_buffer, usb_free_coherent(aru->udev, 64, urb->transfer_buffer,
urb->transfer_dma); urb->transfer_dma);
} }
out: out:
......
...@@ -664,15 +664,15 @@ static struct urb *alloc_rx_urb(struct zd_usb *usb) ...@@ -664,15 +664,15 @@ static struct urb *alloc_rx_urb(struct zd_usb *usb)
urb = usb_alloc_urb(0, GFP_KERNEL); urb = usb_alloc_urb(0, GFP_KERNEL);
if (!urb) if (!urb)
return NULL; return NULL;
buffer = usb_buffer_alloc(udev, USB_MAX_RX_SIZE, GFP_KERNEL, buffer = usb_alloc_coherent(udev, USB_MAX_RX_SIZE, GFP_KERNEL,
&urb->transfer_dma); &urb->transfer_dma);
if (!buffer) { if (!buffer) {
usb_free_urb(urb); usb_free_urb(urb);
return NULL; return NULL;
} }
usb_fill_bulk_urb(urb, udev, usb_rcvbulkpipe(udev, EP_DATA_IN), usb_fill_bulk_urb(urb, udev, usb_rcvbulkpipe(udev, EP_DATA_IN),
buffer, USB_MAX_RX_SIZE, buffer, USB_MAX_RX_SIZE,
rx_urb_complete, usb); rx_urb_complete, usb);
urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
...@@ -683,8 +683,8 @@ static void free_rx_urb(struct urb *urb) ...@@ -683,8 +683,8 @@ static void free_rx_urb(struct urb *urb)
{ {
if (!urb) if (!urb)
return; return;
usb_buffer_free(urb->dev, urb->transfer_buffer_length, usb_free_coherent(urb->dev, urb->transfer_buffer_length,
urb->transfer_buffer, urb->transfer_dma); urb->transfer_buffer, urb->transfer_dma);
usb_free_urb(urb); usb_free_urb(urb);
} }
......
...@@ -81,8 +81,8 @@ extern u8 EpToQueue[6]; ...@@ -81,8 +81,8 @@ extern u8 EpToQueue[6];
#define RT28XX_PUT_DEVICE usb_put_dev #define RT28XX_PUT_DEVICE usb_put_dev
#define RTUSB_ALLOC_URB(iso) usb_alloc_urb(iso, GFP_ATOMIC) #define RTUSB_ALLOC_URB(iso) usb_alloc_urb(iso, GFP_ATOMIC)
#define RTUSB_SUBMIT_URB(pUrb) usb_submit_urb(pUrb, GFP_ATOMIC) #define RTUSB_SUBMIT_URB(pUrb) usb_submit_urb(pUrb, GFP_ATOMIC)
#define RTUSB_URB_ALLOC_BUFFER(pUsb_Dev, BufSize, pDma_addr) usb_buffer_alloc(pUsb_Dev, BufSize, GFP_ATOMIC, pDma_addr) #define RTUSB_URB_ALLOC_BUFFER(pUsb_Dev, BufSize, pDma_addr) usb_alloc_coherent(pUsb_Dev, BufSize, GFP_ATOMIC, pDma_addr)
#define RTUSB_URB_FREE_BUFFER(pUsb_Dev, BufSize, pTransferBuf, Dma_addr) usb_buffer_free(pUsb_Dev, BufSize, pTransferBuf, Dma_addr) #define RTUSB_URB_FREE_BUFFER(pUsb_Dev, BufSize, pTransferBuf, Dma_addr) usb_free_coherent(pUsb_Dev, BufSize, pTransferBuf, Dma_addr)
#define RTUSB_FREE_URB(pUrb) usb_free_urb(pUrb) #define RTUSB_FREE_URB(pUrb) usb_free_urb(pUrb)
......
...@@ -1508,8 +1508,8 @@ static void dlfb_free_urb_list(struct dlfb_data *dev) ...@@ -1508,8 +1508,8 @@ static void dlfb_free_urb_list(struct dlfb_data *dev)
urb = unode->urb; urb = unode->urb;
/* Free each separately allocated piece */ /* Free each separately allocated piece */
usb_buffer_free(urb->dev, dev->urbs.size, usb_free_coherent(urb->dev, dev->urbs.size,
urb->transfer_buffer, urb->transfer_dma); urb->transfer_buffer, urb->transfer_dma);
usb_free_urb(urb); usb_free_urb(urb);
kfree(node); kfree(node);
} }
...@@ -1543,8 +1543,8 @@ static int dlfb_alloc_urb_list(struct dlfb_data *dev, int count, size_t size) ...@@ -1543,8 +1543,8 @@ static int dlfb_alloc_urb_list(struct dlfb_data *dev, int count, size_t size)
} }
unode->urb = urb; unode->urb = urb;
buf = usb_buffer_alloc(dev->udev, MAX_TRANSFER, GFP_KERNEL, buf = usb_alloc_coherent(dev->udev, MAX_TRANSFER, GFP_KERNEL,
&urb->transfer_dma); &urb->transfer_dma);
if (!buf) { if (!buf) {
kfree(unode); kfree(unode);
usb_free_urb(urb); usb_free_urb(urb);
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#include "usbip_common.h" #include "usbip_common.h"
#include "stub.h" #include "stub.h"
#include "../../usb/core/hcd.h" #include <linux/usb/hcd.h>
static int is_clear_halt_cmd(struct urb *urb) static int is_clear_halt_cmd(struct urb *urb)
......
...@@ -562,7 +562,7 @@ EXPORT_SYMBOL_GPL(sockfd_to_socket); ...@@ -562,7 +562,7 @@ EXPORT_SYMBOL_GPL(sockfd_to_socket);
/* there may be more cases to tweak the flags. */ /* there may be more cases to tweak the flags. */
static unsigned int tweak_transfer_flags(unsigned int flags) static unsigned int tweak_transfer_flags(unsigned int flags)
{ {
flags &= ~(URB_NO_TRANSFER_DMA_MAP|URB_NO_SETUP_DMA_MAP); flags &= ~URB_NO_TRANSFER_DMA_MAP;
return flags; return flags;
} }
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
*/ */
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include "../../usb/core/hcd.h" #include <linux/usb/hcd.h>
struct vhci_device { struct vhci_device {
......
此差异已折叠。
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/usb.h> #include <linux/usb.h>
#include "../core/hcd.h" #include <linux/usb/hcd.h>
#include "c67x00.h" #include "c67x00.h"
/* /*
......
...@@ -892,7 +892,7 @@ static void acm_write_buffers_free(struct acm *acm) ...@@ -892,7 +892,7 @@ static void acm_write_buffers_free(struct acm *acm)
struct usb_device *usb_dev = interface_to_usbdev(acm->control); struct usb_device *usb_dev = interface_to_usbdev(acm->control);
for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++)
usb_buffer_free(usb_dev, acm->writesize, wb->buf, wb->dmah); usb_free_coherent(usb_dev, acm->writesize, wb->buf, wb->dmah);
} }
static void acm_read_buffers_free(struct acm *acm) static void acm_read_buffers_free(struct acm *acm)
...@@ -901,8 +901,8 @@ static void acm_read_buffers_free(struct acm *acm) ...@@ -901,8 +901,8 @@ static void acm_read_buffers_free(struct acm *acm)
int i, n = acm->rx_buflimit; int i, n = acm->rx_buflimit;
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
usb_buffer_free(usb_dev, acm->readsize, usb_free_coherent(usb_dev, acm->readsize,
acm->rb[i].base, acm->rb[i].dma); acm->rb[i].base, acm->rb[i].dma);
} }
/* Little helper: write buffers allocate */ /* Little helper: write buffers allocate */
...@@ -912,13 +912,13 @@ static int acm_write_buffers_alloc(struct acm *acm) ...@@ -912,13 +912,13 @@ static int acm_write_buffers_alloc(struct acm *acm)
struct acm_wb *wb; struct acm_wb *wb;
for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) { for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) {
wb->buf = usb_buffer_alloc(acm->dev, acm->writesize, GFP_KERNEL, wb->buf = usb_alloc_coherent(acm->dev, acm->writesize, GFP_KERNEL,
&wb->dmah); &wb->dmah);
if (!wb->buf) { if (!wb->buf) {
while (i != 0) { while (i != 0) {
--i; --i;
--wb; --wb;
usb_buffer_free(acm->dev, acm->writesize, usb_free_coherent(acm->dev, acm->writesize,
wb->buf, wb->dmah); wb->buf, wb->dmah);
} }
return -ENOMEM; return -ENOMEM;
...@@ -1177,7 +1177,7 @@ static int acm_probe(struct usb_interface *intf, ...@@ -1177,7 +1177,7 @@ static int acm_probe(struct usb_interface *intf,
tty_port_init(&acm->port); tty_port_init(&acm->port);
acm->port.ops = &acm_port_ops; acm->port.ops = &acm_port_ops;
buf = usb_buffer_alloc(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma); buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);
if (!buf) { if (!buf) {
dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)\n"); dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)\n");
goto alloc_fail2; goto alloc_fail2;
...@@ -1210,11 +1210,11 @@ static int acm_probe(struct usb_interface *intf, ...@@ -1210,11 +1210,11 @@ static int acm_probe(struct usb_interface *intf,
for (i = 0; i < num_rx_buf; i++) { for (i = 0; i < num_rx_buf; i++) {
struct acm_rb *rb = &(acm->rb[i]); struct acm_rb *rb = &(acm->rb[i]);
rb->base = usb_buffer_alloc(acm->dev, readsize, rb->base = usb_alloc_coherent(acm->dev, readsize,
GFP_KERNEL, &rb->dma); GFP_KERNEL, &rb->dma);
if (!rb->base) { if (!rb->base) {
dev_dbg(&intf->dev, dev_dbg(&intf->dev,
"out of memory (read bufs usb_buffer_alloc)\n"); "out of memory (read bufs usb_alloc_coherent)\n");
goto alloc_fail7; goto alloc_fail7;
} }
} }
...@@ -1306,7 +1306,7 @@ static int acm_probe(struct usb_interface *intf, ...@@ -1306,7 +1306,7 @@ static int acm_probe(struct usb_interface *intf,
alloc_fail5: alloc_fail5:
acm_write_buffers_free(acm); acm_write_buffers_free(acm);
alloc_fail4: alloc_fail4:
usb_buffer_free(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma); usb_free_coherent(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
alloc_fail2: alloc_fail2:
kfree(acm); kfree(acm);
alloc_fail: alloc_fail:
...@@ -1356,8 +1356,8 @@ static void acm_disconnect(struct usb_interface *intf) ...@@ -1356,8 +1356,8 @@ static void acm_disconnect(struct usb_interface *intf)
stop_data_traffic(acm); stop_data_traffic(acm);
acm_write_buffers_free(acm); acm_write_buffers_free(acm);
usb_buffer_free(usb_dev, acm->ctrlsize, acm->ctrl_buffer, usb_free_coherent(usb_dev, acm->ctrlsize, acm->ctrl_buffer,
acm->ctrl_dma); acm->ctrl_dma);
acm_read_buffers_free(acm); acm_read_buffers_free(acm);
if (!acm->combined_interfaces) if (!acm->combined_interfaces)
......
...@@ -124,8 +124,8 @@ struct acm { ...@@ -124,8 +124,8 @@ struct acm {
unsigned char clocal; /* termios CLOCAL */ unsigned char clocal; /* termios CLOCAL */
unsigned int ctrl_caps; /* control capabilities from the class specific header */ unsigned int ctrl_caps; /* control capabilities from the class specific header */
unsigned int susp_count; /* number of suspended interfaces */ unsigned int susp_count; /* number of suspended interfaces */
int combined_interfaces:1; /* control and data collapsed */ unsigned int combined_interfaces:1; /* control and data collapsed */
int is_int_ep:1; /* interrupt endpoints contrary to spec used */ unsigned int is_int_ep:1; /* interrupt endpoints contrary to spec used */
u8 bInterval; u8 bInterval;
struct acm_wb *delayed_wb; /* write queued for a device about to be woken */ struct acm_wb *delayed_wb; /* write queued for a device about to be woken */
}; };
......
...@@ -276,14 +276,14 @@ static void free_urbs(struct wdm_device *desc) ...@@ -276,14 +276,14 @@ static void free_urbs(struct wdm_device *desc)
static void cleanup(struct wdm_device *desc) static void cleanup(struct wdm_device *desc)
{ {
usb_buffer_free(interface_to_usbdev(desc->intf), usb_free_coherent(interface_to_usbdev(desc->intf),
desc->wMaxPacketSize, desc->wMaxPacketSize,
desc->sbuf, desc->sbuf,
desc->validity->transfer_dma); desc->validity->transfer_dma);
usb_buffer_free(interface_to_usbdev(desc->intf), usb_free_coherent(interface_to_usbdev(desc->intf),
desc->wMaxCommand, desc->wMaxCommand,
desc->inbuf, desc->inbuf,
desc->response->transfer_dma); desc->response->transfer_dma);
kfree(desc->orq); kfree(desc->orq);
kfree(desc->irq); kfree(desc->irq);
kfree(desc->ubuf); kfree(desc->ubuf);
...@@ -705,17 +705,17 @@ static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id) ...@@ -705,17 +705,17 @@ static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id)
if (!desc->ubuf) if (!desc->ubuf)
goto err; goto err;
desc->sbuf = usb_buffer_alloc(interface_to_usbdev(intf), desc->sbuf = usb_alloc_coherent(interface_to_usbdev(intf),
desc->wMaxPacketSize, desc->wMaxPacketSize,
GFP_KERNEL, GFP_KERNEL,
&desc->validity->transfer_dma); &desc->validity->transfer_dma);
if (!desc->sbuf) if (!desc->sbuf)
goto err; goto err;
desc->inbuf = usb_buffer_alloc(interface_to_usbdev(intf), desc->inbuf = usb_alloc_coherent(interface_to_usbdev(intf),
desc->bMaxPacketSize0, desc->bMaxPacketSize0,
GFP_KERNEL, GFP_KERNEL,
&desc->response->transfer_dma); &desc->response->transfer_dma);
if (!desc->inbuf) if (!desc->inbuf)
goto err2; goto err2;
...@@ -742,15 +742,15 @@ static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id) ...@@ -742,15 +742,15 @@ static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id)
return rv; return rv;
err3: err3:
usb_set_intfdata(intf, NULL); usb_set_intfdata(intf, NULL);
usb_buffer_free(interface_to_usbdev(desc->intf), usb_free_coherent(interface_to_usbdev(desc->intf),
desc->bMaxPacketSize0, desc->bMaxPacketSize0,
desc->inbuf, desc->inbuf,
desc->response->transfer_dma); desc->response->transfer_dma);
err2: err2:
usb_buffer_free(interface_to_usbdev(desc->intf), usb_free_coherent(interface_to_usbdev(desc->intf),
desc->wMaxPacketSize, desc->wMaxPacketSize,
desc->sbuf, desc->sbuf,
desc->validity->transfer_dma); desc->validity->transfer_dma);
err: err:
free_urbs(desc); free_urbs(desc);
kfree(desc->ubuf); kfree(desc->ubuf);
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
* v0.11 - add proto_bias option (Pete Zaitcev) * v0.11 - add proto_bias option (Pete Zaitcev)
* v0.12 - add hpoj.sourceforge.net ioctls (David Paschal) * v0.12 - add hpoj.sourceforge.net ioctls (David Paschal)
* v0.13 - alloc space for statusbuf (<status> not on stack); * v0.13 - alloc space for statusbuf (<status> not on stack);
* use usb_buffer_alloc() for read buf & write buf; * use usb_alloc_coherent() for read buf & write buf;
* none - Maintained in Linux kernel after v0.13 * none - Maintained in Linux kernel after v0.13
*/ */
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/dmapool.h> #include <linux/dmapool.h>
#include <linux/usb.h> #include <linux/usb.h>
#include "hcd.h" #include <linux/usb/hcd.h>
/* /*
......
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/usb/ch9.h> #include <linux/usb/ch9.h>
#include <linux/usb/hcd.h>
#include <linux/usb/quirks.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/device.h> #include <linux/device.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include "usb.h" #include "usb.h"
#include "hcd.h"
#define USB_MAXALTSETTING 128 /* Hard limit */ #define USB_MAXALTSETTING 128 /* Hard limit */
#define USB_MAXENDPOINTS 30 /* Hard limit */ #define USB_MAXENDPOINTS 30 /* Hard limit */
...@@ -19,32 +21,6 @@ static inline const char *plural(int n) ...@@ -19,32 +21,6 @@ static inline const char *plural(int n)
return (n == 1 ? "" : "s"); return (n == 1 ? "" : "s");
} }
/* FIXME: this is a kludge */
static int find_next_descriptor_more(unsigned char *buffer, int size,
int dt1, int dt2, int dt3, int *num_skipped)
{
struct usb_descriptor_header *h;
int n = 0;
unsigned char *buffer0 = buffer;
/* Find the next descriptor of type dt1 or dt2 or dt3 */
while (size > 0) {
h = (struct usb_descriptor_header *) buffer;
if (h->bDescriptorType == dt1 || h->bDescriptorType == dt2 ||
h->bDescriptorType == dt3)
break;
buffer += h->bLength;
size -= h->bLength;
++n;
}
/* Store the number of descriptors skipped and return the
* number of bytes skipped */
if (num_skipped)
*num_skipped = n;
return buffer - buffer0;
}
static int find_next_descriptor(unsigned char *buffer, int size, static int find_next_descriptor(unsigned char *buffer, int size,
int dt1, int dt2, int *num_skipped) int dt1, int dt2, int *num_skipped)
{ {
...@@ -69,47 +45,41 @@ static int find_next_descriptor(unsigned char *buffer, int size, ...@@ -69,47 +45,41 @@ static int find_next_descriptor(unsigned char *buffer, int size,
return buffer - buffer0; return buffer - buffer0;
} }
static int usb_parse_ss_endpoint_companion(struct device *ddev, int cfgno, static void usb_parse_ss_endpoint_companion(struct device *ddev, int cfgno,
int inum, int asnum, struct usb_host_endpoint *ep, int inum, int asnum, struct usb_host_endpoint *ep,
int num_ep, unsigned char *buffer, int size) unsigned char *buffer, int size)
{ {
unsigned char *buffer_start = buffer; struct usb_ss_ep_comp_descriptor *desc;
struct usb_ss_ep_comp_descriptor *desc;
int retval;
int num_skipped;
int max_tx; int max_tx;
int i;
/* The SuperSpeed endpoint companion descriptor is supposed to
* be the first thing immediately following the endpoint descriptor.
*/
desc = (struct usb_ss_ep_comp_descriptor *) buffer; desc = (struct usb_ss_ep_comp_descriptor *) buffer;
if (desc->bDescriptorType != USB_DT_SS_ENDPOINT_COMP) { if (desc->bDescriptorType != USB_DT_SS_ENDPOINT_COMP ||
size < USB_DT_SS_EP_COMP_SIZE) {
dev_warn(ddev, "No SuperSpeed endpoint companion for config %d " dev_warn(ddev, "No SuperSpeed endpoint companion for config %d "
" interface %d altsetting %d ep %d: " " interface %d altsetting %d ep %d: "
"using minimum values\n", "using minimum values\n",
cfgno, inum, asnum, ep->desc.bEndpointAddress); cfgno, inum, asnum, ep->desc.bEndpointAddress);
/*
* The next descriptor is for an Endpoint or Interface, /* Fill in some default values.
* no extra descriptors to copy into the companion structure, * Leave bmAttributes as zero, which will mean no streams for
* and we didn't eat up any of the buffer. * bulk, and isoc won't support multiple bursts of packets.
* With bursts of only one packet, and a Mult of 1, the max
* amount of data moved per endpoint service interval is one
* packet.
*/ */
return 0; ep->ss_ep_comp.bLength = USB_DT_SS_EP_COMP_SIZE;
ep->ss_ep_comp.bDescriptorType = USB_DT_SS_ENDPOINT_COMP;
if (usb_endpoint_xfer_isoc(&ep->desc) ||
usb_endpoint_xfer_int(&ep->desc))
ep->ss_ep_comp.wBytesPerInterval =
ep->desc.wMaxPacketSize;
return;
} }
memcpy(&ep->ss_ep_comp->desc, desc, USB_DT_SS_EP_COMP_SIZE);
desc = &ep->ss_ep_comp->desc;
buffer += desc->bLength;
size -= desc->bLength;
/* Eat up the other descriptors we don't care about */ memcpy(&ep->ss_ep_comp, desc, USB_DT_SS_EP_COMP_SIZE);
ep->ss_ep_comp->extra = buffer;
i = find_next_descriptor(buffer, size, USB_DT_ENDPOINT,
USB_DT_INTERFACE, &num_skipped);
ep->ss_ep_comp->extralen = i;
buffer += i;
size -= i;
retval = buffer - buffer_start;
if (num_skipped > 0)
dev_dbg(ddev, "skipped %d descriptor%s after %s\n",
num_skipped, plural(num_skipped),
"SuperSpeed endpoint companion");
/* Check the various values */ /* Check the various values */
if (usb_endpoint_xfer_control(&ep->desc) && desc->bMaxBurst != 0) { if (usb_endpoint_xfer_control(&ep->desc) && desc->bMaxBurst != 0) {
...@@ -117,47 +87,48 @@ static int usb_parse_ss_endpoint_companion(struct device *ddev, int cfgno, ...@@ -117,47 +87,48 @@ static int usb_parse_ss_endpoint_companion(struct device *ddev, int cfgno,
"config %d interface %d altsetting %d ep %d: " "config %d interface %d altsetting %d ep %d: "
"setting to zero\n", desc->bMaxBurst, "setting to zero\n", desc->bMaxBurst,
cfgno, inum, asnum, ep->desc.bEndpointAddress); cfgno, inum, asnum, ep->desc.bEndpointAddress);
desc->bMaxBurst = 0; ep->ss_ep_comp.bMaxBurst = 0;
} } else if (desc->bMaxBurst > 15) {
if (desc->bMaxBurst > 15) {
dev_warn(ddev, "Endpoint with bMaxBurst = %d in " dev_warn(ddev, "Endpoint with bMaxBurst = %d in "
"config %d interface %d altsetting %d ep %d: " "config %d interface %d altsetting %d ep %d: "
"setting to 15\n", desc->bMaxBurst, "setting to 15\n", desc->bMaxBurst,
cfgno, inum, asnum, ep->desc.bEndpointAddress); cfgno, inum, asnum, ep->desc.bEndpointAddress);
desc->bMaxBurst = 15; ep->ss_ep_comp.bMaxBurst = 15;
} }
if ((usb_endpoint_xfer_control(&ep->desc) || usb_endpoint_xfer_int(&ep->desc))
&& desc->bmAttributes != 0) { if ((usb_endpoint_xfer_control(&ep->desc) ||
usb_endpoint_xfer_int(&ep->desc)) &&
desc->bmAttributes != 0) {
dev_warn(ddev, "%s endpoint with bmAttributes = %d in " dev_warn(ddev, "%s endpoint with bmAttributes = %d in "
"config %d interface %d altsetting %d ep %d: " "config %d interface %d altsetting %d ep %d: "
"setting to zero\n", "setting to zero\n",
usb_endpoint_xfer_control(&ep->desc) ? "Control" : "Bulk", usb_endpoint_xfer_control(&ep->desc) ? "Control" : "Bulk",
desc->bmAttributes, desc->bmAttributes,
cfgno, inum, asnum, ep->desc.bEndpointAddress); cfgno, inum, asnum, ep->desc.bEndpointAddress);
desc->bmAttributes = 0; ep->ss_ep_comp.bmAttributes = 0;
} } else if (usb_endpoint_xfer_bulk(&ep->desc) &&
if (usb_endpoint_xfer_bulk(&ep->desc) && desc->bmAttributes > 16) { desc->bmAttributes > 16) {
dev_warn(ddev, "Bulk endpoint with more than 65536 streams in " dev_warn(ddev, "Bulk endpoint with more than 65536 streams in "
"config %d interface %d altsetting %d ep %d: " "config %d interface %d altsetting %d ep %d: "
"setting to max\n", "setting to max\n",
cfgno, inum, asnum, ep->desc.bEndpointAddress); cfgno, inum, asnum, ep->desc.bEndpointAddress);
desc->bmAttributes = 16; ep->ss_ep_comp.bmAttributes = 16;
} } else if (usb_endpoint_xfer_isoc(&ep->desc) &&
if (usb_endpoint_xfer_isoc(&ep->desc) && desc->bmAttributes > 2) { desc->bmAttributes > 2) {
dev_warn(ddev, "Isoc endpoint has Mult of %d in " dev_warn(ddev, "Isoc endpoint has Mult of %d in "
"config %d interface %d altsetting %d ep %d: " "config %d interface %d altsetting %d ep %d: "
"setting to 3\n", desc->bmAttributes + 1, "setting to 3\n", desc->bmAttributes + 1,
cfgno, inum, asnum, ep->desc.bEndpointAddress); cfgno, inum, asnum, ep->desc.bEndpointAddress);
desc->bmAttributes = 2; ep->ss_ep_comp.bmAttributes = 2;
} }
if (usb_endpoint_xfer_isoc(&ep->desc)) {
if (usb_endpoint_xfer_isoc(&ep->desc))
max_tx = ep->desc.wMaxPacketSize * (desc->bMaxBurst + 1) * max_tx = ep->desc.wMaxPacketSize * (desc->bMaxBurst + 1) *
(desc->bmAttributes + 1); (desc->bmAttributes + 1);
} else if (usb_endpoint_xfer_int(&ep->desc)) { else if (usb_endpoint_xfer_int(&ep->desc))
max_tx = ep->desc.wMaxPacketSize * (desc->bMaxBurst + 1); max_tx = ep->desc.wMaxPacketSize * (desc->bMaxBurst + 1);
} else { else
goto valid; max_tx = 999999;
}
if (desc->wBytesPerInterval > max_tx) { if (desc->wBytesPerInterval > max_tx) {
dev_warn(ddev, "%s endpoint with wBytesPerInterval of %d in " dev_warn(ddev, "%s endpoint with wBytesPerInterval of %d in "
"config %d interface %d altsetting %d ep %d: " "config %d interface %d altsetting %d ep %d: "
...@@ -166,10 +137,8 @@ static int usb_parse_ss_endpoint_companion(struct device *ddev, int cfgno, ...@@ -166,10 +137,8 @@ static int usb_parse_ss_endpoint_companion(struct device *ddev, int cfgno,
desc->wBytesPerInterval, desc->wBytesPerInterval,
cfgno, inum, asnum, ep->desc.bEndpointAddress, cfgno, inum, asnum, ep->desc.bEndpointAddress,
max_tx); max_tx);
desc->wBytesPerInterval = max_tx; ep->ss_ep_comp.wBytesPerInterval = max_tx;
} }
valid:
return retval;
} }
static int usb_parse_endpoint(struct device *ddev, int cfgno, int inum, static int usb_parse_endpoint(struct device *ddev, int cfgno, int inum,
...@@ -291,61 +260,19 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, int inum, ...@@ -291,61 +260,19 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, int inum,
cfgno, inum, asnum, d->bEndpointAddress, cfgno, inum, asnum, d->bEndpointAddress,
maxp); maxp);
} }
/* Allocate room for and parse any SS endpoint companion descriptors */
if (to_usb_device(ddev)->speed == USB_SPEED_SUPER) {
endpoint->extra = buffer;
i = find_next_descriptor_more(buffer, size, USB_DT_SS_ENDPOINT_COMP,
USB_DT_ENDPOINT, USB_DT_INTERFACE, &n);
endpoint->extralen = i;
buffer += i;
size -= i;
/* Allocate space for the SS endpoint companion descriptor */
endpoint->ss_ep_comp = kzalloc(sizeof(struct usb_host_ss_ep_comp),
GFP_KERNEL);
if (!endpoint->ss_ep_comp)
return -ENOMEM;
/* Fill in some default values (may be overwritten later) */ /* Parse a possible SuperSpeed endpoint companion descriptor */
endpoint->ss_ep_comp->desc.bLength = USB_DT_SS_EP_COMP_SIZE; if (to_usb_device(ddev)->speed == USB_SPEED_SUPER)
endpoint->ss_ep_comp->desc.bDescriptorType = USB_DT_SS_ENDPOINT_COMP; usb_parse_ss_endpoint_companion(ddev, cfgno,
endpoint->ss_ep_comp->desc.bMaxBurst = 0; inum, asnum, endpoint, buffer, size);
/*
* Leave bmAttributes as zero, which will mean no streams for /* Skip over any Class Specific or Vendor Specific descriptors;
* bulk, and isoc won't support multiple bursts of packets. * find the next endpoint or interface descriptor */
* With bursts of only one packet, and a Mult of 1, the max endpoint->extra = buffer;
* amount of data moved per endpoint service interval is one i = find_next_descriptor(buffer, size, USB_DT_ENDPOINT,
* packet. USB_DT_INTERFACE, &n);
*/ endpoint->extralen = i;
if (usb_endpoint_xfer_isoc(&endpoint->desc) || retval = buffer - buffer0 + i;
usb_endpoint_xfer_int(&endpoint->desc))
endpoint->ss_ep_comp->desc.wBytesPerInterval =
endpoint->desc.wMaxPacketSize;
if (size > 0) {
retval = usb_parse_ss_endpoint_companion(ddev, cfgno,
inum, asnum, endpoint, num_ep, buffer,
size);
if (retval >= 0) {
buffer += retval;
retval = buffer - buffer0;
}
} else {
dev_warn(ddev, "config %d interface %d altsetting %d "
"endpoint 0x%X has no "
"SuperSpeed companion descriptor\n",
cfgno, inum, asnum, d->bEndpointAddress);
retval = buffer - buffer0;
}
} else {
/* Skip over any Class Specific or Vendor Specific descriptors;
* find the next endpoint or interface descriptor */
endpoint->extra = buffer;
i = find_next_descriptor(buffer, size, USB_DT_ENDPOINT,
USB_DT_INTERFACE, &n);
endpoint->extralen = i;
retval = buffer - buffer0 + i;
}
if (n > 0) if (n > 0)
dev_dbg(ddev, "skipped %d descriptor%s after %s\n", dev_dbg(ddev, "skipped %d descriptor%s after %s\n",
n, plural(n), "endpoint"); n, plural(n), "endpoint");
...@@ -478,9 +405,10 @@ static int usb_parse_interface(struct device *ddev, int cfgno, ...@@ -478,9 +405,10 @@ static int usb_parse_interface(struct device *ddev, int cfgno,
return buffer - buffer0 + i; return buffer - buffer0 + i;
} }
static int usb_parse_configuration(struct device *ddev, int cfgidx, static int usb_parse_configuration(struct usb_device *dev, int cfgidx,
struct usb_host_config *config, unsigned char *buffer, int size) struct usb_host_config *config, unsigned char *buffer, int size)
{ {
struct device *ddev = &dev->dev;
unsigned char *buffer0 = buffer; unsigned char *buffer0 = buffer;
int cfgno; int cfgno;
int nintf, nintf_orig; int nintf, nintf_orig;
...@@ -549,6 +477,16 @@ static int usb_parse_configuration(struct device *ddev, int cfgidx, ...@@ -549,6 +477,16 @@ static int usb_parse_configuration(struct device *ddev, int cfgidx,
} }
inum = d->bInterfaceNumber; inum = d->bInterfaceNumber;
if ((dev->quirks & USB_QUIRK_HONOR_BNUMINTERFACES) &&
n >= nintf_orig) {
dev_warn(ddev, "config %d has more interface "
"descriptors, than it declares in "
"bNumInterfaces, ignoring interface "
"number: %d\n", cfgno, inum);
continue;
}
if (inum >= nintf_orig) if (inum >= nintf_orig)
dev_warn(ddev, "config %d has an invalid " dev_warn(ddev, "config %d has an invalid "
"interface number: %d but max is %d\n", "interface number: %d but max is %d\n",
...@@ -722,7 +660,6 @@ int usb_get_configuration(struct usb_device *dev) ...@@ -722,7 +660,6 @@ int usb_get_configuration(struct usb_device *dev)
int ncfg = dev->descriptor.bNumConfigurations; int ncfg = dev->descriptor.bNumConfigurations;
int result = 0; int result = 0;
unsigned int cfgno, length; unsigned int cfgno, length;
unsigned char *buffer;
unsigned char *bigbuffer; unsigned char *bigbuffer;
struct usb_config_descriptor *desc; struct usb_config_descriptor *desc;
...@@ -751,17 +688,16 @@ int usb_get_configuration(struct usb_device *dev) ...@@ -751,17 +688,16 @@ int usb_get_configuration(struct usb_device *dev)
if (!dev->rawdescriptors) if (!dev->rawdescriptors)
goto err2; goto err2;
buffer = kmalloc(USB_DT_CONFIG_SIZE, GFP_KERNEL); desc = kmalloc(USB_DT_CONFIG_SIZE, GFP_KERNEL);
if (!buffer) if (!desc)
goto err2; goto err2;
desc = (struct usb_config_descriptor *)buffer;
result = 0; result = 0;
for (; cfgno < ncfg; cfgno++) { for (; cfgno < ncfg; cfgno++) {
/* We grab just the first descriptor so we know how long /* We grab just the first descriptor so we know how long
* the whole configuration is */ * the whole configuration is */
result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno,
buffer, USB_DT_CONFIG_SIZE); desc, USB_DT_CONFIG_SIZE);
if (result < 0) { if (result < 0) {
dev_err(ddev, "unable to read config index %d " dev_err(ddev, "unable to read config index %d "
"descriptor/%s: %d\n", cfgno, "start", result); "descriptor/%s: %d\n", cfgno, "start", result);
...@@ -800,7 +736,7 @@ int usb_get_configuration(struct usb_device *dev) ...@@ -800,7 +736,7 @@ int usb_get_configuration(struct usb_device *dev)
dev->rawdescriptors[cfgno] = bigbuffer; dev->rawdescriptors[cfgno] = bigbuffer;
result = usb_parse_configuration(&dev->dev, cfgno, result = usb_parse_configuration(dev, cfgno,
&dev->config[cfgno], bigbuffer, length); &dev->config[cfgno], bigbuffer, length);
if (result < 0) { if (result < 0) {
++cfgno; ++cfgno;
...@@ -810,7 +746,7 @@ int usb_get_configuration(struct usb_device *dev) ...@@ -810,7 +746,7 @@ int usb_get_configuration(struct usb_device *dev)
result = 0; result = 0;
err: err:
kfree(buffer); kfree(desc);
out_not_authorized: out_not_authorized:
dev->descriptor.bNumConfigurations = cfgno; dev->descriptor.bNumConfigurations = cfgno;
err2: err2:
......
/* /*
* devices.c * devices.c
* (C) Copyright 1999 Randy Dunlap. * (C) Copyright 1999 Randy Dunlap.
* (C) Copyright 1999,2000 Thomas Sailer <sailer@ife.ee.ethz.ch>. (proc file per device) * (C) Copyright 1999,2000 Thomas Sailer <sailer@ife.ee.ethz.ch>.
* (proc file per device)
* (C) Copyright 1999 Deti Fliegl (new USB architecture) * (C) Copyright 1999 Deti Fliegl (new USB architecture)
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -55,11 +56,11 @@ ...@@ -55,11 +56,11 @@
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/smp_lock.h> #include <linux/smp_lock.h>
#include <linux/usbdevice_fs.h> #include <linux/usbdevice_fs.h>
#include <linux/usb/hcd.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <asm/uaccess.h> #include <linux/uaccess.h>
#include "usb.h" #include "usb.h"
#include "hcd.h"
/* Define ALLOW_SERIAL_NUMBER if you want to see the serial number of devices */ /* Define ALLOW_SERIAL_NUMBER if you want to see the serial number of devices */
#define ALLOW_SERIAL_NUMBER #define ALLOW_SERIAL_NUMBER
...@@ -138,8 +139,8 @@ struct class_info { ...@@ -138,8 +139,8 @@ struct class_info {
char *class_name; char *class_name;
}; };
static const struct class_info clas_info[] = static const struct class_info clas_info[] = {
{ /* max. 5 chars. per name string */ /* max. 5 chars. per name string */
{USB_CLASS_PER_INTERFACE, ">ifc"}, {USB_CLASS_PER_INTERFACE, ">ifc"},
{USB_CLASS_AUDIO, "audio"}, {USB_CLASS_AUDIO, "audio"},
{USB_CLASS_COMM, "comm."}, {USB_CLASS_COMM, "comm."},
...@@ -191,8 +192,10 @@ static char *usb_dump_endpoint_descriptor(int speed, char *start, char *end, ...@@ -191,8 +192,10 @@ static char *usb_dump_endpoint_descriptor(int speed, char *start, char *end,
if (speed == USB_SPEED_HIGH) { if (speed == USB_SPEED_HIGH) {
switch (le16_to_cpu(desc->wMaxPacketSize) & (0x03 << 11)) { switch (le16_to_cpu(desc->wMaxPacketSize) & (0x03 << 11)) {
case 1 << 11: bandwidth = 2; break; case 1 << 11:
case 2 << 11: bandwidth = 3; break; bandwidth = 2; break;
case 2 << 11:
bandwidth = 3; break;
} }
} }
...@@ -200,7 +203,7 @@ static char *usb_dump_endpoint_descriptor(int speed, char *start, char *end, ...@@ -200,7 +203,7 @@ static char *usb_dump_endpoint_descriptor(int speed, char *start, char *end,
switch (usb_endpoint_type(desc)) { switch (usb_endpoint_type(desc)) {
case USB_ENDPOINT_XFER_CONTROL: case USB_ENDPOINT_XFER_CONTROL:
type = "Ctrl"; type = "Ctrl";
if (speed == USB_SPEED_HIGH) /* uframes per NAK */ if (speed == USB_SPEED_HIGH) /* uframes per NAK */
interval = desc->bInterval; interval = desc->bInterval;
else else
interval = 0; interval = 0;
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/usbdevice_fs.h> #include <linux/usbdevice_fs.h>
#include <linux/usb/hcd.h> /* for usbcore internals */
#include <linux/cdev.h> #include <linux/cdev.h>
#include <linux/notifier.h> #include <linux/notifier.h>
#include <linux/security.h> #include <linux/security.h>
...@@ -50,9 +51,7 @@ ...@@ -50,9 +51,7 @@
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include "hcd.h" /* for usbcore internals */
#include "usb.h" #include "usb.h"
#include "hub.h"
#define USB_MAXBUS 64 #define USB_MAXBUS 64
#define USB_DEVICE_MAX USB_MAXBUS * 128 #define USB_DEVICE_MAX USB_MAXBUS * 128
......
...@@ -26,8 +26,9 @@ ...@@ -26,8 +26,9 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/usb/quirks.h> #include <linux/usb/quirks.h>
#include <linux/usb/hcd.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include "hcd.h"
#include "usb.h" #include "usb.h"
...@@ -333,7 +334,8 @@ static int usb_probe_interface(struct device *dev) ...@@ -333,7 +334,8 @@ static int usb_probe_interface(struct device *dev)
usb_cancel_queued_reset(intf); usb_cancel_queued_reset(intf);
/* Unbound interfaces are always runtime-PM-disabled and -suspended */ /* Unbound interfaces are always runtime-PM-disabled and -suspended */
pm_runtime_disable(dev); if (driver->supports_autosuspend)
pm_runtime_disable(dev);
pm_runtime_set_suspended(dev); pm_runtime_set_suspended(dev);
usb_autosuspend_device(udev); usb_autosuspend_device(udev);
...@@ -388,7 +390,8 @@ static int usb_unbind_interface(struct device *dev) ...@@ -388,7 +390,8 @@ static int usb_unbind_interface(struct device *dev)
intf->needs_remote_wakeup = 0; intf->needs_remote_wakeup = 0;
/* Unbound interfaces are always runtime-PM-disabled and -suspended */ /* Unbound interfaces are always runtime-PM-disabled and -suspended */
pm_runtime_disable(dev); if (driver->supports_autosuspend)
pm_runtime_disable(dev);
pm_runtime_set_suspended(dev); pm_runtime_set_suspended(dev);
/* Undo any residual pm_autopm_get_interface_* calls */ /* Undo any residual pm_autopm_get_interface_* calls */
...@@ -437,14 +440,17 @@ int usb_driver_claim_interface(struct usb_driver *driver, ...@@ -437,14 +440,17 @@ int usb_driver_claim_interface(struct usb_driver *driver,
iface->condition = USB_INTERFACE_BOUND; iface->condition = USB_INTERFACE_BOUND;
/* Claimed interfaces are initially inactive (suspended). They are /* Claimed interfaces are initially inactive (suspended) and
* runtime-PM-enabled only if the driver has autosuspend support. * runtime-PM-enabled, but only if the driver has autosuspend
* They are sensitive to their children's power states. * support. Otherwise they are marked active, to prevent the
* device from being autosuspended, but left disabled. In either
* case they are sensitive to their children's power states.
*/ */
pm_runtime_set_suspended(dev);
pm_suspend_ignore_children(dev, false); pm_suspend_ignore_children(dev, false);
if (driver->supports_autosuspend) if (driver->supports_autosuspend)
pm_runtime_enable(dev); pm_runtime_enable(dev);
else
pm_runtime_set_active(dev);
/* if interface was already added, bind now; else let /* if interface was already added, bind now; else let
* the future device_add() bind it, bypassing probe() * the future device_add() bind it, bypassing probe()
...@@ -1355,13 +1361,9 @@ int usb_resume(struct device *dev, pm_message_t msg) ...@@ -1355,13 +1361,9 @@ int usb_resume(struct device *dev, pm_message_t msg)
* *
* The caller must hold @udev's device lock. * The caller must hold @udev's device lock.
*/ */
int usb_enable_autosuspend(struct usb_device *udev) void usb_enable_autosuspend(struct usb_device *udev)
{ {
if (udev->autosuspend_disabled) { pm_runtime_allow(&udev->dev);
udev->autosuspend_disabled = 0;
usb_autosuspend_device(udev);
}
return 0;
} }
EXPORT_SYMBOL_GPL(usb_enable_autosuspend); EXPORT_SYMBOL_GPL(usb_enable_autosuspend);
...@@ -1374,16 +1376,9 @@ EXPORT_SYMBOL_GPL(usb_enable_autosuspend); ...@@ -1374,16 +1376,9 @@ EXPORT_SYMBOL_GPL(usb_enable_autosuspend);
* *
* The caller must hold @udev's device lock. * The caller must hold @udev's device lock.
*/ */
int usb_disable_autosuspend(struct usb_device *udev) void usb_disable_autosuspend(struct usb_device *udev)
{ {
int rc = 0; pm_runtime_forbid(&udev->dev);
if (!udev->autosuspend_disabled) {
rc = usb_autoresume_device(udev);
if (rc == 0)
udev->autosuspend_disabled = 1;
}
return rc;
} }
EXPORT_SYMBOL_GPL(usb_disable_autosuspend); EXPORT_SYMBOL_GPL(usb_disable_autosuspend);
...@@ -1485,9 +1480,6 @@ int usb_autoresume_device(struct usb_device *udev) ...@@ -1485,9 +1480,6 @@ int usb_autoresume_device(struct usb_device *udev)
* 0, a delayed autosuspend request for @intf's device is attempted. The * 0, a delayed autosuspend request for @intf's device is attempted. The
* attempt may fail (see autosuspend_check()). * attempt may fail (see autosuspend_check()).
* *
* If the driver has set @intf->needs_remote_wakeup then autosuspend will
* take place only if the device's remote-wakeup facility is enabled.
*
* This routine can run only in process context. * This routine can run only in process context.
*/ */
void usb_autopm_put_interface(struct usb_interface *intf) void usb_autopm_put_interface(struct usb_interface *intf)
...@@ -1530,7 +1522,7 @@ void usb_autopm_put_interface_async(struct usb_interface *intf) ...@@ -1530,7 +1522,7 @@ void usb_autopm_put_interface_async(struct usb_interface *intf)
atomic_dec(&intf->pm_usage_cnt); atomic_dec(&intf->pm_usage_cnt);
pm_runtime_put_noidle(&intf->dev); pm_runtime_put_noidle(&intf->dev);
if (!udev->autosuspend_disabled) { if (udev->dev.power.runtime_auto) {
/* Optimization: Don't schedule a delayed autosuspend if /* Optimization: Don't schedule a delayed autosuspend if
* the timer is already running and the expiration time * the timer is already running and the expiration time
* wouldn't change. * wouldn't change.
...@@ -1672,14 +1664,14 @@ EXPORT_SYMBOL_GPL(usb_autopm_get_interface_no_resume); ...@@ -1672,14 +1664,14 @@ EXPORT_SYMBOL_GPL(usb_autopm_get_interface_no_resume);
/* Internal routine to check whether we may autosuspend a device. */ /* Internal routine to check whether we may autosuspend a device. */
static int autosuspend_check(struct usb_device *udev) static int autosuspend_check(struct usb_device *udev)
{ {
int i; int w, i;
struct usb_interface *intf; struct usb_interface *intf;
unsigned long suspend_time, j; unsigned long suspend_time, j;
/* Fail if autosuspend is disabled, or any interfaces are in use, or /* Fail if autosuspend is disabled, or any interfaces are in use, or
* any interface drivers require remote wakeup but it isn't available. * any interface drivers require remote wakeup but it isn't available.
*/ */
udev->do_remote_wakeup = device_may_wakeup(&udev->dev); w = 0;
if (udev->actconfig) { if (udev->actconfig) {
for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) {
intf = udev->actconfig->interface[i]; intf = udev->actconfig->interface[i];
...@@ -1693,12 +1685,7 @@ static int autosuspend_check(struct usb_device *udev) ...@@ -1693,12 +1685,7 @@ static int autosuspend_check(struct usb_device *udev)
continue; continue;
if (atomic_read(&intf->dev.power.usage_count) > 0) if (atomic_read(&intf->dev.power.usage_count) > 0)
return -EBUSY; return -EBUSY;
if (intf->needs_remote_wakeup && w |= intf->needs_remote_wakeup;
!udev->do_remote_wakeup) {
dev_dbg(&udev->dev, "remote wakeup needed "
"for autosuspend\n");
return -EOPNOTSUPP;
}
/* Don't allow autosuspend if the device will need /* Don't allow autosuspend if the device will need
* a reset-resume and any of its interface drivers * a reset-resume and any of its interface drivers
...@@ -1714,6 +1701,11 @@ static int autosuspend_check(struct usb_device *udev) ...@@ -1714,6 +1701,11 @@ static int autosuspend_check(struct usb_device *udev)
} }
} }
} }
if (w && !device_can_wakeup(&udev->dev)) {
dev_dbg(&udev->dev, "remote wakeup needed for autosuspend\n");
return -EOPNOTSUPP;
}
udev->do_remote_wakeup = w;
/* If everything is okay but the device hasn't been idle for long /* If everything is okay but the device hasn't been idle for long
* enough, queue a delayed autosuspend request. * enough, queue a delayed autosuspend request.
......
...@@ -18,8 +18,8 @@ ...@@ -18,8 +18,8 @@
*/ */
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/usb/hcd.h>
#include "usb.h" #include "usb.h"
#include "hcd.h"
static inline const char *plural(int n) static inline const char *plural(int n)
{ {
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/usb/hcd.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/irq.h> #include <asm/irq.h>
...@@ -33,7 +34,6 @@ ...@@ -33,7 +34,6 @@
#endif #endif
#include "usb.h" #include "usb.h"
#include "hcd.h"
/* PCI-based HCs are common, but plenty of non-PCI HCs are used too */ /* PCI-based HCs are common, but plenty of non-PCI HCs are used too */
......
...@@ -38,14 +38,12 @@ ...@@ -38,14 +38,12 @@
#include <asm/unaligned.h> #include <asm/unaligned.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/mutex.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/usb/hcd.h>
#include "usb.h" #include "usb.h"
#include "hcd.h"
#include "hub.h"
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
...@@ -1261,6 +1259,51 @@ static void hcd_free_coherent(struct usb_bus *bus, dma_addr_t *dma_handle, ...@@ -1261,6 +1259,51 @@ static void hcd_free_coherent(struct usb_bus *bus, dma_addr_t *dma_handle,
*dma_handle = 0; *dma_handle = 0;
} }
static void unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)
{
enum dma_data_direction dir;
if (urb->transfer_flags & URB_SETUP_MAP_SINGLE)
dma_unmap_single(hcd->self.controller,
urb->setup_dma,
sizeof(struct usb_ctrlrequest),
DMA_TO_DEVICE);
else if (urb->transfer_flags & URB_SETUP_MAP_LOCAL)
hcd_free_coherent(urb->dev->bus,
&urb->setup_dma,
(void **) &urb->setup_packet,
sizeof(struct usb_ctrlrequest),
DMA_TO_DEVICE);
dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
if (urb->transfer_flags & URB_DMA_MAP_SG)
dma_unmap_sg(hcd->self.controller,
urb->sg,
urb->num_sgs,
dir);
else if (urb->transfer_flags & URB_DMA_MAP_PAGE)
dma_unmap_page(hcd->self.controller,
urb->transfer_dma,
urb->transfer_buffer_length,
dir);
else if (urb->transfer_flags & URB_DMA_MAP_SINGLE)
dma_unmap_single(hcd->self.controller,
urb->transfer_dma,
urb->transfer_buffer_length,
dir);
else if (urb->transfer_flags & URB_MAP_LOCAL)
hcd_free_coherent(urb->dev->bus,
&urb->transfer_dma,
&urb->transfer_buffer,
urb->transfer_buffer_length,
dir);
/* Make it safe to call this routine more than once */
urb->transfer_flags &= ~(URB_SETUP_MAP_SINGLE | URB_SETUP_MAP_LOCAL |
URB_DMA_MAP_SG | URB_DMA_MAP_PAGE |
URB_DMA_MAP_SINGLE | URB_MAP_LOCAL);
}
static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
gfp_t mem_flags) gfp_t mem_flags)
{ {
...@@ -1272,11 +1315,8 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, ...@@ -1272,11 +1315,8 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
* unless it uses pio or talks to another transport, * unless it uses pio or talks to another transport,
* or uses the provided scatter gather list for bulk. * or uses the provided scatter gather list for bulk.
*/ */
if (is_root_hub(urb->dev))
return 0;
if (usb_endpoint_xfer_control(&urb->ep->desc) if (usb_endpoint_xfer_control(&urb->ep->desc)) {
&& !(urb->transfer_flags & URB_NO_SETUP_DMA_MAP)) {
if (hcd->self.uses_dma) { if (hcd->self.uses_dma) {
urb->setup_dma = dma_map_single( urb->setup_dma = dma_map_single(
hcd->self.controller, hcd->self.controller,
...@@ -1286,27 +1326,64 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, ...@@ -1286,27 +1326,64 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
if (dma_mapping_error(hcd->self.controller, if (dma_mapping_error(hcd->self.controller,
urb->setup_dma)) urb->setup_dma))
return -EAGAIN; return -EAGAIN;
} else if (hcd->driver->flags & HCD_LOCAL_MEM) urb->transfer_flags |= URB_SETUP_MAP_SINGLE;
} else if (hcd->driver->flags & HCD_LOCAL_MEM) {
ret = hcd_alloc_coherent( ret = hcd_alloc_coherent(
urb->dev->bus, mem_flags, urb->dev->bus, mem_flags,
&urb->setup_dma, &urb->setup_dma,
(void **)&urb->setup_packet, (void **)&urb->setup_packet,
sizeof(struct usb_ctrlrequest), sizeof(struct usb_ctrlrequest),
DMA_TO_DEVICE); DMA_TO_DEVICE);
if (ret)
return ret;
urb->transfer_flags |= URB_SETUP_MAP_LOCAL;
}
} }
dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
if (ret == 0 && urb->transfer_buffer_length != 0 if (urb->transfer_buffer_length != 0
&& !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP)) { && !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP)) {
if (hcd->self.uses_dma) { if (hcd->self.uses_dma) {
urb->transfer_dma = dma_map_single ( if (urb->num_sgs) {
hcd->self.controller, int n = dma_map_sg(
urb->transfer_buffer, hcd->self.controller,
urb->transfer_buffer_length, urb->sg,
dir); urb->num_sgs,
if (dma_mapping_error(hcd->self.controller, dir);
if (n <= 0)
ret = -EAGAIN;
else
urb->transfer_flags |= URB_DMA_MAP_SG;
if (n != urb->num_sgs) {
urb->num_sgs = n;
urb->transfer_flags |=
URB_DMA_SG_COMBINED;
}
} else if (urb->sg) {
struct scatterlist *sg = urb->sg;
urb->transfer_dma = dma_map_page(
hcd->self.controller,
sg_page(sg),
sg->offset,
urb->transfer_buffer_length,
dir);
if (dma_mapping_error(hcd->self.controller,
urb->transfer_dma)) urb->transfer_dma))
return -EAGAIN; ret = -EAGAIN;
else
urb->transfer_flags |= URB_DMA_MAP_PAGE;
} else {
urb->transfer_dma = dma_map_single(
hcd->self.controller,
urb->transfer_buffer,
urb->transfer_buffer_length,
dir);
if (dma_mapping_error(hcd->self.controller,
urb->transfer_dma))
ret = -EAGAIN;
else
urb->transfer_flags |= URB_DMA_MAP_SINGLE;
}
} else if (hcd->driver->flags & HCD_LOCAL_MEM) { } else if (hcd->driver->flags & HCD_LOCAL_MEM) {
ret = hcd_alloc_coherent( ret = hcd_alloc_coherent(
urb->dev->bus, mem_flags, urb->dev->bus, mem_flags,
...@@ -1314,55 +1391,16 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, ...@@ -1314,55 +1391,16 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
&urb->transfer_buffer, &urb->transfer_buffer,
urb->transfer_buffer_length, urb->transfer_buffer_length,
dir); dir);
if (ret == 0)
if (ret && usb_endpoint_xfer_control(&urb->ep->desc) urb->transfer_flags |= URB_MAP_LOCAL;
&& !(urb->transfer_flags & URB_NO_SETUP_DMA_MAP))
hcd_free_coherent(urb->dev->bus,
&urb->setup_dma,
(void **)&urb->setup_packet,
sizeof(struct usb_ctrlrequest),
DMA_TO_DEVICE);
} }
if (ret && (urb->transfer_flags & (URB_SETUP_MAP_SINGLE |
URB_SETUP_MAP_LOCAL)))
unmap_urb_for_dma(hcd, urb);
} }
return ret; return ret;
} }
static void unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)
{
enum dma_data_direction dir;
if (is_root_hub(urb->dev))
return;
if (usb_endpoint_xfer_control(&urb->ep->desc)
&& !(urb->transfer_flags & URB_NO_SETUP_DMA_MAP)) {
if (hcd->self.uses_dma)
dma_unmap_single(hcd->self.controller, urb->setup_dma,
sizeof(struct usb_ctrlrequest),
DMA_TO_DEVICE);
else if (hcd->driver->flags & HCD_LOCAL_MEM)
hcd_free_coherent(urb->dev->bus, &urb->setup_dma,
(void **)&urb->setup_packet,
sizeof(struct usb_ctrlrequest),
DMA_TO_DEVICE);
}
dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
if (urb->transfer_buffer_length != 0
&& !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP)) {
if (hcd->self.uses_dma)
dma_unmap_single(hcd->self.controller,
urb->transfer_dma,
urb->transfer_buffer_length,
dir);
else if (hcd->driver->flags & HCD_LOCAL_MEM)
hcd_free_coherent(urb->dev->bus, &urb->transfer_dma,
&urb->transfer_buffer,
urb->transfer_buffer_length,
dir);
}
}
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
/* may be called in any context with a valid urb->dev usecount /* may be called in any context with a valid urb->dev usecount
...@@ -1391,21 +1429,20 @@ int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags) ...@@ -1391,21 +1429,20 @@ int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags)
* URBs must be submitted in process context with interrupts * URBs must be submitted in process context with interrupts
* enabled. * enabled.
*/ */
status = map_urb_for_dma(hcd, urb, mem_flags);
if (unlikely(status)) {
usbmon_urb_submit_error(&hcd->self, urb, status);
goto error;
}
if (is_root_hub(urb->dev)) if (is_root_hub(urb->dev)) {
status = rh_urb_enqueue(hcd, urb); status = rh_urb_enqueue(hcd, urb);
else } else {
status = hcd->driver->urb_enqueue(hcd, urb, mem_flags); status = map_urb_for_dma(hcd, urb, mem_flags);
if (likely(status == 0)) {
status = hcd->driver->urb_enqueue(hcd, urb, mem_flags);
if (unlikely(status))
unmap_urb_for_dma(hcd, urb);
}
}
if (unlikely(status)) { if (unlikely(status)) {
usbmon_urb_submit_error(&hcd->self, urb, status); usbmon_urb_submit_error(&hcd->self, urb, status);
unmap_urb_for_dma(hcd, urb);
error:
urb->hcpriv = NULL; urb->hcpriv = NULL;
INIT_LIST_HEAD(&urb->urb_list); INIT_LIST_HEAD(&urb->urb_list);
atomic_dec(&urb->use_count); atomic_dec(&urb->use_count);
...@@ -1775,6 +1812,75 @@ void usb_hcd_reset_endpoint(struct usb_device *udev, ...@@ -1775,6 +1812,75 @@ void usb_hcd_reset_endpoint(struct usb_device *udev,
} }
} }
/**
* usb_alloc_streams - allocate bulk endpoint stream IDs.
* @interface: alternate setting that includes all endpoints.
* @eps: array of endpoints that need streams.
* @num_eps: number of endpoints in the array.
* @num_streams: number of streams to allocate.
* @mem_flags: flags hcd should use to allocate memory.
*
* Sets up a group of bulk endpoints to have num_streams stream IDs available.
* Drivers may queue multiple transfers to different stream IDs, which may
* complete in a different order than they were queued.
*/
int usb_alloc_streams(struct usb_interface *interface,
struct usb_host_endpoint **eps, unsigned int num_eps,
unsigned int num_streams, gfp_t mem_flags)
{
struct usb_hcd *hcd;
struct usb_device *dev;
int i;
dev = interface_to_usbdev(interface);
hcd = bus_to_hcd(dev->bus);
if (!hcd->driver->alloc_streams || !hcd->driver->free_streams)
return -EINVAL;
if (dev->speed != USB_SPEED_SUPER)
return -EINVAL;
/* Streams only apply to bulk endpoints. */
for (i = 0; i < num_eps; i++)
if (!usb_endpoint_xfer_bulk(&eps[i]->desc))
return -EINVAL;
return hcd->driver->alloc_streams(hcd, dev, eps, num_eps,
num_streams, mem_flags);
}
EXPORT_SYMBOL_GPL(usb_alloc_streams);
/**
* usb_free_streams - free bulk endpoint stream IDs.
* @interface: alternate setting that includes all endpoints.
* @eps: array of endpoints to remove streams from.
* @num_eps: number of endpoints in the array.
* @mem_flags: flags hcd should use to allocate memory.
*
* Reverts a group of bulk endpoints back to not using stream IDs.
* Can fail if we are given bad arguments, or HCD is broken.
*/
void usb_free_streams(struct usb_interface *interface,
struct usb_host_endpoint **eps, unsigned int num_eps,
gfp_t mem_flags)
{
struct usb_hcd *hcd;
struct usb_device *dev;
int i;
dev = interface_to_usbdev(interface);
hcd = bus_to_hcd(dev->bus);
if (dev->speed != USB_SPEED_SUPER)
return;
/* Streams only apply to bulk endpoints. */
for (i = 0; i < num_eps; i++)
if (!usb_endpoint_xfer_bulk(&eps[i]->desc))
return;
hcd->driver->free_streams(hcd, dev, eps, num_eps, mem_flags);
}
EXPORT_SYMBOL_GPL(usb_free_streams);
/* Protect against drivers that try to unlink URBs after the device /* Protect against drivers that try to unlink URBs after the device
* is gone, by waiting until all unlinks for @udev are finished. * is gone, by waiting until all unlinks for @udev are finished.
* Since we don't currently track URBs by device, simply wait until * Since we don't currently track URBs by device, simply wait until
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/ioctl.h> #include <linux/ioctl.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/usbdevice_fs.h> #include <linux/usbdevice_fs.h>
#include <linux/usb/hcd.h>
#include <linux/kthread.h> #include <linux/kthread.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/freezer.h> #include <linux/freezer.h>
...@@ -28,8 +29,6 @@ ...@@ -28,8 +29,6 @@
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include "usb.h" #include "usb.h"
#include "hcd.h"
#include "hub.h"
/* if we are in debug mode, always announce new devices */ /* if we are in debug mode, always announce new devices */
#ifdef DEBUG #ifdef DEBUG
...@@ -154,11 +153,11 @@ static int usb_reset_and_verify_device(struct usb_device *udev); ...@@ -154,11 +153,11 @@ static int usb_reset_and_verify_device(struct usb_device *udev);
static inline char *portspeed(int portstatus) static inline char *portspeed(int portstatus)
{ {
if (portstatus & (1 << USB_PORT_FEAT_HIGHSPEED)) if (portstatus & USB_PORT_STAT_HIGH_SPEED)
return "480 Mb/s"; return "480 Mb/s";
else if (portstatus & (1 << USB_PORT_FEAT_LOWSPEED)) else if (portstatus & USB_PORT_STAT_LOW_SPEED)
return "1.5 Mb/s"; return "1.5 Mb/s";
else if (portstatus & (1 << USB_PORT_FEAT_SUPERSPEED)) else if (portstatus & USB_PORT_STAT_SUPER_SPEED)
return "5.0 Gb/s"; return "5.0 Gb/s";
else else
return "12 Mb/s"; return "12 Mb/s";
...@@ -745,8 +744,20 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) ...@@ -745,8 +744,20 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
!(portstatus & USB_PORT_STAT_CONNECTION) || !(portstatus & USB_PORT_STAT_CONNECTION) ||
!udev || !udev ||
udev->state == USB_STATE_NOTATTACHED)) { udev->state == USB_STATE_NOTATTACHED)) {
clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE); /*
portstatus &= ~USB_PORT_STAT_ENABLE; * USB3 protocol ports will automatically transition
* to Enabled state when detect an USB3.0 device attach.
* Do not disable USB3 protocol ports.
* FIXME: USB3 root hub and external hubs are treated
* differently here.
*/
if (hdev->descriptor.bDeviceProtocol != 3 ||
(!hdev->parent &&
!(portstatus & USB_PORT_STAT_SUPER_SPEED))) {
clear_port_feature(hdev, port1,
USB_PORT_FEAT_ENABLE);
portstatus &= ~USB_PORT_STAT_ENABLE;
}
} }
/* Clear status-change flags; we'll debounce later */ /* Clear status-change flags; we'll debounce later */
...@@ -1784,7 +1795,6 @@ int usb_new_device(struct usb_device *udev) ...@@ -1784,7 +1795,6 @@ int usb_new_device(struct usb_device *udev)
* sysfs power/wakeup controls wakeup enabled/disabled * sysfs power/wakeup controls wakeup enabled/disabled
*/ */
device_init_wakeup(&udev->dev, 0); device_init_wakeup(&udev->dev, 0);
device_set_wakeup_enable(&udev->dev, 1);
} }
/* Tell the runtime-PM framework the device is active */ /* Tell the runtime-PM framework the device is active */
...@@ -3038,7 +3048,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1, ...@@ -3038,7 +3048,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
/* maybe switch power back on (e.g. root hub was reset) */ /* maybe switch power back on (e.g. root hub was reset) */
if ((wHubCharacteristics & HUB_CHAR_LPSM) < 2 if ((wHubCharacteristics & HUB_CHAR_LPSM) < 2
&& !(portstatus & (1 << USB_PORT_FEAT_POWER))) && !(portstatus & USB_PORT_STAT_POWER))
set_port_feature(hdev, port1, USB_PORT_FEAT_POWER); set_port_feature(hdev, port1, USB_PORT_FEAT_POWER);
if (portstatus & USB_PORT_STAT_ENABLE) if (portstatus & USB_PORT_STAT_ENABLE)
...@@ -3076,7 +3086,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1, ...@@ -3076,7 +3086,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
if (!(hcd->driver->flags & HCD_USB3)) if (!(hcd->driver->flags & HCD_USB3))
udev->speed = USB_SPEED_UNKNOWN; udev->speed = USB_SPEED_UNKNOWN;
else if ((hdev->parent == NULL) && else if ((hdev->parent == NULL) &&
(portstatus & (1 << USB_PORT_FEAT_SUPERSPEED))) (portstatus & USB_PORT_STAT_SUPER_SPEED))
udev->speed = USB_SPEED_SUPER; udev->speed = USB_SPEED_SUPER;
else else
udev->speed = USB_SPEED_UNKNOWN; udev->speed = USB_SPEED_UNKNOWN;
......
...@@ -40,9 +40,9 @@ ...@@ -40,9 +40,9 @@
#include <linux/notifier.h> #include <linux/notifier.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/smp_lock.h> #include <linux/smp_lock.h>
#include <linux/usb/hcd.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include "usb.h" #include "usb.h"
#include "hcd.h"
#define USBFS_DEFAULT_DEVMODE (S_IWUSR | S_IRUGO) #define USBFS_DEFAULT_DEVMODE (S_IWUSR | S_IRUGO)
#define USBFS_DEFAULT_BUSMODE (S_IXUGO | S_IRUGO) #define USBFS_DEFAULT_BUSMODE (S_IXUGO | S_IRUGO)
......
...@@ -14,9 +14,9 @@ ...@@ -14,9 +14,9 @@
#include <linux/device.h> #include <linux/device.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <linux/usb/quirks.h> #include <linux/usb/quirks.h>
#include <linux/usb/hcd.h> /* for usbcore internals */
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include "hcd.h" /* for usbcore internals */
#include "usb.h" #include "usb.h"
static void cancel_async_set_config(struct usb_device *udev); static void cancel_async_set_config(struct usb_device *udev);
...@@ -226,8 +226,7 @@ int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, ...@@ -226,8 +226,7 @@ int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe,
struct urb *urb; struct urb *urb;
struct usb_host_endpoint *ep; struct usb_host_endpoint *ep;
ep = (usb_pipein(pipe) ? usb_dev->ep_in : usb_dev->ep_out) ep = usb_pipe_endpoint(usb_dev, pipe);
[usb_pipeendpoint(pipe)];
if (!ep || len < 0) if (!ep || len < 0)
return -EINVAL; return -EINVAL;
...@@ -259,9 +258,6 @@ static void sg_clean(struct usb_sg_request *io) ...@@ -259,9 +258,6 @@ static void sg_clean(struct usb_sg_request *io)
kfree(io->urbs); kfree(io->urbs);
io->urbs = NULL; io->urbs = NULL;
} }
if (io->dev->dev.dma_mask != NULL)
usb_buffer_unmap_sg(io->dev, usb_pipein(io->pipe),
io->sg, io->nents);
io->dev = NULL; io->dev = NULL;
} }
...@@ -364,7 +360,6 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev, ...@@ -364,7 +360,6 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,
{ {
int i; int i;
int urb_flags; int urb_flags;
int dma;
int use_sg; int use_sg;
if (!io || !dev || !sg if (!io || !dev || !sg
...@@ -376,114 +371,76 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev, ...@@ -376,114 +371,76 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,
spin_lock_init(&io->lock); spin_lock_init(&io->lock);
io->dev = dev; io->dev = dev;
io->pipe = pipe; io->pipe = pipe;
io->sg = sg;
io->nents = nents;
/* not all host controllers use DMA (like the mainstream pci ones);
* they can use PIO (sl811) or be software over another transport.
*/
dma = (dev->dev.dma_mask != NULL);
if (dma)
io->entries = usb_buffer_map_sg(dev, usb_pipein(pipe),
sg, nents);
else
io->entries = nents;
/* initialize all the urbs we'll use */
if (io->entries <= 0)
return io->entries;
if (dev->bus->sg_tablesize > 0) { if (dev->bus->sg_tablesize > 0) {
io->urbs = kmalloc(sizeof *io->urbs, mem_flags);
use_sg = true; use_sg = true;
io->entries = 1;
} else { } else {
io->urbs = kmalloc(io->entries * sizeof *io->urbs, mem_flags);
use_sg = false; use_sg = false;
io->entries = nents;
} }
/* initialize all the urbs we'll use */
io->urbs = kmalloc(io->entries * sizeof *io->urbs, mem_flags);
if (!io->urbs) if (!io->urbs)
goto nomem; goto nomem;
urb_flags = 0; urb_flags = URB_NO_INTERRUPT;
if (dma)
urb_flags |= URB_NO_TRANSFER_DMA_MAP;
if (usb_pipein(pipe)) if (usb_pipein(pipe))
urb_flags |= URB_SHORT_NOT_OK; urb_flags |= URB_SHORT_NOT_OK;
if (use_sg) { for_each_sg(sg, sg, io->entries, i) {
io->urbs[0] = usb_alloc_urb(0, mem_flags); struct urb *urb;
if (!io->urbs[0]) { unsigned len;
io->entries = 0;
goto nomem;
}
io->urbs[0]->dev = NULL; urb = usb_alloc_urb(0, mem_flags);
io->urbs[0]->pipe = pipe; if (!urb) {
io->urbs[0]->interval = period; io->entries = i;
io->urbs[0]->transfer_flags = urb_flags; goto nomem;
io->urbs[0]->complete = sg_complete;
io->urbs[0]->context = io;
/* A length of zero means transfer the whole sg list */
io->urbs[0]->transfer_buffer_length = length;
if (length == 0) {
for_each_sg(sg, sg, io->entries, i) {
io->urbs[0]->transfer_buffer_length +=
sg_dma_len(sg);
}
} }
io->urbs[0]->sg = io; io->urbs[i] = urb;
io->urbs[0]->num_sgs = io->entries;
io->entries = 1; urb->dev = NULL;
} else { urb->pipe = pipe;
urb_flags |= URB_NO_INTERRUPT; urb->interval = period;
for_each_sg(sg, sg, io->entries, i) { urb->transfer_flags = urb_flags;
unsigned len; urb->complete = sg_complete;
urb->context = io;
io->urbs[i] = usb_alloc_urb(0, mem_flags); urb->sg = sg;
if (!io->urbs[i]) {
io->entries = i; if (use_sg) {
goto nomem; /* There is no single transfer buffer */
urb->transfer_buffer = NULL;
urb->num_sgs = nents;
/* A length of zero means transfer the whole sg list */
len = length;
if (len == 0) {
for_each_sg(sg, sg, nents, i)
len += sg->length;
} }
} else {
io->urbs[i]->dev = NULL;
io->urbs[i]->pipe = pipe;
io->urbs[i]->interval = period;
io->urbs[i]->transfer_flags = urb_flags;
io->urbs[i]->complete = sg_complete;
io->urbs[i]->context = io;
/* /*
* Some systems need to revert to PIO when DMA is temporarily * Some systems can't use DMA; they use PIO instead.
* unavailable. For their sakes, both transfer_buffer and * For their sakes, transfer_buffer is set whenever
* transfer_dma are set when possible. * possible.
*
* Note that if IOMMU coalescing occurred, we cannot
* trust sg_page anymore, so check if S/G list shrunk.
*/ */
if (io->nents == io->entries && !PageHighMem(sg_page(sg))) if (!PageHighMem(sg_page(sg)))
io->urbs[i]->transfer_buffer = sg_virt(sg); urb->transfer_buffer = sg_virt(sg);
else else
io->urbs[i]->transfer_buffer = NULL; urb->transfer_buffer = NULL;
if (dma) {
io->urbs[i]->transfer_dma = sg_dma_address(sg);
len = sg_dma_len(sg);
} else {
/* hc may use _only_ transfer_buffer */
len = sg->length;
}
len = sg->length;
if (length) { if (length) {
len = min_t(unsigned, len, length); len = min_t(unsigned, len, length);
length -= len; length -= len;
if (length == 0) if (length == 0)
io->entries = i + 1; io->entries = i + 1;
} }
io->urbs[i]->transfer_buffer_length = len;
} }
io->urbs[--i]->transfer_flags &= ~URB_NO_INTERRUPT; urb->transfer_buffer_length = len;
} }
io->urbs[--i]->transfer_flags &= ~URB_NO_INTERRUPT;
/* transaction state */ /* transaction state */
io->count = io->entries; io->count = io->entries;
......
...@@ -71,6 +71,10 @@ static const struct usb_device_id usb_quirk_list[] = { ...@@ -71,6 +71,10 @@ static const struct usb_device_id usb_quirk_list[] = {
/* SKYMEDI USB_DRIVE */ /* SKYMEDI USB_DRIVE */
{ USB_DEVICE(0x1516, 0x8628), .driver_info = USB_QUIRK_RESET_RESUME }, { USB_DEVICE(0x1516, 0x8628), .driver_info = USB_QUIRK_RESET_RESUME },
/* BUILDWIN Photo Frame */
{ USB_DEVICE(0x1908, 0x1315), .driver_info =
USB_QUIRK_HONOR_BNUMINTERFACES },
/* INTEL VALUE SSD */ /* INTEL VALUE SSD */
{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME }, { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
......
...@@ -383,13 +383,24 @@ static DEVICE_ATTR(autosuspend, S_IRUGO | S_IWUSR, ...@@ -383,13 +383,24 @@ static DEVICE_ATTR(autosuspend, S_IRUGO | S_IWUSR,
static const char on_string[] = "on"; static const char on_string[] = "on";
static const char auto_string[] = "auto"; static const char auto_string[] = "auto";
static void warn_level(void) {
static int level_warned;
if (!level_warned) {
level_warned = 1;
printk(KERN_WARNING "WARNING! power/level is deprecated; "
"use power/control instead\n");
}
}
static ssize_t static ssize_t
show_level(struct device *dev, struct device_attribute *attr, char *buf) show_level(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct usb_device *udev = to_usb_device(dev); struct usb_device *udev = to_usb_device(dev);
const char *p = auto_string; const char *p = auto_string;
if (udev->state != USB_STATE_SUSPENDED && udev->autosuspend_disabled) warn_level();
if (udev->state != USB_STATE_SUSPENDED && !udev->dev.power.runtime_auto)
p = on_string; p = on_string;
return sprintf(buf, "%s\n", p); return sprintf(buf, "%s\n", p);
} }
...@@ -401,8 +412,9 @@ set_level(struct device *dev, struct device_attribute *attr, ...@@ -401,8 +412,9 @@ set_level(struct device *dev, struct device_attribute *attr,
struct usb_device *udev = to_usb_device(dev); struct usb_device *udev = to_usb_device(dev);
int len = count; int len = count;
char *cp; char *cp;
int rc; int rc = count;
warn_level();
cp = memchr(buf, '\n', count); cp = memchr(buf, '\n', count);
if (cp) if (cp)
len = cp - buf; len = cp - buf;
...@@ -411,17 +423,17 @@ set_level(struct device *dev, struct device_attribute *attr, ...@@ -411,17 +423,17 @@ set_level(struct device *dev, struct device_attribute *attr,
if (len == sizeof on_string - 1 && if (len == sizeof on_string - 1 &&
strncmp(buf, on_string, len) == 0) strncmp(buf, on_string, len) == 0)
rc = usb_disable_autosuspend(udev); usb_disable_autosuspend(udev);
else if (len == sizeof auto_string - 1 && else if (len == sizeof auto_string - 1 &&
strncmp(buf, auto_string, len) == 0) strncmp(buf, auto_string, len) == 0)
rc = usb_enable_autosuspend(udev); usb_enable_autosuspend(udev);
else else
rc = -EINVAL; rc = -EINVAL;
usb_unlock_device(udev); usb_unlock_device(udev);
return (rc < 0 ? rc : count); return rc;
} }
static DEVICE_ATTR(level, S_IRUGO | S_IWUSR, show_level, set_level); static DEVICE_ATTR(level, S_IRUGO | S_IWUSR, show_level, set_level);
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
#include <linux/log2.h> #include <linux/log2.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/wait.h> #include <linux/wait.h>
#include "hcd.h" #include <linux/usb/hcd.h>
#define to_urb(d) container_of(d, struct urb, kref) #define to_urb(d) container_of(d, struct urb, kref)
...@@ -308,8 +308,7 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags) ...@@ -308,8 +308,7 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
* will be required to set urb->ep directly and we will eliminate * will be required to set urb->ep directly and we will eliminate
* urb->pipe. * urb->pipe.
*/ */
ep = (usb_pipein(urb->pipe) ? dev->ep_in : dev->ep_out) ep = usb_pipe_endpoint(dev, urb->pipe);
[usb_pipeendpoint(urb->pipe)];
if (!ep) if (!ep)
return -ENOENT; return -ENOENT;
...@@ -333,9 +332,12 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags) ...@@ -333,9 +332,12 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
is_out = usb_endpoint_dir_out(&ep->desc); is_out = usb_endpoint_dir_out(&ep->desc);
} }
/* Cache the direction for later use */ /* Clear the internal flags and cache the direction for later use */
urb->transfer_flags = (urb->transfer_flags & ~URB_DIR_MASK) | urb->transfer_flags &= ~(URB_DIR_MASK | URB_DMA_MAP_SINGLE |
(is_out ? URB_DIR_OUT : URB_DIR_IN); URB_DMA_MAP_PAGE | URB_DMA_MAP_SG | URB_MAP_LOCAL |
URB_SETUP_MAP_SINGLE | URB_SETUP_MAP_LOCAL |
URB_DMA_SG_COMBINED);
urb->transfer_flags |= (is_out ? URB_DIR_OUT : URB_DIR_IN);
if (xfertype != USB_ENDPOINT_XFER_CONTROL && if (xfertype != USB_ENDPOINT_XFER_CONTROL &&
dev->state < USB_STATE_CONFIGURED) dev->state < USB_STATE_CONFIGURED)
...@@ -396,8 +398,8 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags) ...@@ -396,8 +398,8 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
return -EPIPE; /* The most suitable error code :-) */ return -EPIPE; /* The most suitable error code :-) */
/* enforce simple/standard policy */ /* enforce simple/standard policy */
allowed = (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP | allowed = (URB_NO_TRANSFER_DMA_MAP | URB_NO_INTERRUPT | URB_DIR_MASK |
URB_NO_INTERRUPT | URB_DIR_MASK | URB_FREE_BUFFER); URB_FREE_BUFFER);
switch (xfertype) { switch (xfertype) {
case USB_ENDPOINT_XFER_BULK: case USB_ENDPOINT_XFER_BULK:
if (is_out) if (is_out)
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/usb/hcd.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/debugfs.h> #include <linux/debugfs.h>
...@@ -41,7 +42,6 @@ ...@@ -41,7 +42,6 @@
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include "hcd.h"
#include "usb.h" #include "usb.h"
...@@ -593,76 +593,6 @@ int usb_lock_device_for_reset(struct usb_device *udev, ...@@ -593,76 +593,6 @@ int usb_lock_device_for_reset(struct usb_device *udev,
} }
EXPORT_SYMBOL_GPL(usb_lock_device_for_reset); EXPORT_SYMBOL_GPL(usb_lock_device_for_reset);
static struct usb_device *match_device(struct usb_device *dev,
u16 vendor_id, u16 product_id)
{
struct usb_device *ret_dev = NULL;
int child;
dev_dbg(&dev->dev, "check for vendor %04x, product %04x ...\n",
le16_to_cpu(dev->descriptor.idVendor),
le16_to_cpu(dev->descriptor.idProduct));
/* see if this device matches */
if ((vendor_id == le16_to_cpu(dev->descriptor.idVendor)) &&
(product_id == le16_to_cpu(dev->descriptor.idProduct))) {
dev_dbg(&dev->dev, "matched this device!\n");
ret_dev = usb_get_dev(dev);
goto exit;
}
/* look through all of the children of this device */
for (child = 0; child < dev->maxchild; ++child) {
if (dev->children[child]) {
usb_lock_device(dev->children[child]);
ret_dev = match_device(dev->children[child],
vendor_id, product_id);
usb_unlock_device(dev->children[child]);
if (ret_dev)
goto exit;
}
}
exit:
return ret_dev;
}
/**
* usb_find_device - find a specific usb device in the system
* @vendor_id: the vendor id of the device to find
* @product_id: the product id of the device to find
*
* Returns a pointer to a struct usb_device if such a specified usb
* device is present in the system currently. The usage count of the
* device will be incremented if a device is found. Make sure to call
* usb_put_dev() when the caller is finished with the device.
*
* If a device with the specified vendor and product id is not found,
* NULL is returned.
*/
struct usb_device *usb_find_device(u16 vendor_id, u16 product_id)
{
struct list_head *buslist;
struct usb_bus *bus;
struct usb_device *dev = NULL;
mutex_lock(&usb_bus_list_lock);
for (buslist = usb_bus_list.next;
buslist != &usb_bus_list;
buslist = buslist->next) {
bus = container_of(buslist, struct usb_bus, bus_list);
if (!bus->root_hub)
continue;
usb_lock_device(bus->root_hub);
dev = match_device(bus->root_hub, vendor_id, product_id);
usb_unlock_device(bus->root_hub);
if (dev)
goto exit;
}
exit:
mutex_unlock(&usb_bus_list_lock);
return dev;
}
/** /**
* usb_get_current_frame_number - return current bus frame number * usb_get_current_frame_number - return current bus frame number
* @dev: the device whose bus is being queried * @dev: the device whose bus is being queried
...@@ -775,7 +705,7 @@ EXPORT_SYMBOL_GPL(usb_free_coherent); ...@@ -775,7 +705,7 @@ EXPORT_SYMBOL_GPL(usb_free_coherent);
* @urb: urb whose transfer_buffer/setup_packet will be mapped * @urb: urb whose transfer_buffer/setup_packet will be mapped
* *
* Return value is either null (indicating no buffer could be mapped), or * Return value is either null (indicating no buffer could be mapped), or
* the parameter. URB_NO_TRANSFER_DMA_MAP and URB_NO_SETUP_DMA_MAP are * the parameter. URB_NO_TRANSFER_DMA_MAP is
* added to urb->transfer_flags if the operation succeeds. If the device * added to urb->transfer_flags if the operation succeeds. If the device
* is connected to this system through a non-DMA controller, this operation * is connected to this system through a non-DMA controller, this operation
* always succeeds. * always succeeds.
...@@ -803,17 +733,11 @@ struct urb *usb_buffer_map(struct urb *urb) ...@@ -803,17 +733,11 @@ struct urb *usb_buffer_map(struct urb *urb)
urb->transfer_buffer, urb->transfer_buffer_length, urb->transfer_buffer, urb->transfer_buffer_length,
usb_pipein(urb->pipe) usb_pipein(urb->pipe)
? DMA_FROM_DEVICE : DMA_TO_DEVICE); ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
if (usb_pipecontrol(urb->pipe))
urb->setup_dma = dma_map_single(controller,
urb->setup_packet,
sizeof(struct usb_ctrlrequest),
DMA_TO_DEVICE);
/* FIXME generic api broken like pci, can't report errors */ /* FIXME generic api broken like pci, can't report errors */
/* if (urb->transfer_dma == DMA_ADDR_INVALID) return 0; */ /* if (urb->transfer_dma == DMA_ADDR_INVALID) return 0; */
} else } else
urb->transfer_dma = ~0; urb->transfer_dma = ~0;
urb->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
| URB_NO_SETUP_DMA_MAP);
return urb; return urb;
} }
EXPORT_SYMBOL_GPL(usb_buffer_map); EXPORT_SYMBOL_GPL(usb_buffer_map);
...@@ -881,18 +805,13 @@ void usb_buffer_unmap(struct urb *urb) ...@@ -881,18 +805,13 @@ void usb_buffer_unmap(struct urb *urb)
urb->transfer_dma, urb->transfer_buffer_length, urb->transfer_dma, urb->transfer_buffer_length,
usb_pipein(urb->pipe) usb_pipein(urb->pipe)
? DMA_FROM_DEVICE : DMA_TO_DEVICE); ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
if (usb_pipecontrol(urb->pipe))
dma_unmap_single(controller,
urb->setup_dma,
sizeof(struct usb_ctrlrequest),
DMA_TO_DEVICE);
} }
urb->transfer_flags &= ~(URB_NO_TRANSFER_DMA_MAP urb->transfer_flags &= ~URB_NO_TRANSFER_DMA_MAP;
| URB_NO_SETUP_DMA_MAP);
} }
EXPORT_SYMBOL_GPL(usb_buffer_unmap); EXPORT_SYMBOL_GPL(usb_buffer_unmap);
#endif /* 0 */ #endif /* 0 */
#if 0
/** /**
* usb_buffer_map_sg - create scatterlist DMA mapping(s) for an endpoint * usb_buffer_map_sg - create scatterlist DMA mapping(s) for an endpoint
* @dev: device to which the scatterlist will be mapped * @dev: device to which the scatterlist will be mapped
...@@ -936,6 +855,7 @@ int usb_buffer_map_sg(const struct usb_device *dev, int is_in, ...@@ -936,6 +855,7 @@ int usb_buffer_map_sg(const struct usb_device *dev, int is_in,
is_in ? DMA_FROM_DEVICE : DMA_TO_DEVICE) ? : -ENOMEM; is_in ? DMA_FROM_DEVICE : DMA_TO_DEVICE) ? : -ENOMEM;
} }
EXPORT_SYMBOL_GPL(usb_buffer_map_sg); EXPORT_SYMBOL_GPL(usb_buffer_map_sg);
#endif
/* XXX DISABLED, no users currently. If you wish to re-enable this /* XXX DISABLED, no users currently. If you wish to re-enable this
* XXX please determine whether the sync is to transfer ownership of * XXX please determine whether the sync is to transfer ownership of
...@@ -972,6 +892,7 @@ void usb_buffer_dmasync_sg(const struct usb_device *dev, int is_in, ...@@ -972,6 +892,7 @@ void usb_buffer_dmasync_sg(const struct usb_device *dev, int is_in,
EXPORT_SYMBOL_GPL(usb_buffer_dmasync_sg); EXPORT_SYMBOL_GPL(usb_buffer_dmasync_sg);
#endif #endif
#if 0
/** /**
* usb_buffer_unmap_sg - free DMA mapping(s) for a scatterlist * usb_buffer_unmap_sg - free DMA mapping(s) for a scatterlist
* @dev: device to which the scatterlist will be mapped * @dev: device to which the scatterlist will be mapped
...@@ -997,6 +918,7 @@ void usb_buffer_unmap_sg(const struct usb_device *dev, int is_in, ...@@ -997,6 +918,7 @@ void usb_buffer_unmap_sg(const struct usb_device *dev, int is_in,
is_in ? DMA_FROM_DEVICE : DMA_TO_DEVICE); is_in ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
} }
EXPORT_SYMBOL_GPL(usb_buffer_unmap_sg); EXPORT_SYMBOL_GPL(usb_buffer_unmap_sg);
#endif
/* To disable USB, kernel command line is 'nousb' not 'usbcore.nousb' */ /* To disable USB, kernel command line is 'nousb' not 'usbcore.nousb' */
#ifdef MODULE #ifdef MODULE
......
...@@ -710,6 +710,43 @@ config USB_GADGETFS ...@@ -710,6 +710,43 @@ config USB_GADGETFS
Say "y" to link the driver statically, or "m" to build a Say "y" to link the driver statically, or "m" to build a
dynamically linked module called "gadgetfs". dynamically linked module called "gadgetfs".
config USB_FUNCTIONFS
tristate "Function Filesystem (EXPERIMENTAL)"
depends on EXPERIMENTAL
help
The Function Filesystem (FunctioFS) lets one create USB
composite functions in user space in the same way as GadgetFS
lets one create USB gadgets in user space. This allows creation
of composite gadgets such that some of the functions are
implemented in kernel space (for instance Ethernet, serial or
mass storage) and other are implemented in user space.
Say "y" to link the driver statically, or "m" to build
a dynamically linked module called "g_ffs".
config USB_FUNCTIONFS_ETH
bool "Include CDC ECM (Ethernet) function"
depends on USB_FUNCTIONFS && NET
help
Include an CDC ECM (Ethernet) funcion in the CDC ECM (Funcion)
Filesystem. If you also say "y" to the RNDIS query below the
gadget will have two configurations.
config USB_FUNCTIONFS_RNDIS
bool "Include RNDIS (Ethernet) function"
depends on USB_FUNCTIONFS && NET
help
Include an RNDIS (Ethernet) funcion in the Funcion Filesystem.
If you also say "y" to the CDC ECM query above the gadget will
have two configurations.
config USB_FUNCTIONFS_GENERIC
bool "Include 'pure' configuration"
depends on USB_FUNCTIONFS && (USB_FUNCTIONFS_ETH || USB_FUNCTIONFS_RNDIS)
help
Include a configuration with FunctionFS and no Ethernet
configuration.
config USB_FILE_STORAGE config USB_FILE_STORAGE
tristate "File-backed Storage Gadget" tristate "File-backed Storage Gadget"
depends on BLOCK depends on BLOCK
...@@ -863,11 +900,30 @@ config USB_G_MULTI_CDC ...@@ -863,11 +900,30 @@ config USB_G_MULTI_CDC
If unsure, say "y". If unsure, say "y".
config USB_G_HID
tristate "HID Gadget"
help
The HID gadget driver provides generic emulation of USB
Human Interface Devices (HID).
For more information, see Documentation/usb/gadget_hid.txt which
includes sample code for accessing the device files.
Say "y" to link the driver statically, or "m" to build a
dynamically linked module called "g_hid".
# put drivers that need isochronous transfer support (for audio # put drivers that need isochronous transfer support (for audio
# or video class gadget drivers), or specific hardware, here. # or video class gadget drivers), or specific hardware, here.
config USB_G_WEBCAM
tristate "USB Webcam Gadget"
depends on VIDEO_DEV
help
The Webcam Gadget acts as a composite USB Audio and Video Class
device. It provides a userspace API to process UVC control requests
and stream video data to the host.
# - none yet Say "y" to link the driver statically, or "m" to build a
dynamically linked module called "g_webcam".
endchoice endchoice
......
...@@ -20,7 +20,7 @@ obj-$(CONFIG_USB_ATMEL_USBA) += atmel_usba_udc.o ...@@ -20,7 +20,7 @@ obj-$(CONFIG_USB_ATMEL_USBA) += atmel_usba_udc.o
obj-$(CONFIG_USB_FSL_USB2) += fsl_usb2_udc.o obj-$(CONFIG_USB_FSL_USB2) += fsl_usb2_udc.o
fsl_usb2_udc-objs := fsl_udc_core.o fsl_usb2_udc-objs := fsl_udc_core.o
ifeq ($(CONFIG_ARCH_MXC),y) ifeq ($(CONFIG_ARCH_MXC),y)
fsl_usb2_udc-objs += fsl_mx3_udc.o fsl_usb2_udc-objs += fsl_mxc_udc.o
endif endif
obj-$(CONFIG_USB_M66592) += m66592-udc.o obj-$(CONFIG_USB_M66592) += m66592-udc.o
obj-$(CONFIG_USB_R8A66597) += r8a66597-udc.o obj-$(CONFIG_USB_R8A66597) += r8a66597-udc.o
...@@ -43,18 +43,24 @@ g_mass_storage-objs := mass_storage.o ...@@ -43,18 +43,24 @@ g_mass_storage-objs := mass_storage.o
g_printer-objs := printer.o g_printer-objs := printer.o
g_cdc-objs := cdc2.o g_cdc-objs := cdc2.o
g_multi-objs := multi.o g_multi-objs := multi.o
g_hid-objs := hid.o
g_nokia-objs := nokia.o g_nokia-objs := nokia.o
g_webcam-objs := webcam.o
obj-$(CONFIG_USB_ZERO) += g_zero.o obj-$(CONFIG_USB_ZERO) += g_zero.o
obj-$(CONFIG_USB_AUDIO) += g_audio.o obj-$(CONFIG_USB_AUDIO) += g_audio.o
obj-$(CONFIG_USB_ETH) += g_ether.o obj-$(CONFIG_USB_ETH) += g_ether.o
obj-$(CONFIG_USB_GADGETFS) += gadgetfs.o obj-$(CONFIG_USB_GADGETFS) += gadgetfs.o
obj-$(CONFIG_USB_FUNCTIONFS) += g_ffs.o
obj-$(CONFIG_USB_ETH_FUNCTIONFS) += g_eth_ffs.o
obj-$(CONFIG_USB_FILE_STORAGE) += g_file_storage.o obj-$(CONFIG_USB_FILE_STORAGE) += g_file_storage.o
obj-$(CONFIG_USB_MASS_STORAGE) += g_mass_storage.o obj-$(CONFIG_USB_MASS_STORAGE) += g_mass_storage.o
obj-$(CONFIG_USB_G_SERIAL) += g_serial.o obj-$(CONFIG_USB_G_SERIAL) += g_serial.o
obj-$(CONFIG_USB_G_PRINTER) += g_printer.o obj-$(CONFIG_USB_G_PRINTER) += g_printer.o
obj-$(CONFIG_USB_MIDI_GADGET) += g_midi.o obj-$(CONFIG_USB_MIDI_GADGET) += g_midi.o
obj-$(CONFIG_USB_CDC_COMPOSITE) += g_cdc.o obj-$(CONFIG_USB_CDC_COMPOSITE) += g_cdc.o
obj-$(CONFIG_USB_G_HID) += g_hid.o
obj-$(CONFIG_USB_G_MULTI) += g_multi.o obj-$(CONFIG_USB_G_MULTI) += g_multi.o
obj-$(CONFIG_USB_G_NOKIA) += g_nokia.o obj-$(CONFIG_USB_G_NOKIA) += g_nokia.o
obj-$(CONFIG_USB_G_WEBCAM) += g_webcam.o
...@@ -48,10 +48,9 @@ static int queue_dbg_open(struct inode *inode, struct file *file) ...@@ -48,10 +48,9 @@ static int queue_dbg_open(struct inode *inode, struct file *file)
spin_lock_irq(&ep->udc->lock); spin_lock_irq(&ep->udc->lock);
list_for_each_entry(req, &ep->queue, queue) { list_for_each_entry(req, &ep->queue, queue) {
req_copy = kmalloc(sizeof(*req_copy), GFP_ATOMIC); req_copy = kmemdup(req, sizeof(*req_copy), GFP_ATOMIC);
if (!req_copy) if (!req_copy)
goto fail; goto fail;
memcpy(req_copy, req, sizeof(*req_copy));
list_add_tail(&req_copy->queue, queue_data); list_add_tail(&req_copy->queue, queue_data);
} }
spin_unlock_irq(&ep->udc->lock); spin_unlock_irq(&ep->udc->lock);
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
*/ */
/* big enough to hold our biggest descriptor */ /* big enough to hold our biggest descriptor */
#define USB_BUFSIZ 512 #define USB_BUFSIZ 1024
static struct usb_composite_driver *composite; static struct usb_composite_driver *composite;
...@@ -85,7 +85,7 @@ MODULE_PARM_DESC(iSerialNumber, "SerialNumber string"); ...@@ -85,7 +85,7 @@ MODULE_PARM_DESC(iSerialNumber, "SerialNumber string");
* This function returns the value of the function's bind(), which is * This function returns the value of the function's bind(), which is
* zero for success else a negative errno value. * zero for success else a negative errno value.
*/ */
int __init usb_add_function(struct usb_configuration *config, int usb_add_function(struct usb_configuration *config,
struct usb_function *function) struct usb_function *function)
{ {
int value = -EINVAL; int value = -EINVAL;
...@@ -215,7 +215,7 @@ int usb_function_activate(struct usb_function *function) ...@@ -215,7 +215,7 @@ int usb_function_activate(struct usb_function *function)
* Returns the interface ID which was allocated; or -ENODEV if no * Returns the interface ID which was allocated; or -ENODEV if no
* more interface IDs can be allocated. * more interface IDs can be allocated.
*/ */
int __init usb_interface_id(struct usb_configuration *config, int usb_interface_id(struct usb_configuration *config,
struct usb_function *function) struct usb_function *function)
{ {
unsigned id = config->next_interface_id; unsigned id = config->next_interface_id;
...@@ -480,7 +480,7 @@ static int set_config(struct usb_composite_dev *cdev, ...@@ -480,7 +480,7 @@ static int set_config(struct usb_composite_dev *cdev,
* assigns global resources including string IDs, and per-configuration * assigns global resources including string IDs, and per-configuration
* resources such as interface IDs and endpoints. * resources such as interface IDs and endpoints.
*/ */
int __init usb_add_config(struct usb_composite_dev *cdev, int usb_add_config(struct usb_composite_dev *cdev,
struct usb_configuration *config) struct usb_configuration *config)
{ {
int status = -EINVAL; int status = -EINVAL;
...@@ -677,7 +677,7 @@ static int get_string(struct usb_composite_dev *cdev, ...@@ -677,7 +677,7 @@ static int get_string(struct usb_composite_dev *cdev,
* ensure that for example different functions don't wrongly assign * ensure that for example different functions don't wrongly assign
* different meanings to the same identifier. * different meanings to the same identifier.
*/ */
int __init usb_string_id(struct usb_composite_dev *cdev) int usb_string_id(struct usb_composite_dev *cdev)
{ {
if (cdev->next_string_id < 254) { if (cdev->next_string_id < 254) {
/* string id 0 is reserved */ /* string id 0 is reserved */
...@@ -898,7 +898,19 @@ static void composite_disconnect(struct usb_gadget *gadget) ...@@ -898,7 +898,19 @@ static void composite_disconnect(struct usb_gadget *gadget)
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
static void /* __init_or_exit */ static ssize_t composite_show_suspended(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct usb_gadget *gadget = dev_to_usb_gadget(dev);
struct usb_composite_dev *cdev = get_gadget_data(gadget);
return sprintf(buf, "%d\n", cdev->suspended);
}
static DEVICE_ATTR(suspended, 0444, composite_show_suspended, NULL);
static void
composite_unbind(struct usb_gadget *gadget) composite_unbind(struct usb_gadget *gadget)
{ {
struct usb_composite_dev *cdev = get_gadget_data(gadget); struct usb_composite_dev *cdev = get_gadget_data(gadget);
...@@ -944,10 +956,11 @@ composite_unbind(struct usb_gadget *gadget) ...@@ -944,10 +956,11 @@ composite_unbind(struct usb_gadget *gadget)
} }
kfree(cdev); kfree(cdev);
set_gadget_data(gadget, NULL); set_gadget_data(gadget, NULL);
device_remove_file(&gadget->dev, &dev_attr_suspended);
composite = NULL; composite = NULL;
} }
static void __init static void
string_override_one(struct usb_gadget_strings *tab, u8 id, const char *s) string_override_one(struct usb_gadget_strings *tab, u8 id, const char *s)
{ {
struct usb_string *str = tab->strings; struct usb_string *str = tab->strings;
...@@ -960,7 +973,7 @@ string_override_one(struct usb_gadget_strings *tab, u8 id, const char *s) ...@@ -960,7 +973,7 @@ string_override_one(struct usb_gadget_strings *tab, u8 id, const char *s)
} }
} }
static void __init static void
string_override(struct usb_gadget_strings **tab, u8 id, const char *s) string_override(struct usb_gadget_strings **tab, u8 id, const char *s)
{ {
while (*tab) { while (*tab) {
...@@ -969,7 +982,7 @@ string_override(struct usb_gadget_strings **tab, u8 id, const char *s) ...@@ -969,7 +982,7 @@ string_override(struct usb_gadget_strings **tab, u8 id, const char *s)
} }
} }
static int __init composite_bind(struct usb_gadget *gadget) static int composite_bind(struct usb_gadget *gadget)
{ {
struct usb_composite_dev *cdev; struct usb_composite_dev *cdev;
int status = -ENOMEM; int status = -ENOMEM;
...@@ -1004,6 +1017,14 @@ static int __init composite_bind(struct usb_gadget *gadget) ...@@ -1004,6 +1017,14 @@ static int __init composite_bind(struct usb_gadget *gadget)
*/ */
usb_ep_autoconfig_reset(cdev->gadget); usb_ep_autoconfig_reset(cdev->gadget);
/* standardized runtime overrides for device ID data */
if (idVendor)
cdev->desc.idVendor = cpu_to_le16(idVendor);
if (idProduct)
cdev->desc.idProduct = cpu_to_le16(idProduct);
if (bcdDevice)
cdev->desc.bcdDevice = cpu_to_le16(bcdDevice);
/* composite gadget needs to assign strings for whole device (like /* composite gadget needs to assign strings for whole device (like
* serial number), register function drivers, potentially update * serial number), register function drivers, potentially update
* power state and consumption, etc * power state and consumption, etc
...@@ -1015,14 +1036,6 @@ static int __init composite_bind(struct usb_gadget *gadget) ...@@ -1015,14 +1036,6 @@ static int __init composite_bind(struct usb_gadget *gadget)
cdev->desc = *composite->dev; cdev->desc = *composite->dev;
cdev->desc.bMaxPacketSize0 = gadget->ep0->maxpacket; cdev->desc.bMaxPacketSize0 = gadget->ep0->maxpacket;
/* standardized runtime overrides for device ID data */
if (idVendor)
cdev->desc.idVendor = cpu_to_le16(idVendor);
if (idProduct)
cdev->desc.idProduct = cpu_to_le16(idProduct);
if (bcdDevice)
cdev->desc.bcdDevice = cpu_to_le16(bcdDevice);
/* strings can't be assigned before bind() allocates the /* strings can't be assigned before bind() allocates the
* releavnt identifiers * releavnt identifiers
*/ */
...@@ -1036,6 +1049,10 @@ static int __init composite_bind(struct usb_gadget *gadget) ...@@ -1036,6 +1049,10 @@ static int __init composite_bind(struct usb_gadget *gadget)
string_override(composite->strings, string_override(composite->strings,
cdev->desc.iSerialNumber, iSerialNumber); cdev->desc.iSerialNumber, iSerialNumber);
status = device_create_file(&gadget->dev, &dev_attr_suspended);
if (status)
goto fail;
INFO(cdev, "%s ready\n", composite->name); INFO(cdev, "%s ready\n", composite->name);
return 0; return 0;
...@@ -1064,6 +1081,8 @@ composite_suspend(struct usb_gadget *gadget) ...@@ -1064,6 +1081,8 @@ composite_suspend(struct usb_gadget *gadget)
} }
if (composite->suspend) if (composite->suspend)
composite->suspend(cdev); composite->suspend(cdev);
cdev->suspended = 1;
} }
static void static void
...@@ -1084,6 +1103,8 @@ composite_resume(struct usb_gadget *gadget) ...@@ -1084,6 +1103,8 @@ composite_resume(struct usb_gadget *gadget)
f->resume(f); f->resume(f);
} }
} }
cdev->suspended = 0;
} }
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
...@@ -1092,7 +1113,6 @@ static struct usb_gadget_driver composite_driver = { ...@@ -1092,7 +1113,6 @@ static struct usb_gadget_driver composite_driver = {
.speed = USB_SPEED_HIGH, .speed = USB_SPEED_HIGH,
.bind = composite_bind, .bind = composite_bind,
/* .unbind = __exit_p(composite_unbind), */
.unbind = composite_unbind, .unbind = composite_unbind,
.setup = composite_setup, .setup = composite_setup,
...@@ -1121,7 +1141,7 @@ static struct usb_gadget_driver composite_driver = { ...@@ -1121,7 +1141,7 @@ static struct usb_gadget_driver composite_driver = {
* while it was binding. That would usually be done in order to wait for * while it was binding. That would usually be done in order to wait for
* some userspace participation. * some userspace participation.
*/ */
int __init usb_composite_register(struct usb_composite_driver *driver) int usb_composite_register(struct usb_composite_driver *driver)
{ {
if (!driver || !driver->dev || !driver->bind || composite) if (!driver || !driver->dev || !driver->bind || composite)
return -EINVAL; return -EINVAL;
...@@ -1142,7 +1162,7 @@ int __init usb_composite_register(struct usb_composite_driver *driver) ...@@ -1142,7 +1162,7 @@ int __init usb_composite_register(struct usb_composite_driver *driver)
* This function is used to unregister drivers using the composite * This function is used to unregister drivers using the composite
* driver framework. * driver framework.
*/ */
void /* __exit */ usb_composite_unregister(struct usb_composite_driver *driver) void usb_composite_unregister(struct usb_composite_driver *driver)
{ {
if (composite != driver) if (composite != driver)
return; return;
......
...@@ -128,7 +128,7 @@ int usb_gadget_config_buf( ...@@ -128,7 +128,7 @@ int usb_gadget_config_buf(
* with identifiers (for interfaces, strings, endpoints, and more) * with identifiers (for interfaces, strings, endpoints, and more)
* as needed by a given function instance. * as needed by a given function instance.
*/ */
struct usb_descriptor_header **__init struct usb_descriptor_header **
usb_copy_descriptors(struct usb_descriptor_header **src) usb_copy_descriptors(struct usb_descriptor_header **src)
{ {
struct usb_descriptor_header **tmp; struct usb_descriptor_header **tmp;
...@@ -175,7 +175,7 @@ usb_copy_descriptors(struct usb_descriptor_header **src) ...@@ -175,7 +175,7 @@ usb_copy_descriptors(struct usb_descriptor_header **src)
* intended use is to help remembering the endpoint descriptor to use * intended use is to help remembering the endpoint descriptor to use
* when enabling a given endpoint. * when enabling a given endpoint.
*/ */
struct usb_endpoint_descriptor *__init struct usb_endpoint_descriptor *
usb_find_endpoint( usb_find_endpoint(
struct usb_descriptor_header **src, struct usb_descriptor_header **src,
struct usb_descriptor_header **copy, struct usb_descriptor_header **copy,
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/usb/gadget.h> #include <linux/usb/gadget.h>
#include <linux/usb/hcd.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -55,9 +56,6 @@ ...@@ -55,9 +56,6 @@
#include <asm/unaligned.h> #include <asm/unaligned.h>
#include "../core/hcd.h"
#define DRIVER_DESC "USB Host+Gadget Emulator" #define DRIVER_DESC "USB Host+Gadget Emulator"
#define DRIVER_VERSION "02 May 2005" #define DRIVER_VERSION "02 May 2005"
......
...@@ -34,12 +34,12 @@ ...@@ -34,12 +34,12 @@
/* we must assign addresses for configurable endpoints (like net2280) */ /* we must assign addresses for configurable endpoints (like net2280) */
static __initdata unsigned epnum; static unsigned epnum;
// #define MANY_ENDPOINTS // #define MANY_ENDPOINTS
#ifdef MANY_ENDPOINTS #ifdef MANY_ENDPOINTS
/* more than 15 configurable endpoints */ /* more than 15 configurable endpoints */
static __initdata unsigned in_epnum; static unsigned in_epnum;
#endif #endif
...@@ -59,7 +59,7 @@ static __initdata unsigned in_epnum; ...@@ -59,7 +59,7 @@ static __initdata unsigned in_epnum;
* NOTE: each endpoint is unidirectional, as specified by its USB * NOTE: each endpoint is unidirectional, as specified by its USB
* descriptor; and isn't specific to a configuration or altsetting. * descriptor; and isn't specific to a configuration or altsetting.
*/ */
static int __init static int
ep_matches ( ep_matches (
struct usb_gadget *gadget, struct usb_gadget *gadget,
struct usb_ep *ep, struct usb_ep *ep,
...@@ -187,7 +187,7 @@ ep_matches ( ...@@ -187,7 +187,7 @@ ep_matches (
return 1; return 1;
} }
static struct usb_ep * __init static struct usb_ep *
find_ep (struct usb_gadget *gadget, const char *name) find_ep (struct usb_gadget *gadget, const char *name)
{ {
struct usb_ep *ep; struct usb_ep *ep;
...@@ -229,7 +229,7 @@ find_ep (struct usb_gadget *gadget, const char *name) ...@@ -229,7 +229,7 @@ find_ep (struct usb_gadget *gadget, const char *name)
* *
* On failure, this returns a null endpoint descriptor. * On failure, this returns a null endpoint descriptor.
*/ */
struct usb_ep * __init usb_ep_autoconfig ( struct usb_ep *usb_ep_autoconfig (
struct usb_gadget *gadget, struct usb_gadget *gadget,
struct usb_endpoint_descriptor *desc struct usb_endpoint_descriptor *desc
) )
...@@ -304,7 +304,7 @@ struct usb_ep * __init usb_ep_autoconfig ( ...@@ -304,7 +304,7 @@ struct usb_ep * __init usb_ep_autoconfig (
* state such as ep->driver_data and the record of assigned endpoints * state such as ep->driver_data and the record of assigned endpoints
* used by usb_ep_autoconfig(). * used by usb_ep_autoconfig().
*/ */
void __init usb_ep_autoconfig_reset (struct usb_gadget *gadget) void usb_ep_autoconfig_reset (struct usb_gadget *gadget)
{ {
struct usb_ep *ep; struct usb_ep *ep;
......
...@@ -116,7 +116,7 @@ acm_iad_descriptor = { ...@@ -116,7 +116,7 @@ acm_iad_descriptor = {
}; };
static struct usb_interface_descriptor acm_control_interface_desc __initdata = { static struct usb_interface_descriptor acm_control_interface_desc = {
.bLength = USB_DT_INTERFACE_SIZE, .bLength = USB_DT_INTERFACE_SIZE,
.bDescriptorType = USB_DT_INTERFACE, .bDescriptorType = USB_DT_INTERFACE,
/* .bInterfaceNumber = DYNAMIC */ /* .bInterfaceNumber = DYNAMIC */
...@@ -127,7 +127,7 @@ static struct usb_interface_descriptor acm_control_interface_desc __initdata = { ...@@ -127,7 +127,7 @@ static struct usb_interface_descriptor acm_control_interface_desc __initdata = {
/* .iInterface = DYNAMIC */ /* .iInterface = DYNAMIC */
}; };
static struct usb_interface_descriptor acm_data_interface_desc __initdata = { static struct usb_interface_descriptor acm_data_interface_desc = {
.bLength = USB_DT_INTERFACE_SIZE, .bLength = USB_DT_INTERFACE_SIZE,
.bDescriptorType = USB_DT_INTERFACE, .bDescriptorType = USB_DT_INTERFACE,
/* .bInterfaceNumber = DYNAMIC */ /* .bInterfaceNumber = DYNAMIC */
...@@ -138,7 +138,7 @@ static struct usb_interface_descriptor acm_data_interface_desc __initdata = { ...@@ -138,7 +138,7 @@ static struct usb_interface_descriptor acm_data_interface_desc __initdata = {
/* .iInterface = DYNAMIC */ /* .iInterface = DYNAMIC */
}; };
static struct usb_cdc_header_desc acm_header_desc __initdata = { static struct usb_cdc_header_desc acm_header_desc = {
.bLength = sizeof(acm_header_desc), .bLength = sizeof(acm_header_desc),
.bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorType = USB_DT_CS_INTERFACE,
.bDescriptorSubType = USB_CDC_HEADER_TYPE, .bDescriptorSubType = USB_CDC_HEADER_TYPE,
...@@ -146,7 +146,7 @@ static struct usb_cdc_header_desc acm_header_desc __initdata = { ...@@ -146,7 +146,7 @@ static struct usb_cdc_header_desc acm_header_desc __initdata = {
}; };
static struct usb_cdc_call_mgmt_descriptor static struct usb_cdc_call_mgmt_descriptor
acm_call_mgmt_descriptor __initdata = { acm_call_mgmt_descriptor = {
.bLength = sizeof(acm_call_mgmt_descriptor), .bLength = sizeof(acm_call_mgmt_descriptor),
.bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorType = USB_DT_CS_INTERFACE,
.bDescriptorSubType = USB_CDC_CALL_MANAGEMENT_TYPE, .bDescriptorSubType = USB_CDC_CALL_MANAGEMENT_TYPE,
...@@ -154,14 +154,14 @@ acm_call_mgmt_descriptor __initdata = { ...@@ -154,14 +154,14 @@ acm_call_mgmt_descriptor __initdata = {
/* .bDataInterface = DYNAMIC */ /* .bDataInterface = DYNAMIC */
}; };
static struct usb_cdc_acm_descriptor acm_descriptor __initdata = { static struct usb_cdc_acm_descriptor acm_descriptor = {
.bLength = sizeof(acm_descriptor), .bLength = sizeof(acm_descriptor),
.bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorType = USB_DT_CS_INTERFACE,
.bDescriptorSubType = USB_CDC_ACM_TYPE, .bDescriptorSubType = USB_CDC_ACM_TYPE,
.bmCapabilities = USB_CDC_CAP_LINE, .bmCapabilities = USB_CDC_CAP_LINE,
}; };
static struct usb_cdc_union_desc acm_union_desc __initdata = { static struct usb_cdc_union_desc acm_union_desc = {
.bLength = sizeof(acm_union_desc), .bLength = sizeof(acm_union_desc),
.bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorType = USB_DT_CS_INTERFACE,
.bDescriptorSubType = USB_CDC_UNION_TYPE, .bDescriptorSubType = USB_CDC_UNION_TYPE,
...@@ -171,7 +171,7 @@ static struct usb_cdc_union_desc acm_union_desc __initdata = { ...@@ -171,7 +171,7 @@ static struct usb_cdc_union_desc acm_union_desc __initdata = {
/* full speed support: */ /* full speed support: */
static struct usb_endpoint_descriptor acm_fs_notify_desc __initdata = { static struct usb_endpoint_descriptor acm_fs_notify_desc = {
.bLength = USB_DT_ENDPOINT_SIZE, .bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT, .bDescriptorType = USB_DT_ENDPOINT,
.bEndpointAddress = USB_DIR_IN, .bEndpointAddress = USB_DIR_IN,
...@@ -180,21 +180,21 @@ static struct usb_endpoint_descriptor acm_fs_notify_desc __initdata = { ...@@ -180,21 +180,21 @@ static struct usb_endpoint_descriptor acm_fs_notify_desc __initdata = {
.bInterval = 1 << GS_LOG2_NOTIFY_INTERVAL, .bInterval = 1 << GS_LOG2_NOTIFY_INTERVAL,
}; };
static struct usb_endpoint_descriptor acm_fs_in_desc __initdata = { static struct usb_endpoint_descriptor acm_fs_in_desc = {
.bLength = USB_DT_ENDPOINT_SIZE, .bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT, .bDescriptorType = USB_DT_ENDPOINT,
.bEndpointAddress = USB_DIR_IN, .bEndpointAddress = USB_DIR_IN,
.bmAttributes = USB_ENDPOINT_XFER_BULK, .bmAttributes = USB_ENDPOINT_XFER_BULK,
}; };
static struct usb_endpoint_descriptor acm_fs_out_desc __initdata = { static struct usb_endpoint_descriptor acm_fs_out_desc = {
.bLength = USB_DT_ENDPOINT_SIZE, .bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT, .bDescriptorType = USB_DT_ENDPOINT,
.bEndpointAddress = USB_DIR_OUT, .bEndpointAddress = USB_DIR_OUT,
.bmAttributes = USB_ENDPOINT_XFER_BULK, .bmAttributes = USB_ENDPOINT_XFER_BULK,
}; };
static struct usb_descriptor_header *acm_fs_function[] __initdata = { static struct usb_descriptor_header *acm_fs_function[] = {
(struct usb_descriptor_header *) &acm_iad_descriptor, (struct usb_descriptor_header *) &acm_iad_descriptor,
(struct usb_descriptor_header *) &acm_control_interface_desc, (struct usb_descriptor_header *) &acm_control_interface_desc,
(struct usb_descriptor_header *) &acm_header_desc, (struct usb_descriptor_header *) &acm_header_desc,
...@@ -210,7 +210,7 @@ static struct usb_descriptor_header *acm_fs_function[] __initdata = { ...@@ -210,7 +210,7 @@ static struct usb_descriptor_header *acm_fs_function[] __initdata = {
/* high speed support: */ /* high speed support: */
static struct usb_endpoint_descriptor acm_hs_notify_desc __initdata = { static struct usb_endpoint_descriptor acm_hs_notify_desc = {
.bLength = USB_DT_ENDPOINT_SIZE, .bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT, .bDescriptorType = USB_DT_ENDPOINT,
.bEndpointAddress = USB_DIR_IN, .bEndpointAddress = USB_DIR_IN,
...@@ -219,21 +219,21 @@ static struct usb_endpoint_descriptor acm_hs_notify_desc __initdata = { ...@@ -219,21 +219,21 @@ static struct usb_endpoint_descriptor acm_hs_notify_desc __initdata = {
.bInterval = GS_LOG2_NOTIFY_INTERVAL+4, .bInterval = GS_LOG2_NOTIFY_INTERVAL+4,
}; };
static struct usb_endpoint_descriptor acm_hs_in_desc __initdata = { static struct usb_endpoint_descriptor acm_hs_in_desc = {
.bLength = USB_DT_ENDPOINT_SIZE, .bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT, .bDescriptorType = USB_DT_ENDPOINT,
.bmAttributes = USB_ENDPOINT_XFER_BULK, .bmAttributes = USB_ENDPOINT_XFER_BULK,
.wMaxPacketSize = cpu_to_le16(512), .wMaxPacketSize = cpu_to_le16(512),
}; };
static struct usb_endpoint_descriptor acm_hs_out_desc __initdata = { static struct usb_endpoint_descriptor acm_hs_out_desc = {
.bLength = USB_DT_ENDPOINT_SIZE, .bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT, .bDescriptorType = USB_DT_ENDPOINT,
.bmAttributes = USB_ENDPOINT_XFER_BULK, .bmAttributes = USB_ENDPOINT_XFER_BULK,
.wMaxPacketSize = cpu_to_le16(512), .wMaxPacketSize = cpu_to_le16(512),
}; };
static struct usb_descriptor_header *acm_hs_function[] __initdata = { static struct usb_descriptor_header *acm_hs_function[] = {
(struct usb_descriptor_header *) &acm_iad_descriptor, (struct usb_descriptor_header *) &acm_iad_descriptor,
(struct usb_descriptor_header *) &acm_control_interface_desc, (struct usb_descriptor_header *) &acm_control_interface_desc,
(struct usb_descriptor_header *) &acm_header_desc, (struct usb_descriptor_header *) &acm_header_desc,
...@@ -571,7 +571,7 @@ static int acm_send_break(struct gserial *port, int duration) ...@@ -571,7 +571,7 @@ static int acm_send_break(struct gserial *port, int duration)
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
/* ACM function driver setup/binding */ /* ACM function driver setup/binding */
static int __init static int
acm_bind(struct usb_configuration *c, struct usb_function *f) acm_bind(struct usb_configuration *c, struct usb_function *f)
{ {
struct usb_composite_dev *cdev = c->cdev; struct usb_composite_dev *cdev = c->cdev;
...@@ -719,7 +719,7 @@ static inline bool can_support_cdc(struct usb_configuration *c) ...@@ -719,7 +719,7 @@ static inline bool can_support_cdc(struct usb_configuration *c)
* handle all the ones it binds. Caller is also responsible * handle all the ones it binds. Caller is also responsible
* for calling @gserial_cleanup() before module unload. * for calling @gserial_cleanup() before module unload.
*/ */
int __init acm_bind_config(struct usb_configuration *c, u8 port_num) int acm_bind_config(struct usb_configuration *c, u8 port_num)
{ {
struct f_acm *acm; struct f_acm *acm;
int status; int status;
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
...@@ -50,12 +50,14 @@ int fsl_udc_clk_init(struct platform_device *pdev) ...@@ -50,12 +50,14 @@ int fsl_udc_clk_init(struct platform_device *pdev)
goto egusb; goto egusb;
} }
freq = clk_get_rate(mxc_usb_clk); if (!cpu_is_mx51()) {
if (pdata->phy_mode != FSL_USB2_PHY_ULPI && freq = clk_get_rate(mxc_usb_clk);
(freq < 59999000 || freq > 60001000)) { if (pdata->phy_mode != FSL_USB2_PHY_ULPI &&
dev_err(&pdev->dev, "USB_CLK=%lu, should be 60MHz\n", freq); (freq < 59999000 || freq > 60001000)) {
ret = -EINVAL; dev_err(&pdev->dev, "USB_CLK=%lu, should be 60MHz\n", freq);
goto eclkrate; ret = -EINVAL;
goto eclkrate;
}
} }
ret = clk_enable(mxc_usb_clk); ret = clk_enable(mxc_usb_clk);
......
...@@ -489,7 +489,7 @@ static int fsl_ep_enable(struct usb_ep *_ep, ...@@ -489,7 +489,7 @@ static int fsl_ep_enable(struct usb_ep *_ep,
case USB_ENDPOINT_XFER_ISOC: case USB_ENDPOINT_XFER_ISOC:
/* Calculate transactions needed for high bandwidth iso */ /* Calculate transactions needed for high bandwidth iso */
mult = (unsigned char)(1 + ((max >> 11) & 0x03)); mult = (unsigned char)(1 + ((max >> 11) & 0x03));
max = max & 0x8ff; /* bit 0~10 */ max = max & 0x7ff; /* bit 0~10 */
/* 3 transactions at most */ /* 3 transactions at most */
if (mult > 3) if (mult > 3)
goto en_done; goto en_done;
......
此差异已折叠。
此差异已折叠。
...@@ -360,7 +360,7 @@ struct pxa_ep { ...@@ -360,7 +360,7 @@ struct pxa_ep {
* Specific pxa endpoint data, needed for hardware initialization * Specific pxa endpoint data, needed for hardware initialization
*/ */
unsigned dir_in:1; unsigned dir_in:1;
unsigned addr:3; unsigned addr:4;
unsigned config:2; unsigned config:2;
unsigned interface:3; unsigned interface:3;
unsigned alternate:3; unsigned alternate:3;
......
...@@ -715,7 +715,7 @@ static u8 __init nibble(unsigned char c) ...@@ -715,7 +715,7 @@ static u8 __init nibble(unsigned char c)
return 0; return 0;
} }
static int __init get_ether_addr(const char *str, u8 *dev_addr) static int get_ether_addr(const char *str, u8 *dev_addr)
{ {
if (str) { if (str) {
unsigned i; unsigned i;
...@@ -764,7 +764,7 @@ static struct device_type gadget_type = { ...@@ -764,7 +764,7 @@ static struct device_type gadget_type = {
* *
* Returns negative errno, or zero on success * Returns negative errno, or zero on success
*/ */
int __init gether_setup(struct usb_gadget *g, u8 ethaddr[ETH_ALEN]) int gether_setup(struct usb_gadget *g, u8 ethaddr[ETH_ALEN])
{ {
struct eth_dev *dev; struct eth_dev *dev;
struct net_device *net; struct net_device *net;
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册