mirror of
https://github.com/torvalds/linux.git
synced 2024-11-12 07:01:57 +00:00
USB: serial: aircable: use calc_num_endpoints to verify endpoints
Use the calc_num_ports rather than probe callback to determine which interface to bind to. This allows us to remove some duplicate code. Signed-off-by: Johan Hovold <johan@kernel.org>
This commit is contained in:
parent
9d717271d6
commit
5f391979c9
@ -29,12 +29,6 @@
|
||||
* is any other control code, I will simply check for the first
|
||||
* one.
|
||||
*
|
||||
* The driver registers himself with the USB-serial core and the USB Core. I had
|
||||
* to implement a probe function against USB-serial, because other way, the
|
||||
* driver was attaching himself to both interfaces. I have tried with different
|
||||
* configurations of usb_serial_driver with out exit, only the probe function
|
||||
* could handle this correctly.
|
||||
*
|
||||
* I have taken some info from a Greg Kroah-Hartman article:
|
||||
* http://www.linuxjournal.com/article/6573
|
||||
* And from Linux Device Driver Kit CD, which is a great work, the authors taken
|
||||
@ -93,30 +87,17 @@ static int aircable_prepare_write_buffer(struct usb_serial_port *port,
|
||||
return count + HCI_HEADER_LENGTH;
|
||||
}
|
||||
|
||||
static int aircable_probe(struct usb_serial *serial,
|
||||
const struct usb_device_id *id)
|
||||
static int aircable_calc_num_ports(struct usb_serial *serial,
|
||||
struct usb_serial_endpoints *epds)
|
||||
{
|
||||
struct usb_host_interface *iface_desc = serial->interface->
|
||||
cur_altsetting;
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
int num_bulk_out = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) {
|
||||
endpoint = &iface_desc->endpoint[i].desc;
|
||||
if (usb_endpoint_is_bulk_out(endpoint)) {
|
||||
dev_dbg(&serial->dev->dev,
|
||||
"found bulk out on endpoint %d\n", i);
|
||||
++num_bulk_out;
|
||||
}
|
||||
}
|
||||
|
||||
if (num_bulk_out == 0) {
|
||||
dev_dbg(&serial->dev->dev, "Invalid interface, discarding\n");
|
||||
/* Ignore the first interface, which has no bulk endpoints. */
|
||||
if (epds->num_bulk_out == 0) {
|
||||
dev_dbg(&serial->interface->dev,
|
||||
"ignoring interface with no bulk-out endpoints\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int aircable_process_packet(struct usb_serial_port *port,
|
||||
@ -164,9 +145,8 @@ static struct usb_serial_driver aircable_device = {
|
||||
.name = "aircable",
|
||||
},
|
||||
.id_table = id_table,
|
||||
.num_ports = 1,
|
||||
.bulk_out_size = HCI_COMPLETE_FRAME,
|
||||
.probe = aircable_probe,
|
||||
.calc_num_ports = aircable_calc_num_ports,
|
||||
.process_read_urb = aircable_process_read_urb,
|
||||
.prepare_write_buffer = aircable_prepare_write_buffer,
|
||||
.throttle = usb_serial_generic_throttle,
|
||||
|
Loading…
Reference in New Issue
Block a user