Loading drivers/staging/rtl8187se/r8180_core.c +122 −183 Original line number Diff line number Diff line Loading @@ -41,13 +41,6 @@ #include "ieee80211/dot11d.h" #ifndef PCI_VENDOR_ID_BELKIN #define PCI_VENDOR_ID_BELKIN 0x1799 #endif #ifndef PCI_VENDOR_ID_DLINK #define PCI_VENDOR_ID_DLINK 0x1186 #endif static struct pci_device_id rtl8180_pci_id_tbl[] __devinitdata = { { .vendor = PCI_VENDOR_ID_REALTEK, Loading Loading @@ -1421,11 +1414,9 @@ u16 N_DBPSOfRate(u16 DataRate) return N_DBPS; } //{by amy 080312 // // Description: // For Netgear case, they want good-looking singal strength. // 2004.12.05, by rcnjko. // long NetgearSignalStrengthTranslate(long LastSS, long CurrSS) { Loading Loading @@ -1481,7 +1472,6 @@ long TranslateToDbm8185(u8 SignalStrengthIndex) // This is different with PerformSignalSmoothing8185 in smoothing fomula. // No dramatic adjustion is apply because dynamic mechanism need some degree // of correctness. Ported from 8187B. // 2007-02-26, by Bruce. // void PerformUndecoratedSignalSmoothing8185(struct r8180_priv *priv, bool bCckRate) Loading @@ -1502,7 +1492,6 @@ void PerformUndecoratedSignalSmoothing8185(struct r8180_priv *priv, priv->CurCCKRSSI = 0; } //by amy 080312} /* This is rough RX isr handling routine*/ void rtl8180_rx(struct net_device *dev) Loading Loading @@ -1638,7 +1627,7 @@ void rtl8180_rx(struct net_device *dev) } signal=(unsigned char)(((*(priv->rxringtail+3))& (0x00ff0000))>>16); signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 signal = (signal & 0xfe) >> 1; quality=(unsigned char)((*(priv->rxringtail+3)) & (0xff)); Loading @@ -1652,7 +1641,6 @@ void rtl8180_rx(struct net_device *dev) stats.rate = rtl8180_rate2rate(rate); Antenna = (((*(priv->rxringtail +3))& (0x00008000)) == 0 )? 0:1 ; //by amy for antenna if(!rtl8180_IsWirelessBMode(stats.rate)) { // OFDM rate. Loading Loading @@ -1691,11 +1679,10 @@ void rtl8180_rx(struct net_device *dev) RXAGC=(95-RXAGC)*100/65; } priv->SignalStrength = (u8)RXAGC; priv->RecvSignalPower = RxAGC_dBm ; // It can use directly by SD3 CMLin priv->RecvSignalPower = RxAGC_dBm; priv->RxPower = rxpower; priv->RSSI = RSSI; //{by amy 080312 // SQ translation formular is provided by SD3 DZ. 2006.06.27, by rcnjko. /* SQ translation formula is provided by SD3 DZ. 2006.06.27 */ if(quality >= 127) quality = 1;//0; //0 will cause epc to show signal zero , walk aroud now; else if(quality < 27) Loading @@ -1712,7 +1699,6 @@ void rtl8180_rx(struct net_device *dev) // printk("==========================>rx : RXAGC is %d,signalstrength is %d\n",RXAGC,stats.signalstrength); stats.rssi = priv->wstats.qual.qual = priv->SignalQuality; stats.noise = priv->wstats.qual.noise = 100 - priv ->wstats.qual.qual; //by amy 080312} bHwError = (((*(priv->rxringtail))& (0x00000fff)) == 4080)| (((*(priv->rxringtail))& (0x04000000)) != 0 ) | (((*(priv->rxringtail))& (0x08000000)) != 0 )| (((~(*(priv->rxringtail)))& (0x10000000)) != 0 )| (((~(*(priv->rxringtail)))& (0x20000000)) != 0 ); bCRC = ((*(priv->rxringtail)) & (0x00002000)) >> 13; Loading @@ -1725,11 +1711,12 @@ void rtl8180_rx(struct net_device *dev) (eqMacAddr(priv->ieee80211->current_network.bssid, (fc & IEEE80211_FCTL_TODS)? hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS )? hdr->addr2 : hdr->addr3)) && (!bHwError) && (!bCRC)&& (!bICV)) { //by amy 080312 // Perform signal smoothing for dynamic mechanism on demand. // This is different with PerformSignalSmoothing8185 in smoothing fomula. // No dramatic adjustion is apply because dynamic mechanism need some degree // of correctness. 2007.01.23, by shien chang. /* Perform signal smoothing for dynamic * mechanism on demand. This is different * with PerformSignalSmoothing8185 in smoothing * fomula. No dramatic adjustion is apply * because dynamic mechanism need some degree * of correctness. */ PerformUndecoratedSignalSmoothing8185(priv,bCckRate); // // For good-looking singal strength. Loading @@ -1749,12 +1736,9 @@ void rtl8180_rx(struct net_device *dev) // Figure out which antenna that received the lasted packet. priv->LastRxPktAntenna = Antenna ? 1 : 0; // 0: aux, 1: main. //by amy 080312 SwAntennaDiversityRxOk8185(dev, priv->SignalStrength); } //by amy for antenna #ifndef DUMMY_RX if(first){ if(!priv->rx_skb_complete){ /* seems that HW sometimes fails to reiceve and Loading Loading @@ -1810,19 +1794,12 @@ void rtl8180_rx(struct net_device *dev) if(last && !priv->rx_skb_complete){ if(priv->rx_skb->len > 4) skb_trim(priv->rx_skb,priv->rx_skb->len-4); #ifndef RX_DONT_PASS_UL if(!ieee80211_rtl_rx(priv->ieee80211, priv->rx_skb, &stats)){ #endif // RX_DONT_PASS_UL priv->rx_skb, &stats)) dev_kfree_skb_any(priv->rx_skb); #ifndef RX_DONT_PASS_UL } #endif priv->rx_skb_complete=1; } #endif //DUMMY_RX pci_dma_sync_single_for_device(priv->pdev, priv->rxbuffer->dma, priv->rxbuffersize * \ Loading Loading @@ -2056,7 +2033,7 @@ short rtl8180_tx(struct net_device *dev, u8* txbuf, int len, int priority, u16 RtsDur = 0; u16 ThisFrameTime = 0; u16 TxDescDuration = 0; u8 ownbit_flag = false; //added by david woo for sync Tx, 2007.12.14 u8 ownbit_flag = false; switch(priority) { case MANAGE_PRIORITY: Loading Loading @@ -2123,7 +2100,8 @@ short rtl8180_tx(struct net_device *dev, u8* txbuf, int len, int priority, //YJ,add,080828,for Keep alive priv->NumTxUnicast++; // Figure out ACK rate according to BSS basic rate and Tx rate, 2006.03.08 by rcnjko. /* Figure out ACK rate according to BSS basic rate * and Tx rate. */ AckTime = ComputeTxTime(14, 10,0, 0); // AckCTSLng = 14 use 1M bps send if ( ((len + sCrcLng) > priv->rts) && priv->rts ) Loading Loading @@ -2206,7 +2184,7 @@ short rtl8180_tx(struct net_device *dev, u8* txbuf, int len, int priority, *tail |= (1<<15); /* no encrypt */ if(remain==len && !descfrag) { ownbit_flag = false; //added by david woo,2007.12.14 ownbit_flag = false; *tail = *tail| (1<<29) ; //fist segment of the packet *tail = *tail |(len); } else { Loading Loading @@ -2556,27 +2534,16 @@ void watch_dog_adaptive(unsigned long data) } // Tx High Power Mechanism. #ifdef HIGH_POWER if(CheckHighPower((struct net_device *)data)) { queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->tx_pw_wq); } #endif // Tx Power Tracking on 87SE. #ifdef TX_TRACK //if( priv->bTxPowerTrack ) //lzm mod 080826 if (CheckTxPwrTracking((struct net_device *)data)) TxPwrTracking87SE((struct net_device *)data); #endif // Perform DIG immediately. #ifdef SW_DIG if(CheckDig((struct net_device *)data) == true) { queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->hw_dig_wq); } #endif rtl8180_watch_dog((struct net_device *)data); queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->GPIOChangeRFWorkItem); Loading Loading @@ -2747,10 +2714,8 @@ short rtl8180_init(struct net_device *dev) priv->TxPollingTimes = 0;//lzm add 080826 priv->bLeisurePs = true; priv->dot11PowerSaveMode = eActive; //by amy for antenna priv->AdMinCheckPeriod = 5; priv->AdMaxCheckPeriod = 10; // Lower signal strength threshold to fit the HW participation in antenna diversity. +by amy 080312 priv->AdMaxRxSsThreshold = 30;//60->30 priv->AdRxSsThreshold = 20;//50->20 priv->AdCheckPeriod = priv->AdMinCheckPeriod; Loading @@ -2765,8 +2730,6 @@ short rtl8180_init(struct net_device *dev) init_timer(&priv->SwAntennaDiversityTimer); priv->SwAntennaDiversityTimer.data = (unsigned long)dev; priv->SwAntennaDiversityTimer.function = (void *)SwAntennaDiversityTimerCallback; //by amy for antenna //{by amy 080312 priv->bDigMechanism = 1; priv->InitialGain = 6; priv->bXtalCalibration = false; Loading Loading @@ -2833,15 +2796,20 @@ short rtl8180_init(struct net_device *dev) sema_init(&priv->rf_state, 1); INIT_WORK(&priv->reset_wq, (void *)rtl8180_restart_wq); INIT_WORK(&priv->tx_irq_wq, (void *)rtl8180_tx_irq_wq); INIT_DELAYED_WORK(&priv->ieee80211->hw_wakeup_wq,(void*) rtl8180_hw_wakeup_wq); INIT_DELAYED_WORK(&priv->ieee80211->hw_sleep_wq,(void*) rtl8180_hw_sleep_wq); INIT_WORK(&priv->ieee80211->wmm_param_update_wq,(void*) rtl8180_wmm_param_update); INIT_DELAYED_WORK(&priv->ieee80211->rate_adapter_wq,(void*)rtl8180_rate_adapter);//+by amy 080312 INIT_DELAYED_WORK(&priv->ieee80211->hw_dig_wq,(void*)rtl8180_hw_dig_wq);//+by amy 080312 INIT_DELAYED_WORK(&priv->ieee80211->tx_pw_wq,(void*)rtl8180_tx_pw_wq);//+by amy 080312 INIT_DELAYED_WORK(&priv->ieee80211->GPIOChangeRFWorkItem,(void*) GPIOChangeRFWorkItemCallBack); INIT_DELAYED_WORK(&priv->ieee80211->hw_wakeup_wq, (void *)rtl8180_hw_wakeup_wq); INIT_DELAYED_WORK(&priv->ieee80211->hw_sleep_wq, (void *)rtl8180_hw_sleep_wq); INIT_WORK(&priv->ieee80211->wmm_param_update_wq, (void *)rtl8180_wmm_param_update); INIT_DELAYED_WORK(&priv->ieee80211->rate_adapter_wq, (void *)rtl8180_rate_adapter); INIT_DELAYED_WORK(&priv->ieee80211->hw_dig_wq, (void *)rtl8180_hw_dig_wq); INIT_DELAYED_WORK(&priv->ieee80211->tx_pw_wq, (void *)rtl8180_tx_pw_wq); INIT_DELAYED_WORK(&priv->ieee80211->GPIOChangeRFWorkItem, (void *) GPIOChangeRFWorkItemCallBack); tasklet_init(&priv->irq_rx_tasklet, (void(*)(unsigned long)) rtl8180_irq_rx_tasklet, (unsigned long)priv); Loading Loading @@ -2877,20 +2845,18 @@ short rtl8180_init(struct net_device *dev) priv->CSMethod = (0x01 << 29); priv->TransmitConfig = 1<<TCR_DurProcMode_OFFSET | //for RTL8185B, duration setting by HW (7<<TCR_MXDMA_OFFSET) | // Max DMA Burst Size per Tx DMA Burst, 7: reservied. (priv->ShortRetryLimit<<TCR_SRL_OFFSET) | // Short retry limit (priv->LongRetryLimit<<TCR_LRL_OFFSET) | // Long retry limit (0 ? TCR_SAT : 0); // FALSE: HW provies PLCP length and LENGEXT, TURE: SW proiveds them priv->ReceiveConfig = RCR_AMF | RCR_ADF | //accept management/data RCR_ACF | //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko. RCR_AB | RCR_AM | RCR_APM | //accept BC/MC/UC (7<<RCR_MXDMA_OFFSET) | // Max DMA Burst Size per Rx DMA Burst, 7: unlimited. (priv->EarlyRxThreshold<<RCR_FIFO_OFFSET) | // Rx FIFO Threshold, 7: No Rx threshold. (priv->EarlyRxThreshold == 7 ? RCR_ONLYERLPKT:0); priv->TransmitConfig = TCR_DurProcMode_OFFSET | (7<<TCR_MXDMA_OFFSET) | (priv->ShortRetryLimit<<TCR_SRL_OFFSET) | (priv->LongRetryLimit<<TCR_LRL_OFFSET) | (0 ? TCR_SAT : 0); priv->ReceiveConfig = RCR_AMF | RCR_ADF | RCR_ACF | RCR_AB | RCR_AM | RCR_APM | (7<<RCR_MXDMA_OFFSET) | (priv->EarlyRxThreshold<<RCR_FIFO_OFFSET) | (priv->EarlyRxThreshold == 7 ? RCR_ONLYERLPKT : 0); priv->IntrMask = IMR_TMGDOK | IMR_TBDER | IMR_THPDER | IMR_THPDER | IMR_THPDOK | Loading @@ -2898,9 +2864,9 @@ short rtl8180_init(struct net_device *dev) IMR_TVIDER | IMR_TVIDOK | IMR_TBEDER | IMR_TBEDOK | IMR_TBKDER | IMR_TBKDOK | IMR_RDU | // To handle the defragmentation not enough Rx descriptors case. Annie, 2006-03-27. IMR_RDU | IMR_RER | IMR_ROK | IMR_RQoSOK; // <NOTE> ROK and RQoSOK are mutually exclusive, so, we must handle RQoSOK interrupt to receive QoS frames, 2005.12.09, by rcnjko. IMR_RQoSOK; priv->InitialGain = 6; Loading Loading @@ -2971,19 +2937,16 @@ short rtl8180_init(struct net_device *dev) priv->chtxpwr_ofdm[i+1] = (word & 0xff00) >> 8; } //3Read crystal calibtration and thermal meter indication on 87SE. // By SD3 SY's request. Added by Roger, 2007.12.11. /* 3Read crystal calibtration and thermal meter indication on 87SE. */ tmpu16 = eprom_read(dev, EEPROM_RSV >> 1); // Crystal calibration for Xin and Xout resp. priv->XtalCal_Xout = tmpu16 & EEPROM_XTAL_CAL_XOUT_MASK; // 0~7.5pF priv->XtalCal_Xin = (tmpu16 & EEPROM_XTAL_CAL_XIN_MASK)>>4; // 0~7.5pF /* Crystal calibration for Xin and Xout resp. */ priv->XtalCal_Xout = tmpu16 & EEPROM_XTAL_CAL_XOUT_MASK; priv->XtalCal_Xin = (tmpu16 & EEPROM_XTAL_CAL_XIN_MASK) >> 4; if ((tmpu16 & EEPROM_XTAL_CAL_ENABLE) >> 12) priv->bXtalCalibration = true; // Thermal meter reference indication. /* Thermal meter reference indication. */ priv->ThermalMeter = (u8)((tmpu16 & EEPROM_THERMAL_METER_MASK) >> 8); if ((tmpu16 & EEPROM_THERMAL_METER_ENABLE) >> 13) priv->bTxPowerTrack = true; Loading @@ -3010,7 +2973,6 @@ short rtl8180_init(struct net_device *dev) priv->rf_set_chan = rtl8225z2_rf_set_chan; priv->rf_set_sens = NULL; if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) return -ENOMEM; Loading Loading @@ -3042,11 +3004,7 @@ short rtl8180_init(struct net_device *dev) TX_BEACON_RING_ADDR)) return -ENOMEM; #if !defined(SA_SHIRQ) if(request_irq(dev->irq, (void *)rtl8180_interrupt, IRQF_SHARED, dev->name, dev)){ #else if(request_irq(dev->irq, (void *)rtl8180_interrupt, SA_SHIRQ, dev->name, dev)){ #endif DMESGE("Error allocating IRQ %d",dev->irq); return -1; }else{ Loading Loading @@ -3335,7 +3293,6 @@ static struct net_device_stats *rtl8180_stats(struct net_device *dev) } // // Change current and default preamble mode. // 2005.01.06, by rcnjko. // bool MgntActSet_802_11_PowerSaveMode( Loading Loading @@ -3454,7 +3411,6 @@ void rtl8180_watch_dog(struct net_device *dev) MgntLinkKeepAlive(priv); //YJ,add,080828,for LPS #ifdef ENABLE_LPS if (priv->PowerProfile == POWER_PROFILE_BATTERY) priv->bLeisurePs = true; else if (priv->PowerProfile == POWER_PROFILE_AC) { Loading @@ -3464,7 +3420,6 @@ void rtl8180_watch_dog(struct net_device *dev) if(priv->ieee80211->state == IEEE80211_LINKED){ priv->link_detect.NumRxOkInPeriod = priv->ieee80211->NumRxDataInPeriod; //printk("TxOk=%d RxOk=%d\n", priv->link_detect.NumTxOkInPeriod, priv->link_detect.NumRxOkInPeriod); if( priv->link_detect.NumRxOkInPeriod> 666 || priv->link_detect.NumTxOkInPeriod> 666 ) { bBusyTraffic = true; Loading @@ -3481,7 +3436,6 @@ void rtl8180_watch_dog(struct net_device *dev) LeisurePSLeave(priv); } else LeisurePSLeave(priv); #endif priv->link_detect.bBusyTraffic = bBusyTraffic; priv->link_detect.NumRxOkInPeriod = 0; priv->link_detect.NumTxOkInPeriod = 0; Loading @@ -3503,16 +3457,11 @@ int _rtl8180_up(struct net_device *dev) if(priv->ieee80211->iw_mode == IW_MODE_ADHOC) IPSLeave(dev); } #ifdef RATE_ADAPT timer_rate_adaptive((unsigned long)dev); #endif watch_dog_adaptive((unsigned long)dev); #ifdef SW_ANTE if(priv->bSwAntennaDiverity) SwAntennaDiversityTimerCallback(dev); #endif ieee80211_softmac_start_protocol(priv->ieee80211); return 0; } Loading Loading @@ -3748,7 +3697,7 @@ static int __devinit rtl8180_pci_probe(struct pci_dev *pdev, dev->wireless_handlers = &r8180_wx_handlers_def; dev->type=ARPHRD_ETHER; dev->watchdog_timeo = HZ*3; //added by david woo, 2007.12.13 dev->watchdog_timeo = HZ*3; if (dev_alloc_name(dev, ifname) < 0){ DMESG("Oops: devname already taken! Trying wlan%%d...\n"); Loading Loading @@ -4236,61 +4185,51 @@ void GPIOChangeRFWorkItemCallBack(struct work_struct *work) static char *envp[] = {"HOME=/", "TERM=linux", "PATH=/usr/bin:/bin", NULL}; static int readf_count = 0; #ifdef ENABLE_LPS if(readf_count % 10 == 0) priv->PowerProfile = read_acadapter_file("/proc/acpi/ac_adapter/AC0/state"); readf_count = (readf_count+1)%0xffff; #endif { // We should turn off LED before polling FF51[4]. /* We should turn off LED before polling FF51[4]. */ //Turn off LED. /* Turn off LED. */ btPSR = read_nic_byte(dev, PSR); write_nic_byte(dev, PSR, (btPSR & ~BIT3)); //It need to delay 4us suggested by Jong, 2008-01-16 /* It need to delay 4us suggested by Jong, 2008-01-16 */ udelay(4); //HW radio On/Off according to the value of FF51[4](config0) /* HW radio On/Off according to the value of FF51[4](config0) */ btConfig0 = btPSR = read_nic_byte(dev, CONFIG0); //Turn on LED. /* Turn on LED. */ write_nic_byte(dev, PSR, btPSR | BIT3); eRfPowerStateToSet = (btConfig0 & BIT4) ? eRfOn : eRfOff; if((priv->ieee80211->bHwRadioOff == true) && (eRfPowerStateToSet == eRfOn)) { if ((priv->ieee80211->bHwRadioOff == true) && (eRfPowerStateToSet == eRfOn)) { priv->ieee80211->bHwRadioOff = false; bActuallySet = true; } else if((priv->ieee80211->bHwRadioOff == false) && (eRfPowerStateToSet == eRfOff)) { } else if ((priv->ieee80211->bHwRadioOff == false) && (eRfPowerStateToSet == eRfOff)) { priv->ieee80211->bHwRadioOff = true; bActuallySet = true; } if(bActuallySet) { if (bActuallySet) { MgntActSet_RF_State(dev, eRfPowerStateToSet, RF_CHANGE_BY_HW); /* To update the UI status for Power status changed */ if (priv->ieee80211->bHwRadioOff == true) argv[1] = "RFOFF"; else{ //if(!priv->RfOffReason) else argv[1] = "RFON"; //else // argv[1] = "RFOFF"; } argv[0] = RadioPowerPath; argv[2] = NULL; call_usermodehelper(RadioPowerPath, argv, envp, 1); } } } static u8 read_acadapter_file(char *filename) { Loading Loading
drivers/staging/rtl8187se/r8180_core.c +122 −183 Original line number Diff line number Diff line Loading @@ -41,13 +41,6 @@ #include "ieee80211/dot11d.h" #ifndef PCI_VENDOR_ID_BELKIN #define PCI_VENDOR_ID_BELKIN 0x1799 #endif #ifndef PCI_VENDOR_ID_DLINK #define PCI_VENDOR_ID_DLINK 0x1186 #endif static struct pci_device_id rtl8180_pci_id_tbl[] __devinitdata = { { .vendor = PCI_VENDOR_ID_REALTEK, Loading Loading @@ -1421,11 +1414,9 @@ u16 N_DBPSOfRate(u16 DataRate) return N_DBPS; } //{by amy 080312 // // Description: // For Netgear case, they want good-looking singal strength. // 2004.12.05, by rcnjko. // long NetgearSignalStrengthTranslate(long LastSS, long CurrSS) { Loading Loading @@ -1481,7 +1472,6 @@ long TranslateToDbm8185(u8 SignalStrengthIndex) // This is different with PerformSignalSmoothing8185 in smoothing fomula. // No dramatic adjustion is apply because dynamic mechanism need some degree // of correctness. Ported from 8187B. // 2007-02-26, by Bruce. // void PerformUndecoratedSignalSmoothing8185(struct r8180_priv *priv, bool bCckRate) Loading @@ -1502,7 +1492,6 @@ void PerformUndecoratedSignalSmoothing8185(struct r8180_priv *priv, priv->CurCCKRSSI = 0; } //by amy 080312} /* This is rough RX isr handling routine*/ void rtl8180_rx(struct net_device *dev) Loading Loading @@ -1638,7 +1627,7 @@ void rtl8180_rx(struct net_device *dev) } signal=(unsigned char)(((*(priv->rxringtail+3))& (0x00ff0000))>>16); signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 signal = (signal & 0xfe) >> 1; quality=(unsigned char)((*(priv->rxringtail+3)) & (0xff)); Loading @@ -1652,7 +1641,6 @@ void rtl8180_rx(struct net_device *dev) stats.rate = rtl8180_rate2rate(rate); Antenna = (((*(priv->rxringtail +3))& (0x00008000)) == 0 )? 0:1 ; //by amy for antenna if(!rtl8180_IsWirelessBMode(stats.rate)) { // OFDM rate. Loading Loading @@ -1691,11 +1679,10 @@ void rtl8180_rx(struct net_device *dev) RXAGC=(95-RXAGC)*100/65; } priv->SignalStrength = (u8)RXAGC; priv->RecvSignalPower = RxAGC_dBm ; // It can use directly by SD3 CMLin priv->RecvSignalPower = RxAGC_dBm; priv->RxPower = rxpower; priv->RSSI = RSSI; //{by amy 080312 // SQ translation formular is provided by SD3 DZ. 2006.06.27, by rcnjko. /* SQ translation formula is provided by SD3 DZ. 2006.06.27 */ if(quality >= 127) quality = 1;//0; //0 will cause epc to show signal zero , walk aroud now; else if(quality < 27) Loading @@ -1712,7 +1699,6 @@ void rtl8180_rx(struct net_device *dev) // printk("==========================>rx : RXAGC is %d,signalstrength is %d\n",RXAGC,stats.signalstrength); stats.rssi = priv->wstats.qual.qual = priv->SignalQuality; stats.noise = priv->wstats.qual.noise = 100 - priv ->wstats.qual.qual; //by amy 080312} bHwError = (((*(priv->rxringtail))& (0x00000fff)) == 4080)| (((*(priv->rxringtail))& (0x04000000)) != 0 ) | (((*(priv->rxringtail))& (0x08000000)) != 0 )| (((~(*(priv->rxringtail)))& (0x10000000)) != 0 )| (((~(*(priv->rxringtail)))& (0x20000000)) != 0 ); bCRC = ((*(priv->rxringtail)) & (0x00002000)) >> 13; Loading @@ -1725,11 +1711,12 @@ void rtl8180_rx(struct net_device *dev) (eqMacAddr(priv->ieee80211->current_network.bssid, (fc & IEEE80211_FCTL_TODS)? hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS )? hdr->addr2 : hdr->addr3)) && (!bHwError) && (!bCRC)&& (!bICV)) { //by amy 080312 // Perform signal smoothing for dynamic mechanism on demand. // This is different with PerformSignalSmoothing8185 in smoothing fomula. // No dramatic adjustion is apply because dynamic mechanism need some degree // of correctness. 2007.01.23, by shien chang. /* Perform signal smoothing for dynamic * mechanism on demand. This is different * with PerformSignalSmoothing8185 in smoothing * fomula. No dramatic adjustion is apply * because dynamic mechanism need some degree * of correctness. */ PerformUndecoratedSignalSmoothing8185(priv,bCckRate); // // For good-looking singal strength. Loading @@ -1749,12 +1736,9 @@ void rtl8180_rx(struct net_device *dev) // Figure out which antenna that received the lasted packet. priv->LastRxPktAntenna = Antenna ? 1 : 0; // 0: aux, 1: main. //by amy 080312 SwAntennaDiversityRxOk8185(dev, priv->SignalStrength); } //by amy for antenna #ifndef DUMMY_RX if(first){ if(!priv->rx_skb_complete){ /* seems that HW sometimes fails to reiceve and Loading Loading @@ -1810,19 +1794,12 @@ void rtl8180_rx(struct net_device *dev) if(last && !priv->rx_skb_complete){ if(priv->rx_skb->len > 4) skb_trim(priv->rx_skb,priv->rx_skb->len-4); #ifndef RX_DONT_PASS_UL if(!ieee80211_rtl_rx(priv->ieee80211, priv->rx_skb, &stats)){ #endif // RX_DONT_PASS_UL priv->rx_skb, &stats)) dev_kfree_skb_any(priv->rx_skb); #ifndef RX_DONT_PASS_UL } #endif priv->rx_skb_complete=1; } #endif //DUMMY_RX pci_dma_sync_single_for_device(priv->pdev, priv->rxbuffer->dma, priv->rxbuffersize * \ Loading Loading @@ -2056,7 +2033,7 @@ short rtl8180_tx(struct net_device *dev, u8* txbuf, int len, int priority, u16 RtsDur = 0; u16 ThisFrameTime = 0; u16 TxDescDuration = 0; u8 ownbit_flag = false; //added by david woo for sync Tx, 2007.12.14 u8 ownbit_flag = false; switch(priority) { case MANAGE_PRIORITY: Loading Loading @@ -2123,7 +2100,8 @@ short rtl8180_tx(struct net_device *dev, u8* txbuf, int len, int priority, //YJ,add,080828,for Keep alive priv->NumTxUnicast++; // Figure out ACK rate according to BSS basic rate and Tx rate, 2006.03.08 by rcnjko. /* Figure out ACK rate according to BSS basic rate * and Tx rate. */ AckTime = ComputeTxTime(14, 10,0, 0); // AckCTSLng = 14 use 1M bps send if ( ((len + sCrcLng) > priv->rts) && priv->rts ) Loading Loading @@ -2206,7 +2184,7 @@ short rtl8180_tx(struct net_device *dev, u8* txbuf, int len, int priority, *tail |= (1<<15); /* no encrypt */ if(remain==len && !descfrag) { ownbit_flag = false; //added by david woo,2007.12.14 ownbit_flag = false; *tail = *tail| (1<<29) ; //fist segment of the packet *tail = *tail |(len); } else { Loading Loading @@ -2556,27 +2534,16 @@ void watch_dog_adaptive(unsigned long data) } // Tx High Power Mechanism. #ifdef HIGH_POWER if(CheckHighPower((struct net_device *)data)) { queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->tx_pw_wq); } #endif // Tx Power Tracking on 87SE. #ifdef TX_TRACK //if( priv->bTxPowerTrack ) //lzm mod 080826 if (CheckTxPwrTracking((struct net_device *)data)) TxPwrTracking87SE((struct net_device *)data); #endif // Perform DIG immediately. #ifdef SW_DIG if(CheckDig((struct net_device *)data) == true) { queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->hw_dig_wq); } #endif rtl8180_watch_dog((struct net_device *)data); queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->GPIOChangeRFWorkItem); Loading Loading @@ -2747,10 +2714,8 @@ short rtl8180_init(struct net_device *dev) priv->TxPollingTimes = 0;//lzm add 080826 priv->bLeisurePs = true; priv->dot11PowerSaveMode = eActive; //by amy for antenna priv->AdMinCheckPeriod = 5; priv->AdMaxCheckPeriod = 10; // Lower signal strength threshold to fit the HW participation in antenna diversity. +by amy 080312 priv->AdMaxRxSsThreshold = 30;//60->30 priv->AdRxSsThreshold = 20;//50->20 priv->AdCheckPeriod = priv->AdMinCheckPeriod; Loading @@ -2765,8 +2730,6 @@ short rtl8180_init(struct net_device *dev) init_timer(&priv->SwAntennaDiversityTimer); priv->SwAntennaDiversityTimer.data = (unsigned long)dev; priv->SwAntennaDiversityTimer.function = (void *)SwAntennaDiversityTimerCallback; //by amy for antenna //{by amy 080312 priv->bDigMechanism = 1; priv->InitialGain = 6; priv->bXtalCalibration = false; Loading Loading @@ -2833,15 +2796,20 @@ short rtl8180_init(struct net_device *dev) sema_init(&priv->rf_state, 1); INIT_WORK(&priv->reset_wq, (void *)rtl8180_restart_wq); INIT_WORK(&priv->tx_irq_wq, (void *)rtl8180_tx_irq_wq); INIT_DELAYED_WORK(&priv->ieee80211->hw_wakeup_wq,(void*) rtl8180_hw_wakeup_wq); INIT_DELAYED_WORK(&priv->ieee80211->hw_sleep_wq,(void*) rtl8180_hw_sleep_wq); INIT_WORK(&priv->ieee80211->wmm_param_update_wq,(void*) rtl8180_wmm_param_update); INIT_DELAYED_WORK(&priv->ieee80211->rate_adapter_wq,(void*)rtl8180_rate_adapter);//+by amy 080312 INIT_DELAYED_WORK(&priv->ieee80211->hw_dig_wq,(void*)rtl8180_hw_dig_wq);//+by amy 080312 INIT_DELAYED_WORK(&priv->ieee80211->tx_pw_wq,(void*)rtl8180_tx_pw_wq);//+by amy 080312 INIT_DELAYED_WORK(&priv->ieee80211->GPIOChangeRFWorkItem,(void*) GPIOChangeRFWorkItemCallBack); INIT_DELAYED_WORK(&priv->ieee80211->hw_wakeup_wq, (void *)rtl8180_hw_wakeup_wq); INIT_DELAYED_WORK(&priv->ieee80211->hw_sleep_wq, (void *)rtl8180_hw_sleep_wq); INIT_WORK(&priv->ieee80211->wmm_param_update_wq, (void *)rtl8180_wmm_param_update); INIT_DELAYED_WORK(&priv->ieee80211->rate_adapter_wq, (void *)rtl8180_rate_adapter); INIT_DELAYED_WORK(&priv->ieee80211->hw_dig_wq, (void *)rtl8180_hw_dig_wq); INIT_DELAYED_WORK(&priv->ieee80211->tx_pw_wq, (void *)rtl8180_tx_pw_wq); INIT_DELAYED_WORK(&priv->ieee80211->GPIOChangeRFWorkItem, (void *) GPIOChangeRFWorkItemCallBack); tasklet_init(&priv->irq_rx_tasklet, (void(*)(unsigned long)) rtl8180_irq_rx_tasklet, (unsigned long)priv); Loading Loading @@ -2877,20 +2845,18 @@ short rtl8180_init(struct net_device *dev) priv->CSMethod = (0x01 << 29); priv->TransmitConfig = 1<<TCR_DurProcMode_OFFSET | //for RTL8185B, duration setting by HW (7<<TCR_MXDMA_OFFSET) | // Max DMA Burst Size per Tx DMA Burst, 7: reservied. (priv->ShortRetryLimit<<TCR_SRL_OFFSET) | // Short retry limit (priv->LongRetryLimit<<TCR_LRL_OFFSET) | // Long retry limit (0 ? TCR_SAT : 0); // FALSE: HW provies PLCP length and LENGEXT, TURE: SW proiveds them priv->ReceiveConfig = RCR_AMF | RCR_ADF | //accept management/data RCR_ACF | //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko. RCR_AB | RCR_AM | RCR_APM | //accept BC/MC/UC (7<<RCR_MXDMA_OFFSET) | // Max DMA Burst Size per Rx DMA Burst, 7: unlimited. (priv->EarlyRxThreshold<<RCR_FIFO_OFFSET) | // Rx FIFO Threshold, 7: No Rx threshold. (priv->EarlyRxThreshold == 7 ? RCR_ONLYERLPKT:0); priv->TransmitConfig = TCR_DurProcMode_OFFSET | (7<<TCR_MXDMA_OFFSET) | (priv->ShortRetryLimit<<TCR_SRL_OFFSET) | (priv->LongRetryLimit<<TCR_LRL_OFFSET) | (0 ? TCR_SAT : 0); priv->ReceiveConfig = RCR_AMF | RCR_ADF | RCR_ACF | RCR_AB | RCR_AM | RCR_APM | (7<<RCR_MXDMA_OFFSET) | (priv->EarlyRxThreshold<<RCR_FIFO_OFFSET) | (priv->EarlyRxThreshold == 7 ? RCR_ONLYERLPKT : 0); priv->IntrMask = IMR_TMGDOK | IMR_TBDER | IMR_THPDER | IMR_THPDER | IMR_THPDOK | Loading @@ -2898,9 +2864,9 @@ short rtl8180_init(struct net_device *dev) IMR_TVIDER | IMR_TVIDOK | IMR_TBEDER | IMR_TBEDOK | IMR_TBKDER | IMR_TBKDOK | IMR_RDU | // To handle the defragmentation not enough Rx descriptors case. Annie, 2006-03-27. IMR_RDU | IMR_RER | IMR_ROK | IMR_RQoSOK; // <NOTE> ROK and RQoSOK are mutually exclusive, so, we must handle RQoSOK interrupt to receive QoS frames, 2005.12.09, by rcnjko. IMR_RQoSOK; priv->InitialGain = 6; Loading Loading @@ -2971,19 +2937,16 @@ short rtl8180_init(struct net_device *dev) priv->chtxpwr_ofdm[i+1] = (word & 0xff00) >> 8; } //3Read crystal calibtration and thermal meter indication on 87SE. // By SD3 SY's request. Added by Roger, 2007.12.11. /* 3Read crystal calibtration and thermal meter indication on 87SE. */ tmpu16 = eprom_read(dev, EEPROM_RSV >> 1); // Crystal calibration for Xin and Xout resp. priv->XtalCal_Xout = tmpu16 & EEPROM_XTAL_CAL_XOUT_MASK; // 0~7.5pF priv->XtalCal_Xin = (tmpu16 & EEPROM_XTAL_CAL_XIN_MASK)>>4; // 0~7.5pF /* Crystal calibration for Xin and Xout resp. */ priv->XtalCal_Xout = tmpu16 & EEPROM_XTAL_CAL_XOUT_MASK; priv->XtalCal_Xin = (tmpu16 & EEPROM_XTAL_CAL_XIN_MASK) >> 4; if ((tmpu16 & EEPROM_XTAL_CAL_ENABLE) >> 12) priv->bXtalCalibration = true; // Thermal meter reference indication. /* Thermal meter reference indication. */ priv->ThermalMeter = (u8)((tmpu16 & EEPROM_THERMAL_METER_MASK) >> 8); if ((tmpu16 & EEPROM_THERMAL_METER_ENABLE) >> 13) priv->bTxPowerTrack = true; Loading @@ -3010,7 +2973,6 @@ short rtl8180_init(struct net_device *dev) priv->rf_set_chan = rtl8225z2_rf_set_chan; priv->rf_set_sens = NULL; if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) return -ENOMEM; Loading Loading @@ -3042,11 +3004,7 @@ short rtl8180_init(struct net_device *dev) TX_BEACON_RING_ADDR)) return -ENOMEM; #if !defined(SA_SHIRQ) if(request_irq(dev->irq, (void *)rtl8180_interrupt, IRQF_SHARED, dev->name, dev)){ #else if(request_irq(dev->irq, (void *)rtl8180_interrupt, SA_SHIRQ, dev->name, dev)){ #endif DMESGE("Error allocating IRQ %d",dev->irq); return -1; }else{ Loading Loading @@ -3335,7 +3293,6 @@ static struct net_device_stats *rtl8180_stats(struct net_device *dev) } // // Change current and default preamble mode. // 2005.01.06, by rcnjko. // bool MgntActSet_802_11_PowerSaveMode( Loading Loading @@ -3454,7 +3411,6 @@ void rtl8180_watch_dog(struct net_device *dev) MgntLinkKeepAlive(priv); //YJ,add,080828,for LPS #ifdef ENABLE_LPS if (priv->PowerProfile == POWER_PROFILE_BATTERY) priv->bLeisurePs = true; else if (priv->PowerProfile == POWER_PROFILE_AC) { Loading @@ -3464,7 +3420,6 @@ void rtl8180_watch_dog(struct net_device *dev) if(priv->ieee80211->state == IEEE80211_LINKED){ priv->link_detect.NumRxOkInPeriod = priv->ieee80211->NumRxDataInPeriod; //printk("TxOk=%d RxOk=%d\n", priv->link_detect.NumTxOkInPeriod, priv->link_detect.NumRxOkInPeriod); if( priv->link_detect.NumRxOkInPeriod> 666 || priv->link_detect.NumTxOkInPeriod> 666 ) { bBusyTraffic = true; Loading @@ -3481,7 +3436,6 @@ void rtl8180_watch_dog(struct net_device *dev) LeisurePSLeave(priv); } else LeisurePSLeave(priv); #endif priv->link_detect.bBusyTraffic = bBusyTraffic; priv->link_detect.NumRxOkInPeriod = 0; priv->link_detect.NumTxOkInPeriod = 0; Loading @@ -3503,16 +3457,11 @@ int _rtl8180_up(struct net_device *dev) if(priv->ieee80211->iw_mode == IW_MODE_ADHOC) IPSLeave(dev); } #ifdef RATE_ADAPT timer_rate_adaptive((unsigned long)dev); #endif watch_dog_adaptive((unsigned long)dev); #ifdef SW_ANTE if(priv->bSwAntennaDiverity) SwAntennaDiversityTimerCallback(dev); #endif ieee80211_softmac_start_protocol(priv->ieee80211); return 0; } Loading Loading @@ -3748,7 +3697,7 @@ static int __devinit rtl8180_pci_probe(struct pci_dev *pdev, dev->wireless_handlers = &r8180_wx_handlers_def; dev->type=ARPHRD_ETHER; dev->watchdog_timeo = HZ*3; //added by david woo, 2007.12.13 dev->watchdog_timeo = HZ*3; if (dev_alloc_name(dev, ifname) < 0){ DMESG("Oops: devname already taken! Trying wlan%%d...\n"); Loading Loading @@ -4236,61 +4185,51 @@ void GPIOChangeRFWorkItemCallBack(struct work_struct *work) static char *envp[] = {"HOME=/", "TERM=linux", "PATH=/usr/bin:/bin", NULL}; static int readf_count = 0; #ifdef ENABLE_LPS if(readf_count % 10 == 0) priv->PowerProfile = read_acadapter_file("/proc/acpi/ac_adapter/AC0/state"); readf_count = (readf_count+1)%0xffff; #endif { // We should turn off LED before polling FF51[4]. /* We should turn off LED before polling FF51[4]. */ //Turn off LED. /* Turn off LED. */ btPSR = read_nic_byte(dev, PSR); write_nic_byte(dev, PSR, (btPSR & ~BIT3)); //It need to delay 4us suggested by Jong, 2008-01-16 /* It need to delay 4us suggested by Jong, 2008-01-16 */ udelay(4); //HW radio On/Off according to the value of FF51[4](config0) /* HW radio On/Off according to the value of FF51[4](config0) */ btConfig0 = btPSR = read_nic_byte(dev, CONFIG0); //Turn on LED. /* Turn on LED. */ write_nic_byte(dev, PSR, btPSR | BIT3); eRfPowerStateToSet = (btConfig0 & BIT4) ? eRfOn : eRfOff; if((priv->ieee80211->bHwRadioOff == true) && (eRfPowerStateToSet == eRfOn)) { if ((priv->ieee80211->bHwRadioOff == true) && (eRfPowerStateToSet == eRfOn)) { priv->ieee80211->bHwRadioOff = false; bActuallySet = true; } else if((priv->ieee80211->bHwRadioOff == false) && (eRfPowerStateToSet == eRfOff)) { } else if ((priv->ieee80211->bHwRadioOff == false) && (eRfPowerStateToSet == eRfOff)) { priv->ieee80211->bHwRadioOff = true; bActuallySet = true; } if(bActuallySet) { if (bActuallySet) { MgntActSet_RF_State(dev, eRfPowerStateToSet, RF_CHANGE_BY_HW); /* To update the UI status for Power status changed */ if (priv->ieee80211->bHwRadioOff == true) argv[1] = "RFOFF"; else{ //if(!priv->RfOffReason) else argv[1] = "RFON"; //else // argv[1] = "RFOFF"; } argv[0] = RadioPowerPath; argv[2] = NULL; call_usermodehelper(RadioPowerPath, argv, envp, 1); } } } static u8 read_acadapter_file(char *filename) { Loading