aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wimax/i2400m/rx.c
diff options
context:
space:
mode:
authorInaky Perez-Gonzalez <inaky@linux.intel.com>2009-09-16 20:10:55 -0400
committerInaky Perez-Gonzalez <inaky@linux.intel.com>2009-10-19 02:56:07 -0400
commitc2315b4ea9ac9c3f8caf03c3511d86fabe4a5fcd (patch)
tree17e2d15abfd26fa83f8a9654bf581f6d40fc8c33 /drivers/net/wimax/i2400m/rx.c
parent8f90f3ee83dc54e182d6a7548727cbae4b523e6e (diff)
wimax/i2400m: clarify and fix i2400m->{ready,updown}
The i2400m driver uses two different bits to distinguish how much the driver is up. i2400m->ready is used to denote that the infrastructure to communicate with the device is up and running. i2400m->updown is used to indicate if 'ready' and the device is up and running, ready to take control and data traffic. However, all this was pretty dirty and not clear, with many open spots where race conditions were present. This commit cleans up the situation by: - documenting the usage of both bits - setting them only in specific, well controlled places (i2400m_dev_start, i2400m_dev_stop) - ensuring the i2400m workqueue can't get in the middle of the setting by flushing it when i2400m->ready is set to zero. This allows the report hook not having to check again for the bit to be set [rx.c:i2400m_report_hook_work()]. - using i2400m->updown to determine if the device is up and running instead of the wimax state in i2400m_dev_reset_handle(). - not loosing missed messages sent by the hardware before i2400m->ready is set. In rx.c, whatever the device sends can be sent to user space over the message pipes as soon as the wimax device is registered, so don't wait for i2400m->ready to be set. Signed-off-by: Inaky Perez-Gonzalez <inaky@linux.intel.com>
Diffstat (limited to 'drivers/net/wimax/i2400m/rx.c')
-rw-r--r--drivers/net/wimax/i2400m/rx.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/drivers/net/wimax/i2400m/rx.c b/drivers/net/wimax/i2400m/rx.c
index bcd411f1a854..82c200ad9fdc 100644
--- a/drivers/net/wimax/i2400m/rx.c
+++ b/drivers/net/wimax/i2400m/rx.c
@@ -177,8 +177,7 @@ void i2400m_report_hook_work(struct work_struct *ws)
177 struct i2400m_work *iw = 177 struct i2400m_work *iw =
178 container_of(ws, struct i2400m_work, ws); 178 container_of(ws, struct i2400m_work, ws);
179 struct i2400m_report_hook_args *args = (void *) iw->pl; 179 struct i2400m_report_hook_args *args = (void *) iw->pl;
180 if (iw->i2400m->ready) 180 i2400m_report_hook(iw->i2400m, args->l3l4_hdr, args->size);
181 i2400m_report_hook(iw->i2400m, args->l3l4_hdr, args->size);
182 kfree_skb(args->skb_rx); 181 kfree_skb(args->skb_rx);
183 i2400m_put(iw->i2400m); 182 i2400m_put(iw->i2400m);
184 kfree(iw); 183 kfree(iw);
@@ -305,11 +304,12 @@ void i2400m_rx_ctl(struct i2400m *i2400m, struct sk_buff *skb_rx,
305 .l3l4_hdr = l3l4_hdr, 304 .l3l4_hdr = l3l4_hdr,
306 .size = size 305 .size = size
307 }; 306 };
308 if (unlikely(i2400m->ready == 0)) /* only send if up */ 307 rmb(); /* see i2400m->ready's documentation */
309 return; 308 if (likely(i2400m->ready)) { /* only send if up */
310 skb_get(skb_rx); 309 skb_get(skb_rx);
311 i2400m_queue_work(i2400m, i2400m_report_hook_work, 310 i2400m_queue_work(i2400m, i2400m_report_hook_work,
312 GFP_KERNEL, &args, sizeof(args)); 311 GFP_KERNEL, &args, sizeof(args));
312 }
313 if (unlikely(i2400m->trace_msg_from_user)) 313 if (unlikely(i2400m->trace_msg_from_user))
314 wimax_msg(&i2400m->wimax_dev, "echo", 314 wimax_msg(&i2400m->wimax_dev, "echo",
315 l3l4_hdr, size, GFP_KERNEL); 315 l3l4_hdr, size, GFP_KERNEL);
@@ -363,8 +363,6 @@ void i2400m_rx_trace(struct i2400m *i2400m,
363 msg_type & I2400M_MT_REPORT_MASK ? "REPORT" : "CMD/SET/GET", 363 msg_type & I2400M_MT_REPORT_MASK ? "REPORT" : "CMD/SET/GET",
364 msg_type, size); 364 msg_type, size);
365 d_dump(2, dev, l3l4_hdr, size); 365 d_dump(2, dev, l3l4_hdr, size);
366 if (unlikely(i2400m->ready == 0)) /* only send if up */
367 return;
368 result = wimax_msg(wimax_dev, "trace", l3l4_hdr, size, GFP_KERNEL); 366 result = wimax_msg(wimax_dev, "trace", l3l4_hdr, size, GFP_KERNEL);
369 if (result < 0) 367 if (result < 0)
370 dev_err(dev, "error sending trace to userspace: %d\n", 368 dev_err(dev, "error sending trace to userspace: %d\n",