[POWERPC] Fix warning in hpte_decode(), and generalize it
[powerpc.git] / net / wireless / wext.c
index a6cf103..d6aaf65 100644 (file)
 
 #include <asm/uaccess.h>               /* copy_to_user() */
 
-/**************************** CONSTANTS ****************************/
-
-/* Debugging stuff */
-#undef WE_IOCTL_DEBUG          /* Debug IOCTL API */
-#undef WE_EVENT_DEBUG          /* Debug Event dispatcher */
-#undef WE_SPY_DEBUG            /* Debug enhanced spy support */
-
-/* Options */
-#define WE_EVENT_RTNETLINK     /* Propagate events using RtNetlink */
-#define WE_SET_EVENT           /* Generate an event on some set commands */
-
 /************************* GLOBAL VARIABLES *************************/
 /*
  * You should not use global variables, because of re-entrancy.
@@ -451,10 +440,8 @@ static const int event_type_pk_size[] = {
 /* ---------------------------------------------------------------- */
 /*
  * Return the driver handler associated with a specific Wireless Extension.
- * Called from various place, so make sure it remains efficient.
  */
-static inline iw_handler get_handler(struct net_device *dev,
-                                    unsigned int cmd)
+static iw_handler get_handler(struct net_device *dev, unsigned int cmd)
 {
        /* Don't "optimise" the following variable, it will crash */
        unsigned int    index;          /* *MUST* be unsigned */
@@ -481,7 +468,7 @@ static inline iw_handler get_handler(struct net_device *dev,
 /*
  * Get statistics out of the driver
  */
-static inline struct iw_statistics *get_wireless_stats(struct net_device *dev)
+static struct iw_statistics *get_wireless_stats(struct net_device *dev)
 {
        /* New location */
        if ((dev->wireless_handlers != NULL) &&
@@ -489,7 +476,7 @@ static inline struct iw_statistics *get_wireless_stats(struct net_device *dev)
                return dev->wireless_handlers->get_wireless_stats(dev);
 
        /* Not found */
-       return (struct iw_statistics *) NULL;
+       return NULL;
 }
 
 /* ---------------------------------------------------------------- */
@@ -511,14 +498,14 @@ static inline struct iw_statistics *get_wireless_stats(struct net_device *dev)
  * netif_running(dev) test. I'm open on that one...
  * Hopefully, the driver will remember to do a commit in "open()" ;-)
  */
-static inline int call_commit_handler(struct net_device *      dev)
+static int call_commit_handler(struct net_device *dev)
 {
        if ((netif_running(dev)) &&
-          (dev->wireless_handlers->standard[0] != NULL)) {
+          (dev->wireless_handlers->standard[0] != NULL))
                /* Call the commit handler on the driver */
                return dev->wireless_handlers->standard[0](dev, NULL,
                                                           NULL, NULL);
-       else
+       else
                return 0;               /* Command completed successfully */
 }
 
@@ -567,8 +554,7 @@ static int iw_handler_get_iwstats(struct net_device *               dev,
        struct iw_statistics *stats;
 
        stats = get_wireless_stats(dev);
-       if (stats != (struct iw_statistics *) NULL) {
-
+       if (stats) {
                /* Copy statistics to extra */
                memcpy(extra, stats, sizeof(struct iw_statistics));
                wrqu->data.length = sizeof(struct iw_statistics);
@@ -633,8 +619,8 @@ static int iw_handler_get_private(struct net_device *               dev,
 /*
  * Print one entry (line) of /proc/net/wireless
  */
-static __inline__ void wireless_seq_printf_stats(struct seq_file *seq,
-                                                struct net_device *dev)
+static void wireless_seq_printf_stats(struct seq_file *seq,
+                                     struct net_device *dev)
 {
        /* Get stats from the driver */
        struct iw_statistics *stats = get_wireless_stats(dev);
@@ -736,12 +722,6 @@ static int ioctl_standard_call(struct net_device * dev,
                return -EOPNOTSUPP;
        descr = &(standard_ioctl[cmd - SIOCIWFIRST]);
 
-#ifdef WE_IOCTL_DEBUG
-       printk(KERN_DEBUG "%s (WE) : Found standard handler for 0x%04X\n",
-              ifr->ifr_name, cmd);
-       printk(KERN_DEBUG "%s (WE) : Header type : %d, Token type : %d, size : %d, token : %d\n", dev->name, descr->header_type, descr->token_type, descr->token_size, descr->max_tokens);
-#endif /* WE_IOCTL_DEBUG */
-
        /* Prepare the call */
        info.cmd = cmd;
        info.flags = 0;
@@ -752,12 +732,10 @@ static int ioctl_standard_call(struct net_device *        dev,
                /* No extra arguments. Trivial to handle */
                ret = handler(dev, &info, &(iwr->u), NULL);
 
-#ifdef WE_SET_EVENT
                /* Generate an event to notify listeners of the change */
                if ((descr->flags & IW_DESCR_FLAG_EVENT) &&
                   ((ret == 0) || (ret == -EIWCOMMIT)))
                        wireless_send_event(dev, cmd, &(iwr->u), NULL);
-#endif /* WE_SET_EVENT */
        } else {
                char *  extra;
                int     extra_size;
@@ -832,17 +810,11 @@ static int ioctl_standard_call(struct net_device *        dev,
                        }
                }
 
-#ifdef WE_IOCTL_DEBUG
-               printk(KERN_DEBUG "%s (WE) : Malloc %d bytes\n",
-                      dev->name, extra_size);
-#endif /* WE_IOCTL_DEBUG */
-
                /* Create the kernel buffer */
                /*    kzalloc ensures NULL-termination for essid_compat */
                extra = kzalloc(extra_size, GFP_KERNEL);
-               if (extra == NULL) {
+               if (extra == NULL)
                        return -ENOMEM;
-               }
 
                /* If it is a SET, get all the extra data in here */
                if (IW_IS_SET(cmd) && (iwr->u.data.length != 0)) {
@@ -853,11 +825,6 @@ static int ioctl_standard_call(struct net_device * dev,
                                kfree(extra);
                                return -EFAULT;
                        }
-#ifdef WE_IOCTL_DEBUG
-                       printk(KERN_DEBUG "%s (WE) : Got %d bytes\n",
-                              dev->name,
-                              iwr->u.data.length * descr->token_size);
-#endif /* WE_IOCTL_DEBUG */
                }
 
                /* Call the handler */
@@ -878,14 +845,8 @@ static int ioctl_standard_call(struct net_device * dev,
                                           descr->token_size);
                        if (err)
                                ret =  -EFAULT;
-#ifdef WE_IOCTL_DEBUG
-                       printk(KERN_DEBUG "%s (WE) : Wrote %d bytes\n",
-                              dev->name,
-                              iwr->u.data.length * descr->token_size);
-#endif /* WE_IOCTL_DEBUG */
                }
 
-#ifdef WE_SET_EVENT
                /* Generate an event to notify listeners of the change */
                if ((descr->flags & IW_DESCR_FLAG_EVENT) &&
                   ((ret == 0) || (ret == -EIWCOMMIT))) {
@@ -897,7 +858,6 @@ static int ioctl_standard_call(struct net_device *  dev,
                                wireless_send_event(dev, cmd, &(iwr->u),
                                                    extra);
                }
-#endif /* WE_SET_EVENT */
 
                /* Cleanup - I told you it wasn't that long ;-) */
                kfree(extra);
@@ -928,10 +888,8 @@ static int ioctl_standard_call(struct net_device * dev,
  * a iw_handler but process it in your ioctl handler (i.e. use the
  * old driver API).
  */
-static inline int ioctl_private_call(struct net_device *       dev,
-                                    struct ifreq *             ifr,
-                                    unsigned int               cmd,
-                                    iw_handler         handler)
+static int ioctl_private_call(struct net_device *dev, struct ifreq *ifr,
+                             unsigned int cmd, iw_handler handler)
 {
        struct iwreq *                  iwr = (struct iwreq *) ifr;
        const struct iw_priv_args *     descr = NULL;
@@ -947,16 +905,6 @@ static inline int ioctl_private_call(struct net_device *   dev,
                        break;
                }
 
-#ifdef WE_IOCTL_DEBUG
-       printk(KERN_DEBUG "%s (WE) : Found private handler for 0x%04X\n",
-              ifr->ifr_name, cmd);
-       if (descr) {
-               printk(KERN_DEBUG "%s (WE) : Name %s, set %X, get %X\n",
-                      dev->name, descr->name,
-                      descr->set_args, descr->get_args);
-       }
-#endif /* WE_IOCTL_DEBUG */
-
        /* Compute the size of the set/get arguments */
        if (descr != NULL) {
                if (IW_IS_SET(cmd)) {
@@ -1007,23 +955,14 @@ static inline int ioctl_private_call(struct net_device * dev,
                        if (iwr->u.data.length > (descr->set_args &
                                                 IW_PRIV_SIZE_MASK))
                                return -E2BIG;
-               } else {
-                       /* Check NULL pointer */
-                       if (iwr->u.data.pointer == NULL)
-                               return -EFAULT;
-               }
-
-#ifdef WE_IOCTL_DEBUG
-               printk(KERN_DEBUG "%s (WE) : Malloc %d bytes\n",
-                      dev->name, extra_size);
-#endif /* WE_IOCTL_DEBUG */
+               } else if (iwr->u.data.pointer == NULL)
+                       return -EFAULT;
 
                /* Always allocate for max space. Easier, and won't last
                 * long... */
                extra = kmalloc(extra_size, GFP_KERNEL);
-               if (extra == NULL) {
+               if (extra == NULL)
                        return -ENOMEM;
-               }
 
                /* If it is a SET, get all the extra data in here */
                if (IW_IS_SET(cmd) && (iwr->u.data.length != 0)) {
@@ -1033,10 +972,6 @@ static inline int ioctl_private_call(struct net_device *  dev,
                                kfree(extra);
                                return -EFAULT;
                        }
-#ifdef WE_IOCTL_DEBUG
-                       printk(KERN_DEBUG "%s (WE) : Got %d elem\n",
-                              dev->name, iwr->u.data.length);
-#endif /* WE_IOCTL_DEBUG */
                }
 
                /* Call the handler */
@@ -1056,10 +991,6 @@ static inline int ioctl_private_call(struct net_device *  dev,
                                           extra_size);
                        if (err)
                                ret =  -EFAULT;
-#ifdef WE_IOCTL_DEBUG
-                       printk(KERN_DEBUG "%s (WE) : Wrote %d elem\n",
-                              dev->name, iwr->u.data.length);
-#endif /* WE_IOCTL_DEBUG */
                }
 
                /* Cleanup - I told you it wasn't that long ;-) */
@@ -1094,53 +1025,31 @@ static int wireless_process_ioctl(struct ifreq *ifr, unsigned int cmd)
        /* A bunch of special cases, then the generic case...
         * Note that 'cmd' is already filtered in dev_ioctl() with
         * (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) */
-       switch (cmd) {
-       case SIOCGIWSTATS:
-               /* Get Wireless Stats */
-               return ioctl_standard_call(dev,
-                                          ifr,
-                                          cmd,
+       if (cmd == SIOCGIWSTATS)
+               return ioctl_standard_call(dev, ifr, cmd,
                                           &iw_handler_get_iwstats);
 
-       case SIOCGIWPRIV:
-               /* Check if we have some wireless handlers defined */
-               if (dev->wireless_handlers != NULL) {
-                       /* We export to user space the definition of
-                        * the private handler ourselves */
-                       return ioctl_standard_call(dev,
-                                                  ifr,
-                                                  cmd,
-                                                  &iw_handler_get_private);
-               }
-               // ## Fall-through for old API ##
-       default:
-               /* Generic IOCTL */
-               /* Basic check */
-               if (!netif_device_present(dev))
-                       return -ENODEV;
-               /* New driver API : try to find the handler */
-               handler = get_handler(dev, cmd);
-               if (handler != NULL) {
-                       /* Standard and private are not the same */
-                       if (cmd < SIOCIWFIRSTPRIV)
-                               return ioctl_standard_call(dev,
-                                                          ifr,
-                                                          cmd,
-                                                          handler);
-                       else
-                               return ioctl_private_call(dev,
-                                                         ifr,
-                                                         cmd,
-                                                         handler);
-               }
-               /* Old driver API : call driver ioctl handler */
-               if (dev->do_ioctl) {
-                       return dev->do_ioctl(dev, ifr, cmd);
-               }
-               return -EOPNOTSUPP;
+       if (cmd == SIOCGIWPRIV && dev->wireless_handlers)
+               return ioctl_standard_call(dev, ifr, cmd,
+                                          &iw_handler_get_private);
+
+       /* Basic check */
+       if (!netif_device_present(dev))
+               return -ENODEV;
+
+       /* New driver API : try to find the handler */
+       handler = get_handler(dev, cmd);
+       if (handler) {
+               /* Standard and private are not the same */
+               if (cmd < SIOCIWFIRSTPRIV)
+                       return ioctl_standard_call(dev, ifr, cmd, handler);
+               else
+                       return ioctl_private_call(dev, ifr, cmd, handler);
        }
-       /* Not reached */
-       return -EINVAL;
+       /* Old driver API : call driver ioctl handler */
+       if (dev->do_ioctl)
+               return dev->do_ioctl(dev, ifr, cmd);
+       return -EOPNOTSUPP;
 }
 
 /* entry point from dev ioctl */
@@ -1152,9 +1061,10 @@ int wext_handle_ioctl(struct ifreq *ifr, unsigned int cmd,
        /* If command is `set a parameter', or
         * `get the encoding parameters', check if
         * the user has the right to do it */
-       if (IW_IS_SET(cmd) || cmd == SIOCGIWENCODE || cmd == SIOCGIWENCODEEXT)
-               if (!capable(CAP_NET_ADMIN))
-                       return -EPERM;
+       if ((IW_IS_SET(cmd) || cmd == SIOCGIWENCODE || cmd == SIOCGIWENCODEEXT)
+           && !capable(CAP_NET_ADMIN))
+               return -EPERM;
+
        dev_load(ifr->ifr_name);
        rtnl_lock();
        ret = wireless_process_ioctl(ifr, cmd);
@@ -1170,7 +1080,6 @@ int wext_handle_ioctl(struct ifreq *ifr, unsigned int cmd,
  * Most often, the event will be propagated through rtnetlink
  */
 
-#ifdef WE_EVENT_RTNETLINK
 /* ---------------------------------------------------------------- */
 /*
  * Locking...
@@ -1215,11 +1124,8 @@ static DECLARE_TASKLET(wireless_nlevent_tasklet, wireless_nlevent_process, 0);
  * current wireless config. Dumping the wireless config is far too
  * expensive (for each parameter, the driver need to query the hardware).
  */
-static inline int rtnetlink_fill_iwinfo(struct sk_buff *       skb,
-                                       struct net_device *     dev,
-                                       int                     type,
-                                       char *                  event,
-                                       int                     event_len)
+static int rtnetlink_fill_iwinfo(struct sk_buff *skb, struct net_device *dev,
+                                int type, char *event, int event_len)
 {
        struct ifinfomsg *r;
        struct nlmsghdr  *nlh;
@@ -1253,9 +1159,7 @@ rtattr_failure:
  * Andrzej Krzysztofowicz mandated that I used a IFLA_XXX field
  * within a RTM_NEWLINK event.
  */
-static inline void rtmsg_iwinfo(struct net_device *    dev,
-                               char *                  event,
-                               int                     event_len)
+static void rtmsg_iwinfo(struct net_device *dev, char *event, int event_len)
 {
        struct sk_buff *skb;
        int size = NLMSG_GOODSIZE;
@@ -1274,8 +1178,6 @@ static inline void rtmsg_iwinfo(struct net_device *       dev,
        tasklet_schedule(&wireless_nlevent_tasklet);
 }
 
-#endif /* WE_EVENT_RTNETLINK */
-
 /* ---------------------------------------------------------------- */
 /*
  * Main event dispatcher. Called from other parts and drivers.
@@ -1319,11 +1221,6 @@ void wireless_send_event(struct net_device *     dev,
                       dev->name, cmd);
                return;
        }
-#ifdef WE_EVENT_DEBUG
-       printk(KERN_DEBUG "%s (WE) : Got event 0x%04X\n",
-              dev->name, cmd);
-       printk(KERN_DEBUG "%s (WE) : Header type : %d, Token type : %d, size : %d, token : %d\n", dev->name, descr->header_type, descr->token_type, descr->token_size, descr->max_tokens);
-#endif /* WE_EVENT_DEBUG */
 
        /* Check extra parameters and set extra_len */
        if (descr->header_type == IW_HEADER_TYPE_POINT) {
@@ -1341,19 +1238,12 @@ void wireless_send_event(struct net_device *    dev,
                        extra_len = wrqu->data.length * descr->token_size;
                /* Always at an offset in wrqu */
                wrqu_off = IW_EV_POINT_OFF;
-#ifdef WE_EVENT_DEBUG
-               printk(KERN_DEBUG "%s (WE) : Event 0x%04X, tokens %d, extra_len %d\n", dev->name, cmd, wrqu->data.length, extra_len);
-#endif /* WE_EVENT_DEBUG */
        }
 
        /* Total length of the event */
        hdr_len = event_type_size[descr->header_type];
        event_len = hdr_len + extra_len;
 
-#ifdef WE_EVENT_DEBUG
-       printk(KERN_DEBUG "%s (WE) : Event 0x%04X, hdr_len %d, wrqu_off %d, event_len %d\n", dev->name, cmd, hdr_len, wrqu_off, event_len);
-#endif /* WE_EVENT_DEBUG */
-
        /* Create temporary buffer to hold the event */
        event = kmalloc(event_len, GFP_ATOMIC);
        if (event == NULL)
@@ -1363,19 +1253,18 @@ void wireless_send_event(struct net_device *    dev,
        event->len = event_len;
        event->cmd = cmd;
        memcpy(&event->u, ((char *) wrqu) + wrqu_off, hdr_len - IW_EV_LCP_LEN);
-       if (extra != NULL)
+       if (extra)
                memcpy(((char *) event) + hdr_len, extra, extra_len);
 
-#ifdef WE_EVENT_RTNETLINK
        /* Send via the RtNetlink event channel */
        rtmsg_iwinfo(dev, (char *) event, event_len);
-#endif /* WE_EVENT_RTNETLINK */
 
        /* Cleanup */
        kfree(event);
 
        return;         /* Always success, I guess ;-) */
 }
+EXPORT_SYMBOL(wireless_send_event);
 
 /********************** ENHANCED IWSPY SUPPORT **********************/
 /*
@@ -1395,11 +1284,11 @@ void wireless_send_event(struct net_device *    dev,
  * Because this is called on the Rx path via wireless_spy_update(),
  * we want it to be efficient...
  */
-static inline struct iw_spy_data * get_spydata(struct net_device *dev)
+static inline struct iw_spy_data *get_spydata(struct net_device *dev)
 {
        /* This is the new way */
        if (dev->wireless_data)
-               return(dev->wireless_data->spy_data);
+               return dev->wireless_data->spy_data;
        return NULL;
 }
 
@@ -1443,19 +1332,6 @@ int iw_handler_set_spy(struct net_device *       dev,
                /* Reset stats */
                memset(spydata->spy_stat, 0,
                       sizeof(struct iw_quality) * IW_MAX_SPY);
-
-#ifdef WE_SPY_DEBUG
-               printk(KERN_DEBUG "iw_handler_set_spy() :  wireless_data %p, spydata %p, num %d\n", dev->wireless_data, spydata, wrqu->data.length);
-               for (i = 0; i < wrqu->data.length; i++)
-                       printk(KERN_DEBUG
-                              "%02X:%02X:%02X:%02X:%02X:%02X \n",
-                              spydata->spy_address[i][0],
-                              spydata->spy_address[i][1],
-                              spydata->spy_address[i][2],
-                              spydata->spy_address[i][3],
-                              spydata->spy_address[i][4],
-                              spydata->spy_address[i][5]);
-#endif /* WE_SPY_DEBUG */
        }
 
        /* Make sure above is updated before re-enabling */
@@ -1466,6 +1342,7 @@ int iw_handler_set_spy(struct net_device *        dev,
 
        return 0;
 }
+EXPORT_SYMBOL(iw_handler_set_spy);
 
 /*------------------------------------------------------------------*/
 /*
@@ -1501,6 +1378,7 @@ int iw_handler_get_spy(struct net_device *        dev,
                spydata->spy_stat[i].updated &= ~IW_QUAL_ALL_UPDATED;
        return 0;
 }
+EXPORT_SYMBOL(iw_handler_get_spy);
 
 /*------------------------------------------------------------------*/
 /*
@@ -1525,12 +1403,9 @@ int iw_handler_set_thrspy(struct net_device *    dev,
        /* Clear flag */
        memset(spydata->spy_thr_under, '\0', sizeof(spydata->spy_thr_under));
 
-#ifdef WE_SPY_DEBUG
-       printk(KERN_DEBUG "iw_handler_set_thrspy() :  low %d ; high %d\n", spydata->spy_thr_low.level, spydata->spy_thr_high.level);
-#endif /* WE_SPY_DEBUG */
-
        return 0;
 }
+EXPORT_SYMBOL(iw_handler_set_thrspy);
 
 /*------------------------------------------------------------------*/
 /*
@@ -1554,6 +1429,7 @@ int iw_handler_get_thrspy(struct net_device *     dev,
 
        return 0;
 }
+EXPORT_SYMBOL(iw_handler_get_thrspy);
 
 /*------------------------------------------------------------------*/
 /*
@@ -1579,16 +1455,6 @@ static void iw_send_thrspy_event(struct net_device *     dev,
        memcpy(&(threshold.low), &(spydata->spy_thr_low),
               2 * sizeof(struct iw_quality));
 
-#ifdef WE_SPY_DEBUG
-       printk(KERN_DEBUG "iw_send_thrspy_event() : address %02X:%02X:%02X:%02X:%02X:%02X, level %d, up = %d\n",
-              threshold.addr.sa_data[0],
-              threshold.addr.sa_data[1],
-              threshold.addr.sa_data[2],
-              threshold.addr.sa_data[3],
-              threshold.addr.sa_data[4],
-              threshold.addr.sa_data[5], threshold.qual.level);
-#endif /* WE_SPY_DEBUG */
-
        /* Send event to user space */
        wireless_send_event(dev, SIOCGIWTHRSPY, &wrqu, (char *) &threshold);
 }
@@ -1612,10 +1478,6 @@ void wireless_spy_update(struct net_device *     dev,
        if (!spydata)
                return;
 
-#ifdef WE_SPY_DEBUG
-       printk(KERN_DEBUG "wireless_spy_update() :  wireless_data %p, spydata %p, address %02X:%02X:%02X:%02X:%02X:%02X\n", dev->wireless_data, spydata, address[0], address[1], address[2], address[3], address[4], address[5]);
-#endif /* WE_SPY_DEBUG */
-
        /* Update all records that match */
        for (i = 0; i < spydata->spy_number; i++)
                if (!compare_ether_addr(address, spydata->spy_address[i])) {
@@ -1644,10 +1506,4 @@ void wireless_spy_update(struct net_device *     dev,
                }
        }
 }
-
-EXPORT_SYMBOL(iw_handler_get_spy);
-EXPORT_SYMBOL(iw_handler_get_thrspy);
-EXPORT_SYMBOL(iw_handler_set_spy);
-EXPORT_SYMBOL(iw_handler_set_thrspy);
-EXPORT_SYMBOL(wireless_send_event);
 EXPORT_SYMBOL(wireless_spy_update);