/** * Replace all IEs currently being transmitted by a device * * @cmd: pointer to the SET-IE command with the IEs to set * @size: size of @buf */ int uwb_rc_set_ie(struct uwb_rc *rc, struct uwb_rc_cmd_set_ie *cmd) { int result; struct device *dev = &rc->uwb_dev.dev; struct uwb_rc_evt_set_ie reply; reply.rceb.bEventType = UWB_RC_CET_GENERAL; reply.rceb.wEvent = UWB_RC_CMD_SET_IE; result = uwb_rc_cmd(rc, "SET-IE", &cmd->rccb, sizeof(*cmd) + le16_to_cpu(cmd->wIELength), &reply.rceb, sizeof(reply)); if (result < 0) goto error_cmd; else if (result != sizeof(reply)) { dev_err(dev, "SET-IE: not enough data to decode reply " "(%d bytes received vs %zu needed)\n", result, sizeof(reply)); result = -EIO; } else if (reply.bResultCode != UWB_RC_RES_SUCCESS) { dev_err(dev, "SET-IE: command execution failed: %s (%d)\n", uwb_rc_strerror(reply.bResultCode), reply.bResultCode); result = -EIO; } else result = 0; error_cmd: return result; }
/** * Reset a UWB Host Controller (and all radio settings) * * @rc: Host Controller descriptor * @returns: 0 if ok, < 0 errno code on error * * We put the command on kmalloc'ed memory as some arches cannot do * USB from the stack. The reply event is copied from an stage buffer, * so it can be in the stack. See WUSB1.0[8.6.2.4] for more details. */ int uwb_rc_reset(struct uwb_rc *rc) { int result = -ENOMEM; struct uwb_rc_evt_confirm reply; struct uwb_rccb *cmd; size_t cmd_size = sizeof(*cmd); mutex_lock(&rc->uwb_dev.mutex); cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); if (cmd == NULL) goto error_kzalloc; cmd->bCommandType = UWB_RC_CET_GENERAL; cmd->wCommand = cpu_to_le16(UWB_RC_CMD_RESET); reply.rceb.bEventType = UWB_RC_CET_GENERAL; reply.rceb.wEvent = UWB_RC_CMD_RESET; result = uwb_rc_cmd(rc, "RESET", cmd, cmd_size, &reply.rceb, sizeof(reply)); if (result < 0) goto error_cmd; if (reply.bResultCode != UWB_RC_RES_SUCCESS) { dev_err(&rc->uwb_dev.dev, "RESET: command execution failed: %s (%d)\n", uwb_rc_strerror(reply.bResultCode), reply.bResultCode); result = -EIO; } error_cmd: kfree(cmd); error_kzalloc: mutex_unlock(&rc->uwb_dev.mutex); return result; }
/** * Start/stop scanning in a radio controller * * @rc: UWB Radio Controlller * @channel: Channel to scan; encodings in WUSB1.0[Table 5.12] * @type: Type of scanning to do. * @bpst_offset: value at which to start scanning (if type == * UWB_SCAN_ONLY_STARTTIME) * @returns: 0 if ok, < 0 errno code on error * * We put the command on kmalloc'ed memory as some arches cannot do * USB from the stack. The reply event is copied from an stage buffer, * so it can be in the stack. See WUSB1.0[8.6.2.4] for more details. */ int uwb_rc_scan(struct uwb_rc *rc, unsigned channel, enum uwb_scan_type type, unsigned bpst_offset) { int result; struct uwb_rc_cmd_scan *cmd; struct uwb_rc_evt_confirm reply; result = -ENOMEM; cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); if (cmd == NULL) goto error_kzalloc; mutex_lock(&rc->uwb_dev.mutex); cmd->rccb.bCommandType = UWB_RC_CET_GENERAL; cmd->rccb.wCommand = cpu_to_le16(UWB_RC_CMD_SCAN); cmd->bChannelNumber = channel; cmd->bScanState = type; cmd->wStartTime = cpu_to_le16(bpst_offset); reply.rceb.bEventType = UWB_RC_CET_GENERAL; reply.rceb.wEvent = UWB_RC_CMD_SCAN; result = uwb_rc_cmd(rc, "SCAN", &cmd->rccb, sizeof(*cmd), &reply.rceb, sizeof(reply)); if (result < 0) goto error_cmd; if (reply.bResultCode != UWB_RC_RES_SUCCESS) { dev_err(&rc->uwb_dev.dev, "SCAN: command execution failed: %s (%d)\n", uwb_rc_strerror(reply.bResultCode), reply.bResultCode); result = -EIO; goto error_cmd; } rc->scanning = channel; rc->scan_type = type; error_cmd: mutex_unlock(&rc->uwb_dev.mutex); kfree(cmd); error_kzalloc: return result; }