1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
5 * Based on the r8180 driver, which is:
6 * Copyright 2004-2005 Andrea Merello <andrea.merello@gmail.com>, et al.
8 * Contact Information: wlanfae <wlanfae@realtek.com>
10 #include <linux/uaccess.h>
11 #include <linux/pci.h>
12 #include <linux/vmalloc.h>
13 #include <linux/ieee80211.h>
15 #include "r8192E_phy.h"
16 #include "r8192E_phyreg.h"
17 #include "r8190P_rtl8256.h"
18 #include "r8192E_cmdpkt.h"
26 static char *ifname = "wlan%d";
28 static struct pci_device_id rtl8192_pci_id_tbl[] = {
29 {PCI_DEVICE(0x10ec, 0x8192)},
30 {PCI_DEVICE(0x07aa, 0x0044)},
31 {PCI_DEVICE(0x07aa, 0x0047)},
35 MODULE_DEVICE_TABLE(pci, rtl8192_pci_id_tbl);
37 static int _rtl92e_pci_probe(struct pci_dev *pdev,
38 const struct pci_device_id *id);
39 static void _rtl92e_pci_disconnect(struct pci_dev *pdev);
40 static irqreturn_t _rtl92e_irq(int irq, void *netdev);
42 static SIMPLE_DEV_PM_OPS(rtl92e_pm_ops, rtl92e_suspend, rtl92e_resume);
44 static struct pci_driver rtl8192_pci_driver = {
45 .name = DRV_NAME, /* Driver name */
46 .id_table = rtl8192_pci_id_tbl, /* PCI_ID table */
47 .probe = _rtl92e_pci_probe, /* probe fn */
48 .remove = _rtl92e_pci_disconnect, /* remove fn */
49 .driver.pm = &rtl92e_pm_ops,
52 static short _rtl92e_is_tx_queue_empty(struct net_device *dev);
53 static void _rtl92e_watchdog_wq_cb(void *data);
54 static void _rtl92e_watchdog_timer_cb(struct timer_list *t);
55 static void _rtl92e_hard_data_xmit(struct sk_buff *skb, struct net_device *dev,
57 static int _rtl92e_hard_start_xmit(struct sk_buff *skb, struct net_device *dev);
58 static void _rtl92e_tx_cmd(struct net_device *dev, struct sk_buff *skb);
59 static short _rtl92e_tx(struct net_device *dev, struct sk_buff *skb);
60 static short _rtl92e_pci_initdescring(struct net_device *dev);
61 static void _rtl92e_irq_tx_tasklet(struct tasklet_struct *t);
62 static void _rtl92e_irq_rx_tasklet(struct tasklet_struct *t);
63 static void _rtl92e_cancel_deferred_work(struct r8192_priv *priv);
64 static int _rtl92e_up(struct net_device *dev);
65 static int _rtl92e_try_up(struct net_device *dev);
66 static int _rtl92e_down(struct net_device *dev, bool shutdownrf);
67 static void _rtl92e_restart(void *data);
69 /****************************************************************************
70 * -----------------------------IO STUFF-------------------------
71 ****************************************************************************/
73 u8 rtl92e_readb(struct net_device *dev, int x)
75 return 0xff & readb((u8 __iomem *)dev->mem_start + x);
78 u32 rtl92e_readl(struct net_device *dev, int x)
80 return readl((u8 __iomem *)dev->mem_start + x);
83 u16 rtl92e_readw(struct net_device *dev, int x)
85 return readw((u8 __iomem *)dev->mem_start + x);
88 void rtl92e_writeb(struct net_device *dev, int x, u8 y)
90 writeb(y, (u8 __iomem *)dev->mem_start + x);
95 void rtl92e_writel(struct net_device *dev, int x, u32 y)
97 writel(y, (u8 __iomem *)dev->mem_start + x);
102 void rtl92e_writew(struct net_device *dev, int x, u16 y)
104 writew(y, (u8 __iomem *)dev->mem_start + x);
109 /****************************************************************************
110 * -----------------------------GENERAL FUNCTION-------------------------
111 ****************************************************************************/
112 bool rtl92e_set_rf_state(struct net_device *dev,
113 enum rt_rf_power_state state_to_set,
114 RT_RF_CHANGE_SOURCE change_source)
116 struct r8192_priv *priv = rtllib_priv(dev);
117 struct rtllib_device *ieee = priv->rtllib;
118 bool action_allowed = false;
119 bool connect_by_ssid = false;
120 enum rt_rf_power_state rt_state;
121 u16 rf_wait_counter = 0;
125 spin_lock_irqsave(&priv->rf_ps_lock, flag);
126 if (priv->rf_change_in_progress) {
127 spin_unlock_irqrestore(&priv->rf_ps_lock, flag);
129 while (priv->rf_change_in_progress) {
133 if (rf_wait_counter > 100) {
135 "%s(): Timeout waiting for RF change.\n",
141 priv->rf_change_in_progress = true;
142 spin_unlock_irqrestore(&priv->rf_ps_lock, flag);
147 rt_state = priv->rtllib->rf_power_state;
149 switch (state_to_set) {
151 priv->rtllib->rf_off_reason &= (~change_source);
153 if ((change_source == RF_CHANGE_BY_HW) && priv->hw_radio_off)
154 priv->hw_radio_off = false;
156 if (!priv->rtllib->rf_off_reason) {
157 priv->rtllib->rf_off_reason = 0;
158 action_allowed = true;
160 if (rt_state == rf_off &&
161 change_source >= RF_CHANGE_BY_HW)
162 connect_by_ssid = true;
168 if (priv->rtllib->iw_mode == IW_MODE_INFRA) {
169 if ((priv->rtllib->rf_off_reason > RF_CHANGE_BY_IPS) ||
170 (change_source > RF_CHANGE_BY_IPS)) {
171 if (ieee->link_state == MAC80211_LINKED)
172 priv->blinked_ingpio = true;
174 priv->blinked_ingpio = false;
175 rtllib_MgntDisconnect(priv->rtllib,
176 WLAN_REASON_DISASSOC_STA_HAS_LEFT);
179 if ((change_source == RF_CHANGE_BY_HW) && !priv->hw_radio_off)
180 priv->hw_radio_off = true;
181 priv->rtllib->rf_off_reason |= change_source;
182 action_allowed = true;
186 priv->rtllib->rf_off_reason |= change_source;
187 action_allowed = true;
194 if (action_allowed) {
195 rtl92e_set_rf_power_state(dev, state_to_set);
196 if (state_to_set == rf_on) {
197 if (connect_by_ssid && priv->blinked_ingpio) {
198 schedule_delayed_work(
199 &ieee->associate_procedure_wq, 0);
200 priv->blinked_ingpio = false;
205 spin_lock_irqsave(&priv->rf_ps_lock, flag);
206 priv->rf_change_in_progress = false;
207 spin_unlock_irqrestore(&priv->rf_ps_lock, flag);
208 return action_allowed;
211 static short _rtl92e_check_nic_enough_desc(struct net_device *dev, int prio)
213 struct r8192_priv *priv = rtllib_priv(dev);
214 struct rtl8192_tx_ring *ring = &priv->tx_ring[prio];
216 if (ring->entries - skb_queue_len(&ring->queue) >= 2)
221 static void _rtl92e_tx_timeout(struct net_device *dev, unsigned int txqueue)
223 struct r8192_priv *priv = rtllib_priv(dev);
225 schedule_work(&priv->reset_wq);
226 netdev_info(dev, "TXTIMEOUT");
229 static void _rtl92e_set_chan(struct net_device *dev, short ch)
231 struct r8192_priv *priv = rtllib_priv(dev);
235 if (priv->rf_set_chan)
236 priv->rf_set_chan(dev, priv->chan);
239 static void _rtl92e_update_cap(struct net_device *dev, u16 cap)
241 struct r8192_priv *priv = rtllib_priv(dev);
242 struct rtllib_network *net = &priv->rtllib->current_network;
245 if (cap & WLAN_CAPABILITY_SHORT_PREAMBLE) {
246 if (priv->dot11_current_preamble_mode != PREAMBLE_SHORT) {
247 ShortPreamble = true;
248 priv->dot11_current_preamble_mode = PREAMBLE_SHORT;
249 priv->rtllib->SetHwRegHandler(dev, HW_VAR_ACK_PREAMBLE,
250 (unsigned char *)&ShortPreamble);
253 if (priv->dot11_current_preamble_mode != PREAMBLE_LONG) {
254 ShortPreamble = false;
255 priv->dot11_current_preamble_mode = PREAMBLE_LONG;
256 priv->rtllib->SetHwRegHandler(dev, HW_VAR_ACK_PREAMBLE,
257 (unsigned char *)&ShortPreamble);
261 if (net->mode & (WIRELESS_MODE_G | WIRELESS_MODE_N_24G)) {
263 u8 cur_slot_time = priv->slot_time;
265 if ((cap & WLAN_CAPABILITY_SHORT_SLOT_TIME) &&
266 (!priv->rtllib->ht_info->current_rt2rt_long_slot_time)) {
267 if (cur_slot_time != SHORT_SLOT_TIME) {
268 slot_time_val = SHORT_SLOT_TIME;
269 priv->rtllib->SetHwRegHandler(dev,
270 HW_VAR_SLOT_TIME, &slot_time_val);
273 if (cur_slot_time != NON_SHORT_SLOT_TIME) {
274 slot_time_val = NON_SHORT_SLOT_TIME;
275 priv->rtllib->SetHwRegHandler(dev,
276 HW_VAR_SLOT_TIME, &slot_time_val);
282 static const struct rtllib_qos_parameters def_qos_parameters = {
283 {cpu_to_le16(3), cpu_to_le16(3), cpu_to_le16(3), cpu_to_le16(3)},
284 {cpu_to_le16(7), cpu_to_le16(7), cpu_to_le16(7), cpu_to_le16(7)},
290 static void _rtl92e_update_beacon(void *data)
292 struct r8192_priv *priv = container_of(data, struct r8192_priv, update_beacon_wq.work);
293 struct net_device *dev = priv->rtllib->dev;
294 struct rtllib_device *ieee = priv->rtllib;
295 struct rtllib_network *net = &ieee->current_network;
297 if (ieee->ht_info->current_ht_support)
298 HT_update_self_and_peer_setting(ieee, net);
299 ieee->ht_info->current_rt2rt_long_slot_time = net->bssht.bd_rt2rt_long_slot_time;
300 ieee->ht_info->RT2RT_HT_Mode = net->bssht.rt2rt_ht_mode;
301 _rtl92e_update_cap(dev, net->capability);
304 static void _rtl92e_qos_activate(void *data)
306 struct r8192_priv *priv = container_of(data, struct r8192_priv, qos_activate);
307 struct net_device *dev = priv->rtllib->dev;
310 mutex_lock(&priv->mutex);
311 if (priv->rtllib->link_state != MAC80211_LINKED)
314 for (i = 0; i < QOS_QUEUE_NUM; i++)
315 priv->rtllib->SetHwRegHandler(dev, HW_VAR_AC_PARAM, (u8 *)(&i));
318 mutex_unlock(&priv->mutex);
321 static int _rtl92e_qos_handle_probe_response(struct r8192_priv *priv,
323 struct rtllib_network *network)
326 u32 size = sizeof(struct rtllib_qos_parameters);
328 if (priv->rtllib->link_state != MAC80211_LINKED)
331 if (priv->rtllib->iw_mode != IW_MODE_INFRA)
334 if (network->flags & NETWORK_HAS_QOS_MASK) {
335 if (active_network &&
336 (network->flags & NETWORK_HAS_QOS_PARAMETERS))
337 network->qos_data.active = network->qos_data.supported;
339 if ((network->qos_data.active == 1) && (active_network == 1) &&
340 (network->flags & NETWORK_HAS_QOS_PARAMETERS) &&
341 (network->qos_data.old_param_count !=
342 network->qos_data.param_count)) {
343 network->qos_data.old_param_count =
344 network->qos_data.param_count;
345 priv->rtllib->wmm_acm = network->qos_data.wmm_acm;
346 schedule_work(&priv->qos_activate);
349 memcpy(&priv->rtllib->current_network.qos_data.parameters,
350 &def_qos_parameters, size);
352 if ((network->qos_data.active == 1) && (active_network == 1))
353 schedule_work(&priv->qos_activate);
355 network->qos_data.active = 0;
356 network->qos_data.supported = 0;
362 static int _rtl92e_handle_beacon(struct net_device *dev,
363 struct rtllib_beacon *beacon,
364 struct rtllib_network *network)
366 struct r8192_priv *priv = rtllib_priv(dev);
368 _rtl92e_qos_handle_probe_response(priv, 1, network);
370 schedule_delayed_work(&priv->update_beacon_wq, 0);
374 static int _rtl92e_qos_assoc_resp(struct r8192_priv *priv,
375 struct rtllib_network *network)
378 u32 size = sizeof(struct rtllib_qos_parameters);
379 int set_qos_param = 0;
381 if (!priv || !network)
384 if (priv->rtllib->link_state != MAC80211_LINKED)
387 if (priv->rtllib->iw_mode != IW_MODE_INFRA)
390 spin_lock_irqsave(&priv->rtllib->lock, flags);
391 if (network->flags & NETWORK_HAS_QOS_PARAMETERS) {
392 memcpy(&priv->rtllib->current_network.qos_data.parameters,
393 &network->qos_data.parameters,
394 sizeof(struct rtllib_qos_parameters));
395 priv->rtllib->current_network.qos_data.active = 1;
396 priv->rtllib->wmm_acm = network->qos_data.wmm_acm;
398 priv->rtllib->current_network.qos_data.old_param_count =
399 priv->rtllib->current_network.qos_data.param_count;
400 priv->rtllib->current_network.qos_data.param_count =
401 network->qos_data.param_count;
403 memcpy(&priv->rtllib->current_network.qos_data.parameters,
404 &def_qos_parameters, size);
405 priv->rtllib->current_network.qos_data.active = 0;
406 priv->rtllib->current_network.qos_data.supported = 0;
410 spin_unlock_irqrestore(&priv->rtllib->lock, flags);
412 if (set_qos_param == 1) {
413 rtl92e_dm_init_edca_turbo(priv->rtllib->dev);
414 schedule_work(&priv->qos_activate);
419 static int _rtl92e_handle_assoc_response(struct net_device *dev,
420 struct rtllib_assoc_response_frame *resp,
421 struct rtllib_network *network)
423 struct r8192_priv *priv = rtllib_priv(dev);
425 _rtl92e_qos_assoc_resp(priv, network);
429 static void _rtl92e_prepare_beacon(struct tasklet_struct *t)
431 struct r8192_priv *priv = from_tasklet(priv, t,
432 irq_prepare_beacon_tasklet);
433 struct net_device *dev = priv->rtllib->dev;
434 struct sk_buff *pskb = NULL, *pnewskb = NULL;
435 struct cb_desc *tcb_desc = NULL;
436 struct rtl8192_tx_ring *ring = NULL;
437 struct tx_desc *pdesc = NULL;
439 ring = &priv->tx_ring[BEACON_QUEUE];
440 pskb = __skb_dequeue(&ring->queue);
443 pnewskb = rtllib_get_beacon(priv->rtllib);
447 tcb_desc = (struct cb_desc *)(pnewskb->cb + 8);
448 tcb_desc->queue_index = BEACON_QUEUE;
449 tcb_desc->data_rate = 2;
450 tcb_desc->ratr_index = 7;
451 tcb_desc->tx_dis_rate_fallback = 1;
452 tcb_desc->tx_use_drv_assinged_rate = 1;
453 skb_push(pnewskb, priv->rtllib->tx_headroom);
455 pdesc = &ring->desc[0];
456 rtl92e_fill_tx_desc(dev, pdesc, tcb_desc, pnewskb);
457 __skb_queue_tail(&ring->queue, pnewskb);
461 void rtl92e_config_rate(struct net_device *dev, u16 *rate_config)
463 struct r8192_priv *priv = rtllib_priv(dev);
464 struct rtllib_network *net;
465 u8 i = 0, basic_rate = 0;
467 net = &priv->rtllib->current_network;
469 for (i = 0; i < net->rates_len; i++) {
470 basic_rate = net->rates[i] & 0x7f;
471 switch (basic_rate) {
473 *rate_config |= RRSR_1M;
476 *rate_config |= RRSR_2M;
479 *rate_config |= RRSR_5_5M;
482 *rate_config |= RRSR_11M;
485 *rate_config |= RRSR_6M;
488 *rate_config |= RRSR_9M;
491 *rate_config |= RRSR_12M;
494 *rate_config |= RRSR_18M;
497 *rate_config |= RRSR_24M;
500 *rate_config |= RRSR_36M;
503 *rate_config |= RRSR_48M;
506 *rate_config |= RRSR_54M;
511 for (i = 0; i < net->rates_ex_len; i++) {
512 basic_rate = net->rates_ex[i] & 0x7f;
513 switch (basic_rate) {
515 *rate_config |= RRSR_1M;
518 *rate_config |= RRSR_2M;
521 *rate_config |= RRSR_5_5M;
524 *rate_config |= RRSR_11M;
527 *rate_config |= RRSR_6M;
530 *rate_config |= RRSR_9M;
533 *rate_config |= RRSR_12M;
536 *rate_config |= RRSR_18M;
539 *rate_config |= RRSR_24M;
542 *rate_config |= RRSR_36M;
545 *rate_config |= RRSR_48M;
548 *rate_config |= RRSR_54M;
554 static void _rtl92e_refresh_support_rate(struct r8192_priv *priv)
556 struct rtllib_device *ieee = priv->rtllib;
558 if (ieee->mode == WIRELESS_MODE_N_24G) {
559 memcpy(ieee->reg_dot11ht_oper_rate_set,
560 ieee->reg_ht_supp_rate_set, 16);
561 memcpy(ieee->reg_dot11tx_ht_oper_rate_set,
562 ieee->reg_ht_supp_rate_set, 16);
565 memset(ieee->reg_dot11ht_oper_rate_set, 0, 16);
569 void rtl92e_set_wireless_mode(struct net_device *dev, u8 wireless_mode)
571 struct r8192_priv *priv = rtllib_priv(dev);
572 u8 support_mode = (WIRELESS_MODE_N_24G | WIRELESS_MODE_G | WIRELESS_MODE_B);
574 if ((wireless_mode == WIRELESS_MODE_AUTO) || ((wireless_mode & support_mode) == 0))
575 wireless_mode = WIRELESS_MODE_N_24G;
577 if ((wireless_mode & (WIRELESS_MODE_B | WIRELESS_MODE_G)) ==
578 (WIRELESS_MODE_G | WIRELESS_MODE_B))
579 wireless_mode = WIRELESS_MODE_G;
581 priv->rtllib->mode = wireless_mode;
583 if (wireless_mode == WIRELESS_MODE_N_24G)
584 priv->rtllib->ht_info->enable_ht = 1;
586 priv->rtllib->ht_info->enable_ht = 0;
588 _rtl92e_refresh_support_rate(priv);
591 static int _rtl92e_sta_up(struct net_device *dev)
593 struct r8192_priv *priv = rtllib_priv(dev);
594 struct rt_pwr_save_ctrl *psc = (struct rt_pwr_save_ctrl *)
595 (&priv->rtllib->pwr_save_ctrl);
599 priv->rtllib->ieee_up = 1;
601 priv->up_first_time = 0;
602 init_status = rtl92e_start_adapter(dev);
604 netdev_err(dev, "%s(): Initialization failed!\n", __func__);
608 RT_CLEAR_PS_LEVEL(psc, RT_RF_OFF_LEVL_HALT_NIC);
610 if (priv->polling_timer_on == 0)
611 rtl92e_check_rfctrl_gpio_timer(&priv->gpio_polling_timer);
613 if (priv->rtllib->link_state != MAC80211_LINKED)
614 rtllib_softmac_start_protocol(priv->rtllib);
615 rtllib_reset_queue(priv->rtllib);
616 _rtl92e_watchdog_timer_cb(&priv->watch_dog_timer);
618 if (!netif_queue_stopped(dev))
619 netif_start_queue(dev);
621 netif_wake_queue(dev);
623 priv->bfirst_after_down = false;
627 static int _rtl92e_sta_down(struct net_device *dev, bool shutdownrf)
629 struct r8192_priv *priv = rtllib_priv(dev);
630 unsigned long flags = 0;
631 u8 rf_in_progress_timeout = 0;
636 priv->rtllib->rtllib_ips_leave(dev);
638 if (priv->rtllib->link_state == MAC80211_LINKED)
639 rtl92e_leisure_ps_leave(dev);
642 priv->rtllib->ieee_up = 0;
643 priv->bfirst_after_down = true;
644 if (!netif_queue_stopped(dev))
645 netif_stop_queue(dev);
647 priv->rtllib->wpa_ie_len = 0;
648 kfree(priv->rtllib->wpa_ie);
649 priv->rtllib->wpa_ie = NULL;
650 rtl92e_cam_reset(dev);
651 memset(priv->rtllib->swcamtable, 0, sizeof(struct sw_cam_table) * 32);
652 rtl92e_irq_disable(dev);
654 del_timer_sync(&priv->watch_dog_timer);
655 _rtl92e_cancel_deferred_work(priv);
656 cancel_delayed_work(&priv->rtllib->hw_wakeup_wq);
658 rtllib_softmac_stop_protocol(priv->rtllib);
659 spin_lock_irqsave(&priv->rf_ps_lock, flags);
660 while (priv->rf_change_in_progress) {
661 spin_unlock_irqrestore(&priv->rf_ps_lock, flags);
662 if (rf_in_progress_timeout > 100) {
663 spin_lock_irqsave(&priv->rf_ps_lock, flags);
667 rf_in_progress_timeout++;
668 spin_lock_irqsave(&priv->rf_ps_lock, flags);
670 priv->rf_change_in_progress = true;
671 spin_unlock_irqrestore(&priv->rf_ps_lock, flags);
672 rtl92e_stop_adapter(dev, false);
673 spin_lock_irqsave(&priv->rf_ps_lock, flags);
674 priv->rf_change_in_progress = false;
675 spin_unlock_irqrestore(&priv->rf_ps_lock, flags);
677 memset(&priv->rtllib->current_network, 0,
678 offsetof(struct rtllib_network, list));
683 static void _rtl92e_init_priv_handler(struct net_device *dev)
685 struct r8192_priv *priv = rtllib_priv(dev);
687 priv->rtllib->softmac_hard_start_xmit = _rtl92e_hard_start_xmit;
688 priv->rtllib->set_chan = _rtl92e_set_chan;
689 priv->rtllib->link_change = rtl92e_link_change;
690 priv->rtllib->softmac_data_hard_start_xmit = _rtl92e_hard_data_xmit;
691 priv->rtllib->check_nic_enough_desc = _rtl92e_check_nic_enough_desc;
692 priv->rtllib->handle_assoc_response = _rtl92e_handle_assoc_response;
693 priv->rtllib->handle_beacon = _rtl92e_handle_beacon;
694 priv->rtllib->set_wireless_mode = rtl92e_set_wireless_mode;
695 priv->rtllib->leisure_ps_leave = rtl92e_leisure_ps_leave;
696 priv->rtllib->set_bw_mode_handler = rtl92e_set_bw_mode;
697 priv->rf_set_chan = rtl92e_set_channel;
699 priv->rtllib->sta_wake_up = rtl92e_hw_wakeup;
700 priv->rtllib->enter_sleep_state = rtl92e_enter_sleep;
701 priv->rtllib->ps_is_queue_empty = _rtl92e_is_tx_queue_empty;
703 priv->rtllib->GetNmodeSupportBySecCfg = rtl92e_get_nmode_support_by_sec;
704 priv->rtllib->GetHalfNmodeSupportByAPsHandler =
705 rtl92e_is_halfn_supported_by_ap;
707 priv->rtllib->SetHwRegHandler = rtl92e_set_reg;
708 priv->rtllib->AllowAllDestAddrHandler = rtl92e_set_monitor_mode;
709 priv->rtllib->init_gain_handler = rtl92e_init_gain;
710 priv->rtllib->rtllib_ips_leave_wq = rtl92e_rtllib_ips_leave_wq;
711 priv->rtllib->rtllib_ips_leave = rtl92e_rtllib_ips_leave;
712 priv->rtllib->ScanOperationBackupHandler = rtl92e_scan_op_backup;
715 static void _rtl92e_init_priv_variable(struct net_device *dev)
717 struct r8192_priv *priv = rtllib_priv(dev);
720 priv->dot11_current_preamble_mode = PREAMBLE_AUTO;
721 priv->rtllib->status = 0;
722 priv->polling_timer_on = 0;
723 priv->up_first_time = 1;
724 priv->blinked_ingpio = false;
725 priv->being_init_adapter = false;
726 priv->txringcount = 64;
727 priv->rxbuffersize = 9100;
728 priv->rxringcount = MAX_RX_COUNT;
729 priv->irq_enabled = 0;
731 priv->rtllib->mode = WIRELESS_MODE_AUTO;
732 priv->rtllib->iw_mode = IW_MODE_INFRA;
733 priv->rtllib->ieee_up = 0;
734 priv->retry_rts = DEFAULT_RETRY_RTS;
735 priv->retry_data = DEFAULT_RETRY_DATA;
736 priv->rtllib->rts = DEFAULT_RTS_THRESHOLD;
737 priv->rtllib->rate = 110;
738 priv->promisc = (dev->flags & IFF_PROMISC) ? 1 : 0;
739 priv->bcck_in_ch14 = false;
740 priv->cck_present_attn = 0;
741 priv->rfa_txpowertrackingindex = 0;
742 priv->cck_pwr_enl = 6;
743 memset(priv->rtllib->swcamtable, 0, sizeof(struct sw_cam_table) * 32);
745 priv->rtllib->wx_set_enc = 0;
746 priv->hw_radio_off = false;
747 priv->rtllib->rf_off_reason = 0;
748 priv->rf_change_in_progress = false;
749 priv->hw_rf_off_action = 0;
750 priv->set_rf_pwr_state_in_progress = false;
751 priv->rtllib->pwr_save_ctrl.bLeisurePs = true;
752 priv->rtllib->LPSDelayCnt = 0;
753 priv->rtllib->sta_sleep = LPS_IS_WAKE;
754 priv->rtllib->rf_power_state = rf_on;
756 priv->rtllib->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
757 priv->rtllib->iw_mode = IW_MODE_INFRA;
758 priv->rtllib->be_scan_inprogress = false;
760 priv->rtllib->fts = DEFAULT_FRAG_THRESHOLD;
762 priv->fw_info = vzalloc(sizeof(struct rt_firmware));
765 "rtl8192e: Unable to allocate space for firmware\n");
767 skb_queue_head_init(&priv->skb_queue);
769 for (i = 0; i < MAX_QUEUE_SIZE; i++)
770 skb_queue_head_init(&priv->rtllib->skb_waitQ[i]);
773 static void _rtl92e_init_priv_lock(struct r8192_priv *priv)
775 spin_lock_init(&priv->tx_lock);
776 spin_lock_init(&priv->irq_th_lock);
777 spin_lock_init(&priv->rf_ps_lock);
778 spin_lock_init(&priv->ps_lock);
779 mutex_init(&priv->wx_mutex);
780 mutex_init(&priv->rf_mutex);
781 mutex_init(&priv->mutex);
784 static void _rtl92e_init_priv_task(struct net_device *dev)
786 struct r8192_priv *priv = rtllib_priv(dev);
788 INIT_WORK(&priv->reset_wq, (void *)_rtl92e_restart);
789 INIT_WORK(&priv->rtllib->ips_leave_wq, (void *)rtl92e_ips_leave_wq);
790 INIT_DELAYED_WORK(&priv->watch_dog_wq, (void *)_rtl92e_watchdog_wq_cb);
791 INIT_DELAYED_WORK(&priv->txpower_tracking_wq, (void *)rtl92e_dm_txpower_tracking_wq);
792 INIT_DELAYED_WORK(&priv->rfpath_check_wq, (void *)rtl92e_dm_rf_pathcheck_wq);
793 INIT_DELAYED_WORK(&priv->update_beacon_wq, (void *)_rtl92e_update_beacon);
794 INIT_WORK(&priv->qos_activate, (void *)_rtl92e_qos_activate);
795 INIT_DELAYED_WORK(&priv->rtllib->hw_wakeup_wq, (void *)rtl92e_hw_wakeup_wq);
796 INIT_DELAYED_WORK(&priv->rtllib->hw_sleep_wq, (void *)rtl92e_hw_sleep_wq);
797 tasklet_setup(&priv->irq_rx_tasklet, _rtl92e_irq_rx_tasklet);
798 tasklet_setup(&priv->irq_tx_tasklet, _rtl92e_irq_tx_tasklet);
799 tasklet_setup(&priv->irq_prepare_beacon_tasklet,
800 _rtl92e_prepare_beacon);
803 static short _rtl92e_get_channel_map(struct net_device *dev)
807 struct r8192_priv *priv = rtllib_priv(dev);
809 if (priv->chnl_plan >= COUNTRY_CODE_MAX) {
811 "rtl819x_init:Error channel plan! Set to default.\n");
812 priv->chnl_plan = COUNTRY_CODE_FCC;
814 dot11d_init(priv->rtllib);
815 dot11d_channel_map(priv->chnl_plan, priv->rtllib);
816 for (i = 1; i <= 11; i++)
817 (priv->rtllib->active_channel_map)[i] = 1;
818 (priv->rtllib->active_channel_map)[12] = 2;
819 (priv->rtllib->active_channel_map)[13] = 2;
824 static short _rtl92e_init(struct net_device *dev)
826 struct r8192_priv *priv = rtllib_priv(dev);
828 memset(&priv->stats, 0, sizeof(struct rt_stats));
830 _rtl92e_init_priv_handler(dev);
831 _rtl92e_init_priv_variable(dev);
832 _rtl92e_init_priv_lock(priv);
833 _rtl92e_init_priv_task(dev);
834 rtl92e_get_eeprom_size(dev);
835 rtl92e_init_variables(dev);
836 _rtl92e_get_channel_map(dev);
840 timer_setup(&priv->watch_dog_timer, _rtl92e_watchdog_timer_cb, 0);
842 timer_setup(&priv->gpio_polling_timer, rtl92e_check_rfctrl_gpio_timer,
845 rtl92e_irq_disable(dev);
846 if (request_irq(dev->irq, _rtl92e_irq, IRQF_SHARED, dev->name, dev)) {
847 netdev_err(dev, "Error allocating IRQ %d", dev->irq);
851 priv->irq = dev->irq;
853 if (_rtl92e_pci_initdescring(dev) != 0) {
854 netdev_err(dev, "Endopoints initialization failed");
855 free_irq(dev->irq, dev);
862 /***************************************************************************
863 * -------------------------------WATCHDOG STUFF---------------------------
864 **************************************************************************/
865 static short _rtl92e_is_tx_queue_empty(struct net_device *dev)
868 struct r8192_priv *priv = rtllib_priv(dev);
870 for (i = 0; i <= MGNT_QUEUE; i++) {
871 if ((i == TXCMD_QUEUE) || (i == HCCA_QUEUE))
873 if (skb_queue_len(&(&priv->tx_ring[i])->queue) > 0) {
874 netdev_info(dev, "===>tx queue is not empty:%d, %d\n",
875 i, skb_queue_len(&(&priv->tx_ring[i])->queue));
882 static enum reset_type _rtl92e_tx_check_stuck(struct net_device *dev)
884 struct r8192_priv *priv = rtllib_priv(dev);
886 bool bCheckFwTxCnt = false;
887 struct rtl8192_tx_ring *ring = NULL;
888 struct sk_buff *skb = NULL;
889 struct cb_desc *tcb_desc = NULL;
890 unsigned long flags = 0;
892 switch (priv->rtllib->ps) {
893 case RTLLIB_PS_DISABLED:
895 case (RTLLIB_PS_MBCAST | RTLLIB_PS_UNICAST):
900 spin_lock_irqsave(&priv->irq_th_lock, flags);
901 for (QueueID = 0; QueueID < MAX_TX_QUEUE; QueueID++) {
902 if (QueueID == TXCMD_QUEUE)
905 if (QueueID == BEACON_QUEUE)
908 ring = &priv->tx_ring[QueueID];
910 if (skb_queue_len(&ring->queue) == 0) {
913 skb = __skb_peek(&ring->queue);
914 tcb_desc = (struct cb_desc *)(skb->cb +
916 tcb_desc->nStuckCount++;
917 bCheckFwTxCnt = true;
918 if (tcb_desc->nStuckCount > 1)
920 "%s: QueueID=%d tcb_desc->nStuckCount=%d\n",
922 tcb_desc->nStuckCount);
925 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
928 if (rtl92e_is_tx_stuck(dev))
929 return RESET_TYPE_SILENT;
932 return RESET_TYPE_NORESET;
935 static enum reset_type _rtl92e_rx_check_stuck(struct net_device *dev)
937 if (rtl92e_is_rx_stuck(dev))
938 return RESET_TYPE_SILENT;
940 return RESET_TYPE_NORESET;
943 static void _rtl92e_if_check_reset(struct net_device *dev)
945 struct r8192_priv *priv = rtllib_priv(dev);
946 enum reset_type TxResetType = RESET_TYPE_NORESET;
947 enum reset_type RxResetType = RESET_TYPE_NORESET;
948 enum rt_rf_power_state rfState;
950 rfState = priv->rtllib->rf_power_state;
952 if (rfState == rf_on)
953 TxResetType = _rtl92e_tx_check_stuck(dev);
955 if (rfState == rf_on &&
956 (priv->rtllib->iw_mode == IW_MODE_INFRA) &&
957 (priv->rtllib->link_state == MAC80211_LINKED))
958 RxResetType = _rtl92e_rx_check_stuck(dev);
960 if (TxResetType == RESET_TYPE_SILENT ||
961 RxResetType == RESET_TYPE_SILENT) {
962 netdev_info(dev, "%s(): TxResetType is %d, RxResetType is %d\n",
963 __func__, TxResetType, RxResetType);
968 static void _rtl92e_update_rxcounts(struct r8192_priv *priv, u32 *TotalRxBcnNum,
977 SlotIndex = (priv->rtllib->link_detect_info.SlotIndex++) %
978 (priv->rtllib->link_detect_info.SlotNum);
979 priv->rtllib->link_detect_info.RxBcnNum[SlotIndex] =
980 priv->rtllib->link_detect_info.NumRecvBcnInPeriod;
981 priv->rtllib->link_detect_info.RxDataNum[SlotIndex] =
982 priv->rtllib->link_detect_info.NumRecvDataInPeriod;
983 for (i = 0; i < priv->rtllib->link_detect_info.SlotNum; i++) {
984 *TotalRxBcnNum += priv->rtllib->link_detect_info.RxBcnNum[i];
985 *TotalRxDataNum += priv->rtllib->link_detect_info.RxDataNum[i];
989 static void _rtl92e_watchdog_wq_cb(void *data)
991 struct r8192_priv *priv = container_of_dwork_rsl(data,
992 struct r8192_priv, watch_dog_wq);
993 struct net_device *dev = priv->rtllib->dev;
994 struct rtllib_device *ieee = priv->rtllib;
995 static u8 check_reset_cnt;
997 struct rt_pwr_save_ctrl *psc = (struct rt_pwr_save_ctrl *)
998 (&priv->rtllib->pwr_save_ctrl);
999 bool bBusyTraffic = false;
1000 bool bHigherBusyTraffic = false;
1001 bool bHigherBusyRxTraffic = false;
1002 bool bEnterPS = false;
1004 if (!priv->up || priv->hw_radio_off)
1007 if (priv->rtllib->link_state >= MAC80211_LINKED) {
1008 if (priv->rtllib->CntAfterLink < 2)
1009 priv->rtllib->CntAfterLink++;
1011 priv->rtllib->CntAfterLink = 0;
1014 rtl92e_dm_watchdog(dev);
1016 if (!rtllib_act_scanning(priv->rtllib, false)) {
1017 if ((ieee->iw_mode == IW_MODE_INFRA) && (ieee->link_state ==
1019 (ieee->rf_power_state == rf_on) && !ieee->is_set_key &&
1020 (!ieee->proto_stoppping) && !ieee->wx_set_enc) {
1021 if (ieee->pwr_save_ctrl.ReturnPoint == IPS_CALLBACK_NONE) {
1022 rtl92e_ips_enter(dev);
1026 if ((ieee->link_state == MAC80211_LINKED) && (ieee->iw_mode == IW_MODE_INFRA)) {
1027 if (ieee->link_detect_info.NumRxOkInPeriod > 100 ||
1028 ieee->link_detect_info.NumTxOkInPeriod > 100)
1029 bBusyTraffic = true;
1031 if (ieee->link_detect_info.NumRxOkInPeriod > 4000 ||
1032 ieee->link_detect_info.NumTxOkInPeriod > 4000) {
1033 bHigherBusyTraffic = true;
1034 if (ieee->link_detect_info.NumRxOkInPeriod > 5000)
1035 bHigherBusyRxTraffic = true;
1037 bHigherBusyRxTraffic = false;
1040 if (((ieee->link_detect_info.NumRxUnicastOkInPeriod +
1041 ieee->link_detect_info.NumTxOkInPeriod) > 8) ||
1042 (ieee->link_detect_info.NumRxUnicastOkInPeriod > 2))
1047 if (ieee->current_network.beacon_interval < 95)
1051 rtl92e_leisure_ps_enter(dev);
1053 rtl92e_leisure_ps_leave(dev);
1056 rtl92e_leisure_ps_leave(dev);
1059 ieee->link_detect_info.NumRxOkInPeriod = 0;
1060 ieee->link_detect_info.NumTxOkInPeriod = 0;
1061 ieee->link_detect_info.NumRxUnicastOkInPeriod = 0;
1062 ieee->link_detect_info.bBusyTraffic = bBusyTraffic;
1064 ieee->link_detect_info.bHigherBusyTraffic = bHigherBusyTraffic;
1065 ieee->link_detect_info.bHigherBusyRxTraffic = bHigherBusyRxTraffic;
1067 if (ieee->link_state == MAC80211_LINKED && ieee->iw_mode == IW_MODE_INFRA) {
1068 u32 TotalRxBcnNum = 0;
1069 u32 TotalRxDataNum = 0;
1071 _rtl92e_update_rxcounts(priv, &TotalRxBcnNum, &TotalRxDataNum);
1073 if ((TotalRxBcnNum + TotalRxDataNum) == 0)
1074 priv->check_roaming_cnt++;
1076 priv->check_roaming_cnt = 0;
1078 if (priv->check_roaming_cnt > 0) {
1079 if (ieee->rf_power_state == rf_off)
1080 netdev_info(dev, "%s(): RF is off\n", __func__);
1083 "===>%s(): AP is power off, chan:%d, connect another one\n",
1084 __func__, priv->chan);
1086 ieee->link_state = RTLLIB_ASSOCIATING;
1088 RemovePeerTS(priv->rtllib,
1089 priv->rtllib->current_network.bssid);
1090 ieee->is_roaming = true;
1091 ieee->is_set_key = false;
1092 ieee->link_change(dev);
1093 notify_wx_assoc_event(ieee);
1095 if (!(ieee->rtllib_ap_sec_type(ieee) &
1096 (SEC_ALG_CCMP | SEC_ALG_TKIP)))
1097 schedule_delayed_work(
1098 &ieee->associate_procedure_wq, 0);
1100 priv->check_roaming_cnt = 0;
1102 ieee->link_detect_info.NumRecvBcnInPeriod = 0;
1103 ieee->link_detect_info.NumRecvDataInPeriod = 0;
1106 spin_lock_irqsave(&priv->tx_lock, flags);
1107 if ((check_reset_cnt++ >= 3) && (!ieee->is_roaming) &&
1108 (!priv->rf_change_in_progress) && (!psc->bSwRfProcessing)) {
1109 _rtl92e_if_check_reset(dev);
1110 check_reset_cnt = 3;
1112 spin_unlock_irqrestore(&priv->tx_lock, flags);
1115 static void _rtl92e_watchdog_timer_cb(struct timer_list *t)
1117 struct r8192_priv *priv = from_timer(priv, t, watch_dog_timer);
1119 schedule_delayed_work(&priv->watch_dog_wq, 0);
1120 mod_timer(&priv->watch_dog_timer, jiffies +
1121 msecs_to_jiffies(RTLLIB_WATCH_DOG_TIME));
1124 /****************************************************************************
1125 * ---------------------------- NIC TX/RX STUFF---------------------------
1126 ****************************************************************************/
1127 void rtl92e_rx_enable(struct net_device *dev)
1129 rtl92e_enable_rx(dev);
1132 void rtl92e_tx_enable(struct net_device *dev)
1134 struct r8192_priv *priv = rtllib_priv(dev);
1136 rtl92e_enable_tx(dev);
1138 rtllib_reset_queue(priv->rtllib);
1141 static void _rtl92e_free_rx_ring(struct net_device *dev)
1143 struct r8192_priv *priv = rtllib_priv(dev);
1146 for (i = 0; i < priv->rxringcount; i++) {
1147 struct sk_buff *skb = priv->rx_buf[i];
1152 dma_unmap_single(&priv->pdev->dev,
1153 *((dma_addr_t *)skb->cb),
1154 priv->rxbuffersize, DMA_FROM_DEVICE);
1158 dma_free_coherent(&priv->pdev->dev,
1159 sizeof(*priv->rx_ring) * priv->rxringcount,
1162 priv->rx_ring = NULL;
1165 static void _rtl92e_free_tx_ring(struct net_device *dev, unsigned int prio)
1167 struct r8192_priv *priv = rtllib_priv(dev);
1168 struct rtl8192_tx_ring *ring = &priv->tx_ring[prio];
1170 while (skb_queue_len(&ring->queue)) {
1171 struct tx_desc *entry = &ring->desc[ring->idx];
1172 struct sk_buff *skb = __skb_dequeue(&ring->queue);
1174 dma_unmap_single(&priv->pdev->dev, entry->TxBuffAddr,
1175 skb->len, DMA_TO_DEVICE);
1177 ring->idx = (ring->idx + 1) % ring->entries;
1180 dma_free_coherent(&priv->pdev->dev,
1181 sizeof(*ring->desc) * ring->entries, ring->desc,
1186 static void _rtl92e_hard_data_xmit(struct sk_buff *skb, struct net_device *dev,
1189 struct r8192_priv *priv = rtllib_priv(dev);
1191 struct cb_desc *tcb_desc = (struct cb_desc *)(skb->cb +
1193 u8 queue_index = tcb_desc->queue_index;
1195 if ((priv->rtllib->rf_power_state == rf_off) || !priv->up) {
1200 if (queue_index == TXCMD_QUEUE)
1201 netdev_warn(dev, "%s(): queue index == TXCMD_QUEUE\n",
1204 memcpy((unsigned char *)(skb->cb), &dev, sizeof(dev));
1205 skb_push(skb, priv->rtllib->tx_headroom);
1206 ret = _rtl92e_tx(dev, skb);
1208 if (queue_index != MGNT_QUEUE) {
1209 priv->rtllib->stats.tx_bytes += (skb->len -
1210 priv->rtllib->tx_headroom);
1211 priv->rtllib->stats.tx_packets++;
1218 static int _rtl92e_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
1220 struct r8192_priv *priv = rtllib_priv(dev);
1222 struct cb_desc *tcb_desc = (struct cb_desc *)(skb->cb +
1224 u8 queue_index = tcb_desc->queue_index;
1226 if (queue_index != TXCMD_QUEUE) {
1227 if ((priv->rtllib->rf_power_state == rf_off) ||
1234 memcpy((unsigned char *)(skb->cb), &dev, sizeof(dev));
1235 if (queue_index == TXCMD_QUEUE) {
1236 _rtl92e_tx_cmd(dev, skb);
1240 tcb_desc->ratr_index = 7;
1241 tcb_desc->tx_dis_rate_fallback = 1;
1242 tcb_desc->tx_use_drv_assinged_rate = 1;
1243 tcb_desc->bTxEnableFwCalcDur = 1;
1244 skb_push(skb, priv->rtllib->tx_headroom);
1245 ret = _rtl92e_tx(dev, skb);
1251 static void _rtl92e_tx_isr(struct net_device *dev, int prio)
1253 struct r8192_priv *priv = rtllib_priv(dev);
1255 struct rtl8192_tx_ring *ring = &priv->tx_ring[prio];
1257 while (skb_queue_len(&ring->queue)) {
1258 struct tx_desc *entry = &ring->desc[ring->idx];
1259 struct sk_buff *skb;
1261 if (prio != BEACON_QUEUE) {
1264 ring->idx = (ring->idx + 1) % ring->entries;
1267 skb = __skb_dequeue(&ring->queue);
1268 dma_unmap_single(&priv->pdev->dev, entry->TxBuffAddr,
1269 skb->len, DMA_TO_DEVICE);
1273 if (prio != BEACON_QUEUE)
1274 tasklet_schedule(&priv->irq_tx_tasklet);
1277 static void _rtl92e_tx_cmd(struct net_device *dev, struct sk_buff *skb)
1279 struct r8192_priv *priv = rtllib_priv(dev);
1280 struct rtl8192_tx_ring *ring;
1281 struct tx_desc_cmd *entry;
1283 struct cb_desc *tcb_desc;
1284 unsigned long flags;
1286 spin_lock_irqsave(&priv->irq_th_lock, flags);
1287 ring = &priv->tx_ring[TXCMD_QUEUE];
1289 idx = (ring->idx + skb_queue_len(&ring->queue)) % ring->entries;
1290 entry = (struct tx_desc_cmd *)&ring->desc[idx];
1292 tcb_desc = (struct cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
1294 rtl92e_fill_tx_cmd_desc(dev, entry, tcb_desc, skb);
1296 __skb_queue_tail(&ring->queue, skb);
1297 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
1300 static short _rtl92e_tx(struct net_device *dev, struct sk_buff *skb)
1302 struct r8192_priv *priv = rtllib_priv(dev);
1303 struct rtl8192_tx_ring *ring;
1304 unsigned long flags;
1305 struct cb_desc *tcb_desc = (struct cb_desc *)(skb->cb +
1307 struct tx_desc *pdesc = NULL;
1308 struct ieee80211_hdr *header = NULL;
1309 u8 *pda_addr = NULL;
1311 u32 fwinfo_size = 0;
1313 priv->rtllib->bAwakePktSent = true;
1315 fwinfo_size = sizeof(struct tx_fwinfo_8190pci);
1317 header = (struct ieee80211_hdr *)(((u8 *)skb->data) + fwinfo_size);
1318 pda_addr = header->addr1;
1320 if (!is_broadcast_ether_addr(pda_addr) && !is_multicast_ether_addr(pda_addr))
1321 priv->stats.txbytesunicast += skb->len - fwinfo_size;
1323 spin_lock_irqsave(&priv->irq_th_lock, flags);
1324 ring = &priv->tx_ring[tcb_desc->queue_index];
1325 if (tcb_desc->queue_index != BEACON_QUEUE)
1326 idx = (ring->idx + skb_queue_len(&ring->queue)) % ring->entries;
1330 pdesc = &ring->desc[idx];
1331 if ((pdesc->OWN == 1) && (tcb_desc->queue_index != BEACON_QUEUE)) {
1333 "No more TX desc@%d, ring->idx = %d, idx = %d, skblen = 0x%x queuelen=%d",
1334 tcb_desc->queue_index, ring->idx, idx, skb->len,
1335 skb_queue_len(&ring->queue));
1336 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
1339 rtl92e_fill_tx_desc(dev, pdesc, tcb_desc, skb);
1340 __skb_queue_tail(&ring->queue, skb);
1342 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
1343 netif_trans_update(dev);
1345 rtl92e_writew(dev, TP_POLL, 0x01 << tcb_desc->queue_index);
1349 static short _rtl92e_alloc_rx_ring(struct net_device *dev)
1351 struct r8192_priv *priv = rtllib_priv(dev);
1352 struct rx_desc *entry = NULL;
1355 priv->rx_ring = dma_alloc_coherent(&priv->pdev->dev,
1356 sizeof(*priv->rx_ring) * priv->rxringcount,
1359 if (!priv->rx_ring || (unsigned long)priv->rx_ring & 0xFF) {
1360 netdev_warn(dev, "Cannot allocate RX ring\n");
1366 for (i = 0; i < priv->rxringcount; i++) {
1367 struct sk_buff *skb = dev_alloc_skb(priv->rxbuffersize);
1368 dma_addr_t *mapping;
1370 entry = &priv->rx_ring[i];
1374 priv->rx_buf[i] = skb;
1375 mapping = (dma_addr_t *)skb->cb;
1376 *mapping = dma_map_single(&priv->pdev->dev,
1377 skb_tail_pointer(skb),
1378 priv->rxbuffersize, DMA_FROM_DEVICE);
1379 if (dma_mapping_error(&priv->pdev->dev, *mapping)) {
1380 dev_kfree_skb_any(skb);
1383 entry->BufferAddress = *mapping;
1385 entry->Length = priv->rxbuffersize;
1394 static int _rtl92e_alloc_tx_ring(struct net_device *dev, unsigned int prio,
1395 unsigned int entries)
1397 struct r8192_priv *priv = rtllib_priv(dev);
1398 struct tx_desc *ring;
1402 ring = dma_alloc_coherent(&priv->pdev->dev, sizeof(*ring) * entries,
1404 if (!ring || (unsigned long)ring & 0xFF) {
1405 netdev_warn(dev, "Cannot allocate TX ring (prio = %d)\n", prio);
1409 priv->tx_ring[prio].desc = ring;
1410 priv->tx_ring[prio].dma = dma;
1411 priv->tx_ring[prio].idx = 0;
1412 priv->tx_ring[prio].entries = entries;
1413 skb_queue_head_init(&priv->tx_ring[prio].queue);
1415 for (i = 0; i < entries; i++)
1416 ring[i].NextDescAddress =
1417 (u32)dma + ((i + 1) % entries) *
1423 static short _rtl92e_pci_initdescring(struct net_device *dev)
1427 struct r8192_priv *priv = rtllib_priv(dev);
1429 ret = _rtl92e_alloc_rx_ring(dev);
1433 for (i = 0; i < MAX_TX_QUEUE_COUNT; i++) {
1434 ret = _rtl92e_alloc_tx_ring(dev, i, priv->txringcount);
1436 goto err_free_rings;
1442 _rtl92e_free_rx_ring(dev);
1443 for (i = 0; i < MAX_TX_QUEUE_COUNT; i++)
1444 if (priv->tx_ring[i].desc)
1445 _rtl92e_free_tx_ring(dev, i);
1449 void rtl92e_reset_desc_ring(struct net_device *dev)
1451 struct r8192_priv *priv = rtllib_priv(dev);
1453 unsigned long flags = 0;
1455 if (priv->rx_ring) {
1456 struct rx_desc *entry = NULL;
1458 for (i = 0; i < priv->rxringcount; i++) {
1459 entry = &priv->rx_ring[i];
1465 spin_lock_irqsave(&priv->irq_th_lock, flags);
1466 for (i = 0; i < MAX_TX_QUEUE_COUNT; i++) {
1467 if (priv->tx_ring[i].desc) {
1468 struct rtl8192_tx_ring *ring = &priv->tx_ring[i];
1470 while (skb_queue_len(&ring->queue)) {
1471 struct tx_desc *entry = &ring->desc[ring->idx];
1472 struct sk_buff *skb =
1473 __skb_dequeue(&ring->queue);
1475 dma_unmap_single(&priv->pdev->dev,
1476 entry->TxBuffAddr, skb->len,
1479 ring->idx = (ring->idx + 1) % ring->entries;
1484 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
1487 void rtl92e_update_rx_pkt_timestamp(struct net_device *dev,
1488 struct rtllib_rx_stats *stats)
1490 struct r8192_priv *priv = rtllib_priv(dev);
1492 if (stats->bIsAMPDU && !stats->bFirstMPDU)
1493 stats->mac_time = priv->last_rx_desc_tsf;
1495 priv->last_rx_desc_tsf = stats->mac_time;
1498 long rtl92e_translate_to_dbm(struct r8192_priv *priv, u8 signal_strength_index)
1502 signal_power = (long)((signal_strength_index + 1) >> 1);
1505 return signal_power;
1508 void rtl92e_update_rx_statistics(struct r8192_priv *priv,
1509 struct rtllib_rx_stats *pprevious_stats)
1513 if (priv->stats.recv_signal_power == 0)
1514 priv->stats.recv_signal_power =
1515 pprevious_stats->RecvSignalPower;
1517 if (pprevious_stats->RecvSignalPower > priv->stats.recv_signal_power)
1519 else if (pprevious_stats->RecvSignalPower <
1520 priv->stats.recv_signal_power)
1522 priv->stats.recv_signal_power = (priv->stats.recv_signal_power * 5 +
1523 pprevious_stats->RecvSignalPower +
1527 u8 rtl92e_rx_db_to_percent(s8 antpower)
1529 if ((antpower <= -100) || (antpower >= 20))
1531 else if (antpower >= 0)
1534 return 100 + antpower;
1536 } /* QueryRxPwrPercentage */
1538 u8 rtl92e_evm_db_to_percent(s8 value)
1540 s8 ret_val = clamp(-value, 0, 33) * 3;
1548 void rtl92e_copy_mpdu_stats(struct rtllib_rx_stats *psrc_stats,
1549 struct rtllib_rx_stats *ptarget_stats)
1551 ptarget_stats->bIsAMPDU = psrc_stats->bIsAMPDU;
1552 ptarget_stats->bFirstMPDU = psrc_stats->bFirstMPDU;
1555 static void _rtl92e_rx_normal(struct net_device *dev)
1557 struct r8192_priv *priv = rtllib_priv(dev);
1558 struct ieee80211_hdr *rtllib_hdr = NULL;
1559 bool unicast_packet = false;
1562 struct rtllib_rx_stats stats = {
1567 unsigned int count = priv->rxringcount;
1569 stats.nic_type = NIC_8192E;
1572 struct rx_desc *pdesc = &priv->rx_ring
1574 struct sk_buff *skb = priv->rx_buf
1576 struct sk_buff *new_skb;
1580 if (!rtl92e_get_rx_stats(dev, &stats, pdesc, skb))
1582 new_skb = dev_alloc_skb(priv->rxbuffersize);
1583 /* if allocation of new skb failed - drop current packet
1586 if (unlikely(!new_skb))
1589 dma_unmap_single(&priv->pdev->dev, *((dma_addr_t *)skb->cb),
1590 priv->rxbuffersize, DMA_FROM_DEVICE);
1592 skb_put(skb, pdesc->Length);
1593 skb_reserve(skb, stats.RxDrvInfoSize +
1595 skb_trim(skb, skb->len - S_CRC_LEN);
1596 rtllib_hdr = (struct ieee80211_hdr *)skb->data;
1597 if (!is_multicast_ether_addr(rtllib_hdr->addr1)) {
1598 /* unicast packet */
1599 unicast_packet = true;
1603 if (!rtllib_rx(priv->rtllib, skb, &stats)) {
1604 dev_kfree_skb_any(skb);
1607 priv->stats.rxbytesunicast += skb_len;
1613 priv->rx_buf[priv->rx_idx] = skb;
1614 *((dma_addr_t *)skb->cb) = dma_map_single(&priv->pdev->dev,
1615 skb_tail_pointer(skb),
1616 priv->rxbuffersize, DMA_FROM_DEVICE);
1617 if (dma_mapping_error(&priv->pdev->dev, *((dma_addr_t *)skb->cb))) {
1618 dev_kfree_skb_any(skb);
1622 pdesc->BufferAddress = *((dma_addr_t *)skb->cb);
1624 pdesc->Length = priv->rxbuffersize;
1625 if (priv->rx_idx == priv->rxringcount - 1)
1627 priv->rx_idx = (priv->rx_idx + 1) %
1632 static void _rtl92e_tx_resume(struct net_device *dev)
1634 struct r8192_priv *priv = rtllib_priv(dev);
1635 struct rtllib_device *ieee = priv->rtllib;
1636 struct sk_buff *skb;
1639 for (queue_index = BK_QUEUE;
1640 queue_index < MAX_QUEUE_SIZE; queue_index++) {
1641 while ((!skb_queue_empty(&ieee->skb_waitQ[queue_index])) &&
1642 (priv->rtllib->check_nic_enough_desc(dev, queue_index) > 0)) {
1643 skb = skb_dequeue(&ieee->skb_waitQ[queue_index]);
1644 ieee->softmac_data_hard_start_xmit(skb, dev, 0);
1649 static void _rtl92e_irq_tx_tasklet(struct tasklet_struct *t)
1651 struct r8192_priv *priv = from_tasklet(priv, t, irq_tx_tasklet);
1653 _rtl92e_tx_resume(priv->rtllib->dev);
1656 static void _rtl92e_irq_rx_tasklet(struct tasklet_struct *t)
1658 struct r8192_priv *priv = from_tasklet(priv, t, irq_rx_tasklet);
1660 _rtl92e_rx_normal(priv->rtllib->dev);
1662 rtl92e_writel(priv->rtllib->dev, INTA_MASK,
1663 rtl92e_readl(priv->rtllib->dev, INTA_MASK) | IMR_RDU);
1666 /****************************************************************************
1667 * ---------------------------- NIC START/CLOSE STUFF---------------------------
1668 ****************************************************************************/
1669 static void _rtl92e_cancel_deferred_work(struct r8192_priv *priv)
1671 cancel_delayed_work_sync(&priv->watch_dog_wq);
1672 cancel_delayed_work_sync(&priv->update_beacon_wq);
1673 cancel_delayed_work(&priv->rtllib->hw_sleep_wq);
1674 cancel_work_sync(&priv->reset_wq);
1675 cancel_work_sync(&priv->qos_activate);
1678 static int _rtl92e_up(struct net_device *dev)
1680 if (_rtl92e_sta_up(dev) == -1)
1685 static int _rtl92e_open(struct net_device *dev)
1687 struct r8192_priv *priv = rtllib_priv(dev);
1690 mutex_lock(&priv->wx_mutex);
1691 ret = _rtl92e_try_up(dev);
1692 mutex_unlock(&priv->wx_mutex);
1696 static int _rtl92e_try_up(struct net_device *dev)
1698 struct r8192_priv *priv = rtllib_priv(dev);
1702 return _rtl92e_up(dev);
1705 static int _rtl92e_close(struct net_device *dev)
1707 struct r8192_priv *priv = rtllib_priv(dev);
1710 if ((rtllib_act_scanning(priv->rtllib, false)) &&
1711 !(priv->rtllib->softmac_features & IEEE_SOFTMAC_SCAN)) {
1712 rtllib_stop_scan(priv->rtllib);
1715 mutex_lock(&priv->wx_mutex);
1717 ret = _rtl92e_down(dev, true);
1719 mutex_unlock(&priv->wx_mutex);
1724 static int _rtl92e_down(struct net_device *dev, bool shutdownrf)
1726 if (_rtl92e_sta_down(dev, shutdownrf) == -1)
1732 void rtl92e_commit(struct net_device *dev)
1734 struct r8192_priv *priv = rtllib_priv(dev);
1738 rtllib_softmac_stop_protocol(priv->rtllib);
1739 rtl92e_irq_disable(dev);
1740 rtl92e_stop_adapter(dev, true);
1744 static void _rtl92e_restart(void *data)
1746 struct r8192_priv *priv = container_of(data, struct r8192_priv, reset_wq);
1747 struct net_device *dev = priv->rtllib->dev;
1749 mutex_lock(&priv->wx_mutex);
1753 mutex_unlock(&priv->wx_mutex);
1756 static void _rtl92e_set_multicast(struct net_device *dev)
1758 struct r8192_priv *priv = rtllib_priv(dev);
1761 promisc = (dev->flags & IFF_PROMISC) ? 1 : 0;
1762 priv->promisc = promisc;
1765 static int _rtl92e_set_mac_adr(struct net_device *dev, void *mac)
1767 struct r8192_priv *priv = rtllib_priv(dev);
1768 struct sockaddr *addr = mac;
1770 mutex_lock(&priv->wx_mutex);
1772 eth_hw_addr_set(dev, addr->sa_data);
1774 schedule_work(&priv->reset_wq);
1775 mutex_unlock(&priv->wx_mutex);
1780 static irqreturn_t _rtl92e_irq(int irq, void *netdev)
1782 struct net_device *dev = netdev;
1783 struct r8192_priv *priv = rtllib_priv(dev);
1784 unsigned long flags;
1787 if (priv->irq_enabled == 0)
1790 spin_lock_irqsave(&priv->irq_th_lock, flags);
1792 rtl92e_ack_irq(dev, &inta);
1795 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
1799 if (inta == 0xffff) {
1800 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
1804 if (!netif_running(dev)) {
1805 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
1809 if (inta & IMR_MGNTDOK) {
1810 _rtl92e_tx_isr(dev, MGNT_QUEUE);
1811 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
1812 if (priv->rtllib->ack_tx_to_ieee) {
1813 if (_rtl92e_is_tx_queue_empty(dev)) {
1814 priv->rtllib->ack_tx_to_ieee = 0;
1815 rtllib_ps_tx_ack(priv->rtllib, 1);
1818 spin_lock_irqsave(&priv->irq_th_lock, flags);
1821 if (inta & IMR_COMDOK)
1822 _rtl92e_tx_isr(dev, TXCMD_QUEUE);
1824 if (inta & IMR_HIGHDOK)
1825 _rtl92e_tx_isr(dev, HIGH_QUEUE);
1828 tasklet_schedule(&priv->irq_rx_tasklet);
1830 if (inta & IMR_BcnInt)
1831 tasklet_schedule(&priv->irq_prepare_beacon_tasklet);
1833 if (inta & IMR_RDU) {
1834 rtl92e_writel(dev, INTA_MASK,
1835 rtl92e_readl(dev, INTA_MASK) & ~IMR_RDU);
1836 tasklet_schedule(&priv->irq_rx_tasklet);
1839 if (inta & IMR_RXFOVW)
1840 tasklet_schedule(&priv->irq_rx_tasklet);
1842 if (inta & IMR_BKDOK) {
1843 priv->rtllib->link_detect_info.NumTxOkInPeriod++;
1844 _rtl92e_tx_isr(dev, BK_QUEUE);
1847 if (inta & IMR_BEDOK) {
1848 priv->rtllib->link_detect_info.NumTxOkInPeriod++;
1849 _rtl92e_tx_isr(dev, BE_QUEUE);
1852 if (inta & IMR_VIDOK) {
1853 priv->rtllib->link_detect_info.NumTxOkInPeriod++;
1854 _rtl92e_tx_isr(dev, VI_QUEUE);
1857 if (inta & IMR_VODOK) {
1858 priv->rtllib->link_detect_info.NumTxOkInPeriod++;
1859 _rtl92e_tx_isr(dev, VO_QUEUE);
1862 spin_unlock_irqrestore(&priv->irq_th_lock, flags);
1869 /****************************************************************************
1870 * ---------------------------- PCI_STUFF---------------------------
1871 ****************************************************************************/
1872 static const struct net_device_ops rtl8192_netdev_ops = {
1873 .ndo_open = _rtl92e_open,
1874 .ndo_stop = _rtl92e_close,
1875 .ndo_tx_timeout = _rtl92e_tx_timeout,
1876 .ndo_set_rx_mode = _rtl92e_set_multicast,
1877 .ndo_set_mac_address = _rtl92e_set_mac_adr,
1878 .ndo_validate_addr = eth_validate_addr,
1879 .ndo_start_xmit = rtllib_xmit,
1882 static int _rtl92e_pci_probe(struct pci_dev *pdev,
1883 const struct pci_device_id *id)
1885 unsigned long ioaddr = 0;
1886 struct net_device *dev = NULL;
1887 struct r8192_priv *priv = NULL;
1888 unsigned long pmem_start, pmem_len, pmem_flags;
1891 if (pci_enable_device(pdev)) {
1892 dev_err(&pdev->dev, "Failed to enable PCI device");
1896 pci_set_master(pdev);
1898 if (!dma_set_mask(&pdev->dev, DMA_BIT_MASK(32))) {
1899 if (dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32))) {
1900 dev_info(&pdev->dev,
1901 "Unable to obtain 32bit DMA for consistent allocations\n");
1902 goto err_pci_disable;
1905 dev = alloc_rtllib(sizeof(struct r8192_priv));
1907 goto err_pci_disable;
1911 pci_set_drvdata(pdev, dev);
1912 SET_NETDEV_DEV(dev, &pdev->dev);
1913 priv = rtllib_priv(dev);
1914 priv->rtllib = (struct rtllib_device *)netdev_priv_rsl(dev);
1916 priv->rtllib->pdev = pdev;
1917 if ((pdev->subsystem_vendor == PCI_VENDOR_ID_DLINK) &&
1918 (pdev->subsystem_device == 0x3304))
1919 priv->rtllib->bSupportRemoteWakeUp = 1;
1921 priv->rtllib->bSupportRemoteWakeUp = 0;
1923 pmem_start = pci_resource_start(pdev, 1);
1924 pmem_len = pci_resource_len(pdev, 1);
1925 pmem_flags = pci_resource_flags(pdev, 1);
1927 if (!(pmem_flags & IORESOURCE_MEM)) {
1928 netdev_err(dev, "region #1 not a MMIO resource, aborting");
1929 goto err_rel_rtllib;
1932 dev_info(&pdev->dev, "Memory mapped space start: 0x%08lx\n",
1934 if (!request_mem_region(pmem_start, pmem_len, DRV_NAME)) {
1935 netdev_err(dev, "request_mem_region failed!");
1936 goto err_rel_rtllib;
1939 ioaddr = (unsigned long)ioremap(pmem_start, pmem_len);
1940 if (ioaddr == (unsigned long)NULL) {
1941 netdev_err(dev, "ioremap failed!");
1945 dev->mem_start = ioaddr;
1946 dev->mem_end = ioaddr + pci_resource_len(pdev, 0);
1948 if (!rtl92e_check_adapter(pdev, dev))
1951 dev->irq = pdev->irq;
1954 dev->netdev_ops = &rtl8192_netdev_ops;
1956 dev->wireless_handlers = &r8192_wx_handlers_def;
1957 dev->ethtool_ops = &rtl819x_ethtool_ops;
1959 dev->type = ARPHRD_ETHER;
1960 dev->watchdog_timeo = HZ * 3;
1962 if (dev_alloc_name(dev, ifname) < 0)
1963 dev_alloc_name(dev, ifname);
1965 if (_rtl92e_init(dev) != 0) {
1966 netdev_warn(dev, "Initialization failed");
1970 netif_carrier_off(dev);
1971 netif_stop_queue(dev);
1973 if (register_netdev(dev))
1976 if (priv->polling_timer_on == 0)
1977 rtl92e_check_rfctrl_gpio_timer(&priv->gpio_polling_timer);
1982 free_irq(dev->irq, dev);
1985 iounmap((void __iomem *)ioaddr);
1987 release_mem_region(pmem_start, pmem_len);
1991 pci_disable_device(pdev);
1995 static void _rtl92e_pci_disconnect(struct pci_dev *pdev)
1997 struct net_device *dev = pci_get_drvdata(pdev);
1998 struct r8192_priv *priv;
2002 unregister_netdev(dev);
2004 priv = rtllib_priv(dev);
2006 del_timer_sync(&priv->gpio_polling_timer);
2007 cancel_delayed_work_sync(&priv->gpio_change_rf_wq);
2008 priv->polling_timer_on = 0;
2009 _rtl92e_down(dev, true);
2010 rtl92e_dm_deinit(dev);
2011 vfree(priv->fw_info);
2012 priv->fw_info = NULL;
2013 _rtl92e_free_rx_ring(dev);
2014 for (i = 0; i < MAX_TX_QUEUE_COUNT; i++)
2015 _rtl92e_free_tx_ring(dev, i);
2018 dev_info(&pdev->dev, "Freeing irq %d\n", dev->irq);
2019 free_irq(dev->irq, dev);
2023 if (dev->mem_start != 0) {
2024 iounmap((void __iomem *)dev->mem_start);
2025 release_mem_region(pci_resource_start(pdev, 1),
2026 pci_resource_len(pdev, 1));
2032 pci_disable_device(pdev);
2035 bool rtl92e_enable_nic(struct net_device *dev)
2037 bool init_status = true;
2038 struct r8192_priv *priv = rtllib_priv(dev);
2039 struct rt_pwr_save_ctrl *psc = (struct rt_pwr_save_ctrl *)
2040 (&priv->rtllib->pwr_save_ctrl);
2043 netdev_warn(dev, "%s(): Driver is already down!\n", __func__);
2047 init_status = rtl92e_start_adapter(dev);
2049 netdev_warn(dev, "%s(): Initialization failed!\n", __func__);
2052 RT_CLEAR_PS_LEVEL(psc, RT_RF_OFF_LEVL_HALT_NIC);
2054 rtl92e_irq_enable(dev);
2058 module_pci_driver(rtl8192_pci_driver);
2060 void rtl92e_check_rfctrl_gpio_timer(struct timer_list *t)
2062 struct r8192_priv *priv = from_timer(priv, t, gpio_polling_timer);
2064 priv->polling_timer_on = 1;
2066 schedule_delayed_work(&priv->gpio_change_rf_wq, 0);
2068 mod_timer(&priv->gpio_polling_timer, jiffies +
2069 msecs_to_jiffies(RTLLIB_WATCH_DOG_TIME));
2072 /***************************************************************************
2073 * ------------------- module init / exit stubs ----------------
2074 ***************************************************************************/
2075 MODULE_DESCRIPTION("Linux driver for Realtek RTL819x WiFi cards");
2076 MODULE_AUTHOR(DRV_COPYRIGHT " " DRV_AUTHOR);
2077 MODULE_VERSION(DRV_VERSION);
2078 MODULE_LICENSE("GPL");
2079 MODULE_FIRMWARE(RTL8192E_BOOT_IMG_FW);
2080 MODULE_FIRMWARE(RTL8192E_MAIN_IMG_FW);
2081 MODULE_FIRMWARE(RTL8192E_DATA_IMG_FW);
2083 module_param(ifname, charp, 0644);
2084 module_param(hwwep, int, 0644);
2086 MODULE_PARM_DESC(ifname, " Net interface name, wlan%d=default");
2087 MODULE_PARM_DESC(hwwep, " Try to use hardware WEP support(default use hw. set 0 to use software security)");