isphinx.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]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}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singlerequest_firmware (C function)c.request_firmwarehNtauh1j hhhhhNhNubhdesc)}(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}(hj-hhhNhNubah}(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 }(hj?hhhNhNubah}(h]h ]wah"]h$]h&]uh1j=hj'hhhj<hMubh desc_name)}(hrequest_firmwareh]h desc_sig_name)}(hrequest_firmwareh]hrequest_firmware}(hjVhhhNhNubah}(h]h ]nah"]h$]h&]uh1jThjPubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1jNhj'hhhj<hMubhdesc_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}(hj{hhhNhNubah}(h]h ]kah"]h$]h&]uh1jyhjuubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjuubjz)}(hstructh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhjuubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjuubh)}(hhh]jU)}(hfirmwareh]hfirmware}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubah}(h]h ]h"]h$]h&] refdomaincreftype identifier reftargetjmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}jjXsbc.request_firmwareasbuh1hhjuubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjuubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjuubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubjU)}(h firmware_ph]h firmware_p}(hj hhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjuubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjoubjt)}(hconst char *nameh](jz)}(hj}h]hconst}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhj!ubj>)}(h h]h }(hj2hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj!ubj,)}(hcharh]hchar}(hj@hhhNhNubah}(h]h ]j8ah"]h$]h&]uh1j+hj!ubj>)}(h h]h }(hjNhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj!ubj)}(hjh]h*}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubjU)}(hnameh]hname}(hjihhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThj!ubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjoubjt)}(hstruct device *deviceh](jz)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhj~ubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj~ubh)}(hhh]jU)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.request_firmwareasbuh1hhj~ubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj~ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubjU)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThj~ubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjoubeh}(h]h ]h"]h$]h&]hhuh1jmhj'hhhj<hMubeh}(h]h ]h"]h$]h&]hh، add_permalinkuh1j%sphinx_line_type declaratorhj!hhhj<hMubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhj<hMhjhhubh 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.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj<hMubeh}(h]h ](jfunctioneh"]h$]h&]domainjobjtypej%desctypej%noindex noindexentrynocontentsentryuh1jhhhhhNhNubh container)}(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 **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)}(hj7h]h Parameters}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j9hj5ubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhj1ubhdefinition_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)}(hj^h]h"const struct firmware **firmware_p}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj\ubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhjVubh definition)}(hhh]h)}(hpointer to firmware imageh]hpointer to firmware image}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuhMhjxubah}(h]h ]h"]h$]h&]uh1jvhjVubeh}(h]h ]h"]h$]h&]uh1jThjuhMhjQubjU)}(h+``const char *name`` name of firmware file h](j[)}(h``const char *name``h]ja)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhjubjw)}(hhh]h)}(hname of firmware fileh]hname of firmware file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jvhjubeh}(h]h ]h"]h$]h&]uh1jThjhMhjQubjU)}(hX``struct device *device`` device for which firmware is being loaded **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](j[)}(h``struct device *device``h]ja)}(hjh]hstruct device *device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhjubjw)}(hhh](h)}(h)device for which firmware is being loadedh]h)device for which firmware is being loaded}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhjubh)}(he**firmware_p** will be used to return a firmware image by the name of **name** for device **device**.h](j:)}(h**firmware_p**h]h firmware_p}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j9hjubh8 will be used to return a firmware image by the name of }(hjhhhNhNubj:)}(h**name**h]hname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j9hjubh for device }(hjhhhNhNubj:)}(h **device**h]hdevice}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j9hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhjubh)}(h=Should be called from user context where sleeping is allowed.h]h=Should be called from user context where sleeping is allowed.}(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.chMhjubh)}(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](j:)}(h**name**h]hname}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j9hjLubhX 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.}(hjLhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhjubh)}(h3Caller must hold the reference count of **device**.h](h(Caller must hold the reference count of }(hjihhhNhNubj:)}(h **device**h]hdevice}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1j9hjiubh.}(hjihhhNhNubeh}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:20: ./drivers/base/firmware_loader/main.chMhjubh)}(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&]uh1hhjhMhjubeh}(h]h ]h"]h$]h&]uh1jvhjubeh}(h]h ]h"]h$]h&]uh1jThjhMhjQubeh}(h]h ]h"]h$]h&]uh1jOhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1j/hhhhhNhNubeh}(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_nowarnhNtauh1j hjhhhNhNubj)}(hhh](j )}(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 ]j8ah"]h$]h&]uh1j+hjhhhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:25: ./drivers/base/firmware_loader/main.chMubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjhhhjhMubjO)}(hfirmware_request_nowarnh]jU)}(hfirmware_request_nowarnh]hfirmware_request_nowarn}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubah}(h]h ](jhjieh"]h$]h&]hhuh1jNhjhhhjhMubjn)}(hK(const struct firmware **firmware, const char *name, struct device *device)h](jt)}(h const struct firmware **firmwareh](jz)}(hj}h]hconst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhjubj>)}(h h]h }(hj-hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubjz)}(hjh]hstruct}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhjubj>)}(h h]h }(hjHhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubh)}(hhh]jU)}(hfirmwareh]hfirmware}(hjYhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjVubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj[modnameN classnameNjj)}j]j)}jjsbc.firmware_request_nowarnasbuh1hhjubj>)}(h h]h }(hjyhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjU)}(hfirmwareh]hfirmware}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubjt)}(hconst char *nameh](jz)}(hj}h]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj,)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j8ah"]h$]h&]uh1j+hjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjU)}(hnameh]hname}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubjt)}(hstruct device *deviceh](jz)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhjubj>)}(h h]h }(hj$hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubh)}(hhh]jU)}(hdeviceh]hdevice}(hj5hhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThj2ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj7modnameN classnameNjj)}j]juc.firmware_request_nowarnasbuh1hhjubj>)}(h h]h }(hjShhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj)}(hjh]h*}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjU)}(hdeviceh]hdevice}(hjnhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubeh}(h]h ]h"]h$]h&]hhuh1jmhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1j%jjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj )}(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&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j)jj*jj+jj,j-j.uh1jhhhjhNhNubj0)}(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]j:)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j9hjubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:25: ./drivers/base/firmware_loader/main.chMhjubjP)}(hhh](jU)}(h?``const struct firmware **firmware`` pointer to firmware image h](j[)}(h$``const struct firmware **firmware``h]ja)}(hjh]h const struct firmware **firmware}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:25: ./drivers/base/firmware_loader/main.chMhjubjw)}(hhh]h)}(hpointer to firmware imageh]hpointer to firmware image}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jvhjubeh}(h]h ]h"]h$]h&]uh1jThjhMhjubjU)}(h+``const char *name`` name of firmware file h](j[)}(h``const char *name``h]ja)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:25: ./drivers/base/firmware_loader/main.chMhj ubjw)}(hhh]h)}(hname of firmware fileh]hname of firmware file}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hMhj(ubah}(h]h ]h"]h$]h&]uh1jvhj ubeh}(h]h ]h"]h$]h&]uh1jThj'hMhjubjU)}(hD``struct device *device`` device for which firmware is being loaded h](j[)}(h``struct device *device``h]ja)}(hjKh]hstruct device *device}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjIubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:25: ./drivers/base/firmware_loader/main.chMhjEubjw)}(hhh]h)}(h)device for which firmware is being loadedh]h)device for which firmware is being loaded}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hMhjaubah}(h]h ]h"]h$]h&]uh1jvhjEubeh}(h]h ]h"]h$]h&]uh1jThj`hMhjubeh}(h]h ]h"]h$]h&]uh1jOhjubh)}(h**Description**h]j:)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j9hjubah}(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&]uh1j/hjhhhNhNubeh}(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_platformhNtauh1j hjhhhNhNubj)}(hhh](j )}(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 ]j8ah"]h$]h&]uh1j+hjhhhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:30: ./drivers/base/firmware_loader/main.chM%ubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjhhhjhM%ubjO)}(hfirmware_request_platformh]jU)}(hfirmware_request_platformh]hfirmware_request_platform}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubah}(h]h ](jhjieh"]h$]h&]hhuh1jNhjhhhjhM%ubjn)}(hK(const struct firmware **firmware, const char *name, struct device *device)h](jt)}(h const struct firmware **firmwareh](jz)}(hj}h]hconst}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhjubj>)}(h h]h }(hj.hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubjz)}(hjh]hstruct}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhjubj>)}(h h]h }(hjIhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubh)}(hhh]jU)}(hfirmwareh]hfirmware}(hjZhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjWubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj\modnameN classnameNjj)}j]j)}jjsbc.firmware_request_platformasbuh1hhjubj>)}(h h]h }(hjzhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjU)}(hfirmwareh]hfirmware}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubjt)}(hconst char *nameh](jz)}(hj}h]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj,)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j8ah"]h$]h&]uh1j+hjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjU)}(hnameh]hname}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubjt)}(hstruct device *deviceh](jz)}(hjh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhj ubj>)}(h h]h }(hj% hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj ubh)}(hhh]jU)}(hdeviceh]hdevice}(hj6 hhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThj3 ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj8 modnameN classnameNjj)}j]jvc.firmware_request_platformasbuh1hhj ubj>)}(h h]h }(hjT hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj ubj)}(hjh]h*}(hjb hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjU)}(hdeviceh]hdevice}(hjo hhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubeh}(h]h ]h"]h$]h&]hhuh1jmhjhhhjhM%ubeh}(h]h ]h"]h$]h&]hhjuh1j%jjhjhhhjhM%ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM%hjhhubj )}(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&]uh1jhjhhhjhM%ubeh}(h]h ](jfunctioneh"]h$]h&]j)jj*j j+j j,j-j.uh1jhhhjhNhNubj0)}(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]j:)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j9hj ubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:30: ./drivers/base/firmware_loader/main.chM hj ubjP)}(hhh](jU)}(h?``const struct firmware **firmware`` pointer to firmware image h](j[)}(h$``const struct firmware **firmware``h]ja)}(hj h]h const struct firmware **firmware}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj ubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:30: ./drivers/base/firmware_loader/main.chMhj ubjw)}(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&]uh1jvhj ubeh}(h]h ]h"]h$]h&]uh1jThj hMhj ubjU)}(h+``const char *name`` name of firmware file h](j[)}(h``const char *name``h]ja)}(hj h]hconst char *name}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj ubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:30: ./drivers/base/firmware_loader/main.chMhj ubjw)}(hhh]h)}(hname of firmware fileh]hname of firmware file}(hj, hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj( hMhj) ubah}(h]h ]h"]h$]h&]uh1jvhj ubeh}(h]h ]h"]h$]h&]uh1jThj( hMhj ubjU)}(hD``struct device *device`` device for which firmware is being loaded h](j[)}(h``struct device *device``h]ja)}(hjL h]hstruct device *device}(hjN hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjJ ubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:30: ./drivers/base/firmware_loader/main.chMhjF ubjw)}(hhh]h)}(h)device for which firmware is being loadedh]h)device for which firmware is being loaded}(hje hhhNhNubah}(h]h ]h"]h$]h&]uh1hhja hMhjb ubah}(h]h ]h"]h$]h&]uh1jvhjF ubeh}(h]h ]h"]h$]h&]uh1jThja hMhj ubeh}(h]h ]h"]h$]h&]uh1jOhj ubh)}(h**Description**h]j:)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j9hj ubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:30: ./drivers/base/firmware_loader/main.chM!hj 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.chM!hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1j/hjhhhNhNubeh}(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_directhNtauh1j hj hhhNhNubj)}(hhh](j )}(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 ]j8ah"]h$]h&]uh1j+hj hhhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:35: ./drivers/base/firmware_loader/main.chM ubj>)}(h h]h }(hj hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj hhhj hM ubjO)}(hrequest_firmware_directh]jU)}(hrequest_firmware_directh]hrequest_firmware_direct}(hj hhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThj ubah}(h]h ](jhjieh"]h$]h&]hhuh1jNhj hhhj hM ubjn)}(hM(const struct firmware **firmware_p, const char *name, struct device *device)h](jt)}(h"const struct firmware **firmware_ph](jz)}(hj}h]hconst}(hj" hhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhj ubj>)}(h h]h }(hj/ hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj ubjz)}(hjh]hstruct}(hj= hhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhj ubj>)}(h h]h }(hjJ hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj ubh)}(hhh]jU)}(hfirmwareh]hfirmware}(hj[ hhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjX ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj] modnameN classnameNjj)}j]j)}jj sbc.request_firmware_directasbuh1hhj ubj>)}(h h]h }(hj{ hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjU)}(h firmware_ph]h firmware_p}(hj hhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jshj ubjt)}(hconst char *nameh](jz)}(hj}h]hconst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhj ubj>)}(h h]h }(hj hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj ubj,)}(hcharh]hchar}(hj hhhNhNubah}(h]h ]j8ah"]h$]h&]uh1j+hj ubj>)}(h h]h }(hj hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjU)}(hnameh]hname}(hj hhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jshj ubjt)}(hstruct device *deviceh](jz)}(hjh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhj ubj>)}(h h]h }(hj& hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj ubh)}(hhh]jU)}(hdeviceh]hdevice}(hj7 hhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThj4 ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj9 modnameN classnameNjj)}j]jw c.request_firmware_directasbuh1hhj ubj>)}(h h]h }(hjU hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj ubj)}(hjh]h*}(hjc hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjU)}(hdeviceh]hdevice}(hjp hhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jshj ubeh}(h]h ]h"]h$]h&]hhuh1jmhj hhhj hM ubeh}(h]h ]h"]h$]h&]hhjuh1j%jjhj hhhj hM ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hM hj 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 hM ubeh}(h]h ](jfunctioneh"]h$]h&]j)jj*j j+j j,j-j.uh1jhhhj hNhNubj0)}(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]j:)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j9hj 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 ubjP)}(hhh](jU)}(hA``const struct firmware **firmware_p`` pointer to firmware image h](j[)}(h&``const struct firmware **firmware_p``h]ja)}(hj h]h"const struct firmware **firmware_p}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj ubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:35: ./drivers/base/firmware_loader/main.chMhj ubjw)}(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&]uh1jvhj ubeh}(h]h ]h"]h$]h&]uh1jThj hMhj ubjU)}(h+``const char *name`` name of firmware file h](j[)}(h``const char *name``h]ja)}(hj h]hconst char *name}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj ubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:35: ./drivers/base/firmware_loader/main.chMhj ubjw)}(hhh]h)}(hname of firmware fileh]hname of firmware file}(hj- hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj) hMhj* ubah}(h]h ]h"]h$]h&]uh1jvhj ubeh}(h]h ]h"]h$]h&]uh1jThj) hMhj ubjU)}(hD``struct device *device`` device for which firmware is being loaded h](j[)}(h``struct device *device``h]ja)}(hjM h]hstruct device *device}(hjO hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjK ubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:35: ./drivers/base/firmware_loader/main.chMhjG ubjw)}(hhh]h)}(h)device for which firmware is being loadedh]h)device for which firmware is being loaded}(hjf hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjb hMhjc ubah}(h]h ]h"]h$]h&]uh1jvhjG ubeh}(h]h ]h"]h$]h&]uh1jThjb hMhj ubeh}(h]h ]h"]h$]h&]uh1jOhj ubh)}(h**Description**h]j:)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j9hj 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&]uh1j/hj 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_bufhNtauh1j hj hhhNhNubj)}(hhh](j )}(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}(hj hhhNhNubah}(h]h ]j8ah"]h$]h&]uh1j+hj hhhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chMZubj>)}(h h]h }(hj hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj hhhj hMZubjO)}(hrequest_firmware_into_bufh]jU)}(hrequest_firmware_into_bufh]hrequest_firmware_into_buf}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubah}(h]h ](jhjieh"]h$]h&]hhuh1jNhj hhhj hMZubjn)}(he(const struct firmware **firmware_p, const char *name, struct device *device, void *buf, size_t size)h](jt)}(h"const struct firmware **firmware_ph](jz)}(hj}h]hconst}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhjubj>)}(h h]h }(hj0hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubjz)}(hjh]hstruct}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhjubj>)}(h h]h }(hjKhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubh)}(hhh]jU)}(hfirmwareh]hfirmware}(hj\hhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjYubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj^modnameN classnameNjj)}j]j)}jj sbc.request_firmware_into_bufasbuh1hhjubj>)}(h h]h }(hj|hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjU)}(h firmware_ph]h firmware_p}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubjt)}(hconst char *nameh](jz)}(hj}h]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj,)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j8ah"]h$]h&]uh1j+hjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjU)}(hnameh]hname}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubjt)}(hstruct device *deviceh](jz)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhjubj>)}(h h]h }(hj'hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubh)}(hhh]jU)}(hdeviceh]hdevice}(hj8hhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThj5ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj:modnameN classnameNjj)}j]jxc.request_firmware_into_bufasbuh1hhjubj>)}(h h]h }(hjVhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj)}(hjh]h*}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjU)}(hdeviceh]hdevice}(hjqhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubjt)}(h void *bufh](j,)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j8ah"]h$]h&]uh1j+hjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjU)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubjt)}(h size_t sizeh](h)}(hhh]jU)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jxc.request_firmware_into_bufasbuh1hhjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubjU)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubeh}(h]h ]h"]h$]h&]hhuh1jmhj hhhj hMZubeh}(h]h ]h"]h$]h&]hhjuh1j%jjhj hhhj hMZubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hMZhj hhubj )}(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.chMLhj"hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hMZubeh}(h]h ](jfunctioneh"]h$]h&]j)jj*j=j+j=j,j-j.uh1jhhhj hNhNubj0)}(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]j:)}(hjGh]h Parameters}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1j9hjEubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chMPhjAubjP)}(hhh](jU)}(hA``const struct firmware **firmware_p`` pointer to firmware image h](j[)}(h&``const struct firmware **firmware_p``h]ja)}(hjfh]h"const struct firmware **firmware_p}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjdubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chMMhj`ubjw)}(hhh]h)}(hpointer to firmware imageh]hpointer to firmware image}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hMMhj|ubah}(h]h ]h"]h$]h&]uh1jvhj`ubeh}(h]h ]h"]h$]h&]uh1jThj{hMMhj]ubjU)}(h+``const char *name`` name of firmware file h](j[)}(h``const char *name``h]ja)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chMNhjubjw)}(hhh]h)}(hname of firmware fileh]hname of firmware file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMNhjubah}(h]h ]h"]h$]h&]uh1jvhjubeh}(h]h ]h"]h$]h&]uh1jThjhMNhj]ubjU)}(h]``struct device *device`` device for which firmware is being loaded and DMA region allocated h](j[)}(h``struct device *device``h]ja)}(hjh]hstruct device *device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chMOhjubjw)}(hhh]h)}(hBdevice for which firmware is being loaded and DMA region allocatedh]hBdevice for which firmware is being loaded and DMA region allocated}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMOhjubah}(h]h ]h"]h$]h&]uh1jvhjubeh}(h]h ]h"]h$]h&]uh1jThjhMOhj]ubjU)}(h6``void *buf`` address of buffer to load firmware into h](j[)}(h ``void *buf``h]ja)}(hjh]h void *buf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chMPhj ubjw)}(hhh]h)}(h'address of buffer to load firmware intoh]h'address of buffer to load firmware into}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMPhj'ubah}(h]h ]h"]h$]h&]uh1jvhj ubeh}(h]h ]h"]h$]h&]uh1jThj&hMPhj]ubjU)}(h``size_t size`` size of buffer h](j[)}(h``size_t size``h]ja)}(hjJh]h size_t size}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjHubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chMQhjDubjw)}(hhh]h)}(hsize of bufferh]hsize of buffer}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hMQhj`ubah}(h]h ]h"]h$]h&]uh1jvhjDubeh}(h]h ]h"]h$]h&]uh1jThj_hMQhj]ubeh}(h]h ]h"]h$]h&]uh1jOhjAubh)}(h**Description**h]j:)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j9hjubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chMShjAubh)}(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 }(hjhhhNhNubj:)}(h**buf**h]hbuf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j9hjubh and the }(hjhhhNhNubj:)}(h**firmware_p**h]h firmware_p}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j9hjubh data member is pointed at }(hjhhhNhNubj:)}(h**buf**h]hbuf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j9hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:40: ./drivers/base/firmware_loader/main.chMShjAubh)}(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.chMXhjAubeh}(h]h ] kernelindentah"]h$]h&]uh1j/hj 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}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK,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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjhhubh)}(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_nowaithNtauh1j hj%hhhNhNubj)}(hhh](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&)}(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}(hjOhhhNhNubah}(h]h ]j8ah"]h$]h&]uh1j+hjKhhhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMubj>)}(h h]h }(hj^hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjKhhhj]hMubjO)}(hrequest_firmware_nowaith]jU)}(hrequest_firmware_nowaith]hrequest_firmware_nowait}(hjphhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjlubah}(h]h ](jhjieh"]h$]h&]hhuh1jNhjKhhhj]hMubjn)}(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](jt)}(hstruct module *moduleh](jz)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubh)}(hhh]jU)}(hmoduleh]hmodule}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjrsbc.request_firmware_nowaitasbuh1hhjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjU)}(hmoduleh]hmodule}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubjt)}(h bool ueventh](j,)}(hboolh]hbool}(hjhhhNhNubah}(h]h ]j8ah"]h$]h&]uh1j+hjubj>)}(h h]h }(hj hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubjU)}(hueventh]huevent}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubjt)}(hconst char *nameh](jz)}(hj}h]hconst}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhj/ubj>)}(h h]h }(hj@hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj/ubj,)}(hcharh]hchar}(hjNhhhNhNubah}(h]h ]j8ah"]h$]h&]uh1j+hj/ubj>)}(h h]h }(hj\hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj/ubj)}(hjh]h*}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubjU)}(hnameh]hname}(hjwhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThj/ubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubjt)}(hstruct device *deviceh](jz)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubh)}(hhh]jU)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.request_firmware_nowaitasbuh1hhjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjU)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubjt)}(h gfp_t gfph](h)}(hhh]jU)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.request_firmware_nowaitasbuh1hhjubj>)}(h h]h }(hj!hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubjU)}(hgfph]hgfp}(hj/hhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubjt)}(h void *contexth](j,)}(hvoidh]hvoid}(hjHhhhNhNubah}(h]h ]j8ah"]h$]h&]uh1j+hjDubj>)}(h h]h }(hjVhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjDubj)}(hjh]h*}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubjU)}(hcontexth]hcontext}(hjqhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjDubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubjt)}(h6void (*cont)(const struct firmware *fw, void *context)h](j,)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j8ah"]h$]h&]uh1j+hjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj)}(h(h]h(}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjU)}(hconth]hcont}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubj)}(h)h]h)}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h(}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjz)}(hj}h]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubjz)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubh)}(hhh]jU)}(hfirmwareh]hfirmware}(hj#hhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj%modnameN classnameNjj)}j]jc.request_firmware_nowaitasbuh1hhjubj>)}(h h]h }(hjAhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj)}(hjh]h*}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjU)}(hfwh]hfw}(hj\hhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubj)}(h,h]h,}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj>)}(h h]h }(hjxhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj,)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j8ah"]h$]h&]uh1j+hjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjU)}(hcontexth]hcontext}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubj)}(hjh]h)}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jshjubeh}(h]h ]h"]h$]h&]hhuh1jmhjKhhhj]hMubeh}(h]h ]h"]h$]h&]hhjuh1j%jjhjGhhhj]hMubah}(h]jBah ](jjeh"]h$]h&]jj)jhuh1jhj]hMhjDhhubj )}(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.c[hMhjhhubah}(h]h ]h"]h$]h&]uh1jhjDhhhj]hMubeh}(h]h ](jfunctioneh"]h$]h&]j)jj*jj+jj,j-j.uh1jhhhj%hNhNubj0)}(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. 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]j:)}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j9hjubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjubjP)}(hhh](jU)}(h9``struct module *module`` module requesting the firmware h](j[)}(h``struct module *module``h]ja)}(hj'h]hstruct module *module}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj%ubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhj!ubjw)}(hhh]h)}(hmodule requesting the firmwareh]hmodule requesting the firmware}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMhj=ubah}(h]h ]h"]h$]h&]uh1jvhj!ubeh}(h]h ]h"]h$]h&]uh1jThj<hMhjubjU)}(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](j[)}(h``bool uevent``h]ja)}(hj`h]h bool uevent}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj^ubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjZubjw)}(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.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjvubah}(h]h ]h"]h$]h&]uh1jvhjZubeh}(h]h ]h"]h$]h&]uh1jThjuhMhjubjU)}(h+``const char *name`` name of firmware file h](j[)}(h``const char *name``h]ja)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjubjw)}(hhh]h)}(hname of firmware fileh]hname of firmware file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jvhjubeh}(h]h ]h"]h$]h&]uh1jThjhMhjubjU)}(hD``struct device *device`` device for which firmware is being loaded h](j[)}(h``struct device *device``h]ja)}(hjh]hstruct device *device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjubjw)}(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&]uh1jvhjubeh}(h]h ]h"]h$]h&]uh1jThjhMhjubjU)}(h``gfp_t gfp`` allocation flags h](j[)}(h ``gfp_t gfp``h]ja)}(hj h]h gfp_t gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj ubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjubjw)}(hhh]h)}(hallocation flagsh]hallocation flags}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hMhj"ubah}(h]h ]h"]h$]h&]uh1jvhjubeh}(h]h ]h"]h$]h&]uh1jThj!hMhjubjU)}(hi``void *context`` will be passed over to **cont**, and **fw** may be ``NULL`` if firmware request fails. h](j[)}(h``void *context``h]ja)}(hjEh]h void *context}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjCubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhj?ubjw)}(hhh]h)}(hVwill be passed over to **cont**, and **fw** may be ``NULL`` if firmware request fails.h](hwill be passed over to }(hj^hhhNhNubj:)}(h**cont**h]hcont}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j9hj^ubh, and }(hj^hhhNhNubj:)}(h**fw**h]hfw}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1j9hj^ubh may be }(hj^hhhNhNubja)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hj^ubh if firmware request fails.}(hj^hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhj[ubah}(h]h ]h"]h$]h&]uh1jvhj?ubeh}(h]h ]h"]h$]h&]uh1jThjZhMhjubjU)}(hX ``void (*cont)(const struct firmware *fw, void *context)`` function will be called asynchronously when the firmware request is over. 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](j[)}(h:``void (*cont)(const struct firmware *fw, void *context)``h]ja)}(hjh]h6void (*cont)(const struct firmware *fw, void *context)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjubjw)}(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.chMhjubh)}(h3Caller must hold the reference count of **device**.h](h(Caller must hold the reference count of }(hjhhhNhNubj:)}(h **device**h]hdevice}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j9hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjubjP)}(hhh]jU)}(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](j[)}(h=Asynchronous variant of request_firmware() for user contexts:h]h=Asynchronous variant of request_firmware() for user contexts:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jZhjhMhjubjw)}(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 }(hj!hhhNhNubj:)}(h**gfp**h]hgfp}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j9hj!ubh is GFP_KERNEL.}(hj!hhhNhNubeh}(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)}(hjJh](hcan’t sleep at all if }(hjLhhhNhNubj:)}(h**gfp**h]hgfp}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1j9hjLubh is GFP_ATOMIC.}(hjLhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:54: ./drivers/base/firmware_loader/main.chMhjHubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet-uh1jhjAhMhjubah}(h]h ]h"]h$]h&]uh1jvhjubeh}(h]h ]h"]h$]h&]uh1jThjhMhjubah}(h]h ]h"]h$]h&]uh1jOhjubeh}(h]h ]h"]h$]h&]uh1jvhjubeh}(h]h ]h"]h$]h&]uh1jThjhMhjubeh}(h]h ]h"]h$]h&]uh1jOhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j/hj%hhhNhNubeh}(h]request-firmware-nowaitah ]h"]request_firmware_nowaitah$]h&]uh1hhjhhhhhK5ubeh}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)}(h h]h }(hj hhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjhhhj hM?ubjO)}(hfirmware_request_cacheh]jU)}(hfirmware_request_cacheh]hfirmware_request_cache}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubah}(h]h ](jhjieh"]h$]h&]hhuh1jNhjhhhj hM?ubjn)}(h)(struct device *device, const char *name)h](jt)}(hstruct device *deviceh](jz)}(hjh]hstruct}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhj7ubj>)}(h h]h }(hjHhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj7ubh)}(hhh]jU)}(hdeviceh]hdevice}(hjYhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjVubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj[modnameN classnameNjj)}j]j)}jj!sbc.firmware_request_cacheasbuh1hhj7ubj>)}(h h]h }(hjyhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hj7ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubjU)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThj7ubeh}(h]h ]h"]h$]h&]noemphhhuh1jshj3ubjt)}(hconst char *nameh](jz)}(hj}h]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jyhjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj,)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j8ah"]h$]h&]uh1j+hjubj>)}(h h]h }(hjhhhNhNubah}(h]h ]jJah"]h$]h&]uh1j=hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjU)}(hnameh]hname}(hjhhhNhNubah}(h]h ]jaah"]h$]h&]uh1jThjubeh}(h]h ]h"]h$]h&]noemphhhuh1jshj3ubeh}(h]h ]h"]h$]h&]hhuh1jmhjhhhj hM?ubeh}(h]h ]h"]h$]h&]hhjuh1j%jjhjhhhj hM?ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hM?hjhhubj )}(hhh]h)}(h/cache firmware for suspend so resume can use ith]h/cache firmware for suspend so resume can use it}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:68: ./drivers/base/firmware_loader/main.chM4hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hM?ubeh}(h]h ](jfunctioneh"]h$]h&]j)jj*j3j+j3j,j-j.uh1jhhhjhNhNubj0)}(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]j:)}(hj=h]h Parameters}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j9hj;ubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:68: ./drivers/base/firmware_loader/main.chM8hj7ubjP)}(hhh](jU)}(hI``struct device *device`` device for which firmware should be cached for h](j[)}(h``struct device *device``h]ja)}(hj\h]hstruct device *device}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjZubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:68: ./drivers/base/firmware_loader/main.chM5hjVubjw)}(hhh]h)}(h.device for which firmware should be cached forh]h.device for which firmware should be cached for}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhM5hjrubah}(h]h ]h"]h$]h&]uh1jvhjVubeh}(h]h ]h"]h$]h&]uh1jThjqhM5hjSubjU)}(h+``const char *name`` name of firmware file h](j[)}(h``const char *name``h]ja)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j`hjubah}(h]h ]h"]h$]h&]uh1jZhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:68: ./drivers/base/firmware_loader/main.chM6hjubjw)}(hhh]h)}(hname of firmware fileh]hname of firmware file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM6hjubah}(h]h ]h"]h$]h&]uh1jvhjubeh}(h]h ]h"]h$]h&]uh1jThjhM6hjSubeh}(h]h ]h"]h$]h&]uh1jOhj7ubh)}(h**Description**h]j:)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j9hjubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:68: ./drivers/base/firmware_loader/main.chM8hj7ubh)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhx/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/request_firmware:68: ./drivers/base/firmware_loader/main.chM8hj7ubeh}(h]h ] kernelindentah"]h$]h&]uh1j/hjhhhNhNubeh}(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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKHubh)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKJhj hhubeh}(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_handlerj^error_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}(j8j5jjjjjjj j j j jjjjjjj jjjj0j-u nametypes}(j8jjjj j jjjj jj0uh}(j5hjhjhjj!jjjjj jjjj j j j jj j j jjjj%jBjGjjjjjjj-j u 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.