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); }
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; }
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; }