Example #1
0
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;
}
Example #2
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;		
}
Example #3
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;
}