wimax/i2400m: clean up & add a payload argument to i2400m_schedule_work()
authorInaky Perez-Gonzalez <inaky@linux.intel.com>
Mon, 14 Sep 2009 20:29:32 +0000 (13:29 -0700)
committerInaky Perez-Gonzalez <inaky@linux.intel.com>
Mon, 19 Oct 2009 06:56:00 +0000 (15:56 +0900)
Forthcoming commits use having a payload argument added to
i2400m_schedule_work(), which then becomes nearly identical to
i2400m_queue_work().

This patch thus cleans up both's implementation, making it share
common helpers and adding the payload argument to
i2400m_schedule_work().

Signed-off-by: Inaky Perez-Gonzalez <inaky@linux.intel.com>
drivers/net/wimax/i2400m/driver.c
drivers/net/wimax/i2400m/i2400m.h

index 73f45ea..5803a2b 100644 (file)
@@ -107,6 +107,24 @@ MODULE_PARM_DESC(barkers,
                 "signal; values are appended to a list--setting one value "
                 "as zero cleans the existing list and starts a new one.");
 
+static
+struct i2400m_work *__i2400m_work_setup(
+       struct i2400m *i2400m, void (*fn)(struct work_struct *),
+       gfp_t gfp_flags, const void *pl, size_t pl_size)
+{
+       struct i2400m_work *iw;
+
+       iw = kzalloc(sizeof(*iw) + pl_size, gfp_flags);
+       if (iw == NULL)
+               return NULL;
+       iw->i2400m = i2400m_get(i2400m);
+       iw->pl_size = pl_size;
+       memcpy(iw->pl, pl, pl_size);
+       INIT_WORK(&iw->ws, fn);
+       return iw;
+}
+
+
 /**
  * i2400m_queue_work - schedule work on a i2400m's queue
  *
@@ -166,14 +184,12 @@ int i2400m_queue_work(struct i2400m *i2400m,
 
        BUG_ON(i2400m->work_queue == NULL);
        result = -ENOMEM;
-       iw = kzalloc(sizeof(*iw) + pl_size, gfp_flags);
-       if (iw == NULL)
-               goto error_kzalloc;
-       iw->i2400m = i2400m_get(i2400m);
-       memcpy(iw->pl, pl, pl_size);
-       INIT_WORK(&iw->ws, fn);
-       result = queue_work(i2400m->work_queue, &iw->ws);
-error_kzalloc:
+       iw = __i2400m_work_setup(i2400m, fn, gfp_flags, pl, pl_size);
+       if (iw != NULL) {
+               result = queue_work(i2400m->work_queue, &iw->ws);
+               if (WARN_ON(result == 0))
+                       result = -ENXIO;
+       }
        return result;
 }
 EXPORT_SYMBOL_GPL(i2400m_queue_work);
@@ -192,21 +208,19 @@ EXPORT_SYMBOL_GPL(i2400m_queue_work);
  * it should not happen.
  */
 int i2400m_schedule_work(struct i2400m *i2400m,
-                        void (*fn)(struct work_struct *), gfp_t gfp_flags)
+                        void (*fn)(struct work_struct *), gfp_t gfp_flags,
+                        const void *pl, size_t pl_size)
 {
        int result;
        struct i2400m_work *iw;
 
        result = -ENOMEM;
-       iw = kzalloc(sizeof(*iw), gfp_flags);
-       if (iw == NULL)
-               goto error_kzalloc;
-       iw->i2400m = i2400m_get(i2400m);
-       INIT_WORK(&iw->ws, fn);
-       result = schedule_work(&iw->ws);
-       if (result == 0)
-               result = -ENXIO;
-error_kzalloc:
+       iw = __i2400m_work_setup(i2400m, fn, gfp_flags, pl, pl_size);
+       if (iw != NULL) {
+               result = schedule_work(&iw->ws);
+               if (WARN_ON(result == 0))
+                       result = -ENXIO;
+       }
        return result;
 }
 
@@ -630,7 +644,7 @@ int i2400m_dev_reset_handle(struct i2400m *i2400m)
        i2400m->boot_mode = 1;
        wmb();          /* Make sure i2400m_msg_to_dev() sees boot_mode */
        return i2400m_schedule_work(i2400m, __i2400m_dev_reset_handle,
-                                   GFP_ATOMIC);
+                                   GFP_ATOMIC, NULL, 0);
 }
 EXPORT_SYMBOL_GPL(i2400m_dev_reset_handle);
 
index 5ac2cce..700f87b 100644 (file)
@@ -695,8 +695,6 @@ extern void i2400m_dev_shutdown(struct i2400m *);
 
 extern struct attribute_group i2400m_dev_attr_group;
 
-extern int i2400m_schedule_work(struct i2400m *,
-                               void (*)(struct work_struct *), gfp_t);
 
 /* HDI message's payload description handling */
 
@@ -778,10 +776,14 @@ struct device *i2400m_dev(struct i2400m *i2400m)
 struct i2400m_work {
        struct work_struct ws;
        struct i2400m *i2400m;
+       size_t pl_size;
        u8 pl[0];
 };
 extern int i2400m_queue_work(struct i2400m *,
                             void (*)(struct work_struct *), gfp_t,
+                            const void *, size_t);
+extern int i2400m_schedule_work(struct i2400m *,
+                               void (*)(struct work_struct *), gfp_t,
                                const void *, size_t);
 
 extern int i2400m_msg_check_status(const struct i2400m_l3l4_hdr *,