Merge branch 'for_linus' of master.kernel.org:/pub/scm/linux/kernel/git/galak/powerpc...
authorJeff Garzik <jeff@garzik.org>
Mon, 2 Jul 2007 12:15:33 +0000 (08:15 -0400)
committerJeff Garzik <jeff@garzik.org>
Mon, 2 Jul 2007 12:15:33 +0000 (08:15 -0400)
31 files changed:
Makefile
arch/arm/mach-at91/pm.c
arch/i386/kernel/cpu/mtrr/generic.c
arch/powerpc/kernel/vdso64/gettimeofday.S
arch/sparc64/kernel/irq.c
drivers/acpi/asus_acpi.c
drivers/misc/blink.c
drivers/net/irda/irport.c
drivers/net/irda/smsc-ircc2.c
drivers/net/wireless/libertas/Makefile
drivers/net/wireless/libertas/README
drivers/net/wireless/libertas/assoc.c
drivers/net/wireless/libertas/cmd.c
drivers/net/wireless/libertas/cmdresp.c
drivers/net/wireless/libertas/hostcmd.h
drivers/net/wireless/libertas/ioctl.c [deleted file]
drivers/net/wireless/libertas/main.c
drivers/net/wireless/libertas/scan.c
drivers/net/wireless/libertas/wext.c
drivers/net/wireless/libertas/wext.h
include/asm-frv/pgtable.h
include/asm-sparc64/mdesc.h
include/asm-sparc64/tlb.h
include/linux/pci.h
include/linux/pm.h
kernel/power/main.c
mm/slab.c
net/core/netpoll.c
net/sctp/socket.c
sound/drivers/mts64.c
sound/oss/sb_card.c

index 8a3c271..c6f7b71 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 22
-EXTRAVERSION = -rc6
+EXTRAVERSION = -rc7
 NAME = Holy Dancing Manatees, Batman!
 
 # *DOCUMENTATION*
index 47ff676..ddf9184 100644 (file)
@@ -53,7 +53,7 @@ static suspend_state_t target_state;
 /*
  * Called after processes are frozen, but before we shutdown devices.
  */
-static int at91_pm_prepare(suspend_state_t state)
+static int at91_pm_set_target(suspend_state_t state)
 {
        target_state = state;
        return 0;
@@ -201,7 +201,7 @@ error:
 
 static struct pm_ops at91_pm_ops ={
        .valid          = at91_pm_valid_state,
-       .prepare        = at91_pm_prepare,
+       .set_target     = at91_pm_set_target,
        .enter          = at91_pm_enter,
 };
 
index 6d59378..f6e4694 100644 (file)
@@ -65,7 +65,8 @@ get_fixed_ranges(mtrr_type * frs)
 
 void mtrr_save_fixed_ranges(void *info)
 {
-       get_fixed_ranges(mtrr_state.fixed_ranges);
+       if (cpu_has_mtrr)
+               get_fixed_ranges(mtrr_state.fixed_ranges);
 }
 
 static void print_fixed(unsigned base, unsigned step, const mtrr_type*types)
@@ -469,11 +470,6 @@ int generic_validate_add_page(unsigned long base, unsigned long size, unsigned i
                }
        }
 
-       if (base < 0x100) {
-               printk(KERN_WARNING "mtrr: cannot set region below 1 MiB (0x%lx000,0x%lx000)\n",
-                      base, size);
-               return -EINVAL;
-       }
        /*  Check upper bits of base and last are equal and lower bits are 0
            for base and 1 for last  */
        last = base + size - 1;
index 2d7a510..c6401f9 100644 (file)
@@ -31,7 +31,7 @@ V_FUNCTION_BEGIN(__kernel_gettimeofday)
        mr      r11,r3                  /* r11 holds tv */
        mr      r10,r4                  /* r10 holds tz */
        bl      V_LOCAL_FUNC(__get_datapage)    /* get data page */
-       cmpldi  r10,0                   /* check if tv is NULL */
+       cmpldi  r11,0                   /* check if tv is NULL */
        beq     2f
        bl      V_LOCAL_FUNC(__do_get_xsec)     /* get xsec from tb & kernel */
        lis     r7,15                   /* r7 = 1000000 = USEC_PER_SEC */
index e60d283..6b6165d 100644 (file)
@@ -329,6 +329,10 @@ static void sun4v_irq_enable(unsigned int virt_irq)
                if (err != HV_EOK)
                        printk("sun4v_intr_settarget(%x,%lu): err(%d)\n",
                               ino, cpuid, err);
+               err = sun4v_intr_setstate(ino, HV_INTR_STATE_IDLE);
+               if (err != HV_EOK)
+                       printk("sun4v_intr_setstate(%x): "
+                              "err(%d)\n", ino, err);
                err = sun4v_intr_setenabled(ino, HV_INTR_ENABLED);
                if (err != HV_EOK)
                        printk("sun4v_intr_setenabled(%x): err(%d)\n",
@@ -400,6 +404,12 @@ static void sun4v_virq_enable(unsigned int virt_irq)
                               "err(%d)\n",
                               dev_handle, dev_ino, cpuid, err);
                err = sun4v_vintr_set_state(dev_handle, dev_ino,
+                                           HV_INTR_STATE_IDLE);
+               if (err != HV_EOK)
+                       printk("sun4v_vintr_set_state(%lx,%lx,"
+                               "HV_INTR_STATE_IDLE): err(%d)\n",
+                              dev_handle, dev_ino, err);
+               err = sun4v_vintr_set_valid(dev_handle, dev_ino,
                                            HV_INTR_ENABLED);
                if (err != HV_EOK)
                        printk("sun4v_vintr_set_state(%lx,%lx,"
@@ -420,7 +430,7 @@ static void sun4v_virq_disable(unsigned int virt_irq)
                dev_handle = ino & IMAP_IGN;
                dev_ino = ino & IMAP_INO;
 
-               err = sun4v_vintr_set_state(dev_handle, dev_ino,
+               err = sun4v_vintr_set_valid(dev_handle, dev_ino,
                                            HV_INTR_DISABLED);
                if (err != HV_EOK)
                        printk("sun4v_vintr_set_state(%lx,%lx,"
index 6d7d415..3cd79ca 100644 (file)
@@ -1398,7 +1398,7 @@ static int __init asus_acpi_init(void)
        if (!asus_hotk_found) {
                acpi_bus_unregister_driver(&asus_hotk_driver);
                remove_proc_entry(PROC_ASUS, acpi_root_dir);
-               return result;
+               return -ENODEV;
        }
 
        asus_backlight_device = backlight_device_register("asus",NULL,NULL,
@@ -1407,6 +1407,7 @@ static int __init asus_acpi_init(void)
                printk(KERN_ERR "Could not register asus backlight device\n");
                asus_backlight_device = NULL;
                asus_acpi_exit();
+               return -ENODEV;
        }
         asus_backlight_device->props.max_brightness = 15;
 
index 634431c..97f7253 100644 (file)
@@ -16,12 +16,30 @@ static void do_blink(unsigned long data)
        add_timer(&blink_timer);
 }
 
-static int blink_init(void)
+static int blink_panic_event(struct notifier_block *blk,
+                            unsigned long event, void *arg)
 {
-       printk(KERN_INFO "Enabling keyboard blinking\n");
        do_blink(0);
        return 0;
 }
 
+static struct notifier_block blink_notify = {
+       .notifier_call = blink_panic_event,
+};
+
+static __init int blink_init(void)
+{
+       printk(KERN_INFO "Enabling keyboard blinking\n");
+       atomic_notifier_chain_register(&panic_notifier_list, &blink_notify);
+       return 0;
+}
+
+static __exit void blink_remove(void)
+{
+       del_timer_sync(&blink_timer);
+       atomic_notifier_chain_unregister(&panic_notifier_list, &blink_notify);
+}
+
 module_init(blink_init);
+module_exit(blink_remove);
 
index 3098960..3078c41 100644 (file)
@@ -509,7 +509,7 @@ static void irport_timeout(struct net_device *dev)
        IRDA_DEBUG(0, "%s(), iir=%02x, lsr=%02x, iobase=%#x\n", 
                   __FUNCTION__, iir, lsr, iobase);
 
-       IRDA_DEBUG(0, "%s(), transmitting=%d, remain=%d, done=%d\n", 
+       IRDA_DEBUG(0, "%s(), transmitting=%d, remain=%d, done=%td\n",
                   __FUNCTION__, self->transmitting, self->tx_buff.len,
                   self->tx_buff.data - self->tx_buff.head);
 
index 2803b37..36ab983 100644 (file)
@@ -79,7 +79,7 @@ MODULE_AUTHOR("Daniele Peri <peri@csai.unipa.it>");
 MODULE_DESCRIPTION("SMC IrCC SIR/FIR controller driver");
 MODULE_LICENSE("GPL");
 
-static int smsc_nopnp;
+static int smsc_nopnp = 1;
 module_param_named(nopnp, smsc_nopnp, bool, 0);
 MODULE_PARM_DESC(nopnp, "Do not use PNP to detect controller settings");
 
index a1097f5..32ed413 100644 (file)
@@ -2,7 +2,7 @@ libertas-objs := main.o fw.o wext.o \
                rx.o tx.o cmd.o           \
                cmdresp.o scan.o          \
                join.o 11d.o              \
-               ioctl.o debugfs.o         \
+               debugfs.o         \
                ethtool.o assoc.o
 
 usb8xxx-objs += if_bootcmd.o
index 1f92f50..0b133ce 100644 (file)
@@ -28,281 +28,6 @@ DRIVER LOADING
 
                insmod usb8388.ko [fw_name=usb8388.bin]
 
-=====================
-IWPRIV COMMAND
-=====================
-
-NAME
-       This manual describes the usage of private commands used in Marvell WLAN
-       Linux Driver. All the commands available in Wlanconfig will not be available
-       in the iwpriv.
-
-SYNOPSIS
-       iwpriv <ethX> <command> [sub-command] ...
-
-       iwpriv ethX setregioncode <n>
-       iwpriv ethX getregioncode
-
-Version 5 Command:
-       iwpriv ethX ledgpio <n>
-
-BT Commands:
-       The blinding table (BT) contains a list of mac addresses that will be,
-       by default, ignored by the firmware. It is also possible to invert this
-       behavior so that we will ignore all traffic except for the portion
-       coming from mac addresess in the list. It is primarily used for
-       debugging and testing networks.  It can be edited and inspected with
-       the following commands:
-
-       iwpriv ethX bt_reset
-       iwpriv ethX bt_add <mac_address>
-       iwpriv ethX bt_del <mac_address>
-       iwpriv ethX bt_list <id>
-       iwpriv ethX bt_get_invert <n>
-       iwpriv ethX bt_set_invert <n>
-
-FWT Commands:
-       The forwarding table (FWT) is a feature used to manage mesh network
-       routing in the firmware.  The FWT is essentially a routing table that
-       associates a destination mac address (da) with a next hop receiver
-       address (ra).  The FWT can be inspected and edited with the following
-       iwpriv commands, which are described in greater detail below.
-       Eventually, the table will be automatically maintained by a custom
-       routing protocol.
-
-       NOTE: FWT commands replace the previous DFT commands.  What were the DFT
-       commands?, you might ask.  They were an earlier API to the firmware that
-       implemented a simple MAC-layer forwarding mechanism.  In the unlikely
-       event that you were using these commands, you must migrate to the new
-       FWT commands which can be used to achieve the same functionality.
-
-       iwpriv ethX fwt_add [parameters]
-       iwpriv ethX fwt_del [parameters]
-       iwpriv ethX fwt_lookup [parameters]
-       iwpriv ethX fwt_list [parameters]
-       iwpriv ethX fwt_list_route [parameters]
-       iwpriv ethX fwt_list_neigh [parameters]
-       iwpriv ethX fwt_reset [parameters]
-       iwpriv ethX fwt_cleanup
-       iwpriv ethX fwt_time
-
-MESH Commands:
-
-       The MESH commands are used to configure various features of the mesh
-       routing protocol.  The following commands are supported:
-
-       iwpriv ethX mesh_get_ttl
-       iwpriv ethX mesh_set_ttl ttl
-
-DESCRIPTION
-       Those commands are used to send additional commands to the Marvell WLAN
-       card via the Linux device driver.
-
-       The ethX parameter specifies the network device that is to be used to
-               perform this command on. it could be eth0, eth1 etc.
-
-setregioncode
-       This command is used to set the region code in the station.
-       where value is 'region code' for various regions like
-       USA FCC, Canada IC, Spain, France, Europe ETSI, Japan ...
-
-       Usage:
-               iwpriv ethX setregioncode 0x10: set region code to USA (0x10).
-
-getregioncode
-       This command is used to get the region code information set in the
-       station.
-
-ledgpio
-       This command is used to set/get LEDs.
-
-       iwpriv ethX ledgpio <LEDs>
-               will set the corresponding LED for the GPIO Line.
-
-       iwpriv ethX ledgpio
-               will give u which LEDs are Enabled.
-
-       Usage:
-               iwpriv eth1 ledgpio 1 0 2 1 3 4
-                       will enable
-                       LED 1 -> GPIO 0
-                       LED 2 -> GPIO 1
-                       LED 3 -> GPIO 4
-
-               iwpriv eth1 ledgpio
-                       shows LED information in the format as mentioned above.
-
-       Note: LED0 is invalid
-       Note: Maximum Number of LEDs are 16.
-
-fwt_add
-       This command is used to insert an entry into the FWT table. The list of
-       parameters must follow the following structure:
-
-       iwpriv ethX fwt_add da ra [metric dir rate ssn dsn hopcount ttl expiration sleepmode snr]
-
-       The parameters between brackets are optional, but they must appear in
-       the order specified.  For example, if you want to specify the metric,
-       you must also specify the dir, ssn, and dsn but you need not specify the
-       hopcount, expiration, sleepmode, or snr.  Any unspecified parameters
-       will be assigned the defaults specified below.
-
-       The different parameters are:-
-               da              -- DA MAC address in the form 00:11:22:33:44:55
-               ra              -- RA MAC address in the form 00:11:22:33:44:55
-               metric          -- route metric (cost: smaller-metric routes are
-                                  preferred, default is 0)
-               dir             -- direction (1 for direct, 0 for reverse,
-                                  default is 1)
-               rate            -- data rate used for transmission to the RA,
-                                  as specified for the rateadapt command,
-                                  default is 3 (11Mbps)
-               ssn             -- Source Sequence Number (time at the RA for
-                                  reverse routes.  Default is 0)
-               dsn             -- Destination Sequence Number (time at the DA
-                                  for direct routes.  Default is 0)
-               hopcount        -- hop count (currently unused, default is 0)
-               ttl             -- TTL (Only used in reverse entries)
-               expiration      -- entry expiration (in ticks, where a tick is
-                                  1024us, or ~ 1ms. Use 0 for an indefinite
-                                  entry, default is 0)
-               sleepmode       -- RA's sleep mode (currently unused, default is
-                                  0)
-               snr             -- SNR in the link to RA (currently unused,
-                                  default is 0)
-
-       The command does not return anything.
-
-fwt_del
-       This command is used to remove an entry to the FWT table. The list of
-       parameters must follow the following structure:
-
-               iwpriv ethX fwt_del da ra [dir]
-
-       where the different parameters are:-
-               da              -- DA MAC address (in the form "00:11:22:33:44:55")
-               ra              -- RA MAC address (in the form "00:11:22:33:44:55")
-               dir             -- direction (1 for direct, 0 for reverse,
-                                  default is 1)
-
-       The command does not return anything.
-
-fwt_lookup
-       This command is used to get the best route in the FWT table to a given
-       host. The only parameter is the MAC address of the host that is being
-       looked for.
-
-               iwpriv ethX fwt_lookup da
-
-       where:-
-               da              -- DA MAC address (in the form "00:11:22:33:44:55")
-
-       The command returns an output string identical to the one returned by
-       fwt_list described below.
-
-
-fwt_list
-       This command is used to list a route from the FWT table. The only
-       parameter is the index into the table. If you want to list all the
-       routes in a table, start with index=0, and keep listing until you get a
-       "(null)" string.  Note that the indicies may change as the fwt is
-       updated.  It is expected that most users will not use fwt_list directly,
-       but that a utility similar to the traditional route command will be used
-       to invoke fwt_list over and over.
-
-               iwpriv ethX fwt_list index
-
-       The output is a string of the following form:
-
-               da ra valid metric dir rate ssn dsn hopcount ttl expiration
-               sleepmode snr precursor
-
-       where the different fields are:-
-               da              -- DA MAC address (in the form "00:11:22:33:44:55")
-               ra              -- RA MAC address (in the form "00:11:22:33:44:55")
-               valid           -- whether the route is valid (0 if not valid)
-               metric          -- route metric (cost: smaller-metric routes are preferred)
-               dir             -- direction (1 for direct, 0 for reverse)
-               rate            -- data rate used for transmission to the RA,
-                                  as specified for the rateadapt command
-               ssn             -- Source Sequence Number (time at the RA for reverse routes)
-               dsn             -- Destination Sequence Number (time at the DA for direct routes)
-               hopcount        -- hop count (currently unused)
-               ttl             -- TTL (only used in reverse entries)
-               expiration      -- entry expiration (in ticks, where a tick is 1024us, or ~ 1ms. Use 0 for an indefinite entry)
-               sleepmode       -- RA's sleep mode (currently unused)
-               snr             -- SNR in the link to RA (currently unused)
-               precursor       -- predecessor in direct routes
-
-fwt_list_route
-       This command is equivalent to fwt_list.
-
-fwt_list_neigh
-       This command is used to list a neighbor from the FWT table. The only
-       parameter is the neighbor ID. If you want to list all the neighbors in a
-       table, start with nid=0, and keep incrementing nid until you get a
-       "(null)" string.  Note that the nid from a fwt_list_route command can be
-       used as an input to this command.  Also note that this command is meant
-       mostly for debugging.  It is expected that users will use fwt_lookup.
-       One important reason for this is that the neighbor id may change as the
-       neighbor table is altered.
-
-               iwpriv ethX fwt_list_neigh nid
-
-       The output is a string of the following form:
-
-               ra sleepmode snr references
-
-       where the different fields are:-
-               ra              -- RA MAC address (in the form "00:11:22:33:44:55")
-               sleepmode       -- RA's sleep mode (currently unused)
-               snr             -- SNR in the link to RA (currently unused)
-               references      -- RA's reference counter
-
-fwt_reset
-       This command is used to reset the FWT table, getting rid of all the
-       entries. There are no input parameters.
-
-               iwpriv ethX fwt_reset
-
-       The command does not return anything.
-
-fwt_cleanup
-       This command is used to perform user-based garbage recollection. The
-       FWT table is checked, and all the entries that are expired or invalid
-       are cleaned. Note that this is exported to the driver for debugging
-       purposes, as garbage collection is also fired by the firmware when in
-       space problems. There are no input parameters.
-
-               iwpriv ethX fwt_cleanup
-
-       The command does returns the number of invalid/expired routes deleted.
-
-fwt_time
-       This command returns a card's internal time representation.  It is this
-       time that is used to represent the expiration times of FWT entries.  The
-       number is not consistent from card to card; it is simply a timer count.
-       The fwt_time command is used to inspect the timer so that expiration
-       times reported by fwt_list can be properly interpreted.
-
-               iwpriv ethX fwt_time
-
-mesh_get_ttl
-
-       The mesh ttl is the number of hops a mesh packet can traverse before it
-       is dropped.  This parameter is used to prevent infinite loops in the
-       mesh network.  The value returned by this function is the ttl assigned
-       to all mesh packets.  Currently there is no way to control the ttl on a
-       per packet or per socket basis.
-
-       iwpriv ethX mesh_get_ttl
-
-mesh_set_ttl ttl
-
-       Set the ttl.  The argument must be between 0 and 255.
-
-       iwpriv ethX mesh_set_ttl <ttl>
-
 =========================
 ETHTOOL
 =========================
index f67efa0..afd5617 100644 (file)
@@ -323,6 +323,8 @@ static int assoc_helper_secinfo(wlan_private *priv,
 {
        wlan_adapter *adapter = priv->adapter;
        int ret = 0;
+       u32 do_wpa;
+       u32 rsn = 0;
 
        lbs_deb_enter(LBS_DEB_ASSOC);
 
@@ -333,12 +335,34 @@ static int assoc_helper_secinfo(wlan_private *priv,
        if (ret)
                goto out;
 
-       /* enable/disable RSN */
+       /* If RSN is already enabled, don't try to enable it again, since
+        * ENABLE_RSN resets internal state machines and will clobber the
+        * 4-way WPA handshake.
+        */
+
+       /* Get RSN enabled/disabled */
        ret = libertas_prepare_and_send_command(priv,
                                    cmd_802_11_enable_rsn,
                                    cmd_act_set,
                                    cmd_option_waitforrsp,
-                                   0, assoc_req);
+                                   0, &rsn);
+       if (ret) {
+               lbs_deb_assoc("Failed to get RSN status: %d", ret);
+               goto out;
+       }
+
+       /* Don't re-enable RSN if it's already enabled */
+       do_wpa = (assoc_req->secinfo.WPAenabled || assoc_req->secinfo.WPA2enabled);
+       if (do_wpa == rsn)
+               goto out;
+
+       /* Set RSN enabled/disabled */
+       rsn = do_wpa;
+       ret = libertas_prepare_and_send_command(priv,
+                                   cmd_802_11_enable_rsn,
+                                   cmd_act_set,
+                                   cmd_option_waitforrsp,
+                                   0, &rsn);
 
 out:
        lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret);
index 124e029..13f6528 100644 (file)
@@ -228,17 +228,19 @@ static int wlan_cmd_802_11_enable_rsn(wlan_private * priv,
                                      void * pdata_buf)
 {
        struct cmd_ds_802_11_enable_rsn *penableRSN = &cmd->params.enbrsn;
-       struct assoc_request * assoc_req = pdata_buf;
+       u32 * enable = pdata_buf;
 
        lbs_deb_enter(LBS_DEB_CMD);
 
        cmd->command = cpu_to_le16(cmd_802_11_enable_rsn);
        cmd->size = cpu_to_le16(sizeof(*penableRSN) + S_DS_GEN);
        penableRSN->action = cpu_to_le16(cmd_action);
-       if (assoc_req->secinfo.WPAenabled || assoc_req->secinfo.WPA2enabled) {
-               penableRSN->enable = cpu_to_le16(cmd_enable_rsn);
-       } else {
-               penableRSN->enable = cpu_to_le16(cmd_disable_rsn);
+
+       if (cmd_action == cmd_act_set) {
+               if (*enable)
+                       penableRSN->enable = cpu_to_le16(cmd_enable_rsn);
+               else
+                       penableRSN->enable = cpu_to_le16(cmd_enable_rsn);
        }
 
        lbs_deb_leave(LBS_DEB_CMD);
index 0c3b9a5..6ac0d47 100644 (file)
@@ -537,6 +537,24 @@ static int wlan_ret_get_log(wlan_private * priv,
        return 0;
 }
 
+static int libertas_ret_802_11_enable_rsn(wlan_private * priv,
+                                          struct cmd_ds_command *resp)
+{
+       struct cmd_ds_802_11_enable_rsn *enable_rsn = &resp->params.enbrsn;
+       wlan_adapter *adapter = priv->adapter;
+       u32 * pdata_buf = adapter->cur_cmd->pdata_buf;
+
+       lbs_deb_enter(LBS_DEB_CMD);
+
+       if (enable_rsn->action == cpu_to_le16(cmd_act_get)) {
+               if (pdata_buf)
+                       *pdata_buf = (u32) le16_to_cpu(enable_rsn->enable);
+       }
+
+       lbs_deb_enter(LBS_DEB_CMD);
+       return 0;
+}
+
 static inline int handle_cmd_response(u16 respcmd,
                                      struct cmd_ds_command *resp,
                                      wlan_private *priv)
@@ -610,7 +628,10 @@ static inline int handle_cmd_response(u16 respcmd,
        case cmd_ret_802_11_authenticate:
        case cmd_ret_802_11_radio_control:
        case cmd_ret_802_11_beacon_stop:
+               break;
+
        case cmd_ret_802_11_enable_rsn:
+               ret = libertas_ret_802_11_enable_rsn(priv, resp);
                break;
 
        case cmd_ret_802_11_data_rate:
index 3acf939..09b898f 100644 (file)
@@ -503,7 +503,7 @@ struct cmd_ds_802_11_ad_hoc_join {
 struct cmd_ds_802_11_enable_rsn {
        __le16 action;
        __le16 enable;
-};
+} __attribute__ ((packed));
 
 struct MrvlIEtype_keyParamSet {
        /* type ID */
diff --git a/drivers/net/wireless/libertas/ioctl.c b/drivers/net/wireless/libertas/ioctl.c
deleted file mode 100644 (file)
index f410815..0000000
+++ /dev/null
@@ -1,1081 +0,0 @@
-/**
-  * This file contains ioctl functions
-  */
-
-#include <linux/ctype.h>
-#include <linux/delay.h>
-#include <linux/if.h>
-#include <linux/if_arp.h>
-#include <linux/wireless.h>
-
-#include <net/iw_handler.h>
-#include <net/ieee80211.h>
-
-#include "host.h"
-#include "radiotap.h"
-#include "decl.h"
-#include "defs.h"
-#include "dev.h"
-#include "join.h"
-#include "wext.h"
-
-#define MAX_SCAN_CELL_SIZE      (IW_EV_ADDR_LEN + \
-                               IW_ESSID_MAX_SIZE + \
-                               IW_EV_UINT_LEN + IW_EV_FREQ_LEN + \
-                               IW_EV_QUAL_LEN + IW_ESSID_MAX_SIZE + \
-                               IW_EV_PARAM_LEN + 40)   /* 40 for WPAIE */
-
-#define WAIT_FOR_SCAN_RRESULT_MAX_TIME (10 * HZ)
-
-static int wlan_set_region(wlan_private * priv, u16 region_code)
-{
-       int i;
-       int ret = 0;
-
-       for (i = 0; i < MRVDRV_MAX_REGION_CODE; i++) {
-               // use the region code to search for the index
-               if (region_code == libertas_region_code_to_index[i]) {
-                       priv->adapter->regiontableindex = (u16) i;
-                       priv->adapter->regioncode = region_code;
-                       break;
-               }
-       }
-
-       // if it's unidentified region code
-       if (i >= MRVDRV_MAX_REGION_CODE) {
-               lbs_deb_ioctl("region Code not identified\n");
-               ret = -1;
-               goto done;
-       }
-
-       if (libertas_set_regiontable(priv, priv->adapter->regioncode, 0)) {
-               ret = -EINVAL;
-       }
-
-done:
-       lbs_deb_leave_args(LBS_DEB_IOCTL, "ret %d", ret);
-       return ret;
-}
-
-static inline int hex2int(char c)
-{
-       if (c >= '0' && c <= '9')
-               return (c - '0');
-       if (c >= 'a' && c <= 'f')
-               return (c - 'a' + 10);
-       if (c >= 'A' && c <= 'F')
-               return (c - 'A' + 10);
-       return -1;
-}
-
-/* Convert a string representation of a MAC address ("xx:xx:xx:xx:xx:xx")
-   into binary format (6 bytes).
-
-   This function expects that each byte is represented with 2 characters
-   (e.g., 11:2:11:11:11:11 is invalid)
-
- */
-static char *eth_str2addr(char *ethstr, u8 * addr)
-{
-       int i, val, val2;
-       char *pos = ethstr;
-
-       /* get rid of initial blanks */
-       while (*pos == ' ' || *pos == '\t')
-               ++pos;
-
-       for (i = 0; i < 6; i++) {
-               val = hex2int(*pos++);
-               if (val < 0)
-                       return NULL;
-               val2 = hex2int(*pos++);
-               if (val2 < 0)
-                       return NULL;
-               addr[i] = (val * 16 + val2) & 0xff;
-
-               if (i < 5 && *pos++ != ':')
-                       return NULL;
-       }
-       return pos;
-}
-
-/* this writes xx:xx:xx:xx:xx:xx into ethstr
-   (ethstr must have space for 18 chars) */
-static int eth_addr2str(u8 * addr, char *ethstr)
-{
-       int i;
-       char *pos = ethstr;
-
-       for (i = 0; i < 6; i++) {
-               sprintf(pos, "%02x", addr[i] & 0xff);
-               pos += 2;
-               if (i < 5)
-                       *pos++ = ':';
-       }
-       return 17;
-}
-
-/**
- *  @brief          Add an entry to the BT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_bt_add_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       char ethaddrs_str[18];
-       char *pos;
-       u8 ethaddr[ETH_ALEN];
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(ethaddrs_str, wrq->u.data.pointer,
-                          sizeof(ethaddrs_str)))
-               return -EFAULT;
-
-       if ((pos = eth_str2addr(ethaddrs_str, ethaddr)) == NULL) {
-               lbs_pr_info("BT_ADD: Invalid MAC address\n");
-               return -EINVAL;
-       }
-
-       lbs_deb_ioctl("BT: adding %s\n", ethaddrs_str);
-       ret = libertas_prepare_and_send_command(priv, cmd_bt_access,
-                                     cmd_act_bt_access_add,
-                                     cmd_option_waitforrsp, 0, ethaddr);
-       lbs_deb_leave_args(LBS_DEB_IOCTL, "ret %d", ret);
-       return ret;
-}
-
-/**
- *  @brief          Delete an entry from the BT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_bt_del_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       char ethaddrs_str[18];
-       u8 ethaddr[ETH_ALEN];
-       char *pos;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(ethaddrs_str, wrq->u.data.pointer,
-                          sizeof(ethaddrs_str)))
-               return -EFAULT;
-
-       if ((pos = eth_str2addr(ethaddrs_str, ethaddr)) == NULL) {
-               lbs_pr_info("Invalid MAC address\n");
-               return -EINVAL;
-       }
-
-       lbs_deb_ioctl("BT: deleting %s\n", ethaddrs_str);
-
-       return (libertas_prepare_and_send_command(priv,
-                                     cmd_bt_access,
-                                     cmd_act_bt_access_del,
-                                     cmd_option_waitforrsp, 0, ethaddr));
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          Reset all entries from the BT table
- *  @param priv     A pointer to wlan_private structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_bt_reset_ioctl(wlan_private * priv)
-{
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       lbs_pr_alert( "BT: resetting\n");
-
-       return (libertas_prepare_and_send_command(priv,
-                                     cmd_bt_access,
-                                     cmd_act_bt_access_reset,
-                                     cmd_option_waitforrsp, 0, NULL));
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          List an entry from the BT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_bt_list_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       int pos;
-       char *addr1;
-       struct iwreq *wrq = (struct iwreq *)req;
-       /* used to pass id and store the bt entry returned by the FW */
-       union {
-               u32 id;
-               char addr1addr2[2 * ETH_ALEN];
-       } param;
-       static char outstr[64];
-       char *pbuf = outstr;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(outstr, wrq->u.data.pointer, sizeof(outstr))) {
-               lbs_deb_ioctl("Copy from user failed\n");
-               return -1;
-       }
-       param.id = simple_strtoul(outstr, NULL, 10);
-       pos = sprintf(pbuf, "%d: ", param.id);
-       pbuf += pos;
-
-       ret = libertas_prepare_and_send_command(priv, cmd_bt_access,
-                                   cmd_act_bt_access_list,
-                                   cmd_option_waitforrsp, 0,
-                                   (char *)&param);
-
-       if (ret == 0) {
-               addr1 = param.addr1addr2;
-
-               pos = sprintf(pbuf, "BT includes node ");
-               pbuf += pos;
-               pos = eth_addr2str(addr1, pbuf);
-               pbuf += pos;
-       } else {
-               sprintf(pbuf, "(null)");
-               pbuf += pos;
-       }
-
-       wrq->u.data.length = strlen(outstr);
-       if (copy_to_user(wrq->u.data.pointer, (char *)outstr,
-                        wrq->u.data.length)) {
-               lbs_deb_ioctl("BT_LIST: Copy to user failed!\n");
-               return -EFAULT;
-       }
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0 ;
-}
-
-/**
- *  @brief          Sets inverted state of blacklist (non-zero if inverted)
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_bt_set_invert_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       int ret;
-       struct iwreq *wrq = (struct iwreq *)req;
-       union {
-               u32 id;
-               char addr1addr2[2 * ETH_ALEN];
-       } param;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       param.id = SUBCMD_DATA(wrq) ;
-       ret = libertas_prepare_and_send_command(priv, cmd_bt_access,
-                                   cmd_act_bt_access_set_invert,
-                                   cmd_option_waitforrsp, 0,
-                                   (char *)&param);
-       if (ret != 0)
-               return -EFAULT;
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          Gets inverted state of blacklist (non-zero if inverted)
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_bt_get_invert_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       int ret;
-       union {
-               u32 id;
-               char addr1addr2[2 * ETH_ALEN];
-       } param;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       ret = libertas_prepare_and_send_command(priv, cmd_bt_access,
-                                   cmd_act_bt_access_get_invert,
-                                   cmd_option_waitforrsp, 0,
-                                   (char *)&param);
-
-       if (ret == 0)
-               wrq->u.param.value = le32_to_cpu(param.id);
-       else
-               return -EFAULT;
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          Find the next parameter in an input string
- *  @param ptr      A pointer to the input parameter string
- *  @return         A pointer to the next parameter, or 0 if no parameters left.
- */
-static char * next_param(char * ptr)
-{
-       if (!ptr) return NULL;
-       while (*ptr == ' ' || *ptr == '\t') ++ptr;
-       return (*ptr == '\0') ? NULL : ptr;
-}
-
-/**
- *  @brief          Add an entry to the FWT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_add_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       char in_str[128];
-       static struct cmd_ds_fwt_access fwt_access;
-       char *ptr;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str)))
-               return -EFAULT;
-
-       if ((ptr = eth_str2addr(in_str, fwt_access.da)) == NULL) {
-               lbs_pr_alert( "FWT_ADD: Invalid MAC address 1\n");
-               return -EINVAL;
-       }
-
-       if ((ptr = eth_str2addr(ptr, fwt_access.ra)) == NULL) {
-               lbs_pr_alert( "FWT_ADD: Invalid MAC address 2\n");
-               return -EINVAL;
-       }
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.metric =
-                       cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
-       else
-               fwt_access.metric = cpu_to_le32(FWT_DEFAULT_METRIC);
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.dir = (u8)simple_strtoul(ptr, &ptr, 10);
-       else
-               fwt_access.dir = FWT_DEFAULT_DIR;
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.rate = (u8) simple_strtoul(ptr, &ptr, 10);
-       else
-               fwt_access.rate = FWT_DEFAULT_RATE;
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.ssn =
-                       cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
-       else
-               fwt_access.ssn = cpu_to_le32(FWT_DEFAULT_SSN);
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.dsn =
-                       cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
-       else
-               fwt_access.dsn = cpu_to_le32(FWT_DEFAULT_DSN);
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.hopcount = simple_strtoul(ptr, &ptr, 10);
-       else
-               fwt_access.hopcount = FWT_DEFAULT_HOPCOUNT;
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.ttl = simple_strtoul(ptr, &ptr, 10);
-       else
-               fwt_access.ttl = FWT_DEFAULT_TTL;
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.expiration =
-                       cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
-       else
-               fwt_access.expiration = cpu_to_le32(FWT_DEFAULT_EXPIRATION);
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.sleepmode = (u8)simple_strtoul(ptr, &ptr, 10);
-       else
-               fwt_access.sleepmode = FWT_DEFAULT_SLEEPMODE;
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.snr =
-                       cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
-       else
-               fwt_access.snr = cpu_to_le32(FWT_DEFAULT_SNR);
-
-#ifdef DEBUG
-       {
-               char ethaddr1_str[18], ethaddr2_str[18];
-               eth_addr2str(fwt_access.da, ethaddr1_str);
-               eth_addr2str(fwt_access.ra, ethaddr2_str);
-               lbs_deb_ioctl("FWT_ADD: adding (da:%s,%i,ra:%s)\n", ethaddr1_str,
-                      fwt_access.dir, ethaddr2_str);
-               lbs_deb_ioctl("FWT_ADD: ssn:%u dsn:%u met:%u hop:%u ttl:%u exp:%u slp:%u snr:%u\n",
-                      fwt_access.ssn, fwt_access.dsn, fwt_access.metric,
-                      fwt_access.hopcount, fwt_access.ttl, fwt_access.expiration,
-                      fwt_access.sleepmode, fwt_access.snr);
-       }
-#endif
-
-       ret = libertas_prepare_and_send_command(priv, cmd_fwt_access,
-                                               cmd_act_fwt_access_add,
-                                               cmd_option_waitforrsp, 0,
-                                               (void *)&fwt_access);
-
-       lbs_deb_leave_args(LBS_DEB_IOCTL, "ret %d", ret);
-       return ret;
-}
-
-/**
- *  @brief          Delete an entry from the FWT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_del_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       char in_str[64];
-       static struct cmd_ds_fwt_access fwt_access;
-       char *ptr;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str)))
-               return -EFAULT;
-
-       if ((ptr = eth_str2addr(in_str, fwt_access.da)) == NULL) {
-               lbs_pr_alert( "FWT_DEL: Invalid MAC address 1\n");
-               return -EINVAL;
-       }
-
-       if ((ptr = eth_str2addr(ptr, fwt_access.ra)) == NULL) {
-               lbs_pr_alert( "FWT_DEL: Invalid MAC address 2\n");
-               return -EINVAL;
-       }
-
-       if ((ptr = next_param(ptr)))
-               fwt_access.dir = (u8)simple_strtoul(ptr, &ptr, 10);
-       else
-               fwt_access.dir = FWT_DEFAULT_DIR;
-
-#ifdef DEBUG
-       {
-               char ethaddr1_str[18], ethaddr2_str[18];
-               lbs_deb_ioctl("FWT_DEL: line is %s\n", in_str);
-               eth_addr2str(fwt_access.da, ethaddr1_str);
-               eth_addr2str(fwt_access.ra, ethaddr2_str);
-               lbs_deb_ioctl("FWT_DEL: removing (da:%s,ra:%s,dir:%d)\n", ethaddr1_str,
-                      ethaddr2_str, fwt_access.dir);
-       }
-#endif
-
-       ret = libertas_prepare_and_send_command(priv,
-                                               cmd_fwt_access,
-                                               cmd_act_fwt_access_del,
-                                               cmd_option_waitforrsp, 0,
-                                               (void *)&fwt_access);
-       lbs_deb_leave_args(LBS_DEB_IOCTL, "ret %d", ret);
-       return ret;
-}
-
-
-/**
- *  @brief             Print route parameters
- *  @param fwt_access  struct cmd_ds_fwt_access with route info
- *  @param buf         destination buffer for route info
- */
-static void print_route(struct cmd_ds_fwt_access fwt_access, char *buf)
-{
-       buf += sprintf(buf, " ");
-       buf += eth_addr2str(fwt_access.da, buf);
-       buf += sprintf(buf, " ");
-       buf += eth_addr2str(fwt_access.ra, buf);
-       buf += sprintf(buf, " %u", fwt_access.valid);
-       buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.metric));
-       buf += sprintf(buf, " %u", fwt_access.dir);
-       buf += sprintf(buf, " %u", fwt_access.rate);
-       buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.ssn));
-       buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.dsn));
-       buf += sprintf(buf, " %u", fwt_access.hopcount);
-       buf += sprintf(buf, " %u", fwt_access.ttl);
-       buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.expiration));
-       buf += sprintf(buf, " %u", fwt_access.sleepmode);
-       buf += sprintf(buf, " %u ", le32_to_cpu(fwt_access.snr));
-       buf += eth_addr2str(fwt_access.prec, buf);
-}
-
-/**
- *  @brief          Lookup an entry in the FWT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_lookup_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       char in_str[64];
-       char *ptr;
-       static struct cmd_ds_fwt_access fwt_access;
-       static char out_str[128];
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str)))
-               return -EFAULT;
-
-       if ((ptr = eth_str2addr(in_str, fwt_access.da)) == NULL) {
-               lbs_pr_alert( "FWT_LOOKUP: Invalid MAC address\n");
-               return -EINVAL;
-       }
-
-#ifdef DEBUG
-       {
-               char ethaddr1_str[18];
-               lbs_deb_ioctl("FWT_LOOKUP: line is %s\n", in_str);
-               eth_addr2str(fwt_access.da, ethaddr1_str);
-               lbs_deb_ioctl("FWT_LOOKUP: looking for (da:%s)\n", ethaddr1_str);
-       }
-#endif
-
-       ret = libertas_prepare_and_send_command(priv,
-                                               cmd_fwt_access,
-                                               cmd_act_fwt_access_lookup,
-                                               cmd_option_waitforrsp, 0,
-                                               (void *)&fwt_access);
-
-       if (ret == 0)
-               print_route(fwt_access, out_str);
-       else
-               sprintf(out_str, "(null)");
-
-       wrq->u.data.length = strlen(out_str);
-       if (copy_to_user(wrq->u.data.pointer, (char *)out_str,
-                        wrq->u.data.length)) {
-               lbs_deb_ioctl("FWT_LOOKUP: Copy to user failed!\n");
-               return -EFAULT;
-       }
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          Reset all entries from the FWT table
- *  @param priv     A pointer to wlan_private structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_reset_ioctl(wlan_private * priv)
-{
-       lbs_deb_ioctl("FWT: resetting\n");
-
-       return (libertas_prepare_and_send_command(priv,
-                                     cmd_fwt_access,
-                                     cmd_act_fwt_access_reset,
-                                     cmd_option_waitforrsp, 0, NULL));
-}
-
-/**
- *  @brief          List an entry from the FWT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_list_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       char in_str[8];
-       static struct cmd_ds_fwt_access fwt_access;
-       char *ptr = in_str;
-       static char out_str[128];
-       char *pbuf = out_str;
-       int ret = 0;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str))) {
-               ret = -EFAULT;
-               goto out;
-       }
-
-       fwt_access.id = cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
-
-#ifdef DEBUG
-       {
-               lbs_deb_ioctl("FWT_LIST: line is %s\n", in_str);
-               lbs_deb_ioctl("FWT_LIST: listing id:%i\n", le32_to_cpu(fwt_access.id));
-       }
-#endif
-
-       ret = libertas_prepare_and_send_command(priv, cmd_fwt_access,
-                                   cmd_act_fwt_access_list,
-                                   cmd_option_waitforrsp, 0, (void *)&fwt_access);
-
-       if (ret == 0)
-               print_route(fwt_access, pbuf);
-       else
-               pbuf += sprintf(pbuf, " (null)");
-
-       wrq->u.data.length = strlen(out_str);
-       if (copy_to_user(wrq->u.data.pointer, (char *)out_str,
-                        wrq->u.data.length)) {
-               lbs_deb_ioctl("FWT_LIST: Copy to user failed!\n");
-               ret = -EFAULT;
-               goto out;
-       }
-
-       ret = 0;
-
-out:
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return ret;
-}
-
-/**
- *  @brief          List an entry from the FRT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_list_route_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       char in_str[64];
-       static struct cmd_ds_fwt_access fwt_access;
-       char *ptr = in_str;
-       static char out_str[128];
-       char *pbuf = out_str;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str)))
-               return -EFAULT;
-
-       fwt_access.id = cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
-
-#ifdef DEBUG
-       {
-               lbs_deb_ioctl("FWT_LIST_ROUTE: line is %s\n", in_str);
-               lbs_deb_ioctl("FWT_LIST_ROUTE: listing id:%i\n", le32_to_cpu(fwt_access.id));
-       }
-#endif
-
-       ret = libertas_prepare_and_send_command(priv, cmd_fwt_access,
-                                   cmd_act_fwt_access_list_route,
-                                   cmd_option_waitforrsp, 0, (void *)&fwt_access);
-
-       if (ret == 0) {
-               print_route(fwt_access, pbuf);
-       } else
-               pbuf += sprintf(pbuf, " (null)");
-
-       wrq->u.data.length = strlen(out_str);
-       if (copy_to_user(wrq->u.data.pointer, (char *)out_str,
-                        wrq->u.data.length)) {
-               lbs_deb_ioctl("FWT_LIST_ROUTE: Copy to user failed!\n");
-               return -EFAULT;
-       }
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          List an entry from the FNT table
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_list_neighbor_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       char in_str[8];
-       static struct cmd_ds_fwt_access fwt_access;
-       char *ptr = in_str;
-       static char out_str[128];
-       char *pbuf = out_str;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str)))
-               return -EFAULT;
-
-       memset(&fwt_access, 0, sizeof(fwt_access));
-       fwt_access.id = cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
-
-#ifdef DEBUG
-       {
-               lbs_deb_ioctl("FWT_LIST_NEIGHBOR: line is %s\n", in_str);
-               lbs_deb_ioctl("FWT_LIST_NEIGHBOR: listing id:%i\n", le32_to_cpu(fwt_access.id));
-       }
-#endif
-
-       ret = libertas_prepare_and_send_command(priv, cmd_fwt_access,
-                                   cmd_act_fwt_access_list_neighbor,
-                                   cmd_option_waitforrsp, 0,
-                                   (void *)&fwt_access);
-
-       if (ret == 0) {
-               pbuf += sprintf(pbuf, " ra ");
-               pbuf += eth_addr2str(fwt_access.ra, pbuf);
-               pbuf += sprintf(pbuf, "  slp %u", fwt_access.sleepmode);
-               pbuf += sprintf(pbuf, "  snr %u", le32_to_cpu(fwt_access.snr));
-               pbuf += sprintf(pbuf, "  ref %u", le32_to_cpu(fwt_access.references));
-       } else
-               pbuf += sprintf(pbuf, " (null)");
-
-       wrq->u.data.length = strlen(out_str);
-       if (copy_to_user(wrq->u.data.pointer, (char *)out_str,
-                        wrq->u.data.length)) {
-               lbs_deb_ioctl("FWT_LIST_NEIGHBOR: Copy to user failed!\n");
-               return -EFAULT;
-       }
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          Cleans up the route (FRT) and neighbor (FNT) tables
- *                  (Garbage Collection)
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_cleanup_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       static struct cmd_ds_fwt_access fwt_access;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       lbs_deb_ioctl("FWT: cleaning up\n");
-
-       memset(&fwt_access, 0, sizeof(fwt_access));
-
-       ret = libertas_prepare_and_send_command(priv, cmd_fwt_access,
-                                   cmd_act_fwt_access_cleanup,
-                                   cmd_option_waitforrsp, 0,
-                                   (void *)&fwt_access);
-
-       if (ret == 0)
-               wrq->u.param.value = le32_to_cpu(fwt_access.references);
-       else
-               return -EFAULT;
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          Gets firmware internal time (debug purposes)
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_fwt_time_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       static struct cmd_ds_fwt_access fwt_access;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       lbs_deb_ioctl("FWT: getting time\n");
-
-       memset(&fwt_access, 0, sizeof(fwt_access));
-
-       ret = libertas_prepare_and_send_command(priv, cmd_fwt_access,
-                                   cmd_act_fwt_access_time,
-                                   cmd_option_waitforrsp, 0,
-                                   (void *)&fwt_access);
-
-       if (ret == 0)
-               wrq->u.param.value = le32_to_cpu(fwt_access.references);
-       else
-               return -EFAULT;
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          Gets mesh ttl from firmware
- *  @param priv     A pointer to wlan_private structure
- *  @param req      A pointer to ifreq structure
- *  @return         0 --success, otherwise fail
- */
-static int wlan_mesh_get_ttl_ioctl(wlan_private * priv, struct ifreq *req)
-{
-       struct iwreq *wrq = (struct iwreq *)req;
-       struct cmd_ds_mesh_access mesh_access;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       memset(&mesh_access, 0, sizeof(mesh_access));
-
-       ret = libertas_prepare_and_send_command(priv, cmd_mesh_access,
-                                   cmd_act_mesh_get_ttl,
-                                   cmd_option_waitforrsp, 0,
-                                   (void *)&mesh_access);
-
-       if (ret == 0)
-               wrq->u.param.value = le32_to_cpu(mesh_access.data[0]);
-       else
-               return -EFAULT;
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return 0;
-}
-
-/**
- *  @brief          Gets mesh ttl from firmware
- *  @param priv     A pointer to wlan_private structure
- *  @param ttl      New ttl value
- *  @return         0 --success, otherwise fail
- */
-static int wlan_mesh_set_ttl_ioctl(wlan_private * priv, int ttl)
-{
-       struct cmd_ds_mesh_access mesh_access;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       if( (ttl > 0xff) || (ttl < 0) )
-               return -EINVAL;
-
-       memset(&mesh_access, 0, sizeof(mesh_access));
-       mesh_access.data[0] = cpu_to_le32(ttl);
-
-       ret = libertas_prepare_and_send_command(priv, cmd_mesh_access,
-                                               cmd_act_mesh_set_ttl,
-                                               cmd_option_waitforrsp, 0,
-                                               (void *)&mesh_access);
-
-       if (ret != 0)
-               ret = -EFAULT;
-
-       lbs_deb_leave(LBS_DEB_IOCTL);
-       return ret;
-}
-
-/**
- *  @brief ioctl function - entry point
- *
- *  @param dev         A pointer to net_device structure
- *  @param req         A pointer to ifreq structure
- *  @param cmd                 command
- *  @return            0--success, otherwise fail
- */
-int libertas_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
-{
-       int subcmd = 0;
-       int idata = 0;
-       int *pdata;
-       int ret = 0;
-       wlan_private *priv = dev->priv;
-       wlan_adapter *adapter = priv->adapter;
-       struct iwreq *wrq = (struct iwreq *)req;
-
-       lbs_deb_enter(LBS_DEB_IOCTL);
-
-       lbs_deb_ioctl("libertas_do_ioctl: ioctl cmd = 0x%x\n", cmd);
-       switch (cmd) {
-       case WLAN_SETNONE_GETNONE:      /* set WPA mode on/off ioctl #20 */
-               switch (wrq->u.data.flags) {
-               case WLAN_SUBCMD_BT_RESET:      /* bt_reset */
-                       wlan_bt_reset_ioctl(priv);
-                       break;
-               case WLAN_SUBCMD_FWT_RESET:     /* fwt_reset */
-                       wlan_fwt_reset_ioctl(priv);
-                       break;
-               }               /* End of switch */
-               break;
-
-       case WLAN_SETONEINT_GETNONE:
-               /* The first 4 bytes of req->ifr_data is sub-ioctl number
-                * after 4 bytes sits the payload.
-                */
-               subcmd = wrq->u.data.flags;
-               if (!subcmd)
-                       subcmd = (int)wrq->u.param.value;
-
-               switch (subcmd) {
-               case WLANSETREGION:
-                       idata = SUBCMD_DATA(wrq);
-                       ret = wlan_set_region(priv, (u16) idata);
-                       break;
-               case WLAN_SUBCMD_MESH_SET_TTL:
-                       idata = SUBCMD_DATA(wrq);
-                       ret = wlan_mesh_set_ttl_ioctl(priv, idata);
-                       break;
-
-               case WLAN_SUBCMD_BT_SET_INVERT:
-                       ret = wlan_bt_set_invert_ioctl(priv, req);
-                       break ;
-
-               default:
-                       ret = -EOPNOTSUPP;
-                       break;
-               }
-
-               break;
-
-       case WLAN_SET128CHAR_GET128CHAR:
-               switch ((int)wrq->u.data.flags) {
-               case WLAN_SUBCMD_BT_ADD:
-                       ret = wlan_bt_add_ioctl(priv, req);
-                       break;
-               case WLAN_SUBCMD_BT_DEL:
-                       ret = wlan_bt_del_ioctl(priv, req);
-                       break;
-               case WLAN_SUBCMD_BT_LIST:
-                       ret = wlan_bt_list_ioctl(priv, req);
-                       break;
-               case WLAN_SUBCMD_FWT_ADD:
-                       ret = wlan_fwt_add_ioctl(priv, req);
-                       break;
-               case WLAN_SUBCMD_FWT_DEL:
-                       ret = wlan_fwt_del_ioctl(priv, req);
-                       break;
-               case WLAN_SUBCMD_FWT_LOOKUP:
-                       ret = wlan_fwt_lookup_ioctl(priv, req);
-                       break;
-               case WLAN_SUBCMD_FWT_LIST_NEIGHBOR:
-                       ret = wlan_fwt_list_neighbor_ioctl(priv, req);
-                       break;
-               case WLAN_SUBCMD_FWT_LIST:
-                       ret = wlan_fwt_list_ioctl(priv, req);
-                       break;
-               case WLAN_SUBCMD_FWT_LIST_ROUTE:
-                       ret = wlan_fwt_list_route_ioctl(priv, req);
-                       break;
-               }
-               break;
-
-       case WLAN_SETNONE_GETONEINT:
-               switch (wrq->u.param.value) {
-               case WLANGETREGION:
-                       pdata = (int *)wrq->u.name;
-                       *pdata = (int)adapter->regioncode;
-                       break;
-               case WLAN_SUBCMD_FWT_CLEANUP:   /* fwt_cleanup */
-                       ret = wlan_fwt_cleanup_ioctl(priv, req);
-                       break;
-
-               case WLAN_SUBCMD_FWT_TIME:      /* fwt_time */
-                       ret = wlan_fwt_time_ioctl(priv, req);
-                       break;
-
-               case WLAN_SUBCMD_MESH_GET_TTL:
-                       ret = wlan_mesh_get_ttl_ioctl(priv, req);
-                       break;
-
-               case WLAN_SUBCMD_BT_GET_INVERT:
-                       ret = wlan_bt_get_invert_ioctl(priv, req);
-                       break ;
-
-               default:
-                       ret = -EOPNOTSUPP;
-
-               }
-
-               break;
-
-       case WLAN_SET_GET_SIXTEEN_INT:
-               switch ((int)wrq->u.data.flags) {
-               case WLAN_LED_GPIO_CTRL:
-                       {
-                               int i;
-                               int data[16];
-
-                               struct cmd_ds_802_11_led_ctrl ctrl;
-                               struct mrvlietypes_ledgpio *gpio =
-                                   (struct mrvlietypes_ledgpio *) ctrl.data;
-
-                               memset(&ctrl, 0, sizeof(ctrl));
-                               if (wrq->u.data.length > MAX_LEDS * 2)
-                                       return -ENOTSUPP;
-                               if ((wrq->u.data.length % 2) != 0)
-                                       return -ENOTSUPP;
-                               if (wrq->u.data.length == 0) {
-                                       ctrl.action =
-                                           cpu_to_le16
-                                           (cmd_act_get);
-                               } else {
-                                       if (copy_from_user
-                                           (data, wrq->u.data.pointer,
-                                            sizeof(int) *
-                                            wrq->u.data.length)) {
-                                               lbs_deb_ioctl(
-                                                      "Copy from user failed\n");
-                                               return -EFAULT;
-                                       }
-
-                                       ctrl.action =
-                                           cpu_to_le16
-                                           (cmd_act_set);
-                                       ctrl.numled = cpu_to_le16(0);
-                                       gpio->header.type =
-                                           cpu_to_le16(TLV_TYPE_LED_GPIO);
-                                       gpio->header.len = wrq->u.data.length;
-                                       for (i = 0; i < wrq->u.data.length;
-                                            i += 2) {
-                                               gpio->ledpin[i / 2].led =
-                                                   data[i];
-                                               gpio->ledpin[i / 2].pin =
-                                                   data[i + 1];
-                                       }
-                               }
-                               ret =
-                                   libertas_prepare_and_send_command(priv,
-                                                         cmd_802_11_led_gpio_ctrl,
-                                                         0,
-                                                         cmd_option_waitforrsp,
-                                                         0, (void *)&ctrl);
-                               for (i = 0; i < gpio->header.len; i += 2) {
-                                       data[i] = gpio->ledpin[i / 2].led;
-                                       data[i + 1] = gpio->ledpin[i / 2].pin;
-                               }
-                               if (copy_to_user(wrq->u.data.pointer, data,
-                                                sizeof(int) *
-                                                gpio->header.len)) {
-                                       lbs_deb_ioctl("Copy to user failed\n");
-                                       return -EFAULT;
-                               }
-
-                               wrq->u.data.length = gpio->header.len;
-                       }
-                       break;
-               }
-               break;
-
-       default:
-               ret = -EINVAL;
-               break;
-       }
-
-       lbs_deb_leave_args(LBS_DEB_IOCTL, "ret %d", ret);
-       return ret;
-}
-
-
index 623ab4b..4a59306 100644 (file)
@@ -181,7 +181,8 @@ u16 libertas_region_code_to_index[MRVDRV_MAX_REGION_CODE] =
  * @brief Get function for sysfs attribute anycast_mask
  */
 static ssize_t libertas_anycast_get(struct device * dev,
-               struct device_attribute *attr, char * buf) {
+               struct device_attribute *attr, char * buf)
+{
        struct cmd_ds_mesh_access mesh_access;
 
        memset(&mesh_access, 0, sizeof(mesh_access));
@@ -197,7 +198,8 @@ static ssize_t libertas_anycast_get(struct device * dev,
  * @brief Set function for sysfs attribute anycast_mask
  */
 static ssize_t libertas_anycast_set(struct device * dev,
-               struct device_attribute *attr, const char * buf, size_t count) {
+               struct device_attribute *attr, const char * buf, size_t count)
+{
        struct cmd_ds_mesh_access mesh_access;
        uint32_t datum;
 
@@ -799,7 +801,6 @@ wlan_private *libertas_add_card(void *card, struct device *dmdev)
        dev->open = wlan_open;
        dev->hard_start_xmit = wlan_pre_start_xmit;
        dev->stop = wlan_close;
-       dev->do_ioctl = libertas_do_ioctl;
        dev->set_mac_address = wlan_set_mac_address;
        dev->tx_timeout = wlan_tx_timeout;
        dev->get_stats = wlan_get_stats;
@@ -918,7 +919,6 @@ int libertas_add_mesh(wlan_private *priv, struct device *dev)
        mesh_dev->open = mesh_open;
        mesh_dev->hard_start_xmit = mesh_pre_start_xmit;
        mesh_dev->stop = mesh_close;
-       mesh_dev->do_ioctl = libertas_do_ioctl;
        mesh_dev->get_stats = wlan_get_stats;
        mesh_dev->set_mac_address = wlan_set_mac_address;
        mesh_dev->ethtool_ops = &libertas_ethtool_ops;
index 606af50..c3043dc 100644 (file)
@@ -214,38 +214,6 @@ done:
        return matched;
 }
 
-/**
- *  @brief Post process the scan table after a new scan command has completed
- *
- *  Inspect each entry of the scan table and try to find an entry that
- *    matches our current associated/joined network from the scan.  If
- *    one is found, update the stored copy of the bssdescriptor for our
- *    current network.
- *
- *  Debug dump the current scan table contents if compiled accordingly.
- *
- *  @param priv   A pointer to wlan_private structure
- *
- *  @return       void
- */
-static void wlan_scan_process_results(wlan_private * priv)
-{
-       wlan_adapter *adapter = priv->adapter;
-       struct bss_descriptor * iter_bss;
-       int i = 0;
-
-       if (adapter->connect_status == libertas_connected)
-               return;
-
-       mutex_lock(&adapter->lock);
-       list_for_each_entry (iter_bss, &adapter->network_list, list) {
-               lbs_deb_scan("Scan:(%02d) " MAC_FMT ", RSSI[%03d], SSID[%s]\n",
-                      i++, MAC_ARG(iter_bss->bssid), (s32) iter_bss->rssi,
-                      escape_essid(iter_bss->ssid, iter_bss->ssid_len));
-       }
-       mutex_unlock(&adapter->lock);
-}
-
 /**
  *  @brief Create a channel list for the driver to scan based on region info
  *
@@ -791,6 +759,10 @@ int wlan_scan_networks(wlan_private * priv,
        u8 scancurrentchanonly;
        int maxchanperscan;
        int ret;
+#ifdef CONFIG_LIBERTAS_DEBUG
+       struct bss_descriptor * iter_bss;
+       int i = 0;
+#endif
 
        lbs_deb_enter(LBS_DEB_ASSOC);
 
@@ -832,11 +804,16 @@ int wlan_scan_networks(wlan_private * priv,
                                     puserscanin,
                                     full_scan);
 
-       /*  Process the resulting scan table:
-        *    - Remove any bad ssids
-        *    - Update our current BSS information from scan data
-        */
-       wlan_scan_process_results(priv);
+#ifdef CONFIG_LIBERTAS_DEBUG
+       /* Dump the scan table */
+       mutex_lock(&adapter->lock);
+       list_for_each_entry (iter_bss, &adapter->network_list, list) {
+               lbs_deb_scan("Scan:(%02d) " MAC_FMT ", RSSI[%03d], SSID[%s]\n",
+                      i++, MAC_ARG(iter_bss->bssid), (s32) iter_bss->rssi,
+                      escape_essid(iter_bss->ssid, iter_bss->ssid_len));
+       }
+       mutex_unlock(&adapter->lock);
+#endif
 
        if (priv->adapter->connect_status == libertas_connected) {
                netif_carrier_on(priv->dev);
index 8939251..f42b796 100644 (file)
@@ -913,148 +913,6 @@ out:
        return 0;
 }
 
-/*
- * iwpriv settable callbacks
- */
-
-static const iw_handler wlan_private_handler[] = {
-       NULL,                   /* SIOCIWFIRSTPRIV */
-};
-
-static const struct iw_priv_args wlan_private_args[] = {
-       /*
-        * { cmd, set_args, get_args, name }
-        */
-       /* Using iwpriv sub-command feature */
-       {
-        WLAN_SETONEINT_GETNONE,        /* IOCTL: 24 */
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        IW_PRIV_TYPE_NONE,
-        ""},
-       {
-        WLANSETREGION,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        IW_PRIV_TYPE_NONE,
-        "setregioncode"},
-       {
-        WLAN_SUBCMD_MESH_SET_TTL,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        IW_PRIV_TYPE_NONE,
-        "mesh_set_ttl"},
-       {
-        WLAN_SETNONE_GETONEINT,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        ""},
-       {
-        WLANGETREGION,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        "getregioncode"},
-       {
-        WLAN_SUBCMD_FWT_CLEANUP,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        "fwt_cleanup"},
-       {
-        WLAN_SUBCMD_FWT_TIME,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        "fwt_time"},
-       {
-        WLAN_SUBCMD_MESH_GET_TTL,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        "mesh_get_ttl"},
-       {
-        WLAN_SETNONE_GETNONE,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_NONE,
-        ""},
-       {
-        WLAN_SUBCMD_FWT_RESET,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_NONE,
-        "fwt_reset"},
-       {
-        WLAN_SUBCMD_BT_RESET,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_NONE,
-        "bt_reset"},
-       {
-        WLAN_SET128CHAR_GET128CHAR,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        ""},
-       /* BT Management */
-       {
-        WLAN_SUBCMD_BT_ADD,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "bt_add"},
-       {
-        WLAN_SUBCMD_BT_DEL,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "bt_del"},
-       {
-        WLAN_SUBCMD_BT_LIST,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "bt_list"},
-       {
-        WLAN_SUBCMD_BT_SET_INVERT,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        IW_PRIV_TYPE_NONE,
-        "bt_set_invert"},
-       {
-        WLAN_SUBCMD_BT_GET_INVERT,
-        IW_PRIV_TYPE_NONE,
-        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-        "bt_get_invert"},
-       /* FWT Management */
-       {
-        WLAN_SUBCMD_FWT_ADD,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "fwt_add"},
-       {
-        WLAN_SUBCMD_FWT_DEL,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "fwt_del"},
-       {
-        WLAN_SUBCMD_FWT_LOOKUP,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "fwt_lookup"},
-       {
-        WLAN_SUBCMD_FWT_LIST_NEIGHBOR,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "fwt_list_neigh"},
-       {
-        WLAN_SUBCMD_FWT_LIST,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "fwt_list"},
-       {
-        WLAN_SUBCMD_FWT_LIST_ROUTE,
-        IW_PRIV_TYPE_CHAR | 128,
-        IW_PRIV_TYPE_CHAR | 128,
-        "fwt_list_route"},
-       {
-        WLAN_SET_GET_SIXTEEN_INT,
-        IW_PRIV_TYPE_INT | 16,
-        IW_PRIV_TYPE_INT | 16,
-        ""},
-       {
-        WLAN_LED_GPIO_CTRL,
-        IW_PRIV_TYPE_INT | 16,
-        IW_PRIV_TYPE_INT | 16,
-        "ledgpio"},
-};
-
 static struct iw_statistics *wlan_get_wireless_stats(struct net_device *dev)
 {
        enum {
@@ -2444,22 +2302,12 @@ static const iw_handler mesh_wlan_handler[] = {
 };
 struct iw_handler_def libertas_handler_def = {
        .num_standard   = sizeof(wlan_handler) / sizeof(iw_handler),
-       .num_private    = sizeof(wlan_private_handler) / sizeof(iw_handler),
-       .num_private_args = sizeof(wlan_private_args) /
-               sizeof(struct iw_priv_args),
        .standard       = (iw_handler *) wlan_handler,
-       .private        = (iw_handler *) wlan_private_handler,
-       .private_args   = (struct iw_priv_args *)wlan_private_args,
        .get_wireless_stats = wlan_get_wireless_stats,
 };
 
 struct iw_handler_def mesh_handler_def = {
        .num_standard   = sizeof(mesh_wlan_handler) / sizeof(iw_handler),
-       .num_private    = sizeof(wlan_private_handler) / sizeof(iw_handler),
-       .num_private_args = sizeof(wlan_private_args) /
-               sizeof(struct iw_priv_args),
        .standard       = (iw_handler *) mesh_wlan_handler,
-       .private        = (iw_handler *) wlan_private_handler,
-       .private_args   = (struct iw_priv_args *)wlan_private_args,
        .get_wireless_stats = wlan_get_wireless_stats,
 };
index d555056..3d5196c 100644 (file)
@@ -7,45 +7,6 @@
 #define SUBCMD_OFFSET                  4
 #define SUBCMD_DATA(x)                 *((int *)(x->u.name + SUBCMD_OFFSET))
 
-/** PRIVATE CMD ID */
-#define        WLANIOCTL                       SIOCIWFIRSTPRIV
-
-#define WLAN_SETNONE_GETNONE           (WLANIOCTL + 8)
-#define WLAN_SUBCMD_BT_RESET                   13
-#define WLAN_SUBCMD_FWT_RESET                  14
-
-#define WLAN_SETNONE_GETONEINT         (WLANIOCTL + 15)
-#define WLANGETREGION                          1
-
-#define WLAN_SUBCMD_FWT_CLEANUP                        15
-#define WLAN_SUBCMD_FWT_TIME                   16
-#define WLAN_SUBCMD_MESH_GET_TTL               17
-#define WLAN_SUBCMD_BT_GET_INVERT              18
-
-#define WLAN_SETONEINT_GETNONE         (WLANIOCTL + 24)
-#define WLANSETREGION                          8
-#define WLAN_SUBCMD_MESH_SET_TTL               18
-#define WLAN_SUBCMD_BT_SET_INVERT              19
-
-#define WLAN_SET128CHAR_GET128CHAR     (WLANIOCTL + 25)
-#define WLAN_SUBCMD_BT_ADD                     18
-#define WLAN_SUBCMD_BT_DEL                     19
-#define WLAN_SUBCMD_BT_LIST                    20
-#define WLAN_SUBCMD_FWT_ADD                    21
-#define WLAN_SUBCMD_FWT_DEL                    22
-#define WLAN_SUBCMD_FWT_LOOKUP                 23
-#define WLAN_SUBCMD_FWT_LIST_NEIGHBOR          24
-#define WLAN_SUBCMD_FWT_LIST                   25
-#define WLAN_SUBCMD_FWT_LIST_ROUTE             26
-
-#define WLAN_SET_GET_SIXTEEN_INT       (WLANIOCTL + 29)
-#define WLAN_LED_GPIO_CTRL                     5
-
-#define WLAN_LINKMODE_802_3                    0
-#define WLAN_LINKMODE_802_11                   2
-#define WLAN_RADIOMODE_NONE                            0
-#define WLAN_RADIOMODE_RADIOTAP                        2
-
 /** wlan_ioctl_regrdwr */
 struct wlan_ioctl_regrdwr {
        /** Which register to access */
@@ -57,9 +18,13 @@ struct wlan_ioctl_regrdwr {
        u32 value;
 };
 
+#define WLAN_LINKMODE_802_3                    0
+#define WLAN_LINKMODE_802_11                   2
+#define WLAN_RADIOMODE_NONE                    0
+#define WLAN_RADIOMODE_RADIOTAP                        2
+
 extern struct iw_handler_def libertas_handler_def;
 extern struct iw_handler_def mesh_handler_def;
-int libertas_do_ioctl(struct net_device *dev, struct ifreq *req, int i);
 int wlan_radio_ioctl(wlan_private * priv, u8 option);
 
 #endif                         /* _WLAN_WEXT_H_ */
index 2687c77..114aefa 100644 (file)
@@ -25,7 +25,7 @@
 #include <linux/slab.h>
 #include <linux/list.h>
 #include <linux/spinlock.h>
-struct mm_struct;
+#include <linux/sched.h>
 struct vm_area_struct;
 #endif
 
index 124eb8c..c638398 100644 (file)
@@ -15,6 +15,7 @@ struct mdesc_node {
        u64                     node;
        unsigned int            unique_id;
        unsigned int            num_arcs;
+       unsigned int            irqs[2];
        struct property         *properties;
        struct mdesc_node       *hash_next;
        struct mdesc_node       *allnodes_next;
index 7af1e11..349d1d3 100644 (file)
@@ -2,6 +2,7 @@
 #define _SPARC64_TLB_H
 
 #include <linux/swap.h>
+#include <linux/pagemap.h>
 #include <asm/pgalloc.h>
 #include <asm/tlbflush.h>
 #include <asm/mmu_context.h>
index fbf3766..086a0e5 100644 (file)
@@ -748,6 +748,17 @@ static inline void pci_release_regions(struct pci_dev *dev) { }
 static inline void pci_block_user_cfg_access(struct pci_dev *dev) { }
 static inline void pci_unblock_user_cfg_access(struct pci_dev *dev) { }
 
+static inline struct pci_bus *pci_find_next_bus(const struct pci_bus *from)
+{ return NULL; }
+
+static inline struct pci_dev *pci_get_slot(struct pci_bus *bus,
+                                               unsigned int devfn)
+{ return NULL; }
+
+static inline struct pci_dev *pci_get_bus_and_slot(unsigned int bus,
+                                               unsigned int devfn)
+{ return NULL; }
+
 #endif /* CONFIG_PCI */
 
 /* Include architecture-dependent settings and functions */
index 87545e0..b2c4fde 100644 (file)
@@ -110,37 +110,67 @@ typedef int __bitwise suspend_state_t;
 #define PM_SUSPEND_MAX         ((__force suspend_state_t) 4)
 
 /**
- * struct pm_ops - Callbacks for managing platform dependent suspend states.
- * @valid: Callback to determine whether the given state can be entered.
- *     Valid states are advertised in /sys/power/state but can still
- *     be rejected by prepare or enter if the conditions aren't right.
- *     There is a %pm_valid_only_mem function available that can be assigned
- *     to this if you only implement mem sleep.
+ * struct pm_ops - Callbacks for managing platform dependent system sleep
+ *     states.
  *
- * @prepare: Prepare the platform for the given suspend state. Can return a
- *     negative error code if necessary.
+ * @valid: Callback to determine if given system sleep state is supported by
+ *     the platform.
+ *     Valid (ie. supported) states are advertised in /sys/power/state.  Note
+ *     that it still may be impossible to enter given system sleep state if the
+ *     conditions aren't right.
+ *     There is the %pm_valid_only_mem function available that can be assigned
+ *     to this if the platform only supports mem sleep.
  *
- * @enter: Enter the given suspend state, must be assigned. Can return a
- *     negative error code if necessary.
+ * @set_target: Tell the platform which system sleep state is going to be
+ *     entered.
+ *     @set_target() is executed right prior to suspending devices.  The
+ *     information conveyed to the platform code by @set_target() should be
+ *     disregarded by the platform as soon as @finish() is executed and if
+ *     @prepare() fails.  If @set_target() fails (ie. returns nonzero),
+ *     @prepare(), @enter() and @finish() will not be called by the PM core.
+ *     This callback is optional.  However, if it is implemented, the argument
+ *     passed to @prepare(), @enter() and @finish() is meaningless and should
+ *     be ignored.
  *
- * @finish: Called when the system has left the given state and all devices
- *     are resumed. The return value is ignored.
+ * @prepare: Prepare the platform for entering the system sleep state indicated
+ *     by @set_target() or represented by the argument if @set_target() is not
+ *     implemented.
+ *     @prepare() is called right after devices have been suspended (ie. the
+ *     appropriate .suspend() method has been executed for each device) and
+ *     before the nonboot CPUs are disabled (it is executed with IRQs enabled).
+ *     This callback is optional.  It returns 0 on success or a negative
+ *     error code otherwise, in which case the system cannot enter the desired
+ *     sleep state (@enter() and @finish() will not be called in that case).
+ *
+ * @enter: Enter the system sleep state indicated by @set_target() or
+ *     represented by the argument if @set_target() is not implemented.
+ *     This callback is mandatory.  It returns 0 on success or a negative
+ *     error code otherwise, in which case the system cannot enter the desired
+ *     sleep state.
+ *
+ * @finish: Called when the system has just left a sleep state, right after
+ *     the nonboot CPUs have been enabled and before devices are resumed (it is
+ *     executed with IRQs enabled).  If @set_target() is not implemented, the
+ *     argument represents the sleep state being left.
+ *     This callback is optional, but should be implemented by the platforms
+ *     that implement @prepare().  If implemented, it is always called after
+ *     @enter() (even if @enter() fails).
  */
 struct pm_ops {
        int (*valid)(suspend_state_t state);
+       int (*set_target)(suspend_state_t state);
        int (*prepare)(suspend_state_t state);
        int (*enter)(suspend_state_t state);
        int (*finish)(suspend_state_t state);
 };
 
+extern struct pm_ops *pm_ops;
+
 /**
  * pm_set_ops - set platform dependent power management ops
  * @pm_ops: The new power management operations to set.
  */
 extern void pm_set_ops(struct pm_ops *pm_ops);
-extern struct pm_ops *pm_ops;
-extern int pm_suspend(suspend_state_t state);
-
 extern int pm_valid_only_mem(suspend_state_t state);
 
 /**
@@ -161,6 +191,8 @@ extern void arch_suspend_disable_irqs(void);
  */
 extern void arch_suspend_enable_irqs(void);
 
+extern int pm_suspend(suspend_state_t state);
+
 /*
  * Device power management
  */
index 8812985..fc45ed2 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/init.h>
-#include <linux/pm.h>
 #include <linux/console.h>
 #include <linux/cpu.h>
 #include <linux/resume-trace.h>
@@ -97,6 +96,11 @@ static int suspend_prepare(suspend_state_t state)
                }
        }
 
+       if (pm_ops->set_target) {
+               error = pm_ops->set_target(state);
+               if (error)
+                       goto Thaw;
+       }
        suspend_console();
        error = device_suspend(PMSG_SUSPEND);
        if (error) {
index 6d65cf4..a9c4472 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -774,7 +774,6 @@ static inline struct kmem_cache *__find_general_cachep(size_t size,
         */
        BUG_ON(malloc_sizes[INDEX_AC].cs_cachep == NULL);
 #endif
-       WARN_ON_ONCE(size == 0);
        while (size > csizep->cs_size)
                csizep++;
 
index 758dafe..cf40ff9 100644 (file)
@@ -72,7 +72,8 @@ static void queue_process(struct work_struct *work)
                        netif_tx_unlock(dev);
                        local_irq_restore(flags);
 
-                       schedule_delayed_work(&npinfo->tx_work, HZ/10);
+                       if (atomic_read(&npinfo->refcnt))
+                               schedule_delayed_work(&npinfo->tx_work, HZ/10);
                        return;
                }
                netif_tx_unlock(dev);
@@ -250,22 +251,23 @@ static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
                unsigned long flags;
 
                local_irq_save(flags);
-               if (netif_tx_trylock(dev)) {
-                       /* try until next clock tick */
-                       for (tries = jiffies_to_usecs(1)/USEC_PER_POLL;
-                                       tries > 0; --tries) {
+               /* try until next clock tick */
+               for (tries = jiffies_to_usecs(1)/USEC_PER_POLL;
+                    tries > 0; --tries) {
+                       if (netif_tx_trylock(dev)) {
                                if (!netif_queue_stopped(dev))
                                        status = dev->hard_start_xmit(skb, dev);
+                               netif_tx_unlock(dev);
 
                                if (status == NETDEV_TX_OK)
                                        break;
 
-                               /* tickle device maybe there is some cleanup */
-                               netpoll_poll(np);
-
-                               udelay(USEC_PER_POLL);
                        }
-                       netif_tx_unlock(dev);
+
+                       /* tickle device maybe there is some cleanup */
+                       netpoll_poll(np);
+
+                       udelay(USEC_PER_POLL);
                }
                local_irq_restore(flags);
        }
@@ -784,9 +786,15 @@ void netpoll_cleanup(struct netpoll *np)
                        if (atomic_dec_and_test(&npinfo->refcnt)) {
                                skb_queue_purge(&npinfo->arp_tx);
                                skb_queue_purge(&npinfo->txq);
-                               cancel_rearming_delayed_work(&npinfo->tx_work);
+                               cancel_delayed_work(&npinfo->tx_work);
                                flush_scheduled_work();
 
+                               /* clean after last, unfinished work */
+                               if (!skb_queue_empty(&npinfo->txq)) {
+                                       struct sk_buff *skb;
+                                       skb = __skb_dequeue(&npinfo->txq);
+                                       kfree_skb(skb);
+                               }
                                kfree(npinfo);
                        }
                }
index 6edaaa0..67861a8 100644 (file)
@@ -3375,12 +3375,13 @@ static int sctp_getsockopt_sctp_status(struct sock *sk, int len,
        sctp_assoc_t associd;
        int retval = 0;
 
-       if (len != sizeof(status)) {
+       if (len < sizeof(status)) {
                retval = -EINVAL;
                goto out;
        }
 
-       if (copy_from_user(&status, optval, sizeof(status))) {
+       len = sizeof(status);
+       if (copy_from_user(&status, optval, len)) {
                retval = -EFAULT;
                goto out;
        }
@@ -3452,12 +3453,13 @@ static int sctp_getsockopt_peer_addr_info(struct sock *sk, int len,
        struct sctp_transport *transport;
        int retval = 0;
 
-       if (len != sizeof(pinfo)) {
+       if (len < sizeof(pinfo)) {
                retval = -EINVAL;
                goto out;
        }
 
-       if (copy_from_user(&pinfo, optval, sizeof(pinfo))) {
+       len = sizeof(pinfo);
+       if (copy_from_user(&pinfo, optval, len)) {
                retval = -EFAULT;
                goto out;
        }
@@ -3523,8 +3525,11 @@ static int sctp_getsockopt_disable_fragments(struct sock *sk, int len,
 static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval,
                                  int __user *optlen)
 {
-       if (len != sizeof(struct sctp_event_subscribe))
+       if (len < sizeof(struct sctp_event_subscribe))
                return -EINVAL;
+       len = sizeof(struct sctp_event_subscribe);
+       if (put_user(len, optlen))
+               return -EFAULT;
        if (copy_to_user(optval, &sctp_sk(sk)->subscribe, len))
                return -EFAULT;
        return 0;
@@ -3546,9 +3551,12 @@ static int sctp_getsockopt_autoclose(struct sock *sk, int len, char __user *optv
        /* Applicable to UDP-style socket only */
        if (sctp_style(sk, TCP))
                return -EOPNOTSUPP;
-       if (len != sizeof(int))
+       if (len < sizeof(int))
                return -EINVAL;
-       if (copy_to_user(optval, &sctp_sk(sk)->autoclose, len))
+       len = sizeof(int);
+       if (put_user(len, optlen))
+               return -EFAULT;
+       if (copy_to_user(optval, &sctp_sk(sk)->autoclose, sizeof(int)))
                return -EFAULT;
        return 0;
 }
@@ -3599,8 +3607,9 @@ static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval
        int retval = 0;
        struct sctp_association *asoc;
 
-       if (len != sizeof(sctp_peeloff_arg_t))
+       if (len < sizeof(sctp_peeloff_arg_t))
                return -EINVAL;
+       len = sizeof(sctp_peeloff_arg_t);
        if (copy_from_user(&peeloff, optval, len))
                return -EFAULT;
 
@@ -3628,6 +3637,8 @@ static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval
 
        /* Return the fd mapped to the new socket.  */
        peeloff.sd = retval;
+       if (put_user(len, optlen))
+               return -EFAULT;
        if (copy_to_user(optval, &peeloff, len))
                retval = -EFAULT;
 
@@ -3736,9 +3747,9 @@ static int sctp_getsockopt_peer_addr_params(struct sock *sk, int len,
        struct sctp_association *asoc = NULL;
        struct sctp_sock        *sp = sctp_sk(sk);
 
-       if (len != sizeof(struct sctp_paddrparams))
+       if (len < sizeof(struct sctp_paddrparams))
                return -EINVAL;
-
+       len = sizeof(struct sctp_paddrparams);
        if (copy_from_user(&params, optval, len))
                return -EFAULT;
 
@@ -3837,9 +3848,11 @@ static int sctp_getsockopt_delayed_ack_time(struct sock *sk, int len,
        struct sctp_association *asoc = NULL;
        struct sctp_sock        *sp = sctp_sk(sk);
 
-       if (len != sizeof(struct sctp_assoc_value))
+       if (len < sizeof(struct sctp_assoc_value))
                return - EINVAL;
 
+       len = sizeof(struct sctp_assoc_value);
+
        if (copy_from_user(&params, optval, len))
                return -EFAULT;
 
@@ -3888,8 +3901,11 @@ static int sctp_getsockopt_delayed_ack_time(struct sock *sk, int len,
  */
 static int sctp_getsockopt_initmsg(struct sock *sk, int len, char __user *optval, int __user *optlen)
 {
-       if (len != sizeof(struct sctp_initmsg))
+       if (len < sizeof(struct sctp_initmsg))
                return -EINVAL;
+       len = sizeof(struct sctp_initmsg);
+       if (put_user(len, optlen))
+               return -EFAULT;
        if (copy_to_user(optval, &sctp_sk(sk)->initmsg, len))
                return -EFAULT;
        return 0;
@@ -3904,7 +3920,7 @@ static int sctp_getsockopt_peer_addrs_num_old(struct sock *sk, int len,
        struct list_head *pos;
        int cnt = 0;
 
-       if (len != sizeof(sctp_assoc_t))
+       if (len < sizeof(sctp_assoc_t))
                return -EINVAL;
 
        if (copy_from_user(&id, optval, sizeof(sctp_assoc_t)))
@@ -3940,10 +3956,12 @@ static int sctp_getsockopt_peer_addrs_old(struct sock *sk, int len,
        struct sctp_sock *sp = sctp_sk(sk);
        int addrlen;
 
-       if (len != sizeof(struct sctp_getaddrs_old))
+       if (len < sizeof(struct sctp_getaddrs_old))
                return -EINVAL;
 
-       if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs_old)))
+       len = sizeof(struct sctp_getaddrs_old);
+
+       if (copy_from_user(&getaddrs, optval, len))
                return -EFAULT;
 
        if (getaddrs.addr_num <= 0) return -EINVAL;
@@ -3966,7 +3984,9 @@ static int sctp_getsockopt_peer_addrs_old(struct sock *sk, int len,
                if (cnt >= getaddrs.addr_num) break;
        }
        getaddrs.addr_num = cnt;
-       if (copy_to_user(optval, &getaddrs, sizeof(struct sctp_getaddrs_old)))
+       if (put_user(len, optlen))
+               return -EFAULT;
+       if (copy_to_user(optval, &getaddrs, len))
                return -EFAULT;
 
        return 0;
@@ -3999,8 +4019,7 @@ static int sctp_getsockopt_peer_addrs(struct sock *sk, int len,
                return -EINVAL;
 
        to = optval + offsetof(struct sctp_getaddrs,addrs);
-       space_left = len - sizeof(struct sctp_getaddrs) -
-                       offsetof(struct sctp_getaddrs,addrs);
+       space_left = len - offsetof(struct sctp_getaddrs,addrs);
 
        list_for_each(pos, &asoc->peer.transport_addr_list) {
                from = list_entry(pos, struct sctp_transport, transports);
@@ -4037,7 +4056,7 @@ static int sctp_getsockopt_local_addrs_num_old(struct sock *sk, int len,
        rwlock_t *addr_lock;
        int cnt = 0;
 
-       if (len != sizeof(sctp_assoc_t))
+       if (len < sizeof(sctp_assoc_t))
                return -EINVAL;
 
        if (copy_from_user(&id, optval, sizeof(sctp_assoc_t)))
@@ -4179,10 +4198,11 @@ static int sctp_getsockopt_local_addrs_old(struct sock *sk, int len,
        void *buf;
        int bytes_copied = 0;
 
-       if (len != sizeof(struct sctp_getaddrs_old))
+       if (len < sizeof(struct sctp_getaddrs_old))
                return -EINVAL;
 
-       if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs_old)))
+       len = sizeof(struct sctp_getaddrs_old);
+       if (copy_from_user(&getaddrs, optval, len))
                return -EFAULT;
 
        if (getaddrs.addr_num <= 0) return -EINVAL;
@@ -4254,7 +4274,7 @@ copy_getaddrs:
 
        /* copy the leading structure back to user */
        getaddrs.addr_num = cnt;
-       if (copy_to_user(optval, &getaddrs, sizeof(struct sctp_getaddrs_old)))
+       if (copy_to_user(optval, &getaddrs, len))
                err = -EFAULT;
 
 error:
@@ -4282,7 +4302,7 @@ static int sctp_getsockopt_local_addrs(struct sock *sk, int len,
        void *addrs;
        void *buf;
 
-       if (len <= sizeof(struct sctp_getaddrs))
+       if (len < sizeof(struct sctp_getaddrs))
                return -EINVAL;
 
        if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs)))
@@ -4306,8 +4326,8 @@ static int sctp_getsockopt_local_addrs(struct sock *sk, int len,
        }
 
        to = optval + offsetof(struct sctp_getaddrs,addrs);
-       space_left = len - sizeof(struct sctp_getaddrs) -
-                        offsetof(struct sctp_getaddrs,addrs);
+       space_left = len - offsetof(struct sctp_getaddrs,addrs);
+
        addrs = kmalloc(space_left, GFP_KERNEL);
        if (!addrs)
                return -ENOMEM;
@@ -4379,10 +4399,12 @@ static int sctp_getsockopt_primary_addr(struct sock *sk, int len,
        struct sctp_association *asoc;
        struct sctp_sock *sp = sctp_sk(sk);
 
-       if (len != sizeof(struct sctp_prim))
+       if (len < sizeof(struct sctp_prim))
                return -EINVAL;
 
-       if (copy_from_user(&prim, optval, sizeof(struct sctp_prim)))
+       len = sizeof(struct sctp_prim);
+
+       if (copy_from_user(&prim, optval, len))
                return -EFAULT;
 
        asoc = sctp_id2assoc(sk, prim.ssp_assoc_id);
@@ -4398,7 +4420,9 @@ static int sctp_getsockopt_primary_addr(struct sock *sk, int len,
        sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp,
                        (union sctp_addr *)&prim.ssp_addr);
 
-       if (copy_to_user(optval, &prim, sizeof(struct sctp_prim)))
+       if (put_user(len, optlen))
+               return -EFAULT;
+       if (copy_to_user(optval, &prim, len))
                return -EFAULT;
 
        return 0;
@@ -4415,10 +4439,15 @@ static int sctp_getsockopt_adaptation_layer(struct sock *sk, int len,
 {
        struct sctp_setadaptation adaptation;
 
-       if (len != sizeof(struct sctp_setadaptation))
+       if (len < sizeof(struct sctp_setadaptation))
                return -EINVAL;
 
+       len = sizeof(struct sctp_setadaptation);
+
        adaptation.ssb_adaptation_ind = sctp_sk(sk)->adaptation_ind;
+
+       if (put_user(len, optlen))
+               return -EFAULT;
        if (copy_to_user(optval, &adaptation, len))
                return -EFAULT;
 
@@ -4452,9 +4481,12 @@ static int sctp_getsockopt_default_send_param(struct sock *sk,
        struct sctp_association *asoc;
        struct sctp_sock *sp = sctp_sk(sk);
 
-       if (len != sizeof(struct sctp_sndrcvinfo))
+       if (len < sizeof(struct sctp_sndrcvinfo))
                return -EINVAL;
-       if (copy_from_user(&info, optval, sizeof(struct sctp_sndrcvinfo)))
+
+       len = sizeof(struct sctp_sndrcvinfo);
+
+       if (copy_from_user(&info, optval, len))
                return -EFAULT;
 
        asoc = sctp_id2assoc(sk, info.sinfo_assoc_id);
@@ -4475,7 +4507,9 @@ static int sctp_getsockopt_default_send_param(struct sock *sk,
                info.sinfo_timetolive = sp->default_timetolive;
        }
 
-       if (copy_to_user(optval, &info, sizeof(struct sctp_sndrcvinfo)))
+       if (put_user(len, optlen))
+               return -EFAULT;
+       if (copy_to_user(optval, &info, len))
                return -EFAULT;
 
        return 0;
@@ -4526,10 +4560,12 @@ static int sctp_getsockopt_rtoinfo(struct sock *sk, int len,
        struct sctp_rtoinfo rtoinfo;
        struct sctp_association *asoc;
 
-       if (len != sizeof (struct sctp_rtoinfo))
+       if (len < sizeof (struct sctp_rtoinfo))
                return -EINVAL;
 
-       if (copy_from_user(&rtoinfo, optval, sizeof (struct sctp_rtoinfo)))
+       len = sizeof(struct sctp_rtoinfo);
+
+       if (copy_from_user(&rtoinfo, optval, len))
                return -EFAULT;
 
        asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id);
@@ -4581,11 +4617,12 @@ static int sctp_getsockopt_associnfo(struct sock *sk, int len,
        struct list_head *pos;
        int cnt = 0;
 
-       if (len != sizeof (struct sctp_assocparams))
+       if (len < sizeof (struct sctp_assocparams))
                return -EINVAL;
 
-       if (copy_from_user(&assocparams, optval,
-                       sizeof (struct sctp_assocparams)))
+       len = sizeof(struct sctp_assocparams);
+
+       if (copy_from_user(&assocparams, optval, len))
                return -EFAULT;
 
        asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id);
@@ -4671,9 +4708,11 @@ static int sctp_getsockopt_context(struct sock *sk, int len,
        struct sctp_sock *sp;
        struct sctp_association *asoc;
 
-       if (len != sizeof(struct sctp_assoc_value))
+       if (len < sizeof(struct sctp_assoc_value))
                return -EINVAL;
 
+       len = sizeof(struct sctp_assoc_value);
+
        if (copy_from_user(&params, optval, len))
                return -EFAULT;
 
@@ -6084,8 +6123,11 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
         * queued to the backlog.  This prevents a potential race between
         * backlog processing on the old socket and new-packet processing
         * on the new socket.
+        *
+        * The caller has just allocated newsk so we can guarantee that other
+        * paths won't try to lock it and then oldsk.
         */
-       sctp_lock_sock(newsk);
+       lock_sock_nested(newsk, SINGLE_DEPTH_NESTING);
        sctp_assoc_migrate(assoc, newsk);
 
        /* If the association on the newsk is already closed before accept()
index ebb1bda..2025db5 100644 (file)
@@ -1048,7 +1048,7 @@ static struct platform_driver snd_mts64_driver = {
 /*********************************************************************
  * module init stuff
  *********************************************************************/
-static void __init_or_module snd_mts64_unregister_all(void)
+static void snd_mts64_unregister_all(void)
 {
        int i;
 
index 27acd6f..7de18b5 100644 (file)
@@ -290,7 +290,7 @@ static struct pnp_card_driver sb_pnp_driver = {
 MODULE_DEVICE_TABLE(pnp_card, sb_pnp_card_table);
 #endif /* CONFIG_PNP */
 
-static void __init_or_module sb_unregister_all(void)
+static void sb_unregister_all(void)
 {
 #ifdef CONFIG_PNP
        if (pnp_registered)