.. | .. |
---|
43 | 43 | |
---|
44 | 44 | enum mrpc_state state; |
---|
45 | 45 | |
---|
46 | | - struct completion comp; |
---|
| 46 | + wait_queue_head_t cmd_comp; |
---|
47 | 47 | struct kref kref; |
---|
48 | 48 | struct list_head list; |
---|
49 | 49 | |
---|
| 50 | + bool cmd_done; |
---|
50 | 51 | u32 cmd; |
---|
51 | 52 | u32 status; |
---|
52 | 53 | u32 return_code; |
---|
.. | .. |
---|
68 | 69 | stuser->stdev = stdev; |
---|
69 | 70 | kref_init(&stuser->kref); |
---|
70 | 71 | INIT_LIST_HEAD(&stuser->list); |
---|
71 | | - init_completion(&stuser->comp); |
---|
| 72 | + init_waitqueue_head(&stuser->cmd_comp); |
---|
72 | 73 | stuser->event_cnt = atomic_read(&stdev->event_cnt); |
---|
73 | 74 | |
---|
74 | 75 | dev_dbg(&stdev->dev, "%s: %p\n", __func__, stuser); |
---|
.. | .. |
---|
147 | 148 | kref_get(&stuser->kref); |
---|
148 | 149 | stuser->read_len = sizeof(stuser->data); |
---|
149 | 150 | stuser_set_state(stuser, MRPC_QUEUED); |
---|
150 | | - reinit_completion(&stuser->comp); |
---|
| 151 | + stuser->cmd_done = false; |
---|
151 | 152 | list_add_tail(&stuser->list, &stdev->mrpc_queue); |
---|
152 | 153 | |
---|
153 | 154 | mrpc_cmd_submit(stdev); |
---|
.. | .. |
---|
184 | 185 | stuser->read_len); |
---|
185 | 186 | |
---|
186 | 187 | out: |
---|
187 | | - complete_all(&stuser->comp); |
---|
| 188 | + stuser->cmd_done = true; |
---|
| 189 | + wake_up_interruptible(&stuser->cmd_comp); |
---|
188 | 190 | list_del_init(&stuser->list); |
---|
189 | 191 | stuser_put(stuser); |
---|
190 | 192 | stdev->mrpc_busy = 0; |
---|
.. | .. |
---|
354 | 356 | return PTR_ERR(stuser); |
---|
355 | 357 | |
---|
356 | 358 | filp->private_data = stuser; |
---|
357 | | - nonseekable_open(inode, filp); |
---|
| 359 | + stream_open(inode, filp); |
---|
358 | 360 | |
---|
359 | 361 | dev_dbg(&stdev->dev, "%s: %p\n", __func__, stuser); |
---|
360 | 362 | |
---|
.. | .. |
---|
454 | 456 | mutex_unlock(&stdev->mrpc_mutex); |
---|
455 | 457 | |
---|
456 | 458 | if (filp->f_flags & O_NONBLOCK) { |
---|
457 | | - if (!try_wait_for_completion(&stuser->comp)) |
---|
| 459 | + if (!READ_ONCE(stuser->cmd_done)) |
---|
458 | 460 | return -EAGAIN; |
---|
459 | 461 | } else { |
---|
460 | | - rc = wait_for_completion_interruptible(&stuser->comp); |
---|
| 462 | + rc = wait_event_interruptible(stuser->cmd_comp, |
---|
| 463 | + stuser->cmd_done); |
---|
461 | 464 | if (rc < 0) |
---|
462 | 465 | return rc; |
---|
463 | 466 | } |
---|
.. | .. |
---|
505 | 508 | struct switchtec_dev *stdev = stuser->stdev; |
---|
506 | 509 | __poll_t ret = 0; |
---|
507 | 510 | |
---|
508 | | - poll_wait(filp, &stuser->comp.wait, wait); |
---|
| 511 | + poll_wait(filp, &stuser->cmd_comp, wait); |
---|
509 | 512 | poll_wait(filp, &stdev->event_wq, wait); |
---|
510 | 513 | |
---|
511 | 514 | if (lock_mutex_and_test_alive(stdev)) |
---|
.. | .. |
---|
513 | 516 | |
---|
514 | 517 | mutex_unlock(&stdev->mrpc_mutex); |
---|
515 | 518 | |
---|
516 | | - if (try_wait_for_completion(&stuser->comp)) |
---|
| 519 | + if (READ_ONCE(stuser->cmd_done)) |
---|
517 | 520 | ret |= EPOLLIN | EPOLLRDNORM; |
---|
518 | 521 | |
---|
519 | 522 | if (stuser->event_cnt != atomic_read(&stdev->event_cnt)) |
---|
.. | .. |
---|
1037 | 1040 | |
---|
1038 | 1041 | /* Wake up and kill any users waiting on an MRPC request */ |
---|
1039 | 1042 | list_for_each_entry_safe(stuser, tmpuser, &stdev->mrpc_queue, list) { |
---|
1040 | | - complete_all(&stuser->comp); |
---|
| 1043 | + stuser->cmd_done = true; |
---|
| 1044 | + wake_up_interruptible(&stuser->cmd_comp); |
---|
1041 | 1045 | list_del_init(&stuser->list); |
---|
1042 | 1046 | stuser_put(stuser); |
---|
1043 | 1047 | } |
---|