for(;;) {
                US_DEBUGP("*** thread sleeping.\n");
-               if(down_interruptible(&us->sema))
+               if (wait_for_completion_interruptible(&us->cmnd_ready))
                        break;
-                       
+
                US_DEBUGP("*** thread awakened.\n");
 
                /* lock the device pointers */
         */
        US_DEBUGP("-- sending exit command to thread\n");
        set_bit(US_FLIDX_DISCONNECTING, &us->dflags);
-       up(&us->sema);
+       complete(&us->cmnd_ready);
        if (us->ctl_thread)
                kthread_stop(us->ctl_thread);
 
        us = host_to_us(host);
        memset(us, 0, sizeof(struct us_data));
        mutex_init(&(us->dev_mutex));
-       init_MUTEX_LOCKED(&(us->sema));
+       init_completion(&us->cmnd_ready);
        init_completion(&(us->notify));
        init_waitqueue_head(&us->delay_wait);
        init_completion(&us->scanning_done);
 
        struct task_struct      *ctl_thread;     /* the control thread   */
 
        /* mutual exclusion and synchronization structures */
-       struct semaphore        sema;            /* to sleep thread on      */
+       struct completion       cmnd_ready;      /* to sleep thread on      */
        struct completion       notify;          /* thread begin/end        */
        wait_queue_head_t       delay_wait;      /* wait during scan, reset */
        struct completion       scanning_done;   /* wait for scan thread    */