usb: hso: obey DMA rules in tiocmget
The serial state information must not be embedded into another data structure, as this interferes with cache handling for DMA on architectures without cache coherence.. That would result in data corruption on some architectures Allocating it separately. v2: fix syntax error Signed-off-by: Oliver Neukum <oneukum@suse.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e497c20e20
commit
af0de1303c
|
@ -186,7 +186,7 @@ struct hso_tiocmget {
|
|||
int intr_completed;
|
||||
struct usb_endpoint_descriptor *endp;
|
||||
struct urb *urb;
|
||||
struct hso_serial_state_notification serial_state_notification;
|
||||
struct hso_serial_state_notification *serial_state_notification;
|
||||
u16 prev_UART_state_bitmap;
|
||||
struct uart_icount icount;
|
||||
};
|
||||
|
@ -1432,7 +1432,7 @@ static int tiocmget_submit_urb(struct hso_serial *serial,
|
|||
usb_rcvintpipe(usb,
|
||||
tiocmget->endp->
|
||||
bEndpointAddress & 0x7F),
|
||||
&tiocmget->serial_state_notification,
|
||||
tiocmget->serial_state_notification,
|
||||
sizeof(struct hso_serial_state_notification),
|
||||
tiocmget_intr_callback, serial,
|
||||
tiocmget->endp->bInterval);
|
||||
|
@ -1479,7 +1479,7 @@ static void tiocmget_intr_callback(struct urb *urb)
|
|||
/* wIndex should be the USB interface number of the port to which the
|
||||
* notification applies, which should always be the Modem port.
|
||||
*/
|
||||
serial_state_notification = &tiocmget->serial_state_notification;
|
||||
serial_state_notification = tiocmget->serial_state_notification;
|
||||
if (serial_state_notification->bmRequestType != BM_REQUEST_TYPE ||
|
||||
serial_state_notification->bNotification != B_NOTIFICATION ||
|
||||
le16_to_cpu(serial_state_notification->wValue) != W_VALUE ||
|
||||
|
@ -2565,6 +2565,8 @@ static void hso_free_tiomget(struct hso_serial *serial)
|
|||
usb_free_urb(tiocmget->urb);
|
||||
tiocmget->urb = NULL;
|
||||
serial->tiocmget = NULL;
|
||||
kfree(tiocmget->serial_state_notification);
|
||||
tiocmget->serial_state_notification = NULL;
|
||||
kfree(tiocmget);
|
||||
}
|
||||
}
|
||||
|
@ -2615,10 +2617,13 @@ static struct hso_device *hso_create_bulk_serial_device(
|
|||
num_urbs = 2;
|
||||
serial->tiocmget = kzalloc(sizeof(struct hso_tiocmget),
|
||||
GFP_KERNEL);
|
||||
serial->tiocmget->serial_state_notification
|
||||
= kzalloc(sizeof(struct hso_serial_state_notification),
|
||||
GFP_KERNEL);
|
||||
/* it isn't going to break our heart if serial->tiocmget
|
||||
* allocation fails don't bother checking this.
|
||||
*/
|
||||
if (serial->tiocmget) {
|
||||
if (serial->tiocmget && serial->tiocmget->serial_state_notification) {
|
||||
tiocmget = serial->tiocmget;
|
||||
tiocmget->endp = hso_get_ep(interface,
|
||||
USB_ENDPOINT_XFER_INT,
|
||||
|
|
Loading…
Reference in New Issue