diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index 6ede229..a217ba8 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c @@ -550,7 +550,12 @@ static ssize_t firmware_loading_show(struct device *dev, struct device_attribute *attr, char *buf) { struct firmware_priv *fw_priv = to_firmware_priv(dev); - int loading = test_bit(FW_STATUS_LOADING, &fw_priv->buf->status); + int loading = 0; + + mutex_lock(&fw_lock); + if (fw_priv->buf) + loading = test_bit(FW_STATUS_LOADING, &fw_priv->buf->status); + mutex_unlock(&fw_lock); return sprintf(buf, "%d\n", loading); } @@ -592,12 +597,12 @@ static ssize_t firmware_loading_store(struct device *dev, const char *buf, size_t count) { struct firmware_priv *fw_priv = to_firmware_priv(dev); - struct firmware_buf *fw_buf = fw_priv->buf; + struct firmware_buf *fw_buf; int loading = simple_strtol(buf, NULL, 10); int i; mutex_lock(&fw_lock); - + fw_buf = fw_priv->buf; if (!fw_buf) goto out; @@ -636,6 +641,7 @@ static ssize_t firmware_loading_store(struct device *dev, /* fallthrough */ case -1: fw_load_abort(fw_buf); + fw_priv->buf = NULL; break; } out: @@ -704,6 +710,7 @@ static int fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size) GFP_KERNEL); if (!new_pages) { fw_load_abort(buf); + fw_priv->buf = NULL; return -ENOMEM; } memcpy(new_pages, buf->pages, @@ -721,6 +728,7 @@ static int fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size) if (!buf->pages[buf->nr_pages]) { fw_load_abort(buf); + fw_priv->buf = NULL; return -ENOMEM; } buf->nr_pages++; @@ -805,6 +813,7 @@ static void firmware_class_timeout_work(struct work_struct *work) return; } fw_load_abort(fw_priv->buf); + fw_priv->buf = NULL; mutex_unlock(&fw_lock); } @@ -886,8 +895,6 @@ static int _request_firmware_load(struct firmware_priv *fw_priv, bool uevent, cancel_delayed_work_sync(&fw_priv->timeout_work); - fw_priv->buf = NULL; - device_remove_file(f_dev, &dev_attr_loading); err_del_bin_attr: device_remove_bin_file(f_dev, &firmware_attr_data);