参照元

説明

引数

返り値

参考

実装

/* called from request_firmware() and request_firmware_work_func() */
static int
_request_firmware(const struct firmware **firmware_p, const char *name,
                  struct device *device, unsigned int opt_flags)
{
        struct firmware *fw;
        long timeout;
        int ret;
        if (!firmware_p)
                return -EINVAL;

        if (!name || name[0] == '\0')
                return -EINVAL;

        ret = _request_firmware_prepare(&fw, name, device);
        if (ret <= 0) /* error or already assigned */
                goto out;
        ret = 0;
        timeout = firmware_loading_timeout();
        if (opt_flags & FW_OPT_NOWAIT) {
                timeout = usermodehelper_read_lock_wait(timeout);
                if (!timeout) {
                        dev_dbg(device, "firmware: %s loading timed out\n",
                                name);
                        ret = -EBUSY;
                        goto out;
                }
        } else {
                ret = usermodehelper_read_trylock();
                if (WARN_ON(ret)) {
                        dev_err(device, "firmware: %s will not be loaded\n",
                                name);
                        goto out;
                }
        }

        ret = fw_get_filesystem_firmware(device, fw->priv);
        if (ret) {
                if (!(opt_flags & FW_OPT_NO_WARN))
                        dev_warn(device,
                                 "Direct firmware load for %s failed with error %d\n",
                                 name, ret);
                if (opt_flags & FW_OPT_USERHELPER) {
                        dev_warn(device, "Falling back to user helper\n");
                        ret = fw_load_from_user_helper(fw, name, device,
                                                       opt_flags, timeout);
                }
        }
        if (!ret)
                ret = assign_firmware_buf(fw, device, opt_flags);

        usermodehelper_read_unlock();
 out:
        if (ret < 0) {
                release_firmware(fw);
                fw = NULL;
        }
        *firmware_p = fw;
        return ret;
}

コメント


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-04-12 (火) 20:24:17