Add model soloSE & update kernel and drivers.
[vuplus_openvuplus] / meta-openvuplus / recipes-connectivity / realtek / r8192cu-3.4.4.4749.20121105 / r8192cu_build_fix.patch
diff --git a/meta-openvuplus/recipes-connectivity/realtek/r8192cu-3.4.4.4749.20121105/r8192cu_build_fix.patch b/meta-openvuplus/recipes-connectivity/realtek/r8192cu-3.4.4.4749.20121105/r8192cu_build_fix.patch
new file mode 100644 (file)
index 0000000..9979e51
--- /dev/null
@@ -0,0 +1,1614 @@
+################################################################################
+#      This file is part of OpenELEC - http://www.openelec.tv
+#      Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv)
+#
+#  OpenELEC is free software: you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation, either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  OpenELEC is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with OpenELEC.  If not, see <http://www.gnu.org/licenses/>.
+################################################################################
+commit 710c9ba0aab6c2d50b046b22f1405b12b7ebbff3
+Author: hschang <chang@dev3>
+Date:   Tue Feb 25 16:49:51 2014 +0900
+
+    patch for lastest kernel(>= 3.10.0)
+
+diff --git a/core/rtw_debug.c b/core/rtw_debug.c
+index 04e472d..d4f6e7d 100644
+--- a/core/rtw_debug.c
++++ b/core/rtw_debug.c
+@@ -62,6 +62,7 @@
+ #ifdef CONFIG_PROC_DEBUG
+ #include <rtw_version.h>
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) 
+ int proc_get_drv_version(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -75,7 +76,15 @@ int proc_get_drv_version(char *page, char **start,
+       *eof = 1;
+       return len;
+ }
++#else
++int proc_get_drv_version(struct seq_file *m, void* data)
++{
++      seq_printf(m, "%s\n", DRIVERVERSION);
++      return 0;
++}
++#endif
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) 
+ int proc_get_write_reg(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -83,7 +92,14 @@ int proc_get_write_reg(char *page, char **start,
+       *eof = 1;
+       return 0;
+ }
++#else
++int proc_get_write_reg(struct seq_file *m, void* data)
++{
++      return 0;
++}
++#endif
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) 
+ int proc_set_write_reg(struct file *file, const char *buffer,
+               unsigned long count, void *data)
+ {
+@@ -128,10 +144,59 @@ int proc_set_write_reg(struct file *file, const char *buffer,
+       return count;
+       
+ }
++#else
++int proc_set_write_reg_open(struct seq_file *m, void* data)
++{
++      return 0;
++}
++
++ssize_t proc_set_write_reg(struct file *file, const char *buffer, size_t count, loff_t *pos)
++{
++      struct net_device *dev = (struct net_device *)pos;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
++      char tmp[32];
++      u32 addr, val, len;
++
++      if (count < 3)
++      {
++              DBG_8192C("argument size is less than 3\n");
++              return -EFAULT;
++      }       
++      len = min(count, sizeof(tmp)-1);
++      if (buffer && !copy_from_user(tmp, buffer, len)) {
++              tmp[len] = '\0';
++              
++              if(sscanf(tmp, "%x %x %x", &addr, &val, &len)!=3) {
++                      DBG_8192C("invalid write_reg parameter!\n");
++                      return -EFAULT;
++              }
++
++              switch(len)
++              {
++                      case 1:
++                              rtw_write8(padapter, addr, (u8)val);                            
++                              break;
++                      case 2:
++                              rtw_write16(padapter, addr, (u16)val);                          
++                              break;
++                      case 4:
++                              rtw_write32(padapter, addr, val);                               
++                              break;
++                      default:
++                              DBG_8192C("error write length=%d", len);
++                              break;
++              }                       
++              
++      }
++      
++      return count;
++}
++#endif
+ static u32 proc_get_read_addr=0xeeeeeeee;
+ static u32 proc_get_read_len=0x4;
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) 
+ int proc_get_read_reg(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -199,7 +264,77 @@ int proc_set_read_reg(struct file *file, const char *buffer,
+       return count;
+ }
++#else
++int proc_get_read_reg(struct seq_file *m, void* data)
++{     
++      struct net_device *dev = m->private;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
++      if(proc_get_read_addr==0xeeeeeeee)
++      {
++              return 0;
++      }
++
++      switch(proc_get_read_len)
++      {
++              case 1:                 
++                      seq_printf(m, "rtw_read8(0x%x)=0x%x\n", proc_get_read_addr, rtw_read8(padapter, proc_get_read_addr));
++                      break;
++              case 2:
++                      seq_printf(m, "rtw_read16(0x%x)=0x%x\n", proc_get_read_addr, rtw_read16(padapter, proc_get_read_addr));
++                      break;
++              case 4:
++                      seq_printf(m, "rtw_read32(0x%x)=0x%x\n", proc_get_read_addr, rtw_read32(padapter, proc_get_read_addr));
++                      break;
++              default:
++                      seq_printf(m, "error read length=%d\n", proc_get_read_len);
++                      break;
++      }
++      return 0;
++}
++
++ssize_t proc_set_read_reg(struct file *file, const char *buf,
++              size_t count, loff_t *pos)
++{
++      struct net_device *dev = (struct net_device *)pos;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
++      
++      char *cmd, *buffer;
++      
++      u32 addr, len, num;
++
++      if (count < 2)
++      {
++              DBG_8192C("argument size is less than 2\n");
++              return -EFAULT;
++      }       
++      cmd = kmalloc(count+1, GFP_KERNEL);
++      if(!cmd)
++          return -ENOMEM;
++      if(!copy_from_user(cmd, buf, count)) {
++
++              cmd[count]='\0';
++              buffer = cmd;
++              
++              num = sscanf(buffer, "%x %x", &addr, &len);
++
++              if (num !=  2) {
++                      DBG_8192C("invalid read_reg parameter!\n");
++                      return count;
++              }
++
++              proc_get_read_addr = addr;
++              proc_get_read_len = len;
++      }else{
++          kfree(cmd);
++          return -EFAULT;
++      }
++      kfree(cmd);
++      return count;
++}
++#endif
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+ int proc_get_fwstate(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -215,7 +350,18 @@ int proc_get_fwstate(char *page, char **start,
+       *eof = 1;
+       return len;
+ }
++#else
++int proc_get_fwstate(struct seq_file *m, void* data)
++{
++      struct net_device *dev = m->private;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
++      struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
++      seq_printf(m, "fwstate=0x%x\n",get_fwstate(pmlmepriv));
++      return 0;
++}
++#endif
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+ int proc_get_sec_info(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -233,7 +379,20 @@ int proc_get_sec_info(char *page, char **start,
+       *eof = 1;
+       return len;
+ }
++#else
++int proc_get_sec_info(struct seq_file *m, void* data)
++{
++      struct net_device *dev = m->private;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
++      struct security_priv *psecuritypriv = &padapter->securitypriv;
++      seq_printf(m, "auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\n", 
++                                              psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm,
++                                              psecuritypriv->ndisauthtype, psecuritypriv->ndisencryptstatus);
++      return 0;
++}
++#endif
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+ int proc_get_mlmext_state(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -250,7 +409,19 @@ int proc_get_mlmext_state(char *page, char **start,
+       *eof = 1;
+       return len;
+ }
++#else
++int proc_get_mlmext_state(struct seq_file *m, void *data)
++{
++      struct net_device *dev = m->private;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);  
++      struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
++      struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
++      seq_printf(m, "pmlmeinfo->state=0x%x\n", pmlmeinfo->state);
++      return 0;
++}
++#endif
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+ int proc_get_qos_option(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -267,7 +438,18 @@ int proc_get_qos_option(char *page, char **start,
+       return len;
+ }
++#else
++int proc_get_qos_option(struct seq_file *m, void *data)
++{
++      struct net_device *dev = m->private;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
++      struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
++      seq_printf(m, "qos_option=%d\n", pmlmepriv->qospriv.qos_option);
++      return 0;
++}
++#endif
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+ int proc_get_ht_option(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -283,7 +465,18 @@ int proc_get_ht_option(char *page, char **start,
+       *eof = 1;
+       return len;
+ }
++#else
++int proc_get_ht_option(struct seq_file *m, void *data)
++{
++      struct net_device *dev = m->private;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
++      struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
++      seq_printf(m, "ht_option=%d\n", pmlmepriv->htpriv.ht_option);
++      return 0;
++}
++#endif
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+ int proc_get_rf_info(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -301,7 +494,19 @@ int proc_get_rf_info(char *page, char **start,
+       return len;
+ }
++#else
++int proc_get_rf_info(struct seq_file *m, void *data)
++{
++      struct net_device *dev = m->private;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);  
++      struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;     
++      seq_printf(m, "cur_ch=%d, cur_bw=%d, cur_ch_offet=%d\n",
++                      pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);
++      return 0;
++}
++#endif
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+ int proc_get_ap_info(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -350,7 +555,53 @@ int proc_get_ap_info(char *page, char **start,
+       return len;
+ }
++#else
++int proc_get_ap_info(struct seq_file *m, void *data)
++{
++      struct sta_info *psta;
++      struct net_device *dev = m->private;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
++      struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
++      struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
++      struct wlan_network *cur_network = &(pmlmepriv->cur_network);
++      struct sta_priv *pstapriv = &padapter->stapriv;
++      int len = 0;
++
++      psta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress);
++      if(psta)
++      {
++              int i;
++              struct recv_reorder_ctrl *preorder_ctrl;
++                                      
++              seq_printf(m, "SSID=%s\n", cur_network->network.Ssid.Ssid);             
++              seq_printf(m, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr));
++              seq_printf(m, "cur_channel=%d, cur_bwmode=%d, cur_ch_offset=%d\n", pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);               
++              seq_printf(m, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self);
++              seq_printf(m, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate);        
++              seq_printf(m, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid);     
++              seq_printf(m, "bwmode=%d, ch_offset=%d, sgi=%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi);                                              
++              seq_printf(m, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable);        
++              seq_printf(m, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);
++                                      
++              for(i=0;i<16;i++)
++              {                                                       
++                      preorder_ctrl = &psta->recvreorder_ctrl[i];
++                      if(preorder_ctrl->enable)
++                      {
++                              seq_printf(m, "tid=%d, indicate_seq=%d\n", i, preorder_ctrl->indicate_seq);
++                      }
++              }       
++              
++      }
++      else
++      {
++              seq_printf(m, "can't get sta's macaddr, cur_network's macaddr:" MAC_FMT "\n", MAC_ARG(cur_network->network.MacAddress));
++      }
++      return 0;
++}
++#endif
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+ int proc_get_adapter_state(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -366,7 +617,18 @@ int proc_get_adapter_state(char *page, char **start,
+       return len;
+ }
+-      
++#else
++int proc_get_adapter_state(struct seq_file *m, void *data)
++{
++      struct net_device *dev = m->private;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
++      seq_printf(m, "bSurpriseRemoved=%d, bDriverStopped=%d\n", 
++                      padapter->bSurpriseRemoved, padapter->bDriverStopped);
++      return 0;
++}
++#endif
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+ int proc_get_trx_info(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -387,8 +649,23 @@ int proc_get_trx_info(char *page, char **start,
+       return len;
+ }
+-      
+-              
++#else
++int proc_get_trx_info(struct seq_file *m, void *data)
++{
++      struct net_device *dev = m->private;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
++      struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
++      struct recv_priv  *precvpriv = &padapter->recvpriv;
++      seq_printf(m, "free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d, free_ext_xmitbuf_cnt=%d, free_recvframe_cnt=%d\n", 
++              pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt,pxmitpriv->free_xmit_extbuf_cnt, precvpriv->free_recvframe_cnt);
++#ifdef CONFIG_USB_HCI
++      seq_printf(m, "rx_urb_pending_cn=%d\n", precvpriv->rx_pending_cnt);
++#endif
++      return 0;
++}
++#endif
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+ int proc_get_rx_signal(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -452,7 +729,62 @@ int proc_set_rx_signal(struct file *file, const char *buffer,
+       return count;
+       
+ }
++#else
++int proc_get_rx_signal(struct seq_file *m, void *data)
++{
++      struct net_device *dev = m->private;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
++      struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
++      seq_printf(m,
++              "rssi:%d\n"
++              "rxpwdb:%d\n"
++              "signal_strength:%u\n"
++              "signal_qual:%u\n"
++              "noise:%u\n", 
++              padapter->recvpriv.rssi,
++              padapter->recvpriv.rxpwdb,
++              padapter->recvpriv.signal_strength,
++              padapter->recvpriv.signal_qual,
++              padapter->recvpriv.noise
++              );
++      return 0;
++}
++ssize_t proc_set_rx_signal(struct file *file, const char *buffer, size_t count, loff_t *pos)
++{
++      struct net_device *dev = (struct net_device *)pos;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
++      char tmp[32];
++      u32 is_signal_dbg, signal_strength;
++
++      if (count < 1)
++              return -EFAULT;
++
++      if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
++
++              int num = sscanf(tmp, "%u %u", &is_signal_dbg, &signal_strength);
++
++              is_signal_dbg = is_signal_dbg==0?0:1;
++              
++              if(is_signal_dbg && num!=2)
++                      return count;
++                      
++              signal_strength = signal_strength>100?100:signal_strength;
++              signal_strength = signal_strength<0?0:signal_strength;
++
++              padapter->recvpriv.is_signal_dbg = is_signal_dbg;
++              padapter->recvpriv.signal_strength_dbg=signal_strength;
++
++              if(is_signal_dbg)
++                      DBG_871X("set %s %u\n", "DBG_SIGNAL_STRENGTH", signal_strength);
++              else
++                      DBG_871X("set %s\n", "HW_SIGNAL_STRENGTH");
++      }
++      return count;
++}
++#endif
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+ int proc_get_ampdu_enable(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -499,7 +831,46 @@ int proc_set_ampdu_enable(struct file *file, const char *buffer,
+       return count;
+       
+ }
++#else
++int proc_get_ampdu_enable(struct seq_file *m, void *data)
++{
++      struct net_device *dev = m->private;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
++      struct registry_priv    *pregpriv = &padapter->registrypriv;
++      if(pregpriv)
++              seq_printf(m,
++                      "%d\n",
++                      pregpriv->ampdu_enable
++                      );
++      return 0;
++}
++
++ssize_t proc_set_ampdu_enable(struct file *file, const char *buffer, size_t count, loff_t *pos)
++{
++      struct net_device *dev = (struct net_device *)pos;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
++      struct registry_priv    *pregpriv = &padapter->registrypriv;
++      char tmp[32];
++      u32 mode;
++
++      if (count < 1)
++              return -EFAULT;
++
++      if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
++
++              int num = sscanf(tmp, "%d ", &mode);
++
++              if( pregpriv && mode >= 0 && mode < 3 )
++              {
++                      pregpriv->ampdu_enable= mode;
++                      printk("ampdu_enable=%d\n", mode);
++              }
++      }
++      return count;
++}
++#endif
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+ int proc_get_rssi_disp(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -547,10 +918,52 @@ int proc_set_rssi_disp(struct file *file, const char *buffer,
+       return count;
+       
+ }     
++#else
++int proc_get_rssi_disp(struct seq_file *m, void *data)
++{
++      return 0;
++}
++
++ssize_t proc_set_rssi_disp(struct file *file, const char *buffer, size_t count, loff_t *pos)
++{
++      struct net_device *dev = (struct net_device *)pos;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
++      char tmp[32];
++      u32 enable=0;
++      if (count < 1)
++      {
++              DBG_8192C("argument size is less than 1\n");
++              return -EFAULT;
++      }       
++
++      if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
++
++              int num = sscanf(tmp, "%x", &enable);
++
++              if (num !=  1) {
++                      DBG_8192C("invalid set_rssi_disp parameter!\n");
++                      return count;
++              }
+               
++              if(enable)
++              {                       
++                      DBG_8192C("Turn On Rx RSSI Display Function\n");
++                      padapter->bRxRSSIDisplay = enable ;                     
++              }
++              else
++              {
++                      DBG_8192C("Turn Off Rx RSSI Display Function\n");
++                      padapter->bRxRSSIDisplay = 0 ;
++              }
++      }
++      return count;
++}
++#endif
++
+ #ifdef CONFIG_AP_MODE
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+ int proc_get_all_sta_info(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -620,14 +1033,74 @@ int proc_get_all_sta_info(char *page, char **start,
+       return len;
+ }
+-      
+-#endif                
++#else
++int proc_get_all_sta_info(struct seq_file *m, void *data)
++{
++      _irqL irqL;
++      struct sta_info *psta;
++      struct net_device *dev = m->private;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
++      struct sta_priv *pstapriv = &padapter->stapriv;
++      int i, j;
++      _list   *plist, *phead;
++      struct recv_reorder_ctrl *preorder_ctrl;
++      seq_printf(m, "sta_dz_bitmap=0x%x, tim_bitmap=0x%x\n", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap);
++                                      
++      _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
++
++      for(i=0; i< NUM_STA; i++)
++      {
++              phead = &(pstapriv->sta_hash[i]);
++              plist = get_next(phead);
++              
++              while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
++              {
++                      psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
++
++                      plist = get_next(plist);
++
++                      //if(extra_arg == psta->aid)
++                      {
++                              seq_printf(m, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr));
++                              seq_printf(m, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self);
++                              seq_printf(m, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate);        
++                              seq_printf(m, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid);     
++                              seq_printf(m, "bwmode=%d, ch_offset=%d, sgi=%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi);                                              
++                              seq_printf(m, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable);                                                                        
++                              seq_printf(m, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);
++                              seq_printf(m, "sleepq_len=%d\n", psta->sleepq_len);
++                              seq_printf(m, "capability=0x%x\n", psta->capability);
++                              seq_printf(m, "flags=0x%x\n", psta->flags);
++                              seq_printf(m, "wpa_psk=0x%x\n", psta->wpa_psk);
++                              seq_printf(m, "wpa2_group_cipher=0x%x\n", psta->wpa2_group_cipher);
++                              seq_printf(m, "wpa2_pairwise_cipher=0x%x\n", psta->wpa2_pairwise_cipher);
++                              seq_printf(m, "qos_info=0x%x\n", psta->qos_info);
++                              seq_printf(m, "dot118021XPrivacy=0x%x\n", psta->dot118021XPrivacy);
++                                                              
++                              for(j=0;j<16;j++)
++                              {                                                       
++                                      preorder_ctrl = &psta->recvreorder_ctrl[j];
++                                      if(preorder_ctrl->enable)
++                                      {
++                                              seq_printf(m, "tid=%d, indicate_seq=%d\n", j, preorder_ctrl->indicate_seq);
++                                      }
++                              }
++                      }
++              }
++      }
++      _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
++      return 0;
++}
++#endif
++
++#endif
+ #ifdef DBG_MEMORY_LEAK
+ #include <asm/atomic.h>
+ extern atomic_t _malloc_cnt;;
+ extern atomic_t _malloc_size;;
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+ int proc_get_malloc_cnt(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -641,9 +1114,20 @@ int proc_get_malloc_cnt(char *page, char **start,
+       *eof = 1;
+       return len;
+ }
++#else
++int proc_get_malloc_cnt(struct seq_file *m, void *data)
++{
++      seq_printf(m, "_malloc_cnt=%d\n", atomic_read(&_malloc_cnt));
++      seq_printf(m, "_malloc_size=%d\n", atomic_read(&_malloc_size));
++      return 0;
++}
++#endif
++
+ #endif /* DBG_MEMORY_LEAK */
+ #ifdef CONFIG_FIND_BEST_CHANNEL
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+ int proc_get_best_channel(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+@@ -703,6 +1187,61 @@ int proc_get_best_channel(char *page, char **start,
+       return len;
+ }
++#else
++int proc_get_best_channel(struct seq_file *m, void *data)
++{
++      struct net_device *dev = m->private;
++      _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
++      struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
++      u32 i, best_channel_24G = 1, best_channel_5G = 36, index_24G = 0, index_5G = 0;
++
++      for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) {
++              if ( pmlmeext->channel_set[i].ChannelNum == 1)
++                      index_24G = i;
++              if ( pmlmeext->channel_set[i].ChannelNum == 36)
++                      index_5G = i;
++      }       
++      
++      for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) {
++              // 2.4G
++              if ( pmlmeext->channel_set[i].ChannelNum == 6 ) {
++                      if ( pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_24G].rx_count ) {
++                              index_24G = i;
++                              best_channel_24G = pmlmeext->channel_set[i].ChannelNum;
++                      }
++              }
++
++              // 5G
++              if ( pmlmeext->channel_set[i].ChannelNum >= 36
++                      && pmlmeext->channel_set[i].ChannelNum < 140 ) {
++                       // Find primary channel
++                      if ( (( pmlmeext->channel_set[i].ChannelNum - 36) % 8 == 0)
++                              && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count) ) {
++                              index_5G = i;
++                              best_channel_5G = pmlmeext->channel_set[i].ChannelNum;
++                      }
++              }
++
++              if ( pmlmeext->channel_set[i].ChannelNum >= 149
++                      && pmlmeext->channel_set[i].ChannelNum < 165) {
++                       // find primary channel
++                      if ( (( pmlmeext->channel_set[i].ChannelNum - 149) % 8 == 0)
++                              && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count) ) {
++                              index_5G = i;
++                              best_channel_5G = pmlmeext->channel_set[i].ChannelNum;
++                      }
++              }
++#if 1 // debug
++              seq_printf(m, "The rx cnt of channel %3d = %d\n", 
++                              pmlmeext->channel_set[i].ChannelNum, pmlmeext->channel_set[i].rx_count);
++#endif
++      }
++      seq_printf(m, "best_channel_5G = %d\n", best_channel_5G);
++      seq_printf(m, "best_channel_24G = %d\n", best_channel_24G);
++      return 0;
++}
++#endif
++
+ #endif /* CONFIG_FIND_BEST_CHANNEL */
+       
+ #endif
+diff --git a/core/rtw_mp.c b/core/rtw_mp.c
+index 0cdc094..bb76dae 100644
+--- a/core/rtw_mp.c
++++ b/core/rtw_mp.c
+@@ -1140,8 +1140,7 @@ void SetPacketTx(PADAPTER padapter)
+       _rtw_memset(ptr, payload, pkt_end - ptr);
+       //3 6. start thread
+-      pmp_priv->tx.PktTxThread = kernel_thread(mp_xmit_packet_thread, pmp_priv, CLONE_FS|CLONE_FILES);
+-      if(pmp_priv->tx.PktTxThread < 0)
++      if(!start_kthread(&pmp_priv->tx.PktTxThread, mp_xmit_packet_thread, pmp_priv, "8192cu-mp-xmit"))
+               DBG_871X("Create PktTx Thread Fail !!!!!\n");
+ }
+diff --git a/hal/rtl8192c/usb/usb_halinit.c b/hal/rtl8192c/usb/usb_halinit.c
+index eb5ea29..6cac2d5 100644
+--- a/hal/rtl8192c/usb/usb_halinit.c
++++ b/hal/rtl8192c/usb/usb_halinit.c
+@@ -3786,6 +3786,8 @@ _ReadIDs(
+                               pHalData->CustomerID = RT_CID_DLINK;
+                       else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x330a))
+                               pHalData->CustomerID = RT_CID_DLINK;
++                      else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x330d))
++                              pHalData->CustomerID = RT_CID_DLINK;
+                       break;
+               case EEPROM_CID_WHQL:
+ /*                    
+diff --git a/include/osdep_service.h b/include/osdep_service.h
+index 2802187..6fedff4 100644
+--- a/include/osdep_service.h
++++ b/include/osdep_service.h
+@@ -100,6 +100,9 @@
+       #include <linux/pci.h>
+ #endif
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0))
++      #include <linux/kthread.h>
++#endif
+       
+ #ifdef CONFIG_USB_HCI
+       typedef struct urb *  PURB;
+@@ -133,8 +136,12 @@
+       //typedef u32   _irqL;
+       typedef unsigned long _irqL;
+       typedef struct  net_device * _nic_hdl;
+-      
++
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0))
+       typedef pid_t           _thread_hdl_;
++#else
++      typedef struct task_struct * _thread_hdl_;
++#endif
+       typedef int             thread_return;
+       typedef void*   thread_context;
+@@ -572,7 +579,7 @@ __inline static void thread_enter(void *context)
+ #ifdef PLATFORM_LINUX
+       //struct net_device *pnetdev = (struct net_device *)context;
+       //daemonize("%s", pnetdev->name);
+-      daemonize("%s", "RTKTHREAD");
++      //daemonize("%s", "RTKTHREAD");
+       allow_signal(SIGTERM);
+ #endif
+ }
+@@ -827,4 +834,8 @@ extern u64 rtw_division64(u64 x, u64 y);
+ #endif
++#ifdef PLATFORM_LINUX
++extern int start_kthread(_thread_hdl_ *t_hdl, int (*threadfn)(void *data),
++                       void *data, const char *name);
++#endif
+diff --git a/include/rtw_debug.h b/include/rtw_debug.h
+index eca6692..624add6 100644
+--- a/include/rtw_debug.h
++++ b/include/rtw_debug.h
+@@ -24,7 +24,6 @@
+ #include <osdep_service.h>
+ #include <drv_types.h>
+-
+ #define _drv_emerg_                   1
+ #define _drv_alert_                   2
+ #define _drv_crit_                    3
+@@ -35,7 +34,6 @@
+ #define _drv_dump_                    8
+ #define       _drv_debug_             9
+-
+ #define       _module_rtl871x_xmit_c_                 BIT(0)
+ #define       _module_xmit_osdep_c_           BIT(1)
+ #define       _module_rtl871x_recv_c_                 BIT(2)
+@@ -179,7 +177,6 @@ extern void rtl871x_cedbg(const char *fmt, ...);
+ #endif /* CONFIG_DEBUG_RTL871X */
+-
+ #if   defined (_dbgdump) && defined (_MODULE_DEFINE_)
+               #undef RT_TRACE
+@@ -193,7 +190,6 @@ extern void rtl871x_cedbg(const char *fmt, ...);
+ #endif
+-
+ #if   defined (_dbgdump)
+               #undef  _func_enter_
+@@ -231,7 +227,6 @@ extern void rtl871x_cedbg(const char *fmt, ...);
+                       }
+ #endif
+-
+ #ifdef CONFIG_DEBUG_RTL819X
+       #ifdef PLATFORM_WINDOWS
+@@ -281,10 +276,9 @@ extern void rtl871x_cedbg(const char *fmt, ...);
+       #define ERR_8192C _dbgdump
+ #endif
+-
+-
+ #ifdef CONFIG_PROC_DEBUG
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       int proc_get_drv_version(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data);
+@@ -293,8 +287,8 @@ extern void rtl871x_cedbg(const char *fmt, ...);
+                         off_t offset, int count,
+                         int *eof, void *data);
+-      int proc_set_write_reg(struct file *file, const char *buffer,
+-              unsigned long count, void *data);
++      int proc_set_write_reg(struct file *file, const char *buffer,
++                        unsigned long count, void *data);
+       int proc_get_read_reg(char *page, char **start,
+                         off_t offset, int count,
+@@ -303,7 +297,6 @@ extern void rtl871x_cedbg(const char *fmt, ...);
+       int proc_set_read_reg(struct file *file, const char *buffer,
+               unsigned long count, void *data);
+-
+       int proc_get_fwstate(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data);
+@@ -339,28 +332,75 @@ extern void rtl871x_cedbg(const char *fmt, ...);
+       int proc_get_trx_info(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data);
++#else
++      int proc_get_drv_version(struct seq_file *m, void *data);
++
++      int proc_get_write_reg(struct seq_file *m, void *data);
++
++      ssize_t proc_set_write_reg(struct file *file, const char *buffer,
++                       size_t count, loff_t *pos);
++
++      int proc_get_read_reg(struct seq_file *m, void *data);
++
++      ssize_t proc_set_read_reg(struct file *file, const char *buffer,
++                       size_t count, loff_t *pos);
++
++      int proc_get_fwstate(struct seq_file *m, void *data);
++
++      int proc_get_sec_info(struct seq_file *m, void *data);
++
++      int proc_get_mlmext_state(struct seq_file *m, void *data);
++      int proc_get_qos_option(struct seq_file *m, void *data);
++
++      int proc_get_ht_option(struct seq_file *m, void *data);
++
++      int proc_get_rf_info(struct seq_file *m, void *data);
++
++      int proc_get_ap_info(struct seq_file *m, void *data);
++
++      int proc_get_adapter_state(struct seq_file *m, void *data);
++
++      int proc_get_trx_info(struct seq_file *m, void *data);
++#endif
+ #ifdef CONFIG_AP_MODE
++# if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       int proc_get_all_sta_info(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data);
++# else
++      int proc_get_all_sta_info(struct seq_file *m, void *data);
++# endif
+ #endif
+ #ifdef DBG_MEMORY_LEAK
++
++# if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       int proc_get_malloc_cnt(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data);
++# else
++      int proc_get_malloc_cnt(struct seq_file *m, void *data);
++# endif
++
+ #endif
+ #ifdef CONFIG_FIND_BEST_CHANNEL
++
++# if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       int proc_get_best_channel(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data);
++# else
++      int proc_get_best_channel(struct seq_file *m, void *data);
++# endif
++
+ #endif
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       int proc_get_rx_signal(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data);
+@@ -381,7 +421,22 @@ extern void rtl871x_cedbg(const char *fmt, ...);
+       int proc_set_rssi_disp(struct file *file, const char *buffer,
+               unsigned long count, void *data);
+-      
++#else
++      int proc_get_rx_signal(struct seq_file *m, void *data);
++
++      ssize_t proc_set_rx_signal(struct file *file, const char *buffer,
++                              size_t count, loff_t *pos);
++
++      int proc_get_ampdu_enable(struct seq_file *m, void *data);
++                        
++      ssize_t proc_set_ampdu_enable(struct file *file, const char *buffer,
++                              size_t count, loff_t *pos);
++
++      int proc_get_rssi_disp(struct seq_file *m, void *data);
++
++      ssize_t proc_set_rssi_disp(struct file *file, const char *buffer,
++                              size_t count, loff_t *pos);
++#endif
+ #endif //CONFIG_PROC_DEBUG
+diff --git a/include/rtw_recv.h b/include/rtw_recv.h
+index a88f505..e204ef3 100644
+--- a/include/rtw_recv.h
++++ b/include/rtw_recv.h
+@@ -623,8 +623,9 @@ __inline static union recv_frame *rxmem_to_recvframe(u8 *rxmem)
+       //from any given member of recv_frame.
+       // rxmem indicates the any member/address in recv_frame
+       
+-      return (union recv_frame*)(((uint)rxmem>>RXFRAME_ALIGN) <<RXFRAME_ALIGN) ;
+-      
++      //return (union recv_frame*)(((uint)rxmem>>RXFRAME_ALIGN) <<RXFRAME_ALIGN) ;
++      //return (union recv_frame*)(((SIZE_PTR)rxmem >> RXFRAME_ALIGN) << RXFRAME_ALIGN);
++      return (union recv_frame*)(((ulong)rxmem>>RXFRAME_ALIGN) <<RXFRAME_ALIGN) ; 
+ }
+ __inline static union recv_frame *pkt_to_recvframe(_pkt *pkt)
+diff --git a/os_dep/linux/os_intfs.c b/os_dep/linux/os_intfs.c
+index 4d057a6..d3b662c 100644
+--- a/os_dep/linux/os_intfs.c
++++ b/os_dep/linux/os_intfs.c
+@@ -255,6 +255,246 @@ static char rtw_proc_name[IFNAMSIZ];
+ static struct proc_dir_entry *rtw_proc = NULL;
+ static int    rtw_proc_cnt = 0;
++/*
++ * seq_file wrappers for procfile show routines, kernel >= 3.10
++ */
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
++
++static int proc_get_drv_version_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_drv_version, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_drv_version_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_drv_version_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .release = single_release,
++};
++
++static int proc_get_write_reg_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_write_reg, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_write_reg_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_write_reg_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .write = proc_set_write_reg,
++      .release = seq_release,
++};
++
++static int proc_get_read_reg_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_read_reg, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_read_reg_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_read_reg_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .write = proc_set_read_reg,
++      .release = seq_release,
++};
++
++static int proc_get_rssi_disp_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_rssi_disp, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_rssi_disp_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_rssi_disp_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .write = proc_set_rssi_disp,
++      .release = seq_release,
++};
++
++static int proc_get_ampdu_enable_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_ampdu_enable, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_ampdu_enable_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_ampdu_enable_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .write = proc_set_ampdu_enable,
++      .release = seq_release,
++};
++
++static int proc_get_rx_signal_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_rx_signal, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_rx_signal_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_rx_signal_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .write = proc_set_rx_signal,
++      .release = seq_release,
++};
++
++static int proc_get_fwstate_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_fwstate, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_fwstate_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_fwstate_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .release = single_release,
++};
++
++static int proc_get_mlmext_state_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_mlmext_state, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_mlmext_state_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_mlmext_state_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .release = single_release,
++};
++
++static int proc_get_qos_option_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_qos_option, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_qos_option_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_qos_option_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .release = single_release,
++};
++
++static int proc_get_ht_option_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_ht_option, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_ht_option_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_ht_option_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .release = single_release,
++};
++
++static int proc_get_rf_info_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_rf_info, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_rf_info_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_rf_info_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .release = single_release,
++};
++
++static int proc_get_ap_info_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_ap_info, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_ap_info_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_ap_info_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .release = single_release,
++};
++
++static int proc_get_adapter_state_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_adapter_state, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_adapter_state_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_adapter_state_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .release = single_release,
++};
++
++static int proc_get_trx_info_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_trx_info, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_trx_info_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_trx_info_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .release = single_release,
++};
++
++static int proc_get_sec_info_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_sec_info, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_sec_info_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_sec_info_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .release = single_release,
++};
++
++# ifdef CONFIG_AP_MODE
++
++static int proc_get_all_sta_info_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_all_sta_info, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_all_sta_info_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_all_sta_info_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .release = single_release,
++};
++
++# endif
++
++# ifdef DBG_MEMORY_LEAK
++
++static int proc_get_malloc_cnt_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_malloc_cnt, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_malloc_cnt_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_malloc_cnt_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .release = single_release,
++};
++
++# endif
++
++# ifdef CONFIG_FIND_BEST_CHANNEL
++
++static int proc_get_best_channel_open(struct inode *inode, struct file *file){
++        return single_open(file, proc_get_best_channel, PDE_DATA(inode));
++}
++
++static const struct file_operations proc_get_best_channel_fops = {
++        .owner = THIS_MODULE,
++      .open = proc_get_best_channel_open,
++        .read = seq_read,
++        .llseek = seq_lseek,
++      .release = single_release,
++};
++
++# endif
++
++#endif
++
+ void rtw_proc_init_one(struct net_device *dev)
+ {
+       struct proc_dir_entry *dir_dev = NULL;
+@@ -275,28 +515,37 @@ void rtw_proc_init_one(struct net_device *dev)
+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
+               rtw_proc=create_proc_entry(rtw_proc_name, S_IFDIR, proc_net);
+ #else
++# if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+               rtw_proc=create_proc_entry(rtw_proc_name, S_IFDIR, init_net.proc_net);
++# else
++              rtw_proc=proc_mkdir(rtw_proc_name, init_net.proc_net);
++# endif
+ #endif
+               if (rtw_proc == NULL) {
+                       DBG_8192C(KERN_ERR "Unable to create rtw_proc directory\n");
+                       return;
+               }
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+               entry = create_proc_read_entry("ver_info", S_IFREG | S_IRUGO, rtw_proc, proc_get_drv_version, dev);                                
++#else
++              entry = proc_create_data("ver_info", S_IFREG | S_IRUGO, rtw_proc, &proc_get_drv_version_fops, dev);                                
++#endif
+               if (!entry) {
+                       DBG_871X("Unable to create_proc_read_entry!\n"); 
+                       return;
+               }
+       }
+-      
+-
+       if(padapter->dir_dev == NULL)
+       {
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+               padapter->dir_dev = create_proc_entry(dev->name, 
+                                         S_IFDIR | S_IRUGO | S_IXUGO, 
+                                         rtw_proc);
+-
++#else
++              padapter->dir_dev = proc_mkdir(dev->name,rtw_proc);
++#endif
+               dir_dev = padapter->dir_dev;
+               if(dir_dev==NULL)
+@@ -324,84 +573,127 @@ void rtw_proc_init_one(struct net_device *dev)
+       rtw_proc_cnt++;
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry = create_proc_read_entry("write_reg", S_IFREG | S_IRUGO,
+                                  dir_dev, proc_get_write_reg, dev);                              
++#else
++      entry = proc_create_data("write_reg", S_IFREG | S_IRUGO,
++                                 dir_dev, &proc_get_write_reg_fops, dev);                                
++#endif
+       if (!entry) {
+               DBG_871X("Unable to create_proc_read_entry!\n"); 
+               return;
+       }
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry->write_proc = proc_set_write_reg;
+       entry = create_proc_read_entry("read_reg", S_IFREG | S_IRUGO,
+                                  dir_dev, proc_get_read_reg, dev);                               
++#else
++      entry = proc_create_data("read_reg", S_IFREG | S_IRUGO,
++                                 dir_dev, &proc_get_read_reg_fops, dev);                                 
++#endif
+       if (!entry) {
+               DBG_871X("Unable to create_proc_read_entry!\n"); 
+               return;
+       }
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry->write_proc = proc_set_read_reg;
+-      
+       entry = create_proc_read_entry("fwstate", S_IFREG | S_IRUGO,
+                                  dir_dev, proc_get_fwstate, dev);                                
++#else
++      entry = proc_create_data("fwstate", S_IFREG | S_IRUGO,
++                                 dir_dev, &proc_get_fwstate_fops, dev);                                  
++#endif
+       if (!entry) {
+               DBG_871X("Unable to create_proc_read_entry!\n"); 
+               return;
+       }
+-
+-
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry = create_proc_read_entry("sec_info", S_IFREG | S_IRUGO,
+                                  dir_dev, proc_get_sec_info, dev);                               
++#else
++      entry = proc_create_data("sec_info", S_IFREG | S_IRUGO,
++                                 dir_dev, &proc_get_sec_info_fops, dev);                                 
++#endif
+       if (!entry) {
+               DBG_871X("Unable to create_proc_read_entry!\n"); 
+               return;
+       }
+-
+-
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry = create_proc_read_entry("mlmext_state", S_IFREG | S_IRUGO,
+                                  dir_dev, proc_get_mlmext_state, dev);                                   
++#else
++      entry = proc_create_data("mlmext_state", S_IFREG | S_IRUGO,
++                                 dir_dev, &proc_get_mlmext_state_fops, dev);                             
++#endif
+       if (!entry) {
+               DBG_871X("Unable to create_proc_read_entry!\n"); 
+               return;
+       }
+-
+-
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry = create_proc_read_entry("qos_option", S_IFREG | S_IRUGO,
+                                  dir_dev, proc_get_qos_option, dev);                             
++#else
++      entry = proc_create_data("qos_option", S_IFREG | S_IRUGO,
++                                 dir_dev, &proc_get_qos_option_fops, dev);                               
++#endif
+       if (!entry) {
+               DBG_871X("Unable to create_proc_read_entry!\n"); 
+               return;
+       }
+-
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry = create_proc_read_entry("ht_option", S_IFREG | S_IRUGO,
+                                  dir_dev, proc_get_ht_option, dev);                              
++#else
++      entry = proc_create_data("ht_option", S_IFREG | S_IRUGO,
++                                 dir_dev, &proc_get_ht_option_fops, dev);                                
++#endif
+       if (!entry) {
+               DBG_871X("Unable to create_proc_read_entry!\n"); 
+               return;
+       }
+-
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry = create_proc_read_entry("rf_info", S_IFREG | S_IRUGO,
+                                  dir_dev, proc_get_rf_info, dev);                                
++#else
++      entry = proc_create_data("rf_info", S_IFREG | S_IRUGO,
++                                 dir_dev, &proc_get_rf_info_fops, dev);                                  
++#endif
+       if (!entry) {
+               DBG_871X("Unable to create_proc_read_entry!\n"); 
+               return;
+       }
+-      
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry = create_proc_read_entry("ap_info", S_IFREG | S_IRUGO,
+                                  dir_dev, proc_get_ap_info, dev);                                
++#else
++      entry = proc_create_data("ap_info", S_IFREG | S_IRUGO,
++                                 dir_dev, &proc_get_ap_info_fops, dev);                                  
++#endif
+       if (!entry) {
+               DBG_871X("Unable to create_proc_read_entry!\n"); 
+               return;
+       }
+-
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry = create_proc_read_entry("adapter_state", S_IFREG | S_IRUGO,
+                                  dir_dev, proc_get_adapter_state, dev);                                  
++#else
++      entry = proc_create_data("adapter_state", S_IFREG | S_IRUGO,
++                                 dir_dev, &proc_get_adapter_state_fops, dev);                            
++#endif
+       if (!entry) {
+               DBG_871X("Unable to create_proc_read_entry!\n"); 
+               return;
+       }
+-
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry = create_proc_read_entry("trx_info", S_IFREG | S_IRUGO,
+                                  dir_dev, proc_get_trx_info, dev);                               
++#else
++      entry = proc_create_data("trx_info", S_IFREG | S_IRUGO,
++                                 dir_dev, &proc_get_trx_info_fops, dev);                                 
++#endif
+       if (!entry) {
+               DBG_871X("Unable to create_proc_read_entry!\n"); 
+               return;
+@@ -409,56 +701,93 @@ void rtw_proc_init_one(struct net_device *dev)
+ #ifdef CONFIG_AP_MODE
++# if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry = create_proc_read_entry("all_sta_info", S_IFREG | S_IRUGO,
+                                  dir_dev, proc_get_all_sta_info, dev);                                   
++# else
++      entry = proc_create_data("all_sta_info", S_IFREG | S_IRUGO,
++                                 dir_dev, &proc_get_all_sta_info_fops, dev);                             
++# endif
+       if (!entry) {
+               DBG_871X("Unable to create_proc_read_entry!\n"); 
+               return;
+       }
++
+ #endif
+ #ifdef DBG_MEMORY_LEAK
++
++# if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry = create_proc_read_entry("_malloc_cnt", S_IFREG | S_IRUGO,
+                                  dir_dev, proc_get_malloc_cnt, dev);                             
++# else
++      entry = proc_create_data("_malloc_cnt", S_IFREG | S_IRUGO,
++                                 dir_dev, &proc_get_malloc_cnt_fops, dev);                               
++# endif
+       if (!entry) {
+               DBG_871X("Unable to create_proc_read_entry!\n"); 
+               return;
+       }
++
+ #endif
+ #ifdef CONFIG_FIND_BEST_CHANNEL
++
++# if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry = create_proc_read_entry("best_channel", S_IFREG | S_IRUGO,
+                                  dir_dev, proc_get_best_channel, dev);                                   
++# else
++      entry = proc_create_data("best_channel", S_IFREG | S_IRUGO,
++                                 dir_dev, &proc_get_best_channel_fops, dev);                             
++# endif
+       if (!entry) {
+               DBG_871X("Unable to create_proc_read_entry!\n"); 
+               return;
+       }
++
+ #endif
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry = create_proc_read_entry("rx_signal", S_IFREG | S_IRUGO,
+                                  dir_dev, proc_get_rx_signal, dev);                              
++#else
++      entry = proc_create_data("rx_signal", S_IFREG | S_IRUGO,
++                                 dir_dev, &proc_get_rx_signal_fops, dev);                                
++#endif
+       if (!entry) {
+               DBG_871X("Unable to create_proc_read_entry!\n"); 
+               return;
+       }
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry->write_proc = proc_set_rx_signal;
+       entry = create_proc_read_entry("ampdu_enable", S_IFREG | S_IRUGO,
+                                  dir_dev, proc_get_ampdu_enable, dev);                                   
++#else
++      entry = proc_create_data("ampdu_enable", S_IFREG | S_IRUGO,
++                                 dir_dev, &proc_get_ampdu_enable_fops, dev);                             
++#endif
+       if (!entry) {
+               DBG_871X("Unable to create_proc_read_entry!\n"); 
+               return;
+       }
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry->write_proc = proc_set_ampdu_enable;
+       entry = create_proc_read_entry("rssi_disp", S_IFREG | S_IRUGO,
+                                  dir_dev, proc_get_rssi_disp, dev);                              
++#else
++      entry = proc_create_data("rssi_disp", S_IFREG | S_IRUGO,
++                                 dir_dev, &proc_get_rssi_disp_fops, dev);                                
++#endif
+       if (!entry) {
+               DBG_871X("Unable to create_proc_read_entry!\n"); 
+               return;
+       }
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+       entry->write_proc = proc_set_rssi_disp;
+-
++#endif
+ }
+ void rtw_proc_remove_one(struct net_device *dev)
+@@ -797,27 +1126,22 @@ u32 rtw_start_drv_threads(_adapter *padapter)
+       RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_start_drv_threads\n"));
+ #ifdef CONFIG_SDIO_HCI
+-      padapter->xmitThread = kernel_thread(rtw_xmit_thread, padapter, CLONE_FS|CLONE_FILES);
+-      if(padapter->xmitThread < 0)
++      if(!start_kthread(&padapter->xmitThread, rtw_xmit_thread, padapter, "8192cu-xmit"))
+               _status = _FAIL;
+ #endif
+ #ifdef CONFIG_RECV_THREAD_MODE
+-      padapter->recvThread = kernel_thread(recv_thread, padapter, CLONE_FS|CLONE_FILES);
+-      if(padapter->recvThread < 0)
++      if(!start_kthread(&padapter->recvThread, recv_thread, padapter, "8192cu-recv"))
+               _status = _FAIL;        
+ #endif
+-      padapter->cmdThread = kernel_thread(rtw_cmd_thread, padapter, CLONE_FS|CLONE_FILES);
+-      if(padapter->cmdThread < 0)
++      if(!start_kthread(&padapter->cmdThread, rtw_cmd_thread, padapter, "8192cu-cmd"))
+               _status = _FAIL;
+       else
+               _rtw_down_sema(&padapter->cmdpriv.terminate_cmdthread_sema); //wait for cmd_thread to run
+-              
+ #ifdef CONFIG_EVENT_THREAD_MODE
+-      padapter->evtThread = kernel_thread(event_thread, padapter, CLONE_FS|CLONE_FILES);
+-      if(padapter->evtThread < 0)
++      if(!start_kthread(&padapter->evtThread, event_thread, padapter, "8192cu-evt"))
+               _status = _FAIL;                
+ #endif
+diff --git a/os_dep/linux/usb_intf.c b/os_dep/linux/usb_intf.c
+index 134acdc..f9a01e9 100644
+--- a/os_dep/linux/usb_intf.c
++++ b/os_dep/linux/usb_intf.c
+@@ -99,7 +99,9 @@ static struct usb_device_id rtw_usb_id_tbl[] ={
+       {USB_DEVICE(0x2019, 0xED17)},//PCI - Edimax
+       {USB_DEVICE(0x0DF6, 0x0052)},//Sitecom - Edimax
+       {USB_DEVICE(0x7392, 0x7811)},//Edimax - Edimax
++      {USB_DEVICE(0x07B8, 0x8188)},//Abocom - Abocom
+       {USB_DEVICE(0x07B8, 0x8189)},//Abocom - Abocom
++      {USB_DEVICE(0x0846, 0x9041)},//NetGear WNA1000M
+       {USB_DEVICE(0x0EB0, 0x9071)},//NO Brand - Etop
+       {USB_DEVICE(0x06F8, 0xE033)},//Hercules - Edimax
+       {USB_DEVICE(0x103C, 0x1629)},//HP - Lite-On ,8188CUS Slim Combo
+@@ -137,6 +139,7 @@ static struct usb_device_id rtw_usb_id_tbl[] ={
+       {USB_DEVICE(0x2001, 0x3307)},//D-Link - Cameo
+       {USB_DEVICE(0x2001, 0x330A)},//D-Link - Alpha
+       {USB_DEVICE(0x2001, 0x3309)},//D-Link - Alpha
++      {USB_DEVICE(0x2001, 0x330D)},//D-Link - Alpha(?)
+       {USB_DEVICE(0x0586, 0x341F)},//Zyxel - Abocom
+       {USB_DEVICE(0x7392, 0x7822)},//Edimax - Edimax
+       {USB_DEVICE(0x2019, 0xAB2B)},//Planex - Abocom
+diff --git a/os_dep/osdep_service.c b/os_dep/osdep_service.c
+index 04cb35f..343cd82 100644
+--- a/os_dep/osdep_service.c
++++ b/os_dep/osdep_service.c
+@@ -1553,3 +1553,19 @@ u64 rtw_division64(u64 x, u64 y)
+ #endif
+ }
++#ifdef PLATFORM_LINUX
++int start_kthread(_thread_hdl_ *t_hdl, int (*threadfn)(void *data),
++                void *data, const char *name)
++{
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0))
++      *t_hdl = kernel_thread(threadfn, data, CLONE_FS|CLONE_FILES);
++      if(*t_hdl < 0)
++#else
++      *t_hdl = kthread_run(threadfn, data, name);
++      if(IS_ERR(*t_hdl))
++#endif
++              return 0;
++      return -1;
++}
++#endif
++