Commit 30c7431d authored by Pete Zaitcev's avatar Pete Zaitcev Committed by Greg Kroah-Hartman

usbmon: Update pipe removal to suit my taste

This is a set of small updates to Alan's work to make the code more to
my liking. Mostly premature optimizations, but also direction of control
transfers in the binary interface was always out.
Signed-off-by: default avatarPete Zaitcev <zaitcev@redhat.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 283face8
...@@ -172,6 +172,10 @@ static inline struct mon_bin_hdr *MON_OFF2HDR(const struct mon_reader_bin *rp, ...@@ -172,6 +172,10 @@ static inline struct mon_bin_hdr *MON_OFF2HDR(const struct mon_reader_bin *rp,
#define MON_RING_EMPTY(rp) ((rp)->b_cnt == 0) #define MON_RING_EMPTY(rp) ((rp)->b_cnt == 0)
static unsigned char xfer_to_pipe[4] = {
PIPE_CONTROL, PIPE_ISOCHRONOUS, PIPE_BULK, PIPE_INTERRUPT
};
static struct class *mon_bin_class; static struct class *mon_bin_class;
static dev_t mon_bin_dev0; static dev_t mon_bin_dev0;
static struct cdev mon_bin_cdev; static struct cdev mon_bin_cdev;
...@@ -388,11 +392,13 @@ static char mon_bin_get_data(const struct mon_reader_bin *rp, ...@@ -388,11 +392,13 @@ static char mon_bin_get_data(const struct mon_reader_bin *rp,
static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb, static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb,
char ev_type) char ev_type)
{ {
const struct usb_endpoint_descriptor *epd = &urb->ep->desc;
unsigned long flags; unsigned long flags;
struct timeval ts; struct timeval ts;
unsigned int urb_length; unsigned int urb_length;
unsigned int offset; unsigned int offset;
unsigned int length; unsigned int length;
unsigned char dir;
struct mon_bin_hdr *ep; struct mon_bin_hdr *ep;
char data_tag = 0; char data_tag = 0;
...@@ -415,11 +421,14 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb, ...@@ -415,11 +421,14 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb,
length = 0; length = 0;
data_tag = '<'; data_tag = '<';
} }
/* Cannot rely on endpoint number in case of control ep.0 */
dir = USB_DIR_IN;
} else { } else {
if (ev_type == 'C') { if (ev_type == 'C') {
length = 0; length = 0;
data_tag = '>'; data_tag = '>';
} }
dir = 0;
} }
if (rp->mmap_active) if (rp->mmap_active)
...@@ -440,21 +449,8 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb, ...@@ -440,21 +449,8 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb,
*/ */
memset(ep, 0, PKT_SIZE); memset(ep, 0, PKT_SIZE);
ep->type = ev_type; ep->type = ev_type;
switch (usb_endpoint_type(&urb->ep->desc)) { ep->xfer_type = xfer_to_pipe[usb_endpoint_type(epd)];
case USB_ENDPOINT_XFER_CONTROL: ep->epnum = dir | usb_endpoint_num(epd);
ep->xfer_type = PIPE_CONTROL;
break;
case USB_ENDPOINT_XFER_BULK:
ep->xfer_type = PIPE_BULK;
break;
case USB_ENDPOINT_XFER_INT:
ep->xfer_type = PIPE_INTERRUPT;
break;
default:
ep->xfer_type = PIPE_ISOCHRONOUS;
break;
}
ep->epnum = urb->ep->desc.bEndpointAddress;
ep->devnum = urb->dev->devnum; ep->devnum = urb->dev->devnum;
ep->busnum = urb->dev->bus->busnum; ep->busnum = urb->dev->bus->busnum;
ep->id = (unsigned long) urb; ep->id = (unsigned long) urb;
...@@ -512,21 +508,9 @@ static void mon_bin_error(void *data, struct urb *urb, int error) ...@@ -512,21 +508,9 @@ static void mon_bin_error(void *data, struct urb *urb, int error)
memset(ep, 0, PKT_SIZE); memset(ep, 0, PKT_SIZE);
ep->type = 'E'; ep->type = 'E';
switch (usb_endpoint_type(&urb->ep->desc)) { ep->xfer_type = xfer_to_pipe[usb_endpoint_type(&urb->ep->desc)];
case USB_ENDPOINT_XFER_CONTROL: ep->epnum = usb_urb_dir_in(urb) ? USB_DIR_IN : 0;
ep->xfer_type = PIPE_CONTROL; ep->epnum |= usb_endpoint_num(&urb->ep->desc);
break;
case USB_ENDPOINT_XFER_BULK:
ep->xfer_type = PIPE_BULK;
break;
case USB_ENDPOINT_XFER_INT:
ep->xfer_type = PIPE_INTERRUPT;
break;
default:
ep->xfer_type = PIPE_ISOCHRONOUS;
break;
}
ep->epnum = urb->ep->desc.bEndpointAddress;
ep->devnum = urb->dev->devnum; ep->devnum = urb->dev->devnum;
ep->busnum = urb->dev->bus->busnum; ep->busnum = urb->dev->bus->busnum;
ep->id = (unsigned long) urb; ep->id = (unsigned long) urb;
......
...@@ -52,10 +52,11 @@ struct mon_event_text { ...@@ -52,10 +52,11 @@ struct mon_event_text {
int type; /* submit, complete, etc. */ int type; /* submit, complete, etc. */
unsigned long id; /* From pointer, most of the time */ unsigned long id; /* From pointer, most of the time */
unsigned int tstamp; unsigned int tstamp;
int xfertype;
int busnum; int busnum;
int devnum; char devnum;
int epnum; char epnum;
char is_in;
char xfertype;
int length; /* Depends on type: xfer length or act length */ int length; /* Depends on type: xfer length or act length */
int status; int status;
int interval; int interval;
...@@ -63,7 +64,6 @@ struct mon_event_text { ...@@ -63,7 +64,6 @@ struct mon_event_text {
int error_count; int error_count;
char setup_flag; char setup_flag;
char data_flag; char data_flag;
char is_in;
int numdesc; /* Full number */ int numdesc; /* Full number */
struct mon_iso_desc isodesc[ISODESC_MAX]; struct mon_iso_desc isodesc[ISODESC_MAX];
unsigned char setup[SETUP_MAX]; unsigned char setup[SETUP_MAX];
......
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