Example #1
0
/* hci_uart_tty_ioctl()
 *
 *    Process IOCTL system call for the tty device.
 *
 * Arguments:
 *
 *    tty        pointer to tty instance data
 *    file       pointer to open file object for device
 *    cmd        IOCTL command code
 *    arg        argument for IOCTL call (cmd dependent)
 *
 * Return Value:    Command dependent
 */
static int hci_uart_tty_ioctl(struct tty_struct *tty, struct file * file,
                              unsigned int cmd, unsigned long arg)
{
    struct hci_uart *hu = (void *)tty->disc_data;
    int err = 0;

    BT_DBG("");

    /* Verify the status of the device */
    if (!hu)
        return -EBADF;

    switch (cmd) {
    case HCIUARTSETPROTO:
        if (!test_and_set_bit(HCI_UART_PROTO_SET_IN_PROGRESS,
                              &hu->flags) && !test_bit(HCI_UART_PROTO_SET,
                                      &hu->flags)) {
            err = hci_uart_set_proto(hu, arg);
            if (err) {
                clear_bit(HCI_UART_PROTO_SET_IN_PROGRESS,
                          &hu->flags);
                return err;
            } else {
                set_bit(HCI_UART_PROTO_SET, &hu->flags);
                clear_bit(HCI_UART_PROTO_SET_IN_PROGRESS,
                          &hu->flags);
            }
        } else
            return -EBUSY;
        break;

    case HCIUARTGETPROTO:
        if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
            return hu->proto->id;
        return -EUNATCH;

    case HCIUARTGETDEVICE:
        if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
            return hu->hdev->id;
        return -EUNATCH;

    case HCIUARTSETFLAGS:
        if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
            return -EBUSY;
        hu->hdev_flags = arg;
        break;

    case HCIUARTGETFLAGS:
        return hu->hdev_flags;

    default:
        err = n_tty_ioctl_helper(tty, file, cmd, arg);
        break;
    };

    return err;
}
/* hci_uart_tty_ioctl()
 *
 *    Process IOCTL system call for the tty device.
 *
 * Arguments:
 *
 *    tty        pointer to tty instance data
 *    file       pointer to open file object for device
 *    cmd        IOCTL command code
 *    arg        argument for IOCTL call (cmd dependent)
 *
 * Return Value:    Command dependent
 */
static int hci_uart_tty_ioctl(struct tty_struct *tty, struct file *file,
			      unsigned int cmd, unsigned long arg)
{
	struct hci_uart *hu = tty->disc_data;
	int err = 0;

	BT_DBG("");

	/* Verify the status of the device */
	if (!hu)
		return -EBADF;

	switch (cmd) {
	case HCIUARTSETPROTO:
		if (!test_and_set_bit(HCI_UART_PROTO_SET, &hu->flags)) {
			err = hci_uart_set_proto(hu, arg);
			if (err)
				clear_bit(HCI_UART_PROTO_SET, &hu->flags);
		} else
			err = -EBUSY;
		break;

	case HCIUARTGETPROTO:
		if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
			err = hu->proto->id;
		else
			err = -EUNATCH;
		break;

	case HCIUARTGETDEVICE:
		if (test_bit(HCI_UART_REGISTERED, &hu->flags))
			err = hu->hdev->id;
		else
			err = -EUNATCH;
		break;

	case HCIUARTSETFLAGS:
		if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
			err = -EBUSY;
		else
			err = hci_uart_set_flags(hu, arg);
		break;

	case HCIUARTGETFLAGS:
		err = hu->hdev_flags;
		break;

	default:
		err = n_tty_ioctl_helper(tty, file, cmd, arg);
		break;
	}

	return err;
}
Example #3
0
/* hci_uart_tty_ioctl()
 *
 *    Process IOCTL system call for the tty device.
 *
 * Arguments:
 *
 *    tty        pointer to tty instance data
 *    file       pointer to open file object for device
 *    cmd        IOCTL command code
 *    arg        argument for IOCTL call (cmd dependent)
 *
 * Return Value:    Command dependent
 */
static int hci_uart_tty_ioctl(cyg_io_handle_t tty, struct CYG_FILE_TAG * file,
                            unsigned int cmd, unsigned long arg)
{
	struct hci_uart *hu = (struct hci_uart *)serial_getdisc(tty);//(void *)tty->disc_data;
	int err = 0;

//	BT_DBG("");
	/* Verify the status of the device */
	if (!hu)
		return -EBADF;

//diag_printf("hci_uart_tty_ioctl tty=%x,hu=%x\n",tty,hu);

	switch (cmd) {
	case HCIUARTSETPROTO:
		if (!test_and_set_bit(HCI_UART_PROTO_SET, &hu->flags)) {
			err = hci_uart_set_proto(hu, arg);
			if (err) {
				clear_bit(HCI_UART_PROTO_SET, &hu->flags);
				return err;
			}
			//tty->low_latency = 1;
		} else	
			return -EBUSY;
//diag_printf("HCIUARTGETPROTO\n");
	case HCIUARTGETPROTO:
		if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
			return hu->proto->id;

		return -EUNATCH;
		
	default:
		err = cyg_io_ioctl(tty, cmd, (char*)arg);//? arg?
		//err = n_tty_ioctl(tty, file, cmd, arg);
		break;
	};

	return err;
}
Example #4
0
/* hci_uart_tty_ioctl()
 *
 *    Process IOCTL system call for the tty device.
 *
 * Arguments:
 *
 *    tty        pointer to tty instance data
 *    file       pointer to open file object for device
 *    cmd        IOCTL command code
 *    arg        argument for IOCTL call (cmd dependent)
 *
 * Return Value:    Command dependent
 */
static int hci_uart_tty_ioctl(struct tty_struct *tty, struct file * file,
                            unsigned int cmd, unsigned long arg)
{
	struct hci_uart *hu = (void *)tty->disc_data;
	int err = 0;

	BT_DBG("");

	/* Verify the status of the device */
	if (!hu)
		return -EBADF;

	switch (cmd) {
	case HCIUARTSETPROTO:
		if (!test_and_set_bit(HCI_UART_PROTO_SET, &hu->flags)) {
			err = hci_uart_set_proto(hu, arg);
			if (err) {
				clear_bit(HCI_UART_PROTO_SET, &hu->flags);
				return err;
			}
			tty->low_latency = 1;
		} else	
			return -EBUSY;
		break;

	case HCIUARTGETPROTO:
		if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
			return hu->proto->id;
		return -EUNATCH;
		
	default:
		err = n_tty_ioctl(tty, file, cmd, arg);
		break;
	};

	return err;
}