Stefan Sperling wrote:
> The problem seems to be that iwm's various tasks will sleep while waiting
> for a device command to finish. If an ioctl process now sneaks in it will
> trigger new commands to be sent in parallel, which the hardware does not like.
> 
> I see one way of fixing this: grab the ioctl lock in all of iwm's tasks.
> With this patch I cannot reproduce the problem anymore.

This sounds a little backwards. The ioctl should queue a task, then wait for
the result.

So you'd have:

iwm_ioctl() {
        case SETRATES:
                task.wait = "setrates"
                task.params = whatever_else;
                task_queue(&task);
                tsleep(&task.wait);

iwm_setrates_task() {
        /* do the thing */
        if (task.wait)
                wakeup(task.wait);

Reply via email to