Commit 0880aef4 authored by Chris Frey's avatar Chris Frey Committed by Greg Kroah-Hartman

USB: usbfs_snoop: add data logging back in

Uses the new snoop function from commit 4c6e8971,
but includes the buffer data where appropriate, as before.
Signed-off-by: default avatarChris Frey <cdfrey@foursquare.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 0978f8c5
...@@ -310,7 +310,8 @@ static struct async *async_getpending(struct dev_state *ps, ...@@ -310,7 +310,8 @@ static struct async *async_getpending(struct dev_state *ps,
static void snoop_urb(struct usb_device *udev, static void snoop_urb(struct usb_device *udev,
void __user *userurb, int pipe, unsigned length, void __user *userurb, int pipe, unsigned length,
int timeout_or_status, enum snoop_when when) int timeout_or_status, enum snoop_when when,
unsigned char *data, unsigned data_len)
{ {
static const char *types[] = {"isoc", "int", "ctrl", "bulk"}; static const char *types[] = {"isoc", "int", "ctrl", "bulk"};
static const char *dirs[] = {"out", "in"}; static const char *dirs[] = {"out", "in"};
...@@ -344,6 +345,11 @@ static void snoop_urb(struct usb_device *udev, ...@@ -344,6 +345,11 @@ static void snoop_urb(struct usb_device *udev,
"status %d\n", "status %d\n",
ep, t, d, length, timeout_or_status); ep, t, d, length, timeout_or_status);
} }
if (data && data_len > 0) {
print_hex_dump(KERN_DEBUG, "data: ", DUMP_PREFIX_NONE, 32, 1,
data, data_len, 1);
}
} }
#define AS_CONTINUATION 1 #define AS_CONTINUATION 1
...@@ -410,7 +416,9 @@ static void async_completed(struct urb *urb) ...@@ -410,7 +416,9 @@ static void async_completed(struct urb *urb)
} }
snoop(&urb->dev->dev, "urb complete\n"); snoop(&urb->dev->dev, "urb complete\n");
snoop_urb(urb->dev, as->userurb, urb->pipe, urb->actual_length, snoop_urb(urb->dev, as->userurb, urb->pipe, urb->actual_length,
as->status, COMPLETE); as->status, COMPLETE,
((urb->transfer_flags & URB_DIR_MASK) == USB_DIR_OUT) ?
NULL : urb->transfer_buffer, urb->actual_length);
if (as->status < 0 && as->bulk_addr && as->status != -ECONNRESET && if (as->status < 0 && as->bulk_addr && as->status != -ECONNRESET &&
as->status != -ENOENT) as->status != -ENOENT)
cancel_bulk_urbs(ps, as->bulk_addr); cancel_bulk_urbs(ps, as->bulk_addr);
...@@ -774,6 +782,13 @@ static int proc_control(struct dev_state *ps, void __user *arg) ...@@ -774,6 +782,13 @@ static int proc_control(struct dev_state *ps, void __user *arg)
if (!tbuf) if (!tbuf)
return -ENOMEM; return -ENOMEM;
tmo = ctrl.timeout; tmo = ctrl.timeout;
snoop(&dev->dev, "control urb: bRequestType=%02x "
"bRequest=%02x wValue=%04x "
"wIndex=%04x wLength=%04x\n",
ctrl.bRequestType, ctrl.bRequest,
__le16_to_cpup(&ctrl.wValue),
__le16_to_cpup(&ctrl.wIndex),
__le16_to_cpup(&ctrl.wLength));
if (ctrl.bRequestType & 0x80) { if (ctrl.bRequestType & 0x80) {
if (ctrl.wLength && !access_ok(VERIFY_WRITE, ctrl.data, if (ctrl.wLength && !access_ok(VERIFY_WRITE, ctrl.data,
ctrl.wLength)) { ctrl.wLength)) {
...@@ -781,15 +796,15 @@ static int proc_control(struct dev_state *ps, void __user *arg) ...@@ -781,15 +796,15 @@ static int proc_control(struct dev_state *ps, void __user *arg)
return -EINVAL; return -EINVAL;
} }
pipe = usb_rcvctrlpipe(dev, 0); pipe = usb_rcvctrlpipe(dev, 0);
snoop_urb(dev, NULL, pipe, ctrl.wLength, tmo, SUBMIT); snoop_urb(dev, NULL, pipe, ctrl.wLength, tmo, SUBMIT, NULL, 0);
usb_unlock_device(dev); usb_unlock_device(dev);
i = usb_control_msg(dev, pipe, ctrl.bRequest, i = usb_control_msg(dev, pipe, ctrl.bRequest,
ctrl.bRequestType, ctrl.wValue, ctrl.wIndex, ctrl.bRequestType, ctrl.wValue, ctrl.wIndex,
tbuf, ctrl.wLength, tmo); tbuf, ctrl.wLength, tmo);
usb_lock_device(dev); usb_lock_device(dev);
snoop_urb(dev, NULL, pipe, max(i, 0), min(i, 0), COMPLETE); snoop_urb(dev, NULL, pipe, max(i, 0), min(i, 0), COMPLETE,
tbuf, i);
if ((i > 0) && ctrl.wLength) { if ((i > 0) && ctrl.wLength) {
if (copy_to_user(ctrl.data, tbuf, i)) { if (copy_to_user(ctrl.data, tbuf, i)) {
free_page((unsigned long)tbuf); free_page((unsigned long)tbuf);
...@@ -804,14 +819,15 @@ static int proc_control(struct dev_state *ps, void __user *arg) ...@@ -804,14 +819,15 @@ static int proc_control(struct dev_state *ps, void __user *arg)
} }
} }
pipe = usb_sndctrlpipe(dev, 0); pipe = usb_sndctrlpipe(dev, 0);
snoop_urb(dev, NULL, pipe, ctrl.wLength, tmo, SUBMIT); snoop_urb(dev, NULL, pipe, ctrl.wLength, tmo, SUBMIT,
tbuf, ctrl.wLength);
usb_unlock_device(dev); usb_unlock_device(dev);
i = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), ctrl.bRequest, i = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), ctrl.bRequest,
ctrl.bRequestType, ctrl.wValue, ctrl.wIndex, ctrl.bRequestType, ctrl.wValue, ctrl.wIndex,
tbuf, ctrl.wLength, tmo); tbuf, ctrl.wLength, tmo);
usb_lock_device(dev); usb_lock_device(dev);
snoop_urb(dev, NULL, pipe, max(i, 0), min(i, 0), COMPLETE); snoop_urb(dev, NULL, pipe, max(i, 0), min(i, 0), COMPLETE, NULL, 0);
} }
free_page((unsigned long)tbuf); free_page((unsigned long)tbuf);
if (i < 0 && i != -EPIPE) { if (i < 0 && i != -EPIPE) {
...@@ -857,12 +873,12 @@ static int proc_bulk(struct dev_state *ps, void __user *arg) ...@@ -857,12 +873,12 @@ static int proc_bulk(struct dev_state *ps, void __user *arg)
kfree(tbuf); kfree(tbuf);
return -EINVAL; return -EINVAL;
} }
snoop_urb(dev, NULL, pipe, len1, tmo, SUBMIT); snoop_urb(dev, NULL, pipe, len1, tmo, SUBMIT, NULL, 0);
usb_unlock_device(dev); usb_unlock_device(dev);
i = usb_bulk_msg(dev, pipe, tbuf, len1, &len2, tmo); i = usb_bulk_msg(dev, pipe, tbuf, len1, &len2, tmo);
usb_lock_device(dev); usb_lock_device(dev);
snoop_urb(dev, NULL, pipe, len2, i, COMPLETE); snoop_urb(dev, NULL, pipe, len2, i, COMPLETE, tbuf, len2);
if (!i && len2) { if (!i && len2) {
if (copy_to_user(bulk.data, tbuf, len2)) { if (copy_to_user(bulk.data, tbuf, len2)) {
...@@ -877,12 +893,12 @@ static int proc_bulk(struct dev_state *ps, void __user *arg) ...@@ -877,12 +893,12 @@ static int proc_bulk(struct dev_state *ps, void __user *arg)
return -EFAULT; return -EFAULT;
} }
} }
snoop_urb(dev, NULL, pipe, len1, tmo, SUBMIT); snoop_urb(dev, NULL, pipe, len1, tmo, SUBMIT, tbuf, len1);
usb_unlock_device(dev); usb_unlock_device(dev);
i = usb_bulk_msg(dev, pipe, tbuf, len1, &len2, tmo); i = usb_bulk_msg(dev, pipe, tbuf, len1, &len2, tmo);
usb_lock_device(dev); usb_lock_device(dev);
snoop_urb(dev, NULL, pipe, len2, i, COMPLETE); snoop_urb(dev, NULL, pipe, len2, i, COMPLETE, NULL, 0);
} }
kfree(tbuf); kfree(tbuf);
if (i < 0) if (i < 0)
...@@ -1101,6 +1117,13 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, ...@@ -1101,6 +1117,13 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
is_in = 0; is_in = 0;
uurb->endpoint &= ~USB_DIR_IN; uurb->endpoint &= ~USB_DIR_IN;
} }
snoop(&ps->dev->dev, "control urb: bRequestType=%02x "
"bRequest=%02x wValue=%04x "
"wIndex=%04x wLength=%04x\n",
dr->bRequestType, dr->bRequest,
__le16_to_cpup(&dr->wValue),
__le16_to_cpup(&dr->wIndex),
__le16_to_cpup(&dr->wLength));
break; break;
case USBDEVFS_URB_TYPE_BULK: case USBDEVFS_URB_TYPE_BULK:
...@@ -1244,7 +1267,9 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, ...@@ -1244,7 +1267,9 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
} }
} }
snoop_urb(ps->dev, as->userurb, as->urb->pipe, snoop_urb(ps->dev, as->userurb, as->urb->pipe,
as->urb->transfer_buffer_length, 0, SUBMIT); as->urb->transfer_buffer_length, 0, SUBMIT,
is_in ? NULL : as->urb->transfer_buffer,
uurb->buffer_length);
async_newpending(as); async_newpending(as);
if (usb_endpoint_xfer_bulk(&ep->desc)) { if (usb_endpoint_xfer_bulk(&ep->desc)) {
...@@ -1282,7 +1307,7 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, ...@@ -1282,7 +1307,7 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
dev_printk(KERN_DEBUG, &ps->dev->dev, dev_printk(KERN_DEBUG, &ps->dev->dev,
"usbfs: usb_submit_urb returned %d\n", ret); "usbfs: usb_submit_urb returned %d\n", ret);
snoop_urb(ps->dev, as->userurb, as->urb->pipe, snoop_urb(ps->dev, as->userurb, as->urb->pipe,
0, ret, COMPLETE); 0, ret, COMPLETE, NULL, 0);
async_removepending(as); async_removepending(as);
free_async(as); free_async(as);
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment