#include "rtmp_type.h"
 #include <linux/module.h>
 #include <linux/kernel.h>
-#if !defined(RT2860) && !defined(RT30xx)
-#include <linux/kthread.h>
-#endif
 
 #include <linux/spinlock.h>
 #include <linux/init.h>
 
 #ifndef RT30xx
 typedef        struct pid *    THREAD_PID;
-#ifdef RT2860
 #define        THREAD_PID_INIT_VALUE   NULL
-#endif
 #define        GET_PID(_v)     find_get_pid(_v)
 #define        GET_PID_NUMBER(_v)      pid_nr(_v)
 #define CHECK_PID_LEGALITY(_pid)       if (pid_nr(_pid) >= 0)
        dma_addr_t                              pAd_pa;
 #endif
 #ifdef RT2870
-       struct usb_device       *pUsb_Dev;
+       struct usb_device               *pUsb_Dev;
 
 #ifndef RT30xx
-       struct task_struct      *MLMEThr_task;
-       struct task_struct      *RTUSBCmdThr_task;
-       struct task_struct      *TimerQThr_task;
+       THREAD_PID                              MLMEThr_pid;
+       THREAD_PID                              RTUSBCmdThr_pid;
+       THREAD_PID                              TimerQThr_pid;
 #endif
 #ifdef RT30xx
        struct pid      *MLMEThr_pid;
 
        DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__func__));
 
 #ifndef RT30xx
-       pObj->MLMEThr_task = NULL;
+       pObj->MLMEThr_pid = THREAD_PID_INIT_VALUE;
 #endif
 #ifdef RT30xx
        pObj->MLMEThr_pid = NULL;
        DBGPRINT(RT_DEBUG_TRACE,( "<---RTUSBCmdThread\n"));
 
 #ifndef RT30xx
-       pObj->RTUSBCmdThr_task = NULL;
+       pObj->RTUSBCmdThr_pid = THREAD_PID_INIT_VALUE;
 #endif
 #ifdef RT30xx
        pObj->RTUSBCmdThr_pid = NULL;
        DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__func__));
 
 #ifndef RT30xx
-       pObj->TimerQThr_task = NULL;
+       pObj->TimerQThr_pid = THREAD_PID_INIT_VALUE;
 #endif
 #ifdef RT30xx
        pObj->TimerQThr_pid = NULL;
 
        // Terminate Threads
 #ifndef RT30xx
-       BUG_ON(pObj->TimerQThr_task == NULL);
-       CHECK_PID_LEGALITY(task_pid(pObj->TimerQThr_task))
+       CHECK_PID_LEGALITY(pObj->TimerQThr_pid)
        {
                POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
 
-               printk(KERN_DEBUG "Terminate the TimerQThr pid=%d!\n",
-                       pid_nr(task_pid(pObj->TimerQThr_task)));
+               printk("Terminate the TimerQThr_pid=%d!\n", GET_PID_NUMBER(pObj->TimerQThr_pid));
                mb();
                pAd->TimerFunc_kill = 1;
                mb();
-               kthread_stop(pObj->TimerQThr_task);
-               pObj->TimerQThr_task = NULL;
+               ret = KILL_THREAD_PID(pObj->TimerQThr_pid, SIGTERM, 1);
+               if (ret)
+               {
+                       printk(KERN_WARNING "%s: unable to stop TimerQThread, pid=%d, ret=%d!\n",
+                                       pAd->net_dev->name, GET_PID_NUMBER(pObj->TimerQThr_pid), ret);
+               }
+               else
+               {
+                       wait_for_completion(&pAd->TimerQComplete);
+                       pObj->TimerQThr_pid = THREAD_PID_INIT_VALUE;
+               }
        }
 
-       BUG_ON(pObj->MLMEThr_task == NULL);
-       CHECK_PID_LEGALITY(task_pid(pObj->MLMEThr_task))
+       CHECK_PID_LEGALITY(pObj->MLMEThr_pid)
        {
-               printk(KERN_DEBUG "Terminate the MLMEThr pid=%d!\n",
-                       pid_nr(task_pid(pObj->MLMEThr_task)));
+               printk("Terminate the MLMEThr_pid=%d!\n", GET_PID_NUMBER(pObj->MLMEThr_pid));
                mb();
                pAd->mlme_kill = 1;
                //RT28XX_MLME_HANDLER(pAd);
                mb();
-               kthread_stop(pObj->MLMEThr_task);
-               pObj->MLMEThr_task = NULL;
+               ret = KILL_THREAD_PID(pObj->MLMEThr_pid, SIGTERM, 1);
+               if (ret)
+               {
+                       printk (KERN_WARNING "%s: unable to Mlme thread, pid=%d, ret=%d!\n",
+                                       pAd->net_dev->name, GET_PID_NUMBER(pObj->MLMEThr_pid), ret);
+               }
+               else
+               {
+                       //wait_for_completion (&pAd->notify);
+                       wait_for_completion (&pAd->mlmeComplete);
+                       pObj->MLMEThr_pid = THREAD_PID_INIT_VALUE;
+               }
        }
 
-       BUG_ON(pObj->RTUSBCmdThr_task == NULL);
-       CHECK_PID_LEGALITY(task_pid(pObj->RTUSBCmdThr_task))
+       CHECK_PID_LEGALITY(pObj->RTUSBCmdThr_pid)
        {
-               printk(KERN_DEBUG "Terminate the RTUSBCmdThr pid=%d!\n",
-                       pid_nr(task_pid(pObj->RTUSBCmdThr_task)));
+               printk("Terminate the RTUSBCmdThr_pid=%d!\n", GET_PID_NUMBER(pObj->RTUSBCmdThr_pid));
                mb();
                NdisAcquireSpinLock(&pAd->CmdQLock);
                pAd->CmdQ.CmdQState = RT2870_THREAD_STOPED;
                NdisReleaseSpinLock(&pAd->CmdQLock);
                mb();
                //RTUSBCMDUp(pAd);
-               kthread_stop(pObj->RTUSBCmdThr_task);
-               pObj->RTUSBCmdThr_task = NULL;
+               ret = KILL_THREAD_PID(pObj->RTUSBCmdThr_pid, SIGTERM, 1);
+               if (ret)
+               {
+                       printk(KERN_WARNING "%s: unable to RTUSBCmd thread, pid=%d, ret=%d!\n",
+                                       pAd->net_dev->name, GET_PID_NUMBER(pObj->RTUSBCmdThr_pid), ret);
+               }
+               else
+               {
+                       //wait_for_completion (&pAd->notify);
+                       wait_for_completion (&pAd->CmdQComplete);
+                       pObj->RTUSBCmdThr_pid = THREAD_PID_INIT_VALUE;
+               }
        }
 #endif
 #ifdef RT30xx
                        dev_p->descriptor.idProduct == rtusb_usb_id[i].idProduct)
                {
 #ifndef RT30xx
-                       printk(KERN_DEBUG "rt2870: idVendor = 0x%x, idProduct = 0x%x\n",
+                       printk("rt2870: idVendor = 0x%x, idProduct = 0x%x\n",
 #endif
 #ifdef RT30xx
                        printk("rt2870: idVendor = 0x%x, idProduct = 0x%x\n",
 
        usb_dev = pObj->pUsb_Dev;
 
 #ifndef RT30xx
-       pObj->MLMEThr_task              = NULL;
-       pObj->RTUSBCmdThr_task  = NULL;
+       pObj->MLMEThr_pid               = THREAD_PID_INIT_VALUE;
+       pObj->RTUSBCmdThr_pid   = THREAD_PID_INIT_VALUE;
 #endif
 #ifdef RT30xx
        pObj->MLMEThr_pid       = NULL;
        PRTMP_ADAPTER pAd = net_dev->ml_priv;
        POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
 #ifndef RT30xx
-       struct task_struct *tsk;
+       pid_t pid_number = -1;
 #endif
 #ifdef RT30xx
        pid_t pid_number;
 
        // Creat MLME Thread
 #ifndef RT30xx
-       pObj->MLMEThr_task = NULL;
-       tsk = kthread_run(MlmeThread, pAd, "%s", pAd->net_dev->name);
-
-       if (IS_ERR(tsk)) {
+       pObj->MLMEThr_pid= THREAD_PID_INIT_VALUE;
+       pid_number = kernel_thread(MlmeThread, pAd, CLONE_VM);
+       if (pid_number < 0)
+       {
 #endif
 #ifdef RT30xx
        pObj->MLMEThr_pid = NULL;
        }
 
 #ifndef RT30xx
-       pObj->MLMEThr_task = tsk;
+       pObj->MLMEThr_pid = GET_PID(pid_number);
 #endif
 #ifdef RT30xx
        pObj->MLMEThr_pid = find_get_pid(pid_number);
 
        // Creat Command Thread
 #ifndef RT30xx
-       pObj->RTUSBCmdThr_task = NULL;
-       tsk = kthread_run(RTUSBCmdThread, pAd, "%s", pAd->net_dev->name);
-
-       if (IS_ERR(tsk) < 0)
+       pObj->RTUSBCmdThr_pid= THREAD_PID_INIT_VALUE;
+       pid_number = kernel_thread(RTUSBCmdThread, pAd, CLONE_VM);
+       if (pid_number < 0)
 #endif
 #ifdef RT30xx
        pObj->RTUSBCmdThr_pid = NULL;
        }
 
 #ifndef RT30xx
-       pObj->RTUSBCmdThr_task = tsk;
+       pObj->RTUSBCmdThr_pid = GET_PID(pid_number);
 #endif
 #ifdef RT30xx
        pObj->RTUSBCmdThr_pid = find_get_pid(pid_number);
        wait_for_completion(&(pAd->CmdQComplete));
 
 #ifndef RT30xx
-       pObj->TimerQThr_task = NULL;
-       tsk = kthread_run(TimerQThread, pAd, "%s", pAd->net_dev->name);
-       if (IS_ERR(tsk) < 0)
+       pObj->TimerQThr_pid= THREAD_PID_INIT_VALUE;
+       pid_number = kernel_thread(TimerQThread, pAd, CLONE_VM);
+       if (pid_number < 0)
 #endif
 #ifdef RT30xx
        pObj->TimerQThr_pid = NULL;
                return NDIS_STATUS_FAILURE;
        }
 #ifndef RT30xx
-       pObj->TimerQThr_task = tsk;
+       pObj->TimerQThr_pid = GET_PID(pid_number);
 #endif
 #ifdef RT30xx
        pObj->TimerQThr_pid = find_get_pid(pid_number);