Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
[linux-drm-fsl-dcu.git] / net / ieee80211 / softmac / ieee80211softmac_event.c
index 4b153f7cc96c7096f41515a15013882734d45197..b3e33a4d48691f7ee3400ff9e22e612ebd49ffe4 100644 (file)
@@ -73,12 +73,14 @@ static char *event_descriptions[IEEE80211SOFTMAC_EVENT_LAST+1] = {
 
 
 static void
-ieee80211softmac_notify_callback(void *d)
+ieee80211softmac_notify_callback(struct work_struct *work)
 {
-       struct ieee80211softmac_event event = *(struct ieee80211softmac_event*) d;
-       kfree(d);
-       
-       event.fun(event.mac->dev, event.context);
+       struct ieee80211softmac_event *pevent =
+               container_of(work, struct ieee80211softmac_event, work.work);
+       struct ieee80211softmac_event event = *pevent;
+       kfree(pevent);
+
+       event.fun(event.mac->dev, event.event_type, event.context);
 }
 
 int
@@ -90,16 +92,16 @@ ieee80211softmac_notify_internal(struct ieee80211softmac_device *mac,
 
        if (event < -1 || event > IEEE80211SOFTMAC_EVENT_LAST)
                return -ENOSYS;
-       
+
        if (!fun)
                return -EINVAL;
-       
+
        eventptr = kmalloc(sizeof(struct ieee80211softmac_event), gfp_mask);
        if (!eventptr)
                return -ENOMEM;
-       
+
        eventptr->event_type = event;
-       INIT_WORK(&eventptr->work, ieee80211softmac_notify_callback, eventptr);
+       INIT_DELAYED_WORK(&eventptr->work, ieee80211softmac_notify_callback);
        eventptr->fun = fun;
        eventptr->context = context;
        eventptr->mac = mac;
@@ -120,7 +122,7 @@ ieee80211softmac_notify_gfp(struct net_device *dev,
 
        if (event < 0 || event > IEEE80211SOFTMAC_EVENT_LAST)
                return -ENOSYS;
-       
+
        return ieee80211softmac_notify_internal(mac, event, NULL, fun, context, gfp_mask);
 }
 EXPORT_SYMBOL_GPL(ieee80211softmac_notify_gfp);
@@ -131,7 +133,7 @@ ieee80211softmac_call_events_locked(struct ieee80211softmac_device *mac, int eve
 {
        struct ieee80211softmac_event *eventptr, *tmp;
        struct ieee80211softmac_network *network;
-       
+
        if (event >= 0) {
                union iwreq_data wrqu;
                int we_event;
@@ -167,7 +169,10 @@ ieee80211softmac_call_events_locked(struct ieee80211softmac_device *mac, int eve
                        if ((eventptr->event_type == event || eventptr->event_type == -1)
                                && (eventptr->event_context == NULL || eventptr->event_context == event_ctx)) {
                                list_del(&eventptr->list);
-                               schedule_work(&eventptr->work);
+                               /* User may have subscribed to ANY event, so
+                                * we tell them which event triggered it. */
+                               eventptr->event_type = event;
+                               schedule_delayed_work(&eventptr->work, 0);
                        }
                }
 }