static int isku_receive_control_status(struct usb_device *usb_dev)
{
	int retval;
	struct isku_control control;

	do {
		msleep(50);
		retval = isku_receive(usb_dev, ISKU_COMMAND_CONTROL,
				&control, sizeof(struct isku_control));

		if (retval)
			return retval;

		switch (control.value) {
		case ISKU_CONTROL_VALUE_STATUS_OK:
			return 0;
		case ISKU_CONTROL_VALUE_STATUS_WAIT:
			continue;
		case ISKU_CONTROL_VALUE_STATUS_INVALID:
		/* seems to be critical - replug necessary */
		case ISKU_CONTROL_VALUE_STATUS_OVERLOAD:
			return -EINVAL;
		default:
			hid_err(usb_dev, "isku_receive_control_status: "
					"unknown response value 0x%x\n",
					control.value);
			return -EINVAL;
		}

	} while (1);
}
示例#2
0
static int isku_get_actual_profile(struct usb_device *usb_dev)
{
	struct isku_actual_profile buf;
	int retval;

	retval = isku_receive(usb_dev, ISKU_COMMAND_ACTUAL_PROFILE,
			&buf, sizeof(struct isku_actual_profile));
	return retval ? retval : buf.actual_profile;
}
示例#3
0
static ssize_t isku_sysfs_read(struct file *fp, struct kobject *kobj,
		char *buf, loff_t off, size_t count,
		size_t real_size, uint command)
{
	struct device *dev =
			container_of(kobj, struct device, kobj)->parent->parent;
	struct isku_device *isku = hid_get_drvdata(dev_get_drvdata(dev));
	struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
	int retval;

	if (off >= real_size)
		return 0;

	if (off != 0 || count > real_size)
		return -EINVAL;

	mutex_lock(&isku->isku_lock);
	retval = isku_receive(usb_dev, command, buf, count);
	mutex_unlock(&isku->isku_lock);

	return retval ? retval : count;
}