History

usbfs: Add support for bulk stream ids

This patch makes it possible to specify a bulk stream id when submitting an urb using the async usbfs API. It overloads the number_of_packets usbdevfs_urb field for this. This is not pretty, but given other constraints it is the best we can do. The reasoning leading to this goes as follows: 1) We want to support bulk streams in the usbfs API 2) We do not want to extend the usbdevfs_urb struct with a new member, as that would mean defining new ioctl numbers for all async API ioctls + adding compat versions for the old ones (times 2 for 32 bit support) 3) 1 + 2 means we need to re-use an existing field 4) number_of_packets is only used for isoc urbs, and streams are bulk only so it is the best (and only) candidate for re-using Note that: 1) This patch only uses number_of_packets as stream_id if the app has actually allocated streams on the ep, so that old apps which may have garbage in there (as it was unused until now in the bulk case), will not break 2) This patch does not add support for allocating / freeing bulk-streams, that is done in a follow up patch

Hans de Goede committed 13 years ago

Commit 948cd8c1 parent b2d03eb2 files · +8 −1Browse files

Unified · Split

2 files
  1. drivers/usb/core/devio.c +4 −0
  2. include/uapi/linux/usbdevice_fs.h +4 −1
drivers/usb/core/devio.c+4−0
@@ -1209,6 +1209,7 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, · 1208 unmodified lines
12091209 unsigned int u, totlen, isofrmlen;
12101210 int i, ret, is_in, num_sgs = 0, ifnum = -1;
12111211 int number_of_packets = 0;
1212+ unsigned int stream_id = 0;
12121213 void *buf;
12131214
12141215 if (uurb->flags & ~(USBDEVFS_URB_ISO_ASAP |
@@ -1294,6 +1295,8 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, · 79 unmodified lines
12941295 num_sgs = DIV_ROUND_UP(uurb->buffer_length, USB_SG_SIZE);
12951296 if (num_sgs == 1 || num_sgs > ps->dev->bus->sg_tablesize)
12961297 num_sgs = 0;
1298+ if (ep->streams)
1299+ stream_id = uurb->stream_id;
12971300 break;
12981301
12991302 case USBDEVFS_URB_TYPE_INTERRUPT:
@@ -1444,6 +1447,7 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, · 144 unmodified lines
14441447 dr = NULL;
14451448 as->urb->start_frame = uurb->start_frame;
14461449 as->urb->number_of_packets = number_of_packets;
1450+ as->urb->stream_id = stream_id;
14471451 if (uurb->type == USBDEVFS_URB_TYPE_ISO ||
14481452 ps->dev->speed == USB_SPEED_HIGH)
14491453 as->urb->interval = 1 << min(15, ep->desc.bInterval - 1);
include/uapi/linux/usbdevice_fs.h+4−1
@@ -102,7 +102,10 @@ struct usbdevfs_urb { · 101 unmodified lines
102102 int buffer_length;
103103 int actual_length;
104104 int start_frame;
105− int number_of_packets;
105+ union {
106+ int number_of_packets; /* Only used for isoc urbs */
107+ unsigned int stream_id; /* Only used with bulk streams */
108+ };
106109 int error_count;
107110 unsigned int signr; /* signal to be sent on completion,
108111 or 0 if none should be sent. */