^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * USB IR Dongle driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2001-2002 Greg Kroah-Hartman (greg@kroah.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2002 Gary Brubaker (xavyer@ix.netcom.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (C) 2010 Johan Hovold (jhovold@gmail.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * This driver allows a USB IrDA device to be used as a "dumb" serial device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * This can be useful if you do not have access to a full IrDA stack on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * other side of the connection. If you do have an IrDA stack on both devices,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * please use the usb-irda driver, as it contains the proper error checking and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * other goodness of a full IrDA stack.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * Portions of this driver were taken from drivers/net/irda/irda-usb.c, which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * was written by Roman Weissgaerber <weissg@vienna.at>, Dag Brattli
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * <dag@brattli.net>, and Jean Tourrilhes <jt@hpl.hp.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * See Documentation/usb/usb-serial.rst for more information on using this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/tty.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/tty_driver.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/tty_flip.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <linux/spinlock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <linux/usb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <linux/usb/serial.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <linux/usb/irda.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Johan Hovold <jhovold@gmail.com>"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define DRIVER_DESC "USB IR Dongle driver"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) /* if overridden by the user, then use their value for the size of the read and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * write urbs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) static int buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) /* if overridden by the user, then use the specified number of XBOFs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) static int xbof = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) static int ir_startup (struct usb_serial *serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) static int ir_write(struct tty_struct *tty, struct usb_serial_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) const unsigned char *buf, int count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) static int ir_write_room(struct tty_struct *tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) static void ir_write_bulk_callback(struct urb *urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) static void ir_process_read_urb(struct urb *urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) static void ir_set_termios(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) struct usb_serial_port *port, struct ktermios *old_termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) /* Not that this lot means you can only have one per system */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) static u8 ir_baud;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) static u8 ir_xbof;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) static u8 ir_add_bof;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) static const struct usb_device_id ir_id_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) { USB_DEVICE(0x050f, 0x0180) }, /* KC Technology, KC-180 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) { USB_DEVICE(0x08e9, 0x0100) }, /* XTNDAccess */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) { USB_DEVICE(0x09c4, 0x0011) }, /* ACTiSys ACT-IR2000U */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) { USB_INTERFACE_INFO(USB_CLASS_APP_SPEC, USB_SUBCLASS_IRDA, 0) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) { } /* Terminating entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) MODULE_DEVICE_TABLE(usb, ir_id_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) static struct usb_serial_driver ir_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) .name = "ir-usb",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) .description = "IR Dongle",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) .id_table = ir_id_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) .num_ports = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) .num_bulk_in = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) .num_bulk_out = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .set_termios = ir_set_termios,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) .attach = ir_startup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) .write = ir_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) .write_room = ir_write_room,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) .write_bulk_callback = ir_write_bulk_callback,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) .process_read_urb = ir_process_read_urb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) static struct usb_serial_driver * const serial_drivers[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) &ir_device, NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) static inline void irda_usb_dump_class_desc(struct usb_serial *serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) struct usb_irda_cs_descriptor *desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) struct device *dev = &serial->dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) dev_dbg(dev, "bLength=%x\n", desc->bLength);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) dev_dbg(dev, "bDescriptorType=%x\n", desc->bDescriptorType);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) dev_dbg(dev, "bcdSpecRevision=%x\n", __le16_to_cpu(desc->bcdSpecRevision));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) dev_dbg(dev, "bmDataSize=%x\n", desc->bmDataSize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) dev_dbg(dev, "bmWindowSize=%x\n", desc->bmWindowSize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) dev_dbg(dev, "bmMinTurnaroundTime=%d\n", desc->bmMinTurnaroundTime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) dev_dbg(dev, "wBaudRate=%x\n", __le16_to_cpu(desc->wBaudRate));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) dev_dbg(dev, "bmAdditionalBOFs=%x\n", desc->bmAdditionalBOFs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) dev_dbg(dev, "bIrdaRateSniff=%x\n", desc->bIrdaRateSniff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) dev_dbg(dev, "bMaxUnicastList=%x\n", desc->bMaxUnicastList);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) /*------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) * Function irda_usb_find_class_desc(dev, ifnum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) * Returns instance of IrDA class descriptor, or NULL if not found
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) * The class descriptor is some extra info that IrDA USB devices will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) * offer to us, describing their IrDA characteristics. We will use that in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) * irda_usb_init_qos()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) * Based on the same function in drivers/net/irda/irda-usb.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) static struct usb_irda_cs_descriptor *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) irda_usb_find_class_desc(struct usb_serial *serial, unsigned int ifnum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) struct usb_device *dev = serial->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) struct usb_irda_cs_descriptor *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) desc = kzalloc(sizeof(*desc), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) if (!desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) USB_REQ_CS_IRDA_GET_CLASS_DESC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 0, ifnum, desc, sizeof(*desc), 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) dev_dbg(&serial->dev->dev, "%s - ret=%d\n", __func__, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) if (ret < (int)sizeof(*desc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) dev_dbg(&serial->dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) "%s - class descriptor read %s (%d)\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) (ret < 0) ? "failed" : "too short", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) if (desc->bDescriptorType != USB_DT_CS_IRDA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) dev_dbg(&serial->dev->dev, "%s - bad class descriptor type\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) irda_usb_dump_class_desc(serial, desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) return desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) kfree(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) static u8 ir_xbof_change(u8 xbof)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) u8 result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) /* reference irda-usb.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) switch (xbof) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) case 48:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) result = 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) case 28:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) case 24:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) result = 0x20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) case 12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) result = 0x30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) case 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) case 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) result = 0x40;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) result = 0x50;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) result = 0x60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) result = 0x70;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) result = 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) return(result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) static int ir_startup(struct usb_serial *serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) struct usb_irda_cs_descriptor *irda_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) int rates;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) irda_desc = irda_usb_find_class_desc(serial, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) if (!irda_desc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) dev_err(&serial->dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) "IRDA class descriptor not found, device not bound\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) rates = le16_to_cpu(irda_desc->wBaudRate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) dev_dbg(&serial->dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) "%s - Baud rates supported:%s%s%s%s%s%s%s%s%s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) (rates & USB_IRDA_BR_2400) ? " 2400" : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) (rates & USB_IRDA_BR_9600) ? " 9600" : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) (rates & USB_IRDA_BR_19200) ? " 19200" : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) (rates & USB_IRDA_BR_38400) ? " 38400" : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) (rates & USB_IRDA_BR_57600) ? " 57600" : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) (rates & USB_IRDA_BR_115200) ? " 115200" : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) (rates & USB_IRDA_BR_576000) ? " 576000" : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) (rates & USB_IRDA_BR_1152000) ? " 1152000" : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) (rates & USB_IRDA_BR_4000000) ? " 4000000" : "");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) switch (irda_desc->bmAdditionalBOFs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) case USB_IRDA_AB_48:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) ir_add_bof = 48;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) case USB_IRDA_AB_24:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) ir_add_bof = 24;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) case USB_IRDA_AB_12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) ir_add_bof = 12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) case USB_IRDA_AB_6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) ir_add_bof = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) case USB_IRDA_AB_3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) ir_add_bof = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) case USB_IRDA_AB_2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) ir_add_bof = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) case USB_IRDA_AB_1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) ir_add_bof = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) case USB_IRDA_AB_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) ir_add_bof = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) kfree(irda_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) static int ir_write(struct tty_struct *tty, struct usb_serial_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) const unsigned char *buf, int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) struct urb *urb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) if (port->bulk_out_size == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) if (count == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) count = min(count, port->bulk_out_size - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) spin_lock_irqsave(&port->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) if (__test_and_clear_bit(0, &port->write_urbs_free)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) urb = port->write_urbs[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) port->tx_bytes += count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) spin_unlock_irqrestore(&port->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) if (!urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) * The first byte of the packet we send to the device contains an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) * outbound header which indicates an additional number of BOFs and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) * a baud rate change.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) * See section 5.4.2.2 of the USB IrDA spec.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) *(u8 *)urb->transfer_buffer = ir_xbof | ir_baud;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) memcpy(urb->transfer_buffer + 1, buf, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) urb->transfer_buffer_length = count + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) urb->transfer_flags = URB_ZERO_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) ret = usb_submit_urb(urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) dev_err(&port->dev, "failed to submit write urb: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) spin_lock_irqsave(&port->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) __set_bit(0, &port->write_urbs_free);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) port->tx_bytes -= count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) spin_unlock_irqrestore(&port->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) static void ir_write_bulk_callback(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) struct usb_serial_port *port = urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) int status = urb->status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) spin_lock_irqsave(&port->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) __set_bit(0, &port->write_urbs_free);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) port->tx_bytes -= urb->transfer_buffer_length - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) spin_unlock_irqrestore(&port->lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) switch (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) case -ENOENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) case -ECONNRESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) case -ESHUTDOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) dev_dbg(&port->dev, "write urb stopped: %d\n", status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) case -EPIPE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) dev_err(&port->dev, "write urb stopped: %d\n", status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) dev_err(&port->dev, "nonzero write-urb status: %d\n", status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) usb_serial_port_softint(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) static int ir_write_room(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) int count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) if (port->bulk_out_size == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) if (test_bit(0, &port->write_urbs_free))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) count = port->bulk_out_size - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) static void ir_process_read_urb(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) struct usb_serial_port *port = urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) unsigned char *data = urb->transfer_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) if (!urb->actual_length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) * The first byte of the packet we get from the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) * contains a busy indicator and baud rate change.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) * See section 5.4.1.2 of the USB IrDA spec.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) if (*data & 0x0f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) ir_baud = *data & 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) if (urb->actual_length == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) tty_insert_flip_string(&port->port, data + 1, urb->actual_length - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) tty_flip_buffer_push(&port->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) static void ir_set_termios(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) struct usb_serial_port *port, struct ktermios *old_termios)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) struct usb_device *udev = port->serial->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) unsigned char *transfer_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) int actual_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) speed_t baud;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) int ir_baud;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) baud = tty_get_baud_rate(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) * FIXME, we should compare the baud request against the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) * capability stated in the IR header that we got in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) * startup function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) switch (baud) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) case 2400:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) ir_baud = USB_IRDA_LS_2400;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) case 9600:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) ir_baud = USB_IRDA_LS_9600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) case 19200:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) ir_baud = USB_IRDA_LS_19200;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) case 38400:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) ir_baud = USB_IRDA_LS_38400;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) case 57600:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) ir_baud = USB_IRDA_LS_57600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) case 115200:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) ir_baud = USB_IRDA_LS_115200;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) case 576000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) ir_baud = USB_IRDA_LS_576000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) case 1152000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) ir_baud = USB_IRDA_LS_1152000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) case 4000000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) ir_baud = USB_IRDA_LS_4000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) ir_baud = USB_IRDA_LS_9600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) baud = 9600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) if (xbof == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) ir_xbof = ir_xbof_change(ir_add_bof);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) ir_xbof = ir_xbof_change(xbof) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) /* Only speed changes are supported */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) tty_termios_copy_hw(&tty->termios, old_termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) tty_encode_baud_rate(tty, baud, baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) * send the baud change out on an "empty" data packet
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) transfer_buffer = kmalloc(1, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) if (!transfer_buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) *transfer_buffer = ir_xbof | ir_baud;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) ret = usb_bulk_msg(udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) usb_sndbulkpipe(udev, port->bulk_out_endpointAddress),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) transfer_buffer, 1, &actual_length, 5000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) if (ret || actual_length != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) ret = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) dev_err(&port->dev, "failed to change line speed: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) kfree(transfer_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) static int __init ir_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) if (buffer_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) ir_device.bulk_in_size = buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) ir_device.bulk_out_size = buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) return usb_serial_register_drivers(serial_drivers, KBUILD_MODNAME, ir_id_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) static void __exit ir_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) usb_serial_deregister_drivers(serial_drivers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) module_init(ir_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) module_exit(ir_exit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) MODULE_AUTHOR(DRIVER_AUTHOR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) MODULE_DESCRIPTION(DRIVER_DESC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) module_param(xbof, int, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) MODULE_PARM_DESC(xbof, "Force specific number of XBOFs");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) module_param(buffer_size, int, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) MODULE_PARM_DESC(buffer_size, "Size of the transfer buffers");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486)