]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/staging/rtl8187se/r8180_core.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[net-next-2.6.git] / drivers / staging / rtl8187se / r8180_core.c
index 9c2f4d3b58c76f737b9b9fd28243f8eba96db057..55d12e3271de685b0230eeed253fa71e8cf95ff0 100644 (file)
@@ -30,7 +30,9 @@
 #undef RX_DONT_PASS_UL
 #undef DUMMY_RX
 
+#include <linux/slab.h>
 #include <linux/syscalls.h>
+#include <linux/eeprom_93cx6.h>
 
 #include "r8180_hw.h"
 #include "r8180.h"
@@ -662,11 +664,8 @@ unsigned char STRENGTH_MAP[] = {
 
 void rtl8180_RSSI_calc(struct net_device *dev, u8 *rssi, u8 *qual)
 {
-       struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
        u32 temp;
        u32 temp2;
-       u32 temp3;
-       u32 lsb;
        u32 q;
        u32 orig_qual;
        u8  _rssi;
@@ -688,88 +687,6 @@ void rtl8180_RSSI_calc(struct net_device *dev, u8 *rssi, u8 *qual)
        *qual = temp;
        temp2 = *rssi;
 
-       switch(priv->rf_chip){
-       case RFCHIPID_RFMD:
-               lsb = temp2 & 1;
-               temp2 &= 0x7e;
-               if ( !lsb || !(temp2 <= 0x3c) ) {
-                       temp2 = 0x64;
-               } else {
-                       temp2 = 100 * temp2 / 0x3c;
-               }
-               *rssi = temp2 & 0xff;
-               _rssi = temp2 & 0xff;
-               break;
-       case RFCHIPID_INTERSIL:
-               lsb = temp2;
-               temp2 &= 0xfffffffe;
-               temp2 *= 251;
-               temp3 = temp2;
-               temp2 <<= 6;
-               temp3 += temp2;
-               temp3 <<= 1;
-               temp2 = 0x4950df;
-               temp2 -= temp3;
-               lsb &= 1;
-               if ( temp2 <= 0x3e0000 ) {
-                       if ( temp2 < 0xffef0000 )
-                               temp2 = 0xffef0000;
-               } else {
-                       temp2 = 0x3e0000;
-               }
-               if ( !lsb ) {
-                       temp2 -= 0xf0000;
-               } else {
-                       temp2 += 0xf0000;
-               }
-
-               temp3 = 0x4d0000;
-               temp3 -= temp2;
-               temp3 *= 100;
-               temp3 = temp3 / 0x6d;
-               temp3 >>= 0x10;
-               _rssi = temp3 & 0xff;
-               *rssi = temp3 & 0xff;
-               break;
-       case RFCHIPID_GCT:
-               lsb = temp2 & 1;
-               temp2 &= 0x7e;
-               if ( ! lsb || !(temp2 <= 0x3c) ){
-                       temp2 = 0x64;
-               } else {
-                       temp2 = (100 * temp2) / 0x3c;
-               }
-               *rssi = temp2 & 0xff;
-               _rssi = temp2 & 0xff;
-               break;
-       case RFCHIPID_PHILIPS:
-               if( orig_qual <= 0x4e ){
-                       _rssi = STRENGTH_MAP[orig_qual];
-                       *rssi = _rssi;
-               } else {
-                       orig_qual -= 0x80;
-                       if ( !orig_qual ){
-                               _rssi = 1;
-                               *rssi = 1;
-                       } else {
-                               _rssi = 0x32;
-                               *rssi = 0x32;
-                       }
-               }
-               break;
-       case RFCHIPID_MAXIM:
-               lsb = temp2 & 1;
-               temp2 &= 0x7e;
-               temp2 >>= 1;
-               temp2 += 0x42;
-               if( lsb != 0 ){
-                       temp2 += 0xa;
-               }
-               *rssi = temp2 & 0xff;
-               _rssi = temp2 & 0xff;
-               break;
-       }
-
        if ( _rssi < 0x64 ){
                if ( _rssi == 0 ) {
                        *rssi = 1;
@@ -1867,7 +1784,7 @@ rate)
        struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
        int mode;
        struct ieee80211_hdr_3addr  *h = (struct ieee80211_hdr_3addr  *) skb->data;
-       short morefrag = (h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS;
+       short morefrag = (h->frame_control) & IEEE80211_FCTL_MOREFRAGS;
        unsigned long flags;
        int priority;
 
@@ -2136,7 +2053,7 @@ short rtl8180_tx(struct net_device *dev, u8* txbuf, int len, int priority,
                                TxDescDuration = ThisFrameTime + aSifsTime + AckTime;
                        }
 
-                       if(!(frag_hdr->frame_ctl & IEEE80211_FCTL_MOREFRAGS)) { //no more fragment
+                       if (!(frag_hdr->frame_control & IEEE80211_FCTL_MOREFRAGS)) {
                                // ThisFrame-ACK.
                                Duration = aSifsTime + AckTime;
                        } else { // One or more fragments remained.
@@ -2642,6 +2559,36 @@ static void rtl8180_link_detect_init(plink_detect_t plink_detect)
 }
 //YJ,add,080828,end
 
+static void rtl8187se_eeprom_register_read(struct eeprom_93cx6 *eeprom)
+{
+       struct net_device *dev = eeprom->data;
+       u8 reg = read_nic_byte(dev, EPROM_CMD);
+
+       eeprom->reg_data_in = reg & RTL818X_EEPROM_CMD_WRITE;
+       eeprom->reg_data_out = reg & RTL818X_EEPROM_CMD_READ;
+       eeprom->reg_data_clock = reg & RTL818X_EEPROM_CMD_CK;
+       eeprom->reg_chip_select = reg & RTL818X_EEPROM_CMD_CS;
+}
+
+static void rtl8187se_eeprom_register_write(struct eeprom_93cx6 *eeprom)
+{
+       struct net_device *dev = eeprom->data;
+       u8 reg = 2 << 6;
+
+       if (eeprom->reg_data_in)
+               reg |= RTL818X_EEPROM_CMD_WRITE;
+       if (eeprom->reg_data_out)
+               reg |= RTL818X_EEPROM_CMD_READ;
+       if (eeprom->reg_data_clock)
+               reg |= RTL818X_EEPROM_CMD_CK;
+       if (eeprom->reg_chip_select)
+               reg |= RTL818X_EEPROM_CMD_CS;
+
+       write_nic_byte(dev, EPROM_CMD, reg);
+       read_nic_byte(dev, EPROM_CMD);
+       udelay(10);
+}
+
 short rtl8180_init(struct net_device *dev)
 {
        struct r8180_priv *priv = ieee80211_priv(dev);
@@ -2650,8 +2597,16 @@ short rtl8180_init(struct net_device *dev)
        u32 usValue;
        u16 tmpu16;
        int i, j;
+       struct eeprom_93cx6 eeprom;
+       u16 eeprom_val;
+
+       eeprom.data = dev;
+       eeprom.register_read = rtl8187se_eeprom_register_read;
+       eeprom.register_write = rtl8187se_eeprom_register_write;
+       eeprom.width = PCI_EEPROM_WIDTH_93C46;
 
-       priv->channel_plan = eprom_read(dev, EEPROM_COUNTRY_CODE>>1) & 0xFF;
+       eeprom_93cx6_read(&eeprom, EEPROM_COUNTRY_CODE>>1, &eeprom_val);
+       priv->channel_plan = eeprom_val & 0xFF;
        if(priv->channel_plan > COUNTRY_CODE_GLOBAL_DOMAIN){
                printk("rtl8180_init:Error channel plan! Set to default.\n");
                priv->channel_plan = 0;
@@ -2668,8 +2623,6 @@ short rtl8180_init(struct net_device *dev)
        priv->txbeaconcount = 2;
        priv->rx_skb_complete = 1;
 
-       priv->RegThreeWireMode = HW_THREE_WIRE_SI;
-
        priv->RFChangeInProgress = false;
        priv->SetRFPowerStateInProgress = false;
        priv->RFProgType = 0;
@@ -2879,7 +2832,8 @@ short rtl8180_init(struct net_device *dev)
        // just for sync 85
        priv->enable_gpio0 = 0;
 
-       usValue = eprom_read(dev, EEPROM_SW_REVD_OFFSET);
+       eeprom_93cx6_read(&eeprom, EEPROM_SW_REVD_OFFSET, &eeprom_val);
+       usValue = eeprom_val;
        DMESG("usValue is 0x%x\n",usValue);
        //3Read AntennaDiversity
 
@@ -2919,27 +2873,23 @@ short rtl8180_init(struct net_device *dev)
        else
                priv->epromtype=EPROM_93c46;
 
-       dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff;
-       dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8;
-       dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff;
-       dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8;
-       dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff;
-       dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8;
+       eeprom_93cx6_multiread(&eeprom, 0x7, (__le16 *)
+                              dev->dev_addr, 3);
 
        for(i=1,j=0; i<14; i+=2,j++){
-               word = eprom_read(dev,EPROM_TXPW_CH1_2 + j);
+               eeprom_93cx6_read(&eeprom, EPROM_TXPW_CH1_2 + j, &word);
                priv->chtxpwr[i]=word & 0xff;
                priv->chtxpwr[i+1]=(word & 0xff00)>>8;
        }
        for (i = 1, j = 0; i < 14; i += 2, j++) {
-               word = eprom_read(dev, EPROM_TXPW_OFDM_CH1_2 + j);
+               eeprom_93cx6_read(&eeprom, EPROM_TXPW_OFDM_CH1_2 + j, &word);
                priv->chtxpwr_ofdm[i] = word & 0xff;
                priv->chtxpwr_ofdm[i+1] = (word & 0xff00) >> 8;
        }
 
        /* 3Read crystal calibtration and thermal meter indication on 87SE. */
+       eeprom_93cx6_read(&eeprom, EEPROM_RSV>>1, &tmpu16);
 
-       tmpu16 = eprom_read(dev, EEPROM_RSV >> 1);
        /* 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;
@@ -2951,19 +2901,18 @@ short rtl8180_init(struct net_device *dev)
        if ((tmpu16 & EEPROM_THERMAL_METER_ENABLE) >> 13)
                priv->bTxPowerTrack = true;
 
-       word = eprom_read(dev,EPROM_TXPW_BASE);
+       eeprom_93cx6_read(&eeprom, EPROM_TXPW_BASE, &word);
        priv->cck_txpwr_base = word & 0xf;
        priv->ofdm_txpwr_base = (word>>4) & 0xf;
 
-       version = eprom_read(dev,EPROM_VERSION);
+       eeprom_93cx6_read(&eeprom, EPROM_VERSION, &version);
        DMESG("EEPROM version %x",version);
        priv->rcr_csense = 3;
 
-       priv->cs_treshold = (eprom_read(dev, ENERGY_TRESHOLD) & 0xff00) >> 8;
+       eeprom_93cx6_read(&eeprom, ENERGY_TRESHOLD, &eeprom_val);
+       priv->cs_treshold = (eeprom_val & 0xff00) >> 8;
 
-       priv->rf_chip = 0xff & eprom_read(dev, RFCHIPID);
-
-       priv->rf_chip = RF_ZEBRA4;
+       eeprom_93cx6_read(&eeprom, RFCHIPID, &eeprom_val);
        priv->rf_sleep = rtl8225z4_rf_sleep;
        priv->rf_wakeup = rtl8225z4_rf_wakeup;
        DMESGW("**PLEASE** REPORT SUCCESSFUL/UNSUCCESSFUL TO Realtek!");
@@ -3127,43 +3076,6 @@ void write_phy_cck (struct net_device *dev, u8 adr, u32 data)
        rtl8185_write_phy(dev, adr, data | 0x10000);
 }
 
-/* 70*3 = 210 ms
- * I hope this is enougth
- */
-#define MAX_PHY 70
-void write_phy(struct net_device *dev, u8 adr, u8 data)
-{
-       u32 phy;
-       int i;
-
-       phy = 0xff0000;
-       phy |= adr;
-       phy |= 0x80; /* this should enable writing */
-       phy |= (data<<8);
-
-       //PHY_ADR, PHY_R and PHY_W  are contig and treated as one dword
-       write_nic_dword(dev,PHY_ADR, phy);
-
-       phy= 0xffff00;
-       phy |= adr;
-
-       write_nic_dword(dev,PHY_ADR, phy);
-       for(i=0;i<MAX_PHY;i++){
-               phy=read_nic_dword(dev,PHY_ADR);
-               phy= phy & 0xff0000;
-               phy= phy >> 16;
-               if(phy == data){ //SUCCESS!
-                       force_pci_posting(dev);
-                       mdelay(3); //random value
-                       return;
-               }else{
-                       force_pci_posting(dev);
-                       mdelay(3); //random value
-               }
-       }
-       DMESGW ("Phy writing %x %x failed!", adr,data);
-}
-
 void rtl8185_set_rate(struct net_device *dev)
 {
        int i;
@@ -3813,8 +3725,7 @@ static int __init rtl8180_pci_module_init(void)
                return ret;
        }
 
-       printk(KERN_INFO "\nLinux kernel driver for RTL8180 \
-/ RTL8185 based WLAN cards\n");
+       printk(KERN_INFO "\nLinux kernel driver for RTL8180 / RTL8185 based WLAN cards\n");
        printk(KERN_INFO "Copyright (c) 2004-2005, Andrea Merello\n");
        DMESG("Initializing module");
        DMESG("Wireless extensions version %d", WIRELESS_EXT);
@@ -4201,11 +4112,12 @@ void GPIOChangeRFWorkItemCallBack(struct work_struct *work)
        /* HW radio On/Off according to the value of FF51[4](config0) */
        btConfig0 = btPSR = read_nic_byte(dev, CONFIG0);
 
-       /* Turn on LED. */
-       write_nic_byte(dev, PSR, btPSR | BIT3);
-
        eRfPowerStateToSet = (btConfig0 & BIT4) ?  eRfOn : eRfOff;
 
+       /* Turn LED back on when radio enabled */
+       if (eRfPowerStateToSet == eRfOn)
+               write_nic_byte(dev, PSR, btPSR | BIT3);
+
        if ((priv->ieee80211->bHwRadioOff == true) &&
           (eRfPowerStateToSet == eRfOn)) {
                priv->ieee80211->bHwRadioOff = false;