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