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 5. 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> </td><th width="60%" align="center">Chapter 5. USB Core APIs</th><td width="20%" align="right"> <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 — 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> </td><td>unsigned int <var class="pdparam">pipe</var>, </td></tr><tr><td> </td><td>void * <var class="pdparam">data</var>, </td></tr><tr><td> </td><td>int <var class="pdparam">len</var>, </td></tr><tr><td> </td><td>int * <var class="pdparam">actual_length</var>, </td></tr><tr><td> </td><td>int <var class="pdparam">timeout</var><code>)</code>;</td></tr></table><div class="funcprototype-spacer"> </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">“<span class="quote">pipe</span>”</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> </td><td width="20%" align="center"><a accesskey="u" href="usbcore.html">Up</a></td><td width="40%" align="right"> <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> </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> <span class="phrase">usb_sg_init</span></td></tr></table></div></body></html> 40