1<html><head><meta http-equiv="Content-Type" content="text/html; charset=ANSI_X3.4-1968"><title>usb_bulk_msg</title><meta name="generator" content="DocBook XSL Stylesheets V1.78.1"><link rel="home" href="index.html" title="The Linux-USB Host Side API"><link rel="up" href="usbcore.html" title="Chapter&#160;5.&#160;USB Core APIs"><link rel="prev" href="API-usb-interrupt-msg.html" title="usb_interrupt_msg"><link rel="next" href="API-usb-sg-init.html" title="usb_sg_init"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center"><span class="phrase">usb_bulk_msg</span></th></tr><tr><td width="20%" align="left"><a accesskey="p" href="API-usb-interrupt-msg.html">Prev</a>&#160;</td><th width="60%" align="center">Chapter&#160;5.&#160;USB Core APIs</th><td width="20%" align="right">&#160;<a accesskey="n" href="API-usb-sg-init.html">Next</a></td></tr></table><hr></div><div class="refentry"><a name="API-usb-bulk-msg"></a><div class="titlepage"></div><div class="refnamediv"><h2>Name</h2><p>usb_bulk_msg &#8212; 
2     Builds a bulk urb, sends it off and waits for completion
3 </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><div class="funcsynopsis"><table border="0" class="funcprototype-table" summary="Function synopsis" style="cellspacing: 0; cellpadding: 0;"><tr><td><code class="funcdef">int <b class="fsfunc">usb_bulk_msg </b>(</code></td><td>struct usb_device * <var class="pdparam">usb_dev</var>, </td></tr><tr><td>&#160;</td><td>unsigned int <var class="pdparam">pipe</var>, </td></tr><tr><td>&#160;</td><td>void * <var class="pdparam">data</var>, </td></tr><tr><td>&#160;</td><td>int <var class="pdparam">len</var>, </td></tr><tr><td>&#160;</td><td>int * <var class="pdparam">actual_length</var>, </td></tr><tr><td>&#160;</td><td>int <var class="pdparam">timeout</var><code>)</code>;</td></tr></table><div class="funcprototype-spacer">&#160;</div></div></div><div class="refsect1"><a name="idp1116151884"></a><h2>Arguments</h2><div class="variablelist"><dl class="variablelist"><dt><span class="term"><em class="parameter"><code>usb_dev</code></em></span></dt><dd><p>
4     pointer to the usb device to send the message to
5    </p></dd><dt><span class="term"><em class="parameter"><code>pipe</code></em></span></dt><dd><p>
6     endpoint <span class="quote">&#8220;<span class="quote">pipe</span>&#8221;</span> to send the message to
7    </p></dd><dt><span class="term"><em class="parameter"><code>data</code></em></span></dt><dd><p>
8     pointer to the data to send
9    </p></dd><dt><span class="term"><em class="parameter"><code>len</code></em></span></dt><dd><p>
10     length in bytes of the data to send
11    </p></dd><dt><span class="term"><em class="parameter"><code>actual_length</code></em></span></dt><dd><p>
12     pointer to a location to put the actual length transferred
13     in bytes
14    </p></dd><dt><span class="term"><em class="parameter"><code>timeout</code></em></span></dt><dd><p>
15     time in msecs to wait for the message to complete before
16     timing out (if 0 the wait is forever)
17    </p></dd></dl></div></div><div class="refsect1"><a name="idp1116158780"></a><h2>Context</h2><p>
18   !in_interrupt ()
19</p></div><div class="refsect1"><a name="idp1116159356"></a><h2>Description</h2><p>
20   This function sends a simple bulk message to a specified endpoint
21   and waits for the message to complete, or timeout.
22   </p><p>
23
24   Don't use this function from within an interrupt context, like a bottom half
25   handler.  If you need an asynchronous message, or need to send a message
26   from within interrupt context, use <code class="function">usb_submit_urb</code> If a thread in your
27   driver uses this call, make sure your <code class="function">disconnect</code> method can wait for it to
28   complete.  Since you don't have a handle on the URB used, you can't cancel
29   the request.
30   </p><p>
31
32   Because there is no <code class="function">usb_interrupt_msg</code> and no USBDEVFS_INTERRUPT ioctl,
33   users are forced to abuse this routine by using it to submit URBs for
34   interrupt endpoints.  We will take the liberty of creating an interrupt URB
35   (with the default interval) if the target is an interrupt endpoint.
36</p></div><div class="refsect1"><a name="idp1116161940"></a><h2>Return</h2><p>
37   If successful, 0. Otherwise a negative error number. The number of actual
38   bytes transferred will be stored in the <em class="parameter"><code>actual_length</code></em> parameter.
39</p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="API-usb-interrupt-msg.html">Prev</a>&#160;</td><td width="20%" align="center"><a accesskey="u" href="usbcore.html">Up</a></td><td width="40%" align="right">&#160;<a accesskey="n" href="API-usb-sg-init.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"><span class="phrase">usb_interrupt_msg</span>&#160;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&#160;<span class="phrase">usb_sg_init</span></td></tr></table></div></body></html>
40