---
name: "usb_control_msg"
section: "9"
platform: "linux"
package: "linux-manual-4.9"
version: "4.9.228-1"
release: "Debian 9 (Stretch)"
platforms: ["linux"]
url: "https://new.carta.tech/usb_control_msg/9"
---

# usb\_control\_msg(9)

Builds a control urb, sends it off and waits for completion

## NAME

usb\_control\_msg - Builds a control urb, sends it off and waits for completion

## SYNOPSIS

**int usb\_control\_msg(struct usb\_device \*** *dev***, unsigned int** *pipe***, \_\_u8** *request***, \_\_u8** *requesttype***, \_\_u16** *value***, \_\_u16** *index***, void \*** *data***, \_\_u16** *size***, int** *timeout***);**

## ARGUMENTS

*dev*

pointer to the usb device to send the message to

*pipe*

endpoint “pipe” to send the message to

*request*

USB message request value

*requesttype*

USB message request type value

*value*

USB message value

*index*

USB message index value

*data*

pointer to the data to send

*size*

length in bytes of the data to send

*timeout*

time in msecs to wait for the message to complete before timing out (if 0 the wait is forever)

## CONTEXT

!in\_interrupt ()

## DESCRIPTION

This function sends a simple control message to a specified endpoint and waits for the message to complete, or timeout.

Don't use this function from within an interrupt context, like a bottom half handler. If you need an asynchronous message, or need to send a message from within interrupt context, use **usb\_submit\_urb**. If a thread in your driver uses this call, make sure your **disconnect** method can wait for it to complete. Since you don't have a handle on the URB used, you can't cancel the request.

## RETURN

If successful, the number of bytes transferred. Otherwise, a negative error number.

## COPYRIGHT
