sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget8/translations/zh_CN/driver-api/firmware/request_firmwaremodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget8/translations/zh_TW/driver-api/firmware/request_firmwaremodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget8/translations/it_IT/driver-api/firmware/request_firmwaremodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget8/translations/ja_JP/driver-api/firmware/request_firmwaremodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget8/translations/ko_KR/driver-api/firmware/request_firmwaremodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget8/translations/pt_BR/driver-api/firmware/request_firmwaremodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget8/translations/sp_SP/driver-api/firmware/request_firmwaremodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(hrequest_firmware APIh]hrequest_firmware API}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhR/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware.rsthKubh paragraph)}(hYou would typically load firmware and then load it into your device somehow. The typical firmware work flow is reflected below::h]hYou would typically load firmware and then load it into your device somehow. The typical firmware work flow is reflected below:}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh literal_block)}(hif(request_firmware(&fw_entry, $FIRMWARE, device) == 0) copy_fw_to_device(fw_entry->data, fw_entry->size); release_firmware(fw_entry);h]hif(request_firmware(&fw_entry, $FIRMWARE, device) == 0) copy_fw_to_device(fw_entry->data, fw_entry->size); release_firmware(fw_entry);}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhKhhhhubh)}(hhh](h)}(hSynchronous firmware requestsh]hSynchronous firmware requests}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhK ubh)}(hbSynchronous firmware requests will wait until the firmware is found or until an error is returned.h]hbSynchronous firmware requests will wait until the firmware is found or until an error is returned.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hrequest_firmwareh]hrequest_firmware}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singlerequest_firmware (C function)c.request_firmwarehNtauh1jhj hhhNhNubhdesc)}(hhh](hdesc_signature)}(hbint request_firmware (const struct firmware **firmware_p, const char *name, struct device *device)h]hdesc_signature_line)}(haint request_firmware(const struct firmware **firmware_p, const char *name, struct device *device)h](hdesc_sig_keyword_type)}(hinth]hint}(hjAhhhNhNubah}(h]h ]ktah"]h$]h&]uh1j?hj;hhhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMubhdesc_sig_space)}(h h]h }(hjShhhNhNubah}(h]h ]wah"]h$]h&]uh1jQhj;hhhjPhMubh desc_name)}(hrequest_firmwareh]h desc_sig_name)}(hrequest_firmwareh]hrequest_firmware}(hjjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhhjdubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1jbhj;hhhjPhMubhdesc_parameterlist)}(hM(const struct firmware **firmware_p, const char *name, struct device *device)h](hdesc_parameter)}(h"const struct firmware **firmware_ph](hdesc_sig_keyword)}(hconsth]hconst}(hjhhhNhNubah}(h]h ]kah"]h$]h&]uh1jhjubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubj)}(hstructh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubh)}(hhh]ji)}(hfirmwareh]hfirmware}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubah}(h]h ]h"]h$]h&] refdomaincreftype identifier reftargetjmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}jjlsbc.request_firmwareasbuh1hhjubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubji)}(h firmware_ph]h firmware_p}(hj hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(hconst char *nameh](j)}(hjh]hconst}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubjR)}(h h]h }(hjFhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhj5ubj@)}(hcharh]hchar}(hjThhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj5ubjR)}(h h]h }(hjbhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhj5ubj)}(hjh]h*}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubji)}(hnameh]hname}(hj}hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj5ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(hstruct device *deviceh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubh)}(hhh]ji)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.request_firmwareasbuh1hhjubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubji)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubeh}(h]h ]h"]h$]h&]hhuh1jhj;hhhjPhMubeh}(h]h ]h"]h$]h&]hh add_permalinkuh1j9sphinx_line_type declaratorhj5hhhjPhMubah}(h]j,ah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1j3hjPhMhj0hhubh desc_content)}(hhh]h)}(h%send firmware request and wait for ith]h%send firmware request and wait for it}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj0hhhjPhMubeh}(h]h ](jfunctioneh"]h$]h&]domainjobjtypej9desctypej9noindex noindexentrynocontentsentryuh1j.hhhj hNhNubh container)}(hXO**Parameters** ``const struct firmware **firmware_p`` pointer to firmware image ``const char *name`` name of firmware file ``struct device *device`` device for which firmware is being loaded **Description** **firmware_p** will be used to return a firmware image by the name of **name** for device **device**. Should be called from user context where sleeping is allowed. **name** will be used as $FIRMWARE in the uevent environment and should be distinctive enough not to be confused with any other firmware image for this or any other device. It must not contain any ".." path components - "foo/bar..bin" is allowed, but "foo/../bar.bin" is not. Caller must hold the reference count of **device**. The function can be called safely inside device's suspend and resume callback.h](h)}(h**Parameters**h]hstrong)}(hjKh]h Parameters}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhjIubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhjEubhdefinition_list)}(hhh](hdefinition_list_item)}(hA``const struct firmware **firmware_p`` pointer to firmware image h](hterm)}(h&``const struct firmware **firmware_p``h]hliteral)}(hjrh]h"const struct firmware **firmware_p}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjpubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhjjubh definition)}(hhh]h)}(hpointer to firmware imageh]hpointer to firmware image}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjeubji)}(h+``const char *name`` name of firmware file h](jo)}(h``const char *name``h]ju)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhjubj)}(hhh]h)}(hname of firmware fileh]hname of firmware file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjeubji)}(hD``struct device *device`` device for which firmware is being loaded h](jo)}(h``struct device *device``h]ju)}(hjh]hstruct device *device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhjubj)}(hhh]h)}(h)device for which firmware is being loadedh]h)device for which firmware is being loaded}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjeubeh}(h]h ]h"]h$]h&]uh1jchjEubh)}(h**Description**h]jN)}(hj#h]h Description}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jMhj!ubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhjEubh block_quote)}(hX>**firmware_p** will be used to return a firmware image by the name of **name** for device **device**. Should be called from user context where sleeping is allowed. **name** will be used as $FIRMWARE in the uevent environment and should be distinctive enough not to be confused with any other firmware image for this or any other device. It must not contain any ".." path components - "foo/bar..bin" is allowed, but "foo/../bar.bin" is not. Caller must hold the reference count of **device**. The function can be called safely inside device's suspend and resume callback.h](h)}(he**firmware_p** will be used to return a firmware image by the name of **name** for device **device**.h](jN)}(h**firmware_p**h]h firmware_p}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jMhj?ubh8 will be used to return a firmware image by the name of }(hj?hhhNhNubjN)}(h**name**h]hname}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhj?ubh for device }(hj?hhhNhNubjN)}(h **device**h]hdevice}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jMhj?ubh.}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhj;ubh)}(h=Should be called from user context where sleeping is allowed.h]h=Should be called from user context where sleeping is allowed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhj;ubh)}(hX**name** will be used as $FIRMWARE in the uevent environment and should be distinctive enough not to be confused with any other firmware image for this or any other device. It must not contain any ".." path components - "foo/bar..bin" is allowed, but "foo/../bar.bin" is not.h](jN)}(h**name**h]hname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhjubhX will be used as $FIRMWARE in the uevent environment and should be distinctive enough not to be confused with any other firmware image for this or any other device. It must not contain any “..” path components - “foo/bar..bin” is allowed, but “foo/../bar.bin” is not.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhj;ubh)}(h3Caller must hold the reference count of **device**.h](h(Caller must hold the reference count of }(hjhhhNhNubjN)}(h **device**h]hdevice}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhj;ubh)}(hNThe function can be called safely inside device's suspend and resume callback.h]hPThe function can be called safely inside device’s suspend and resume callback.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhj;ubeh}(h]h ]h"]h$]h&]uh1j9hjhMhjEubeh}(h]h ] kernelindentah"]h$]h&]uh1jChj hhhNhNubeh}(h]request-firmwareah ]h"]request_firmwareah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hfirmware_request_nowarnh]hfirmware_request_nowarn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j*$firmware_request_nowarn (C function)c.firmware_request_nowarnhNtauh1jhjhhhNhNubj/)}(hhh](j4)}(hgint firmware_request_nowarn (const struct firmware **firmware, const char *name, struct device *device)h]j:)}(hfint firmware_request_nowarn(const struct firmware **firmware, const char *name, struct device *device)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:25: ./drivers/base/firmware_loader/main.chMubjR)}(h h]h }(hj*hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjhhhj)hMubjc)}(hfirmware_request_nowarnh]ji)}(hfirmware_request_nowarnh]hfirmware_request_nowarn}(hj<hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj8ubah}(h]h ](j|j}eh"]h$]h&]hhuh1jbhjhhhj)hMubj)}(hK(const struct firmware **firmware, const char *name, struct device *device)h](j)}(h const struct firmware **firmwareh](j)}(hjh]hconst}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubjR)}(h h]h }(hjehhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjTubj)}(hjh]hstruct}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjTubh)}(hhh]ji)}(hfirmwareh]hfirmware}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jj>sbc.firmware_request_nowarnasbuh1hhjTubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjTubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubji)}(hfirmwareh]hfirmware}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjTubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjPubj)}(hconst char *nameh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubj@)}(hcharh]hchar}(hj hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubj)}(hjh]h*}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubji)}(hnameh]hname}(hj6hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjPubj)}(hstruct device *deviceh](j)}(hjh]hstruct}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubjR)}(h h]h }(hj\hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjKubh)}(hhh]ji)}(hdeviceh]hdevice}(hjmhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjomodnameN classnameNjj)}j]jc.firmware_request_nowarnasbuh1hhjKubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjKubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubji)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjKubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjPubeh}(h]h ]h"]h$]h&]hhuh1jhjhhhj)hMubeh}(h]h ]h"]h$]h&]hhjuh1j9jjhjhhhj)hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j3hj)hMhjhhubj)}(hhh]h)}(h!request for an optional fw moduleh]h!request for an optional fw module}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:25: ./drivers/base/firmware_loader/main.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj)hMubeh}(h]h ](jfunctioneh"]h$]h&]j=jj>jj?jj@jAjBuh1j.hhhjhNhNubjD)}(hXn**Parameters** ``const struct firmware **firmware`` pointer to firmware image ``const char *name`` name of firmware file ``struct device *device`` device for which firmware is being loaded **Description** This function is similar in behaviour to request_firmware(), except it doesn't produce warning messages when the file is not found. The sysfs fallback mechanism is enabled if direct filesystem lookup fails. However, failures to find the firmware file with it are still suppressed. It is therefore up to the driver to check for the return value of this call and to decide when to inform the users of errors.h](h)}(h**Parameters**h]jN)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhjubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:25: ./drivers/base/firmware_loader/main.chMhjubjd)}(hhh](ji)}(h?``const struct firmware **firmware`` pointer to firmware image h](jo)}(h$``const struct firmware **firmware``h]ju)}(hjh]h const struct firmware **firmware}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:25: ./drivers/base/firmware_loader/main.chMhj ubj)}(hhh]h)}(hpointer to firmware imageh]hpointer to firmware image}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMhj'ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhj&hMhjubji)}(h+``const char *name`` name of firmware file h](jo)}(h``const char *name``h]ju)}(hjJh]hconst char *name}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjHubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:25: ./drivers/base/firmware_loader/main.chMhjDubj)}(hhh]h)}(hname of firmware fileh]hname of firmware file}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hMhj`ubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jhhj_hMhjubji)}(hD``struct device *device`` device for which firmware is being loaded h](jo)}(h``struct device *device``h]ju)}(hjh]hstruct device *device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:25: ./drivers/base/firmware_loader/main.chMhj}ubj)}(hhh]h)}(h)device for which firmware is being loadedh]h)device for which firmware is being loaded}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubeh}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]jN)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhjubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:25: ./drivers/base/firmware_loader/main.chMhjubh)}(hXThis function is similar in behaviour to request_firmware(), except it doesn't produce warning messages when the file is not found. The sysfs fallback mechanism is enabled if direct filesystem lookup fails. However, failures to find the firmware file with it are still suppressed. It is therefore up to the driver to check for the return value of this call and to decide when to inform the users of errors.h]hXThis function is similar in behaviour to request_firmware(), except it doesn’t produce warning messages when the file is not found. The sysfs fallback mechanism is enabled if direct filesystem lookup fails. However, failures to find the firmware file with it are still suppressed. It is therefore up to the driver to check for the return value of this call and to decide when to inform the users of errors.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:25: ./drivers/base/firmware_loader/main.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jChjhhhNhNubeh}(h]firmware-request-nowarnah ]h"]firmware_request_nowarnah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hfirmware_request_platformh]hfirmware_request_platform}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j*&firmware_request_platform (C function)c.firmware_request_platformhNtauh1jhjhhhNhNubj/)}(hhh](j4)}(hiint firmware_request_platform (const struct firmware **firmware, const char *name, struct device *device)h]j:)}(hhint firmware_request_platform(const struct firmware **firmware, const char *name, struct device *device)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:30: ./drivers/base/firmware_loader/main.chMubjR)}(h h]h }(hj+hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjhhhj*hMubjc)}(hfirmware_request_platformh]ji)}(hfirmware_request_platformh]hfirmware_request_platform}(hj=hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj9ubah}(h]h ](j|j}eh"]h$]h&]hhuh1jbhjhhhj*hMubj)}(hK(const struct firmware **firmware, const char *name, struct device *device)h](j)}(h const struct firmware **firmwareh](j)}(hjh]hconst}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubjR)}(h h]h }(hjfhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjUubj)}(hjh]hstruct}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjUubh)}(hhh]ji)}(hfirmwareh]hfirmware}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jj?sbc.firmware_request_platformasbuh1hhjUubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjUubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubji)}(hfirmwareh]hfirmware}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjUubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjQubj)}(hconst char *nameh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjR)}(h h]h }(hj hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubj@)}(hcharh]hchar}(hj hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubjR)}(h h]h }(hj hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubj)}(hjh]h*}(hj* hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubji)}(hnameh]hname}(hj7 hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjQubj)}(hstruct device *deviceh](j)}(hjh]hstruct}(hjP hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL ubjR)}(h h]h }(hj] hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjL ubh)}(hhh]ji)}(hdeviceh]hdevice}(hjn hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjk ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjp modnameN classnameNjj)}j]jc.firmware_request_platformasbuh1hhjL ubjR)}(h h]h }(hj hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjL ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL ubji)}(hdeviceh]hdevice}(hj hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjL ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjQubeh}(h]h ]h"]h$]h&]hhuh1jhjhhhj*hMubeh}(h]h ]h"]h$]h&]hhjuh1j9jjhjhhhj*hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j3hj*hMhjhhubj)}(hhh]h)}(h*request firmware with platform-fw fallbackh]h*request firmware with platform-fw fallback}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:30: ./drivers/base/firmware_loader/main.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj*hMubeh}(h]h ](jfunctioneh"]h$]h&]j=jj>j j?j j@jAjBuh1j.hhhjhNhNubjD)}(hX**Parameters** ``const struct firmware **firmware`` pointer to firmware image ``const char *name`` name of firmware file ``struct device *device`` device for which firmware is being loaded **Description** This function is similar in behaviour to request_firmware, except that if direct filesystem lookup fails, it will fallback to looking for a copy of the requested firmware embedded in the platform's main (e.g. UEFI) firmware.h](h)}(h**Parameters**h]jN)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jMhj ubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:30: ./drivers/base/firmware_loader/main.chMhj ubjd)}(hhh](ji)}(h?``const struct firmware **firmware`` pointer to firmware image h](jo)}(h$``const struct firmware **firmware``h]ju)}(hj h]h const struct firmware **firmware}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jthj ubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:30: ./drivers/base/firmware_loader/main.chMhj ubj)}(hhh]h)}(hpointer to firmware imageh]hpointer to firmware image}(hj+ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj' hMhj( ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhj' hMhj ubji)}(h+``const char *name`` name of firmware file h](jo)}(h``const char *name``h]ju)}(hjK h]hconst char *name}(hjM hhhNhNubah}(h]h ]h"]h$]h&]uh1jthjI ubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:30: ./drivers/base/firmware_loader/main.chMhjE ubj)}(hhh]h)}(hname of firmware fileh]hname of firmware file}(hjd hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj` hMhja ubah}(h]h ]h"]h$]h&]uh1jhjE ubeh}(h]h ]h"]h$]h&]uh1jhhj` hMhj ubji)}(hD``struct device *device`` device for which firmware is being loaded h](jo)}(h``struct device *device``h]ju)}(hj h]hstruct device *device}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jthj ubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:30: ./drivers/base/firmware_loader/main.chMhj~ ubj)}(hhh]h)}(h)device for which firmware is being loadedh]h)device for which firmware is being loaded}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj~ ubeh}(h]h ]h"]h$]h&]uh1jhhj hMhj ubeh}(h]h ]h"]h$]h&]uh1jchj ubh)}(h**Description**h]jN)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jMhj ubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:30: ./drivers/base/firmware_loader/main.chMhj ubh)}(hThis function is similar in behaviour to request_firmware, except that if direct filesystem lookup fails, it will fallback to looking for a copy of the requested firmware embedded in the platform's main (e.g. UEFI) firmware.h]hThis function is similar in behaviour to request_firmware, except that if direct filesystem lookup fails, it will fallback to looking for a copy of the requested firmware embedded in the platform’s main (e.g. UEFI) firmware.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:30: ./drivers/base/firmware_loader/main.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jChjhhhNhNubeh}(h]firmware-request-platformah ]h"]firmware_request_platformah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hrequest_firmware_directh]hrequest_firmware_direct}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhK"ubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j*$request_firmware_direct (C function)c.request_firmware_directhNtauh1jhj hhhNhNubj/)}(hhh](j4)}(hiint request_firmware_direct (const struct firmware **firmware_p, const char *name, struct device *device)h]j:)}(hhint request_firmware_direct(const struct firmware **firmware_p, const char *name, struct device *device)h](j@)}(hinth]hint}(hj hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj hhhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:35: ./drivers/base/firmware_loader/main.chMubjR)}(h h]h }(hj, hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhj hhhj+ hMubjc)}(hrequest_firmware_directh]ji)}(hrequest_firmware_directh]hrequest_firmware_direct}(hj> hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj: ubah}(h]h ](j|j}eh"]h$]h&]hhuh1jbhj hhhj+ hMubj)}(hM(const struct firmware **firmware_p, const char *name, struct device *device)h](j)}(h"const struct firmware **firmware_ph](j)}(hjh]hconst}(hjZ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV ubjR)}(h h]h }(hjg hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjV ubj)}(hjh]hstruct}(hju hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV ubjR)}(h h]h }(hj hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjV ubh)}(hhh]ji)}(hfirmwareh]hfirmware}(hj hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j)}jj@ sbc.request_firmware_directasbuh1hhjV ubjR)}(h h]h }(hj hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjV ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV ubji)}(h firmware_ph]h firmware_p}(hj hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjV ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjR ubj)}(hconst char *nameh](j)}(hjh]hconst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjR)}(h h]h }(hj hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhj ubj@)}(hcharh]hchar}(hj hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj ubjR)}(h h]h }(hj hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhj ubj)}(hjh]h*}(hj+ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubji)}(hnameh]hname}(hj8 hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjR ubj)}(hstruct device *deviceh](j)}(hjh]hstruct}(hjQ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjM ubjR)}(h h]h }(hj^ hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjM ubh)}(hhh]ji)}(hdeviceh]hdevice}(hjo hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjl ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjq modnameN classnameNjj)}j]j c.request_firmware_directasbuh1hhjM ubjR)}(h h]h }(hj hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjM ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjM ubji)}(hdeviceh]hdevice}(hj hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjM ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjR ubeh}(h]h ]h"]h$]h&]hhuh1jhj hhhj+ hMubeh}(h]h ]h"]h$]h&]hhjuh1j9jjhj hhhj+ hMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1j3hj+ hMhj hhubj)}(hhh]h)}(h.load firmware directly without usermode helperh]h.load firmware directly without usermode helper}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:35: ./drivers/base/firmware_loader/main.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj+ hMubeh}(h]h ](jfunctioneh"]h$]h&]j=jj>j j?j j@jAjBuh1j.hhhj hNhNubjD)}(hX**Parameters** ``const struct firmware **firmware_p`` pointer to firmware image ``const char *name`` name of firmware file ``struct device *device`` device for which firmware is being loaded **Description** This function works pretty much like request_firmware(), but this doesn't fall back to usermode helper even if the firmware couldn't be loaded directly from fs. Hence it's useful for loading optional firmwares, which aren't always present, without extra long timeouts of udev.h](h)}(h**Parameters**h]jN)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jMhj ubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:35: ./drivers/base/firmware_loader/main.chMhj ubjd)}(hhh](ji)}(hA``const struct firmware **firmware_p`` pointer to firmware image h](jo)}(h&``const struct firmware **firmware_p``h]ju)}(hj h]h"const struct firmware **firmware_p}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jthj ubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:35: ./drivers/base/firmware_loader/main.chMhj ubj)}(hhh]h)}(hpointer to firmware imageh]hpointer to firmware image}(hj, hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj( hMhj) ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhj( hMhj ubji)}(h+``const char *name`` name of firmware file h](jo)}(h``const char *name``h]ju)}(hjL h]hconst char *name}(hjN hhhNhNubah}(h]h ]h"]h$]h&]uh1jthjJ ubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:35: ./drivers/base/firmware_loader/main.chMhjF ubj)}(hhh]h)}(hname of firmware fileh]hname of firmware file}(hje hhhNhNubah}(h]h ]h"]h$]h&]uh1hhja hMhjb ubah}(h]h ]h"]h$]h&]uh1jhjF ubeh}(h]h ]h"]h$]h&]uh1jhhja hMhj ubji)}(hD``struct device *device`` device for which firmware is being loaded h](jo)}(h``struct device *device``h]ju)}(hj h]hstruct device *device}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jthj ubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:35: ./drivers/base/firmware_loader/main.chMhj ubj)}(hhh]h)}(h)device for which firmware is being loadedh]h)device for which firmware is being loaded}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhj hMhj ubeh}(h]h ]h"]h$]h&]uh1jchj ubh)}(h**Description**h]jN)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jMhj ubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:35: ./drivers/base/firmware_loader/main.chMhj ubh)}(hXThis function works pretty much like request_firmware(), but this doesn't fall back to usermode helper even if the firmware couldn't be loaded directly from fs. Hence it's useful for loading optional firmwares, which aren't always present, without extra long timeouts of udev.h]hXThis function works pretty much like request_firmware(), but this doesn’t fall back to usermode helper even if the firmware couldn’t be loaded directly from fs. Hence it’s useful for loading optional firmwares, which aren’t always present, without extra long timeouts of udev.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:35: ./drivers/base/firmware_loader/main.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jChj hhhNhNubeh}(h]request-firmware-directah ]h"]request_firmware_directah$]h&]uh1hhhhhhhhK"ubh)}(hhh](h)}(hrequest_firmware_into_bufh]hrequest_firmware_into_buf}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhK'ubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j*&request_firmware_into_buf (C function)c.request_firmware_into_bufhNtauh1jhj hhhNhNubj/)}(hhh](j4)}(hint request_firmware_into_buf (const struct firmware **firmware_p, const char *name, struct device *device, void *buf, size_t size)h]j:)}(hint request_firmware_into_buf(const struct firmware **firmware_p, const char *name, struct device *device, void *buf, size_t size)h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chM ubjR)}(h h]h }(hj-hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjhhhj,hM ubjc)}(hrequest_firmware_into_bufh]ji)}(hrequest_firmware_into_bufh]hrequest_firmware_into_buf}(hj?hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj;ubah}(h]h ](j|j}eh"]h$]h&]hhuh1jbhjhhhj,hM ubj)}(he(const struct firmware **firmware_p, const char *name, struct device *device, void *buf, size_t size)h](j)}(h"const struct firmware **firmware_ph](j)}(hjh]hconst}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubjR)}(h h]h }(hjhhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjWubj)}(hjh]hstruct}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjWubh)}(hhh]ji)}(hfirmwareh]hfirmware}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjAsbc.request_firmware_into_bufasbuh1hhjWubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjWubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubji)}(h firmware_ph]h firmware_p}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjWubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjSubj)}(hconst char *nameh](j)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubj@)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubj)}(hjh]h*}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubji)}(hnameh]hname}(hj9hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjSubj)}(hstruct device *deviceh](j)}(hjh]hstruct}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubjR)}(h h]h }(hj_hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjNubh)}(hhh]ji)}(hdeviceh]hdevice}(hjphhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjmubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjrmodnameN classnameNjj)}j]jc.request_firmware_into_bufasbuh1hhjNubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjNubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubji)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjNubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjSubj)}(h void *bufh](j@)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubji)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjSubj)}(h size_t sizeh](h)}(hhh]ji)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]jc.request_firmware_into_bufasbuh1hhjubjR)}(h h]h }(hj%hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubji)}(hsizeh]hsize}(hj3hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjSubeh}(h]h ]h"]h$]h&]hhuh1jhjhhhj,hM ubeh}(h]h ]h"]h$]h&]hhjuh1j9jjhjhhhj,hM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j3hj,hM hjhhubj)}(hhh]h)}(h0load firmware into a previously allocated bufferh]h0load firmware into a previously allocated buffer}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chM hjZhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj,hM ubeh}(h]h ](jfunctioneh"]h$]h&]j=jj>juj?juj@jAjBuh1j.hhhj hNhNubjD)}(hXy**Parameters** ``const struct firmware **firmware_p`` pointer to firmware image ``const char *name`` name of firmware file ``struct device *device`` device for which firmware is being loaded and DMA region allocated ``void *buf`` address of buffer to load firmware into ``size_t size`` size of buffer **Description** This function works pretty much like request_firmware(), but it doesn't allocate a buffer to hold the firmware data. Instead, the firmware is loaded directly into the buffer pointed to by **buf** and the **firmware_p** data member is pointed at **buf**. This function doesn't cache firmware either.h](h)}(h**Parameters**h]jN)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhj}ubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chM$hjyubjd)}(hhh](ji)}(hA``const struct firmware **firmware_p`` pointer to firmware image h](jo)}(h&``const struct firmware **firmware_p``h]ju)}(hjh]h"const struct firmware **firmware_p}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chM!hjubj)}(hhh]h)}(hpointer to firmware imageh]hpointer to firmware image}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM!hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM!hjubji)}(h+``const char *name`` name of firmware file h](jo)}(h``const char *name``h]ju)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chM"hjubj)}(hhh]h)}(hname of firmware fileh]hname of firmware file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM"hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM"hjubji)}(h]``struct device *device`` device for which firmware is being loaded and DMA region allocated h](jo)}(h``struct device *device``h]ju)}(hjh]hstruct device *device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chM#hj ubj)}(hhh]h)}(hBdevice for which firmware is being loaded and DMA region allocatedh]hBdevice for which firmware is being loaded and DMA region allocated}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hM#hj&ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhj%hM#hjubji)}(h6``void *buf`` address of buffer to load firmware into h](jo)}(h ``void *buf``h]ju)}(hjIh]h void *buf}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjGubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chM$hjCubj)}(hhh]h)}(h'address of buffer to load firmware intoh]h'address of buffer to load firmware into}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hM$hj_ubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jhhj^hM$hjubji)}(h``size_t size`` size of buffer h](jo)}(h``size_t size``h]ju)}(hjh]h size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chM%hj|ubj)}(hhh]h)}(hsize of bufferh]hsize of buffer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM%hjubah}(h]h ]h"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]uh1jhhjhM%hjubeh}(h]h ]h"]h$]h&]uh1jchjyubh)}(h**Description**h]jN)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhjubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chM'hjyubh)}(hThis function works pretty much like request_firmware(), but it doesn't allocate a buffer to hold the firmware data. Instead, the firmware is loaded directly into the buffer pointed to by **buf** and the **firmware_p** data member is pointed at **buf**.h](hThis function works pretty much like request_firmware(), but it doesn’t allocate a buffer to hold the firmware data. Instead, the firmware is loaded directly into the buffer pointed to by }(hjhhhNhNubjN)}(h**buf**h]hbuf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhjubh and the }(hjhhhNhNubjN)}(h**firmware_p**h]h firmware_p}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhjubh data member is pointed at }(hjhhhNhNubjN)}(h**buf**h]hbuf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chM&hjyubh)}(h,This function doesn't cache firmware either.h]h.This function doesn’t cache firmware either.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chM+hjyubeh}(h]h ] kernelindentah"]h$]h&]uh1jChj hhhNhNubeh}(h]request-firmware-into-bufah ]h"]request_firmware_into_bufah$]h&]uh1hhhhhhhhK'ubeh}(h]synchronous-firmware-requestsah ]h"]synchronous firmware requestsah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(hAsynchronous firmware requestsh]hAsynchronous firmware requests}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hhhhhK,ubh)}(hX+Asynchronous firmware requests allow driver code to not have to wait until the firmware or an error is returned. Function callbacks are provided so that when the firmware or an error is found the driver is informed through the callback. request_firmware_nowait() cannot be called in atomic contexts.h]hX+Asynchronous firmware requests allow driver code to not have to wait until the firmware or an error is returned. Function callbacks are provided so that when the firmware or an error is found the driver is informed through the callback. request_firmware_nowait() cannot be called in atomic contexts.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hj>hhubh)}(hhh](h)}(hrequest_firmware_nowaith]hrequest_firmware_nowait}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hhhhhK5ubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j*$request_firmware_nowait (C function)c.request_firmware_nowaithNtauh1jhj]hhhNhNubj/)}(hhh](j4)}(hint request_firmware_nowait (struct module *module, bool uevent, const char *name, struct device *device, gfp_t gfp, void *context, void (*cont)(const struct firmware *fw, void *context))h]j:)}(hint request_firmware_nowait(struct module *module, bool uevent, const char *name, struct device *device, gfp_t gfp, void *context, void (*cont)(const struct firmware *fw, void *context))h](j@)}(hinth]hint}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjhhhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjhhhjhMubjc)}(hrequest_firmware_nowaith]ji)}(hrequest_firmware_nowaith]hrequest_firmware_nowait}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubah}(h]h ](j|j}eh"]h$]h&]hhuh1jbhjhhhjhMubj)}(h(struct module *module, bool uevent, const char *name, struct device *device, gfp_t gfp, void *context, void (*cont)(const struct firmware *fw, void *context))h](j)}(hstruct module *moduleh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubh)}(hhh]ji)}(hmoduleh]hmodule}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.request_firmware_nowaitasbuh1hhjubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubji)}(hmoduleh]hmodule}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(h bool ueventh](j@)}(hboolh]hbool}(hj6hhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj2ubjR)}(h h]h }(hjDhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhj2ubji)}(hueventh]huevent}(hjRhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj2ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(hconst char *nameh](j)}(hjh]hconst}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubjR)}(h h]h }(hjxhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjgubj@)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjgubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjgubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubji)}(hnameh]hname}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjgubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(hstruct device *deviceh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubh)}(hhh]ji)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.request_firmware_nowaitasbuh1hhjubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubji)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(h gfp_t gfph](h)}(hhh]ji)}(hgfp_th]hgfp_t}(hj;hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj8ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj=modnameN classnameNjj)}j]jc.request_firmware_nowaitasbuh1hhj4ubjR)}(h h]h }(hjYhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhj4ubji)}(hgfph]hgfp}(hjghhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj4ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(h void *contexth](j@)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hj|ubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhj|ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubji)}(hcontexth]hcontext}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhj|ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(h6void (*cont)(const struct firmware *fw, void *context)h](j@)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubj)}(h(h]h(}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubji)}(hconth]hcont}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubj)}(h)h]h)}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h(}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hconst}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjR)}(h h]h }(hj/hhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubj)}(hjh]hstruct}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjR)}(h h]h }(hjJhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubh)}(hhh]ji)}(hfirmwareh]hfirmware}(hj[hhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjXubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj]modnameN classnameNjj)}j]jc.request_firmware_nowaitasbuh1hhjubjR)}(h h]h }(hjyhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubji)}(hfwh]hfw}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubj)}(h,h]h,}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubj@)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jLah"]h$]h&]uh1j?hjubjR)}(h h]h }(hjhhhNhNubah}(h]h ]j^ah"]h$]h&]uh1jQhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubji)}(hcontext`h]hcontext}(hjhhhNhNubah}(h]h ]juah"]h$]h&]uh1jhhjubj)}(hj h]h)}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubeh}(h]h ]h"]h$]h&]hhuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1j9jjhjhhhjhMubah}(h]jzah ](jjeh"]h$]h&]jj)jhuh1j3hjhMhj|hhubj)}(hhh]h)}(h(asynchronous version of request_firmwareh]h(asynchronous version of request_firmware}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj|hhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j=jj>j6j?j6j@jAjBuh1j.hhhj]hNhNubjD)}(hX**Parameters** ``struct module *module`` module requesting the firmware ``bool uevent`` sends uevent to copy the firmware image if this flag is non-zero else the firmware copy must be done manually. ``const char *name`` name of firmware file ``struct device *device`` device for which firmware is being loaded ``gfp_t gfp`` allocation flags ``void *context`` will be passed over to **cont**, and **fw** may be ``NULL`` if firmware request fails. ``void (*cont)(const struct firmware *fw, void *context)`` function will be called asynchronously when the firmware request is over. **Description** Caller must hold the reference count of **device**. Asynchronous variant of request_firmware() for user contexts: - sleep for as small periods as possible since it may increase kernel boot time of built-in device drivers requesting firmware in their ->probe() methods, if **gfp** is GFP_KERNEL. - can't sleep at all if **gfp** is GFP_ATOMIC.h](h)}(h**Parameters**h]jN)}(hj@h]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhj>ubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhj:ubjd)}(hhh](ji)}(h9``struct module *module`` module requesting the firmware h](jo)}(h``struct module *module``h]ju)}(hj_h]hstruct module *module}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jthj]ubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjYubj)}(hhh]h)}(hmodule requesting the firmwareh]hmodule requesting the firmware}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjthMhjuubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhhjthMhjVubji)}(h``bool uevent`` sends uevent to copy the firmware image if this flag is non-zero else the firmware copy must be done manually. h](jo)}(h``bool uevent``h]ju)}(hjh]h bool uevent}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjubj)}(hhh]h)}(hnsends uevent to copy the firmware image if this flag is non-zero else the firmware copy must be done manually.h]hnsends uevent to copy the firmware image if this flag is non-zero else the firmware copy must be done manually.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjVubji)}(h+``const char *name`` name of firmware file h](jo)}(h``const char *name``h]ju)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjubj)}(hhh]h)}(hname of firmware fileh]hname of firmware file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjVubji)}(hD``struct device *device`` device for which firmware is being loaded h](jo)}(h``struct device *device``h]ju)}(hj h]hstruct device *device}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jthj ubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjubj)}(hhh]h)}(h)device for which firmware is being loadedh]h)device for which firmware is being loaded}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj!ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhj hMhjVubji)}(h``gfp_t gfp`` allocation flags h](jo)}(h ``gfp_t gfp``h]ju)}(hjDh]h gfp_t gfp}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjBubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhj>ubj)}(hhh]h)}(hallocation flagsh]hallocation flags}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhMhjZubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhhjYhMhjVubji)}(hi``void *context`` will be passed over to **cont**, and **fw** may be ``NULL`` if firmware request fails. h](jo)}(h``void *context``h]ju)}(hj}h]h void *context}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jthj{ubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjwubj)}(hhh]h)}(hVwill be passed over to **cont**, and **fw** may be ``NULL`` if firmware request fails.h](hwill be passed over to }(hjhhhNhNubjN)}(h**cont**h]hcont}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhjubh, and }(hjhhhNhNubjN)}(h**fw**h]hfw}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhjubh may be }(hjhhhNhNubju)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjubh if firmware request fails.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjubah}(h]h ]h"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjVubji)}(h``void (*cont)(const struct firmware *fw, void *context)`` function will be called asynchronously when the firmware request is over. h](jo)}(h:``void (*cont)(const struct firmware *fw, void *context)``h]ju)}(hjh]h6void (*cont)(const struct firmware *fw, void *context)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjubj)}(hhh]h)}(hIfunction will be called asynchronously when the firmware request is over.h]hIfunction will be called asynchronously when the firmware request is over.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjVubeh}(h]h ]h"]h$]h&]uh1jchj:ubh)}(h**Description**h]jN)}(hj)h]h Description}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jMhj'ubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhj:ubj:)}(hXCaller must hold the reference count of **device**. Asynchronous variant of request_firmware() for user contexts: - sleep for as small periods as possible since it may increase kernel boot time of built-in device drivers requesting firmware in their ->probe() methods, if **gfp** is GFP_KERNEL. - can't sleep at all if **gfp** is GFP_ATOMIC.h](h)}(h3Caller must hold the reference count of **device**.h](h(Caller must hold the reference count of }(hjChhhNhNubjN)}(h **device**h]hdevice}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhjCubh.}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhj?ubjd)}(hhh]ji)}(hX(Asynchronous variant of request_firmware() for user contexts: - sleep for as small periods as possible since it may increase kernel boot time of built-in device drivers requesting firmware in their ->probe() methods, if **gfp** is GFP_KERNEL. - can't sleep at all if **gfp** is GFP_ATOMIC.h](jo)}(h=Asynchronous variant of request_firmware() for user contexts:h]h=Asynchronous variant of request_firmware() for user contexts:}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjgubj)}(hhh]h bullet_list)}(hhh](h list_item)}(hsleep for as small periods as possible since it may increase kernel boot time of built-in device drivers requesting firmware in their ->probe() methods, if **gfp** is GFP_KERNEL. h]h)}(hsleep for as small periods as possible since it may increase kernel boot time of built-in device drivers requesting firmware in their ->probe() methods, if **gfp** is GFP_KERNEL.h](hsleep for as small periods as possible since it may increase kernel boot time of built-in device drivers requesting firmware in their ->probe() methods, if }(hjhhhNhNubjN)}(h**gfp**h]hgfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhjubh is GFP_KERNEL.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h,can't sleep at all if **gfp** is GFP_ATOMIC.h]h)}(hjh](hcan’t sleep at all if }(hjhhhNhNubjN)}(h**gfp**h]hgfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhjubh is GFP_ATOMIC.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet-uh1j}hjhMhjzubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1jhhjyhMhjdubah}(h]h ]h"]h$]h&]uh1jchj?ubeh}(h]h ]h"]h$]h&]uh1j9hjchMhj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jChj]hhhNhNubeh}(h]request-firmware-nowaitah ]h"]request_firmware_nowaitah$]h&]uh1hhj>hhhhhK5ubeh}(h]asynchronous-firmware-requestsah ]h"]asynchronous firmware requestsah$]h&]uh1hhhhhhhhK,ubh)}(hhh](h)}(hSpecial optimizations on rebooth]hSpecial optimizations on reboot}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK:ubh)}(hXASome devices have an optimization in place to enable the firmware to be retained during system reboot. When such optimizations are used the driver author must ensure the firmware is still available on resume from suspend, this can be done with firmware_request_cache() instead of requesting for the firmware to be loaded.h]hXASome devices have an optimization in place to enable the firmware to be retained during system reboot. When such optimizations are used the driver author must ensure the firmware is still available on resume from suspend, this can be done with firmware_request_cache() instead of requesting for the firmware to be loaded.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKjj?jj@jAjBuh1j.hhhj/hNhNubjD)}(hXJ**Parameters** ``struct device *device`` device for which firmware should be cached for ``const char *name`` name of firmware file **Description** There are some devices with an optimization that enables the device to not require loading firmware on system reboot. This optimization may still require the firmware present on resume from suspend. This routine can be used to ensure the firmware is present on resume from suspend in these situations. This helper is not compatible with drivers which use request_firmware_into_buf() or request_firmware_nowait() with no uevent set.h](h)}(h**Parameters**h]jN)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jMhjubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:68: ./drivers/base/firmware_loader/main.chM hjubjd)}(hhh](ji)}(hI``struct device *device`` device for which firmware should be cached for h](jo)}(h``struct device *device``h]ju)}(hjh]hstruct device *device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:68: ./drivers/base/firmware_loader/main.chM hjubj)}(hhh]h)}(h.device for which firmware should be cached forh]h.device for which firmware should be cached for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM hjubji)}(h+``const char *name`` name of firmware file h](jo)}(h``const char *name``h]ju)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jthjubah}(h]h ]h"]h$]h&]uh1jnhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:68: ./drivers/base/firmware_loader/main.chM hjubj)}(hhh]h)}(hname of firmware fileh]hname of firmware file}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM hjubeh}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]jN)}(hj+h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jMhj)ubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:68: ./drivers/base/firmware_loader/main.chM hjubh)}(hXThere are some devices with an optimization that enables the device to not require loading firmware on system reboot. This optimization may still require the firmware present on resume from suspend. This routine can be used to ensure the firmware is present on resume from suspend in these situations. This helper is not compatible with drivers which use request_firmware_into_buf() or request_firmware_nowait() with no uevent set.h]hXThere are some devices with an optimization that enables the device to not require loading firmware on system reboot. This optimization may still require the firmware present on resume from suspend. This routine can be used to ensure the firmware is present on resume from suspend in these situations. This helper is not compatible with drivers which use request_firmware_into_buf() or request_firmware_nowait() with no uevent set.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:68: ./drivers/base/firmware_loader/main.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jChj/hhhNhNubeh}(h]firmware-request-cacheah ]h"]firmware_request_cache()ah$]h&]uh1hhjhhhhhKCubeh}(h]special-optimizations-on-rebootah ]h"]special optimizations on rebootah$]h&]uh1hhhhhhhhK:ubh)}(hhh](h)}(h(request firmware API expected driver useh]h(request firmware API expected driver use}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghhhhhKHubh)}(hXOnce an API call returns you process the firmware and then release the firmware. For example if you used request_firmware() and it returns, the driver has the firmware image accessible in fw_entry->{data,size}. If something went wrong request_firmware() returns non-zero and fw_entry is set to NULL. Once your driver is done with processing the firmware it can call release_firmware(fw_entry) to release the firmware image and any related resource.h]hXOnce an API call returns you process the firmware and then release the firmware. For example if you used request_firmware() and it returns, the driver has the firmware image accessible in fw_entry->{data,size}. If something went wrong request_firmware() returns non-zero and fw_entry is set to NULL. Once your driver is done with processing the firmware it can call release_firmware(fw_entry) to release the firmware image and any related resource.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKJhjghhubeh}(h](request-firmware-api-expected-driver-useah ]h"](request firmware api expected driver useah$]h&]uh1hhhhhhhhKHubeh}(h]request-firmware-apiah ]h"]request_firmware apiah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehʌ _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jjj;j8jjjjj j j j j3j0j j jjjdjaj\jYjju nametypes}(jj;jjj j j3j jjdj\juh}(jhj8hjj j,j5jjjjj jjjj j j j j0j jjj j>jj]jzjjajjYj/jLjQjjgu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.