aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base
diff options
context:
space:
mode:
authorMing Lei <ming.lei@canonical.com>2015-01-12 11:02:01 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-02-03 18:33:10 -0500
commit68ff2a00dbf590dc9483c20f85fd1f1faa054604 (patch)
tree43502001a0d21b0eb71c5df2109f392556f1f923 /drivers/base
parent0cb64249ca50033ec22e63582837f94202c63d9f (diff)
firmware_loader: handle timeout via wait_for_completion_interruptible_timeout()
It is simpler to handle timeout by wait_for_completion_interruptible_timeout(), so remove previous delay work for timeout. Signed-off-by: Ming Lei <ming.lei@canonical.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/firmware_class.c30
1 files changed, 6 insertions, 24 deletions
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
index 5870ec35efe6..60ac9c3f7f48 100644
--- a/drivers/base/firmware_class.c
+++ b/drivers/base/firmware_class.c
@@ -94,7 +94,7 @@ static int loading_timeout = 60; /* In seconds */
94 94
95static inline long firmware_loading_timeout(void) 95static inline long firmware_loading_timeout(void)
96{ 96{
97 return loading_timeout > 0 ? loading_timeout * HZ : MAX_SCHEDULE_TIMEOUT; 97 return loading_timeout > 0 ? loading_timeout * HZ : MAX_JIFFY_OFFSET;
98} 98}
99 99
100/* firmware behavior options */ 100/* firmware behavior options */
@@ -446,7 +446,6 @@ static int fw_add_devm_name(struct device *dev, const char *name)
446 */ 446 */
447#ifdef CONFIG_FW_LOADER_USER_HELPER 447#ifdef CONFIG_FW_LOADER_USER_HELPER
448struct firmware_priv { 448struct firmware_priv {
449 struct delayed_work timeout_work;
450 bool nowait; 449 bool nowait;
451 struct device dev; 450 struct device dev;
452 struct firmware_buf *buf; 451 struct firmware_buf *buf;
@@ -836,16 +835,6 @@ static struct bin_attribute firmware_attr_data = {
836 .write = firmware_data_write, 835 .write = firmware_data_write,
837}; 836};
838 837
839static void firmware_class_timeout_work(struct work_struct *work)
840{
841 struct firmware_priv *fw_priv = container_of(work,
842 struct firmware_priv, timeout_work.work);
843
844 mutex_lock(&fw_lock);
845 fw_load_abort(fw_priv);
846 mutex_unlock(&fw_lock);
847}
848
849static struct firmware_priv * 838static struct firmware_priv *
850fw_create_instance(struct firmware *firmware, const char *fw_name, 839fw_create_instance(struct firmware *firmware, const char *fw_name,
851 struct device *device, unsigned int opt_flags) 840 struct device *device, unsigned int opt_flags)
@@ -862,9 +851,6 @@ fw_create_instance(struct firmware *firmware, const char *fw_name,
862 851
863 fw_priv->nowait = !!(opt_flags & FW_OPT_NOWAIT); 852 fw_priv->nowait = !!(opt_flags & FW_OPT_NOWAIT);
864 fw_priv->fw = firmware; 853 fw_priv->fw = firmware;
865 INIT_DELAYED_WORK(&fw_priv->timeout_work,
866 firmware_class_timeout_work);
867
868 f_dev = &fw_priv->dev; 854 f_dev = &fw_priv->dev;
869 855
870 device_initialize(f_dev); 856 device_initialize(f_dev);
@@ -917,18 +903,14 @@ static int _request_firmware_load(struct firmware_priv *fw_priv,
917 buf->need_uevent = true; 903 buf->need_uevent = true;
918 dev_set_uevent_suppress(f_dev, false); 904 dev_set_uevent_suppress(f_dev, false);
919 dev_dbg(f_dev, "firmware: requesting %s\n", buf->fw_id); 905 dev_dbg(f_dev, "firmware: requesting %s\n", buf->fw_id);
920 if (timeout != MAX_SCHEDULE_TIMEOUT)
921 queue_delayed_work(system_power_efficient_wq,
922 &fw_priv->timeout_work, timeout);
923
924 kobject_uevent(&fw_priv->dev.kobj, KOBJ_ADD); 906 kobject_uevent(&fw_priv->dev.kobj, KOBJ_ADD);
907 } else {
908 timeout = MAX_JIFFY_OFFSET;
925 } 909 }
926 910
927 retval = wait_for_completion_interruptible(&buf->completion); 911 retval = wait_for_completion_interruptible_timeout(&buf->completion,
928 912 timeout);
929 cancel_delayed_work_sync(&fw_priv->timeout_work); 913 if (retval == -ERESTARTSYS || !retval) {
930
931 if (retval == -ERESTARTSYS) {
932 mutex_lock(&fw_lock); 914 mutex_lock(&fw_lock);
933 fw_load_abort(fw_priv); 915 fw_load_abort(fw_priv);
934 mutex_unlock(&fw_lock); 916 mutex_unlock(&fw_lock);