+++ /dev/null
-################################################################################
-# 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
-+