ipw2x00: fix sparse warnings
[pandora-kernel.git] / drivers / net / wireless / ipw2x00 / ipw2200.c
index bd4dbcf..8e18d53 100644 (file)
@@ -83,13 +83,13 @@ MODULE_LICENSE("GPL");
 
 static int cmdlog = 0;
 static int debug = 0;
-static int channel = 0;
-static int mode = 0;
+static int default_channel = 0;
+static int network_mode = 0;
 
 static u32 ipw_debug_level;
 static int associate;
 static int auto_create = 1;
-static int led = 0;
+static int led_support = 0;
 static int disable = 0;
 static int bt_coexist = 0;
 static int hwcrypto = 0;
@@ -1527,7 +1527,7 @@ static DEVICE_ATTR(led, S_IWUSR | S_IRUGO, show_led, store_led);
 static ssize_t show_status(struct device *d,
                           struct device_attribute *attr, char *buf)
 {
-       struct ipw_priv *p = d->driver_data;
+       struct ipw_priv *p = dev_get_drvdata(d);
        return sprintf(buf, "0x%08x\n", (int)p->status);
 }
 
@@ -1536,7 +1536,7 @@ static DEVICE_ATTR(status, S_IRUGO, show_status, NULL);
 static ssize_t show_cfg(struct device *d, struct device_attribute *attr,
                        char *buf)
 {
-       struct ipw_priv *p = d->driver_data;
+       struct ipw_priv *p = dev_get_drvdata(d);
        return sprintf(buf, "0x%08x\n", (int)p->config);
 }
 
@@ -1545,7 +1545,7 @@ static DEVICE_ATTR(cfg, S_IRUGO, show_cfg, NULL);
 static ssize_t show_nic_type(struct device *d,
                             struct device_attribute *attr, char *buf)
 {
-       struct ipw_priv *priv = d->driver_data;
+       struct ipw_priv *priv = dev_get_drvdata(d);
        return sprintf(buf, "TYPE: %d\n", priv->nic_type);
 }
 
@@ -1555,7 +1555,7 @@ static ssize_t show_ucode_version(struct device *d,
                                  struct device_attribute *attr, char *buf)
 {
        u32 len = sizeof(u32), tmp = 0;
-       struct ipw_priv *p = d->driver_data;
+       struct ipw_priv *p = dev_get_drvdata(d);
 
        if (ipw_get_ordinal(p, IPW_ORD_STAT_UCODE_VERSION, &tmp, &len))
                return 0;
@@ -1569,7 +1569,7 @@ static ssize_t show_rtc(struct device *d, struct device_attribute *attr,
                        char *buf)
 {
        u32 len = sizeof(u32), tmp = 0;
-       struct ipw_priv *p = d->driver_data;
+       struct ipw_priv *p = dev_get_drvdata(d);
 
        if (ipw_get_ordinal(p, IPW_ORD_STAT_RTC, &tmp, &len))
                return 0;
@@ -1586,14 +1586,15 @@ static DEVICE_ATTR(rtc, S_IWUSR | S_IRUGO, show_rtc, NULL);
 static ssize_t show_eeprom_delay(struct device *d,
                                 struct device_attribute *attr, char *buf)
 {
-       int n = ((struct ipw_priv *)d->driver_data)->eeprom_delay;
+       struct ipw_priv *p = dev_get_drvdata(d);
+       int n = p->eeprom_delay;
        return sprintf(buf, "%i\n", n);
 }
 static ssize_t store_eeprom_delay(struct device *d,
                                  struct device_attribute *attr,
                                  const char *buf, size_t count)
 {
-       struct ipw_priv *p = d->driver_data;
+       struct ipw_priv *p = dev_get_drvdata(d);
        sscanf(buf, "%i", &p->eeprom_delay);
        return strnlen(buf, count);
 }
@@ -1605,7 +1606,7 @@ static ssize_t show_command_event_reg(struct device *d,
                                      struct device_attribute *attr, char *buf)
 {
        u32 reg = 0;
-       struct ipw_priv *p = d->driver_data;
+       struct ipw_priv *p = dev_get_drvdata(d);
 
        reg = ipw_read_reg32(p, IPW_INTERNAL_CMD_EVENT);
        return sprintf(buf, "0x%08x\n", reg);
@@ -1615,7 +1616,7 @@ static ssize_t store_command_event_reg(struct device *d,
                                       const char *buf, size_t count)
 {
        u32 reg;
-       struct ipw_priv *p = d->driver_data;
+       struct ipw_priv *p = dev_get_drvdata(d);
 
        sscanf(buf, "%x", &reg);
        ipw_write_reg32(p, IPW_INTERNAL_CMD_EVENT, reg);
@@ -1629,7 +1630,7 @@ static ssize_t show_mem_gpio_reg(struct device *d,
                                 struct device_attribute *attr, char *buf)
 {
        u32 reg = 0;
-       struct ipw_priv *p = d->driver_data;
+       struct ipw_priv *p = dev_get_drvdata(d);
 
        reg = ipw_read_reg32(p, 0x301100);
        return sprintf(buf, "0x%08x\n", reg);
@@ -1639,7 +1640,7 @@ static ssize_t store_mem_gpio_reg(struct device *d,
                                  const char *buf, size_t count)
 {
        u32 reg;
-       struct ipw_priv *p = d->driver_data;
+       struct ipw_priv *p = dev_get_drvdata(d);
 
        sscanf(buf, "%x", &reg);
        ipw_write_reg32(p, 0x301100, reg);
@@ -1653,7 +1654,7 @@ static ssize_t show_indirect_dword(struct device *d,
                                   struct device_attribute *attr, char *buf)
 {
        u32 reg = 0;
-       struct ipw_priv *priv = d->driver_data;
+       struct ipw_priv *priv = dev_get_drvdata(d);
 
        if (priv->status & STATUS_INDIRECT_DWORD)
                reg = ipw_read_reg32(priv, priv->indirect_dword);
@@ -1666,7 +1667,7 @@ static ssize_t store_indirect_dword(struct device *d,
                                    struct device_attribute *attr,
                                    const char *buf, size_t count)
 {
-       struct ipw_priv *priv = d->driver_data;
+       struct ipw_priv *priv = dev_get_drvdata(d);
 
        sscanf(buf, "%x", &priv->indirect_dword);
        priv->status |= STATUS_INDIRECT_DWORD;
@@ -1680,7 +1681,7 @@ static ssize_t show_indirect_byte(struct device *d,
                                  struct device_attribute *attr, char *buf)
 {
        u8 reg = 0;
-       struct ipw_priv *priv = d->driver_data;
+       struct ipw_priv *priv = dev_get_drvdata(d);
 
        if (priv->status & STATUS_INDIRECT_BYTE)
                reg = ipw_read_reg8(priv, priv->indirect_byte);
@@ -1693,7 +1694,7 @@ static ssize_t store_indirect_byte(struct device *d,
                                   struct device_attribute *attr,
                                   const char *buf, size_t count)
 {
-       struct ipw_priv *priv = d->driver_data;
+       struct ipw_priv *priv = dev_get_drvdata(d);
 
        sscanf(buf, "%x", &priv->indirect_byte);
        priv->status |= STATUS_INDIRECT_BYTE;
@@ -1707,7 +1708,7 @@ static ssize_t show_direct_dword(struct device *d,
                                 struct device_attribute *attr, char *buf)
 {
        u32 reg = 0;
-       struct ipw_priv *priv = d->driver_data;
+       struct ipw_priv *priv = dev_get_drvdata(d);
 
        if (priv->status & STATUS_DIRECT_DWORD)
                reg = ipw_read32(priv, priv->direct_dword);
@@ -1720,7 +1721,7 @@ static ssize_t store_direct_dword(struct device *d,
                                  struct device_attribute *attr,
                                  const char *buf, size_t count)
 {
-       struct ipw_priv *priv = d->driver_data;
+       struct ipw_priv *priv = dev_get_drvdata(d);
 
        sscanf(buf, "%x", &priv->direct_dword);
        priv->status |= STATUS_DIRECT_DWORD;
@@ -1747,7 +1748,7 @@ static ssize_t show_rf_kill(struct device *d, struct device_attribute *attr,
           1 - SW based RF kill active (sysfs)
           2 - HW based RF kill active
           3 - Both HW and SW baed RF kill active */
-       struct ipw_priv *priv = d->driver_data;
+       struct ipw_priv *priv = dev_get_drvdata(d);
        int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) |
            (rf_kill_active(priv) ? 0x2 : 0x0);
        return sprintf(buf, "%i\n", val);
@@ -1791,7 +1792,7 @@ static int ipw_radio_kill_sw(struct ipw_priv *priv, int disable_radio)
 static ssize_t store_rf_kill(struct device *d, struct device_attribute *attr,
                             const char *buf, size_t count)
 {
-       struct ipw_priv *priv = d->driver_data;
+       struct ipw_priv *priv = dev_get_drvdata(d);
 
        ipw_radio_kill_sw(priv, buf[0] == '1');
 
@@ -1803,7 +1804,7 @@ static DEVICE_ATTR(rf_kill, S_IWUSR | S_IRUGO, show_rf_kill, store_rf_kill);
 static ssize_t show_speed_scan(struct device *d, struct device_attribute *attr,
                               char *buf)
 {
-       struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
+       struct ipw_priv *priv = dev_get_drvdata(d);
        int pos = 0, len = 0;
        if (priv->config & CFG_SPEED_SCAN) {
                while (priv->speed_scan[pos] != 0)
@@ -1818,7 +1819,7 @@ static ssize_t show_speed_scan(struct device *d, struct device_attribute *attr,
 static ssize_t store_speed_scan(struct device *d, struct device_attribute *attr,
                                const char *buf, size_t count)
 {
-       struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
+       struct ipw_priv *priv = dev_get_drvdata(d);
        int channel, pos = 0;
        const char *p = buf;
 
@@ -1857,14 +1858,14 @@ static DEVICE_ATTR(speed_scan, S_IWUSR | S_IRUGO, show_speed_scan,
 static ssize_t show_net_stats(struct device *d, struct device_attribute *attr,
                              char *buf)
 {
-       struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
+       struct ipw_priv *priv = dev_get_drvdata(d);
        return sprintf(buf, "%c\n", (priv->config & CFG_NET_STATS) ? '1' : '0');
 }
 
 static ssize_t store_net_stats(struct device *d, struct device_attribute *attr,
                               const char *buf, size_t count)
 {
-       struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
+       struct ipw_priv *priv = dev_get_drvdata(d);
        if (buf[0] == '1')
                priv->config |= CFG_NET_STATS;
        else
@@ -3176,11 +3177,8 @@ static int ipw_load_firmware(struct ipw_priv *priv, u8 * data, size_t len)
        /* Start the Dma */
        rc = ipw_fw_dma_enable(priv);
 
-       if (priv->sram_desc.last_cb_index > 0) {
-               /* the DMA is already ready this would be a bug. */
-               BUG();
-               goto out;
-       }
+       /* the DMA is already ready this would be a bug. */
+       BUG_ON(priv->sram_desc.last_cb_index > 0);
 
        do {
                chunk = (struct fw_chunk *)(data + offset);
@@ -4267,9 +4265,10 @@ static void ipw_gather_stats(struct ipw_priv *priv)
        IPW_DEBUG_STATS("Signal level : %3d%% (%d dBm)\n",
                        signal_quality, rssi);
 
-       quality = min(beacon_quality,
-                     min(rate_quality,
-                         min(tx_quality, min(rx_quality, signal_quality))));
+       quality = min(rx_quality, signal_quality);
+       quality = min(tx_quality, quality);
+       quality = min(rate_quality, quality);
+       quality = min(beacon_quality, quality);
        if (quality == beacon_quality)
                IPW_DEBUG_STATS("Quality (%d%%): Clamped to missed beacons.\n",
                                quality);
@@ -4413,7 +4412,6 @@ static void ipw_rx_notification(struct ipw_priv *priv,
 {
        DECLARE_SSID_BUF(ssid);
        u16 size = le16_to_cpu(notif->size);
-       notif->size = le16_to_cpu(notif->size);
 
        IPW_DEBUG_NOTIF("type = %i (%d bytes)\n", notif->subtype, size);
 
@@ -6103,11 +6101,10 @@ static void ipw_debug_config(struct ipw_priv *priv)
 static void ipw_set_fixed_rate(struct ipw_priv *priv, int mode)
 {
        /* TODO: Verify that this works... */
-       struct ipw_fixed_rate fr = {
-               .tx_rates = priv->rates_mask
-       };
+       struct ipw_fixed_rate fr;
        u32 reg;
        u16 mask = 0;
+       u16 new_tx_rates = priv->rates_mask;
 
        /* Identify 'current FW band' and match it with the fixed
         * Tx rates */
@@ -6119,54 +6116,56 @@ static void ipw_set_fixed_rate(struct ipw_priv *priv, int mode)
                        /* Invalid fixed rate mask */
                        IPW_DEBUG_WX
                            ("invalid fixed rate mask in ipw_set_fixed_rate\n");
-                       fr.tx_rates = 0;
+                       new_tx_rates = 0;
                        break;
                }
 
-               fr.tx_rates >>= IEEE80211_OFDM_SHIFT_MASK_A;
+               new_tx_rates >>= IEEE80211_OFDM_SHIFT_MASK_A;
                break;
 
        default:                /* 2.4Ghz or Mixed */
                /* IEEE_B */
                if (mode == IEEE_B) {
-                       if (fr.tx_rates & ~IEEE80211_CCK_RATES_MASK) {
+                       if (new_tx_rates & ~IEEE80211_CCK_RATES_MASK) {
                                /* Invalid fixed rate mask */
                                IPW_DEBUG_WX
                                    ("invalid fixed rate mask in ipw_set_fixed_rate\n");
-                               fr.tx_rates = 0;
+                               new_tx_rates = 0;
                        }
                        break;
                }
 
                /* IEEE_G */
-               if (fr.tx_rates & ~(IEEE80211_CCK_RATES_MASK |
+               if (new_tx_rates & ~(IEEE80211_CCK_RATES_MASK |
                                    IEEE80211_OFDM_RATES_MASK)) {
                        /* Invalid fixed rate mask */
                        IPW_DEBUG_WX
                            ("invalid fixed rate mask in ipw_set_fixed_rate\n");
-                       fr.tx_rates = 0;
+                       new_tx_rates = 0;
                        break;
                }
 
-               if (IEEE80211_OFDM_RATE_6MB_MASK & fr.tx_rates) {
+               if (IEEE80211_OFDM_RATE_6MB_MASK & new_tx_rates) {
                        mask |= (IEEE80211_OFDM_RATE_6MB_MASK >> 1);
-                       fr.tx_rates &= ~IEEE80211_OFDM_RATE_6MB_MASK;
+                       new_tx_rates &= ~IEEE80211_OFDM_RATE_6MB_MASK;
                }
 
-               if (IEEE80211_OFDM_RATE_9MB_MASK & fr.tx_rates) {
+               if (IEEE80211_OFDM_RATE_9MB_MASK & new_tx_rates) {
                        mask |= (IEEE80211_OFDM_RATE_9MB_MASK >> 1);
-                       fr.tx_rates &= ~IEEE80211_OFDM_RATE_9MB_MASK;
+                       new_tx_rates &= ~IEEE80211_OFDM_RATE_9MB_MASK;
                }
 
-               if (IEEE80211_OFDM_RATE_12MB_MASK & fr.tx_rates) {
+               if (IEEE80211_OFDM_RATE_12MB_MASK & new_tx_rates) {
                        mask |= (IEEE80211_OFDM_RATE_12MB_MASK >> 1);
-                       fr.tx_rates &= ~IEEE80211_OFDM_RATE_12MB_MASK;
+                       new_tx_rates &= ~IEEE80211_OFDM_RATE_12MB_MASK;
                }
 
-               fr.tx_rates |= mask;
+               new_tx_rates |= mask;
                break;
        }
 
+       fr.tx_rates = cpu_to_le16(new_tx_rates);
+
        reg = ipw_read32(priv, IPW_MEM_FIXED_OVERRIDE);
        ipw_write_reg32(priv, reg, *(u32 *) & fr);
 }
@@ -6228,7 +6227,7 @@ static void ipw_add_scan_channels(struct ipw_priv *priv,
                        };
 
                        u8 channel;
-                       while (channel_index < IPW_SCAN_CHANNELS) {
+                       while (channel_index < IPW_SCAN_CHANNELS - 1) {
                                channel =
                                    priv->speed_scan[priv->speed_scan_pos];
                                if (channel == 0) {
@@ -7252,9 +7251,6 @@ static void ipw_bg_qos_activate(struct work_struct *work)
        struct ipw_priv *priv =
                container_of(work, struct ipw_priv, qos_activate);
 
-       if (priv == NULL)
-               return;
-
        mutex_lock(&priv->mutex);
 
        if (priv->status & STATUS_ASSOCIATED)
@@ -7855,7 +7851,7 @@ static void ipw_handle_data_packet_monitor(struct ipw_priv *priv,
 
        /* Convert signal to DBM */
        ipw_rt->rt_dbmsignal = antsignal;
-       ipw_rt->rt_dbmnoise = frame->noise;
+       ipw_rt->rt_dbmnoise = (s8) le16_to_cpu(frame->noise);
 
        /* Convert the channel data and set the flags */
        ipw_rt->rt_channel = cpu_to_le16(ieee80211chan2mhz(received_channel));
@@ -7969,7 +7965,7 @@ static void ipw_handle_promiscuous_rx(struct ipw_priv *priv,
        u16 channel = frame->received_channel;
        u8 phy_flags = frame->antennaAndPhy;
        s8 signal = frame->rssi_dbm - IPW_RSSI_TO_DBM;
-       s8 noise = frame->noise;
+       s8 noise = (s8) le16_to_cpu(frame->noise);
        u8 rate = frame->rate;
        short len = le16_to_cpu(pkt->u.frame.length);
        struct sk_buff *skb;
@@ -8340,7 +8336,7 @@ static void ipw_rx(struct ipw_priv *priv)
                                        .rssi = pkt->u.frame.rssi_dbm -
                                            IPW_RSSI_TO_DBM,
                                        .signal =
-                                           le16_to_cpu(pkt->u.frame.rssi_dbm) -
+                                           pkt->u.frame.rssi_dbm -
                                            IPW_RSSI_TO_DBM + 0x100,
                                        .noise =
                                            le16_to_cpu(pkt->u.frame.noise),
@@ -8522,7 +8518,7 @@ static int ipw_sw_reset(struct ipw_priv *priv, int option)
 
        /* We default to disabling the LED code as right now it causes
         * too many systems to lock up... */
-       if (!led)
+       if (!led_support)
                priv->config |= CFG_NO_LED;
 
        if (associate)
@@ -8544,10 +8540,10 @@ static int ipw_sw_reset(struct ipw_priv *priv, int option)
                IPW_DEBUG_INFO("Radio disabled.\n");
        }
 
-       if (channel != 0) {
+       if (default_channel != 0) {
                priv->config |= CFG_STATIC_CHANNEL;
-               priv->channel = channel;
-               IPW_DEBUG_INFO("Bind to static channel %d\n", channel);
+               priv->channel = default_channel;
+               IPW_DEBUG_INFO("Bind to static channel %d\n", default_channel);
                /* TODO: Validate that provided channel is in range */
        }
 #ifdef CONFIG_IPW2200_QOS
@@ -8555,7 +8551,7 @@ static int ipw_sw_reset(struct ipw_priv *priv, int option)
                     burst_duration_CCK, burst_duration_OFDM);
 #endif                         /* CONFIG_IPW2200_QOS */
 
-       switch (mode) {
+       switch (network_mode) {
        case 1:
                priv->ieee->iw_mode = IW_MODE_ADHOC;
                priv->net_dev->type = ARPHRD_ETHER;
@@ -10186,7 +10182,6 @@ static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb,
 #endif
        struct clx2_queue *q = &txq->q;
        u8 id, hdr_len, unicast;
-       u16 remaining_bytes;
        int fc;
 
        if (!(priv->status & STATUS_ASSOCIATED))
@@ -10225,7 +10220,6 @@ static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb,
 
        tfd->u.data.cmd_id = DINO_CMD_TX;
        tfd->u.data.len = cpu_to_le16(txb->payload_size);
-       remaining_bytes = txb->payload_size;
 
        if (priv->assoc_request.ieee_mode == IPW_B_MODE)
                tfd->u.data.tx_flags_ext |= DCT_FLAG_EXT_MODE_CCK;
@@ -11438,11 +11432,11 @@ static struct pci_device_id card_ids[] = {
        {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2754, 0, 0, 0},
        {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2761, 0, 0, 0},
        {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2762, 0, 0, 0},
-       {PCI_VENDOR_ID_INTEL, 0x104f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       {PCI_VENDOR_ID_INTEL, 0x4220, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* BG */
-       {PCI_VENDOR_ID_INTEL, 0x4221, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* BG */
-       {PCI_VENDOR_ID_INTEL, 0x4223, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* ABG */
-       {PCI_VENDOR_ID_INTEL, 0x4224, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* ABG */
+       {PCI_VDEVICE(INTEL, 0x104f), 0},
+       {PCI_VDEVICE(INTEL, 0x4220), 0},        /* BG */
+       {PCI_VDEVICE(INTEL, 0x4221), 0},        /* BG */
+       {PCI_VDEVICE(INTEL, 0x4223), 0},        /* ABG */
+       {PCI_VDEVICE(INTEL, 0x4224), 0},        /* ABG */
 
        /* required last entry */
        {0,}
@@ -11526,7 +11520,8 @@ static int ipw_prom_stop(struct net_device *dev)
 static int ipw_prom_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        IPW_DEBUG_INFO("prom dev->xmit\n");
-       return -EOPNOTSUPP;
+       dev_kfree_skb(skb);
+       return NETDEV_TX_OK;
 }
 
 static const struct net_device_ops ipw_prom_netdev_ops = {
@@ -11950,13 +11945,13 @@ MODULE_PARM_DESC(associate, "auto associate when scanning (default off)");
 module_param(auto_create, int, 0444);
 MODULE_PARM_DESC(auto_create, "auto create adhoc network (default on)");
 
-module_param(led, int, 0444);
+module_param_named(led, led_support, int, 0444);
 MODULE_PARM_DESC(led, "enable led control on some systems (default 0 off)");
 
 module_param(debug, int, 0444);
 MODULE_PARM_DESC(debug, "debug output mask");
 
-module_param(channel, int, 0444);
+module_param_named(channel, default_channel, int, 0444);
 MODULE_PARM_DESC(channel, "channel to limit associate to (default 0 [ANY])");
 
 #ifdef CONFIG_IPW2200_PROMISCUOUS
@@ -11982,10 +11977,10 @@ MODULE_PARM_DESC(burst_duration_OFDM, "set OFDM burst value");
 #endif                         /* CONFIG_IPW2200_QOS */
 
 #ifdef CONFIG_IPW2200_MONITOR
-module_param(mode, int, 0444);
+module_param_named(mode, network_mode, int, 0444);
 MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS,2=Monitor)");
 #else
-module_param(mode, int, 0444);
+module_param_named(mode, network_mode, int, 0444);
 MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS)");
 #endif