static int ir_startup(struct usb_serial *serial) { struct usb_irda_cs_descriptor *irda_desc; irda_desc = irda_usb_find_class_desc(serial->dev, 0); if (!irda_desc) { dev_err(&serial->dev->dev, "IRDA class descriptor not found, device not bound\n"); return -ENODEV; } dbg("%s - Baud rates supported:%s%s%s%s%s%s%s%s%s", __func__, (irda_desc->wBaudRate & USB_IRDA_BR_2400) ? " 2400" : "", (irda_desc->wBaudRate & USB_IRDA_BR_9600) ? " 9600" : "", (irda_desc->wBaudRate & USB_IRDA_BR_19200) ? " 19200" : "", (irda_desc->wBaudRate & USB_IRDA_BR_38400) ? " 38400" : "", (irda_desc->wBaudRate & USB_IRDA_BR_57600) ? " 57600" : "", (irda_desc->wBaudRate & USB_IRDA_BR_115200) ? " 115200" : "", (irda_desc->wBaudRate & USB_IRDA_BR_576000) ? " 576000" : "", (irda_desc->wBaudRate & USB_IRDA_BR_1152000) ? " 1152000" : "", (irda_desc->wBaudRate & USB_IRDA_BR_4000000) ? " 4000000" : ""); switch (irda_desc->bmAdditionalBOFs) { case USB_IRDA_AB_48: ir_add_bof = 48; break; case USB_IRDA_AB_24: ir_add_bof = 24; break; case USB_IRDA_AB_12: ir_add_bof = 12; break; case USB_IRDA_AB_6: ir_add_bof = 6; break; case USB_IRDA_AB_3: ir_add_bof = 3; break; case USB_IRDA_AB_2: ir_add_bof = 2; break; case USB_IRDA_AB_1: ir_add_bof = 1; break; case USB_IRDA_AB_0: ir_add_bof = 0; break; default: break; } kfree(irda_desc); return 0; }
static int ir_startup (struct usb_serial *serial) { struct irda_class_desc *irda_desc; irda_desc = irda_usb_find_class_desc (serial->dev, 0); if (irda_desc == NULL) { err ("IRDA class descriptor not found, device not bound"); return -ENODEV; } dbg (__FUNCTION__" - Baud rates supported: %s%s%s%s%s%s%s%s%s", (irda_desc->wBaudRate & 0x0001) ? "2400 " : "", irda_desc->wBaudRate & 0x0002 ? "9600 " : "", irda_desc->wBaudRate & 0x0004 ? "19200 " : "", irda_desc->wBaudRate & 0x0008 ? "38400 " : "", irda_desc->wBaudRate & 0x0010 ? "57600 " : "", irda_desc->wBaudRate & 0x0020 ? "115200 " : "", irda_desc->wBaudRate & 0x0040 ? "576000 " : "", irda_desc->wBaudRate & 0x0080 ? "1152000 " : "", irda_desc->wBaudRate & 0x0100 ? "4000000 " : ""); kfree (irda_desc); return 0; }
static int ir_startup (struct usb_serial *serial) { struct irda_class_desc *irda_desc; irda_desc = irda_usb_find_class_desc (serial->dev, 0); if (irda_desc == NULL) { err ("IRDA class descriptor not found, device not bound"); return -ENODEV; } dbg ("%s - Baud rates supported:%s%s%s%s%s%s%s%s%s", __FUNCTION__, (irda_desc->wBaudRate & 0x0001) ? " 2400" : "", (irda_desc->wBaudRate & 0x0002) ? " 9600" : "", (irda_desc->wBaudRate & 0x0004) ? " 19200" : "", (irda_desc->wBaudRate & 0x0008) ? " 38400" : "", (irda_desc->wBaudRate & 0x0010) ? " 57600" : "", (irda_desc->wBaudRate & 0x0020) ? " 115200" : "", (irda_desc->wBaudRate & 0x0040) ? " 576000" : "", (irda_desc->wBaudRate & 0x0080) ? " 1152000" : "", (irda_desc->wBaudRate & 0x0100) ? " 4000000" : ""); switch( irda_desc->bmAdditionalBOFs ) { case 0x01: ir_add_bof = 48; break; case 0x02: ir_add_bof = 24; break; case 0x04: ir_add_bof = 12; break; case 0x08: ir_add_bof = 6; break; case 0x10: ir_add_bof = 3; break; case 0x20: ir_add_bof = 2; break; case 0x40: ir_add_bof = 1; break; case 0x80: ir_add_bof = 0; break; default: } kfree (irda_desc); return 0; } static int ir_open (struct usb_serial_port *port, struct file *filp) { struct usb_serial *serial = port->serial; char *buffer; int result = 0; if (port_paranoia_check (port, __FUNCTION__)) return -ENODEV; dbg("%s - port %d", __FUNCTION__, port->number); down (&port->sem); ++port->open_count; MOD_INC_USE_COUNT; if (!port->active) { port->active = 1; if (buffer_size) { /* override the default buffer sizes */ buffer = kmalloc (buffer_size, GFP_KERNEL); if (!buffer) { err ("%s - out of memory.", __FUNCTION__); return -ENOMEM; } kfree (port->read_urb->transfer_buffer); port->read_urb->transfer_buffer = buffer; port->read_urb->transfer_buffer_length = buffer_size; buffer = kmalloc (buffer_size, GFP_KERNEL); if (!buffer) { err ("%s - out of memory.", __FUNCTION__); return -ENOMEM; } kfree (port->write_urb->transfer_buffer); port->write_urb->transfer_buffer = buffer; port->write_urb->transfer_buffer_length = buffer_size; port->bulk_out_size = buffer_size; } /* Start reading from the device */ usb_fill_bulk_urb ( port->read_urb, serial->dev, usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, ir_read_bulk_callback, port); port->read_urb->transfer_flags = USB_QUEUE_BULK; result = usb_submit_urb(port->read_urb); if (result) err("%s - failed submitting read urb, error %d", __FUNCTION__, result); } up (&port->sem); return result; } static void ir_close (struct usb_serial_port *port, struct file * filp) { struct usb_serial *serial; if (port_paranoia_check (port, __FUNCTION__)) return; dbg("%s - port %d", __FUNCTION__, port->number); serial = get_usb_serial (port, __FUNCTION__); if (!serial) return; down (&port->sem); --port->open_count; if (port->open_count <= 0) { if (serial->dev) { /* shutdown our bulk read */ usb_unlink_urb (port->read_urb); } port->active = 0; port->open_count = 0; } up (&port->sem); MOD_DEC_USE_COUNT; } static int ir_write (struct usb_serial_port *port, int from_user, const unsigned char *buf, int count) { unsigned char *transfer_buffer; int result; int transfer_size; dbg("%s - port = %d, count = %d", __FUNCTION__, port->number, count); if (!port->tty) { err ("%s - no tty???", __FUNCTION__); return 0; } if (count == 0) return 0; if (port->write_urb->status == -EINPROGRESS) { dbg ("%s - already writing", __FUNCTION__); return 0; } transfer_buffer = port->write_urb->transfer_buffer; transfer_size = min(count, port->bulk_out_size - 1); /* * The first byte of the packet we send to the device contains an * inband header which indicates an additional number of BOFs and * a baud rate change. * * See section 5.4.2.2 of the USB IrDA spec. */ *transfer_buffer = ir_xbof | ir_baud; ++transfer_buffer; if (from_user) { if (copy_from_user (transfer_buffer, buf, transfer_size)) return -EFAULT; } else { memcpy (transfer_buffer, buf, transfer_size); } usb_fill_bulk_urb ( port->write_urb, port->serial->dev, usb_sndbulkpipe(port->serial->dev, port->bulk_out_endpointAddress), port->write_urb->transfer_buffer, transfer_size + 1, ir_write_bulk_callback, port); port->write_urb->transfer_flags = USB_QUEUE_BULK | USB_ZERO_PACKET; result = usb_submit_urb (port->write_urb); if (result) err("%s - failed submitting write urb, error %d", __FUNCTION__, result); else result = transfer_size; return result; }