Commit b0fbcb2a authored by Inaky Perez-Gonzalez's avatar Inaky Perez-Gonzalez

wimax/i2400m: clean up & add a payload argument to i2400m_schedule_work()

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: default avatarInaky Perez-Gonzalez <inaky@linux.intel.com>
parent 7329012e
...@@ -107,6 +107,24 @@ MODULE_PARM_DESC(barkers, ...@@ -107,6 +107,24 @@ MODULE_PARM_DESC(barkers,
"signal; values are appended to a list--setting one value " "signal; values are appended to a list--setting one value "
"as zero cleans the existing list and starts a new one."); "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 * i2400m_queue_work - schedule work on a i2400m's queue
* *
...@@ -166,14 +184,12 @@ int i2400m_queue_work(struct i2400m *i2400m, ...@@ -166,14 +184,12 @@ int i2400m_queue_work(struct i2400m *i2400m,
BUG_ON(i2400m->work_queue == NULL); BUG_ON(i2400m->work_queue == NULL);
result = -ENOMEM; result = -ENOMEM;
iw = kzalloc(sizeof(*iw) + pl_size, gfp_flags); iw = __i2400m_work_setup(i2400m, fn, gfp_flags, pl, pl_size);
if (iw == NULL) if (iw != NULL) {
goto error_kzalloc; result = queue_work(i2400m->work_queue, &iw->ws);
iw->i2400m = i2400m_get(i2400m); if (WARN_ON(result == 0))
memcpy(iw->pl, pl, pl_size); result = -ENXIO;
INIT_WORK(&iw->ws, fn); }
result = queue_work(i2400m->work_queue, &iw->ws);
error_kzalloc:
return result; return result;
} }
EXPORT_SYMBOL_GPL(i2400m_queue_work); EXPORT_SYMBOL_GPL(i2400m_queue_work);
...@@ -192,21 +208,19 @@ EXPORT_SYMBOL_GPL(i2400m_queue_work); ...@@ -192,21 +208,19 @@ EXPORT_SYMBOL_GPL(i2400m_queue_work);
* it should not happen. * it should not happen.
*/ */
int i2400m_schedule_work(struct i2400m *i2400m, 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; int result;
struct i2400m_work *iw; struct i2400m_work *iw;
result = -ENOMEM; result = -ENOMEM;
iw = kzalloc(sizeof(*iw), gfp_flags); iw = __i2400m_work_setup(i2400m, fn, gfp_flags, pl, pl_size);
if (iw == NULL) if (iw != NULL) {
goto error_kzalloc; result = schedule_work(&iw->ws);
iw->i2400m = i2400m_get(i2400m); if (WARN_ON(result == 0))
INIT_WORK(&iw->ws, fn); result = -ENXIO;
result = schedule_work(&iw->ws); }
if (result == 0)
result = -ENXIO;
error_kzalloc:
return result; return result;
} }
...@@ -630,7 +644,7 @@ int i2400m_dev_reset_handle(struct i2400m *i2400m) ...@@ -630,7 +644,7 @@ int i2400m_dev_reset_handle(struct i2400m *i2400m)
i2400m->boot_mode = 1; i2400m->boot_mode = 1;
wmb(); /* Make sure i2400m_msg_to_dev() sees boot_mode */ wmb(); /* Make sure i2400m_msg_to_dev() sees boot_mode */
return i2400m_schedule_work(i2400m, __i2400m_dev_reset_handle, return i2400m_schedule_work(i2400m, __i2400m_dev_reset_handle,
GFP_ATOMIC); GFP_ATOMIC, NULL, 0);
} }
EXPORT_SYMBOL_GPL(i2400m_dev_reset_handle); EXPORT_SYMBOL_GPL(i2400m_dev_reset_handle);
......
...@@ -695,8 +695,6 @@ extern void i2400m_dev_shutdown(struct i2400m *); ...@@ -695,8 +695,6 @@ extern void i2400m_dev_shutdown(struct i2400m *);
extern struct attribute_group i2400m_dev_attr_group; 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 */ /* HDI message's payload description handling */
...@@ -778,10 +776,14 @@ struct device *i2400m_dev(struct i2400m *i2400m) ...@@ -778,10 +776,14 @@ struct device *i2400m_dev(struct i2400m *i2400m)
struct i2400m_work { struct i2400m_work {
struct work_struct ws; struct work_struct ws;
struct i2400m *i2400m; struct i2400m *i2400m;
size_t pl_size;
u8 pl[0]; u8 pl[0];
}; };
extern int i2400m_queue_work(struct i2400m *, extern int i2400m_queue_work(struct i2400m *,
void (*)(struct work_struct *), gfp_t, 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); const void *, size_t);
extern int i2400m_msg_check_status(const struct i2400m_l3l4_hdr *, extern int i2400m_msg_check_status(const struct i2400m_l3l4_hdr *,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment