1 /******************************************************************************
2 * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
4 * Based on the r8180 driver, which is:
5 * Copyright 2004-2005 Andrea Merello <andrea.merello@gmail.com>, et al.
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of version 2 of the GNU General Public License as
8 * published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 * The full GNU General Public License is included in this distribution in the
20 * file called LICENSE.
22 * Contact Information:
23 * wlanfae <wlanfae@realtek.com>
24 ******************************************************************************/
25 #undef RX_DONT_PASS_UL
27 #undef DEBUG_RX_VERBOSE
33 #undef DEBUG_TX_FILLDESC
38 #undef DEBUG_REGISTERS
40 #undef DEBUG_IRQ_TASKLET
44 #include <linux/uaccess.h>
45 #include <linux/pci.h>
46 #include <linux/vmalloc.h>
47 #include <linux/ieee80211.h>
49 #include "r8192E_phy.h"
50 #include "r8192E_phyreg.h"
51 #include "r8190P_rtl8256.h"
52 #include "r8192E_cmdpkt.h"
60 static int channels
= 0x3fff;
61 static char *ifname
= "wlan%d";
64 static struct rtl819x_ops rtl819xp_ops
= {
65 .nic_type
= NIC_8192E
,
66 .get_eeprom_size
= rtl8192_get_eeprom_size
,
67 .init_adapter_variable
= rtl8192_InitializeVariables
,
68 .initialize_adapter
= rtl8192_adapter_start
,
69 .link_change
= rtl8192_link_change
,
70 .tx_fill_descriptor
= rtl8192_tx_fill_desc
,
71 .tx_fill_cmd_descriptor
= rtl8192_tx_fill_cmd_desc
,
72 .rx_query_status_descriptor
= rtl8192_rx_query_status_desc
,
73 .rx_command_packet_handler
= NULL
,
74 .stop_adapter
= rtl8192_halt_adapter
,
75 .update_ratr_table
= rtl8192_update_ratr_table
,
76 .irq_enable
= rtl8192_EnableInterrupt
,
77 .irq_disable
= rtl8192_DisableInterrupt
,
78 .irq_clear
= rtl8192_ClearInterrupt
,
79 .rx_enable
= rtl8192_enable_rx
,
80 .tx_enable
= rtl8192_enable_tx
,
81 .interrupt_recognized
= rtl8192_interrupt_recognized
,
82 .TxCheckStuckHandler
= rtl8192_HalTxCheckStuck
,
83 .RxCheckStuckHandler
= rtl8192_HalRxCheckStuck
,
86 static struct pci_device_id rtl8192_pci_id_tbl
[] = {
87 {RTL_PCI_DEVICE(0x10ec, 0x8192, rtl819xp_ops
)},
88 {RTL_PCI_DEVICE(0x07aa, 0x0044, rtl819xp_ops
)},
89 {RTL_PCI_DEVICE(0x07aa, 0x0047, rtl819xp_ops
)},
93 MODULE_DEVICE_TABLE(pci
, rtl8192_pci_id_tbl
);
95 static int rtl8192_pci_probe(struct pci_dev
*pdev
,
96 const struct pci_device_id
*id
);
97 static void rtl8192_pci_disconnect(struct pci_dev
*pdev
);
98 static irqreturn_t
rtl8192_interrupt(int irq
, void *netdev
);
100 static struct pci_driver rtl8192_pci_driver
= {
101 .name
= DRV_NAME
, /* Driver name */
102 .id_table
= rtl8192_pci_id_tbl
, /* PCI_ID table */
103 .probe
= rtl8192_pci_probe
, /* probe fn */
104 .remove
= rtl8192_pci_disconnect
, /* remove fn */
105 .suspend
= rtl8192E_suspend
, /* PM suspend fn */
106 .resume
= rtl8192E_resume
, /* PM resume fn */
109 /****************************************************************************
110 -----------------------------IO STUFF-------------------------
111 *****************************************************************************/
112 static bool PlatformIOCheckPageLegalAndGetRegMask(u32 u4bPage
, u8
*pu1bPageMask
)
114 bool bReturn
= false;
116 *pu1bPageMask
= 0xfe;
119 case 1: case 2: case 3: case 4:
120 case 8: case 9: case 10: case 12: case 13:
122 *pu1bPageMask
= 0xf0;
133 void write_nic_io_byte(struct net_device
*dev
, int x
, u8 y
)
135 u32 u4bPage
= x
>> 8;
137 bool bIsLegalPage
= false;
140 outb(y
&0xff, dev
->base_addr
+ x
);
143 bIsLegalPage
= PlatformIOCheckPageLegalAndGetRegMask(u4bPage
,
146 u8 u1bPsr
= read_nic_io_byte(dev
, PSR
);
148 write_nic_io_byte(dev
, PSR
, ((u1bPsr
& u1PageMask
) |
150 write_nic_io_byte(dev
, (x
& 0xff), y
);
151 write_nic_io_byte(dev
, PSR
, (u1bPsr
& u1PageMask
));
156 void write_nic_io_word(struct net_device
*dev
, int x
, u16 y
)
158 u32 u4bPage
= x
>> 8;
160 bool bIsLegalPage
= false;
163 outw(y
, dev
->base_addr
+ x
);
165 bIsLegalPage
= PlatformIOCheckPageLegalAndGetRegMask(u4bPage
,
168 u8 u1bPsr
= read_nic_io_byte(dev
, PSR
);
170 write_nic_io_byte(dev
, PSR
, ((u1bPsr
& u1PageMask
) |
172 write_nic_io_word(dev
, (x
& 0xff), y
);
173 write_nic_io_byte(dev
, PSR
, (u1bPsr
& u1PageMask
));
179 void write_nic_io_dword(struct net_device
*dev
, int x
, u32 y
)
181 u32 u4bPage
= x
>> 8;
183 bool bIsLegalPage
= false;
186 outl(y
, dev
->base_addr
+ x
);
188 bIsLegalPage
= PlatformIOCheckPageLegalAndGetRegMask(u4bPage
,
191 u8 u1bPsr
= read_nic_io_byte(dev
, PSR
);
193 write_nic_io_byte(dev
, PSR
, ((u1bPsr
& u1PageMask
) |
195 write_nic_io_dword(dev
, (x
& 0xff), y
);
196 write_nic_io_byte(dev
, PSR
, (u1bPsr
& u1PageMask
));
201 u8
read_nic_io_byte(struct net_device
*dev
, int x
)
203 u32 u4bPage
= x
>> 8;
205 bool bIsLegalPage
= false;
209 return 0xff&inb(dev
->base_addr
+ x
);
211 bIsLegalPage
= PlatformIOCheckPageLegalAndGetRegMask(u4bPage
,
214 u8 u1bPsr
= read_nic_io_byte(dev
, PSR
);
216 write_nic_io_byte(dev
, PSR
, ((u1bPsr
& u1PageMask
) |
218 Data
= read_nic_io_byte(dev
, (x
& 0xff));
219 write_nic_io_byte(dev
, PSR
, (u1bPsr
& u1PageMask
));
225 u16
read_nic_io_word(struct net_device
*dev
, int x
)
227 u32 u4bPage
= x
>> 8;
229 bool bIsLegalPage
= false;
233 return inw(dev
->base_addr
+ x
);
234 bIsLegalPage
= PlatformIOCheckPageLegalAndGetRegMask(u4bPage
,
237 u8 u1bPsr
= read_nic_io_byte(dev
, PSR
);
239 write_nic_io_byte(dev
, PSR
, ((u1bPsr
& u1PageMask
) |
241 Data
= read_nic_io_word(dev
, (x
& 0xff));
242 write_nic_io_byte(dev
, PSR
, (u1bPsr
& u1PageMask
));
248 u32
read_nic_io_dword(struct net_device
*dev
, int x
)
250 u32 u4bPage
= x
>> 8;
252 bool bIsLegalPage
= false;
256 return inl(dev
->base_addr
+ x
);
257 bIsLegalPage
= PlatformIOCheckPageLegalAndGetRegMask(u4bPage
,
260 u8 u1bPsr
= read_nic_io_byte(dev
, PSR
);
262 write_nic_io_byte(dev
, PSR
, ((u1bPsr
& u1PageMask
) |
264 Data
= read_nic_io_dword(dev
, (x
& 0xff));
265 write_nic_io_byte(dev
, PSR
, (u1bPsr
& u1PageMask
));
271 u8
read_nic_byte(struct net_device
*dev
, int x
)
273 return 0xff & readb((u8 __iomem
*)dev
->mem_start
+ x
);
276 u32
read_nic_dword(struct net_device
*dev
, int x
)
278 return readl((u8 __iomem
*)dev
->mem_start
+ x
);
281 u16
read_nic_word(struct net_device
*dev
, int x
)
283 return readw((u8 __iomem
*)dev
->mem_start
+ x
);
286 void write_nic_byte(struct net_device
*dev
, int x
, u8 y
)
288 writeb(y
, (u8 __iomem
*)dev
->mem_start
+ x
);
293 void write_nic_dword(struct net_device
*dev
, int x
, u32 y
)
295 writel(y
, (u8 __iomem
*)dev
->mem_start
+ x
);
300 void write_nic_word(struct net_device
*dev
, int x
, u16 y
)
302 writew(y
, (u8 __iomem
*)dev
->mem_start
+ x
);
307 /****************************************************************************
308 -----------------------------GENERAL FUNCTION-------------------------
309 *****************************************************************************/
310 bool MgntActSet_RF_State(struct net_device
*dev
,
311 enum rt_rf_power_state StateToSet
,
312 RT_RF_CHANGE_SOURCE ChangeSource
,
315 struct r8192_priv
*priv
= rtllib_priv(dev
);
316 struct rtllib_device
*ieee
= priv
->rtllib
;
317 bool bActionAllowed
= false;
318 bool bConnectBySSID
= false;
319 enum rt_rf_power_state rtState
;
320 u16 RFWaitCounter
= 0;
323 RT_TRACE((COMP_PS
| COMP_RF
),
324 "===>MgntActSet_RF_State(): StateToSet(%d)\n", StateToSet
);
326 ProtectOrNot
= false;
331 spin_lock_irqsave(&priv
->rf_ps_lock
, flag
);
332 if (priv
->RFChangeInProgress
) {
333 spin_unlock_irqrestore(&priv
->rf_ps_lock
, flag
);
334 RT_TRACE((COMP_PS
| COMP_RF
),
335 "MgntActSet_RF_State(): RF Change in progress! Wait to set..StateToSet(%d).\n",
338 while (priv
->RFChangeInProgress
) {
340 RT_TRACE((COMP_PS
| COMP_RF
),
341 "MgntActSet_RF_State(): Wait 1 ms (%d times)...\n",
345 if (RFWaitCounter
> 100) {
347 "%s(): Timeout waiting for RF change.\n",
353 priv
->RFChangeInProgress
= true;
354 spin_unlock_irqrestore(&priv
->rf_ps_lock
, flag
);
360 rtState
= priv
->rtllib
->eRFPowerState
;
362 switch (StateToSet
) {
364 priv
->rtllib
->RfOffReason
&= (~ChangeSource
);
366 if ((ChangeSource
== RF_CHANGE_BY_HW
) && priv
->bHwRadioOff
)
367 priv
->bHwRadioOff
= false;
369 if (!priv
->rtllib
->RfOffReason
) {
370 priv
->rtllib
->RfOffReason
= 0;
371 bActionAllowed
= true;
374 if (rtState
== eRfOff
&&
375 ChangeSource
>= RF_CHANGE_BY_HW
)
376 bConnectBySSID
= true;
378 RT_TRACE((COMP_PS
| COMP_RF
),
379 "MgntActSet_RF_State - eRfon reject pMgntInfo->RfOffReason= 0x%x, ChangeSource=0x%X\n",
380 priv
->rtllib
->RfOffReason
, ChangeSource
);
387 if ((priv
->rtllib
->iw_mode
== IW_MODE_INFRA
) ||
388 (priv
->rtllib
->iw_mode
== IW_MODE_ADHOC
)) {
389 if ((priv
->rtllib
->RfOffReason
> RF_CHANGE_BY_IPS
) ||
390 (ChangeSource
> RF_CHANGE_BY_IPS
)) {
391 if (ieee
->state
== RTLLIB_LINKED
)
392 priv
->blinked_ingpio
= true;
394 priv
->blinked_ingpio
= false;
395 rtllib_MgntDisconnect(priv
->rtllib
,
396 WLAN_REASON_DISASSOC_STA_HAS_LEFT
);
399 if ((ChangeSource
== RF_CHANGE_BY_HW
) && !priv
->bHwRadioOff
)
400 priv
->bHwRadioOff
= true;
401 priv
->rtllib
->RfOffReason
|= ChangeSource
;
402 bActionAllowed
= true;
406 priv
->rtllib
->RfOffReason
|= ChangeSource
;
407 bActionAllowed
= true;
414 if (bActionAllowed
) {
415 RT_TRACE((COMP_PS
| COMP_RF
),
416 "MgntActSet_RF_State(): Action is allowed.... StateToSet(%d), RfOffReason(%#X)\n",
417 StateToSet
, priv
->rtllib
->RfOffReason
);
418 PHY_SetRFPowerState(dev
, StateToSet
);
419 if (StateToSet
== eRfOn
) {
421 if (bConnectBySSID
&& priv
->blinked_ingpio
) {
422 queue_delayed_work_rsl(ieee
->wq
,
423 &ieee
->associate_procedure_wq
, 0);
424 priv
->blinked_ingpio
= false;
428 RT_TRACE((COMP_PS
| COMP_RF
),
429 "MgntActSet_RF_State(): Action is rejected.... StateToSet(%d), ChangeSource(%#X), RfOffReason(%#X)\n",
430 StateToSet
, ChangeSource
, priv
->rtllib
->RfOffReason
);
434 spin_lock_irqsave(&priv
->rf_ps_lock
, flag
);
435 priv
->RFChangeInProgress
= false;
436 spin_unlock_irqrestore(&priv
->rf_ps_lock
, flag
);
439 RT_TRACE((COMP_PS
| COMP_RF
), "<===MgntActSet_RF_State()\n");
440 return bActionAllowed
;
443 static short rtl8192_check_nic_enough_desc(struct net_device
*dev
, int prio
)
445 struct r8192_priv
*priv
= rtllib_priv(dev
);
446 struct rtl8192_tx_ring
*ring
= &priv
->tx_ring
[prio
];
448 if (ring
->entries
- skb_queue_len(&ring
->queue
) >= 2)
453 void rtl8192_tx_timeout(struct net_device
*dev
)
455 struct r8192_priv
*priv
= rtllib_priv(dev
);
457 schedule_work(&priv
->reset_wq
);
458 netdev_info(dev
, "TXTIMEOUT");
461 void rtl8192_irq_enable(struct net_device
*dev
)
463 struct r8192_priv
*priv
= (struct r8192_priv
*)rtllib_priv(dev
);
465 priv
->irq_enabled
= 1;
467 priv
->ops
->irq_enable(dev
);
470 void rtl8192_irq_disable(struct net_device
*dev
)
472 struct r8192_priv
*priv
= (struct r8192_priv
*)rtllib_priv(dev
);
474 priv
->ops
->irq_disable(dev
);
476 priv
->irq_enabled
= 0;
479 void rtl8192_set_chan(struct net_device
*dev
, short ch
)
481 struct r8192_priv
*priv
= (struct r8192_priv
*)rtllib_priv(dev
);
483 RT_TRACE(COMP_CH
, "=====>%s()====ch:%d\n", __func__
, ch
);
484 if (priv
->chan_forced
)
489 if (priv
->rf_set_chan
)
490 priv
->rf_set_chan(dev
, priv
->chan
);
493 void rtl8192_update_cap(struct net_device
*dev
, u16 cap
)
495 struct r8192_priv
*priv
= rtllib_priv(dev
);
496 struct rtllib_network
*net
= &priv
->rtllib
->current_network
;
499 if (cap
& WLAN_CAPABILITY_SHORT_PREAMBLE
) {
500 if (priv
->dot11CurrentPreambleMode
!= PREAMBLE_SHORT
) {
501 ShortPreamble
= true;
502 priv
->dot11CurrentPreambleMode
= PREAMBLE_SHORT
;
504 "%s(): WLAN_CAPABILITY_SHORT_PREAMBLE\n",
506 priv
->rtllib
->SetHwRegHandler(dev
, HW_VAR_ACK_PREAMBLE
,
507 (unsigned char *)&ShortPreamble
);
510 if (priv
->dot11CurrentPreambleMode
!= PREAMBLE_LONG
) {
511 ShortPreamble
= false;
512 priv
->dot11CurrentPreambleMode
= PREAMBLE_LONG
;
514 "%s(): WLAN_CAPABILITY_LONG_PREAMBLE\n",
516 priv
->rtllib
->SetHwRegHandler(dev
, HW_VAR_ACK_PREAMBLE
,
517 (unsigned char *)&ShortPreamble
);
521 if (net
->mode
& (IEEE_G
|IEEE_N_24G
)) {
523 u8 CurSlotTime
= priv
->slot_time
;
525 if ((cap
& WLAN_CAPABILITY_SHORT_SLOT_TIME
) &&
526 (!priv
->rtllib
->pHTInfo
->bCurrentRT2RTLongSlotTime
)) {
527 if (CurSlotTime
!= SHORT_SLOT_TIME
) {
528 slot_time_val
= SHORT_SLOT_TIME
;
529 priv
->rtllib
->SetHwRegHandler(dev
,
530 HW_VAR_SLOT_TIME
, &slot_time_val
);
533 if (CurSlotTime
!= NON_SHORT_SLOT_TIME
) {
534 slot_time_val
= NON_SHORT_SLOT_TIME
;
535 priv
->rtllib
->SetHwRegHandler(dev
,
536 HW_VAR_SLOT_TIME
, &slot_time_val
);
542 static struct rtllib_qos_parameters def_qos_parameters
= {
543 {cpu_to_le16(3), cpu_to_le16(3), cpu_to_le16(3), cpu_to_le16(3)},
544 {cpu_to_le16(7), cpu_to_le16(7), cpu_to_le16(7), cpu_to_le16(7)},
550 static void rtl8192_update_beacon(void *data
)
552 struct r8192_priv
*priv
= container_of_work_rsl(data
, struct r8192_priv
,
553 update_beacon_wq
.work
);
554 struct net_device
*dev
= priv
->rtllib
->dev
;
555 struct rtllib_device
*ieee
= priv
->rtllib
;
556 struct rtllib_network
*net
= &ieee
->current_network
;
558 if (ieee
->pHTInfo
->bCurrentHTSupport
)
559 HT_update_self_and_peer_setting(ieee
, net
);
560 ieee
->pHTInfo
->bCurrentRT2RTLongSlotTime
=
561 net
->bssht
.bdRT2RTLongSlotTime
;
562 ieee
->pHTInfo
->RT2RT_HT_Mode
= net
->bssht
.RT2RT_HT_Mode
;
563 rtl8192_update_cap(dev
, net
->capability
);
566 static void rtl8192_qos_activate(void *data
)
568 struct r8192_priv
*priv
= container_of_work_rsl(data
, struct r8192_priv
,
570 struct net_device
*dev
= priv
->rtllib
->dev
;
573 mutex_lock(&priv
->mutex
);
574 if (priv
->rtllib
->state
!= RTLLIB_LINKED
)
577 "qos active process with associate response received\n");
579 for (i
= 0; i
< QOS_QUEUE_NUM
; i
++)
580 priv
->rtllib
->SetHwRegHandler(dev
, HW_VAR_AC_PARAM
, (u8
*)(&i
));
584 mutex_unlock(&priv
->mutex
);
587 static int rtl8192_qos_handle_probe_response(struct r8192_priv
*priv
,
589 struct rtllib_network
*network
)
592 u32 size
= sizeof(struct rtllib_qos_parameters
);
594 if (priv
->rtllib
->state
!= RTLLIB_LINKED
)
597 if (priv
->rtllib
->iw_mode
!= IW_MODE_INFRA
)
600 if (network
->flags
& NETWORK_HAS_QOS_MASK
) {
601 if (active_network
&&
602 (network
->flags
& NETWORK_HAS_QOS_PARAMETERS
))
603 network
->qos_data
.active
= network
->qos_data
.supported
;
605 if ((network
->qos_data
.active
== 1) && (active_network
== 1) &&
606 (network
->flags
& NETWORK_HAS_QOS_PARAMETERS
) &&
607 (network
->qos_data
.old_param_count
!=
608 network
->qos_data
.param_count
)) {
609 network
->qos_data
.old_param_count
=
610 network
->qos_data
.param_count
;
611 priv
->rtllib
->wmm_acm
= network
->qos_data
.wmm_acm
;
612 queue_work_rsl(priv
->priv_wq
, &priv
->qos_activate
);
614 "QoS parameters change call qos_activate\n");
617 memcpy(&priv
->rtllib
->current_network
.qos_data
.parameters
,
618 &def_qos_parameters
, size
);
620 if ((network
->qos_data
.active
== 1) && (active_network
== 1)) {
621 queue_work_rsl(priv
->priv_wq
, &priv
->qos_activate
);
623 "QoS was disabled call qos_activate\n");
625 network
->qos_data
.active
= 0;
626 network
->qos_data
.supported
= 0;
632 static int rtl8192_handle_beacon(struct net_device
*dev
,
633 struct rtllib_beacon
*beacon
,
634 struct rtllib_network
*network
)
636 struct r8192_priv
*priv
= rtllib_priv(dev
);
638 rtl8192_qos_handle_probe_response(priv
, 1, network
);
640 queue_delayed_work_rsl(priv
->priv_wq
, &priv
->update_beacon_wq
, 0);
645 static int rtl8192_qos_association_resp(struct r8192_priv
*priv
,
646 struct rtllib_network
*network
)
649 u32 size
= sizeof(struct rtllib_qos_parameters
);
650 int set_qos_param
= 0;
652 if ((priv
== NULL
) || (network
== NULL
))
655 if (priv
->rtllib
->state
!= RTLLIB_LINKED
)
658 if (priv
->rtllib
->iw_mode
!= IW_MODE_INFRA
)
661 spin_lock_irqsave(&priv
->rtllib
->lock
, flags
);
662 if (network
->flags
& NETWORK_HAS_QOS_PARAMETERS
) {
663 memcpy(&priv
->rtllib
->current_network
.qos_data
.parameters
,
664 &network
->qos_data
.parameters
,
665 sizeof(struct rtllib_qos_parameters
));
666 priv
->rtllib
->current_network
.qos_data
.active
= 1;
667 priv
->rtllib
->wmm_acm
= network
->qos_data
.wmm_acm
;
669 priv
->rtllib
->current_network
.qos_data
.old_param_count
=
670 priv
->rtllib
->current_network
.qos_data
.param_count
;
671 priv
->rtllib
->current_network
.qos_data
.param_count
=
672 network
->qos_data
.param_count
;
674 memcpy(&priv
->rtllib
->current_network
.qos_data
.parameters
,
675 &def_qos_parameters
, size
);
676 priv
->rtllib
->current_network
.qos_data
.active
= 0;
677 priv
->rtllib
->current_network
.qos_data
.supported
= 0;
681 spin_unlock_irqrestore(&priv
->rtllib
->lock
, flags
);
683 RT_TRACE(COMP_QOS
, "%s: network->flags = %d,%d\n", __func__
,
684 network
->flags
, priv
->rtllib
->current_network
.qos_data
.active
);
685 if (set_qos_param
== 1) {
686 dm_init_edca_turbo(priv
->rtllib
->dev
);
687 queue_work_rsl(priv
->priv_wq
, &priv
->qos_activate
);
692 static int rtl8192_handle_assoc_response(struct net_device
*dev
,
693 struct rtllib_assoc_response_frame
*resp
,
694 struct rtllib_network
*network
)
696 struct r8192_priv
*priv
= rtllib_priv(dev
);
698 rtl8192_qos_association_resp(priv
, network
);
702 static void rtl8192_prepare_beacon(struct r8192_priv
*priv
)
704 struct net_device
*dev
= priv
->rtllib
->dev
;
705 struct sk_buff
*pskb
= NULL
, *pnewskb
= NULL
;
706 struct cb_desc
*tcb_desc
= NULL
;
707 struct rtl8192_tx_ring
*ring
= NULL
;
708 struct tx_desc
*pdesc
= NULL
;
710 ring
= &priv
->tx_ring
[BEACON_QUEUE
];
711 pskb
= __skb_dequeue(&ring
->queue
);
714 pnewskb
= rtllib_get_beacon(priv
->rtllib
);
718 tcb_desc
= (struct cb_desc
*)(pnewskb
->cb
+ 8);
719 tcb_desc
->queue_index
= BEACON_QUEUE
;
720 tcb_desc
->data_rate
= 2;
721 tcb_desc
->RATRIndex
= 7;
722 tcb_desc
->bTxDisableRateFallBack
= 1;
723 tcb_desc
->bTxUseDriverAssingedRate
= 1;
724 skb_push(pnewskb
, priv
->rtllib
->tx_headroom
);
726 pdesc
= &ring
->desc
[0];
727 priv
->ops
->tx_fill_descriptor(dev
, pdesc
, tcb_desc
, pnewskb
);
728 __skb_queue_tail(&ring
->queue
, pnewskb
);
732 static void rtl8192_stop_beacon(struct net_device
*dev
)
736 void rtl8192_config_rate(struct net_device
*dev
, u16
*rate_config
)
738 struct r8192_priv
*priv
= rtllib_priv(dev
);
739 struct rtllib_network
*net
;
740 u8 i
= 0, basic_rate
= 0;
742 net
= &priv
->rtllib
->current_network
;
744 for (i
= 0; i
< net
->rates_len
; i
++) {
745 basic_rate
= net
->rates
[i
] & 0x7f;
746 switch (basic_rate
) {
748 *rate_config
|= RRSR_1M
;
751 *rate_config
|= RRSR_2M
;
754 *rate_config
|= RRSR_5_5M
;
757 *rate_config
|= RRSR_11M
;
760 *rate_config
|= RRSR_6M
;
763 *rate_config
|= RRSR_9M
;
766 *rate_config
|= RRSR_12M
;
769 *rate_config
|= RRSR_18M
;
772 *rate_config
|= RRSR_24M
;
775 *rate_config
|= RRSR_36M
;
778 *rate_config
|= RRSR_48M
;
781 *rate_config
|= RRSR_54M
;
786 for (i
= 0; i
< net
->rates_ex_len
; i
++) {
787 basic_rate
= net
->rates_ex
[i
] & 0x7f;
788 switch (basic_rate
) {
790 *rate_config
|= RRSR_1M
;
793 *rate_config
|= RRSR_2M
;
796 *rate_config
|= RRSR_5_5M
;
799 *rate_config
|= RRSR_11M
;
802 *rate_config
|= RRSR_6M
;
805 *rate_config
|= RRSR_9M
;
808 *rate_config
|= RRSR_12M
;
811 *rate_config
|= RRSR_18M
;
814 *rate_config
|= RRSR_24M
;
817 *rate_config
|= RRSR_36M
;
820 *rate_config
|= RRSR_48M
;
823 *rate_config
|= RRSR_54M
;
829 static void rtl8192_refresh_supportrate(struct r8192_priv
*priv
)
831 struct rtllib_device
*ieee
= priv
->rtllib
;
833 if (ieee
->mode
== WIRELESS_MODE_N_24G
||
834 ieee
->mode
== WIRELESS_MODE_N_5G
) {
835 memcpy(ieee
->Regdot11HTOperationalRateSet
,
836 ieee
->RegHTSuppRateSet
, 16);
837 memcpy(ieee
->Regdot11TxHTOperationalRateSet
,
838 ieee
->RegHTSuppRateSet
, 16);
841 memset(ieee
->Regdot11HTOperationalRateSet
, 0, 16);
845 static u8
rtl8192_getSupportedWireleeMode(struct net_device
*dev
)
847 struct r8192_priv
*priv
= rtllib_priv(dev
);
850 switch (priv
->rf_chip
) {
855 ret
= (WIRELESS_MODE_N_24G
|WIRELESS_MODE_G
| WIRELESS_MODE_B
);
858 ret
= (WIRELESS_MODE_A
| WIRELESS_MODE_N_5G
);
861 ret
= WIRELESS_MODE_B
;
867 void rtl8192_SetWirelessMode(struct net_device
*dev
, u8 wireless_mode
)
869 struct r8192_priv
*priv
= rtllib_priv(dev
);
870 u8 bSupportMode
= rtl8192_getSupportedWireleeMode(dev
);
872 if ((wireless_mode
== WIRELESS_MODE_AUTO
) ||
873 ((wireless_mode
& bSupportMode
) == 0)) {
874 if (bSupportMode
& WIRELESS_MODE_N_24G
) {
875 wireless_mode
= WIRELESS_MODE_N_24G
;
876 } else if (bSupportMode
& WIRELESS_MODE_N_5G
) {
877 wireless_mode
= WIRELESS_MODE_N_5G
;
878 } else if ((bSupportMode
& WIRELESS_MODE_A
)) {
879 wireless_mode
= WIRELESS_MODE_A
;
880 } else if ((bSupportMode
& WIRELESS_MODE_G
)) {
881 wireless_mode
= WIRELESS_MODE_G
;
882 } else if ((bSupportMode
& WIRELESS_MODE_B
)) {
883 wireless_mode
= WIRELESS_MODE_B
;
886 "%s(): Unsupported mode requested. Fallback to 802.11b\n",
888 wireless_mode
= WIRELESS_MODE_B
;
892 if ((wireless_mode
& (WIRELESS_MODE_B
| WIRELESS_MODE_G
)) ==
893 (WIRELESS_MODE_G
| WIRELESS_MODE_B
))
894 wireless_mode
= WIRELESS_MODE_G
;
896 priv
->rtllib
->mode
= wireless_mode
;
898 ActUpdateChannelAccessSetting(dev
, wireless_mode
,
899 &priv
->ChannelAccessSetting
);
901 if ((wireless_mode
== WIRELESS_MODE_N_24G
) ||
902 (wireless_mode
== WIRELESS_MODE_N_5G
)) {
903 priv
->rtllib
->pHTInfo
->bEnableHT
= 1;
904 RT_TRACE(COMP_DBG
, "%s(), wireless_mode:%x, bEnableHT = 1\n",
905 __func__
, wireless_mode
);
907 priv
->rtllib
->pHTInfo
->bEnableHT
= 0;
908 RT_TRACE(COMP_DBG
, "%s(), wireless_mode:%x, bEnableHT = 0\n",
909 __func__
, wireless_mode
);
912 RT_TRACE(COMP_INIT
, "Current Wireless Mode is %x\n", wireless_mode
);
913 rtl8192_refresh_supportrate(priv
);
916 static int _rtl8192_sta_up(struct net_device
*dev
, bool is_silent_reset
)
918 struct r8192_priv
*priv
= rtllib_priv(dev
);
919 struct rt_pwr_save_ctrl
*pPSC
= (struct rt_pwr_save_ctrl
*)
920 (&(priv
->rtllib
->PowerSaveControl
));
921 bool init_status
= true;
923 priv
->bDriverIsGoingToUnload
= false;
924 priv
->bdisable_nic
= false;
927 priv
->rtllib
->ieee_up
= 1;
929 priv
->up_first_time
= 0;
930 RT_TRACE(COMP_INIT
, "Bringing up iface");
931 priv
->bfirst_init
= true;
932 init_status
= priv
->ops
->initialize_adapter(dev
);
934 netdev_err(dev
, "%s(): Initialization failed!\n", __func__
);
935 priv
->bfirst_init
= false;
939 RT_TRACE(COMP_INIT
, "start adapter finished\n");
940 RT_CLEAR_PS_LEVEL(pPSC
, RT_RF_OFF_LEVL_HALT_NIC
);
941 priv
->bfirst_init
= false;
943 if (priv
->polling_timer_on
== 0)
944 check_rfctrl_gpio_timer((unsigned long)dev
);
946 if (priv
->rtllib
->state
!= RTLLIB_LINKED
)
947 rtllib_softmac_start_protocol(priv
->rtllib
, 0);
948 rtllib_reset_queue(priv
->rtllib
);
949 watch_dog_timer_callback((unsigned long) dev
);
951 if (!netif_queue_stopped(dev
))
952 netif_start_queue(dev
);
954 netif_wake_queue(dev
);
959 static int rtl8192_sta_down(struct net_device
*dev
, bool shutdownrf
)
961 struct r8192_priv
*priv
= rtllib_priv(dev
);
962 unsigned long flags
= 0;
963 u8 RFInProgressTimeOut
= 0;
968 if (priv
->rtllib
->rtllib_ips_leave
!= NULL
)
969 priv
->rtllib
->rtllib_ips_leave(dev
);
971 if (priv
->rtllib
->state
== RTLLIB_LINKED
)
974 priv
->bDriverIsGoingToUnload
= true;
976 priv
->rtllib
->ieee_up
= 0;
977 priv
->bfirst_after_down
= true;
978 RT_TRACE(COMP_DOWN
, "==========>%s()\n", __func__
);
979 if (!netif_queue_stopped(dev
))
980 netif_stop_queue(dev
);
982 priv
->rtllib
->wpa_ie_len
= 0;
983 kfree(priv
->rtllib
->wpa_ie
);
984 priv
->rtllib
->wpa_ie
= NULL
;
985 CamResetAllEntry(dev
);
986 memset(priv
->rtllib
->swcamtable
, 0, sizeof(struct sw_cam_table
) * 32);
987 rtl8192_irq_disable(dev
);
989 del_timer_sync(&priv
->watch_dog_timer
);
990 rtl8192_cancel_deferred_work(priv
);
991 cancel_delayed_work(&priv
->rtllib
->hw_wakeup_wq
);
993 rtllib_softmac_stop_protocol(priv
->rtllib
, 0, true);
994 spin_lock_irqsave(&priv
->rf_ps_lock
, flags
);
995 while (priv
->RFChangeInProgress
) {
996 spin_unlock_irqrestore(&priv
->rf_ps_lock
, flags
);
997 if (RFInProgressTimeOut
> 100) {
998 spin_lock_irqsave(&priv
->rf_ps_lock
, flags
);
1002 "===>%s():RF is in progress, need to wait until rf change is done.\n",
1005 RFInProgressTimeOut
++;
1006 spin_lock_irqsave(&priv
->rf_ps_lock
, flags
);
1008 priv
->RFChangeInProgress
= true;
1009 spin_unlock_irqrestore(&priv
->rf_ps_lock
, flags
);
1010 priv
->ops
->stop_adapter(dev
, false);
1011 spin_lock_irqsave(&priv
->rf_ps_lock
, flags
);
1012 priv
->RFChangeInProgress
= false;
1013 spin_unlock_irqrestore(&priv
->rf_ps_lock
, flags
);
1015 memset(&priv
->rtllib
->current_network
, 0,
1016 offsetof(struct rtllib_network
, list
));
1017 RT_TRACE(COMP_DOWN
, "<==========%s()\n", __func__
);
1022 static void rtl8192_init_priv_handler(struct net_device
*dev
)
1024 struct r8192_priv
*priv
= rtllib_priv(dev
);
1026 priv
->rtllib
->softmac_hard_start_xmit
= rtl8192_hard_start_xmit
;
1027 priv
->rtllib
->set_chan
= rtl8192_set_chan
;
1028 priv
->rtllib
->link_change
= priv
->ops
->link_change
;
1029 priv
->rtllib
->softmac_data_hard_start_xmit
= rtl8192_hard_data_xmit
;
1030 priv
->rtllib
->data_hard_stop
= rtl8192_data_hard_stop
;
1031 priv
->rtllib
->data_hard_resume
= rtl8192_data_hard_resume
;
1032 priv
->rtllib
->check_nic_enough_desc
= rtl8192_check_nic_enough_desc
;
1033 priv
->rtllib
->handle_assoc_response
= rtl8192_handle_assoc_response
;
1034 priv
->rtllib
->handle_beacon
= rtl8192_handle_beacon
;
1035 priv
->rtllib
->SetWirelessMode
= rtl8192_SetWirelessMode
;
1036 priv
->rtllib
->LeisurePSLeave
= LeisurePSLeave
;
1037 priv
->rtllib
->SetBWModeHandler
= rtl8192_SetBWMode
;
1038 priv
->rf_set_chan
= rtl8192_phy_SwChnl
;
1040 priv
->rtllib
->start_send_beacons
= rtl8192e_start_beacon
;
1041 priv
->rtllib
->stop_send_beacons
= rtl8192_stop_beacon
;
1043 priv
->rtllib
->sta_wake_up
= rtl8192_hw_wakeup
;
1044 priv
->rtllib
->enter_sleep_state
= rtl8192_hw_to_sleep
;
1045 priv
->rtllib
->ps_is_queue_empty
= rtl8192_is_tx_queue_empty
;
1047 priv
->rtllib
->GetNmodeSupportBySecCfg
= rtl8192_GetNmodeSupportBySecCfg
;
1048 priv
->rtllib
->GetHalfNmodeSupportByAPsHandler
=
1049 rtl8192_GetHalfNmodeSupportByAPs
;
1051 priv
->rtllib
->SetHwRegHandler
= rtl8192e_SetHwReg
;
1052 priv
->rtllib
->AllowAllDestAddrHandler
= rtl8192_AllowAllDestAddr
;
1053 priv
->rtllib
->SetFwCmdHandler
= NULL
;
1054 priv
->rtllib
->InitialGainHandler
= InitialGain819xPci
;
1055 priv
->rtllib
->rtllib_ips_leave_wq
= rtllib_ips_leave_wq
;
1056 priv
->rtllib
->rtllib_ips_leave
= rtllib_ips_leave
;
1058 priv
->rtllib
->LedControlHandler
= NULL
;
1059 priv
->rtllib
->UpdateBeaconInterruptHandler
= NULL
;
1061 priv
->rtllib
->ScanOperationBackupHandler
= PHY_ScanOperationBackup8192
;
1064 static void rtl8192_init_priv_constant(struct net_device
*dev
)
1066 struct r8192_priv
*priv
= rtllib_priv(dev
);
1067 struct rt_pwr_save_ctrl
*pPSC
= (struct rt_pwr_save_ctrl
*)
1068 &(priv
->rtllib
->PowerSaveControl
);
1070 pPSC
->RegMaxLPSAwakeIntvl
= 5;
1074 static void rtl8192_init_priv_variable(struct net_device
*dev
)
1076 struct r8192_priv
*priv
= rtllib_priv(dev
);
1079 priv
->AcmMethod
= eAcmWay2_SW
;
1080 priv
->dot11CurrentPreambleMode
= PREAMBLE_AUTO
;
1081 priv
->rtllib
->status
= 0;
1082 priv
->polling_timer_on
= 0;
1083 priv
->up_first_time
= 1;
1084 priv
->blinked_ingpio
= false;
1085 priv
->bDriverIsGoingToUnload
= false;
1086 priv
->being_init_adapter
= false;
1087 priv
->initialized_at_probe
= false;
1088 priv
->bdisable_nic
= false;
1089 priv
->bfirst_init
= false;
1090 priv
->txringcount
= 64;
1091 priv
->rxbuffersize
= 9100;
1092 priv
->rxringcount
= MAX_RX_COUNT
;
1093 priv
->irq_enabled
= 0;
1095 priv
->RegChannelPlan
= 0xf;
1096 priv
->rtllib
->mode
= WIRELESS_MODE_AUTO
;
1097 priv
->rtllib
->iw_mode
= IW_MODE_INFRA
;
1098 priv
->rtllib
->bNetPromiscuousMode
= false;
1099 priv
->rtllib
->IntelPromiscuousModeInfo
.bPromiscuousOn
= false;
1100 priv
->rtllib
->IntelPromiscuousModeInfo
.bFilterSourceStationFrame
=
1102 priv
->rtllib
->ieee_up
= 0;
1103 priv
->retry_rts
= DEFAULT_RETRY_RTS
;
1104 priv
->retry_data
= DEFAULT_RETRY_DATA
;
1105 priv
->rtllib
->rts
= DEFAULT_RTS_THRESHOLD
;
1106 priv
->rtllib
->rate
= 110;
1107 priv
->rtllib
->short_slot
= 1;
1108 priv
->promisc
= (dev
->flags
& IFF_PROMISC
) ? 1 : 0;
1109 priv
->bcck_in_ch14
= false;
1110 priv
->bfsync_processing
= false;
1111 priv
->CCKPresentAttentuation
= 0;
1112 priv
->rfa_txpowertrackingindex
= 0;
1113 priv
->rfc_txpowertrackingindex
= 0;
1115 priv
->ScanDelay
= 50;
1116 priv
->ResetProgress
= RESET_TYPE_NORESET
;
1117 priv
->bForcedSilentReset
= false;
1118 priv
->bDisableNormalResetCheck
= false;
1119 priv
->force_reset
= false;
1120 memset(priv
->rtllib
->swcamtable
, 0, sizeof(struct sw_cam_table
) * 32);
1122 memset(&priv
->InterruptLog
, 0, sizeof(struct log_int_8190
));
1123 priv
->RxCounter
= 0;
1124 priv
->rtllib
->wx_set_enc
= 0;
1125 priv
->bHwRadioOff
= false;
1126 priv
->RegRfOff
= false;
1127 priv
->isRFOff
= false;
1128 priv
->bInPowerSaveMode
= false;
1129 priv
->rtllib
->RfOffReason
= 0;
1130 priv
->RFChangeInProgress
= false;
1131 priv
->bHwRfOffAction
= 0;
1132 priv
->SetRFPowerStateInProgress
= false;
1133 priv
->rtllib
->PowerSaveControl
.bInactivePs
= true;
1134 priv
->rtllib
->PowerSaveControl
.bIPSModeBackup
= false;
1135 priv
->rtllib
->PowerSaveControl
.bLeisurePs
= true;
1136 priv
->rtllib
->PowerSaveControl
.bFwCtrlLPS
= false;
1137 priv
->rtllib
->LPSDelayCnt
= 0;
1138 priv
->rtllib
->sta_sleep
= LPS_IS_WAKE
;
1139 priv
->rtllib
->eRFPowerState
= eRfOn
;
1141 priv
->rtllib
->current_network
.beacon_interval
= DEFAULT_BEACONINTERVAL
;
1142 priv
->rtllib
->iw_mode
= IW_MODE_INFRA
;
1143 priv
->rtllib
->active_scan
= 1;
1144 priv
->rtllib
->be_scan_inprogress
= false;
1145 priv
->rtllib
->modulation
= RTLLIB_CCK_MODULATION
|
1146 RTLLIB_OFDM_MODULATION
;
1147 priv
->rtllib
->host_encrypt
= 1;
1148 priv
->rtllib
->host_decrypt
= 1;
1150 priv
->rtllib
->fts
= DEFAULT_FRAG_THRESHOLD
;
1152 priv
->card_type
= PCI
;
1154 priv
->pFirmware
= vzalloc(sizeof(struct rt_firmware
));
1155 if (!priv
->pFirmware
)
1157 "rtl8192e: Unable to allocate space for firmware\n");
1159 skb_queue_head_init(&priv
->skb_queue
);
1161 for (i
= 0; i
< MAX_QUEUE_SIZE
; i
++)
1162 skb_queue_head_init(&priv
->rtllib
->skb_waitQ
[i
]);
1163 for (i
= 0; i
< MAX_QUEUE_SIZE
; i
++)
1164 skb_queue_head_init(&priv
->rtllib
->skb_aggQ
[i
]);
1167 static void rtl8192_init_priv_lock(struct r8192_priv
*priv
)
1169 spin_lock_init(&priv
->tx_lock
);
1170 spin_lock_init(&priv
->irq_th_lock
);
1171 spin_lock_init(&priv
->rf_ps_lock
);
1172 spin_lock_init(&priv
->ps_lock
);
1173 sema_init(&priv
->wx_sem
, 1);
1174 sema_init(&priv
->rf_sem
, 1);
1175 mutex_init(&priv
->mutex
);
1178 static void rtl8192_init_priv_task(struct net_device
*dev
)
1180 struct r8192_priv
*priv
= rtllib_priv(dev
);
1182 priv
->priv_wq
= create_workqueue(DRV_NAME
);
1183 INIT_WORK_RSL(&priv
->reset_wq
, (void *)rtl8192_restart
, dev
);
1184 INIT_WORK_RSL(&priv
->rtllib
->ips_leave_wq
, (void *)IPSLeave_wq
, dev
);
1185 INIT_DELAYED_WORK_RSL(&priv
->watch_dog_wq
,
1186 (void *)rtl819x_watchdog_wqcallback
, dev
);
1187 INIT_DELAYED_WORK_RSL(&priv
->txpower_tracking_wq
,
1188 (void *)dm_txpower_trackingcallback
, dev
);
1189 INIT_DELAYED_WORK_RSL(&priv
->rfpath_check_wq
,
1190 (void *)dm_rf_pathcheck_workitemcallback
, dev
);
1191 INIT_DELAYED_WORK_RSL(&priv
->update_beacon_wq
,
1192 (void *)rtl8192_update_beacon
, dev
);
1193 INIT_WORK_RSL(&priv
->qos_activate
, (void *)rtl8192_qos_activate
, dev
);
1194 INIT_DELAYED_WORK_RSL(&priv
->rtllib
->hw_wakeup_wq
,
1195 (void *) rtl8192_hw_wakeup_wq
, dev
);
1196 INIT_DELAYED_WORK_RSL(&priv
->rtllib
->hw_sleep_wq
,
1197 (void *) rtl8192_hw_sleep_wq
, dev
);
1198 tasklet_init(&priv
->irq_rx_tasklet
,
1199 (void(*)(unsigned long))rtl8192_irq_rx_tasklet
,
1200 (unsigned long)priv
);
1201 tasklet_init(&priv
->irq_tx_tasklet
,
1202 (void(*)(unsigned long))rtl8192_irq_tx_tasklet
,
1203 (unsigned long)priv
);
1204 tasklet_init(&priv
->irq_prepare_beacon_tasklet
,
1205 (void(*)(unsigned long))rtl8192_prepare_beacon
,
1206 (unsigned long)priv
);
1209 static short rtl8192_get_channel_map(struct net_device
*dev
)
1213 struct r8192_priv
*priv
= rtllib_priv(dev
);
1215 if ((priv
->rf_chip
!= RF_8225
) && (priv
->rf_chip
!= RF_8256
)
1216 && (priv
->rf_chip
!= RF_6052
)) {
1217 netdev_err(dev
, "%s: unknown rf chip, can't set channel map\n",
1222 if (priv
->ChannelPlan
>= COUNTRY_CODE_MAX
) {
1224 "rtl819x_init:Error channel plan! Set to default.\n");
1225 priv
->ChannelPlan
= COUNTRY_CODE_FCC
;
1227 RT_TRACE(COMP_INIT
, "Channel plan is %d\n", priv
->ChannelPlan
);
1228 dot11d_init(priv
->rtllib
);
1229 Dot11d_Channelmap(priv
->ChannelPlan
, priv
->rtllib
);
1230 for (i
= 1; i
<= 11; i
++)
1231 (priv
->rtllib
->active_channel_map
)[i
] = 1;
1232 (priv
->rtllib
->active_channel_map
)[12] = 2;
1233 (priv
->rtllib
->active_channel_map
)[13] = 2;
1238 static short rtl8192_init(struct net_device
*dev
)
1240 struct r8192_priv
*priv
= rtllib_priv(dev
);
1242 memset(&(priv
->stats
), 0, sizeof(struct rt_stats
));
1244 rtl8192_init_priv_handler(dev
);
1245 rtl8192_init_priv_constant(dev
);
1246 rtl8192_init_priv_variable(dev
);
1247 rtl8192_init_priv_lock(priv
);
1248 rtl8192_init_priv_task(dev
);
1249 priv
->ops
->get_eeprom_size(dev
);
1250 priv
->ops
->init_adapter_variable(dev
);
1251 rtl8192_get_channel_map(dev
);
1255 setup_timer(&priv
->watch_dog_timer
,
1256 watch_dog_timer_callback
,
1257 (unsigned long) dev
);
1259 setup_timer(&priv
->gpio_polling_timer
,
1260 check_rfctrl_gpio_timer
,
1261 (unsigned long)dev
);
1263 rtl8192_irq_disable(dev
);
1264 if (request_irq(dev
->irq
, rtl8192_interrupt
, IRQF_SHARED
,
1266 netdev_err(dev
, "Error allocating IRQ %d", dev
->irq
);
1270 priv
->irq
= dev
->irq
;
1271 RT_TRACE(COMP_INIT
, "IRQ %d\n", dev
->irq
);
1273 if (rtl8192_pci_initdescring(dev
) != 0) {
1274 netdev_err(dev
, "Endopoints initialization failed");
1275 free_irq(dev
->irq
, dev
);
1282 /***************************************************************************
1283 -------------------------------WATCHDOG STUFF---------------------------
1284 ***************************************************************************/
1285 short rtl8192_is_tx_queue_empty(struct net_device
*dev
)
1288 struct r8192_priv
*priv
= rtllib_priv(dev
);
1290 for (i
= 0; i
<= MGNT_QUEUE
; i
++) {
1291 if ((i
== TXCMD_QUEUE
) || (i
== HCCA_QUEUE
))
1293 if (skb_queue_len(&(&priv
->tx_ring
[i
])->queue
) > 0) {
1294 netdev_info(dev
, "===>tx queue is not empty:%d, %d\n",
1295 i
, skb_queue_len(&(&priv
->tx_ring
[i
])->queue
));
1302 static enum reset_type
rtl819x_TxCheckStuck(struct net_device
*dev
)
1304 struct r8192_priv
*priv
= rtllib_priv(dev
);
1306 u8 ResetThreshold
= NIC_SEND_HANG_THRESHOLD_POWERSAVE
;
1307 bool bCheckFwTxCnt
= false;
1308 struct rtl8192_tx_ring
*ring
= NULL
;
1309 struct sk_buff
*skb
= NULL
;
1310 struct cb_desc
*tcb_desc
= NULL
;
1311 unsigned long flags
= 0;
1313 switch (priv
->rtllib
->ps
) {
1314 case RTLLIB_PS_DISABLED
:
1315 ResetThreshold
= NIC_SEND_HANG_THRESHOLD_NORMAL
;
1317 case (RTLLIB_PS_MBCAST
|RTLLIB_PS_UNICAST
):
1318 ResetThreshold
= NIC_SEND_HANG_THRESHOLD_POWERSAVE
;
1321 ResetThreshold
= NIC_SEND_HANG_THRESHOLD_POWERSAVE
;
1324 spin_lock_irqsave(&priv
->irq_th_lock
, flags
);
1325 for (QueueID
= 0; QueueID
< MAX_TX_QUEUE
; QueueID
++) {
1326 if (QueueID
== TXCMD_QUEUE
)
1329 if (QueueID
== BEACON_QUEUE
)
1332 ring
= &priv
->tx_ring
[QueueID
];
1334 if (skb_queue_len(&ring
->queue
) == 0) {
1337 skb
= (&ring
->queue
)->next
;
1338 tcb_desc
= (struct cb_desc
*)(skb
->cb
+
1340 tcb_desc
->nStuckCount
++;
1341 bCheckFwTxCnt
= true;
1342 if (tcb_desc
->nStuckCount
> 1)
1344 "%s: QueueID=%d tcb_desc->nStuckCount=%d\n",
1346 tcb_desc
->nStuckCount
);
1349 spin_unlock_irqrestore(&priv
->irq_th_lock
, flags
);
1351 if (bCheckFwTxCnt
) {
1352 if (priv
->ops
->TxCheckStuckHandler(dev
)) {
1353 RT_TRACE(COMP_RESET
,
1354 "TxCheckStuck(): Fw indicates no Tx condition!\n");
1355 return RESET_TYPE_SILENT
;
1359 return RESET_TYPE_NORESET
;
1362 static enum reset_type
rtl819x_RxCheckStuck(struct net_device
*dev
)
1364 struct r8192_priv
*priv
= rtllib_priv(dev
);
1366 if (priv
->ops
->RxCheckStuckHandler(dev
)) {
1367 RT_TRACE(COMP_RESET
, "RxStuck Condition\n");
1368 return RESET_TYPE_SILENT
;
1371 return RESET_TYPE_NORESET
;
1374 static enum reset_type
rtl819x_ifcheck_resetornot(struct net_device
*dev
)
1376 struct r8192_priv
*priv
= rtllib_priv(dev
);
1377 enum reset_type TxResetType
= RESET_TYPE_NORESET
;
1378 enum reset_type RxResetType
= RESET_TYPE_NORESET
;
1379 enum rt_rf_power_state rfState
;
1381 rfState
= priv
->rtllib
->eRFPowerState
;
1383 if (rfState
== eRfOn
)
1384 TxResetType
= rtl819x_TxCheckStuck(dev
);
1386 if (rfState
== eRfOn
&&
1387 (priv
->rtllib
->iw_mode
== IW_MODE_INFRA
) &&
1388 (priv
->rtllib
->state
== RTLLIB_LINKED
))
1389 RxResetType
= rtl819x_RxCheckStuck(dev
);
1391 if (TxResetType
== RESET_TYPE_NORMAL
||
1392 RxResetType
== RESET_TYPE_NORMAL
) {
1393 netdev_info(dev
, "%s(): TxResetType is %d, RxResetType is %d\n",
1394 __func__
, TxResetType
, RxResetType
);
1395 return RESET_TYPE_NORMAL
;
1396 } else if (TxResetType
== RESET_TYPE_SILENT
||
1397 RxResetType
== RESET_TYPE_SILENT
) {
1398 netdev_info(dev
, "%s(): TxResetType is %d, RxResetType is %d\n",
1399 __func__
, TxResetType
, RxResetType
);
1400 return RESET_TYPE_SILENT
;
1402 return RESET_TYPE_NORESET
;
1407 static void rtl819x_silentreset_mesh_bk(struct net_device
*dev
, u8 IsPortal
)
1411 static void rtl819x_ifsilentreset(struct net_device
*dev
)
1413 struct r8192_priv
*priv
= rtllib_priv(dev
);
1415 int reset_status
= 0;
1416 struct rtllib_device
*ieee
= priv
->rtllib
;
1422 if (priv
->ResetProgress
== RESET_TYPE_NORESET
) {
1424 RT_TRACE(COMP_RESET
, "=========>Reset progress!!\n");
1426 priv
->ResetProgress
= RESET_TYPE_SILENT
;
1428 spin_lock_irqsave(&priv
->rf_ps_lock
, flag
);
1429 if (priv
->RFChangeInProgress
) {
1430 spin_unlock_irqrestore(&priv
->rf_ps_lock
, flag
);
1433 priv
->RFChangeInProgress
= true;
1434 priv
->bResetInProgress
= true;
1435 spin_unlock_irqrestore(&priv
->rf_ps_lock
, flag
);
1439 down(&priv
->wx_sem
);
1441 if (priv
->rtllib
->state
== RTLLIB_LINKED
)
1442 LeisurePSLeave(dev
);
1445 netdev_info(dev
, "%s():the driver is not up.\n",
1452 RT_TRACE(COMP_RESET
, "%s():======>start to down the driver\n",
1455 RT_TRACE(COMP_RESET
,
1456 "%s():111111111111111111111111======>start to down the driver\n",
1459 if (!netif_queue_stopped(dev
))
1460 netif_stop_queue(dev
);
1462 rtl8192_irq_disable(dev
);
1463 del_timer_sync(&priv
->watch_dog_timer
);
1464 rtl8192_cancel_deferred_work(priv
);
1466 rtllib_stop_scan_syncro(ieee
);
1468 if (ieee
->state
== RTLLIB_LINKED
) {
1469 SEM_DOWN_IEEE_WX(&ieee
->wx_sem
);
1470 netdev_info(dev
, "ieee->state is RTLLIB_LINKED\n");
1471 rtllib_stop_send_beacons(priv
->rtllib
);
1472 del_timer_sync(&ieee
->associate_timer
);
1473 cancel_delayed_work(&ieee
->associate_retry_wq
);
1474 rtllib_stop_scan(ieee
);
1475 netif_carrier_off(dev
);
1476 SEM_UP_IEEE_WX(&ieee
->wx_sem
);
1478 netdev_info(dev
, "ieee->state is NOT LINKED\n");
1479 rtllib_softmac_stop_protocol(priv
->rtllib
, 0, true);
1482 dm_backup_dynamic_mechanism_state(dev
);
1485 RT_TRACE(COMP_RESET
,
1486 "%s():<==========down process is finished\n",
1489 RT_TRACE(COMP_RESET
, "%s():<===========up process start\n",
1491 reset_status
= _rtl8192_up(dev
, true);
1493 RT_TRACE(COMP_RESET
,
1494 "%s():<===========up process is finished\n", __func__
);
1495 if (reset_status
== -1) {
1496 if (reset_times
< 3) {
1500 netdev_warn(dev
, "%s(): Reset Failed\n",
1505 ieee
->is_silent_reset
= 1;
1507 spin_lock_irqsave(&priv
->rf_ps_lock
, flag
);
1508 priv
->RFChangeInProgress
= false;
1509 spin_unlock_irqrestore(&priv
->rf_ps_lock
, flag
);
1511 EnableHWSecurityConfig8192(dev
);
1513 if (ieee
->state
== RTLLIB_LINKED
&& ieee
->iw_mode
==
1515 ieee
->set_chan(ieee
->dev
,
1516 ieee
->current_network
.channel
);
1518 queue_work_rsl(ieee
->wq
, &ieee
->associate_complete_wq
);
1520 } else if (ieee
->state
== RTLLIB_LINKED
&& ieee
->iw_mode
==
1522 ieee
->set_chan(ieee
->dev
,
1523 ieee
->current_network
.channel
);
1524 ieee
->link_change(ieee
->dev
);
1526 notify_wx_assoc_event(ieee
);
1528 rtllib_start_send_beacons(ieee
);
1530 if (ieee
->data_hard_resume
)
1531 ieee
->data_hard_resume(ieee
->dev
);
1532 netif_carrier_on(ieee
->dev
);
1533 } else if (ieee
->iw_mode
== IW_MODE_MESH
) {
1534 rtl819x_silentreset_mesh_bk(dev
, IsPortal
);
1537 CamRestoreAllEntry(dev
);
1538 dm_restore_dynamic_mechanism_state(dev
);
1540 priv
->ResetProgress
= RESET_TYPE_NORESET
;
1541 priv
->reset_count
++;
1543 priv
->bForcedSilentReset
= false;
1544 priv
->bResetInProgress
= false;
1546 write_nic_byte(dev
, UFWP
, 1);
1547 RT_TRACE(COMP_RESET
, "Reset finished!! ====>[%d]\n",
1552 static void rtl819x_update_rxcounts(struct r8192_priv
*priv
, u32
*TotalRxBcnNum
,
1553 u32
*TotalRxDataNum
)
1559 *TotalRxDataNum
= 0;
1561 SlotIndex
= (priv
->rtllib
->LinkDetectInfo
.SlotIndex
++) %
1562 (priv
->rtllib
->LinkDetectInfo
.SlotNum
);
1563 priv
->rtllib
->LinkDetectInfo
.RxBcnNum
[SlotIndex
] =
1564 priv
->rtllib
->LinkDetectInfo
.NumRecvBcnInPeriod
;
1565 priv
->rtllib
->LinkDetectInfo
.RxDataNum
[SlotIndex
] =
1566 priv
->rtllib
->LinkDetectInfo
.NumRecvDataInPeriod
;
1567 for (i
= 0; i
< priv
->rtllib
->LinkDetectInfo
.SlotNum
; i
++) {
1568 *TotalRxBcnNum
+= priv
->rtllib
->LinkDetectInfo
.RxBcnNum
[i
];
1569 *TotalRxDataNum
+= priv
->rtllib
->LinkDetectInfo
.RxDataNum
[i
];
1574 void rtl819x_watchdog_wqcallback(void *data
)
1576 struct r8192_priv
*priv
= container_of_dwork_rsl(data
,
1577 struct r8192_priv
, watch_dog_wq
);
1578 struct net_device
*dev
= priv
->rtllib
->dev
;
1579 struct rtllib_device
*ieee
= priv
->rtllib
;
1580 enum reset_type ResetType
= RESET_TYPE_NORESET
;
1581 static u8 check_reset_cnt
;
1582 unsigned long flags
;
1583 struct rt_pwr_save_ctrl
*pPSC
= (struct rt_pwr_save_ctrl
*)
1584 (&(priv
->rtllib
->PowerSaveControl
));
1585 bool bBusyTraffic
= false;
1586 bool bHigherBusyTraffic
= false;
1587 bool bHigherBusyRxTraffic
= false;
1588 bool bEnterPS
= false;
1590 if (!priv
->up
|| priv
->bHwRadioOff
)
1593 if (priv
->rtllib
->state
>= RTLLIB_LINKED
) {
1594 if (priv
->rtllib
->CntAfterLink
< 2)
1595 priv
->rtllib
->CntAfterLink
++;
1597 priv
->rtllib
->CntAfterLink
= 0;
1600 hal_dm_watchdog(dev
);
1602 if (rtllib_act_scanning(priv
->rtllib
, false) == false) {
1603 if ((ieee
->iw_mode
== IW_MODE_INFRA
) && (ieee
->state
==
1605 (ieee
->eRFPowerState
== eRfOn
) && !ieee
->is_set_key
&&
1606 (!ieee
->proto_stoppping
) && !ieee
->wx_set_enc
) {
1607 if ((ieee
->PowerSaveControl
.ReturnPoint
==
1608 IPS_CALLBACK_NONE
) &&
1609 (!ieee
->bNetPromiscuousMode
)) {
1611 "====================>haha: IPSEnter()\n");
1616 if ((ieee
->state
== RTLLIB_LINKED
) && (ieee
->iw_mode
==
1617 IW_MODE_INFRA
) && (!ieee
->bNetPromiscuousMode
)) {
1618 if (ieee
->LinkDetectInfo
.NumRxOkInPeriod
> 100 ||
1619 ieee
->LinkDetectInfo
.NumTxOkInPeriod
> 100)
1620 bBusyTraffic
= true;
1623 if (ieee
->LinkDetectInfo
.NumRxOkInPeriod
> 4000 ||
1624 ieee
->LinkDetectInfo
.NumTxOkInPeriod
> 4000) {
1625 bHigherBusyTraffic
= true;
1626 if (ieee
->LinkDetectInfo
.NumRxOkInPeriod
> 5000)
1627 bHigherBusyRxTraffic
= true;
1629 bHigherBusyRxTraffic
= false;
1632 if (((ieee
->LinkDetectInfo
.NumRxUnicastOkInPeriod
+
1633 ieee
->LinkDetectInfo
.NumTxOkInPeriod
) > 8) ||
1634 (ieee
->LinkDetectInfo
.NumRxUnicastOkInPeriod
> 2))
1639 if (ieee
->current_network
.beacon_interval
< 95)
1643 LeisurePSEnter(dev
);
1645 LeisurePSLeave(dev
);
1648 RT_TRACE(COMP_LPS
, "====>no link LPS leave\n");
1649 LeisurePSLeave(dev
);
1652 ieee
->LinkDetectInfo
.NumRxOkInPeriod
= 0;
1653 ieee
->LinkDetectInfo
.NumTxOkInPeriod
= 0;
1654 ieee
->LinkDetectInfo
.NumRxUnicastOkInPeriod
= 0;
1655 ieee
->LinkDetectInfo
.bBusyTraffic
= bBusyTraffic
;
1657 ieee
->LinkDetectInfo
.bHigherBusyTraffic
= bHigherBusyTraffic
;
1658 ieee
->LinkDetectInfo
.bHigherBusyRxTraffic
= bHigherBusyRxTraffic
;
1660 if (ieee
->state
== RTLLIB_LINKED
&& ieee
->iw_mode
== IW_MODE_INFRA
) {
1661 u32 TotalRxBcnNum
= 0;
1662 u32 TotalRxDataNum
= 0;
1664 rtl819x_update_rxcounts(priv
, &TotalRxBcnNum
, &TotalRxDataNum
);
1666 if ((TotalRxBcnNum
+TotalRxDataNum
) == 0)
1667 priv
->check_roaming_cnt
++;
1669 priv
->check_roaming_cnt
= 0;
1672 if (priv
->check_roaming_cnt
> 0) {
1673 if (ieee
->eRFPowerState
== eRfOff
)
1674 netdev_info(dev
, "%s(): RF is off\n", __func__
);
1677 "===>%s(): AP is power off, chan:%d, connect another one\n",
1678 __func__
, priv
->chan
);
1680 ieee
->state
= RTLLIB_ASSOCIATING
;
1682 RemovePeerTS(priv
->rtllib
,
1683 priv
->rtllib
->current_network
.bssid
);
1684 ieee
->is_roaming
= true;
1685 ieee
->is_set_key
= false;
1686 ieee
->link_change(dev
);
1687 if (ieee
->LedControlHandler
)
1688 ieee
->LedControlHandler(ieee
->dev
,
1689 LED_CTL_START_TO_LINK
);
1691 notify_wx_assoc_event(ieee
);
1693 if (!(ieee
->rtllib_ap_sec_type(ieee
) &
1694 (SEC_ALG_CCMP
|SEC_ALG_TKIP
)))
1695 queue_delayed_work_rsl(ieee
->wq
,
1696 &ieee
->associate_procedure_wq
, 0);
1698 priv
->check_roaming_cnt
= 0;
1700 ieee
->LinkDetectInfo
.NumRecvBcnInPeriod
= 0;
1701 ieee
->LinkDetectInfo
.NumRecvDataInPeriod
= 0;
1705 spin_lock_irqsave(&priv
->tx_lock
, flags
);
1706 if ((check_reset_cnt
++ >= 3) && (!ieee
->is_roaming
) &&
1707 (!priv
->RFChangeInProgress
) && (!pPSC
->bSwRfProcessing
)) {
1708 ResetType
= rtl819x_ifcheck_resetornot(dev
);
1709 check_reset_cnt
= 3;
1711 spin_unlock_irqrestore(&priv
->tx_lock
, flags
);
1713 if (!priv
->bDisableNormalResetCheck
&& ResetType
== RESET_TYPE_NORMAL
) {
1714 priv
->ResetProgress
= RESET_TYPE_NORMAL
;
1715 RT_TRACE(COMP_RESET
, "%s(): NOMAL RESET\n", __func__
);
1719 if (((priv
->force_reset
) || (!priv
->bDisableNormalResetCheck
&&
1720 ResetType
== RESET_TYPE_SILENT
)))
1721 rtl819x_ifsilentreset(dev
);
1722 priv
->force_reset
= false;
1723 priv
->bForcedSilentReset
= false;
1724 priv
->bResetInProgress
= false;
1725 RT_TRACE(COMP_TRACE
, " <==RtUsbCheckForHangWorkItemCallback()\n");
1728 void watch_dog_timer_callback(unsigned long data
)
1730 struct r8192_priv
*priv
= rtllib_priv((struct net_device
*)data
);
1732 queue_delayed_work_rsl(priv
->priv_wq
, &priv
->watch_dog_wq
, 0);
1733 mod_timer(&priv
->watch_dog_timer
, jiffies
+
1734 msecs_to_jiffies(RTLLIB_WATCH_DOG_TIME
));
1737 /****************************************************************************
1738 ---------------------------- NIC TX/RX STUFF---------------------------
1739 *****************************************************************************/
1740 void rtl8192_rx_enable(struct net_device
*dev
)
1742 struct r8192_priv
*priv
= (struct r8192_priv
*)rtllib_priv(dev
);
1744 priv
->ops
->rx_enable(dev
);
1747 void rtl8192_tx_enable(struct net_device
*dev
)
1749 struct r8192_priv
*priv
= (struct r8192_priv
*)rtllib_priv(dev
);
1751 priv
->ops
->tx_enable(dev
);
1753 rtllib_reset_queue(priv
->rtllib
);
1757 static void rtl8192_free_rx_ring(struct net_device
*dev
)
1759 struct r8192_priv
*priv
= rtllib_priv(dev
);
1760 int i
, rx_queue_idx
;
1762 for (rx_queue_idx
= 0; rx_queue_idx
< MAX_RX_QUEUE
;
1764 for (i
= 0; i
< priv
->rxringcount
; i
++) {
1765 struct sk_buff
*skb
= priv
->rx_buf
[rx_queue_idx
][i
];
1770 pci_unmap_single(priv
->pdev
,
1771 *((dma_addr_t
*)skb
->cb
),
1772 priv
->rxbuffersize
, PCI_DMA_FROMDEVICE
);
1776 pci_free_consistent(priv
->pdev
,
1777 sizeof(*priv
->rx_ring
[rx_queue_idx
]) *
1779 priv
->rx_ring
[rx_queue_idx
],
1780 priv
->rx_ring_dma
[rx_queue_idx
]);
1781 priv
->rx_ring
[rx_queue_idx
] = NULL
;
1785 static void rtl8192_free_tx_ring(struct net_device
*dev
, unsigned int prio
)
1787 struct r8192_priv
*priv
= rtllib_priv(dev
);
1788 struct rtl8192_tx_ring
*ring
= &priv
->tx_ring
[prio
];
1790 while (skb_queue_len(&ring
->queue
)) {
1791 struct tx_desc
*entry
= &ring
->desc
[ring
->idx
];
1792 struct sk_buff
*skb
= __skb_dequeue(&ring
->queue
);
1794 pci_unmap_single(priv
->pdev
, entry
->TxBuffAddr
,
1795 skb
->len
, PCI_DMA_TODEVICE
);
1797 ring
->idx
= (ring
->idx
+ 1) % ring
->entries
;
1800 pci_free_consistent(priv
->pdev
, sizeof(*ring
->desc
)*ring
->entries
,
1801 ring
->desc
, ring
->dma
);
1805 void rtl8192_data_hard_stop(struct net_device
*dev
)
1810 void rtl8192_data_hard_resume(struct net_device
*dev
)
1814 void rtl8192_hard_data_xmit(struct sk_buff
*skb
, struct net_device
*dev
,
1817 struct r8192_priv
*priv
= (struct r8192_priv
*)rtllib_priv(dev
);
1819 struct cb_desc
*tcb_desc
= (struct cb_desc
*)(skb
->cb
+
1821 u8 queue_index
= tcb_desc
->queue_index
;
1823 if ((priv
->rtllib
->eRFPowerState
== eRfOff
) || !priv
->up
||
1824 priv
->bResetInProgress
) {
1829 if (queue_index
!= TXCMD_QUEUE
)
1830 netdev_warn(dev
, "%s(): queue index != TXCMD_QUEUE\n",
1833 memcpy((unsigned char *)(skb
->cb
), &dev
, sizeof(dev
));
1834 skb_push(skb
, priv
->rtllib
->tx_headroom
);
1835 ret
= rtl8192_tx(dev
, skb
);
1839 if (queue_index
!= MGNT_QUEUE
) {
1840 priv
->rtllib
->stats
.tx_bytes
+= (skb
->len
-
1841 priv
->rtllib
->tx_headroom
);
1842 priv
->rtllib
->stats
.tx_packets
++;
1846 int rtl8192_hard_start_xmit(struct sk_buff
*skb
, struct net_device
*dev
)
1848 struct r8192_priv
*priv
= (struct r8192_priv
*)rtllib_priv(dev
);
1850 struct cb_desc
*tcb_desc
= (struct cb_desc
*)(skb
->cb
+
1852 u8 queue_index
= tcb_desc
->queue_index
;
1854 if (queue_index
!= TXCMD_QUEUE
) {
1855 if ((priv
->rtllib
->eRFPowerState
== eRfOff
) ||
1856 !priv
->up
|| priv
->bResetInProgress
) {
1862 memcpy((unsigned char *)(skb
->cb
), &dev
, sizeof(dev
));
1863 if (queue_index
== TXCMD_QUEUE
) {
1864 rtl8192_tx_cmd(dev
, skb
);
1868 tcb_desc
->RATRIndex
= 7;
1869 tcb_desc
->bTxDisableRateFallBack
= 1;
1870 tcb_desc
->bTxUseDriverAssingedRate
= 1;
1871 tcb_desc
->bTxEnableFwCalcDur
= 1;
1872 skb_push(skb
, priv
->rtllib
->tx_headroom
);
1873 ret
= rtl8192_tx(dev
, skb
);
1879 static void rtl8192_tx_isr(struct net_device
*dev
, int prio
)
1881 struct r8192_priv
*priv
= (struct r8192_priv
*)rtllib_priv(dev
);
1883 struct rtl8192_tx_ring
*ring
= &priv
->tx_ring
[prio
];
1885 while (skb_queue_len(&ring
->queue
)) {
1886 struct tx_desc
*entry
= &ring
->desc
[ring
->idx
];
1887 struct sk_buff
*skb
;
1889 if (prio
!= BEACON_QUEUE
) {
1892 ring
->idx
= (ring
->idx
+ 1) % ring
->entries
;
1895 skb
= __skb_dequeue(&ring
->queue
);
1896 pci_unmap_single(priv
->pdev
, entry
->TxBuffAddr
,
1897 skb
->len
, PCI_DMA_TODEVICE
);
1901 if (prio
!= BEACON_QUEUE
)
1902 tasklet_schedule(&priv
->irq_tx_tasklet
);
1905 void rtl8192_tx_cmd(struct net_device
*dev
, struct sk_buff
*skb
)
1907 struct r8192_priv
*priv
= rtllib_priv(dev
);
1908 struct rtl8192_tx_ring
*ring
;
1909 struct tx_desc_cmd
*entry
;
1911 struct cb_desc
*tcb_desc
;
1912 unsigned long flags
;
1914 spin_lock_irqsave(&priv
->irq_th_lock
, flags
);
1915 ring
= &priv
->tx_ring
[TXCMD_QUEUE
];
1917 idx
= (ring
->idx
+ skb_queue_len(&ring
->queue
)) % ring
->entries
;
1918 entry
= (struct tx_desc_cmd
*) &ring
->desc
[idx
];
1920 tcb_desc
= (struct cb_desc
*)(skb
->cb
+ MAX_DEV_ADDR_SIZE
);
1922 priv
->ops
->tx_fill_cmd_descriptor(dev
, entry
, tcb_desc
, skb
);
1924 __skb_queue_tail(&ring
->queue
, skb
);
1925 spin_unlock_irqrestore(&priv
->irq_th_lock
, flags
);
1928 short rtl8192_tx(struct net_device
*dev
, struct sk_buff
*skb
)
1930 struct r8192_priv
*priv
= rtllib_priv(dev
);
1931 struct rtl8192_tx_ring
*ring
;
1932 unsigned long flags
;
1933 struct cb_desc
*tcb_desc
= (struct cb_desc
*)(skb
->cb
+
1935 struct tx_desc
*pdesc
= NULL
;
1936 struct rtllib_hdr_1addr
*header
= NULL
;
1937 u16 fc
= 0, type
= 0, stype
= 0;
1938 bool multi_addr
= false, broad_addr
= false, uni_addr
= false;
1939 u8
*pda_addr
= NULL
;
1941 u32 fwinfo_size
= 0;
1943 if (priv
->bdisable_nic
) {
1944 netdev_warn(dev
, "%s: Nic is disabled! Can't tx packet.\n",
1949 priv
->rtllib
->bAwakePktSent
= true;
1951 fwinfo_size
= sizeof(struct tx_fwinfo_8190pci
);
1953 header
= (struct rtllib_hdr_1addr
*)(((u8
*)skb
->data
) + fwinfo_size
);
1954 fc
= le16_to_cpu(header
->frame_ctl
);
1955 type
= WLAN_FC_GET_TYPE(fc
);
1956 stype
= WLAN_FC_GET_STYPE(fc
);
1957 pda_addr
= header
->addr1
;
1959 if (is_broadcast_ether_addr(pda_addr
))
1961 else if (is_multicast_ether_addr(pda_addr
))
1967 priv
->stats
.txbytesunicast
+= skb
->len
- fwinfo_size
;
1968 else if (multi_addr
)
1969 priv
->stats
.txbytesmulticast
+= skb
->len
- fwinfo_size
;
1971 priv
->stats
.txbytesbroadcast
+= skb
->len
- fwinfo_size
;
1973 spin_lock_irqsave(&priv
->irq_th_lock
, flags
);
1974 ring
= &priv
->tx_ring
[tcb_desc
->queue_index
];
1975 if (tcb_desc
->queue_index
!= BEACON_QUEUE
)
1976 idx
= (ring
->idx
+ skb_queue_len(&ring
->queue
)) % ring
->entries
;
1980 pdesc
= &ring
->desc
[idx
];
1981 if ((pdesc
->OWN
== 1) && (tcb_desc
->queue_index
!= BEACON_QUEUE
)) {
1983 "No more TX desc@%d, ring->idx = %d, idx = %d, skblen = 0x%x queuelen=%d",
1984 tcb_desc
->queue_index
, ring
->idx
, idx
, skb
->len
,
1985 skb_queue_len(&ring
->queue
));
1986 spin_unlock_irqrestore(&priv
->irq_th_lock
, flags
);
1990 if (type
== RTLLIB_FTYPE_DATA
) {
1991 if (priv
->rtllib
->LedControlHandler
)
1992 priv
->rtllib
->LedControlHandler(dev
, LED_CTL_TX
);
1994 priv
->ops
->tx_fill_descriptor(dev
, pdesc
, tcb_desc
, skb
);
1995 __skb_queue_tail(&ring
->queue
, skb
);
1997 spin_unlock_irqrestore(&priv
->irq_th_lock
, flags
);
1998 dev
->trans_start
= jiffies
;
2000 write_nic_word(dev
, TPPoll
, 0x01 << tcb_desc
->queue_index
);
2004 static short rtl8192_alloc_rx_desc_ring(struct net_device
*dev
)
2006 struct r8192_priv
*priv
= rtllib_priv(dev
);
2007 struct rx_desc
*entry
= NULL
;
2008 int i
, rx_queue_idx
;
2010 for (rx_queue_idx
= 0; rx_queue_idx
< MAX_RX_QUEUE
; rx_queue_idx
++) {
2011 priv
->rx_ring
[rx_queue_idx
] = pci_zalloc_consistent(priv
->pdev
,
2012 sizeof(*priv
->rx_ring
[rx_queue_idx
]) * priv
->rxringcount
,
2013 &priv
->rx_ring_dma
[rx_queue_idx
]);
2014 if (!priv
->rx_ring
[rx_queue_idx
] ||
2015 (unsigned long)priv
->rx_ring
[rx_queue_idx
] & 0xFF) {
2016 netdev_warn(dev
, "Cannot allocate RX ring\n");
2020 priv
->rx_idx
[rx_queue_idx
] = 0;
2022 for (i
= 0; i
< priv
->rxringcount
; i
++) {
2023 struct sk_buff
*skb
= dev_alloc_skb(priv
->rxbuffersize
);
2024 dma_addr_t
*mapping
;
2026 entry
= &priv
->rx_ring
[rx_queue_idx
][i
];
2030 priv
->rx_buf
[rx_queue_idx
][i
] = skb
;
2031 mapping
= (dma_addr_t
*)skb
->cb
;
2032 *mapping
= pci_map_single(priv
->pdev
,
2033 skb_tail_pointer_rsl(skb
),
2035 PCI_DMA_FROMDEVICE
);
2036 if (pci_dma_mapping_error(priv
->pdev
, *mapping
)) {
2037 dev_kfree_skb_any(skb
);
2040 entry
->BufferAddress
= *mapping
;
2042 entry
->Length
= priv
->rxbuffersize
;
2052 static int rtl8192_alloc_tx_desc_ring(struct net_device
*dev
,
2053 unsigned int prio
, unsigned int entries
)
2055 struct r8192_priv
*priv
= (struct r8192_priv
*)rtllib_priv(dev
);
2056 struct tx_desc
*ring
;
2060 ring
= pci_zalloc_consistent(priv
->pdev
, sizeof(*ring
) * entries
, &dma
);
2061 if (!ring
|| (unsigned long)ring
& 0xFF) {
2062 netdev_warn(dev
, "Cannot allocate TX ring (prio = %d)\n", prio
);
2066 priv
->tx_ring
[prio
].desc
= ring
;
2067 priv
->tx_ring
[prio
].dma
= dma
;
2068 priv
->tx_ring
[prio
].idx
= 0;
2069 priv
->tx_ring
[prio
].entries
= entries
;
2070 skb_queue_head_init(&priv
->tx_ring
[prio
].queue
);
2072 for (i
= 0; i
< entries
; i
++)
2073 ring
[i
].NextDescAddress
=
2074 (u32
)dma
+ ((i
+ 1) % entries
) *
2081 short rtl8192_pci_initdescring(struct net_device
*dev
)
2085 struct r8192_priv
*priv
= rtllib_priv(dev
);
2087 ret
= rtl8192_alloc_rx_desc_ring(dev
);
2091 for (i
= 0; i
< MAX_TX_QUEUE_COUNT
; i
++) {
2092 ret
= rtl8192_alloc_tx_desc_ring(dev
, i
, priv
->txringcount
);
2094 goto err_free_rings
;
2100 rtl8192_free_rx_ring(dev
);
2101 for (i
= 0; i
< MAX_TX_QUEUE_COUNT
; i
++)
2102 if (priv
->tx_ring
[i
].desc
)
2103 rtl8192_free_tx_ring(dev
, i
);
2107 void rtl8192_pci_resetdescring(struct net_device
*dev
)
2109 struct r8192_priv
*priv
= rtllib_priv(dev
);
2110 int i
, rx_queue_idx
;
2111 unsigned long flags
= 0;
2113 for (rx_queue_idx
= 0; rx_queue_idx
< MAX_RX_QUEUE
; rx_queue_idx
++) {
2114 if (priv
->rx_ring
[rx_queue_idx
]) {
2115 struct rx_desc
*entry
= NULL
;
2117 for (i
= 0; i
< priv
->rxringcount
; i
++) {
2118 entry
= &priv
->rx_ring
[rx_queue_idx
][i
];
2121 priv
->rx_idx
[rx_queue_idx
] = 0;
2125 spin_lock_irqsave(&priv
->irq_th_lock
, flags
);
2126 for (i
= 0; i
< MAX_TX_QUEUE_COUNT
; i
++) {
2127 if (priv
->tx_ring
[i
].desc
) {
2128 struct rtl8192_tx_ring
*ring
= &priv
->tx_ring
[i
];
2130 while (skb_queue_len(&ring
->queue
)) {
2131 struct tx_desc
*entry
= &ring
->desc
[ring
->idx
];
2132 struct sk_buff
*skb
=
2133 __skb_dequeue(&ring
->queue
);
2135 pci_unmap_single(priv
->pdev
,
2137 skb
->len
, PCI_DMA_TODEVICE
);
2139 ring
->idx
= (ring
->idx
+ 1) % ring
->entries
;
2144 spin_unlock_irqrestore(&priv
->irq_th_lock
, flags
);
2147 void rtl819x_UpdateRxPktTimeStamp(struct net_device
*dev
,
2148 struct rtllib_rx_stats
*stats
)
2150 struct r8192_priv
*priv
= (struct r8192_priv
*)rtllib_priv(dev
);
2152 if (stats
->bIsAMPDU
&& !stats
->bFirstMPDU
)
2153 stats
->mac_time
= priv
->LastRxDescTSF
;
2155 priv
->LastRxDescTSF
= stats
->mac_time
;
2158 long rtl819x_translate_todbm(struct r8192_priv
*priv
, u8 signal_strength_index
)
2162 signal_power
= (long)((signal_strength_index
+ 1) >> 1);
2165 return signal_power
;
2170 rtl819x_update_rxsignalstatistics8190pci(
2171 struct r8192_priv
*priv
,
2172 struct rtllib_rx_stats
*pprevious_stats
2178 if (priv
->stats
.recv_signal_power
== 0)
2179 priv
->stats
.recv_signal_power
=
2180 pprevious_stats
->RecvSignalPower
;
2182 if (pprevious_stats
->RecvSignalPower
> priv
->stats
.recv_signal_power
)
2184 else if (pprevious_stats
->RecvSignalPower
<
2185 priv
->stats
.recv_signal_power
)
2187 priv
->stats
.recv_signal_power
= (priv
->stats
.recv_signal_power
* 5 +
2188 pprevious_stats
->RecvSignalPower
+
2192 void rtl819x_process_cck_rxpathsel(struct r8192_priv
*priv
,
2193 struct rtllib_rx_stats
*pprevious_stats
)
2198 u8
rtl819x_query_rxpwrpercentage(char antpower
)
2200 if ((antpower
<= -100) || (antpower
>= 20))
2202 else if (antpower
>= 0)
2205 return 100 + antpower
;
2207 } /* QueryRxPwrPercentage */
2210 rtl819x_evm_dbtopercentage(
2222 ret_val
= 0 - ret_val
;
2230 rtl8192_record_rxdesc_forlateruse(
2231 struct rtllib_rx_stats
*psrc_stats
,
2232 struct rtllib_rx_stats
*ptarget_stats
2235 ptarget_stats
->bIsAMPDU
= psrc_stats
->bIsAMPDU
;
2236 ptarget_stats
->bFirstMPDU
= psrc_stats
->bFirstMPDU
;
2241 static void rtl8192_rx_normal(struct net_device
*dev
)
2243 struct r8192_priv
*priv
= (struct r8192_priv
*)rtllib_priv(dev
);
2244 struct rtllib_hdr_1addr
*rtllib_hdr
= NULL
;
2245 bool unicast_packet
= false;
2246 bool bLedBlinking
= true;
2247 u16 fc
= 0, type
= 0;
2249 int rx_queue_idx
= RX_MPDU_QUEUE
;
2251 struct rtllib_rx_stats stats
= {
2255 .freq
= RTLLIB_24GHZ_BAND
,
2257 unsigned int count
= priv
->rxringcount
;
2259 stats
.nic_type
= NIC_8192E
;
2262 struct rx_desc
*pdesc
= &priv
->rx_ring
[rx_queue_idx
]
2263 [priv
->rx_idx
[rx_queue_idx
]];
2264 struct sk_buff
*skb
= priv
->rx_buf
[rx_queue_idx
]
2265 [priv
->rx_idx
[rx_queue_idx
]];
2266 struct sk_buff
*new_skb
;
2270 if (!priv
->ops
->rx_query_status_descriptor(dev
, &stats
,
2273 new_skb
= dev_alloc_skb(priv
->rxbuffersize
);
2274 /* if allocation of new skb failed - drop current packet
2277 if (unlikely(!new_skb
))
2280 pci_unmap_single(priv
->pdev
,
2281 *((dma_addr_t
*)skb
->cb
),
2283 PCI_DMA_FROMDEVICE
);
2285 skb_put(skb
, pdesc
->Length
);
2286 skb_reserve(skb
, stats
.RxDrvInfoSize
+
2288 skb_trim(skb
, skb
->len
- 4/*sCrcLng*/);
2289 rtllib_hdr
= (struct rtllib_hdr_1addr
*)skb
->data
;
2290 if (!is_multicast_ether_addr(rtllib_hdr
->addr1
)) {
2291 /* unicast packet */
2292 unicast_packet
= true;
2294 fc
= le16_to_cpu(rtllib_hdr
->frame_ctl
);
2295 type
= WLAN_FC_GET_TYPE(fc
);
2296 if (type
== RTLLIB_FTYPE_MGMT
)
2297 bLedBlinking
= false;
2300 if (priv
->rtllib
->LedControlHandler
)
2301 priv
->rtllib
->LedControlHandler(dev
,
2305 if (type
!= RTLLIB_FTYPE_MGMT
)
2306 priv
->stats
.rxdatacrcerr
++;
2308 priv
->stats
.rxmgmtcrcerr
++;
2313 if (!rtllib_rx(priv
->rtllib
, skb
, &stats
)) {
2314 dev_kfree_skb_any(skb
);
2318 priv
->stats
.rxbytesunicast
+= skb_len
;
2324 priv
->rx_buf
[rx_queue_idx
][priv
->rx_idx
[rx_queue_idx
]] =
2326 *((dma_addr_t
*) skb
->cb
) = pci_map_single(priv
->pdev
,
2327 skb_tail_pointer_rsl(skb
),
2329 PCI_DMA_FROMDEVICE
);
2330 if (pci_dma_mapping_error(priv
->pdev
,
2331 *((dma_addr_t
*)skb
->cb
))) {
2332 dev_kfree_skb_any(skb
);
2336 pdesc
->BufferAddress
= *((dma_addr_t
*)skb
->cb
);
2338 pdesc
->Length
= priv
->rxbuffersize
;
2339 if (priv
->rx_idx
[rx_queue_idx
] == priv
->rxringcount
-1)
2341 priv
->rx_idx
[rx_queue_idx
] = (priv
->rx_idx
[rx_queue_idx
] + 1) %
2347 static void rtl8192_rx_cmd(struct net_device
*dev
)
2352 static void rtl8192_tx_resume(struct net_device
*dev
)
2354 struct r8192_priv
*priv
= (struct r8192_priv
*)rtllib_priv(dev
);
2355 struct rtllib_device
*ieee
= priv
->rtllib
;
2356 struct sk_buff
*skb
;
2359 for (queue_index
= BK_QUEUE
;
2360 queue_index
< MAX_QUEUE_SIZE
; queue_index
++) {
2361 while ((!skb_queue_empty(&ieee
->skb_waitQ
[queue_index
])) &&
2362 (priv
->rtllib
->check_nic_enough_desc(dev
, queue_index
) > 0)) {
2363 skb
= skb_dequeue(&ieee
->skb_waitQ
[queue_index
]);
2364 ieee
->softmac_data_hard_start_xmit(skb
, dev
, 0);
2369 void rtl8192_irq_tx_tasklet(struct r8192_priv
*priv
)
2371 rtl8192_tx_resume(priv
->rtllib
->dev
);
2374 void rtl8192_irq_rx_tasklet(struct r8192_priv
*priv
)
2376 rtl8192_rx_normal(priv
->rtllib
->dev
);
2378 if (MAX_RX_QUEUE
> 1)
2379 rtl8192_rx_cmd(priv
->rtllib
->dev
);
2381 write_nic_dword(priv
->rtllib
->dev
, INTA_MASK
,
2382 read_nic_dword(priv
->rtllib
->dev
, INTA_MASK
) | IMR_RDU
);
2385 /****************************************************************************
2386 ---------------------------- NIC START/CLOSE STUFF---------------------------
2387 *****************************************************************************/
2388 void rtl8192_cancel_deferred_work(struct r8192_priv
*priv
)
2390 cancel_delayed_work(&priv
->watch_dog_wq
);
2391 cancel_delayed_work(&priv
->update_beacon_wq
);
2392 cancel_delayed_work(&priv
->rtllib
->hw_sleep_wq
);
2393 cancel_work_sync(&priv
->reset_wq
);
2394 cancel_work_sync(&priv
->qos_activate
);
2397 int _rtl8192_up(struct net_device
*dev
, bool is_silent_reset
)
2399 if (_rtl8192_sta_up(dev
, is_silent_reset
) == -1)
2405 static int rtl8192_open(struct net_device
*dev
)
2407 struct r8192_priv
*priv
= rtllib_priv(dev
);
2410 down(&priv
->wx_sem
);
2411 ret
= rtl8192_up(dev
);
2418 int rtl8192_up(struct net_device
*dev
)
2420 struct r8192_priv
*priv
= rtllib_priv(dev
);
2424 return _rtl8192_up(dev
, false);
2428 static int rtl8192_close(struct net_device
*dev
)
2430 struct r8192_priv
*priv
= rtllib_priv(dev
);
2433 if ((rtllib_act_scanning(priv
->rtllib
, false)) &&
2434 !(priv
->rtllib
->softmac_features
& IEEE_SOFTMAC_SCAN
)) {
2435 rtllib_stop_scan(priv
->rtllib
);
2438 down(&priv
->wx_sem
);
2440 ret
= rtl8192_down(dev
, true);
2448 int rtl8192_down(struct net_device
*dev
, bool shutdownrf
)
2450 if (rtl8192_sta_down(dev
, shutdownrf
) == -1)
2456 void rtl8192_commit(struct net_device
*dev
)
2458 struct r8192_priv
*priv
= rtllib_priv(dev
);
2462 rtllib_softmac_stop_protocol(priv
->rtllib
, 0, true);
2463 rtl8192_irq_disable(dev
);
2464 priv
->ops
->stop_adapter(dev
, true);
2465 _rtl8192_up(dev
, false);
2468 void rtl8192_restart(void *data
)
2470 struct r8192_priv
*priv
= container_of_work_rsl(data
, struct r8192_priv
,
2472 struct net_device
*dev
= priv
->rtllib
->dev
;
2474 down(&priv
->wx_sem
);
2476 rtl8192_commit(dev
);
2481 static void r8192_set_multicast(struct net_device
*dev
)
2483 struct r8192_priv
*priv
= rtllib_priv(dev
);
2486 promisc
= (dev
->flags
& IFF_PROMISC
) ? 1 : 0;
2487 priv
->promisc
= promisc
;
2492 static int r8192_set_mac_adr(struct net_device
*dev
, void *mac
)
2494 struct r8192_priv
*priv
= rtllib_priv(dev
);
2495 struct sockaddr
*addr
= mac
;
2497 down(&priv
->wx_sem
);
2499 ether_addr_copy(dev
->dev_addr
, addr
->sa_data
);
2501 schedule_work(&priv
->reset_wq
);
2507 /* based on ipw2200 driver */
2508 static int rtl8192_ioctl(struct net_device
*dev
, struct ifreq
*rq
, int cmd
)
2510 struct r8192_priv
*priv
= (struct r8192_priv
*)rtllib_priv(dev
);
2511 struct iwreq
*wrq
= (struct iwreq
*)rq
;
2513 struct rtllib_device
*ieee
= priv
->rtllib
;
2515 const u8 broadcast_addr
[ETH_ALEN
] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2516 struct iw_point
*p
= &wrq
->u
.data
;
2517 struct ieee_param
*ipw
= NULL
;
2519 down(&priv
->wx_sem
);
2522 case RTL_IOCTL_WPA_SUPPLICANT
:
2523 if (p
->length
< sizeof(struct ieee_param
) || !p
->pointer
) {
2528 ipw
= memdup_user(p
->pointer
, p
->length
);
2534 if (ipw
->cmd
== IEEE_CMD_SET_ENCRYPTION
) {
2535 if (ipw
->u
.crypt
.set_tx
) {
2536 if (strcmp(ipw
->u
.crypt
.alg
, "CCMP") == 0)
2537 ieee
->pairwise_key_type
= KEY_TYPE_CCMP
;
2538 else if (strcmp(ipw
->u
.crypt
.alg
, "TKIP") == 0)
2539 ieee
->pairwise_key_type
= KEY_TYPE_TKIP
;
2540 else if (strcmp(ipw
->u
.crypt
.alg
, "WEP") == 0) {
2541 if (ipw
->u
.crypt
.key_len
== 13)
2542 ieee
->pairwise_key_type
=
2544 else if (ipw
->u
.crypt
.key_len
== 5)
2545 ieee
->pairwise_key_type
=
2548 ieee
->pairwise_key_type
= KEY_TYPE_NA
;
2551 if (ieee
->pairwise_key_type
) {
2552 if (is_zero_ether_addr(ieee
->ap_mac_addr
))
2553 ieee
->iw_mode
= IW_MODE_ADHOC
;
2554 memcpy((u8
*)key
, ipw
->u
.crypt
.key
, 16);
2555 EnableHWSecurityConfig8192(dev
);
2556 set_swcam(dev
, 4, ipw
->u
.crypt
.idx
,
2557 ieee
->pairwise_key_type
,
2558 (u8
*)ieee
->ap_mac_addr
,
2560 setKey(dev
, 4, ipw
->u
.crypt
.idx
,
2561 ieee
->pairwise_key_type
,
2562 (u8
*)ieee
->ap_mac_addr
, 0, key
);
2563 if (ieee
->iw_mode
== IW_MODE_ADHOC
) {
2564 set_swcam(dev
, ipw
->u
.crypt
.idx
,
2566 ieee
->pairwise_key_type
,
2567 (u8
*)ieee
->ap_mac_addr
,
2569 setKey(dev
, ipw
->u
.crypt
.idx
,
2571 ieee
->pairwise_key_type
,
2572 (u8
*)ieee
->ap_mac_addr
,
2576 if ((ieee
->pairwise_key_type
== KEY_TYPE_CCMP
)
2577 && ieee
->pHTInfo
->bCurrentHTSupport
) {
2578 write_nic_byte(dev
, 0x173, 1);
2582 memcpy((u8
*)key
, ipw
->u
.crypt
.key
, 16);
2583 if (strcmp(ipw
->u
.crypt
.alg
, "CCMP") == 0)
2584 ieee
->group_key_type
= KEY_TYPE_CCMP
;
2585 else if (strcmp(ipw
->u
.crypt
.alg
, "TKIP") == 0)
2586 ieee
->group_key_type
= KEY_TYPE_TKIP
;
2587 else if (strcmp(ipw
->u
.crypt
.alg
, "WEP") == 0) {
2588 if (ipw
->u
.crypt
.key_len
== 13)
2589 ieee
->group_key_type
=
2591 else if (ipw
->u
.crypt
.key_len
== 5)
2592 ieee
->group_key_type
=
2595 ieee
->group_key_type
= KEY_TYPE_NA
;
2597 if (ieee
->group_key_type
) {
2598 set_swcam(dev
, ipw
->u
.crypt
.idx
,
2600 ieee
->group_key_type
,
2601 broadcast_addr
, 0, key
, 0);
2602 setKey(dev
, ipw
->u
.crypt
.idx
,
2604 ieee
->group_key_type
,
2605 broadcast_addr
, 0, key
);
2610 ret
= rtllib_wpa_supplicant_ioctl(priv
->rtllib
, &wrq
->u
.data
,
2626 static irqreturn_t
rtl8192_interrupt(int irq
, void *netdev
)
2628 struct net_device
*dev
= (struct net_device
*) netdev
;
2629 struct r8192_priv
*priv
= (struct r8192_priv
*)rtllib_priv(dev
);
2630 unsigned long flags
;
2636 if (priv
->irq_enabled
== 0)
2639 spin_lock_irqsave(&priv
->irq_th_lock
, flags
);
2641 priv
->ops
->interrupt_recognized(dev
, &inta
, &intb
);
2642 priv
->stats
.shints
++;
2645 spin_unlock_irqrestore(&priv
->irq_th_lock
, flags
);
2649 if (inta
== 0xffff) {
2650 spin_unlock_irqrestore(&priv
->irq_th_lock
, flags
);
2656 if (!netif_running(dev
)) {
2657 spin_unlock_irqrestore(&priv
->irq_th_lock
, flags
);
2661 if (inta
& IMR_TBDOK
) {
2662 RT_TRACE(COMP_INTR
, "beacon ok interrupt!\n");
2663 priv
->stats
.txbeaconokint
++;
2666 if (inta
& IMR_TBDER
) {
2667 RT_TRACE(COMP_INTR
, "beacon ok interrupt!\n");
2668 priv
->stats
.txbeaconerr
++;
2671 if (inta
& IMR_BDOK
)
2672 RT_TRACE(COMP_INTR
, "beacon interrupt!\n");
2674 if (inta
& IMR_MGNTDOK
) {
2675 RT_TRACE(COMP_INTR
, "Manage ok interrupt!\n");
2676 priv
->stats
.txmanageokint
++;
2677 rtl8192_tx_isr(dev
, MGNT_QUEUE
);
2678 spin_unlock_irqrestore(&priv
->irq_th_lock
, flags
);
2679 if (priv
->rtllib
->ack_tx_to_ieee
) {
2680 if (rtl8192_is_tx_queue_empty(dev
)) {
2681 priv
->rtllib
->ack_tx_to_ieee
= 0;
2682 rtllib_ps_tx_ack(priv
->rtllib
, 1);
2685 spin_lock_irqsave(&priv
->irq_th_lock
, flags
);
2688 if (inta
& IMR_COMDOK
) {
2689 priv
->stats
.txcmdpktokint
++;
2690 rtl8192_tx_isr(dev
, TXCMD_QUEUE
);
2693 if (inta
& IMR_HIGHDOK
)
2694 rtl8192_tx_isr(dev
, HIGH_QUEUE
);
2696 if (inta
& IMR_ROK
) {
2697 priv
->stats
.rxint
++;
2698 priv
->InterruptLog
.nIMR_ROK
++;
2699 tasklet_schedule(&priv
->irq_rx_tasklet
);
2702 if (inta
& IMR_BcnInt
) {
2703 RT_TRACE(COMP_INTR
, "prepare beacon for interrupt!\n");
2704 tasklet_schedule(&priv
->irq_prepare_beacon_tasklet
);
2707 if (inta
& IMR_RDU
) {
2708 RT_TRACE(COMP_INTR
, "rx descriptor unavailable!\n");
2709 priv
->stats
.rxrdu
++;
2710 write_nic_dword(dev
, INTA_MASK
,
2711 read_nic_dword(dev
, INTA_MASK
) & ~IMR_RDU
);
2712 tasklet_schedule(&priv
->irq_rx_tasklet
);
2715 if (inta
& IMR_RXFOVW
) {
2716 RT_TRACE(COMP_INTR
, "rx overflow !\n");
2717 priv
->stats
.rxoverflow
++;
2718 tasklet_schedule(&priv
->irq_rx_tasklet
);
2721 if (inta
& IMR_TXFOVW
)
2722 priv
->stats
.txoverflow
++;
2724 if (inta
& IMR_BKDOK
) {
2725 RT_TRACE(COMP_INTR
, "BK Tx OK interrupt!\n");
2726 priv
->stats
.txbkokint
++;
2727 priv
->rtllib
->LinkDetectInfo
.NumTxOkInPeriod
++;
2728 rtl8192_tx_isr(dev
, BK_QUEUE
);
2731 if (inta
& IMR_BEDOK
) {
2732 RT_TRACE(COMP_INTR
, "BE TX OK interrupt!\n");
2733 priv
->stats
.txbeokint
++;
2734 priv
->rtllib
->LinkDetectInfo
.NumTxOkInPeriod
++;
2735 rtl8192_tx_isr(dev
, BE_QUEUE
);
2738 if (inta
& IMR_VIDOK
) {
2739 RT_TRACE(COMP_INTR
, "VI TX OK interrupt!\n");
2740 priv
->stats
.txviokint
++;
2741 priv
->rtllib
->LinkDetectInfo
.NumTxOkInPeriod
++;
2742 rtl8192_tx_isr(dev
, VI_QUEUE
);
2745 if (inta
& IMR_VODOK
) {
2746 priv
->stats
.txvookint
++;
2747 RT_TRACE(COMP_INTR
, "Vo TX OK interrupt!\n");
2748 priv
->rtllib
->LinkDetectInfo
.NumTxOkInPeriod
++;
2749 rtl8192_tx_isr(dev
, VO_QUEUE
);
2752 spin_unlock_irqrestore(&priv
->irq_th_lock
, flags
);
2761 /****************************************************************************
2762 ---------------------------- PCI_STUFF---------------------------
2763 *****************************************************************************/
2764 static const struct net_device_ops rtl8192_netdev_ops
= {
2765 .ndo_open
= rtl8192_open
,
2766 .ndo_stop
= rtl8192_close
,
2767 .ndo_tx_timeout
= rtl8192_tx_timeout
,
2768 .ndo_do_ioctl
= rtl8192_ioctl
,
2769 .ndo_set_rx_mode
= r8192_set_multicast
,
2770 .ndo_set_mac_address
= r8192_set_mac_adr
,
2771 .ndo_validate_addr
= eth_validate_addr
,
2772 .ndo_change_mtu
= eth_change_mtu
,
2773 .ndo_start_xmit
= rtllib_xmit
,
2776 static int rtl8192_pci_probe(struct pci_dev
*pdev
,
2777 const struct pci_device_id
*id
)
2779 unsigned long ioaddr
= 0;
2780 struct net_device
*dev
= NULL
;
2781 struct r8192_priv
*priv
= NULL
;
2782 struct rtl819x_ops
*ops
= (struct rtl819x_ops
*)(id
->driver_data
);
2783 unsigned long pmem_start
, pmem_len
, pmem_flags
;
2785 bool bdma64
= false;
2788 RT_TRACE(COMP_INIT
, "Configuring chip resources");
2790 if (pci_enable_device(pdev
)) {
2791 dev_err(&pdev
->dev
, "Failed to enable PCI device");
2795 pci_set_master(pdev
);
2797 if (!pci_set_dma_mask(pdev
, DMA_BIT_MASK(32))) {
2798 if (pci_set_consistent_dma_mask(pdev
, DMA_BIT_MASK(32))) {
2799 dev_info(&pdev
->dev
,
2800 "Unable to obtain 32bit DMA for consistent allocations\n");
2801 goto err_pci_disable
;
2804 dev
= alloc_rtllib(sizeof(struct r8192_priv
));
2806 goto err_pci_disable
;
2810 dev
->features
|= NETIF_F_HIGHDMA
;
2812 pci_set_drvdata(pdev
, dev
);
2813 SET_NETDEV_DEV(dev
, &pdev
->dev
);
2814 priv
= rtllib_priv(dev
);
2815 priv
->rtllib
= (struct rtllib_device
*)netdev_priv_rsl(dev
);
2817 priv
->rtllib
->pdev
= pdev
;
2818 if ((pdev
->subsystem_vendor
== PCI_VENDOR_ID_DLINK
) &&
2819 (pdev
->subsystem_device
== 0x3304))
2820 priv
->rtllib
->bSupportRemoteWakeUp
= 1;
2822 priv
->rtllib
->bSupportRemoteWakeUp
= 0;
2824 pmem_start
= pci_resource_start(pdev
, 1);
2825 pmem_len
= pci_resource_len(pdev
, 1);
2826 pmem_flags
= pci_resource_flags(pdev
, 1);
2828 if (!(pmem_flags
& IORESOURCE_MEM
)) {
2829 netdev_err(dev
, "region #1 not a MMIO resource, aborting");
2830 goto err_rel_rtllib
;
2833 dev_info(&pdev
->dev
, "Memory mapped space start: 0x%08lx\n",
2835 if (!request_mem_region(pmem_start
, pmem_len
, DRV_NAME
)) {
2836 netdev_err(dev
, "request_mem_region failed!");
2837 goto err_rel_rtllib
;
2841 ioaddr
= (unsigned long)ioremap_nocache(pmem_start
, pmem_len
);
2842 if (ioaddr
== (unsigned long)NULL
) {
2843 netdev_err(dev
, "ioremap failed!");
2847 dev
->mem_start
= ioaddr
;
2848 dev
->mem_end
= ioaddr
+ pci_resource_len(pdev
, 0);
2850 pci_read_config_byte(pdev
, 0x08, &revision_id
);
2851 /* If the revisionid is 0x10, the device uses rtl8192se. */
2852 if (pdev
->device
== 0x8192 && revision_id
== 0x10)
2857 if (rtl8192_pci_findadapter(pdev
, dev
) == false)
2860 dev
->irq
= pdev
->irq
;
2863 dev
->netdev_ops
= &rtl8192_netdev_ops
;
2865 dev
->wireless_handlers
= &r8192_wx_handlers_def
;
2866 dev
->ethtool_ops
= &rtl819x_ethtool_ops
;
2868 dev
->type
= ARPHRD_ETHER
;
2869 dev
->watchdog_timeo
= HZ
* 3;
2871 if (dev_alloc_name(dev
, ifname
) < 0) {
2873 "Oops: devname already taken! Trying wlan%%d...\n");
2874 dev_alloc_name(dev
, ifname
);
2877 RT_TRACE(COMP_INIT
, "Driver probe completed1\n");
2878 if (rtl8192_init(dev
) != 0) {
2879 netdev_warn(dev
, "Initialization failed");
2883 netif_carrier_off(dev
);
2884 netif_stop_queue(dev
);
2886 if (register_netdev(dev
))
2888 RT_TRACE(COMP_INIT
, "dev name: %s\n", dev
->name
);
2890 if (priv
->polling_timer_on
== 0)
2891 check_rfctrl_gpio_timer((unsigned long)dev
);
2893 RT_TRACE(COMP_INIT
, "Driver probe completed\n");
2897 free_irq(dev
->irq
, dev
);
2900 release_mem_region(pmem_start
, pmem_len
);
2904 DMESG("wlan driver load failed\n");
2906 pci_disable_device(pdev
);
2910 static void rtl8192_pci_disconnect(struct pci_dev
*pdev
)
2912 struct net_device
*dev
= pci_get_drvdata(pdev
);
2913 struct r8192_priv
*priv
;
2917 unregister_netdev(dev
);
2919 priv
= rtllib_priv(dev
);
2921 del_timer_sync(&priv
->gpio_polling_timer
);
2922 cancel_delayed_work(&priv
->gpio_change_rf_wq
);
2923 priv
->polling_timer_on
= 0;
2924 rtl8192_down(dev
, true);
2926 if (priv
->pFirmware
) {
2927 vfree(priv
->pFirmware
);
2928 priv
->pFirmware
= NULL
;
2930 destroy_workqueue(priv
->priv_wq
);
2931 rtl8192_free_rx_ring(dev
);
2932 for (i
= 0; i
< MAX_TX_QUEUE_COUNT
; i
++)
2933 rtl8192_free_tx_ring(dev
, i
);
2936 dev_info(&pdev
->dev
, "Freeing irq %d\n", dev
->irq
);
2937 free_irq(dev
->irq
, dev
);
2942 if (dev
->mem_start
!= 0) {
2943 iounmap((void __iomem
*)dev
->mem_start
);
2944 release_mem_region(pci_resource_start(pdev
, 1),
2945 pci_resource_len(pdev
, 1));
2948 priv
= rtllib_priv(dev
);
2951 pci_disable_device(pdev
);
2952 RT_TRACE(COMP_DOWN
, "wlan driver removed\n");
2955 bool NicIFEnableNIC(struct net_device
*dev
)
2957 bool init_status
= true;
2958 struct r8192_priv
*priv
= rtllib_priv(dev
);
2959 struct rt_pwr_save_ctrl
*pPSC
= (struct rt_pwr_save_ctrl
*)
2960 (&(priv
->rtllib
->PowerSaveControl
));
2963 netdev_warn(dev
, "%s(): Driver is already down!\n", __func__
);
2964 priv
->bdisable_nic
= false;
2968 RT_TRACE(COMP_PS
, "===========>%s()\n", __func__
);
2969 priv
->bfirst_init
= true;
2970 init_status
= priv
->ops
->initialize_adapter(dev
);
2972 netdev_warn(dev
, "%s(): Initialization failed!\n", __func__
);
2973 priv
->bdisable_nic
= false;
2976 RT_TRACE(COMP_INIT
, "start adapter finished\n");
2977 RT_CLEAR_PS_LEVEL(pPSC
, RT_RF_OFF_LEVL_HALT_NIC
);
2978 priv
->bfirst_init
= false;
2980 rtl8192_irq_enable(dev
);
2981 priv
->bdisable_nic
= false;
2982 RT_TRACE(COMP_PS
, "<===========%s()\n", __func__
);
2985 bool NicIFDisableNIC(struct net_device
*dev
)
2987 struct r8192_priv
*priv
= rtllib_priv(dev
);
2990 RT_TRACE(COMP_PS
, "=========>%s()\n", __func__
);
2991 priv
->bdisable_nic
= true;
2992 tmp_state
= priv
->rtllib
->state
;
2993 rtllib_softmac_stop_protocol(priv
->rtllib
, 0, false);
2994 priv
->rtllib
->state
= tmp_state
;
2995 rtl8192_cancel_deferred_work(priv
);
2996 rtl8192_irq_disable(dev
);
2998 priv
->ops
->stop_adapter(dev
, false);
2999 RT_TRACE(COMP_PS
, "<=========%s()\n", __func__
);
3004 static int __init
rtl8192_pci_module_init(void)
3006 pr_info("\nLinux kernel driver for RTL8192E WLAN cards\n");
3007 pr_info("Copyright (c) 2007-2008, Realsil Wlan Driver\n");
3009 if (0 != pci_register_driver(&rtl8192_pci_driver
)) {
3010 DMESG("No device found");
3011 /*pci_unregister_driver (&rtl8192_pci_driver);*/
3017 static void __exit
rtl8192_pci_module_exit(void)
3019 pci_unregister_driver(&rtl8192_pci_driver
);
3021 RT_TRACE(COMP_DOWN
, "Exiting");
3024 void check_rfctrl_gpio_timer(unsigned long data
)
3026 struct r8192_priv
*priv
= rtllib_priv((struct net_device
*)data
);
3028 priv
->polling_timer_on
= 1;
3030 queue_delayed_work_rsl(priv
->priv_wq
, &priv
->gpio_change_rf_wq
, 0);
3032 mod_timer(&priv
->gpio_polling_timer
, jiffies
+
3033 msecs_to_jiffies(RTLLIB_WATCH_DOG_TIME
));
3036 /***************************************************************************
3037 ------------------- module init / exit stubs ----------------
3038 ****************************************************************************/
3039 module_init(rtl8192_pci_module_init
);
3040 module_exit(rtl8192_pci_module_exit
);
3042 MODULE_DESCRIPTION("Linux driver for Realtek RTL819x WiFi cards");
3043 MODULE_AUTHOR(DRV_COPYRIGHT
" " DRV_AUTHOR
);
3044 MODULE_VERSION(DRV_VERSION
);
3045 MODULE_LICENSE("GPL");
3046 MODULE_FIRMWARE(RTL8192E_BOOT_IMG_FW
);
3047 MODULE_FIRMWARE(RTL8192E_MAIN_IMG_FW
);
3048 MODULE_FIRMWARE(RTL8192E_DATA_IMG_FW
);
3050 module_param(ifname
, charp
, S_IRUGO
|S_IWUSR
);
3051 module_param(hwwep
, int, S_IRUGO
|S_IWUSR
);
3052 module_param(channels
, int, S_IRUGO
|S_IWUSR
);
3054 MODULE_PARM_DESC(ifname
, " Net interface name, wlan%d=default");
3055 MODULE_PARM_DESC(hwwep
, " Try to use hardware WEP support(default use hw. set 0 to use software security)");
3056 MODULE_PARM_DESC(channels
, " Channel bitmask for specific locales. NYI");