€•EêŒsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ1/translations/zh_CN/driver-api/firmware/fw_upload”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/zh_TW/driver-api/firmware/fw_upload”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/it_IT/driver-api/firmware/fw_upload”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/ja_JP/driver-api/firmware/fw_upload”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/ko_KR/driver-api/firmware/fw_upload”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/pt_BR/driver-api/firmware/fw_upload”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/sp_SP/driver-api/firmware/fw_upload”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒK/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload.rst”h´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒFirmware Upload API”h]”hŒFirmware Upload API”…”�”}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhŒ paragraph”“”)�”}”(hXðA device driver that registers with the firmware loader will expose persistent sysfs nodes to enable users to initiate firmware updates for that device. It is the responsibility of the device driver and/or the device itself to perform any validation on the data received. Firmware upload uses the same *loading* and *data* sysfs files described in the documentation for firmware fallback. It also adds additional sysfs files to provide status on the transfer of the firmware image to the device.”h]”(hX/A device driver that registers with the firmware loader will expose persistent sysfs nodes to enable users to initiate firmware updates for that device. It is the responsibility of the device driver and/or the device itself to perform any validation on the data received. Firmware upload uses the same ”…”�”}”(hhßh²hh³Nh´NubhŒemphasis”“”)�”}”(hŒ *loading*”h]”hŒloading”…”�”}”(hhéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhhßubhŒ and ”…”�”}”(hhßh²hh³Nh´Nubhè)�”}”(hŒ*data*”h]”hŒdata”…”�”}”(hhûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhhßubhŒ­ sysfs files described in the documentation for firmware fallback. It also adds additional sysfs files to provide status on the transfer of the firmware image to the device.”…”�”}”(hhßh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒRegister for firmware upload”h]”hŒRegister for firmware upload”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´KubhÞ)�”}”(hXEA device driver registers for firmware upload by calling firmware_upload_register(). Among the parameter list is a name to identify the device under /sys/class/firmware. A user may initiate a firmware upload by echoing a 1 to the *loading* sysfs file for the target device. Next, the user writes the firmware image to the *data* sysfs file. After writing the firmware data, the user echos 0 to the *loading* sysfs file to signal completion. Echoing 0 to *loading* also triggers the transfer of the firmware to the lower-lever device driver in the context of a kernel worker thread.”h]”(hŒæA device driver registers for firmware upload by calling firmware_upload_register(). Among the parameter list is a name to identify the device under /sys/class/firmware. A user may initiate a firmware upload by echoing a 1 to the ”…”�”}”(hj$h²hh³Nh´Nubhè)�”}”(hŒ *loading*”h]”hŒloading”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj$ubhŒS sysfs file for the target device. Next, the user writes the firmware image to the ”…”�”}”(hj$h²hh³Nh´Nubhè)�”}”(hŒ*data*”h]”hŒdata”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj$ubhŒF sysfs file. After writing the firmware data, the user echos 0 to the ”…”�”}”(hj$h²hh³Nh´Nubhè)�”}”(hŒ *loading*”h]”hŒloading”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj$ubhŒ/ sysfs file to signal completion. Echoing 0 to ”…”�”}”(hj$h²hh³Nh´Nubhè)�”}”(hŒ *loading*”h]”hŒloading”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj$ubhŒv also triggers the transfer of the firmware to the lower-lever device driver in the context of a kernel worker thread.”…”�”}”(hj$h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khjh²hubhÞ)�”}”(hŒÆTo use the firmware upload API, write a driver that implements a set of ops. The probe function calls firmware_upload_register() and the remove function calls firmware_upload_unregister() such as::”h]”hŒÅTo use the firmware upload API, write a driver that implements a set of ops. The probe function calls firmware_upload_register() and the remove function calls firmware_upload_unregister() such as:”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khjh²hubhŒ literal_block”“”)�”}”(hXÓstatic const struct fw_upload_ops m10bmc_ops = { .prepare = m10bmc_sec_prepare, .write = m10bmc_sec_write, .poll_complete = m10bmc_sec_poll_complete, .cancel = m10bmc_sec_cancel, .cleanup = m10bmc_sec_cleanup, }; static int m10bmc_sec_probe(struct platform_device *pdev) { const char *fw_name, *truncate; struct m10bmc_sec *sec; struct fw_upload *fwl; unsigned int len; sec = devm_kzalloc(&pdev->dev, sizeof(*sec), GFP_KERNEL); if (!sec) return -ENOMEM; sec->dev = &pdev->dev; sec->m10bmc = dev_get_drvdata(pdev->dev.parent); dev_set_drvdata(&pdev->dev, sec); fw_name = dev_name(sec->dev); truncate = strstr(fw_name, ".auto"); len = (truncate) ? truncate - fw_name : strlen(fw_name); sec->fw_name = kmemdup_nul(fw_name, len, GFP_KERNEL); fwl = firmware_upload_register(THIS_MODULE, sec->dev, sec->fw_name, &m10bmc_ops, sec); if (IS_ERR(fwl)) { dev_err(sec->dev, "Firmware Upload driver failed to start\n"); kfree(sec->fw_name); return PTR_ERR(fwl); } sec->fwl = fwl; return 0; } static int m10bmc_sec_remove(struct platform_device *pdev) { struct m10bmc_sec *sec = dev_get_drvdata(&pdev->dev); firmware_upload_unregister(sec->fwl); kfree(sec->fw_name); return 0; }”h]”hXÓstatic const struct fw_upload_ops m10bmc_ops = { .prepare = m10bmc_sec_prepare, .write = m10bmc_sec_write, .poll_complete = m10bmc_sec_poll_complete, .cancel = m10bmc_sec_cancel, .cleanup = m10bmc_sec_cleanup, }; static int m10bmc_sec_probe(struct platform_device *pdev) { const char *fw_name, *truncate; struct m10bmc_sec *sec; struct fw_upload *fwl; unsigned int len; sec = devm_kzalloc(&pdev->dev, sizeof(*sec), GFP_KERNEL); if (!sec) return -ENOMEM; sec->dev = &pdev->dev; sec->m10bmc = dev_get_drvdata(pdev->dev.parent); dev_set_drvdata(&pdev->dev, sec); fw_name = dev_name(sec->dev); truncate = strstr(fw_name, ".auto"); len = (truncate) ? truncate - fw_name : strlen(fw_name); sec->fw_name = kmemdup_nul(fw_name, len, GFP_KERNEL); fwl = firmware_upload_register(THIS_MODULE, sec->dev, sec->fw_name, &m10bmc_ops, sec); if (IS_ERR(fwl)) { dev_err(sec->dev, "Firmware Upload driver failed to start\n"); kfree(sec->fw_name); return PTR_ERR(fwl); } sec->fwl = fwl; return 0; } static int m10bmc_sec_remove(struct platform_device *pdev) { struct m10bmc_sec *sec = dev_get_drvdata(&pdev->dev); firmware_upload_unregister(sec->fwl); kfree(sec->fw_name); return 0; }”…”�”}”hjŠsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jˆh³hÇh´K hjh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒfirmware_upload_register”h]”hŒfirmware_upload_register”…”�”}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj˜h²hh³hÇh´KRubhŒindex”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œ%firmware_upload_register (C function)”Œc.firmware_upload_register”hNt”auh1j©hj˜h²hh³Nh´NubhŒdesc”“”)�”}”(hhh]”(hŒdesc_signature”“”)�”}”(hŒžstruct fw_upload * firmware_upload_register (struct module *module, struct device *parent, const char *name, const struct fw_upload_ops *ops, void *dd_handle)”h]”hŒdesc_signature_line”“”)�”}”(hŒœstruct fw_upload *firmware_upload_register(struct module *module, struct device *parent, const char *name, const struct fw_upload_ops *ops, void *dd_handle)”h]”(hŒdesc_sig_keyword”“”)�”}”(hŒstruct”h]”hŒstruct”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”Œk”ah"]”h$]”h&]”uh1jËhjÇh²hh³Œy/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:83: ./drivers/base/firmware_loader/sysfs_upload.c”h´MubhŒdesc_sig_space”“”)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1jÝhjÇh²hh³jÜh´Mubh)�”}”(hhh]”hŒ desc_sig_name”“”)�”}”(hŒ fw_upload”h]”hŒ fw_upload”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1jñhjîubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”Œc”Œreftype”Œ identifier”Œ reftarget”jõŒmodname”NŒ classname”NŒ c:parent_key”Œsphinx.domains.c”Œ LookupKey”“”)�”}”Œdata”]”jŒ ASTIdentifier”“”)�”}”j Œfirmware_upload_register”sbŒc.firmware_upload_register”†”asbuh1hhjÇh²hh³jÜh´MubjÞ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jêah"]”h$]”h&]”uh1jÝhjÇh²hh³jÜh´MubhŒdesc_sig_punctuation”“”)�”}”(hŒ*”h]”hŒ*”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”Œp”ah"]”h$]”h&]”uh1j,hjÇh²hh³jÜh´MubhŒ desc_name”“”)�”}”(hŒfirmware_upload_register”h]”jò)�”}”(hjh]”hŒfirmware_upload_register”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”jþah"]”h$]”h&]”uh1jñhj?ubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”hÅhÆuh1j=hjÇh²hh³jÜh´MubhŒdesc_parameterlist”“”)�”}”(hŒr(struct module *module, struct device *parent, const char *name, const struct fw_upload_ops *ops, void *dd_handle)”h]”(hŒdesc_parameter”“”)�”}”(hŒstruct module *module”h]”(jÌ)�”}”(hjÏh]”hŒstruct”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”jØah"]”h$]”h&]”uh1jËhj`ubjÞ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”jêah"]”h$]”h&]”uh1jÝhj`ubh)�”}”(hhh]”jò)�”}”(hŒmodule”h]”hŒmodule”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”jþah"]”h$]”h&]”uh1jñhjubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j Œreftype”j Œ reftarget”j„Œmodname”NŒ classname”Njj)�”}”j]”jŒc.firmware_upload_register”†”asbuh1hhj`ubjÞ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jêah"]”h$]”h&]”uh1jÝhj`ubj-)�”}”(hj0h]”hŒ*”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”j9ah"]”h$]”h&]”uh1j,hj`ubjò)�”}”(hŒmodule”h]”hŒmodule”…”�”}”(hj»h²hh³Nh´Nubah}”(h]”h ]”jþah"]”h$]”h&]”uh1jñhj`ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j^hjZubj_)�”}”(hŒstruct device *parent”h]”(jÌ)�”}”(hjÏh]”hŒstruct”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”jØah"]”h$]”h&]”uh1jËhjÐubjÞ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjáh²hh³Nh´Nubah}”(h]”h ]”jêah"]”h$]”h&]”uh1jÝhjÐubh)�”}”(hhh]”jò)�”}”(hŒdevice”h]”hŒdevice”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”jþah"]”h$]”h&]”uh1jñhjïubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j Œreftype”j Œ reftarget”jôŒmodname”NŒ classname”Njj)�”}”j]”jŒc.firmware_upload_register”†”asbuh1hhjÐubjÞ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jêah"]”h$]”h&]”uh1jÝhjÐubj-)�”}”(hj0h]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j9ah"]”h$]”h&]”uh1j,hjÐubjò)�”}”(hŒparent”h]”hŒparent”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”jþah"]”h$]”h&]”uh1jñhjÐubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j^hjZubj_)�”}”(hŒconst char *name”h]”(jÌ)�”}”(hŒconst”h]”hŒconst”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”jØah"]”h$]”h&]”uh1jËhj@ubjÞ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”jêah"]”h$]”h&]”uh1jÝhj@ubhŒdesc_sig_keyword_type”“”)�”}”(hŒchar”h]”hŒchar”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”Œkt”ah"]”h$]”h&]”uh1j`hj@ubjÞ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”jêah"]”h$]”h&]”uh1jÝhj@ubj-)�”}”(hj0h]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j9ah"]”h$]”h&]”uh1j,hj@ubjò)�”}”(hŒname”h]”hŒname”…”�”}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”jþah"]”h$]”h&]”uh1jñhj@ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j^hjZubj_)�”}”(hŒconst struct fw_upload_ops *ops”h]”(jÌ)�”}”(hjFh]”hŒconst”…”�”}”(hj¥h²hh³Nh´Nubah}”(h]”h ]”jØah"]”h$]”h&]”uh1jËhj¡ubjÞ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”jêah"]”h$]”h&]”uh1jÝhj¡ubjÌ)�”}”(hjÏh]”hŒstruct”…”�”}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”jØah"]”h$]”h&]”uh1jËhj¡ubjÞ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”jêah"]”h$]”h&]”uh1jÝhj¡ubh)�”}”(hhh]”jò)�”}”(hŒ fw_upload_ops”h]”hŒ fw_upload_ops”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”jþah"]”h$]”h&]”uh1jñhjÛubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j Œreftype”j Œ reftarget”jàŒmodname”NŒ classname”Njj)�”}”j]”jŒc.firmware_upload_register”†”asbuh1hhj¡ubjÞ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”jêah"]”h$]”h&]”uh1jÝhj¡ubj-)�”}”(hj0h]”hŒ*”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j9ah"]”h$]”h&]”uh1j,hj¡ubjò)�”}”(hŒops”h]”hŒops”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jþah"]”h$]”h&]”uh1jñhj¡ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j^hjZubj_)�”}”(hŒvoid *dd_handle”h]”(ja)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”jmah"]”h$]”h&]”uh1j`hj,ubjÞ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”jêah"]”h$]”h&]”uh1jÝhj,ubj-)�”}”(hj0h]”hŒ*”…”�”}”(hjLh²hh³Nh´Nubah}”(h]”h ]”j9ah"]”h$]”h&]”uh1j,hj,ubjò)�”}”(hŒ dd_handle”h]”hŒ dd_handle”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”jþah"]”h$]”h&]”uh1jñhj,ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j^hjZubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jXhjÇh²hh³jÜh´Mubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒ add_permalink”ˆuh1jÅŒsphinx_line_type”Œ declarator”hjÁh²hh³jÜh´Mubah}”(h]”j¸ah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1j¿h³jÜh´Mhj¼h²hubhŒ desc_content”“”)�”}”(hhh]”hÞ)�”}”(hŒ*register for the firmware upload sysfs API”h]”hŒ*register for the firmware upload sysfs API”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œy/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:83: ./drivers/base/firmware_loader/sysfs_upload.c”h´MhjŠh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jˆhj¼h²hh³jÜh´Mubeh}”(h]”h ]”(j Œfunction”eh"]”h$]”h&]”Œdomain”j Œobjtype”j¥Œdesctype”j¥Œnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1jºh²hhj˜h³Nh´NubhŒ container”“”)�”}”(hXL**Parameters** ``struct module *module`` kernel module of this device ``struct device *parent`` parent device instantiating firmware upload ``const char *name`` firmware name to be associated with this device ``const struct fw_upload_ops *ops`` pointer to structure of firmware upload ops ``void *dd_handle`` pointer to parent driver private data **Description** **name** must be unique among all users of firmware upload. The firmware sysfs files for this device will be found at /sys/class/firmware/**name**. **Return** struct fw_upload pointer or ERR_PTR()”h]”(hÞ)�”}”(hŒ**Parameters**”h]”hŒstrong”“”)�”}”(hj·h]”hŒ Parameters”…”�”}”(hj»h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¹hjµubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œy/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:83: ./drivers/base/firmware_loader/sysfs_upload.c”h´Mhj±ubhŒdefinition_list”“”)�”}”(hhh]”(hŒdefinition_list_item”“”)�”}”(hŒ7``struct module *module`` kernel module of this device ”h]”(hŒterm”“”)�”}”(hŒ``struct module *module``”h]”hŒliteral”“”)�”}”(hjÞh]”hŒstruct module *module”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhjÜubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œy/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:83: ./drivers/base/firmware_loader/sysfs_upload.c”h´MhjÖubhŒ definition”“”)�”}”(hhh]”hÞ)�”}”(hŒkernel module of this device”h]”hŒkernel module of this device”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jõh´Mhjøubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjÖubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³jõh´MhjÑubjÕ)�”}”(hŒF``struct device *parent`` parent device instantiating firmware upload ”h]”(jÛ)�”}”(hŒ``struct device *parent``”h]”já)�”}”(hjh]”hŒstruct device *parent”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œy/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:83: ./drivers/base/firmware_loader/sysfs_upload.c”h´Mhjubj÷)�”}”(hhh]”hÞ)�”}”(hŒ+parent device instantiating firmware upload”h]”hŒ+parent device instantiating firmware upload”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³j0h´Mhj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³j0h´MhjÑubjÕ)�”}”(hŒE``const char *name`` firmware name to be associated with this device ”h]”(jÛ)�”}”(hŒ``const char *name``”h]”já)�”}”(hjTh]”hŒconst char *name”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhjRubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œy/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:83: ./drivers/base/firmware_loader/sysfs_upload.c”h´MhjNubj÷)�”}”(hhh]”hÞ)�”}”(hŒ/firmware name to be associated with this device”h]”hŒ/firmware name to be associated with this device”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jih´Mhjjubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjNubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³jih´MhjÑubjÕ)�”}”(hŒP``const struct fw_upload_ops *ops`` pointer to structure of firmware upload ops ”h]”(jÛ)�”}”(hŒ#``const struct fw_upload_ops *ops``”h]”já)�”}”(hj�h]”hŒconst struct fw_upload_ops *ops”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhj‹ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œy/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:83: ./drivers/base/firmware_loader/sysfs_upload.c”h´Mhj‡ubj÷)�”}”(hhh]”hÞ)�”}”(hŒ+pointer to structure of firmware upload ops”h]”hŒ+pointer to structure of firmware upload ops”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³j¢h´Mhj£ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj‡ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³j¢h´MhjÑubjÕ)�”}”(hŒ:``void *dd_handle`` pointer to parent driver private data ”h]”(jÛ)�”}”(hŒ``void *dd_handle``”h]”já)�”}”(hjÆh]”hŒvoid *dd_handle”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhjÄubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œy/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:83: ./drivers/base/firmware_loader/sysfs_upload.c”h´MhjÀubj÷)�”}”(hhh]”hÞ)�”}”(hŒ%pointer to parent driver private data”h]”hŒ%pointer to parent driver private data”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jÛh´MhjÜubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjÀubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³jÛh´MhjÑubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÏhj±ubhÞ)�”}”(hŒ**Description**”h]”jº)�”}”(hjh]”hŒ Description”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¹hjÿubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œy/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:83: ./drivers/base/firmware_loader/sysfs_upload.c”h´Mhj±ubhŒ block_quote”“”)�”}”(hŒ”**name** must be unique among all users of firmware upload. The firmware sysfs files for this device will be found at /sys/class/firmware/**name**. ”h]”hÞ)�”}”(hŒ“**name** must be unique among all users of firmware upload. The firmware sysfs files for this device will be found at /sys/class/firmware/**name**.”h]”(jº)�”}”(hŒ**name**”h]”hŒname”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¹hjubhŒ‚ must be unique among all users of firmware upload. The firmware sysfs files for this device will be found at /sys/class/firmware/”…”�”}”(hjh²hh³Nh´Nubjº)�”}”(hŒ**name**”h]”hŒname”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¹hjubhŒ.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œy/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:83: ./drivers/base/firmware_loader/sysfs_upload.c”h´Mhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³jKh´Mhj±ubhÞ)�”}”(hŒ **Return**”h]”jº)�”}”(hjTh]”hŒReturn”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¹hjRubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œy/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:83: ./drivers/base/firmware_loader/sysfs_upload.c”h´M!hj±ubhÞ)�”}”(hŒ%struct fw_upload pointer or ERR_PTR()”h]”hŒ%struct fw_upload pointer or ERR_PTR()”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œy/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:83: ./drivers/base/firmware_loader/sysfs_upload.c”h´M"hj±ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j¯hj˜h²hh³Nh´Nubeh}”(h]”Œfirmware-upload-register”ah ]”h"]”Œfirmware_upload_register”ah$]”h&]”uh1hÈhjh²hh³hÇh´KRubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒfirmware_upload_unregister”h]”hŒfirmware_upload_unregister”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjˆh²hh³hÇh´KWubjª)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j¶Œ'firmware_upload_unregister (C function)”Œc.firmware_upload_unregister”hNt”auh1j©hjˆh²hh³Nh´Nubj»)�”}”(hhh]”(jÀ)�”}”(hŒ=void firmware_upload_unregister (struct fw_upload *fw_upload)”h]”jÆ)�”}”(hŒ)�”}”(hŒfirmware_upload_unregister”h]”jò)�”}”(hŒfirmware_upload_unregister”h]”hŒfirmware_upload_unregister”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”jþah"]”h$]”h&]”uh1jñhjÏubah}”(h]”h ]”(jSjTeh"]”h$]”h&]”hÅhÆuh1j=hj®h²hh³jÀh´MubjY)�”}”(hŒ(struct fw_upload *fw_upload)”h]”j_)�”}”(hŒstruct fw_upload *fw_upload”h]”(jÌ)�”}”(hjÏh]”hŒstruct”…”�”}”(hjïh²hh³Nh´Nubah}”(h]”h ]”jØah"]”h$]”h&]”uh1jËhjëubjÞ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”jêah"]”h$]”h&]”uh1jÝhjëubh)�”}”(hhh]”jò)�”}”(hŒ fw_upload”h]”hŒ fw_upload”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jþah"]”h$]”h&]”uh1jñhj ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j Œreftype”j Œ reftarget”jŒmodname”NŒ classname”Njj)�”}”j]”j)�”}”j jÕsbŒc.firmware_upload_unregister”†”asbuh1hhjëubjÞ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”jêah"]”h$]”h&]”uh1jÝhjëubj-)�”}”(hj0h]”hŒ*”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”j9ah"]”h$]”h&]”uh1j,hjëubjò)�”}”(hŒ fw_upload”h]”hŒ fw_upload”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”jþah"]”h$]”h&]”uh1jñhjëubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j^hjçubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jXhj®h²hh³jÀh´Mubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjzˆuh1jÅj{j|hjªh²hh³jÀh´Mubah}”(h]”j¥ah ]”(j€j�eh"]”h$]”h&]”j…ˆj†)j‡huh1j¿h³jÀh´Mhj§h²hubj‰)�”}”(hhh]”hÞ)�”}”(hŒ$Unregister firmware upload interface”h]”hŒ$Unregister firmware upload interface”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œy/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:88: ./drivers/base/firmware_loader/sysfs_upload.c”h´Mhjoh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jˆhj§h²hh³jÀh´Mubeh}”(h]”h ]”(j Œfunction”eh"]”h$]”h&]”j©j jªjŠj«jŠj¬‰j­‰j®‰uh1jºh²hhjˆh³Nh´Nubj°)�”}”(hŒM**Parameters** ``struct fw_upload *fw_upload`` pointer to struct fw_upload”h]”(hÞ)�”}”(hŒ**Parameters**”h]”jº)�”}”(hj”h]”hŒ Parameters”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¹hj’ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œy/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:88: ./drivers/base/firmware_loader/sysfs_upload.c”h´MƒhjŽubjÐ)�”}”(hhh]”jÕ)�”}”(hŒ;``struct fw_upload *fw_upload`` pointer to struct fw_upload”h]”(jÛ)�”}”(hŒ``struct fw_upload *fw_upload``”h]”já)�”}”(hj³h]”hŒstruct fw_upload *fw_upload”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhj±ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œy/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:88: ./drivers/base/firmware_loader/sysfs_upload.c”h´M…hj­ubj÷)�”}”(hhh]”hÞ)�”}”(hŒpointer to struct fw_upload”h]”hŒpointer to struct fw_upload”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œy/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:88: ./drivers/base/firmware_loader/sysfs_upload.c”h´M€hjÉubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj­ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³jÈh´M…hjªubah}”(h]”h ]”h"]”h$]”h&]”uh1jÏhjŽubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j¯hjˆh²hh³Nh´Nubeh}”(h]”Œfirmware-upload-unregister”ah ]”h"]”Œfirmware_upload_unregister”ah$]”h&]”uh1hÈhjh²hh³hÇh´KWubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒFirmware Upload Ops”h]”hŒFirmware Upload Ops”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjüh²hh³hÇh´K\ubjª)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j¶Œfw_upload_ops (C struct)”Œc.fw_upload_ops”hNt”auh1j©hjüh²hh³Nh´Nubj»)�”}”(hhh]”(jÀ)�”}”(hŒ fw_upload_ops”h]”jÆ)�”}”(hŒstruct fw_upload_ops”h]”(jÌ)�”}”(hjÏh]”hŒstruct”…”�”}”(hj&h²hh³Nh´Nubah}”(h]”h ]”jØah"]”h$]”h&]”uh1jËhj"h²hh³Œf/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:93: ./include/linux/firmware.h”h´KubjÞ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”jêah"]”h$]”h&]”uh1jÝhj"h²hh³j3h´Kubj>)�”}”(hŒ fw_upload_ops”h]”jò)�”}”(hj h]”hŒ fw_upload_ops”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”jþah"]”h$]”h&]”uh1jñhjBubah}”(h]”h ]”(jSjTeh"]”h$]”h&]”hÅhÆuh1j=hj"h²hh³j3h´Kubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjzˆuh1jÅj{j|hjh²hh³j3h´Kubah}”(h]”jah ]”(j€j�eh"]”h$]”h&]”j…ˆj†)j‡huh1j¿h³j3h´Khjh²hubj‰)�”}”(hhh]”hÞ)�”}”(hŒ5device specific operations to support firmware upload”h]”hŒ5device specific operations to support firmware upload”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œf/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:93: ./include/linux/firmware.h”h´K5hjeh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jˆhjh²hh³j3h´Kubeh}”(h]”h ]”(j Œstruct”eh"]”h$]”h&]”j©j jªj€j«j€j¬‰j­‰j®‰uh1jºh²hhjüh³Nh´Nubj°)�”}”(hX‚**Definition**:: struct fw_upload_ops { enum fw_upload_err (*prepare)(struct fw_upload *fw_upload, const u8 *data, u32 size); enum fw_upload_err (*write)(struct fw_upload *fw_upload, const u8 *data, u32 offset, u32 size, u32 *written); enum fw_upload_err (*poll_complete)(struct fw_upload *fw_upload); void (*cancel)(struct fw_upload *fw_upload); void (*cleanup)(struct fw_upload *fw_upload); }; **Members** ``prepare`` Required: Prepare secure update ``write`` Required: The write() op receives the remaining size to be written and must return the actual size written or a negative error code. The write() op will be called repeatedly until all data is written. ``poll_complete`` Required: Check for the completion of the HW authentication/programming process. ``cancel`` Required: Request cancellation of update. This op is called from the context of a different kernel thread, so race conditions need to be considered. ``cleanup`` Optional: Complements the prepare() function and is called at the completion of the update, on success or failure, if the prepare function succeeded.”h]”(hÞ)�”}”(hŒ**Definition**::”h]”(jº)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¹hjˆubhŒ:”…”�”}”(hjˆh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œf/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:93: ./include/linux/firmware.h”h´K9hj„ubj‰)�”}”(hXŽstruct fw_upload_ops { enum fw_upload_err (*prepare)(struct fw_upload *fw_upload, const u8 *data, u32 size); enum fw_upload_err (*write)(struct fw_upload *fw_upload, const u8 *data, u32 offset, u32 size, u32 *written); enum fw_upload_err (*poll_complete)(struct fw_upload *fw_upload); void (*cancel)(struct fw_upload *fw_upload); void (*cleanup)(struct fw_upload *fw_upload); };”h]”hXŽstruct fw_upload_ops { enum fw_upload_err (*prepare)(struct fw_upload *fw_upload, const u8 *data, u32 size); enum fw_upload_err (*write)(struct fw_upload *fw_upload, const u8 *data, u32 offset, u32 size, u32 *written); enum fw_upload_err (*poll_complete)(struct fw_upload *fw_upload); void (*cancel)(struct fw_upload *fw_upload); void (*cleanup)(struct fw_upload *fw_upload); };”…”�”}”hj¥sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jˆh³Œf/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:93: ./include/linux/firmware.h”h´K;hj„ubhÞ)�”}”(hŒ **Members**”h]”jº)�”}”(hj¶h]”hŒMembers”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¹hj´ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œf/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:93: ./include/linux/firmware.h”h´KChj„ubjÐ)�”}”(hhh]”(jÕ)�”}”(hŒ,``prepare`` Required: Prepare secure update ”h]”(jÛ)�”}”(hŒ ``prepare``”h]”já)�”}”(hjÕh]”hŒprepare”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhjÓubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œf/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:93: ./include/linux/firmware.h”h´K7hjÏubj÷)�”}”(hhh]”hÞ)�”}”(hŒRequired: Prepare secure update”h]”hŒRequired: Prepare secure update”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jêh´K7hjëubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjÏubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³jêh´K7hjÌubjÕ)�”}”(hŒÓ``write`` Required: The write() op receives the remaining size to be written and must return the actual size written or a negative error code. The write() op will be called repeatedly until all data is written. ”h]”(jÛ)�”}”(hŒ ``write``”h]”já)�”}”(hj h]”hŒwrite”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œf/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:93: ./include/linux/firmware.h”h´KhjB ubj÷)�”}”(hhh]”hÞ)�”}”(hŒPRequired: Check for the completion of the HW authentication/programming process.”h]”hŒPRequired: Check for the completion of the HW authentication/programming process.”…”�”}”(hja h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œf/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:93: ./include/linux/firmware.h”h´K=hj^ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjB ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³j] h´K>hjÌubjÕ)�”}”(hŒ ``cancel`` Required: Request cancellation of update. This op is called from the context of a different kernel thread, so race conditions need to be considered. ”h]”(jÛ)�”}”(hŒ ``cancel``”h]”já)�”}”(hj‚ h]”hŒcancel”…”�”}”(hj„ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhj€ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œf/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:93: ./include/linux/firmware.h”h´KAhj| ubj÷)�”}”(hhh]”hÞ)�”}”(hŒ”Required: Request cancellation of update. This op is called from the context of a different kernel thread, so race conditions need to be considered.”h]”hŒ”Required: Request cancellation of update. This op is called from the context of a different kernel thread, so race conditions need to be considered.”…”�”}”(hj› h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œf/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:93: ./include/linux/firmware.h”h´K?hj˜ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj| ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³j— h´KAhjÌubjÕ)�”}”(hŒ¡``cleanup`` Optional: Complements the prepare() function and is called at the completion of the update, on success or failure, if the prepare function succeeded.”h]”(jÛ)�”}”(hŒ ``cleanup``”h]”já)�”}”(hj¼ h]”hŒcleanup”…”�”}”(hj¾ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhjº ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œf/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:93: ./include/linux/firmware.h”h´KDhj¶ ubj÷)�”}”(hhh]”hÞ)�”}”(hŒ•Optional: Complements the prepare() function and is called at the completion of the update, on success or failure, if the prepare function succeeded.”h]”hŒ•Optional: Complements the prepare() function and is called at the completion of the update, on success or failure, if the prepare function succeeded.”…”�”}”(hjÕ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œf/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:93: ./include/linux/firmware.h”h´KBhjÒ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj¶ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³jÑ h´KDhjÌubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÏhj„ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j¯hjüh²hh³Nh´Nubeh}”(h]”Œfirmware-upload-ops”ah ]”h"]”Œfirmware upload ops”ah$]”h&]”uh1hÈhjh²hh³hÇh´K\ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒFirmware Upload Progress Codes”h]”hŒFirmware Upload Progress Codes”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj h²hh³hÇh´KaubhÞ)�”}”(hŒÎThe following progress codes are used internally by the firmware loader. Corresponding strings are reported through the status sysfs node that is described below and are documented in the ABI documentation.”h]”hŒÎThe following progress codes are used internally by the firmware loader. Corresponding strings are reported through the status sysfs node that is described below and are documented in the ABI documentation.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kbhj h²hubjª)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j¶Œfw_upload_prog (C enum)”Œc.fw_upload_prog”hNt”auh1j©hj h²hh³Nh´Nubj»)�”}”(hhh]”(jÀ)�”}”(hŒfw_upload_prog”h]”jÆ)�”}”(hŒenum fw_upload_prog”h]”(jÌ)�”}”(hŒenum”h]”hŒenum”…”�”}”(hj= h²hh³Nh´Nubah}”(h]”h ]”jØah"]”h$]”h&]”uh1jËhj9 h²hh³Œz/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:102: ./drivers/base/firmware_loader/sysfs_upload.h”h´KubjÞ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjL h²hh³Nh´Nubah}”(h]”h ]”jêah"]”h$]”h&]”uh1jÝhj9 h²hh³jK h´Kubj>)�”}”(hŒfw_upload_prog”h]”jò)�”}”(hj7 h]”hŒfw_upload_prog”…”�”}”(hj^ h²hh³Nh´Nubah}”(h]”h ]”jþah"]”h$]”h&]”uh1jñhjZ ubah}”(h]”h ]”(jSjTeh"]”h$]”h&]”hÅhÆuh1j=hj9 h²hh³jK h´Kubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjzˆuh1jÅj{j|hj5 h²hh³jK h´Kubah}”(h]”j0 ah ]”(j€j�eh"]”h$]”h&]”j…ˆj†)j‡huh1j¿h³jK h´Khj2 h²hubj‰)�”}”(hhh]”hÞ)�”}”(hŒfirmware upload progress codes”h]”hŒfirmware upload progress codes”…”�”}”(hj€ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œz/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:102: ./drivers/base/firmware_loader/sysfs_upload.h”h´K hj} h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jˆhj2 h²hh³jK h´Kubeh}”(h]”h ]”(j Œenum”eh"]”h$]”h&]”j©j jªj˜ j«j˜ j¬‰j­‰j®‰uh1jºh²hhj h³Nh´Nubj°)�”}”(hX°**Constants** ``FW_UPLOAD_PROG_IDLE`` there is no firmware upload in progress ``FW_UPLOAD_PROG_RECEIVING`` worker thread is receiving firmware data ``FW_UPLOAD_PROG_PREPARING`` target device is preparing for firmware upload ``FW_UPLOAD_PROG_TRANSFERRING`` data is being copied to the device ``FW_UPLOAD_PROG_PROGRAMMING`` device is performing the firmware update ``FW_UPLOAD_PROG_MAX`` Maximum progress code marker”h]”(hÞ)�”}”(hŒ **Constants**”h]”jº)�”}”(hj¢ h]”hŒ Constants”…”�”}”(hj¤ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¹hj  ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œz/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:102: ./drivers/base/firmware_loader/sysfs_upload.h”h´Khjœ ubjÐ)�”}”(hhh]”(jÕ)�”}”(hŒ@``FW_UPLOAD_PROG_IDLE`` there is no firmware upload in progress ”h]”(jÛ)�”}”(hŒ``FW_UPLOAD_PROG_IDLE``”h]”já)�”}”(hjÁ h]”hŒFW_UPLOAD_PROG_IDLE”…”�”}”(hjà h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhj¿ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œz/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:102: ./drivers/base/firmware_loader/sysfs_upload.h”h´Khj» ubj÷)�”}”(hhh]”hÞ)�”}”(hŒ'there is no firmware upload in progress”h]”hŒ'there is no firmware upload in progress”…”�”}”(hjÚ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jÖ h´Khj× ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj» ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³jÖ h´Khj¸ ubjÕ)�”}”(hŒF``FW_UPLOAD_PROG_RECEIVING`` worker thread is receiving firmware data ”h]”(jÛ)�”}”(hŒ``FW_UPLOAD_PROG_RECEIVING``”h]”já)�”}”(hjú h]”hŒFW_UPLOAD_PROG_RECEIVING”…”�”}”(hjü h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhjø ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œz/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:102: ./drivers/base/firmware_loader/sysfs_upload.h”h´Khjô ubj÷)�”}”(hhh]”hÞ)�”}”(hŒ(worker thread is receiving firmware data”h]”hŒ(worker thread is receiving firmware data”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³j h´Khj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjô ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³j h´Khj¸ ubjÕ)�”}”(hŒL``FW_UPLOAD_PROG_PREPARING`` target device is preparing for firmware upload ”h]”(jÛ)�”}”(hŒ``FW_UPLOAD_PROG_PREPARING``”h]”já)�”}”(hj3 h]”hŒFW_UPLOAD_PROG_PREPARING”…”�”}”(hj5 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhj1 ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œz/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:102: ./drivers/base/firmware_loader/sysfs_upload.h”h´Khj- ubj÷)�”}”(hhh]”hÞ)�”}”(hŒ.target device is preparing for firmware upload”h]”hŒ.target device is preparing for firmware upload”…”�”}”(hjL h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jH h´KhjI ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj- ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³jH h´Khj¸ ubjÕ)�”}”(hŒC``FW_UPLOAD_PROG_TRANSFERRING`` data is being copied to the device ”h]”(jÛ)�”}”(hŒ``FW_UPLOAD_PROG_TRANSFERRING``”h]”já)�”}”(hjl h]”hŒFW_UPLOAD_PROG_TRANSFERRING”…”�”}”(hjn h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhjj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œz/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:102: ./drivers/base/firmware_loader/sysfs_upload.h”h´Khjf ubj÷)�”}”(hhh]”hÞ)�”}”(hŒ"data is being copied to the device”h]”hŒ"data is being copied to the device”…”�”}”(hj… h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³j� h´Khj‚ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjf ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³j� h´Khj¸ ubjÕ)�”}”(hŒH``FW_UPLOAD_PROG_PROGRAMMING`` device is performing the firmware update ”h]”(jÛ)�”}”(hŒ``FW_UPLOAD_PROG_PROGRAMMING``”h]”já)�”}”(hj¥ h]”hŒFW_UPLOAD_PROG_PROGRAMMING”…”�”}”(hj§ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhj£ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œz/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:102: ./drivers/base/firmware_loader/sysfs_upload.h”h´KhjŸ ubj÷)�”}”(hhh]”hÞ)�”}”(hŒ(device is performing the firmware update”h]”hŒ(device is performing the firmware update”…”�”}”(hj¾ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jº h´Khj» ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjŸ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³jº h´Khj¸ ubjÕ)�”}”(hŒ3``FW_UPLOAD_PROG_MAX`` Maximum progress code marker”h]”(jÛ)�”}”(hŒ``FW_UPLOAD_PROG_MAX``”h]”já)�”}”(hjÞ h]”hŒFW_UPLOAD_PROG_MAX”…”�”}”(hjà h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhjÜ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œz/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:102: ./drivers/base/firmware_loader/sysfs_upload.h”h´KhjØ ubj÷)�”}”(hhh]”hÞ)�”}”(hŒMaximum progress code marker”h]”hŒMaximum progress code marker”…”�”}”(hj÷ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œz/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:102: ./drivers/base/firmware_loader/sysfs_upload.h”h´K hjô ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjØ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³jó h´Khj¸ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÏhjœ ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j¯hj h²hh³Nh´Nubeh}”(h]”Œfirmware-upload-progress-codes”ah ]”h"]”Œfirmware upload progress codes”ah$]”h&]”uh1hÈhjh²hh³hÇh´KaubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒFirmware Upload Error Codes”h]”hŒFirmware Upload Error Codes”…”�”}”(hj* h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj' h²hh³hÇh´KjubhÞ)�”}”(hŒOThe following error codes may be returned by the driver ops in case of failure:”h]”hŒOThe following error codes may be returned by the driver ops in case of failure:”…”�”}”(hj8 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kkhj' h²hubjª)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j¶Œfw_upload_err (C enum)”Œc.fw_upload_err”hNt”auh1j©hj' h²hh³Nh´Nubj»)�”}”(hhh]”(jÀ)�”}”(hŒ fw_upload_err”h]”jÆ)�”}”(hŒenum fw_upload_err”h]”(jÌ)�”}”(hj? h]”hŒenum”…”�”}”(hj_ h²hh³Nh´Nubah}”(h]”h ]”jØah"]”h$]”h&]”uh1jËhj[ h²hh³Œg/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:110: ./include/linux/firmware.h”h´KubjÞ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjm h²hh³Nh´Nubah}”(h]”h ]”jêah"]”h$]”h&]”uh1jÝhj[ h²hh³jl h´Kubj>)�”}”(hŒ fw_upload_err”h]”jò)�”}”(hjY h]”hŒ fw_upload_err”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jþah"]”h$]”h&]”uh1jñhj{ ubah}”(h]”h ]”(jSjTeh"]”h$]”h&]”hÅhÆuh1j=hj[ h²hh³jl h´Kubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjzˆuh1jÅj{j|hjW h²hh³jl h´Kubah}”(h]”jR ah ]”(j€j�eh"]”h$]”h&]”j…ˆj†)j‡huh1j¿h³jl h´KhjT h²hubj‰)�”}”(hhh]”hÞ)�”}”(hŒfirmware upload error codes”h]”hŒfirmware upload error codes”…”�”}”(hj¡ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œg/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:110: ./include/linux/firmware.h”h´Khjž h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jˆhjT h²hh³jl h´Kubeh}”(h]”h ]”(j Œenum”eh"]”h$]”h&]”j©j jªj¹ j«j¹ j¬‰j­‰j®‰uh1jºh²hhj' h³Nh´Nubj°)�”}”(hX **Constants** ``FW_UPLOAD_ERR_NONE`` returned to indicate success ``FW_UPLOAD_ERR_HW_ERROR`` error signalled by hardware, see kernel log ``FW_UPLOAD_ERR_TIMEOUT`` SW timed out on handshake with HW/firmware ``FW_UPLOAD_ERR_CANCELED`` upload was cancelled by the user ``FW_UPLOAD_ERR_BUSY`` there is an upload operation already in progress ``FW_UPLOAD_ERR_INVALID_SIZE`` invalid firmware image size ``FW_UPLOAD_ERR_RW_ERROR`` read or write to HW failed, see kernel log ``FW_UPLOAD_ERR_WEAROUT`` FLASH device is approaching wear-out, wait & retry ``FW_UPLOAD_ERR_FW_INVALID`` invalid firmware file ``FW_UPLOAD_ERR_MAX`` Maximum error code marker”h]”(hÞ)�”}”(hŒ **Constants**”h]”jº)�”}”(hjà h]”hŒ Constants”…”�”}”(hjÅ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¹hjÁ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œg/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:110: ./include/linux/firmware.h”h´Khj½ ubjÐ)�”}”(hhh]”(jÕ)�”}”(hŒ4``FW_UPLOAD_ERR_NONE`` returned to indicate success ”h]”(jÛ)�”}”(hŒ``FW_UPLOAD_ERR_NONE``”h]”já)�”}”(hjâ h]”hŒFW_UPLOAD_ERR_NONE”…”�”}”(hjä h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhjà ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œg/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:110: ./include/linux/firmware.h”h´KhjÜ ubj÷)�”}”(hhh]”hÞ)�”}”(hŒreturned to indicate success”h]”hŒreturned to indicate success”…”�”}”(hjû h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³j÷ h´Khjø ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjÜ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³j÷ h´KhjÙ ubjÕ)�”}”(hŒG``FW_UPLOAD_ERR_HW_ERROR`` error signalled by hardware, see kernel log ”h]”(jÛ)�”}”(hŒ``FW_UPLOAD_ERR_HW_ERROR``”h]”já)�”}”(hj h]”hŒFW_UPLOAD_ERR_HW_ERROR”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œg/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:110: ./include/linux/firmware.h”h´K hj ubj÷)�”}”(hhh]”hÞ)�”}”(hŒ+error signalled by hardware, see kernel log”h]”hŒ+error signalled by hardware, see kernel log”…”�”}”(hj4 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³j0 h´K hj1 ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³j0 h´K hjÙ ubjÕ)�”}”(hŒE``FW_UPLOAD_ERR_TIMEOUT`` SW timed out on handshake with HW/firmware ”h]”(jÛ)�”}”(hŒ``FW_UPLOAD_ERR_TIMEOUT``”h]”já)�”}”(hjT h]”hŒFW_UPLOAD_ERR_TIMEOUT”…”�”}”(hjV h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhjR ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œg/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:110: ./include/linux/firmware.h”h´K#hjN ubj÷)�”}”(hhh]”hÞ)�”}”(hŒ*SW timed out on handshake with HW/firmware”h]”hŒ*SW timed out on handshake with HW/firmware”…”�”}”(hjm h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³ji h´K#hjj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjN ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³ji h´K#hjÙ ubjÕ)�”}”(hŒ<``FW_UPLOAD_ERR_CANCELED`` upload was cancelled by the user ”h]”(jÛ)�”}”(hŒ``FW_UPLOAD_ERR_CANCELED``”h]”já)�”}”(hj� h]”hŒFW_UPLOAD_ERR_CANCELED”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhj‹ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œg/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:110: ./include/linux/firmware.h”h´K&hj‡ ubj÷)�”}”(hhh]”hÞ)�”}”(hŒ upload was cancelled by the user”h]”hŒ upload was cancelled by the user”…”�”}”(hj¦ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³j¢ h´K&hj£ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj‡ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³j¢ h´K&hjÙ ubjÕ)�”}”(hŒH``FW_UPLOAD_ERR_BUSY`` there is an upload operation already in progress ”h]”(jÛ)�”}”(hŒ``FW_UPLOAD_ERR_BUSY``”h]”já)�”}”(hjÆ h]”hŒFW_UPLOAD_ERR_BUSY”…”�”}”(hjÈ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhjÄ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œg/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:110: ./include/linux/firmware.h”h´K)hjÀ ubj÷)�”}”(hhh]”hÞ)�”}”(hŒ0there is an upload operation already in progress”h]”hŒ0there is an upload operation already in progress”…”�”}”(hjß h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jÛ h´K)hjÜ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjÀ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³jÛ h´K)hjÙ ubjÕ)�”}”(hŒ;``FW_UPLOAD_ERR_INVALID_SIZE`` invalid firmware image size ”h]”(jÛ)�”}”(hŒ``FW_UPLOAD_ERR_INVALID_SIZE``”h]”já)�”}”(hjÿ h]”hŒFW_UPLOAD_ERR_INVALID_SIZE”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhjý ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œg/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:110: ./include/linux/firmware.h”h´K,hjù ubj÷)�”}”(hhh]”hÞ)�”}”(hŒinvalid firmware image size”h]”hŒinvalid firmware image size”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jh´K,hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjù ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³jh´K,hjÙ ubjÕ)�”}”(hŒF``FW_UPLOAD_ERR_RW_ERROR`` read or write to HW failed, see kernel log ”h]”(jÛ)�”}”(hŒ``FW_UPLOAD_ERR_RW_ERROR``”h]”já)�”}”(hj8h]”hŒFW_UPLOAD_ERR_RW_ERROR”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhj6ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œg/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:110: ./include/linux/firmware.h”h´K/hj2ubj÷)�”}”(hhh]”hÞ)�”}”(hŒ*read or write to HW failed, see kernel log”h]”hŒ*read or write to HW failed, see kernel log”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jMh´K/hjNubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj2ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³jMh´K/hjÙ ubjÕ)�”}”(hŒM``FW_UPLOAD_ERR_WEAROUT`` FLASH device is approaching wear-out, wait & retry ”h]”(jÛ)�”}”(hŒ``FW_UPLOAD_ERR_WEAROUT``”h]”já)�”}”(hjqh]”hŒFW_UPLOAD_ERR_WEAROUT”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhjoubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œg/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:110: ./include/linux/firmware.h”h´K2hjkubj÷)�”}”(hhh]”hÞ)�”}”(hŒ2FLASH device is approaching wear-out, wait & retry”h]”hŒ2FLASH device is approaching wear-out, wait & retry”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³j†h´K2hj‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjkubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³j†h´K2hjÙ ubjÕ)�”}”(hŒ3``FW_UPLOAD_ERR_FW_INVALID`` invalid firmware file ”h]”(jÛ)�”}”(hŒ``FW_UPLOAD_ERR_FW_INVALID``”h]”já)�”}”(hjªh]”hŒFW_UPLOAD_ERR_FW_INVALID”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhj¨ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œg/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:110: ./include/linux/firmware.h”h´K5hj¤ubj÷)�”}”(hhh]”hÞ)�”}”(hŒinvalid firmware file”h]”hŒinvalid firmware file”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³j¿h´K5hjÀubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj¤ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³j¿h´K5hjÙ ubjÕ)�”}”(hŒ/``FW_UPLOAD_ERR_MAX`` Maximum error code marker”h]”(jÛ)�”}”(hŒ``FW_UPLOAD_ERR_MAX``”h]”já)�”}”(hjãh]”hŒFW_UPLOAD_ERR_MAX”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jàhjáubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚh³Œg/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:110: ./include/linux/firmware.h”h´K7hjÝubj÷)�”}”(hhh]”hÞ)�”}”(hŒMaximum error code marker”h]”hŒMaximum error code marker”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œg/var/lib/git/docbuild/linux/Documentation/driver-api/firmware/fw_upload:110: ./include/linux/firmware.h”h´K8hjùubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjÝubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÔh³jøh´K7hjÙ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÏhj½ ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j¯hj' h²hh³Nh´Nubeh}”(h]”Œfirmware-upload-error-codes”ah ]”h"]”Œfirmware upload error codes”ah$]”h&]”uh1hÈhjh²hh³hÇh´Kjubeh}”(h]”Œregister-for-firmware-upload”ah ]”h"]”Œregister for firmware upload”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒSysfs Attributes”h]”hŒSysfs Attributes”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj4h²hh³hÇh´KrubhÞ)�”}”(hXDIn addition to the *loading* and *data* sysfs files, there are additional sysfs files to monitor the status of the data transfer to the target device and to determine the final pass/fail status of the transfer. Depending on the device and the size of the firmware image, a firmware update could take milliseconds or minutes.”h]”(hŒIn addition to the ”…”�”}”(hjEh²hh³Nh´Nubhè)�”}”(hŒ *loading*”h]”hŒloading”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjEubhŒ and ”…”�”}”(hjEh²hh³Nh´Nubhè)�”}”(hŒ*data*”h]”hŒdata”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjEubhX sysfs files, there are additional sysfs files to monitor the status of the data transfer to the target device and to determine the final pass/fail status of the transfer. Depending on the device and the size of the firmware image, a firmware update could take milliseconds or minutes.”…”�”}”(hjEh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kthj4h²hubhÞ)�”}”(hŒThe additional sysfs files are:”h]”hŒThe additional sysfs files are:”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kzhj4h²hubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒDstatus - provides an indication of the progress of a firmware update”h]”hÞ)�”}”(hjŽh]”hŒDstatus - provides an indication of the progress of a firmware update”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K|hjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj‡h²hh³hÇh´Nubj‹)�”}”(hŒ?error - provides error information for a failed firmware update”h]”hÞ)�”}”(hj¥h]”hŒ?error - provides error information for a failed firmware update”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K}hj£ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj‡h²hh³hÇh´Nubj‹)�”}”(hŒ>remaining_size - tracks the data transfer portion of an update”h]”hÞ)�”}”(hj¼h]”hŒ>remaining_size - tracks the data transfer portion of an update”…”�”}”(hj¾h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K~hjºubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj‡h²hh³hÇh´Nubj‹)�”}”(hŒ1cancel - echo 1 to this file to cancel the update”h]”hÞ)�”}”(hjÓh]”hŒ1cancel - echo 1 to this file to cancel the update”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhjÑubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj‡h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”j0uh1j…h³hÇh´K|hj4h²hubeh}”(h]”Œsysfs-attributes”ah ]”h"]”Œsysfs attributes”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´Krubeh}”(h]”Œfirmware-upload-api”ah ]”h"]”Œfirmware upload api”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j"Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jüjùj1j.j…j‚jùjöj jÿ j$ j! j)j&jôjñuŒ nametypes”}”(jü‰j1‰j…‰jù‰j ‰j$ ‰j)‰jô‰uh}”(jùhÊj.jj‚j˜j¸jÁjöjˆj¥jªjÿ jüjjj! j j0 j5 j&j' jR jW jñj4uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.