aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wimax
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wimax')
-rw-r--r--drivers/net/wimax/i2400m/driver.c52
-rw-r--r--drivers/net/wimax/i2400m/i2400m.h6
2 files changed, 37 insertions, 21 deletions
diff --git a/drivers/net/wimax/i2400m/driver.c b/drivers/net/wimax/i2400m/driver.c
index 73f45ea010a7..5803a2bfd6af 100644
--- a/drivers/net/wimax/i2400m/driver.c
+++ b/drivers/net/wimax/i2400m/driver.c
@@ -107,6 +107,24 @@ MODULE_PARM_DESC(barkers,
107 "signal; values are appended to a list--setting one value " 107 "signal; values are appended to a list--setting one value "
108 "as zero cleans the existing list and starts a new one."); 108 "as zero cleans the existing list and starts a new one.");
109 109
110static
111struct i2400m_work *__i2400m_work_setup(
112 struct i2400m *i2400m, void (*fn)(struct work_struct *),
113 gfp_t gfp_flags, const void *pl, size_t pl_size)
114{
115 struct i2400m_work *iw;
116
117 iw = kzalloc(sizeof(*iw) + pl_size, gfp_flags);
118 if (iw == NULL)
119 return NULL;
120 iw->i2400m = i2400m_get(i2400m);
121 iw->pl_size = pl_size;
122 memcpy(iw->pl, pl, pl_size);
123 INIT_WORK(&iw->ws, fn);
124 return iw;
125}
126
127
110/** 128/**
111 * i2400m_queue_work - schedule work on a i2400m's queue 129 * i2400m_queue_work - schedule work on a i2400m's queue
112 * 130 *
@@ -166,14 +184,12 @@ int i2400m_queue_work(struct i2400m *i2400m,
166 184
167 BUG_ON(i2400m->work_queue == NULL); 185 BUG_ON(i2400m->work_queue == NULL);
168 result = -ENOMEM; 186 result = -ENOMEM;
169 iw = kzalloc(sizeof(*iw) + pl_size, gfp_flags); 187 iw = __i2400m_work_setup(i2400m, fn, gfp_flags, pl, pl_size);
170 if (iw == NULL) 188 if (iw != NULL) {
171 goto error_kzalloc; 189 result = queue_work(i2400m->work_queue, &iw->ws);
172 iw->i2400m = i2400m_get(i2400m); 190 if (WARN_ON(result == 0))
173 memcpy(iw->pl, pl, pl_size); 191 result = -ENXIO;
174 INIT_WORK(&iw->ws, fn); 192 }
175 result = queue_work(i2400m->work_queue, &iw->ws);
176error_kzalloc:
177 return result; 193 return result;
178} 194}
179EXPORT_SYMBOL_GPL(i2400m_queue_work); 195EXPORT_SYMBOL_GPL(i2400m_queue_work);
@@ -192,21 +208,19 @@ EXPORT_SYMBOL_GPL(i2400m_queue_work);
192 * it should not happen. 208 * it should not happen.
193 */ 209 */
194int i2400m_schedule_work(struct i2400m *i2400m, 210int i2400m_schedule_work(struct i2400m *i2400m,
195 void (*fn)(struct work_struct *), gfp_t gfp_flags) 211 void (*fn)(struct work_struct *), gfp_t gfp_flags,
212 const void *pl, size_t pl_size)
196{ 213{
197 int result; 214 int result;
198 struct i2400m_work *iw; 215 struct i2400m_work *iw;
199 216
200 result = -ENOMEM; 217 result = -ENOMEM;
201 iw = kzalloc(sizeof(*iw), gfp_flags); 218 iw = __i2400m_work_setup(i2400m, fn, gfp_flags, pl, pl_size);
202 if (iw == NULL) 219 if (iw != NULL) {
203 goto error_kzalloc; 220 result = schedule_work(&iw->ws);
204 iw->i2400m = i2400m_get(i2400m); 221 if (WARN_ON(result == 0))
205 INIT_WORK(&iw->ws, fn); 222 result = -ENXIO;
206 result = schedule_work(&iw->ws); 223 }
207 if (result == 0)
208 result = -ENXIO;
209error_kzalloc:
210 return result; 224 return result;
211} 225}
212 226
@@ -630,7 +644,7 @@ int i2400m_dev_reset_handle(struct i2400m *i2400m)
630 i2400m->boot_mode = 1; 644 i2400m->boot_mode = 1;
631 wmb(); /* Make sure i2400m_msg_to_dev() sees boot_mode */ 645 wmb(); /* Make sure i2400m_msg_to_dev() sees boot_mode */
632 return i2400m_schedule_work(i2400m, __i2400m_dev_reset_handle, 646 return i2400m_schedule_work(i2400m, __i2400m_dev_reset_handle,
633 GFP_ATOMIC); 647 GFP_ATOMIC, NULL, 0);
634} 648}
635EXPORT_SYMBOL_GPL(i2400m_dev_reset_handle); 649EXPORT_SYMBOL_GPL(i2400m_dev_reset_handle);
636 650
diff --git a/drivers/net/wimax/i2400m/i2400m.h b/drivers/net/wimax/i2400m/i2400m.h
index 5ac2cce88ba0..700f87be4acf 100644
--- a/drivers/net/wimax/i2400m/i2400m.h
+++ b/drivers/net/wimax/i2400m/i2400m.h
@@ -695,8 +695,6 @@ extern void i2400m_dev_shutdown(struct i2400m *);
695 695
696extern struct attribute_group i2400m_dev_attr_group; 696extern struct attribute_group i2400m_dev_attr_group;
697 697
698extern int i2400m_schedule_work(struct i2400m *,
699 void (*)(struct work_struct *), gfp_t);
700 698
701/* HDI message's payload description handling */ 699/* HDI message's payload description handling */
702 700
@@ -778,10 +776,14 @@ struct device *i2400m_dev(struct i2400m *i2400m)
778struct i2400m_work { 776struct i2400m_work {
779 struct work_struct ws; 777 struct work_struct ws;
780 struct i2400m *i2400m; 778 struct i2400m *i2400m;
779 size_t pl_size;
781 u8 pl[0]; 780 u8 pl[0];
782}; 781};
783extern int i2400m_queue_work(struct i2400m *, 782extern int i2400m_queue_work(struct i2400m *,
784 void (*)(struct work_struct *), gfp_t, 783 void (*)(struct work_struct *), gfp_t,
784 const void *, size_t);
785extern int i2400m_schedule_work(struct i2400m *,
786 void (*)(struct work_struct *), gfp_t,
785 const void *, size_t); 787 const void *, size_t);
786 788
787extern int i2400m_msg_check_status(const struct i2400m_l3l4_hdr *, 789extern int i2400m_msg_check_status(const struct i2400m_l3l4_hdr *,