Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab...
[pandora-kernel.git] / drivers / staging / brcm80211 / brcmfmac / wl_iw.c
index b49957f..15e1b05 100644 (file)
@@ -64,13 +64,9 @@ wl_iw_extra_params_t g_wl_iw_params;
 extern bool wl_iw_conn_status_str(u32 event_type, u32 status,
                                  u32 reason, char *stringBuf, uint buflen);
 
-uint wl_msg_level = WL_ERROR_VAL;
-
 #define MAX_WLIW_IOCTL_LEN 1024
 
 #ifdef CONFIG_WIRELESS_EXT
-
-extern struct iw_statistics *dhd_get_wireless_stats(struct net_device *dev);
 extern int dhd_wait_pend8021x(struct net_device *dev);
 #endif
 
@@ -119,6 +115,9 @@ iscan_info_t *g_iscan;
 
 static const u8 ether_bcast[ETH_ALEN] = {255, 255, 255, 255, 255, 255};
 
+/* Global ASSERT type flag */
+u32 g_assert_type;
+
 static void wl_iw_timerfunc(unsigned long data);
 static void wl_iw_set_event_mask(struct net_device *dev);
 static int wl_iw_iscan(iscan_info_t *iscan, wlc_ssid_t *ssid, u16 action);
@@ -372,7 +371,7 @@ wl_iw_set_freq(struct net_device *dev,
                if (fwrq->m > 4000 && fwrq->m < 5000)
                        sf = WF_CHAN_FACTOR_4_G;
 
-               chan = wf_mhz2channel(fwrq->m, sf);
+               chan = bcm_mhz2channel(fwrq->m, sf);
        }
        chan = cpu_to_le32(chan);
 
@@ -495,9 +494,7 @@ wl_iw_get_range(struct net_device *dev,
        list = (wl_u32_list_t *) channels;
 
        dwrq->length = sizeof(struct iw_range);
-       memset(range, 0, sizeof(range));
-
-       range->min_nwid = range->max_nwid = 0;
+       memset(range, 0, sizeof(*range));
 
        list->count = cpu_to_le32(MAXCHANNEL);
        error = dev_wlc_ioctl(dev, WLC_GET_VALID_CHANNELS, channels,
@@ -3131,7 +3128,7 @@ const struct iw_handler_def wl_iw_handler_def = {
        .private_args = 0,
 
 #if WIRELESS_EXT >= 19
-       .get_wireless_stats = dhd_get_wireless_stats,
+       .get_wireless_stats = NULL,
 #endif
 };
 #endif                         /* WIRELESS_EXT > 12 */
@@ -3548,103 +3545,6 @@ void wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void *data)
 #endif                         /* WIRELESS_EXT > 13 */
 }
 
-int
-wl_iw_get_wireless_stats(struct net_device *dev, struct iw_statistics *wstats)
-{
-       int res = 0;
-       struct wl_cnt cnt;
-       int phy_noise;
-       int rssi;
-       scb_val_t scb_val;
-
-       phy_noise = 0;
-       res = dev_wlc_ioctl(dev, WLC_GET_PHY_NOISE, &phy_noise,
-                               sizeof(phy_noise));
-       if (res)
-               goto done;
-
-       phy_noise = le32_to_cpu(phy_noise);
-       WL_TRACE("wl_iw_get_wireless_stats phy noise=%d\n", phy_noise);
-
-       memset(&scb_val, 0, sizeof(scb_val_t));
-       res = dev_wlc_ioctl(dev, WLC_GET_RSSI, &scb_val, sizeof(scb_val_t));
-       if (res)
-               goto done;
-
-       rssi = le32_to_cpu(scb_val.val);
-       WL_TRACE("wl_iw_get_wireless_stats rssi=%d\n", rssi);
-       if (rssi <= WL_IW_RSSI_NO_SIGNAL)
-               wstats->qual.qual = 0;
-       else if (rssi <= WL_IW_RSSI_VERY_LOW)
-               wstats->qual.qual = 1;
-       else if (rssi <= WL_IW_RSSI_LOW)
-               wstats->qual.qual = 2;
-       else if (rssi <= WL_IW_RSSI_GOOD)
-               wstats->qual.qual = 3;
-       else if (rssi <= WL_IW_RSSI_VERY_GOOD)
-               wstats->qual.qual = 4;
-       else
-               wstats->qual.qual = 5;
-
-       wstats->qual.level = 0x100 + rssi;
-       wstats->qual.noise = 0x100 + phy_noise;
-#if WIRELESS_EXT > 18
-       wstats->qual.updated |= (IW_QUAL_ALL_UPDATED | IW_QUAL_DBM);
-#else
-       wstats->qual.updated |= 7;
-#endif
-
-#if WIRELESS_EXT > 11
-       WL_TRACE("wl_iw_get_wireless_stats counters=%zu\n",
-                sizeof(struct wl_cnt));
-
-       memset(&cnt, 0, sizeof(struct wl_cnt));
-       res =
-           dev_wlc_bufvar_get(dev, "counters", (char *)&cnt,
-                              sizeof(struct wl_cnt));
-       if (res) {
-               WL_ERROR("wl_iw_get_wireless_stats counters failed error=%d\n",
-                        res);
-               goto done;
-       }
-
-       cnt.version = le16_to_cpu(cnt.version);
-       if (cnt.version != WL_CNT_T_VERSION) {
-               WL_TRACE("\tIncorrect counter version: expected %d; got %d\n",
-                        WL_CNT_T_VERSION, cnt.version);
-               goto done;
-       }
-
-       wstats->discard.nwid = 0;
-       wstats->discard.code = le32_to_cpu(cnt.rxundec);
-       wstats->discard.fragment = le32_to_cpu(cnt.rxfragerr);
-       wstats->discard.retries = le32_to_cpu(cnt.txfail);
-       wstats->discard.misc = le32_to_cpu(cnt.rxrunt) +
-               le32_to_cpu(cnt.rxgiant);
-       wstats->miss.beacon = 0;
-
-       WL_TRACE("wl_iw_get_wireless_stats counters txframe=%d txbyte=%d\n",
-                le32_to_cpu(cnt.txframe), le32_to_cpu(cnt.txbyte));
-       WL_TRACE("wl_iw_get_wireless_stats counters rxfrmtoolong=%d\n",
-                 le32_to_cpu(cnt.rxfrmtoolong));
-       WL_TRACE("wl_iw_get_wireless_stats counters rxbadplcp=%d\n",
-                 le32_to_cpu(cnt.rxbadplcp));
-       WL_TRACE("wl_iw_get_wireless_stats counters rxundec=%d\n",
-                 le32_to_cpu(cnt.rxundec));
-       WL_TRACE("wl_iw_get_wireless_stats counters rxfragerr=%d\n",
-                 le32_to_cpu(cnt.rxfragerr));
-       WL_TRACE("wl_iw_get_wireless_stats counters txfail=%d\n",
-                 le32_to_cpu(cnt.txfail));
-       WL_TRACE("wl_iw_get_wireless_stats counters rxrunt=%d\n",
-                 le32_to_cpu(cnt.rxrunt));
-       WL_TRACE("wl_iw_get_wireless_stats counters rxgiant=%d\n",
-                 le32_to_cpu(cnt.rxgiant));
-#endif                         /* WIRELESS_EXT > 11 */
-
-done:
-       return res;
-}
-
 int wl_iw_attach(struct net_device *dev, void *dhdp)
 {
        int params_size;
@@ -3672,8 +3572,10 @@ int wl_iw_attach(struct net_device *dev, void *dhdp)
                return -ENOMEM;
 
        iscan->iscan_ex_params_p = kmalloc(params_size, GFP_KERNEL);
-       if (!iscan->iscan_ex_params_p)
+       if (!iscan->iscan_ex_params_p) {
+               kfree(iscan);
                return -ENOMEM;
+       }
        iscan->iscan_ex_param_size = params_size;
        iscan->sysioc_tsk = NULL;
 
@@ -3742,3 +3644,50 @@ void wl_iw_detach(void)
 
        g_scan = NULL;
 }
+
+#if defined(BCMDBG)
+void osl_assert(char *exp, char *file, int line)
+{
+       char tempbuf[256];
+       char *basename;
+
+       basename = strrchr(file, '/');
+       /* skip the '/' */
+       if (basename)
+               basename++;
+
+       if (!basename)
+               basename = file;
+
+       snprintf(tempbuf, 256,
+                "assertion \"%s\" failed: file \"%s\", line %d\n", exp,
+                basename, line);
+
+       /*
+        * Print assert message and give it time to
+        * be written to /var/log/messages
+        */
+       if (!in_interrupt()) {
+               const int delay = 3;
+               printk(KERN_ERR "%s", tempbuf);
+               printk(KERN_ERR "panic in %d seconds\n", delay);
+               set_current_state(TASK_INTERRUPTIBLE);
+               schedule_timeout(delay * HZ);
+       }
+
+       switch (g_assert_type) {
+       case 0:
+               panic(KERN_ERR "%s", tempbuf);
+               break;
+       case 1:
+               printk(KERN_ERR "%s", tempbuf);
+               BUG();
+               break;
+       case 2:
+               printk(KERN_ERR "%s", tempbuf);
+               break;
+       default:
+               break;
+       }
+}
+#endif                         /* defined(BCMDBG) */