USB core: device descriptor using dma_alloc
The device descriptor needs to be dma save. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
fc52e7e480
commit
95aea88175
|
@ -80,8 +80,8 @@ static void print_usb_device(struct usb_device *dev)
|
|||
{
|
||||
printf("Bus %03d Device %03d: ID %04x:%04x %s\n",
|
||||
dev->host->busnum, dev->devnum,
|
||||
dev->descriptor.idVendor,
|
||||
dev->descriptor.idProduct,
|
||||
dev->descriptor->idVendor,
|
||||
dev->descriptor->idProduct,
|
||||
dev->prod);
|
||||
}
|
||||
|
||||
|
@ -323,7 +323,7 @@ static int usb_new_device(struct usb_device *dev)
|
|||
* some more, or keeps on retransmitting the 8 byte header. */
|
||||
|
||||
desc = (struct usb_device_descriptor *)tmpbuf;
|
||||
dev->descriptor.bMaxPacketSize0 = 64; /* Start off at 64 bytes */
|
||||
dev->descriptor->bMaxPacketSize0 = 64; /* Start off at 64 bytes */
|
||||
/* Default to 64 byte max packet size */
|
||||
dev->maxpacketsize = PACKET_SIZE_64;
|
||||
dev->epmaxpacketin[0] = 64;
|
||||
|
@ -335,7 +335,7 @@ static int usb_new_device(struct usb_device *dev)
|
|||
return 1;
|
||||
}
|
||||
|
||||
dev->descriptor.bMaxPacketSize0 = desc->bMaxPacketSize0;
|
||||
dev->descriptor->bMaxPacketSize0 = desc->bMaxPacketSize0;
|
||||
|
||||
/* find the port number we're at */
|
||||
if (parent) {
|
||||
|
@ -360,9 +360,9 @@ static int usb_new_device(struct usb_device *dev)
|
|||
}
|
||||
}
|
||||
|
||||
dev->epmaxpacketin[0] = dev->descriptor.bMaxPacketSize0;
|
||||
dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
|
||||
switch (dev->descriptor.bMaxPacketSize0) {
|
||||
dev->epmaxpacketin[0] = dev->descriptor->bMaxPacketSize0;
|
||||
dev->epmaxpacketout[0] = dev->descriptor->bMaxPacketSize0;
|
||||
switch (dev->descriptor->bMaxPacketSize0) {
|
||||
case 8:
|
||||
dev->maxpacketsize = PACKET_SIZE_8;
|
||||
break;
|
||||
|
@ -388,10 +388,10 @@ static int usb_new_device(struct usb_device *dev)
|
|||
|
||||
wait_ms(10); /* Let the SET_ADDRESS settle */
|
||||
|
||||
tmp = sizeof(dev->descriptor);
|
||||
tmp = sizeof(*dev->descriptor);
|
||||
|
||||
err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
|
||||
&dev->descriptor, sizeof(dev->descriptor));
|
||||
dev->descriptor, sizeof(*dev->descriptor));
|
||||
if (err < tmp) {
|
||||
if (err < 0)
|
||||
printf("unable to get device descriptor (error=%d)\n",
|
||||
|
@ -402,10 +402,10 @@ static int usb_new_device(struct usb_device *dev)
|
|||
return 1;
|
||||
}
|
||||
/* correct le values */
|
||||
le16_to_cpus(&dev->descriptor.bcdUSB);
|
||||
le16_to_cpus(&dev->descriptor.idVendor);
|
||||
le16_to_cpus(&dev->descriptor.idProduct);
|
||||
le16_to_cpus(&dev->descriptor.bcdDevice);
|
||||
le16_to_cpus(&dev->descriptor->bcdUSB);
|
||||
le16_to_cpus(&dev->descriptor->idVendor);
|
||||
le16_to_cpus(&dev->descriptor->idProduct);
|
||||
le16_to_cpus(&dev->descriptor->bcdDevice);
|
||||
/* only support for one config for now */
|
||||
usb_get_configuration_no(dev, &tmpbuf[0], 0);
|
||||
usb_parse_config(dev, &tmpbuf[0], 0);
|
||||
|
@ -417,19 +417,19 @@ static int usb_new_device(struct usb_device *dev)
|
|||
return -1;
|
||||
}
|
||||
USB_PRINTF("new device: Mfr=%d, Product=%d, SerialNumber=%d\n",
|
||||
dev->descriptor.iManufacturer, dev->descriptor.iProduct,
|
||||
dev->descriptor.iSerialNumber);
|
||||
dev->descriptor->iManufacturer, dev->descriptor->iProduct,
|
||||
dev->descriptor->iSerialNumber);
|
||||
memset(dev->mf, 0, sizeof(dev->mf));
|
||||
memset(dev->prod, 0, sizeof(dev->prod));
|
||||
memset(dev->serial, 0, sizeof(dev->serial));
|
||||
if (dev->descriptor.iManufacturer)
|
||||
usb_string(dev, dev->descriptor.iManufacturer,
|
||||
if (dev->descriptor->iManufacturer)
|
||||
usb_string(dev, dev->descriptor->iManufacturer,
|
||||
dev->mf, sizeof(dev->mf));
|
||||
if (dev->descriptor.iProduct)
|
||||
usb_string(dev, dev->descriptor.iProduct,
|
||||
if (dev->descriptor->iProduct)
|
||||
usb_string(dev, dev->descriptor->iProduct,
|
||||
dev->prod, sizeof(dev->prod));
|
||||
if (dev->descriptor.iSerialNumber)
|
||||
usb_string(dev, dev->descriptor.iSerialNumber,
|
||||
if (dev->descriptor->iSerialNumber)
|
||||
usb_string(dev, dev->descriptor->iSerialNumber,
|
||||
dev->serial, sizeof(dev->serial));
|
||||
/* now prode if the device is a hub */
|
||||
usb_hub_probe(dev, 0);
|
||||
|
@ -455,6 +455,7 @@ static struct usb_device *usb_alloc_new_device(void)
|
|||
usbdev->maxchild = 0;
|
||||
usbdev->dev.bus = &usb_bus_type;
|
||||
usbdev->setup_packet = dma_alloc(sizeof(*usbdev->setup_packet));
|
||||
usbdev->descriptor = dma_alloc(sizeof(*usbdev->descriptor));
|
||||
|
||||
dev_index++;
|
||||
|
||||
|
@ -473,6 +474,7 @@ void usb_rescan(void)
|
|||
if (dev->hub)
|
||||
free(dev->hub);
|
||||
dma_free(dev->setup_packet);
|
||||
dma_free(dev->descriptor);
|
||||
free(dev);
|
||||
}
|
||||
|
||||
|
@ -1288,11 +1290,11 @@ int usb_driver_register(struct usb_driver *drv)
|
|||
static int usb_match_device(struct usb_device *dev, const struct usb_device_id *id)
|
||||
{
|
||||
if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) &&
|
||||
id->idVendor != le16_to_cpu(dev->descriptor.idVendor))
|
||||
id->idVendor != le16_to_cpu(dev->descriptor->idVendor))
|
||||
return 0;
|
||||
|
||||
if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) &&
|
||||
id->idProduct != le16_to_cpu(dev->descriptor.idProduct))
|
||||
id->idProduct != le16_to_cpu(dev->descriptor->idProduct))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
|
@ -1315,7 +1317,7 @@ static int usb_match_one_id(struct usb_device *usbdev,
|
|||
/* The interface class, subclass, and protocol should never be
|
||||
* checked for a match if the device class is Vendor Specific,
|
||||
* unless the match record specifies the Vendor ID. */
|
||||
if (usbdev->descriptor.bDeviceClass == USB_CLASS_VENDOR_SPEC &&
|
||||
if (usbdev->descriptor->bDeviceClass == USB_CLASS_VENDOR_SPEC &&
|
||||
!(id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) &&
|
||||
(id->match_flags & USB_DEVICE_ID_MATCH_INT_INFO))
|
||||
return 0;
|
||||
|
@ -1375,7 +1377,8 @@ static int usb_match(struct device_d *dev, struct driver_d *drv)
|
|||
struct usb_driver *usbdrv = container_of(dev->driver, struct usb_driver, driver);
|
||||
const struct usb_device_id *id;
|
||||
|
||||
debug("matching: 0x%04x 0x%04x\n", usbdev->descriptor.idVendor, usbdev->descriptor.idProduct);
|
||||
debug("matching: 0x%04x 0x%04x\n", usbdev->descriptor->idVendor,
|
||||
usbdev->descriptor->idProduct);
|
||||
|
||||
id = usb_match_id(usbdev, usbdrv->id_table);
|
||||
if (id) {
|
||||
|
|
|
@ -159,7 +159,7 @@ struct usb_device {
|
|||
int epmaxpacketout[16]; /* OUTput endpoint specific maximums */
|
||||
|
||||
int configno; /* selected config number */
|
||||
struct usb_device_descriptor descriptor; /* Device Descriptor */
|
||||
struct usb_device_descriptor *descriptor; /* Device Descriptor */
|
||||
struct usb_config_descriptor config; /* config descriptor */
|
||||
struct devrequest *setup_packet;
|
||||
|
||||
|
|
Loading…
Reference in New Issue