staging: rtl8192e: Clean up MlmeDisassociateRequest
[deliverable/linux.git] / drivers / staging / rtl8192e / r8192E_core.c
index d3046afce0dd93681d112d152e3b9dcf668faf0c..84b56cc27ff7c428a64bdca0f6844377fae644fc 100644 (file)
  * Jerry chuang <wlanfae@realtek.com>
  */
 
-
-#undef RX_DONT_PASS_UL
-#undef DEBUG_EPROM
-#undef DEBUG_RX_VERBOSE
-#undef DUMMY_RX
-#undef DEBUG_ZERO_RX
-#undef DEBUG_RX_SKB
-#undef DEBUG_TX_FRAG
-#undef DEBUG_RX_FRAG
-#undef DEBUG_TX_FILLDESC
-#undef DEBUG_TX
-#undef DEBUG_IRQ
-#undef DEBUG_RX
-#undef DEBUG_RXALLOC
-#undef DEBUG_REGISTERS
-#undef DEBUG_RING
-#undef DEBUG_IRQ_TASKLET
-#undef DEBUG_TX_ALLOC
-#undef DEBUG_TX_DESC
-
 //#define CONFIG_RTL8192_IO_MAP
 #include <linux/vmalloc.h>
 #include <linux/slab.h>
 #endif
 
 //set here to open your trace code. //WB
-u32 rt_global_debug_component =
-               //              COMP_INIT       |
-                       //      COMP_EPROM      |
-               //              COMP_PHY        |
-               //              COMP_RF         |
-//                             COMP_FIRMWARE   |
-                       //      COMP_TRACE      |
-               //              COMP_DOWN       |
-               //              COMP_SWBW       |
-               //              COMP_SEC        |
-//                             COMP_QOS        |
-//                             COMP_RATE       |
-               //              COMP_RECV       |
-               //              COMP_SEND       |
-               //              COMP_POWER      |
-                       //      COMP_EVENTS     |
-                       //      COMP_RESET      |
-                       //      COMP_CMDPKT     |
-                       //      COMP_POWER_TRACKING     |
-                        //     COMP_INTR       |
-                               COMP_ERR ; //always open err flags on
+u32 rt_global_debug_component = COMP_ERR ; //always open err flags on
 
 static DEFINE_PCI_DEVICE_TABLE(rtl8192_pci_id_tbl) = {
        /* Realtek */
@@ -139,9 +99,9 @@ static struct pci_driver rtl8192_pci_driver = {
 static void rtl8192_start_beacon(struct net_device *dev);
 static void rtl8192_stop_beacon(struct net_device *dev);
 static void rtl819x_watchdog_wqcallback(struct work_struct *work);
-static void rtl8192_irq_rx_tasklet(struct r8192_priv *priv);
-static void rtl8192_irq_tx_tasklet(struct r8192_priv *priv);
-static void rtl8192_prepare_beacon(struct r8192_priv *priv);
+static void rtl8192_irq_rx_tasklet(unsigned long arg);
+static void rtl8192_irq_tx_tasklet(unsigned long arg);
+static void rtl8192_prepare_beacon(unsigned long arg);
 static irqreturn_t rtl8192_interrupt(int irq, void *netdev);
 static void rtl819xE_tx_cmd(struct net_device *dev, struct sk_buff *skb);
 static void rtl8192_update_ratr_table(struct net_device* dev);
@@ -192,15 +152,9 @@ static void rtl819x_set_channel_map(u8 channel_plan, struct r8192_priv* priv)
                        Dot11d_Init(ieee);
                        ieee->bGlobalDomain = false;
                         //acturally 8225 & 8256 rf chip only support B,G,24N mode
-                        if ((priv->rf_chip == RF_8225) || (priv->rf_chip == RF_8256))
-                       {
-                               min_chan = 1;
-                               max_chan = 14;
-                       }
-                       else
-                       {
-                               RT_TRACE(COMP_ERR, "unknown rf chip, can't set channel map in function:%s()\n", __FUNCTION__);
-                       }
+                       min_chan = 1;
+                       max_chan = 14;
+
                        if (ChannelPlan[channel_plan].Len != 0){
                                // Clear old channel map
                                memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
@@ -1028,14 +982,6 @@ static void rtl8192_tx_isr(struct net_device *dev, int prio)
 
                kfree_skb(skb);
        }
-       if (prio == MGNT_QUEUE) {
-               if (priv->ieee80211->ack_tx_to_ieee) {
-                       if (rtl8192_is_tx_queue_empty(dev)) {
-                               priv->ieee80211->ack_tx_to_ieee = 0;
-                               ieee80211_ps_tx_ack(priv->ieee80211, 1);
-                       }
-               }
-       }
 
        if (prio != BEACON_QUEUE) {
                /* try to deal with the pending packets  */
@@ -1880,25 +1826,9 @@ static void rtl8192_refresh_supportrate(struct r8192_priv* priv)
                memset(ieee->Regdot11HTOperationalRateSet, 0, 16);
 }
 
-static u8 rtl8192_getSupportedWireleeMode(struct net_device*dev)
+static u8 rtl8192_getSupportedWireleeMode(struct net_device *dev)
 {
-       struct r8192_priv *priv = ieee80211_priv(dev);
-       u8 ret = 0;
-       switch(priv->rf_chip)
-       {
-               case RF_8225:
-               case RF_8256:
-               case RF_PSEUDO_11N:
-                       ret = (WIRELESS_MODE_N_24G|WIRELESS_MODE_G|WIRELESS_MODE_B);
-                       break;
-               case RF_8258:
-                       ret = (WIRELESS_MODE_A|WIRELESS_MODE_N_5G);
-                       break;
-               default:
-                       ret = WIRELESS_MODE_B;
-                       break;
-       }
-       return ret;
+       return (WIRELESS_MODE_N_24G|WIRELESS_MODE_G|WIRELESS_MODE_B);
 }
 
 static void rtl8192_SetWirelessMode(struct net_device* dev, u8 wireless_mode)
@@ -2025,11 +1955,10 @@ void rtl8192_hw_wakeup_wq (struct work_struct *work)
 static void rtl8192_hw_to_sleep(struct net_device *dev, u32 th, u32 tl)
 {
        struct r8192_priv *priv = ieee80211_priv(dev);
-
+       u32 tmp;
        u32 rb = jiffies;
-       unsigned long flags;
 
-       spin_lock_irqsave(&priv->ps_lock,flags);
+       spin_lock(&priv->ps_lock);
 
        // Writing HW register with 0 equals to disable
        // the timer, that is not really what we want
@@ -2042,28 +1971,25 @@ static void rtl8192_hw_to_sleep(struct net_device *dev, u32 th, u32 tl)
        //
        if(((tl>=rb)&& (tl-rb) <= MSECS(MIN_SLEEP_TIME))
                        ||((rb>tl)&& (rb-tl) < MSECS(MIN_SLEEP_TIME))) {
-               spin_unlock_irqrestore(&priv->ps_lock,flags);
                printk("too short to sleep::%x, %x, %lx\n",tl, rb,  MSECS(MIN_SLEEP_TIME));
-               return;
+               goto out_unlock;
        }
 
        if(((tl > rb) && ((tl-rb) > MSECS(MAX_SLEEP_TIME)))||
                        ((tl < rb) && (tl>MSECS(69)) && ((rb-tl) > MSECS(MAX_SLEEP_TIME)))||
                        ((tl<rb)&&(tl<MSECS(69))&&((tl+0xffffffff-rb)>MSECS(MAX_SLEEP_TIME)))) {
                printk("========>too long to sleep:%x, %x, %lx\n", tl, rb,  MSECS(MAX_SLEEP_TIME));
-               spin_unlock_irqrestore(&priv->ps_lock,flags);
-               return;
-       }
-       {
-               u32 tmp = (tl>rb)?(tl-rb):(rb-tl);
-               queue_delayed_work(priv->ieee80211->wq,
-                               &priv->ieee80211->hw_wakeup_wq,tmp);
-               //PowerSave not supported when kernel version less 2.6.20
+               goto out_unlock;
        }
+
+       tmp = (tl>rb)?(tl-rb):(rb-tl);
        queue_delayed_work(priv->ieee80211->wq,
-                       (void *)&priv->ieee80211->hw_sleep_wq,0);
-       spin_unlock_irqrestore(&priv->ps_lock,flags);
+                          &priv->ieee80211->hw_wakeup_wq,tmp);
 
+       queue_delayed_work(priv->ieee80211->wq,
+                       (void *)&priv->ieee80211->hw_sleep_wq,0);
+out_unlock:
+       spin_unlock(&priv->ps_lock);
 }
 
 static void rtl8192_init_priv_variable(struct net_device* dev)
@@ -2223,7 +2149,7 @@ static void rtl8192_init_priv_task(struct net_device* dev)
        priv->priv_wq = create_workqueue(DRV_NAME);
 
 #ifdef ENABLE_IPS
-       INIT_WORK(&priv->ieee80211->ips_leave_wq, (void*)IPSLeave_wq);
+       INIT_WORK(&priv->ieee80211->ips_leave_wq, IPSLeave_wq);
 #endif
 
 //     INIT_WORK(&priv->reset_wq, (void(*)(void*)) rtl8192_restart);
@@ -2236,18 +2162,15 @@ static void rtl8192_init_priv_task(struct net_device* dev)
        //INIT_WORK(&priv->SwChnlWorkItem,  rtl8192_SwChnl_WorkItem);
        //INIT_WORK(&priv->SetBWModeWorkItem,  rtl8192_SetBWModeWorkItem);
        INIT_WORK(&priv->qos_activate, rtl8192_qos_activate);
-       INIT_DELAYED_WORK(&priv->ieee80211->hw_wakeup_wq,(void*) rtl8192_hw_wakeup_wq);
-       INIT_DELAYED_WORK(&priv->ieee80211->hw_sleep_wq,(void*) rtl8192_hw_sleep_wq);
+       INIT_DELAYED_WORK(&priv->ieee80211->hw_wakeup_wq, rtl8192_hw_wakeup_wq);
+       INIT_DELAYED_WORK(&priv->ieee80211->hw_sleep_wq, rtl8192_hw_sleep_wq);
 
-       tasklet_init(&priv->irq_rx_tasklet,
-            (void(*)(unsigned long))rtl8192_irq_rx_tasklet,
-            (unsigned long)priv);
-       tasklet_init(&priv->irq_tx_tasklet,
-            (void(*)(unsigned long))rtl8192_irq_tx_tasklet,
-            (unsigned long)priv);
-        tasklet_init(&priv->irq_prepare_beacon_tasklet,
-                (void(*)(unsigned long))rtl8192_prepare_beacon,
-                (unsigned long)priv);
+       tasklet_init(&priv->irq_rx_tasklet, rtl8192_irq_rx_tasklet,
+                    (unsigned long) priv);
+       tasklet_init(&priv->irq_tx_tasklet, rtl8192_irq_tx_tasklet,
+                    (unsigned long) priv);
+        tasklet_init(&priv->irq_prepare_beacon_tasklet, rtl8192_prepare_beacon,
+                    (unsigned long) priv);
 }
 
 static void rtl8192_get_eeprom_size(struct net_device* dev)
@@ -2535,8 +2458,6 @@ static void rtl8192_read_eeprom_info(struct r8192_priv *priv)
 
        //1 Make a copy for following variables and we can change them if we want
 
-       priv->rf_chip= RF_8256;
-
        if(priv->RegChannelPlan == 0xf)
        {
                priv->ChannelPlan = priv->eeprom_ChannelPlan;
@@ -3142,8 +3063,9 @@ static RT_STATUS rtl8192_adapter_start(struct net_device *dev)
 
 }
 
-static void rtl8192_prepare_beacon(struct r8192_priv *priv)
+static void rtl8192_prepare_beacon(unsigned long arg)
 {
+       struct r8192_priv *priv = (struct r8192_priv*) arg;
        struct sk_buff *skb;
        //unsigned long flags;
        cb_desc *tcb_desc;
@@ -3181,7 +3103,6 @@ static void rtl8192_start_beacon(struct net_device *dev)
         u16 BcnIFS = 0xf;
 
        DMESG("Enabling beacon TX");
-       //rtl8192_prepare_beacon(dev);
        rtl8192_irq_disable(dev);
        //rtl8192_beacon_tx_enable(dev);
 
@@ -3832,9 +3753,9 @@ IPSLeave(struct net_device *dev)
        }
 }
 
-void IPSLeave_wq(void *data)
+void IPSLeave_wq(struct work_struct *work)
 {
-       struct ieee80211_device *ieee = container_of(data,struct ieee80211_device,ips_leave_wq);
+       struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, ips_leave_wq);
        struct net_device *dev = ieee->dev;
 
        struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
@@ -4175,23 +4096,8 @@ static void rtl8192_restart(struct work_struct *work)
 static void r8192_set_multicast(struct net_device *dev)
 {
        struct r8192_priv *priv = ieee80211_priv(dev);
-       short promisc;
-
-       //down(&priv->wx_sem);
-
-       /* FIXME FIXME */
-
-       promisc = (dev->flags & IFF_PROMISC) ? 1:0;
-
-       if (promisc != priv->promisc) {
-               ;
-       //      rtl8192_commit(dev);
-       }
 
-       priv->promisc = promisc;
-
-       //schedule_work(&priv->reset_wq);
-       //up(&priv->wx_sem);
+       priv->promisc = (dev->flags & IFF_PROMISC) ? 1 : 0;
 }
 
 
@@ -5010,9 +4916,26 @@ static void rtl8192_tx_resume(struct net_device *dev)
        }
 }
 
-static void rtl8192_irq_tx_tasklet(struct r8192_priv *priv)
+static void rtl8192_irq_tx_tasklet(unsigned long arg)
 {
-       rtl8192_tx_resume(priv->ieee80211->dev);
+       struct r8192_priv *priv = (struct r8192_priv*) arg;
+       struct rtl8192_tx_ring *mgnt_ring = &priv->tx_ring[MGNT_QUEUE];
+       struct net_device *dev = priv->ieee80211->dev;
+       unsigned long flags;
+
+       /* check if we need to report that the management queue is drained */
+       spin_lock_irqsave(&priv->irq_th_lock, flags);
+
+       if (!skb_queue_len(&mgnt_ring->queue) &&
+           priv->ieee80211->ack_tx_to_ieee &&
+           rtl8192_is_tx_queue_empty(dev)) {
+               priv->ieee80211->ack_tx_to_ieee = 0;
+               ieee80211_ps_tx_ack(priv->ieee80211, 1);
+       }
+
+       spin_unlock_irqrestore(&priv->irq_th_lock, flags);
+
+       rtl8192_tx_resume(dev);
 }
 
 /* Record the received data rate */
@@ -5093,15 +5016,17 @@ static void rtl8192_rx(struct net_device *dev)
         .freq = IEEE80211_24GHZ_BAND,
     };
     unsigned int count = priv->rxringcount;
+    prx_fwinfo_819x_pci pDrvInfo = NULL;
+    struct sk_buff *new_skb;
 
     while (count--) {
         rx_desc_819x_pci *pdesc = &priv->rx_ring[priv->rx_idx];//rx descriptor
         struct sk_buff *skb = priv->rx_buf[priv->rx_idx];//rx pkt
 
-        if (pdesc->OWN){
+        if (pdesc->OWN)
             /* wait data to be filled by hardware */
             return;
-        } else {
+
             stats.bICV = pdesc->ICV;
             stats.bCRC = pdesc->CRC32;
             stats.bHwError = pdesc->CRC32 | pdesc->ICV;
@@ -5113,13 +5038,12 @@ static void rtl8192_rx(struct net_device *dev)
             if(stats.bHwError) {
                 stats.bShift = false;
                 goto done;
-            } else {
-                prx_fwinfo_819x_pci pDrvInfo = NULL;
-                struct sk_buff *new_skb = dev_alloc_skb(priv->rxbuffersize);
+            }
+                pDrvInfo = NULL;
+                new_skb = dev_alloc_skb(priv->rxbuffersize);
 
-                if (unlikely(!new_skb)) {
+                if (unlikely(!new_skb))
                     goto done;
-                }
 
                 stats.RxDrvInfoSize = pdesc->RxDrvInfoSize;
                 stats.RxBufShift = ((pdesc->Shift)&0x03);
@@ -5198,9 +5122,7 @@ static void rtl8192_rx(struct net_device *dev)
                 skb = new_skb;
                 priv->rx_buf[priv->rx_idx] = skb;
                 *((dma_addr_t *) skb->cb) = pci_map_single(priv->pdev, skb_tail_pointer(skb), priv->rxbuffersize, PCI_DMA_FROMDEVICE);
-            }
 
-        }
 done:
         pdesc->BufferAddress = cpu_to_le32(*((dma_addr_t *)skb->cb));
         pdesc->OWN = 1;
@@ -5212,8 +5134,9 @@ done:
 
 }
 
-static void rtl8192_irq_rx_tasklet(struct r8192_priv *priv)
+static void rtl8192_irq_rx_tasklet(unsigned long arg)
 {
+       struct r8192_priv *priv = (struct r8192_priv*) arg;
        rtl8192_rx(priv->ieee80211->dev);
        /* unmask RDU */
        write_nic_dword(priv, INTA_MASK, read_nic_dword(priv, INTA_MASK) | IMR_RDU);
@@ -5424,12 +5347,13 @@ static void __devexit rtl8192_pci_disconnect(struct pci_dev *pdev)
 {
        struct net_device *dev = pci_get_drvdata(pdev);
        struct r8192_priv *priv ;
+       u32 i;
 
-       if(dev){
+       if (dev) {
 
                unregister_netdev(dev);
 
-               priv=ieee80211_priv(dev);
+               priv = ieee80211_priv(dev);
 
                rtl8192_proc_remove_one(dev);
 
@@ -5439,27 +5363,17 @@ static void __devexit rtl8192_pci_disconnect(struct pci_dev *pdev)
                        vfree(priv->pFirmware);
                        priv->pFirmware = NULL;
                }
-       //      priv->rf_close(dev);
-       //      rtl8192_usb_deleteendpoints(dev);
                destroy_workqueue(priv->priv_wq);
-                /* redundant with rtl8192_down */
-               // rtl8192_irq_disable(dev);
-               // rtl8192_reset(dev);
-               // mdelay(10);
-                {
-                    u32 i;
-                    /* free tx/rx rings */
-                    rtl8192_free_rx_ring(dev);
-                    for (i = 0; i < MAX_TX_QUEUE_COUNT; i++) {
-                        rtl8192_free_tx_ring(dev, i);
-                    }
-                }
-               if(priv->irq){
 
+               /* free tx/rx rings */
+               rtl8192_free_rx_ring(dev);
+               for (i = 0; i < MAX_TX_QUEUE_COUNT; i++)
+                       rtl8192_free_tx_ring(dev, i);
+
+               if (priv->irq) {
                        printk("Freeing irq %d\n",dev->irq);
                        free_irq(dev->irq, dev);
                        priv->irq=0;
-
                }
 
 #ifdef CONFIG_RTL8180_IO_MAP
This page took 0.03005 seconds and 5 git commands to generate.