GNU Linux-libre 5.10.153-gnu1
[releases.git] / drivers / staging / rtl8192e / rtl8192e / rtl_core.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
4  *
5  * Based on the r8180 driver, which is:
6  * Copyright 2004-2005 Andrea Merello <andrea.merello@gmail.com>, et al.
7  *
8  * Contact Information: wlanfae <wlanfae@realtek.com>
9  */
10 #include <linux/uaccess.h>
11 #include <linux/pci.h>
12 #include <linux/vmalloc.h>
13 #include <linux/ieee80211.h>
14 #include "rtl_core.h"
15 #include "r8192E_phy.h"
16 #include "r8192E_phyreg.h"
17 #include "r8190P_rtl8256.h"
18 #include "r8192E_cmdpkt.h"
19
20 #include "rtl_wx.h"
21 #include "rtl_dm.h"
22
23 #include "rtl_pm.h"
24
25 int hwwep = 1;
26 static int channels = 0x3fff;
27 static char *ifname = "wlan%d";
28
29
30 static const struct rtl819x_ops rtl819xp_ops = {
31         .nic_type                       = NIC_8192E,
32         .get_eeprom_size                = rtl92e_get_eeprom_size,
33         .init_adapter_variable          = rtl92e_init_variables,
34         .initialize_adapter             = rtl92e_start_adapter,
35         .link_change                    = rtl92e_link_change,
36         .tx_fill_descriptor             = rtl92e_fill_tx_desc,
37         .tx_fill_cmd_descriptor         = rtl92e_fill_tx_cmd_desc,
38         .rx_query_status_descriptor     = rtl92e_get_rx_stats,
39         .rx_command_packet_handler = NULL,
40         .stop_adapter                   = rtl92e_stop_adapter,
41         .update_ratr_table              = rtl92e_update_ratr_table,
42         .irq_enable                     = rtl92e_enable_irq,
43         .irq_disable                    = rtl92e_disable_irq,
44         .irq_clear                      = rtl92e_clear_irq,
45         .rx_enable                      = rtl92e_enable_rx,
46         .tx_enable                      = rtl92e_enable_tx,
47         .interrupt_recognized           = rtl92e_ack_irq,
48         .TxCheckStuckHandler            = rtl92e_is_tx_stuck,
49         .RxCheckStuckHandler            = rtl92e_is_rx_stuck,
50 };
51
52 static struct pci_device_id rtl8192_pci_id_tbl[] = {
53         {RTL_PCI_DEVICE(0x10ec, 0x8192, rtl819xp_ops)},
54         {RTL_PCI_DEVICE(0x07aa, 0x0044, rtl819xp_ops)},
55         {RTL_PCI_DEVICE(0x07aa, 0x0047, rtl819xp_ops)},
56         {}
57 };
58
59 MODULE_DEVICE_TABLE(pci, rtl8192_pci_id_tbl);
60
61 static int _rtl92e_pci_probe(struct pci_dev *pdev,
62                              const struct pci_device_id *id);
63 static void _rtl92e_pci_disconnect(struct pci_dev *pdev);
64 static irqreturn_t _rtl92e_irq(int irq, void *netdev);
65
66 static SIMPLE_DEV_PM_OPS(rtl92e_pm_ops, rtl92e_suspend, rtl92e_resume);
67
68 static struct pci_driver rtl8192_pci_driver = {
69         .name = DRV_NAME,       /* Driver name   */
70         .id_table = rtl8192_pci_id_tbl, /* PCI_ID table  */
71         .probe  = _rtl92e_pci_probe,    /* probe fn      */
72         .remove  = _rtl92e_pci_disconnect,      /* remove fn */
73         .driver.pm = &rtl92e_pm_ops,
74 };
75
76 static short _rtl92e_is_tx_queue_empty(struct net_device *dev);
77 static void _rtl92e_watchdog_wq_cb(void *data);
78 static void _rtl92e_watchdog_timer_cb(struct timer_list *t);
79 static void _rtl92e_hard_data_xmit(struct sk_buff *skb, struct net_device *dev,
80                                    int rate);
81 static int _rtl92e_hard_start_xmit(struct sk_buff *skb, struct net_device *dev);
82 static void _rtl92e_tx_cmd(struct net_device *dev, struct sk_buff *skb);
83 static short _rtl92e_tx(struct net_device *dev, struct sk_buff *skb);
84 static short _rtl92e_pci_initdescring(struct net_device *dev);
85 static void _rtl92e_irq_tx_tasklet(struct tasklet_struct *t);
86 static void _rtl92e_irq_rx_tasklet(struct tasklet_struct *t);
87 static void _rtl92e_cancel_deferred_work(struct r8192_priv *priv);
88 static int _rtl92e_up(struct net_device *dev, bool is_silent_reset);
89 static int _rtl92e_try_up(struct net_device *dev);
90 static int _rtl92e_down(struct net_device *dev, bool shutdownrf);
91 static void _rtl92e_restart(void *data);
92
93 /****************************************************************************
94  *  -----------------------------IO STUFF-------------------------
95  ****************************************************************************/
96
97 u8 rtl92e_readb(struct net_device *dev, int x)
98 {
99         return 0xff & readb((u8 __iomem *)dev->mem_start + x);
100 }
101
102 u32 rtl92e_readl(struct net_device *dev, int x)
103 {
104         return readl((u8 __iomem *)dev->mem_start + x);
105 }
106
107 u16 rtl92e_readw(struct net_device *dev, int x)
108 {
109         return readw((u8 __iomem *)dev->mem_start + x);
110 }
111
112 void rtl92e_writeb(struct net_device *dev, int x, u8 y)
113 {
114         writeb(y, (u8 __iomem *)dev->mem_start + x);
115
116         udelay(20);
117 }
118
119 void rtl92e_writel(struct net_device *dev, int x, u32 y)
120 {
121         writel(y, (u8 __iomem *)dev->mem_start + x);
122
123         udelay(20);
124 }
125
126 void rtl92e_writew(struct net_device *dev, int x, u16 y)
127 {
128         writew(y, (u8 __iomem *)dev->mem_start + x);
129
130         udelay(20);
131 }
132
133 /****************************************************************************
134  *  -----------------------------GENERAL FUNCTION-------------------------
135  ****************************************************************************/
136 bool rtl92e_set_rf_state(struct net_device *dev,
137                          enum rt_rf_power_state StateToSet,
138                          RT_RF_CHANGE_SOURCE ChangeSource)
139 {
140         struct r8192_priv *priv = rtllib_priv(dev);
141         struct rtllib_device *ieee = priv->rtllib;
142         bool                    bActionAllowed = false;
143         bool                    bConnectBySSID = false;
144         enum rt_rf_power_state rtState;
145         u16                     RFWaitCounter = 0;
146         unsigned long flag;
147
148         RT_TRACE((COMP_PS | COMP_RF),
149                  "===>%s: StateToSet(%d)\n", __func__, StateToSet);
150
151         while (true) {
152                 spin_lock_irqsave(&priv->rf_ps_lock, flag);
153                 if (priv->RFChangeInProgress) {
154                         spin_unlock_irqrestore(&priv->rf_ps_lock, flag);
155                         RT_TRACE((COMP_PS | COMP_RF),
156                                  "%s: RF Change in progress! Wait to set..StateToSet(%d).\n",
157                                  __func__, StateToSet);
158
159                         while (priv->RFChangeInProgress) {
160                                 RFWaitCounter++;
161                                 RT_TRACE((COMP_PS | COMP_RF),
162                                          "%s: Wait 1 ms (%d times)...\n",
163                                          __func__, RFWaitCounter);
164                                 mdelay(1);
165
166                                 if (RFWaitCounter > 100) {
167                                         netdev_warn(dev,
168                                                     "%s(): Timeout waiting for RF change.\n",
169                                                     __func__);
170                                         return false;
171                                 }
172                         }
173                 } else {
174                         priv->RFChangeInProgress = true;
175                         spin_unlock_irqrestore(&priv->rf_ps_lock, flag);
176                         break;
177                 }
178         }
179
180         rtState = priv->rtllib->eRFPowerState;
181
182         switch (StateToSet) {
183         case eRfOn:
184                 priv->rtllib->RfOffReason &= (~ChangeSource);
185
186                 if ((ChangeSource == RF_CHANGE_BY_HW) && priv->bHwRadioOff)
187                         priv->bHwRadioOff = false;
188
189                 if (!priv->rtllib->RfOffReason) {
190                         priv->rtllib->RfOffReason = 0;
191                         bActionAllowed = true;
192
193
194                         if (rtState == eRfOff &&
195                             ChangeSource >= RF_CHANGE_BY_HW)
196                                 bConnectBySSID = true;
197                 } else {
198                         RT_TRACE((COMP_PS | COMP_RF),
199                                  "%s - eRfon reject pMgntInfo->RfOffReason= 0x%x, ChangeSource=0x%X\n",
200                                  __func__, priv->rtllib->RfOffReason, ChangeSource);
201         }
202
203                 break;
204
205         case eRfOff:
206
207                 if ((priv->rtllib->iw_mode == IW_MODE_INFRA) ||
208                     (priv->rtllib->iw_mode == IW_MODE_ADHOC)) {
209                         if ((priv->rtllib->RfOffReason > RF_CHANGE_BY_IPS) ||
210                             (ChangeSource > RF_CHANGE_BY_IPS)) {
211                                 if (ieee->state == RTLLIB_LINKED)
212                                         priv->blinked_ingpio = true;
213                                 else
214                                         priv->blinked_ingpio = false;
215                                 rtllib_MgntDisconnect(priv->rtllib,
216                                                       WLAN_REASON_DISASSOC_STA_HAS_LEFT);
217                         }
218                 }
219                 if ((ChangeSource == RF_CHANGE_BY_HW) && !priv->bHwRadioOff)
220                         priv->bHwRadioOff = true;
221                 priv->rtllib->RfOffReason |= ChangeSource;
222                 bActionAllowed = true;
223                 break;
224
225         case eRfSleep:
226                 priv->rtllib->RfOffReason |= ChangeSource;
227                 bActionAllowed = true;
228                 break;
229
230         default:
231                 break;
232         }
233
234         if (bActionAllowed) {
235                 RT_TRACE((COMP_PS | COMP_RF),
236                          "%s: Action is allowed.... StateToSet(%d), RfOffReason(%#X)\n",
237                          __func__, StateToSet, priv->rtllib->RfOffReason);
238                 PHY_SetRFPowerState(dev, StateToSet);
239                 if (StateToSet == eRfOn) {
240
241                         if (bConnectBySSID && priv->blinked_ingpio) {
242                                 schedule_delayed_work(
243                                          &ieee->associate_procedure_wq, 0);
244                                 priv->blinked_ingpio = false;
245                         }
246                 }
247         } else {
248                 RT_TRACE((COMP_PS | COMP_RF),
249                          "%s: Action is rejected.... StateToSet(%d), ChangeSource(%#X), RfOffReason(%#X)\n",
250                          __func__, StateToSet, ChangeSource, priv->rtllib->RfOffReason);
251         }
252
253         spin_lock_irqsave(&priv->rf_ps_lock, flag);
254         priv->RFChangeInProgress = false;
255         spin_unlock_irqrestore(&priv->rf_ps_lock, flag);
256
257         RT_TRACE((COMP_PS | COMP_RF), "<===%s\n", __func__);
258         return bActionAllowed;
259 }
260
261 static short _rtl92e_check_nic_enough_desc(struct net_device *dev, int prio)
262 {
263         struct r8192_priv *priv = rtllib_priv(dev);
264         struct rtl8192_tx_ring *ring = &priv->tx_ring[prio];
265
266         if (ring->entries - skb_queue_len(&ring->queue) >= 2)
267                 return 1;
268         return 0;
269 }
270
271 static void _rtl92e_tx_timeout(struct net_device *dev, unsigned int txqueue)
272 {
273         struct r8192_priv *priv = rtllib_priv(dev);
274
275         schedule_work(&priv->reset_wq);
276         netdev_info(dev, "TXTIMEOUT");
277 }
278
279 void rtl92e_irq_enable(struct net_device *dev)
280 {
281         struct r8192_priv *priv = rtllib_priv(dev);
282
283         priv->irq_enabled = 1;
284
285         priv->ops->irq_enable(dev);
286 }
287
288 void rtl92e_irq_disable(struct net_device *dev)
289 {
290         struct r8192_priv *priv = rtllib_priv(dev);
291
292         priv->ops->irq_disable(dev);
293
294         priv->irq_enabled = 0;
295 }
296
297 static void _rtl92e_set_chan(struct net_device *dev, short ch)
298 {
299         struct r8192_priv *priv = rtllib_priv(dev);
300
301         RT_TRACE(COMP_CH, "=====>%s()====ch:%d\n", __func__, ch);
302         if (priv->chan_forced)
303                 return;
304
305         priv->chan = ch;
306
307         if (priv->rf_set_chan)
308                 priv->rf_set_chan(dev, priv->chan);
309 }
310
311 static void _rtl92e_update_cap(struct net_device *dev, u16 cap)
312 {
313         struct r8192_priv *priv = rtllib_priv(dev);
314         struct rtllib_network *net = &priv->rtllib->current_network;
315         bool            ShortPreamble;
316
317         if (cap & WLAN_CAPABILITY_SHORT_PREAMBLE) {
318                 if (priv->dot11CurrentPreambleMode != PREAMBLE_SHORT) {
319                         ShortPreamble = true;
320                         priv->dot11CurrentPreambleMode = PREAMBLE_SHORT;
321                         RT_TRACE(COMP_DBG,
322                                  "%s(): WLAN_CAPABILITY_SHORT_PREAMBLE\n",
323                                  __func__);
324                         priv->rtllib->SetHwRegHandler(dev, HW_VAR_ACK_PREAMBLE,
325                                         (unsigned char *)&ShortPreamble);
326                 }
327         } else {
328                 if (priv->dot11CurrentPreambleMode != PREAMBLE_LONG) {
329                         ShortPreamble = false;
330                         priv->dot11CurrentPreambleMode = PREAMBLE_LONG;
331                         RT_TRACE(COMP_DBG,
332                                  "%s(): WLAN_CAPABILITY_LONG_PREAMBLE\n",
333                                  __func__);
334                         priv->rtllib->SetHwRegHandler(dev, HW_VAR_ACK_PREAMBLE,
335                                               (unsigned char *)&ShortPreamble);
336                 }
337         }
338
339         if (net->mode & (IEEE_G | IEEE_N_24G)) {
340                 u8      slot_time_val;
341                 u8      CurSlotTime = priv->slot_time;
342
343                 if ((cap & WLAN_CAPABILITY_SHORT_SLOT_TIME) &&
344                    (!priv->rtllib->pHTInfo->bCurrentRT2RTLongSlotTime)) {
345                         if (CurSlotTime != SHORT_SLOT_TIME) {
346                                 slot_time_val = SHORT_SLOT_TIME;
347                                 priv->rtllib->SetHwRegHandler(dev,
348                                          HW_VAR_SLOT_TIME, &slot_time_val);
349                         }
350                 } else {
351                         if (CurSlotTime != NON_SHORT_SLOT_TIME) {
352                                 slot_time_val = NON_SHORT_SLOT_TIME;
353                                 priv->rtllib->SetHwRegHandler(dev,
354                                          HW_VAR_SLOT_TIME, &slot_time_val);
355                         }
356                 }
357         }
358 }
359
360 static const struct rtllib_qos_parameters def_qos_parameters = {
361         {cpu_to_le16(3), cpu_to_le16(3), cpu_to_le16(3), cpu_to_le16(3)},
362         {cpu_to_le16(7), cpu_to_le16(7), cpu_to_le16(7), cpu_to_le16(7)},
363         {2, 2, 2, 2},
364         {0, 0, 0, 0},
365         {0, 0, 0, 0}
366 };
367
368 static void _rtl92e_update_beacon(void *data)
369 {
370         struct r8192_priv *priv = container_of_work_rsl(data, struct r8192_priv,
371                                   update_beacon_wq.work);
372         struct net_device *dev = priv->rtllib->dev;
373         struct rtllib_device *ieee = priv->rtllib;
374         struct rtllib_network *net = &ieee->current_network;
375
376         if (ieee->pHTInfo->bCurrentHTSupport)
377                 HT_update_self_and_peer_setting(ieee, net);
378         ieee->pHTInfo->bCurrentRT2RTLongSlotTime =
379                  net->bssht.bdRT2RTLongSlotTime;
380         ieee->pHTInfo->RT2RT_HT_Mode = net->bssht.RT2RT_HT_Mode;
381         _rtl92e_update_cap(dev, net->capability);
382 }
383
384 static void _rtl92e_qos_activate(void *data)
385 {
386         struct r8192_priv *priv = container_of_work_rsl(data, struct r8192_priv,
387                                   qos_activate);
388         struct net_device *dev = priv->rtllib->dev;
389         int i;
390
391         mutex_lock(&priv->mutex);
392         if (priv->rtllib->state != RTLLIB_LINKED)
393                 goto success;
394         RT_TRACE(COMP_QOS,
395                  "qos active process with associate response received\n");
396
397         for (i = 0; i <  QOS_QUEUE_NUM; i++)
398                 priv->rtllib->SetHwRegHandler(dev, HW_VAR_AC_PARAM, (u8 *)(&i));
399
400
401 success:
402         mutex_unlock(&priv->mutex);
403 }
404
405 static int _rtl92e_qos_handle_probe_response(struct r8192_priv *priv,
406                                              int active_network,
407                                              struct rtllib_network *network)
408 {
409         int ret = 0;
410         u32 size = sizeof(struct rtllib_qos_parameters);
411
412         if (priv->rtllib->state != RTLLIB_LINKED)
413                 return ret;
414
415         if (priv->rtllib->iw_mode != IW_MODE_INFRA)
416                 return ret;
417
418         if (network->flags & NETWORK_HAS_QOS_MASK) {
419                 if (active_network &&
420                                 (network->flags & NETWORK_HAS_QOS_PARAMETERS))
421                         network->qos_data.active = network->qos_data.supported;
422
423                 if ((network->qos_data.active == 1) && (active_network == 1) &&
424                                 (network->flags & NETWORK_HAS_QOS_PARAMETERS) &&
425                                 (network->qos_data.old_param_count !=
426                                 network->qos_data.param_count)) {
427                         network->qos_data.old_param_count =
428                                 network->qos_data.param_count;
429                         priv->rtllib->wmm_acm = network->qos_data.wmm_acm;
430                         schedule_work(&priv->qos_activate);
431                         RT_TRACE(COMP_QOS,
432                                  "QoS parameters change call qos_activate\n");
433                 }
434         } else {
435                 memcpy(&priv->rtllib->current_network.qos_data.parameters,
436                        &def_qos_parameters, size);
437
438                 if ((network->qos_data.active == 1) && (active_network == 1)) {
439                         schedule_work(&priv->qos_activate);
440                         RT_TRACE(COMP_QOS,
441                                  "QoS was disabled call qos_activate\n");
442                 }
443                 network->qos_data.active = 0;
444                 network->qos_data.supported = 0;
445         }
446
447         return 0;
448 }
449
450 static int _rtl92e_handle_beacon(struct net_device *dev,
451                                  struct rtllib_beacon *beacon,
452                                  struct rtllib_network *network)
453 {
454         struct r8192_priv *priv = rtllib_priv(dev);
455
456         _rtl92e_qos_handle_probe_response(priv, 1, network);
457
458         schedule_delayed_work(&priv->update_beacon_wq, 0);
459         return 0;
460
461 }
462
463 static int _rtl92e_qos_assoc_resp(struct r8192_priv *priv,
464                                   struct rtllib_network *network)
465 {
466         unsigned long flags;
467         u32 size = sizeof(struct rtllib_qos_parameters);
468         int set_qos_param = 0;
469
470         if (!priv || !network)
471                 return 0;
472
473         if (priv->rtllib->state != RTLLIB_LINKED)
474                 return 0;
475
476         if (priv->rtllib->iw_mode != IW_MODE_INFRA)
477                 return 0;
478
479         spin_lock_irqsave(&priv->rtllib->lock, flags);
480         if (network->flags & NETWORK_HAS_QOS_PARAMETERS) {
481                 memcpy(&priv->rtllib->current_network.qos_data.parameters,
482                        &network->qos_data.parameters,
483                        sizeof(struct rtllib_qos_parameters));
484                 priv->rtllib->current_network.qos_data.active = 1;
485                 priv->rtllib->wmm_acm = network->qos_data.wmm_acm;
486                 set_qos_param = 1;
487                 priv->rtllib->current_network.qos_data.old_param_count =
488                         priv->rtllib->current_network.qos_data.param_count;
489                 priv->rtllib->current_network.qos_data.param_count =
490                         network->qos_data.param_count;
491         } else {
492                 memcpy(&priv->rtllib->current_network.qos_data.parameters,
493                 &def_qos_parameters, size);
494                 priv->rtllib->current_network.qos_data.active = 0;
495                 priv->rtllib->current_network.qos_data.supported = 0;
496                 set_qos_param = 1;
497         }
498
499         spin_unlock_irqrestore(&priv->rtllib->lock, flags);
500
501         RT_TRACE(COMP_QOS, "%s: network->flags = %d,%d\n", __func__,
502                  network->flags, priv->rtllib->current_network.qos_data.active);
503         if (set_qos_param == 1) {
504                 rtl92e_dm_init_edca_turbo(priv->rtllib->dev);
505                 schedule_work(&priv->qos_activate);
506         }
507         return 0;
508 }
509
510 static int _rtl92e_handle_assoc_response(struct net_device *dev,
511                                  struct rtllib_assoc_response_frame *resp,
512                                  struct rtllib_network *network)
513 {
514         struct r8192_priv *priv = rtllib_priv(dev);
515
516         _rtl92e_qos_assoc_resp(priv, network);
517         return 0;
518 }
519
520 static void _rtl92e_prepare_beacon(struct tasklet_struct *t)
521 {
522         struct r8192_priv *priv = from_tasklet(priv, t,
523                                                irq_prepare_beacon_tasklet);
524         struct net_device *dev = priv->rtllib->dev;
525         struct sk_buff *pskb = NULL, *pnewskb = NULL;
526         struct cb_desc *tcb_desc = NULL;
527         struct rtl8192_tx_ring *ring = NULL;
528         struct tx_desc *pdesc = NULL;
529
530         ring = &priv->tx_ring[BEACON_QUEUE];
531         pskb = __skb_dequeue(&ring->queue);
532         kfree_skb(pskb);
533
534         pnewskb = rtllib_get_beacon(priv->rtllib);
535         if (!pnewskb)
536                 return;
537
538         tcb_desc = (struct cb_desc *)(pnewskb->cb + 8);
539         tcb_desc->queue_index = BEACON_QUEUE;
540         tcb_desc->data_rate = 2;
541         tcb_desc->RATRIndex = 7;
542         tcb_desc->bTxDisableRateFallBack = 1;
543         tcb_desc->bTxUseDriverAssingedRate = 1;
544         skb_push(pnewskb, priv->rtllib->tx_headroom);
545
546         pdesc = &ring->desc[0];
547         priv->ops->tx_fill_descriptor(dev, pdesc, tcb_desc, pnewskb);
548         __skb_queue_tail(&ring->queue, pnewskb);
549         pdesc->OWN = 1;
550 }
551
552 static void _rtl92e_stop_beacon(struct net_device *dev)
553 {
554 }
555
556 void rtl92e_config_rate(struct net_device *dev, u16 *rate_config)
557 {
558         struct r8192_priv *priv = rtllib_priv(dev);
559         struct rtllib_network *net;
560         u8 i = 0, basic_rate = 0;
561
562         net = &priv->rtllib->current_network;
563
564         for (i = 0; i < net->rates_len; i++) {
565                 basic_rate = net->rates[i] & 0x7f;
566                 switch (basic_rate) {
567                 case MGN_1M:
568                         *rate_config |= RRSR_1M;
569                         break;
570                 case MGN_2M:
571                         *rate_config |= RRSR_2M;
572                         break;
573                 case MGN_5_5M:
574                         *rate_config |= RRSR_5_5M;
575                         break;
576                 case MGN_11M:
577                         *rate_config |= RRSR_11M;
578                         break;
579                 case MGN_6M:
580                         *rate_config |= RRSR_6M;
581                         break;
582                 case MGN_9M:
583                         *rate_config |= RRSR_9M;
584                         break;
585                 case MGN_12M:
586                         *rate_config |= RRSR_12M;
587                         break;
588                 case MGN_18M:
589                         *rate_config |= RRSR_18M;
590                         break;
591                 case MGN_24M:
592                         *rate_config |= RRSR_24M;
593                         break;
594                 case MGN_36M:
595                         *rate_config |= RRSR_36M;
596                         break;
597                 case MGN_48M:
598                         *rate_config |= RRSR_48M;
599                         break;
600                 case MGN_54M:
601                         *rate_config |= RRSR_54M;
602                         break;
603                 }
604         }
605
606         for (i = 0; i < net->rates_ex_len; i++) {
607                 basic_rate = net->rates_ex[i] & 0x7f;
608                 switch (basic_rate) {
609                 case MGN_1M:
610                         *rate_config |= RRSR_1M;
611                         break;
612                 case MGN_2M:
613                         *rate_config |= RRSR_2M;
614                         break;
615                 case MGN_5_5M:
616                         *rate_config |= RRSR_5_5M;
617                         break;
618                 case MGN_11M:
619                         *rate_config |= RRSR_11M;
620                         break;
621                 case MGN_6M:
622                         *rate_config |= RRSR_6M;
623                         break;
624                 case MGN_9M:
625                         *rate_config |= RRSR_9M;
626                         break;
627                 case MGN_12M:
628                         *rate_config |= RRSR_12M;
629                         break;
630                 case MGN_18M:
631                         *rate_config |= RRSR_18M;
632                         break;
633                 case MGN_24M:
634                         *rate_config |= RRSR_24M;
635                         break;
636                 case MGN_36M:
637                         *rate_config |= RRSR_36M;
638                         break;
639                 case MGN_48M:
640                         *rate_config |= RRSR_48M;
641                         break;
642                 case MGN_54M:
643                         *rate_config |= RRSR_54M;
644                         break;
645                 }
646         }
647 }
648
649 static void _rtl92e_refresh_support_rate(struct r8192_priv *priv)
650 {
651         struct rtllib_device *ieee = priv->rtllib;
652
653         if (ieee->mode == WIRELESS_MODE_N_24G ||
654             ieee->mode == WIRELESS_MODE_N_5G) {
655                 memcpy(ieee->Regdot11HTOperationalRateSet,
656                        ieee->RegHTSuppRateSet, 16);
657                 memcpy(ieee->Regdot11TxHTOperationalRateSet,
658                        ieee->RegHTSuppRateSet, 16);
659
660         } else {
661                 memset(ieee->Regdot11HTOperationalRateSet, 0, 16);
662         }
663 }
664
665 static u8 _rtl92e_get_supported_wireless_mode(struct net_device *dev)
666 {
667         struct r8192_priv *priv = rtllib_priv(dev);
668         u8 ret = 0;
669
670         switch (priv->rf_chip) {
671         case RF_8225:
672         case RF_8256:
673         case RF_6052:
674         case RF_PSEUDO_11N:
675                 ret = (WIRELESS_MODE_N_24G | WIRELESS_MODE_G | WIRELESS_MODE_B);
676                 break;
677         case RF_8258:
678                 ret = (WIRELESS_MODE_A | WIRELESS_MODE_N_5G);
679                 break;
680         default:
681                 ret = WIRELESS_MODE_B;
682                 break;
683         }
684         return ret;
685 }
686
687 void rtl92e_set_wireless_mode(struct net_device *dev, u8 wireless_mode)
688 {
689         struct r8192_priv *priv = rtllib_priv(dev);
690         u8 bSupportMode = _rtl92e_get_supported_wireless_mode(dev);
691
692         if ((wireless_mode == WIRELESS_MODE_AUTO) ||
693             ((wireless_mode & bSupportMode) == 0)) {
694                 if (bSupportMode & WIRELESS_MODE_N_24G) {
695                         wireless_mode = WIRELESS_MODE_N_24G;
696                 } else if (bSupportMode & WIRELESS_MODE_N_5G) {
697                         wireless_mode = WIRELESS_MODE_N_5G;
698                 } else if ((bSupportMode & WIRELESS_MODE_A)) {
699                         wireless_mode = WIRELESS_MODE_A;
700                 } else if ((bSupportMode & WIRELESS_MODE_G)) {
701                         wireless_mode = WIRELESS_MODE_G;
702                 } else if ((bSupportMode & WIRELESS_MODE_B)) {
703                         wireless_mode = WIRELESS_MODE_B;
704                 } else {
705                         netdev_info(dev,
706                                     "%s(): Unsupported mode requested. Fallback to 802.11b\n",
707                                     __func__);
708                         wireless_mode = WIRELESS_MODE_B;
709                 }
710         }
711
712         if ((wireless_mode & (WIRELESS_MODE_B | WIRELESS_MODE_G)) ==
713             (WIRELESS_MODE_G | WIRELESS_MODE_B))
714                 wireless_mode = WIRELESS_MODE_G;
715
716         priv->rtllib->mode = wireless_mode;
717
718         if ((wireless_mode == WIRELESS_MODE_N_24G) ||
719             (wireless_mode == WIRELESS_MODE_N_5G)) {
720                 priv->rtllib->pHTInfo->bEnableHT = 1;
721                 RT_TRACE(COMP_DBG, "%s(), wireless_mode:%x, bEnableHT = 1\n",
722                          __func__, wireless_mode);
723         } else {
724                 priv->rtllib->pHTInfo->bEnableHT = 0;
725                 RT_TRACE(COMP_DBG, "%s(), wireless_mode:%x, bEnableHT = 0\n",
726                          __func__, wireless_mode);
727         }
728
729         RT_TRACE(COMP_INIT, "Current Wireless Mode is %x\n", wireless_mode);
730         _rtl92e_refresh_support_rate(priv);
731 }
732
733 static int _rtl92e_sta_up(struct net_device *dev, bool is_silent_reset)
734 {
735         struct r8192_priv *priv = rtllib_priv(dev);
736         struct rt_pwr_save_ctrl *pPSC = (struct rt_pwr_save_ctrl *)
737                                         (&priv->rtllib->PowerSaveControl);
738         bool init_status;
739
740         priv->bDriverIsGoingToUnload = false;
741         priv->bdisable_nic = false;
742
743         priv->up = 1;
744         priv->rtllib->ieee_up = 1;
745
746         priv->up_first_time = 0;
747         RT_TRACE(COMP_INIT, "Bringing up iface");
748         priv->bfirst_init = true;
749         init_status = priv->ops->initialize_adapter(dev);
750         if (!init_status) {
751                 netdev_err(dev, "%s(): Initialization failed!\n", __func__);
752                 priv->bfirst_init = false;
753                 return -1;
754         }
755
756         RT_TRACE(COMP_INIT, "start adapter finished\n");
757         RT_CLEAR_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC);
758         priv->bfirst_init = false;
759
760         if (priv->polling_timer_on == 0)
761                 rtl92e_check_rfctrl_gpio_timer(&priv->gpio_polling_timer);
762
763         if (priv->rtllib->state != RTLLIB_LINKED)
764                 rtllib_softmac_start_protocol(priv->rtllib, 0);
765         rtllib_reset_queue(priv->rtllib);
766         _rtl92e_watchdog_timer_cb(&priv->watch_dog_timer);
767
768         if (!netif_queue_stopped(dev))
769                 netif_start_queue(dev);
770         else
771                 netif_wake_queue(dev);
772
773         return 0;
774 }
775
776 static int _rtl92e_sta_down(struct net_device *dev, bool shutdownrf)
777 {
778         struct r8192_priv *priv = rtllib_priv(dev);
779         unsigned long flags = 0;
780         u8 RFInProgressTimeOut = 0;
781
782         if (priv->up == 0)
783                 return -1;
784
785         if (priv->rtllib->rtllib_ips_leave)
786                 priv->rtllib->rtllib_ips_leave(dev);
787
788         if (priv->rtllib->state == RTLLIB_LINKED)
789                 rtl92e_leisure_ps_leave(dev);
790
791         priv->bDriverIsGoingToUnload = true;
792         priv->up = 0;
793         priv->rtllib->ieee_up = 0;
794         priv->bfirst_after_down = true;
795         RT_TRACE(COMP_DOWN, "==========>%s()\n", __func__);
796         if (!netif_queue_stopped(dev))
797                 netif_stop_queue(dev);
798
799         priv->rtllib->wpa_ie_len = 0;
800         kfree(priv->rtllib->wpa_ie);
801         priv->rtllib->wpa_ie = NULL;
802         rtl92e_cam_reset(dev);
803         memset(priv->rtllib->swcamtable, 0, sizeof(struct sw_cam_table) * 32);
804         rtl92e_irq_disable(dev);
805
806         del_timer_sync(&priv->watch_dog_timer);
807         _rtl92e_cancel_deferred_work(priv);
808         cancel_delayed_work(&priv->rtllib->hw_wakeup_wq);
809
810         rtllib_softmac_stop_protocol(priv->rtllib, 0, true);
811         spin_lock_irqsave(&priv->rf_ps_lock, flags);
812         while (priv->RFChangeInProgress) {
813                 spin_unlock_irqrestore(&priv->rf_ps_lock, flags);
814                 if (RFInProgressTimeOut > 100) {
815                         spin_lock_irqsave(&priv->rf_ps_lock, flags);
816                         break;
817                 }
818                 RT_TRACE(COMP_DBG,
819                          "===>%s():RF is in progress, need to wait until rf change is done.\n",
820                          __func__);
821                 mdelay(1);
822                 RFInProgressTimeOut++;
823                 spin_lock_irqsave(&priv->rf_ps_lock, flags);
824         }
825         priv->RFChangeInProgress = true;
826         spin_unlock_irqrestore(&priv->rf_ps_lock, flags);
827         priv->ops->stop_adapter(dev, false);
828         spin_lock_irqsave(&priv->rf_ps_lock, flags);
829         priv->RFChangeInProgress = false;
830         spin_unlock_irqrestore(&priv->rf_ps_lock, flags);
831         udelay(100);
832         memset(&priv->rtllib->current_network, 0,
833                offsetof(struct rtllib_network, list));
834         RT_TRACE(COMP_DOWN, "<==========%s()\n", __func__);
835
836         return 0;
837 }
838
839 static void _rtl92e_init_priv_handler(struct net_device *dev)
840 {
841         struct r8192_priv *priv = rtllib_priv(dev);
842
843         priv->rtllib->softmac_hard_start_xmit   = _rtl92e_hard_start_xmit;
844         priv->rtllib->set_chan                  = _rtl92e_set_chan;
845         priv->rtllib->link_change               = priv->ops->link_change;
846         priv->rtllib->softmac_data_hard_start_xmit = _rtl92e_hard_data_xmit;
847         priv->rtllib->check_nic_enough_desc     = _rtl92e_check_nic_enough_desc;
848         priv->rtllib->handle_assoc_response     = _rtl92e_handle_assoc_response;
849         priv->rtllib->handle_beacon             = _rtl92e_handle_beacon;
850         priv->rtllib->SetWirelessMode           = rtl92e_set_wireless_mode;
851         priv->rtllib->LeisurePSLeave            = rtl92e_leisure_ps_leave;
852         priv->rtllib->SetBWModeHandler          = rtl92e_set_bw_mode;
853         priv->rf_set_chan                       = rtl92e_set_channel;
854
855         priv->rtllib->start_send_beacons = rtl92e_start_beacon;
856         priv->rtllib->stop_send_beacons = _rtl92e_stop_beacon;
857
858         priv->rtllib->sta_wake_up = rtl92e_hw_wakeup;
859         priv->rtllib->enter_sleep_state = rtl92e_enter_sleep;
860         priv->rtllib->ps_is_queue_empty = _rtl92e_is_tx_queue_empty;
861
862         priv->rtllib->GetNmodeSupportBySecCfg = rtl92e_get_nmode_support_by_sec;
863         priv->rtllib->GetHalfNmodeSupportByAPsHandler =
864                                                 rtl92e_is_halfn_supported_by_ap;
865
866         priv->rtllib->SetHwRegHandler = rtl92e_set_reg;
867         priv->rtllib->AllowAllDestAddrHandler = rtl92e_set_monitor_mode;
868         priv->rtllib->SetFwCmdHandler = NULL;
869         priv->rtllib->InitialGainHandler = rtl92e_init_gain;
870         priv->rtllib->rtllib_ips_leave_wq = rtl92e_rtllib_ips_leave_wq;
871         priv->rtllib->rtllib_ips_leave = rtl92e_rtllib_ips_leave;
872
873         priv->rtllib->LedControlHandler = NULL;
874         priv->rtllib->UpdateBeaconInterruptHandler = NULL;
875
876         priv->rtllib->ScanOperationBackupHandler = rtl92e_scan_op_backup;
877 }
878
879 static void _rtl92e_init_priv_constant(struct net_device *dev)
880 {
881         struct r8192_priv *priv = rtllib_priv(dev);
882         struct rt_pwr_save_ctrl *pPSC = (struct rt_pwr_save_ctrl *)
883                                         &priv->rtllib->PowerSaveControl;
884
885         pPSC->RegMaxLPSAwakeIntvl = 5;
886 }
887
888
889 static void _rtl92e_init_priv_variable(struct net_device *dev)
890 {
891         struct r8192_priv *priv = rtllib_priv(dev);
892         u8 i;
893
894         priv->AcmMethod = eAcmWay2_SW;
895         priv->dot11CurrentPreambleMode = PREAMBLE_AUTO;
896         priv->rtllib->status = 0;
897         priv->polling_timer_on = 0;
898         priv->up_first_time = 1;
899         priv->blinked_ingpio = false;
900         priv->bDriverIsGoingToUnload = false;
901         priv->being_init_adapter = false;
902         priv->initialized_at_probe = false;
903         priv->bdisable_nic = false;
904         priv->bfirst_init = false;
905         priv->txringcount = 64;
906         priv->rxbuffersize = 9100;
907         priv->rxringcount = MAX_RX_COUNT;
908         priv->irq_enabled = 0;
909         priv->chan = 1;
910         priv->RegChannelPlan = 0xf;
911         priv->rtllib->mode = WIRELESS_MODE_AUTO;
912         priv->rtllib->iw_mode = IW_MODE_INFRA;
913         priv->rtllib->bNetPromiscuousMode = false;
914         priv->rtllib->IntelPromiscuousModeInfo.bPromiscuousOn = false;
915         priv->rtllib->IntelPromiscuousModeInfo.bFilterSourceStationFrame =
916                                                                  false;
917         priv->rtllib->ieee_up = 0;
918         priv->retry_rts = DEFAULT_RETRY_RTS;
919         priv->retry_data = DEFAULT_RETRY_DATA;
920         priv->rtllib->rts = DEFAULT_RTS_THRESHOLD;
921         priv->rtllib->rate = 110;
922         priv->rtllib->short_slot = 1;
923         priv->promisc = (dev->flags & IFF_PROMISC) ? 1 : 0;
924         priv->bcck_in_ch14 = false;
925         priv->bfsync_processing  = false;
926         priv->CCKPresentAttentuation = 0;
927         priv->rfa_txpowertrackingindex = 0;
928         priv->rfc_txpowertrackingindex = 0;
929         priv->CckPwEnl = 6;
930         priv->ScanDelay = 50;
931         priv->ResetProgress = RESET_TYPE_NORESET;
932         priv->bForcedSilentReset = false;
933         priv->bDisableNormalResetCheck = false;
934         priv->force_reset = false;
935         memset(priv->rtllib->swcamtable, 0, sizeof(struct sw_cam_table) * 32);
936
937         memset(&priv->InterruptLog, 0, sizeof(struct log_int_8190));
938         priv->RxCounter = 0;
939         priv->rtllib->wx_set_enc = 0;
940         priv->bHwRadioOff = false;
941         priv->RegRfOff = false;
942         priv->isRFOff = false;
943         priv->bInPowerSaveMode = false;
944         priv->rtllib->RfOffReason = 0;
945         priv->RFChangeInProgress = false;
946         priv->bHwRfOffAction = 0;
947         priv->SetRFPowerStateInProgress = false;
948         priv->rtllib->PowerSaveControl.bInactivePs = true;
949         priv->rtllib->PowerSaveControl.bIPSModeBackup = false;
950         priv->rtllib->PowerSaveControl.bLeisurePs = true;
951         priv->rtllib->PowerSaveControl.bFwCtrlLPS = false;
952         priv->rtllib->LPSDelayCnt = 0;
953         priv->rtllib->sta_sleep = LPS_IS_WAKE;
954         priv->rtllib->eRFPowerState = eRfOn;
955
956         priv->rtllib->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
957         priv->rtllib->iw_mode = IW_MODE_INFRA;
958         priv->rtllib->active_scan = 1;
959         priv->rtllib->be_scan_inprogress = false;
960         priv->rtllib->modulation = RTLLIB_CCK_MODULATION |
961                                    RTLLIB_OFDM_MODULATION;
962         priv->rtllib->host_encrypt = 1;
963         priv->rtllib->host_decrypt = 1;
964
965         priv->rtllib->fts = DEFAULT_FRAG_THRESHOLD;
966
967         priv->card_type = PCI;
968
969         priv->pFirmware = vzalloc(sizeof(struct rt_firmware));
970         if (!priv->pFirmware)
971                 netdev_err(dev,
972                            "rtl8192e: Unable to allocate space for firmware\n");
973
974         skb_queue_head_init(&priv->skb_queue);
975
976         for (i = 0; i < MAX_QUEUE_SIZE; i++)
977                 skb_queue_head_init(&priv->rtllib->skb_waitQ[i]);
978         for (i = 0; i < MAX_QUEUE_SIZE; i++)
979                 skb_queue_head_init(&priv->rtllib->skb_aggQ[i]);
980 }
981
982 static void _rtl92e_init_priv_lock(struct r8192_priv *priv)
983 {
984         spin_lock_init(&priv->tx_lock);
985         spin_lock_init(&priv->irq_th_lock);
986         spin_lock_init(&priv->rf_ps_lock);
987         spin_lock_init(&priv->ps_lock);
988         mutex_init(&priv->wx_mutex);
989         mutex_init(&priv->rf_mutex);
990         mutex_init(&priv->mutex);
991 }
992
993 static void _rtl92e_init_priv_task(struct net_device *dev)
994 {
995         struct r8192_priv *priv = rtllib_priv(dev);
996
997         INIT_WORK_RSL(&priv->reset_wq, (void *)_rtl92e_restart, dev);
998         INIT_WORK_RSL(&priv->rtllib->ips_leave_wq, (void *)rtl92e_ips_leave_wq,
999                       dev);
1000         INIT_DELAYED_WORK_RSL(&priv->watch_dog_wq,
1001                               (void *)_rtl92e_watchdog_wq_cb, dev);
1002         INIT_DELAYED_WORK_RSL(&priv->txpower_tracking_wq,
1003                               (void *)rtl92e_dm_txpower_tracking_wq, dev);
1004         INIT_DELAYED_WORK_RSL(&priv->rfpath_check_wq,
1005                               (void *)rtl92e_dm_rf_pathcheck_wq, dev);
1006         INIT_DELAYED_WORK_RSL(&priv->update_beacon_wq,
1007                               (void *)_rtl92e_update_beacon, dev);
1008         INIT_WORK_RSL(&priv->qos_activate, (void *)_rtl92e_qos_activate, dev);
1009         INIT_DELAYED_WORK_RSL(&priv->rtllib->hw_wakeup_wq,
1010                               (void *)rtl92e_hw_wakeup_wq, dev);
1011         INIT_DELAYED_WORK_RSL(&priv->rtllib->hw_sleep_wq,
1012                               (void *)rtl92e_hw_sleep_wq, dev);
1013         tasklet_setup(&priv->irq_rx_tasklet, _rtl92e_irq_rx_tasklet);
1014         tasklet_setup(&priv->irq_tx_tasklet, _rtl92e_irq_tx_tasklet);
1015         tasklet_setup(&priv->irq_prepare_beacon_tasklet,
1016                       _rtl92e_prepare_beacon);
1017 }
1018
1019 static short _rtl92e_get_channel_map(struct net_device *dev)
1020 {
1021         int i;
1022
1023         struct r8192_priv *priv = rtllib_priv(dev);
1024
1025         if ((priv->rf_chip != RF_8225) && (priv->rf_chip != RF_8256) &&
1026                                                 (priv->rf_chip != RF_6052)) {
1027                 netdev_err(dev, "%s: unknown rf chip, can't set channel map\n",
1028                            __func__);
1029                 return -1;
1030         }
1031
1032         if (priv->ChannelPlan >= COUNTRY_CODE_MAX) {
1033                 netdev_info(dev,
1034                             "rtl819x_init:Error channel plan! Set to default.\n");
1035                 priv->ChannelPlan = COUNTRY_CODE_FCC;
1036         }
1037         RT_TRACE(COMP_INIT, "Channel plan is %d\n", priv->ChannelPlan);
1038         dot11d_init(priv->rtllib);
1039         dot11d_channel_map(priv->ChannelPlan, priv->rtllib);
1040         for (i = 1; i <= 11; i++)
1041                 (priv->rtllib->active_channel_map)[i] = 1;
1042         (priv->rtllib->active_channel_map)[12] = 2;
1043         (priv->rtllib->active_channel_map)[13] = 2;
1044
1045         return 0;
1046 }
1047
1048 static short _rtl92e_init(struct net_device *dev)
1049 {
1050         struct r8192_priv *priv = rtllib_priv(dev);
1051
1052         memset(&priv->stats, 0, sizeof(struct rt_stats));
1053
1054         _rtl92e_init_priv_handler(dev);
1055         _rtl92e_init_priv_constant(dev);
1056         _rtl92e_init_priv_variable(dev);
1057         _rtl92e_init_priv_lock(priv);
1058         _rtl92e_init_priv_task(dev);
1059         priv->ops->get_eeprom_size(dev);
1060         priv->ops->init_adapter_variable(dev);
1061         _rtl92e_get_channel_map(dev);
1062
1063         rtl92e_dm_init(dev);
1064
1065         timer_setup(&priv->watch_dog_timer, _rtl92e_watchdog_timer_cb, 0);
1066
1067         timer_setup(&priv->gpio_polling_timer, rtl92e_check_rfctrl_gpio_timer,
1068                     0);
1069
1070         rtl92e_irq_disable(dev);
1071         if (request_irq(dev->irq, _rtl92e_irq, IRQF_SHARED, dev->name, dev)) {
1072                 netdev_err(dev, "Error allocating IRQ %d", dev->irq);
1073                 return -1;
1074         }
1075
1076         priv->irq = dev->irq;
1077         RT_TRACE(COMP_INIT, "IRQ %d\n", dev->irq);
1078
1079         if (_rtl92e_pci_initdescring(dev) != 0) {
1080                 netdev_err(dev, "Endopoints initialization failed");
1081                 free_irq(dev->irq, dev);
1082                 return -1;
1083         }
1084
1085         return 0;
1086 }
1087
1088 /***************************************************************************
1089  * -------------------------------WATCHDOG STUFF---------------------------
1090  **************************************************************************/
1091 static short _rtl92e_is_tx_queue_empty(struct net_device *dev)
1092 {
1093         int i = 0;
1094         struct r8192_priv *priv = rtllib_priv(dev);
1095
1096         for (i = 0; i <= MGNT_QUEUE; i++) {
1097                 if ((i == TXCMD_QUEUE) || (i == HCCA_QUEUE))
1098                         continue;
1099                 if (skb_queue_len(&(&priv->tx_ring[i])->queue) > 0) {
1100                         netdev_info(dev, "===>tx queue is not empty:%d, %d\n",
1101                                i, skb_queue_len(&(&priv->tx_ring[i])->queue));
1102                         return 0;
1103                 }
1104         }
1105         return 1;
1106 }
1107
1108 static enum reset_type _rtl92e_tx_check_stuck(struct net_device *dev)
1109 {
1110         struct r8192_priv *priv = rtllib_priv(dev);
1111         u8      QueueID;
1112         bool    bCheckFwTxCnt = false;
1113         struct rtl8192_tx_ring  *ring = NULL;
1114         struct sk_buff *skb = NULL;
1115         struct cb_desc *tcb_desc = NULL;
1116         unsigned long flags = 0;
1117
1118         switch (priv->rtllib->ps) {
1119         case RTLLIB_PS_DISABLED:
1120                 break;
1121         case (RTLLIB_PS_MBCAST | RTLLIB_PS_UNICAST):
1122                 break;
1123         default:
1124                 break;
1125         }
1126         spin_lock_irqsave(&priv->irq_th_lock, flags);
1127         for (QueueID = 0; QueueID < MAX_TX_QUEUE; QueueID++) {
1128                 if (QueueID == TXCMD_QUEUE)
1129                         continue;
1130
1131                 if (QueueID == BEACON_QUEUE)
1132                         continue;
1133
1134                 ring = &priv->tx_ring[QueueID];
1135
1136                 if (skb_queue_len(&ring->queue) == 0) {
1137                         continue;
1138                 } else {
1139                         skb = __skb_peek(&ring->queue);
1140                         tcb_desc = (struct cb_desc *)(skb->cb +
1141                                     MAX_DEV_ADDR_SIZE);
1142                         tcb_desc->nStuckCount++;
1143                         bCheckFwTxCnt = true;
1144                         if (tcb_desc->nStuckCount > 1)
1145                                 netdev_info(dev,
1146                                             "%s: QueueID=%d tcb_desc->nStuckCount=%d\n",
1147                                             __func__, QueueID,
1148                                             tcb_desc->nStuckCount);
1149                 }
1150         }
1151         spin_unlock_irqrestore(&priv->irq_th_lock, flags);
1152
1153         if (bCheckFwTxCnt) {
1154                 if (priv->ops->TxCheckStuckHandler(dev)) {
1155                         RT_TRACE(COMP_RESET,
1156                                  "TxCheckStuck(): Fw indicates no Tx condition!\n");
1157                         return RESET_TYPE_SILENT;
1158                 }
1159         }
1160
1161         return RESET_TYPE_NORESET;
1162 }
1163
1164 static enum reset_type _rtl92e_rx_check_stuck(struct net_device *dev)
1165 {
1166         struct r8192_priv *priv = rtllib_priv(dev);
1167
1168         if (priv->ops->RxCheckStuckHandler(dev)) {
1169                 RT_TRACE(COMP_RESET, "RxStuck Condition\n");
1170                 return RESET_TYPE_SILENT;
1171         }
1172
1173         return RESET_TYPE_NORESET;
1174 }
1175
1176 static enum reset_type _rtl92e_if_check_reset(struct net_device *dev)
1177 {
1178         struct r8192_priv *priv = rtllib_priv(dev);
1179         enum reset_type TxResetType = RESET_TYPE_NORESET;
1180         enum reset_type RxResetType = RESET_TYPE_NORESET;
1181         enum rt_rf_power_state rfState;
1182
1183         rfState = priv->rtllib->eRFPowerState;
1184
1185         if (rfState == eRfOn)
1186                 TxResetType = _rtl92e_tx_check_stuck(dev);
1187
1188         if (rfState == eRfOn &&
1189             (priv->rtllib->iw_mode == IW_MODE_INFRA) &&
1190             (priv->rtllib->state == RTLLIB_LINKED))
1191                 RxResetType = _rtl92e_rx_check_stuck(dev);
1192
1193         if (TxResetType == RESET_TYPE_NORMAL ||
1194             RxResetType == RESET_TYPE_NORMAL) {
1195                 netdev_info(dev, "%s(): TxResetType is %d, RxResetType is %d\n",
1196                             __func__, TxResetType, RxResetType);
1197                 return RESET_TYPE_NORMAL;
1198         } else if (TxResetType == RESET_TYPE_SILENT ||
1199                    RxResetType == RESET_TYPE_SILENT) {
1200                 netdev_info(dev, "%s(): TxResetType is %d, RxResetType is %d\n",
1201                             __func__, TxResetType, RxResetType);
1202                 return RESET_TYPE_SILENT;
1203         } else {
1204                 return RESET_TYPE_NORESET;
1205         }
1206
1207 }
1208
1209 static void _rtl92e_if_silent_reset(struct net_device *dev)
1210 {
1211         struct r8192_priv *priv = rtllib_priv(dev);
1212         u8      reset_times = 0;
1213         int reset_status = 0;
1214         struct rtllib_device *ieee = priv->rtllib;
1215         unsigned long flag;
1216
1217         if (priv->ResetProgress == RESET_TYPE_NORESET) {
1218
1219                 RT_TRACE(COMP_RESET, "=========>Reset progress!!\n");
1220
1221                 priv->ResetProgress = RESET_TYPE_SILENT;
1222
1223                 spin_lock_irqsave(&priv->rf_ps_lock, flag);
1224                 if (priv->RFChangeInProgress) {
1225                         spin_unlock_irqrestore(&priv->rf_ps_lock, flag);
1226                         goto END;
1227                 }
1228                 priv->RFChangeInProgress = true;
1229                 priv->bResetInProgress = true;
1230                 spin_unlock_irqrestore(&priv->rf_ps_lock, flag);
1231
1232 RESET_START:
1233
1234                 mutex_lock(&priv->wx_mutex);
1235
1236                 if (priv->rtllib->state == RTLLIB_LINKED)
1237                         rtl92e_leisure_ps_leave(dev);
1238
1239                 if (priv->up) {
1240                         netdev_info(dev, "%s():the driver is not up.\n",
1241                                     __func__);
1242                         mutex_unlock(&priv->wx_mutex);
1243                         return;
1244                 }
1245                 priv->up = 0;
1246
1247                 RT_TRACE(COMP_RESET, "%s():======>start to down the driver\n",
1248                           __func__);
1249                 mdelay(1000);
1250                 RT_TRACE(COMP_RESET,
1251                          "%s():111111111111111111111111======>start to down the driver\n",
1252                          __func__);
1253
1254                 if (!netif_queue_stopped(dev))
1255                         netif_stop_queue(dev);
1256
1257                 rtl92e_irq_disable(dev);
1258                 del_timer_sync(&priv->watch_dog_timer);
1259                 _rtl92e_cancel_deferred_work(priv);
1260                 rtl92e_dm_deinit(dev);
1261                 rtllib_stop_scan_syncro(ieee);
1262
1263                 if (ieee->state == RTLLIB_LINKED) {
1264                         mutex_lock(&ieee->wx_mutex);
1265                         netdev_info(dev, "ieee->state is RTLLIB_LINKED\n");
1266                         rtllib_stop_send_beacons(priv->rtllib);
1267                         del_timer_sync(&ieee->associate_timer);
1268                         cancel_delayed_work(&ieee->associate_retry_wq);
1269                         rtllib_stop_scan(ieee);
1270                         netif_carrier_off(dev);
1271                         mutex_unlock(&ieee->wx_mutex);
1272                 } else {
1273                         netdev_info(dev, "ieee->state is NOT LINKED\n");
1274                         rtllib_softmac_stop_protocol(priv->rtllib, 0, true);
1275                 }
1276
1277                 rtl92e_dm_backup_state(dev);
1278
1279                 mutex_unlock(&priv->wx_mutex);
1280                 RT_TRACE(COMP_RESET,
1281                          "%s():<==========down process is finished\n",
1282                          __func__);
1283
1284                 RT_TRACE(COMP_RESET, "%s():<===========up process start\n",
1285                          __func__);
1286                 reset_status = _rtl92e_up(dev, true);
1287
1288                 RT_TRACE(COMP_RESET,
1289                          "%s():<===========up process is finished\n", __func__);
1290                 if (reset_status == -1) {
1291                         if (reset_times < 3) {
1292                                 reset_times++;
1293                                 goto RESET_START;
1294                         } else {
1295                                 netdev_warn(dev, "%s(): Reset Failed\n",
1296                                             __func__);
1297                         }
1298                 }
1299
1300                 ieee->is_silent_reset = 1;
1301
1302                 spin_lock_irqsave(&priv->rf_ps_lock, flag);
1303                 priv->RFChangeInProgress = false;
1304                 spin_unlock_irqrestore(&priv->rf_ps_lock, flag);
1305
1306                 rtl92e_enable_hw_security_config(dev);
1307
1308                 if (ieee->state == RTLLIB_LINKED && ieee->iw_mode ==
1309                     IW_MODE_INFRA) {
1310                         ieee->set_chan(ieee->dev,
1311                                        ieee->current_network.channel);
1312
1313                         schedule_work(&ieee->associate_complete_wq);
1314
1315                 } else if (ieee->state == RTLLIB_LINKED && ieee->iw_mode ==
1316                            IW_MODE_ADHOC) {
1317                         ieee->set_chan(ieee->dev,
1318                                        ieee->current_network.channel);
1319                         ieee->link_change(ieee->dev);
1320
1321                         notify_wx_assoc_event(ieee);
1322
1323                         rtllib_start_send_beacons(ieee);
1324
1325                         netif_carrier_on(ieee->dev);
1326                 }
1327
1328                 rtl92e_cam_restore(dev);
1329                 rtl92e_dm_restore_state(dev);
1330 END:
1331                 priv->ResetProgress = RESET_TYPE_NORESET;
1332                 priv->reset_count++;
1333
1334                 priv->bForcedSilentReset = false;
1335                 priv->bResetInProgress = false;
1336
1337                 rtl92e_writeb(dev, UFWP, 1);
1338                 RT_TRACE(COMP_RESET, "Reset finished!! ====>[%d]\n",
1339                          priv->reset_count);
1340         }
1341 }
1342
1343 static void _rtl92e_update_rxcounts(struct r8192_priv *priv, u32 *TotalRxBcnNum,
1344                                     u32 *TotalRxDataNum)
1345 {
1346         u16     SlotIndex;
1347         u8      i;
1348
1349         *TotalRxBcnNum = 0;
1350         *TotalRxDataNum = 0;
1351
1352         SlotIndex = (priv->rtllib->LinkDetectInfo.SlotIndex++) %
1353                         (priv->rtllib->LinkDetectInfo.SlotNum);
1354         priv->rtllib->LinkDetectInfo.RxBcnNum[SlotIndex] =
1355                         priv->rtllib->LinkDetectInfo.NumRecvBcnInPeriod;
1356         priv->rtllib->LinkDetectInfo.RxDataNum[SlotIndex] =
1357                         priv->rtllib->LinkDetectInfo.NumRecvDataInPeriod;
1358         for (i = 0; i < priv->rtllib->LinkDetectInfo.SlotNum; i++) {
1359                 *TotalRxBcnNum += priv->rtllib->LinkDetectInfo.RxBcnNum[i];
1360                 *TotalRxDataNum += priv->rtllib->LinkDetectInfo.RxDataNum[i];
1361         }
1362 }
1363
1364 static void _rtl92e_watchdog_wq_cb(void *data)
1365 {
1366         struct r8192_priv *priv = container_of_dwork_rsl(data,
1367                                   struct r8192_priv, watch_dog_wq);
1368         struct net_device *dev = priv->rtllib->dev;
1369         struct rtllib_device *ieee = priv->rtllib;
1370         enum reset_type ResetType = RESET_TYPE_NORESET;
1371         static u8 check_reset_cnt;
1372         unsigned long flags;
1373         struct rt_pwr_save_ctrl *pPSC = (struct rt_pwr_save_ctrl *)
1374                                         (&priv->rtllib->PowerSaveControl);
1375         bool bBusyTraffic = false;
1376         bool    bHigherBusyTraffic = false;
1377         bool    bHigherBusyRxTraffic = false;
1378         bool bEnterPS = false;
1379
1380         if (!priv->up || priv->bHwRadioOff)
1381                 return;
1382
1383         if (priv->rtllib->state >= RTLLIB_LINKED) {
1384                 if (priv->rtllib->CntAfterLink < 2)
1385                         priv->rtllib->CntAfterLink++;
1386         } else {
1387                 priv->rtllib->CntAfterLink = 0;
1388         }
1389
1390         rtl92e_dm_watchdog(dev);
1391
1392         if (rtllib_act_scanning(priv->rtllib, false) == false) {
1393                 if ((ieee->iw_mode == IW_MODE_INFRA) && (ieee->state ==
1394                      RTLLIB_NOLINK) &&
1395                      (ieee->eRFPowerState == eRfOn) && !ieee->is_set_key &&
1396                      (!ieee->proto_stoppping) && !ieee->wx_set_enc) {
1397                         if ((ieee->PowerSaveControl.ReturnPoint ==
1398                              IPS_CALLBACK_NONE) &&
1399                              (!ieee->bNetPromiscuousMode)) {
1400                                 RT_TRACE(COMP_PS,
1401                                          "====================>haha: rtl92e_ips_enter()\n");
1402                                 rtl92e_ips_enter(dev);
1403                         }
1404                 }
1405         }
1406         if ((ieee->state == RTLLIB_LINKED) && (ieee->iw_mode ==
1407              IW_MODE_INFRA) && (!ieee->bNetPromiscuousMode)) {
1408                 if (ieee->LinkDetectInfo.NumRxOkInPeriod > 100 ||
1409                 ieee->LinkDetectInfo.NumTxOkInPeriod > 100)
1410                         bBusyTraffic = true;
1411
1412
1413                 if (ieee->LinkDetectInfo.NumRxOkInPeriod > 4000 ||
1414                     ieee->LinkDetectInfo.NumTxOkInPeriod > 4000) {
1415                         bHigherBusyTraffic = true;
1416                         if (ieee->LinkDetectInfo.NumRxOkInPeriod > 5000)
1417                                 bHigherBusyRxTraffic = true;
1418                         else
1419                                 bHigherBusyRxTraffic = false;
1420                 }
1421
1422                 if (((ieee->LinkDetectInfo.NumRxUnicastOkInPeriod +
1423                     ieee->LinkDetectInfo.NumTxOkInPeriod) > 8) ||
1424                     (ieee->LinkDetectInfo.NumRxUnicastOkInPeriod > 2))
1425                         bEnterPS = false;
1426                 else
1427                         bEnterPS = true;
1428
1429                 if (ieee->current_network.beacon_interval < 95)
1430                         bEnterPS = false;
1431
1432                 if (bEnterPS)
1433                         rtl92e_leisure_ps_enter(dev);
1434                 else
1435                         rtl92e_leisure_ps_leave(dev);
1436
1437         } else {
1438                 RT_TRACE(COMP_LPS, "====>no link LPS leave\n");
1439                 rtl92e_leisure_ps_leave(dev);
1440         }
1441
1442         ieee->LinkDetectInfo.NumRxOkInPeriod = 0;
1443         ieee->LinkDetectInfo.NumTxOkInPeriod = 0;
1444         ieee->LinkDetectInfo.NumRxUnicastOkInPeriod = 0;
1445         ieee->LinkDetectInfo.bBusyTraffic = bBusyTraffic;
1446
1447         ieee->LinkDetectInfo.bHigherBusyTraffic = bHigherBusyTraffic;
1448         ieee->LinkDetectInfo.bHigherBusyRxTraffic = bHigherBusyRxTraffic;
1449
1450         if (ieee->state == RTLLIB_LINKED && ieee->iw_mode == IW_MODE_INFRA) {
1451                 u32     TotalRxBcnNum = 0;
1452                 u32     TotalRxDataNum = 0;
1453
1454                 _rtl92e_update_rxcounts(priv, &TotalRxBcnNum, &TotalRxDataNum);
1455
1456                 if ((TotalRxBcnNum + TotalRxDataNum) == 0)
1457                         priv->check_roaming_cnt++;
1458                 else
1459                         priv->check_roaming_cnt = 0;
1460
1461
1462                 if (priv->check_roaming_cnt > 0) {
1463                         if (ieee->eRFPowerState == eRfOff)
1464                                 netdev_info(dev, "%s(): RF is off\n", __func__);
1465
1466                         netdev_info(dev,
1467                                     "===>%s(): AP is power off, chan:%d, connect another one\n",
1468                                     __func__, priv->chan);
1469
1470                         ieee->state = RTLLIB_ASSOCIATING;
1471
1472                         RemovePeerTS(priv->rtllib,
1473                                      priv->rtllib->current_network.bssid);
1474                         ieee->is_roaming = true;
1475                         ieee->is_set_key = false;
1476                         ieee->link_change(dev);
1477                         if (ieee->LedControlHandler)
1478                                 ieee->LedControlHandler(ieee->dev,
1479                                                         LED_CTL_START_TO_LINK);
1480
1481                         notify_wx_assoc_event(ieee);
1482
1483                         if (!(ieee->rtllib_ap_sec_type(ieee) &
1484                              (SEC_ALG_CCMP | SEC_ALG_TKIP)))
1485                                 schedule_delayed_work(
1486                                         &ieee->associate_procedure_wq, 0);
1487
1488                         priv->check_roaming_cnt = 0;
1489                 }
1490                 ieee->LinkDetectInfo.NumRecvBcnInPeriod = 0;
1491                 ieee->LinkDetectInfo.NumRecvDataInPeriod = 0;
1492
1493         }
1494
1495         spin_lock_irqsave(&priv->tx_lock, flags);
1496         if ((check_reset_cnt++ >= 3) && (!ieee->is_roaming) &&
1497             (!priv->RFChangeInProgress) && (!pPSC->bSwRfProcessing)) {
1498                 ResetType = _rtl92e_if_check_reset(dev);
1499                 check_reset_cnt = 3;
1500         }
1501         spin_unlock_irqrestore(&priv->tx_lock, flags);
1502
1503         if (!priv->bDisableNormalResetCheck && ResetType == RESET_TYPE_NORMAL) {
1504                 priv->ResetProgress = RESET_TYPE_NORMAL;
1505                 RT_TRACE(COMP_RESET, "%s(): NOMAL RESET\n", __func__);
1506                 return;
1507         }
1508
1509         if (((priv->force_reset) || (!priv->bDisableNormalResetCheck &&
1510               ResetType == RESET_TYPE_SILENT)))
1511                 _rtl92e_if_silent_reset(dev);
1512         priv->force_reset = false;
1513         priv->bForcedSilentReset = false;
1514         priv->bResetInProgress = false;
1515         RT_TRACE(COMP_TRACE, " <==RtUsbCheckForHangWorkItemCallback()\n");
1516 }
1517
1518 static void _rtl92e_watchdog_timer_cb(struct timer_list *t)
1519 {
1520         struct r8192_priv *priv = from_timer(priv, t, watch_dog_timer);
1521
1522         schedule_delayed_work(&priv->watch_dog_wq, 0);
1523         mod_timer(&priv->watch_dog_timer, jiffies +
1524                   msecs_to_jiffies(RTLLIB_WATCH_DOG_TIME));
1525 }
1526
1527 /****************************************************************************
1528  * ---------------------------- NIC TX/RX STUFF---------------------------
1529  ****************************************************************************/
1530 void rtl92e_rx_enable(struct net_device *dev)
1531 {
1532         struct r8192_priv *priv = rtllib_priv(dev);
1533
1534         priv->ops->rx_enable(dev);
1535 }
1536
1537 void rtl92e_tx_enable(struct net_device *dev)
1538 {
1539         struct r8192_priv *priv = rtllib_priv(dev);
1540
1541         priv->ops->tx_enable(dev);
1542
1543         rtllib_reset_queue(priv->rtllib);
1544 }
1545
1546
1547 static void _rtl92e_free_rx_ring(struct net_device *dev)
1548 {
1549         struct r8192_priv *priv = rtllib_priv(dev);
1550         int i, rx_queue_idx;
1551
1552         for (rx_queue_idx = 0; rx_queue_idx < MAX_RX_QUEUE;
1553              rx_queue_idx++) {
1554                 for (i = 0; i < priv->rxringcount; i++) {
1555                         struct sk_buff *skb = priv->rx_buf[rx_queue_idx][i];
1556
1557                         if (!skb)
1558                                 continue;
1559
1560                         dma_unmap_single(&priv->pdev->dev,
1561                                          *((dma_addr_t *)skb->cb),
1562                                          priv->rxbuffersize, DMA_FROM_DEVICE);
1563                         kfree_skb(skb);
1564                 }
1565
1566                 dma_free_coherent(&priv->pdev->dev,
1567                                   sizeof(*priv->rx_ring[rx_queue_idx]) * priv->rxringcount,
1568                                   priv->rx_ring[rx_queue_idx],
1569                                   priv->rx_ring_dma[rx_queue_idx]);
1570                 priv->rx_ring[rx_queue_idx] = NULL;
1571         }
1572 }
1573
1574 static void _rtl92e_free_tx_ring(struct net_device *dev, unsigned int prio)
1575 {
1576         struct r8192_priv *priv = rtllib_priv(dev);
1577         struct rtl8192_tx_ring *ring = &priv->tx_ring[prio];
1578
1579         while (skb_queue_len(&ring->queue)) {
1580                 struct tx_desc *entry = &ring->desc[ring->idx];
1581                 struct sk_buff *skb = __skb_dequeue(&ring->queue);
1582
1583                 dma_unmap_single(&priv->pdev->dev, entry->TxBuffAddr,
1584                                  skb->len, DMA_TO_DEVICE);
1585                 kfree_skb(skb);
1586                 ring->idx = (ring->idx + 1) % ring->entries;
1587         }
1588
1589         dma_free_coherent(&priv->pdev->dev,
1590                           sizeof(*ring->desc) * ring->entries, ring->desc,
1591                           ring->dma);
1592         ring->desc = NULL;
1593 }
1594
1595 static void _rtl92e_hard_data_xmit(struct sk_buff *skb, struct net_device *dev,
1596                                    int rate)
1597 {
1598         struct r8192_priv *priv = rtllib_priv(dev);
1599         int ret;
1600         struct cb_desc *tcb_desc = (struct cb_desc *)(skb->cb +
1601                                     MAX_DEV_ADDR_SIZE);
1602         u8 queue_index = tcb_desc->queue_index;
1603
1604         if ((priv->rtllib->eRFPowerState == eRfOff) || !priv->up ||
1605              priv->bResetInProgress) {
1606                 kfree_skb(skb);
1607                 return;
1608         }
1609
1610         if (queue_index == TXCMD_QUEUE)
1611                 netdev_warn(dev, "%s(): queue index == TXCMD_QUEUE\n",
1612                             __func__);
1613
1614         memcpy((unsigned char *)(skb->cb), &dev, sizeof(dev));
1615         skb_push(skb, priv->rtllib->tx_headroom);
1616         ret = _rtl92e_tx(dev, skb);
1617
1618         if (queue_index != MGNT_QUEUE) {
1619                 priv->rtllib->stats.tx_bytes += (skb->len -
1620                                                  priv->rtllib->tx_headroom);
1621                 priv->rtllib->stats.tx_packets++;
1622         }
1623
1624         if (ret != 0)
1625                 kfree_skb(skb);
1626 }
1627
1628 static int _rtl92e_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
1629 {
1630         struct r8192_priv *priv = rtllib_priv(dev);
1631         int ret;
1632         struct cb_desc *tcb_desc = (struct cb_desc *)(skb->cb +
1633                                     MAX_DEV_ADDR_SIZE);
1634         u8 queue_index = tcb_desc->queue_index;
1635
1636         if (queue_index != TXCMD_QUEUE) {
1637                 if ((priv->rtllib->eRFPowerState == eRfOff) ||
1638                      !priv->up || priv->bResetInProgress) {
1639                         kfree_skb(skb);
1640                         return 0;
1641                 }
1642         }
1643
1644         memcpy((unsigned char *)(skb->cb), &dev, sizeof(dev));
1645         if (queue_index == TXCMD_QUEUE) {
1646                 _rtl92e_tx_cmd(dev, skb);
1647                 return 0;
1648         }
1649
1650         tcb_desc->RATRIndex = 7;
1651         tcb_desc->bTxDisableRateFallBack = 1;
1652         tcb_desc->bTxUseDriverAssingedRate = 1;
1653         tcb_desc->bTxEnableFwCalcDur = 1;
1654         skb_push(skb, priv->rtllib->tx_headroom);
1655         ret = _rtl92e_tx(dev, skb);
1656         if (ret != 0)
1657                 kfree_skb(skb);
1658         return ret;
1659 }
1660
1661 static void _rtl92e_tx_isr(struct net_device *dev, int prio)
1662 {
1663         struct r8192_priv *priv = rtllib_priv(dev);
1664
1665         struct rtl8192_tx_ring *ring = &priv->tx_ring[prio];
1666
1667         while (skb_queue_len(&ring->queue)) {
1668                 struct tx_desc *entry = &ring->desc[ring->idx];
1669                 struct sk_buff *skb;
1670
1671                 if (prio != BEACON_QUEUE) {
1672                         if (entry->OWN)
1673                                 return;
1674                         ring->idx = (ring->idx + 1) % ring->entries;
1675                 }
1676
1677                 skb = __skb_dequeue(&ring->queue);
1678                 dma_unmap_single(&priv->pdev->dev, entry->TxBuffAddr,
1679                                  skb->len, DMA_TO_DEVICE);
1680
1681                 kfree_skb(skb);
1682         }
1683         if (prio != BEACON_QUEUE)
1684                 tasklet_schedule(&priv->irq_tx_tasklet);
1685 }
1686
1687 static void _rtl92e_tx_cmd(struct net_device *dev, struct sk_buff *skb)
1688 {
1689         struct r8192_priv *priv = rtllib_priv(dev);
1690         struct rtl8192_tx_ring *ring;
1691         struct tx_desc_cmd *entry;
1692         unsigned int idx;
1693         struct cb_desc *tcb_desc;
1694         unsigned long flags;
1695
1696         spin_lock_irqsave(&priv->irq_th_lock, flags);
1697         ring = &priv->tx_ring[TXCMD_QUEUE];
1698
1699         idx = (ring->idx + skb_queue_len(&ring->queue)) % ring->entries;
1700         entry = (struct tx_desc_cmd *)&ring->desc[idx];
1701
1702         tcb_desc = (struct cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1703
1704         priv->ops->tx_fill_cmd_descriptor(dev, entry, tcb_desc, skb);
1705
1706         __skb_queue_tail(&ring->queue, skb);
1707         spin_unlock_irqrestore(&priv->irq_th_lock, flags);
1708 }
1709
1710 static short _rtl92e_tx(struct net_device *dev, struct sk_buff *skb)
1711 {
1712         struct r8192_priv *priv = rtllib_priv(dev);
1713         struct rtl8192_tx_ring  *ring;
1714         unsigned long flags;
1715         struct cb_desc *tcb_desc = (struct cb_desc *)(skb->cb +
1716                                     MAX_DEV_ADDR_SIZE);
1717         struct tx_desc *pdesc = NULL;
1718         struct rtllib_hdr_1addr *header = NULL;
1719         u16 fc = 0, type = 0;
1720         u8 *pda_addr = NULL;
1721         int   idx;
1722         u32 fwinfo_size = 0;
1723
1724         if (priv->bdisable_nic) {
1725                 netdev_warn(dev, "%s: Nic is disabled! Can't tx packet.\n",
1726                             __func__);
1727                 return skb->len;
1728         }
1729
1730         priv->rtllib->bAwakePktSent = true;
1731
1732         fwinfo_size = sizeof(struct tx_fwinfo_8190pci);
1733
1734         header = (struct rtllib_hdr_1addr *)(((u8 *)skb->data) + fwinfo_size);
1735         fc = le16_to_cpu(header->frame_ctl);
1736         type = WLAN_FC_GET_TYPE(fc);
1737         pda_addr = header->addr1;
1738
1739         if (is_broadcast_ether_addr(pda_addr))
1740                 priv->stats.txbytesbroadcast += skb->len - fwinfo_size;
1741         else if (is_multicast_ether_addr(pda_addr))
1742                 priv->stats.txbytesmulticast += skb->len - fwinfo_size;
1743         else
1744                 priv->stats.txbytesunicast += skb->len - fwinfo_size;
1745
1746         spin_lock_irqsave(&priv->irq_th_lock, flags);
1747         ring = &priv->tx_ring[tcb_desc->queue_index];
1748         if (tcb_desc->queue_index != BEACON_QUEUE)
1749                 idx = (ring->idx + skb_queue_len(&ring->queue)) % ring->entries;
1750         else
1751                 idx = 0;
1752
1753         pdesc = &ring->desc[idx];
1754         if ((pdesc->OWN == 1) && (tcb_desc->queue_index != BEACON_QUEUE)) {
1755                 netdev_warn(dev,
1756                             "No more TX desc@%d, ring->idx = %d, idx = %d, skblen = 0x%x queuelen=%d",
1757                             tcb_desc->queue_index, ring->idx, idx, skb->len,
1758                             skb_queue_len(&ring->queue));
1759                 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
1760                 return skb->len;
1761         }
1762
1763         if (type == RTLLIB_FTYPE_DATA) {
1764                 if (priv->rtllib->LedControlHandler)
1765                         priv->rtllib->LedControlHandler(dev, LED_CTL_TX);
1766         }
1767         priv->ops->tx_fill_descriptor(dev, pdesc, tcb_desc, skb);
1768         __skb_queue_tail(&ring->queue, skb);
1769         pdesc->OWN = 1;
1770         spin_unlock_irqrestore(&priv->irq_th_lock, flags);
1771         netif_trans_update(dev);
1772
1773         rtl92e_writew(dev, TPPoll, 0x01 << tcb_desc->queue_index);
1774         return 0;
1775 }
1776
1777 static short _rtl92e_alloc_rx_ring(struct net_device *dev)
1778 {
1779         struct r8192_priv *priv = rtllib_priv(dev);
1780         struct rx_desc *entry = NULL;
1781         int i, rx_queue_idx;
1782
1783         for (rx_queue_idx = 0; rx_queue_idx < MAX_RX_QUEUE; rx_queue_idx++) {
1784                 priv->rx_ring[rx_queue_idx] = dma_alloc_coherent(&priv->pdev->dev,
1785                                                                  sizeof(*priv->rx_ring[rx_queue_idx]) * priv->rxringcount,
1786                                                                  &priv->rx_ring_dma[rx_queue_idx],
1787                                                                  GFP_ATOMIC);
1788                 if (!priv->rx_ring[rx_queue_idx] ||
1789                     (unsigned long)priv->rx_ring[rx_queue_idx] & 0xFF) {
1790                         netdev_warn(dev, "Cannot allocate RX ring\n");
1791                         return -ENOMEM;
1792                 }
1793
1794                 priv->rx_idx[rx_queue_idx] = 0;
1795
1796                 for (i = 0; i < priv->rxringcount; i++) {
1797                         struct sk_buff *skb = dev_alloc_skb(priv->rxbuffersize);
1798                         dma_addr_t *mapping;
1799
1800                         entry = &priv->rx_ring[rx_queue_idx][i];
1801                         if (!skb)
1802                                 return 0;
1803                         skb->dev = dev;
1804                         priv->rx_buf[rx_queue_idx][i] = skb;
1805                         mapping = (dma_addr_t *)skb->cb;
1806                         *mapping = dma_map_single(&priv->pdev->dev,
1807                                                   skb_tail_pointer_rsl(skb),
1808                                                   priv->rxbuffersize, DMA_FROM_DEVICE);
1809                         if (dma_mapping_error(&priv->pdev->dev, *mapping)) {
1810                                 dev_kfree_skb_any(skb);
1811                                 return -1;
1812                         }
1813                         entry->BufferAddress = *mapping;
1814
1815                         entry->Length = priv->rxbuffersize;
1816                         entry->OWN = 1;
1817                 }
1818
1819                 if (entry)
1820                         entry->EOR = 1;
1821         }
1822         return 0;
1823 }
1824
1825 static int _rtl92e_alloc_tx_ring(struct net_device *dev, unsigned int prio,
1826                                  unsigned int entries)
1827 {
1828         struct r8192_priv *priv = rtllib_priv(dev);
1829         struct tx_desc *ring;
1830         dma_addr_t dma;
1831         int i;
1832
1833         ring = dma_alloc_coherent(&priv->pdev->dev, sizeof(*ring) * entries,
1834                                   &dma, GFP_ATOMIC);
1835         if (!ring || (unsigned long)ring & 0xFF) {
1836                 netdev_warn(dev, "Cannot allocate TX ring (prio = %d)\n", prio);
1837                 return -ENOMEM;
1838         }
1839
1840         priv->tx_ring[prio].desc = ring;
1841         priv->tx_ring[prio].dma = dma;
1842         priv->tx_ring[prio].idx = 0;
1843         priv->tx_ring[prio].entries = entries;
1844         skb_queue_head_init(&priv->tx_ring[prio].queue);
1845
1846         for (i = 0; i < entries; i++)
1847                 ring[i].NextDescAddress =
1848                         (u32)dma + ((i + 1) % entries) *
1849                         sizeof(*ring);
1850
1851         return 0;
1852 }
1853
1854 static short _rtl92e_pci_initdescring(struct net_device *dev)
1855 {
1856         u32 ret;
1857         int i;
1858         struct r8192_priv *priv = rtllib_priv(dev);
1859
1860         ret = _rtl92e_alloc_rx_ring(dev);
1861         if (ret)
1862                 return ret;
1863
1864         for (i = 0; i < MAX_TX_QUEUE_COUNT; i++) {
1865                 ret = _rtl92e_alloc_tx_ring(dev, i, priv->txringcount);
1866                 if (ret)
1867                         goto err_free_rings;
1868         }
1869
1870         return 0;
1871
1872 err_free_rings:
1873         _rtl92e_free_rx_ring(dev);
1874         for (i = 0; i < MAX_TX_QUEUE_COUNT; i++)
1875                 if (priv->tx_ring[i].desc)
1876                         _rtl92e_free_tx_ring(dev, i);
1877         return 1;
1878 }
1879
1880 void rtl92e_reset_desc_ring(struct net_device *dev)
1881 {
1882         struct r8192_priv *priv = rtllib_priv(dev);
1883         int i, rx_queue_idx;
1884         unsigned long flags = 0;
1885
1886         for (rx_queue_idx = 0; rx_queue_idx < MAX_RX_QUEUE; rx_queue_idx++) {
1887                 if (priv->rx_ring[rx_queue_idx]) {
1888                         struct rx_desc *entry = NULL;
1889
1890                         for (i = 0; i < priv->rxringcount; i++) {
1891                                 entry = &priv->rx_ring[rx_queue_idx][i];
1892                                 entry->OWN = 1;
1893                         }
1894                         priv->rx_idx[rx_queue_idx] = 0;
1895                 }
1896         }
1897
1898         spin_lock_irqsave(&priv->irq_th_lock, flags);
1899         for (i = 0; i < MAX_TX_QUEUE_COUNT; i++) {
1900                 if (priv->tx_ring[i].desc) {
1901                         struct rtl8192_tx_ring *ring = &priv->tx_ring[i];
1902
1903                         while (skb_queue_len(&ring->queue)) {
1904                                 struct tx_desc *entry = &ring->desc[ring->idx];
1905                                 struct sk_buff *skb =
1906                                                  __skb_dequeue(&ring->queue);
1907
1908                                 dma_unmap_single(&priv->pdev->dev,
1909                                                  entry->TxBuffAddr, skb->len,
1910                                                  DMA_TO_DEVICE);
1911                                 kfree_skb(skb);
1912                                 ring->idx = (ring->idx + 1) % ring->entries;
1913                         }
1914                         ring->idx = 0;
1915                 }
1916         }
1917         spin_unlock_irqrestore(&priv->irq_th_lock, flags);
1918 }
1919
1920 void rtl92e_update_rx_pkt_timestamp(struct net_device *dev,
1921                                     struct rtllib_rx_stats *stats)
1922 {
1923         struct r8192_priv *priv = rtllib_priv(dev);
1924
1925         if (stats->bIsAMPDU && !stats->bFirstMPDU)
1926                 stats->mac_time = priv->LastRxDescTSF;
1927         else
1928                 priv->LastRxDescTSF = stats->mac_time;
1929 }
1930
1931 long rtl92e_translate_to_dbm(struct r8192_priv *priv, u8 signal_strength_index)
1932 {
1933         long    signal_power;
1934
1935         signal_power = (long)((signal_strength_index + 1) >> 1);
1936         signal_power -= 95;
1937
1938         return signal_power;
1939 }
1940
1941
1942 void rtl92e_update_rx_statistics(struct r8192_priv *priv,
1943                                  struct rtllib_rx_stats *pprevious_stats)
1944 {
1945         int weighting = 0;
1946
1947
1948         if (priv->stats.recv_signal_power == 0)
1949                 priv->stats.recv_signal_power =
1950                                          pprevious_stats->RecvSignalPower;
1951
1952         if (pprevious_stats->RecvSignalPower > priv->stats.recv_signal_power)
1953                 weighting = 5;
1954         else if (pprevious_stats->RecvSignalPower <
1955                  priv->stats.recv_signal_power)
1956                 weighting = (-5);
1957         priv->stats.recv_signal_power = (priv->stats.recv_signal_power * 5 +
1958                                         pprevious_stats->RecvSignalPower +
1959                                         weighting) / 6;
1960 }
1961
1962 u8 rtl92e_rx_db_to_percent(s8 antpower)
1963 {
1964         if ((antpower <= -100) || (antpower >= 20))
1965                 return  0;
1966         else if (antpower >= 0)
1967                 return  100;
1968         else
1969                 return  100 + antpower;
1970
1971 }       /* QueryRxPwrPercentage */
1972
1973 u8 rtl92e_evm_db_to_percent(s8 value)
1974 {
1975         s8 ret_val = clamp(-value, 0, 33) * 3;
1976
1977         if (ret_val == 99)
1978                 ret_val = 100;
1979
1980         return ret_val;
1981 }
1982
1983 void rtl92e_copy_mpdu_stats(struct rtllib_rx_stats *psrc_stats,
1984                             struct rtllib_rx_stats *ptarget_stats)
1985 {
1986         ptarget_stats->bIsAMPDU = psrc_stats->bIsAMPDU;
1987         ptarget_stats->bFirstMPDU = psrc_stats->bFirstMPDU;
1988 }
1989
1990
1991
1992 static void _rtl92e_rx_normal(struct net_device *dev)
1993 {
1994         struct r8192_priv *priv = rtllib_priv(dev);
1995         struct rtllib_hdr_1addr *rtllib_hdr = NULL;
1996         bool unicast_packet = false;
1997         bool bLedBlinking = true;
1998         u16 fc = 0, type = 0;
1999         u32 skb_len = 0;
2000         int rx_queue_idx = RX_MPDU_QUEUE;
2001
2002         struct rtllib_rx_stats stats = {
2003                 .signal = 0,
2004                 .noise = (u8)-98,
2005                 .rate = 0,
2006                 .freq = RTLLIB_24GHZ_BAND,
2007         };
2008         unsigned int count = priv->rxringcount;
2009
2010         stats.nic_type = NIC_8192E;
2011
2012         while (count--) {
2013                 struct rx_desc *pdesc = &priv->rx_ring[rx_queue_idx]
2014                                         [priv->rx_idx[rx_queue_idx]];
2015                 struct sk_buff *skb = priv->rx_buf[rx_queue_idx]
2016                                       [priv->rx_idx[rx_queue_idx]];
2017                 struct sk_buff *new_skb;
2018
2019                 if (pdesc->OWN)
2020                         return;
2021                 if (!priv->ops->rx_query_status_descriptor(dev, &stats,
2022                 pdesc, skb))
2023                         goto done;
2024                 new_skb = dev_alloc_skb(priv->rxbuffersize);
2025                 /* if allocation of new skb failed - drop current packet
2026                  * and reuse skb
2027                  */
2028                 if (unlikely(!new_skb))
2029                         goto done;
2030
2031                 dma_unmap_single(&priv->pdev->dev, *((dma_addr_t *)skb->cb),
2032                                  priv->rxbuffersize, DMA_FROM_DEVICE);
2033
2034                 skb_put(skb, pdesc->Length);
2035                 skb_reserve(skb, stats.RxDrvInfoSize +
2036                         stats.RxBufShift);
2037                 skb_trim(skb, skb->len - 4/*sCrcLng*/);
2038                 rtllib_hdr = (struct rtllib_hdr_1addr *)skb->data;
2039                 if (!is_multicast_ether_addr(rtllib_hdr->addr1)) {
2040                         /* unicast packet */
2041                         unicast_packet = true;
2042                 }
2043                 fc = le16_to_cpu(rtllib_hdr->frame_ctl);
2044                 type = WLAN_FC_GET_TYPE(fc);
2045                 if (type == RTLLIB_FTYPE_MGMT)
2046                         bLedBlinking = false;
2047
2048                 if (bLedBlinking)
2049                         if (priv->rtllib->LedControlHandler)
2050                                 priv->rtllib->LedControlHandler(dev,
2051                                                         LED_CTL_RX);
2052
2053                 if (stats.bCRC) {
2054                         if (type != RTLLIB_FTYPE_MGMT)
2055                                 priv->stats.rxdatacrcerr++;
2056                         else
2057                                 priv->stats.rxmgmtcrcerr++;
2058                 }
2059
2060                 skb_len = skb->len;
2061
2062                 if (!rtllib_rx(priv->rtllib, skb, &stats)) {
2063                         dev_kfree_skb_any(skb);
2064                 } else {
2065                         priv->stats.rxok++;
2066                         if (unicast_packet)
2067                                 priv->stats.rxbytesunicast += skb_len;
2068                 }
2069
2070                 skb = new_skb;
2071                 skb->dev = dev;
2072
2073                 priv->rx_buf[rx_queue_idx][priv->rx_idx[rx_queue_idx]] =
2074                                                                  skb;
2075                 *((dma_addr_t *)skb->cb) = dma_map_single(&priv->pdev->dev,
2076                                                           skb_tail_pointer_rsl(skb),
2077                                                           priv->rxbuffersize, DMA_FROM_DEVICE);
2078                 if (dma_mapping_error(&priv->pdev->dev, *((dma_addr_t *)skb->cb))) {
2079                         dev_kfree_skb_any(skb);
2080                         return;
2081                 }
2082 done:
2083                 pdesc->BufferAddress = *((dma_addr_t *)skb->cb);
2084                 pdesc->OWN = 1;
2085                 pdesc->Length = priv->rxbuffersize;
2086                 if (priv->rx_idx[rx_queue_idx] == priv->rxringcount - 1)
2087                         pdesc->EOR = 1;
2088                 priv->rx_idx[rx_queue_idx] = (priv->rx_idx[rx_queue_idx] + 1) %
2089                                               priv->rxringcount;
2090         }
2091
2092 }
2093
2094 static void _rtl92e_tx_resume(struct net_device *dev)
2095 {
2096         struct r8192_priv *priv = rtllib_priv(dev);
2097         struct rtllib_device *ieee = priv->rtllib;
2098         struct sk_buff *skb;
2099         int queue_index;
2100
2101         for (queue_index = BK_QUEUE;
2102              queue_index < MAX_QUEUE_SIZE; queue_index++) {
2103                 while ((!skb_queue_empty(&ieee->skb_waitQ[queue_index])) &&
2104                 (priv->rtllib->check_nic_enough_desc(dev, queue_index) > 0)) {
2105                         skb = skb_dequeue(&ieee->skb_waitQ[queue_index]);
2106                         ieee->softmac_data_hard_start_xmit(skb, dev, 0);
2107                 }
2108         }
2109 }
2110
2111 static void _rtl92e_irq_tx_tasklet(struct tasklet_struct *t)
2112 {
2113         struct r8192_priv *priv = from_tasklet(priv, t, irq_tx_tasklet);
2114
2115         _rtl92e_tx_resume(priv->rtllib->dev);
2116 }
2117
2118 static void _rtl92e_irq_rx_tasklet(struct tasklet_struct *t)
2119 {
2120         struct r8192_priv *priv = from_tasklet(priv, t, irq_rx_tasklet);
2121
2122         _rtl92e_rx_normal(priv->rtllib->dev);
2123
2124         rtl92e_writel(priv->rtllib->dev, INTA_MASK,
2125                       rtl92e_readl(priv->rtllib->dev, INTA_MASK) | IMR_RDU);
2126 }
2127
2128 /****************************************************************************
2129  * ---------------------------- NIC START/CLOSE STUFF---------------------------
2130  ****************************************************************************/
2131 static void _rtl92e_cancel_deferred_work(struct r8192_priv *priv)
2132 {
2133         cancel_delayed_work_sync(&priv->watch_dog_wq);
2134         cancel_delayed_work_sync(&priv->update_beacon_wq);
2135         cancel_delayed_work(&priv->rtllib->hw_sleep_wq);
2136         cancel_work_sync(&priv->reset_wq);
2137         cancel_work_sync(&priv->qos_activate);
2138 }
2139
2140 static int _rtl92e_up(struct net_device *dev, bool is_silent_reset)
2141 {
2142         if (_rtl92e_sta_up(dev, is_silent_reset) == -1)
2143                 return -1;
2144         return 0;
2145 }
2146
2147 static int _rtl92e_open(struct net_device *dev)
2148 {
2149         struct r8192_priv *priv = rtllib_priv(dev);
2150         int ret;
2151
2152         mutex_lock(&priv->wx_mutex);
2153         ret = _rtl92e_try_up(dev);
2154         mutex_unlock(&priv->wx_mutex);
2155         return ret;
2156
2157 }
2158
2159 static int _rtl92e_try_up(struct net_device *dev)
2160 {
2161         struct r8192_priv *priv = rtllib_priv(dev);
2162
2163         if (priv->up == 1)
2164                 return -1;
2165         return _rtl92e_up(dev, false);
2166 }
2167
2168
2169 static int _rtl92e_close(struct net_device *dev)
2170 {
2171         struct r8192_priv *priv = rtllib_priv(dev);
2172         int ret;
2173
2174         if ((rtllib_act_scanning(priv->rtllib, false)) &&
2175                 !(priv->rtllib->softmac_features & IEEE_SOFTMAC_SCAN)) {
2176                 rtllib_stop_scan(priv->rtllib);
2177         }
2178
2179         mutex_lock(&priv->wx_mutex);
2180
2181         ret = _rtl92e_down(dev, true);
2182
2183         mutex_unlock(&priv->wx_mutex);
2184
2185         return ret;
2186
2187 }
2188
2189 static int _rtl92e_down(struct net_device *dev, bool shutdownrf)
2190 {
2191         if (_rtl92e_sta_down(dev, shutdownrf) == -1)
2192                 return -1;
2193
2194         return 0;
2195 }
2196
2197 void rtl92e_commit(struct net_device *dev)
2198 {
2199         struct r8192_priv *priv = rtllib_priv(dev);
2200
2201         if (priv->up == 0)
2202                 return;
2203         rtllib_softmac_stop_protocol(priv->rtllib, 0, true);
2204         rtl92e_irq_disable(dev);
2205         priv->ops->stop_adapter(dev, true);
2206         _rtl92e_up(dev, false);
2207 }
2208
2209 static void _rtl92e_restart(void *data)
2210 {
2211         struct r8192_priv *priv = container_of_work_rsl(data, struct r8192_priv,
2212                                   reset_wq);
2213         struct net_device *dev = priv->rtllib->dev;
2214
2215         mutex_lock(&priv->wx_mutex);
2216
2217         rtl92e_commit(dev);
2218
2219         mutex_unlock(&priv->wx_mutex);
2220 }
2221
2222 static void _rtl92e_set_multicast(struct net_device *dev)
2223 {
2224         struct r8192_priv *priv = rtllib_priv(dev);
2225         short promisc;
2226
2227         promisc = (dev->flags & IFF_PROMISC) ? 1 : 0;
2228         priv->promisc = promisc;
2229
2230 }
2231
2232
2233 static int _rtl92e_set_mac_adr(struct net_device *dev, void *mac)
2234 {
2235         struct r8192_priv *priv = rtllib_priv(dev);
2236         struct sockaddr *addr = mac;
2237
2238         mutex_lock(&priv->wx_mutex);
2239
2240         ether_addr_copy(dev->dev_addr, addr->sa_data);
2241
2242         schedule_work(&priv->reset_wq);
2243         mutex_unlock(&priv->wx_mutex);
2244
2245         return 0;
2246 }
2247
2248 static irqreturn_t _rtl92e_irq(int irq, void *netdev)
2249 {
2250         struct net_device *dev = netdev;
2251         struct r8192_priv *priv = rtllib_priv(dev);
2252         unsigned long flags;
2253         u32 inta;
2254         u32 intb;
2255
2256         intb = 0;
2257
2258         if (priv->irq_enabled == 0)
2259                 goto done;
2260
2261         spin_lock_irqsave(&priv->irq_th_lock, flags);
2262
2263         priv->ops->interrupt_recognized(dev, &inta, &intb);
2264         priv->stats.shints++;
2265
2266         if (!inta) {
2267                 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
2268                 goto done;
2269         }
2270
2271         if (inta == 0xffff) {
2272                 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
2273                 goto done;
2274         }
2275
2276         priv->stats.ints++;
2277
2278         if (!netif_running(dev)) {
2279                 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
2280                 goto done;
2281         }
2282
2283         if (inta & IMR_TBDOK) {
2284                 RT_TRACE(COMP_INTR, "beacon ok interrupt!\n");
2285                 priv->stats.txbeaconokint++;
2286         }
2287
2288         if (inta & IMR_TBDER) {
2289                 RT_TRACE(COMP_INTR, "beacon ok interrupt!\n");
2290                 priv->stats.txbeaconerr++;
2291         }
2292
2293         if (inta & IMR_BDOK)
2294                 RT_TRACE(COMP_INTR, "beacon interrupt!\n");
2295
2296         if (inta  & IMR_MGNTDOK) {
2297                 RT_TRACE(COMP_INTR, "Manage ok interrupt!\n");
2298                 priv->stats.txmanageokint++;
2299                 _rtl92e_tx_isr(dev, MGNT_QUEUE);
2300                 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
2301                 if (priv->rtllib->ack_tx_to_ieee) {
2302                         if (_rtl92e_is_tx_queue_empty(dev)) {
2303                                 priv->rtllib->ack_tx_to_ieee = 0;
2304                                 rtllib_ps_tx_ack(priv->rtllib, 1);
2305                         }
2306                 }
2307                 spin_lock_irqsave(&priv->irq_th_lock, flags);
2308         }
2309
2310         if (inta & IMR_COMDOK) {
2311                 priv->stats.txcmdpktokint++;
2312                 _rtl92e_tx_isr(dev, TXCMD_QUEUE);
2313         }
2314
2315         if (inta & IMR_HIGHDOK)
2316                 _rtl92e_tx_isr(dev, HIGH_QUEUE);
2317
2318         if (inta & IMR_ROK) {
2319                 priv->stats.rxint++;
2320                 priv->InterruptLog.nIMR_ROK++;
2321                 tasklet_schedule(&priv->irq_rx_tasklet);
2322         }
2323
2324         if (inta & IMR_BcnInt) {
2325                 RT_TRACE(COMP_INTR, "prepare beacon for interrupt!\n");
2326                 tasklet_schedule(&priv->irq_prepare_beacon_tasklet);
2327         }
2328
2329         if (inta & IMR_RDU) {
2330                 RT_TRACE(COMP_INTR, "rx descriptor unavailable!\n");
2331                 priv->stats.rxrdu++;
2332                 rtl92e_writel(dev, INTA_MASK,
2333                               rtl92e_readl(dev, INTA_MASK) & ~IMR_RDU);
2334                 tasklet_schedule(&priv->irq_rx_tasklet);
2335         }
2336
2337         if (inta & IMR_RXFOVW) {
2338                 RT_TRACE(COMP_INTR, "rx overflow !\n");
2339                 priv->stats.rxoverflow++;
2340                 tasklet_schedule(&priv->irq_rx_tasklet);
2341         }
2342
2343         if (inta & IMR_TXFOVW)
2344                 priv->stats.txoverflow++;
2345
2346         if (inta & IMR_BKDOK) {
2347                 RT_TRACE(COMP_INTR, "BK Tx OK interrupt!\n");
2348                 priv->stats.txbkokint++;
2349                 priv->rtllib->LinkDetectInfo.NumTxOkInPeriod++;
2350                 _rtl92e_tx_isr(dev, BK_QUEUE);
2351         }
2352
2353         if (inta & IMR_BEDOK) {
2354                 RT_TRACE(COMP_INTR, "BE TX OK interrupt!\n");
2355                 priv->stats.txbeokint++;
2356                 priv->rtllib->LinkDetectInfo.NumTxOkInPeriod++;
2357                 _rtl92e_tx_isr(dev, BE_QUEUE);
2358         }
2359
2360         if (inta & IMR_VIDOK) {
2361                 RT_TRACE(COMP_INTR, "VI TX OK interrupt!\n");
2362                 priv->stats.txviokint++;
2363                 priv->rtllib->LinkDetectInfo.NumTxOkInPeriod++;
2364                 _rtl92e_tx_isr(dev, VI_QUEUE);
2365         }
2366
2367         if (inta & IMR_VODOK) {
2368                 priv->stats.txvookint++;
2369                 RT_TRACE(COMP_INTR, "Vo TX OK interrupt!\n");
2370                 priv->rtllib->LinkDetectInfo.NumTxOkInPeriod++;
2371                 _rtl92e_tx_isr(dev, VO_QUEUE);
2372         }
2373
2374         spin_unlock_irqrestore(&priv->irq_th_lock, flags);
2375
2376 done:
2377
2378         return IRQ_HANDLED;
2379 }
2380
2381
2382
2383 /****************************************************************************
2384  * ---------------------------- PCI_STUFF---------------------------
2385  ****************************************************************************/
2386 static const struct net_device_ops rtl8192_netdev_ops = {
2387         .ndo_open = _rtl92e_open,
2388         .ndo_stop = _rtl92e_close,
2389         .ndo_tx_timeout = _rtl92e_tx_timeout,
2390         .ndo_set_rx_mode = _rtl92e_set_multicast,
2391         .ndo_set_mac_address = _rtl92e_set_mac_adr,
2392         .ndo_validate_addr = eth_validate_addr,
2393         .ndo_start_xmit = rtllib_xmit,
2394 };
2395
2396 static int _rtl92e_pci_probe(struct pci_dev *pdev,
2397                              const struct pci_device_id *id)
2398 {
2399         unsigned long ioaddr = 0;
2400         struct net_device *dev = NULL;
2401         struct r8192_priv *priv = NULL;
2402         struct rtl819x_ops *ops = (struct rtl819x_ops *)(id->driver_data);
2403         unsigned long pmem_start, pmem_len, pmem_flags;
2404         int err = -ENOMEM;
2405         u8 revision_id;
2406
2407         RT_TRACE(COMP_INIT, "Configuring chip resources");
2408
2409         if (pci_enable_device(pdev)) {
2410                 dev_err(&pdev->dev, "Failed to enable PCI device");
2411                 return -EIO;
2412         }
2413
2414         pci_set_master(pdev);
2415
2416         if (!dma_set_mask(&pdev->dev, DMA_BIT_MASK(32))) {
2417                 if (dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32))) {
2418                         dev_info(&pdev->dev,
2419                                  "Unable to obtain 32bit DMA for consistent allocations\n");
2420                         goto err_pci_disable;
2421                 }
2422         }
2423         dev = alloc_rtllib(sizeof(struct r8192_priv));
2424         if (!dev)
2425                 goto err_pci_disable;
2426
2427         err = -ENODEV;
2428
2429         pci_set_drvdata(pdev, dev);
2430         SET_NETDEV_DEV(dev, &pdev->dev);
2431         priv = rtllib_priv(dev);
2432         priv->rtllib = (struct rtllib_device *)netdev_priv_rsl(dev);
2433         priv->pdev = pdev;
2434         priv->rtllib->pdev = pdev;
2435         if ((pdev->subsystem_vendor == PCI_VENDOR_ID_DLINK) &&
2436             (pdev->subsystem_device == 0x3304))
2437                 priv->rtllib->bSupportRemoteWakeUp = 1;
2438         else
2439                 priv->rtllib->bSupportRemoteWakeUp = 0;
2440
2441         pmem_start = pci_resource_start(pdev, 1);
2442         pmem_len = pci_resource_len(pdev, 1);
2443         pmem_flags = pci_resource_flags(pdev, 1);
2444
2445         if (!(pmem_flags & IORESOURCE_MEM)) {
2446                 netdev_err(dev, "region #1 not a MMIO resource, aborting");
2447                 goto err_rel_rtllib;
2448         }
2449
2450         dev_info(&pdev->dev, "Memory mapped space start: 0x%08lx\n",
2451                  pmem_start);
2452         if (!request_mem_region(pmem_start, pmem_len, DRV_NAME)) {
2453                 netdev_err(dev, "request_mem_region failed!");
2454                 goto err_rel_rtllib;
2455         }
2456
2457
2458         ioaddr = (unsigned long)ioremap(pmem_start, pmem_len);
2459         if (ioaddr == (unsigned long)NULL) {
2460                 netdev_err(dev, "ioremap failed!");
2461                 goto err_rel_mem;
2462         }
2463
2464         dev->mem_start = ioaddr;
2465         dev->mem_end = ioaddr + pci_resource_len(pdev, 0);
2466
2467         pci_read_config_byte(pdev, 0x08, &revision_id);
2468         /* If the revisionid is 0x10, the device uses rtl8192se. */
2469         if (pdev->device == 0x8192 && revision_id == 0x10)
2470                 goto err_unmap;
2471
2472         priv->ops = ops;
2473
2474         if (rtl92e_check_adapter(pdev, dev) == false)
2475                 goto err_unmap;
2476
2477         dev->irq = pdev->irq;
2478         priv->irq = 0;
2479
2480         dev->netdev_ops = &rtl8192_netdev_ops;
2481
2482         dev->wireless_handlers = &r8192_wx_handlers_def;
2483         dev->ethtool_ops = &rtl819x_ethtool_ops;
2484
2485         dev->type = ARPHRD_ETHER;
2486         dev->watchdog_timeo = HZ * 3;
2487
2488         if (dev_alloc_name(dev, ifname) < 0) {
2489                 RT_TRACE(COMP_INIT,
2490                          "Oops: devname already taken! Trying wlan%%d...\n");
2491                 dev_alloc_name(dev, ifname);
2492         }
2493
2494         RT_TRACE(COMP_INIT, "Driver probe completed1\n");
2495         if (_rtl92e_init(dev) != 0) {
2496                 netdev_warn(dev, "Initialization failed");
2497                 goto err_free_irq;
2498         }
2499
2500         netif_carrier_off(dev);
2501         netif_stop_queue(dev);
2502
2503         if (register_netdev(dev))
2504                 goto err_free_irq;
2505         RT_TRACE(COMP_INIT, "dev name: %s\n", dev->name);
2506
2507         if (priv->polling_timer_on == 0)
2508                 rtl92e_check_rfctrl_gpio_timer(&priv->gpio_polling_timer);
2509
2510         RT_TRACE(COMP_INIT, "Driver probe completed\n");
2511         return 0;
2512
2513 err_free_irq:
2514         free_irq(dev->irq, dev);
2515         priv->irq = 0;
2516 err_unmap:
2517         iounmap((void __iomem *)ioaddr);
2518 err_rel_mem:
2519         release_mem_region(pmem_start, pmem_len);
2520 err_rel_rtllib:
2521         free_rtllib(dev);
2522 err_pci_disable:
2523         pci_disable_device(pdev);
2524         return err;
2525 }
2526
2527 static void _rtl92e_pci_disconnect(struct pci_dev *pdev)
2528 {
2529         struct net_device *dev = pci_get_drvdata(pdev);
2530         struct r8192_priv *priv;
2531         u32 i;
2532
2533         if (dev) {
2534                 unregister_netdev(dev);
2535
2536                 priv = rtllib_priv(dev);
2537
2538                 del_timer_sync(&priv->gpio_polling_timer);
2539                 cancel_delayed_work_sync(&priv->gpio_change_rf_wq);
2540                 priv->polling_timer_on = 0;
2541                 _rtl92e_down(dev, true);
2542                 rtl92e_dm_deinit(dev);
2543                 vfree(priv->pFirmware);
2544                 priv->pFirmware = NULL;
2545                 _rtl92e_free_rx_ring(dev);
2546                 for (i = 0; i < MAX_TX_QUEUE_COUNT; i++)
2547                         _rtl92e_free_tx_ring(dev, i);
2548
2549                 if (priv->irq) {
2550                         dev_info(&pdev->dev, "Freeing irq %d\n", dev->irq);
2551                         free_irq(dev->irq, dev);
2552                         priv->irq = 0;
2553                 }
2554
2555                 if (dev->mem_start != 0) {
2556                         iounmap((void __iomem *)dev->mem_start);
2557                         release_mem_region(pci_resource_start(pdev, 1),
2558                                         pci_resource_len(pdev, 1));
2559                 }
2560
2561                 free_rtllib(dev);
2562         } else {
2563                 priv = rtllib_priv(dev);
2564         }
2565
2566         pci_disable_device(pdev);
2567         RT_TRACE(COMP_DOWN, "wlan driver removed\n");
2568 }
2569
2570 bool rtl92e_enable_nic(struct net_device *dev)
2571 {
2572         bool init_status = true;
2573         struct r8192_priv *priv = rtllib_priv(dev);
2574         struct rt_pwr_save_ctrl *pPSC = (struct rt_pwr_save_ctrl *)
2575                                         (&priv->rtllib->PowerSaveControl);
2576
2577         if (!priv->up) {
2578                 netdev_warn(dev, "%s(): Driver is already down!\n", __func__);
2579                 priv->bdisable_nic = false;
2580                 return false;
2581         }
2582
2583         RT_TRACE(COMP_PS, "===========>%s()\n", __func__);
2584         priv->bfirst_init = true;
2585         init_status = priv->ops->initialize_adapter(dev);
2586         if (!init_status) {
2587                 netdev_warn(dev, "%s(): Initialization failed!\n", __func__);
2588                 priv->bdisable_nic = false;
2589                 return false;
2590         }
2591         RT_TRACE(COMP_INIT, "start adapter finished\n");
2592         RT_CLEAR_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC);
2593         priv->bfirst_init = false;
2594
2595         rtl92e_irq_enable(dev);
2596         priv->bdisable_nic = false;
2597         RT_TRACE(COMP_PS, "<===========%s()\n", __func__);
2598         return init_status;
2599 }
2600
2601 bool rtl92e_disable_nic(struct net_device *dev)
2602 {
2603         struct r8192_priv *priv = rtllib_priv(dev);
2604         u8 tmp_state = 0;
2605
2606         RT_TRACE(COMP_PS, "=========>%s()\n", __func__);
2607         priv->bdisable_nic = true;
2608         tmp_state = priv->rtllib->state;
2609         rtllib_softmac_stop_protocol(priv->rtllib, 0, false);
2610         priv->rtllib->state = tmp_state;
2611         _rtl92e_cancel_deferred_work(priv);
2612         rtl92e_irq_disable(dev);
2613
2614         priv->ops->stop_adapter(dev, false);
2615         RT_TRACE(COMP_PS, "<=========%s()\n", __func__);
2616
2617         return true;
2618 }
2619
2620 module_pci_driver(rtl8192_pci_driver);
2621
2622 void rtl92e_check_rfctrl_gpio_timer(struct timer_list *t)
2623 {
2624         struct r8192_priv *priv = from_timer(priv, t, gpio_polling_timer);
2625
2626         priv->polling_timer_on = 1;
2627
2628         schedule_delayed_work(&priv->gpio_change_rf_wq, 0);
2629
2630         mod_timer(&priv->gpio_polling_timer, jiffies +
2631                   msecs_to_jiffies(RTLLIB_WATCH_DOG_TIME));
2632 }
2633
2634 /***************************************************************************
2635  * ------------------- module init / exit stubs ----------------
2636  ***************************************************************************/
2637 MODULE_DESCRIPTION("Linux driver for Realtek RTL819x WiFi cards");
2638 MODULE_AUTHOR(DRV_COPYRIGHT " " DRV_AUTHOR);
2639 MODULE_VERSION(DRV_VERSION);
2640 MODULE_LICENSE("GPL");
2641 /*(DEBLOBBED)*/
2642
2643 module_param(ifname, charp, 0644);
2644 module_param(hwwep, int, 0644);
2645 module_param(channels, int, 0644);
2646
2647 MODULE_PARM_DESC(ifname, " Net interface name, wlan%d=default");
2648 MODULE_PARM_DESC(hwwep, " Try to use hardware WEP support(default use hw. set 0 to use software security)");
2649 MODULE_PARM_DESC(channels, " Channel bitmask for specific locales. NYI");