diff options
| -rw-r--r-- | drivers/misc/mei/interrupt.c | 63 |
1 files changed, 30 insertions, 33 deletions
diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c index 92d762100268..b4afc1211fd2 100644 --- a/drivers/misc/mei/interrupt.c +++ b/drivers/misc/mei/interrupt.c | |||
| @@ -299,27 +299,25 @@ static int _mei_irq_thread_close(struct mei_device *dev, s32 *slots, | |||
| 299 | struct mei_cl *cl, | 299 | struct mei_cl *cl, |
| 300 | struct mei_io_list *cmpl_list) | 300 | struct mei_io_list *cmpl_list) |
| 301 | { | 301 | { |
| 302 | if ((*slots * sizeof(u32)) >= (sizeof(struct mei_msg_hdr) + | 302 | if ((*slots * sizeof(u32)) < (sizeof(struct mei_msg_hdr) + |
| 303 | sizeof(struct hbm_client_disconnect_request))) { | 303 | sizeof(struct hbm_client_disconnect_request))) |
| 304 | *slots -= mei_data2slots(sizeof(struct hbm_client_disconnect_request)); | 304 | return -EBADMSG; |
| 305 | 305 | ||
| 306 | if (mei_disconnect(dev, cl)) { | 306 | *slots -= mei_data2slots(sizeof(struct hbm_client_disconnect_request)); |
| 307 | cl->status = 0; | 307 | |
| 308 | cb_pos->information = 0; | 308 | if (mei_disconnect(dev, cl)) { |
| 309 | list_move_tail(&cb_pos->cb_list, | 309 | cl->status = 0; |
| 310 | &cmpl_list->mei_cb.cb_list); | 310 | cb_pos->information = 0; |
| 311 | return -EMSGSIZE; | 311 | list_move_tail(&cb_pos->cb_list, |
| 312 | } else { | 312 | &cmpl_list->mei_cb.cb_list); |
| 313 | cl->state = MEI_FILE_DISCONNECTING; | 313 | return -EMSGSIZE; |
| 314 | cl->status = 0; | ||
| 315 | cb_pos->information = 0; | ||
| 316 | list_move_tail(&cb_pos->cb_list, | ||
| 317 | &dev->ctrl_rd_list.mei_cb.cb_list); | ||
| 318 | cl->timer_count = MEI_CONNECT_TIMEOUT; | ||
| 319 | } | ||
| 320 | } else { | 314 | } else { |
| 321 | /* return the cancel routine */ | 315 | cl->state = MEI_FILE_DISCONNECTING; |
| 322 | return -EBADMSG; | 316 | cl->status = 0; |
| 317 | cb_pos->information = 0; | ||
| 318 | list_move_tail(&cb_pos->cb_list, | ||
| 319 | &dev->ctrl_rd_list.mei_cb.cb_list); | ||
| 320 | cl->timer_count = MEI_CONNECT_TIMEOUT; | ||
| 323 | } | 321 | } |
| 324 | 322 | ||
| 325 | return 0; | 323 | return 0; |
| @@ -869,26 +867,25 @@ static int _mei_irq_thread_ioctl(struct mei_device *dev, s32 *slots, | |||
| 869 | struct mei_cl *cl, | 867 | struct mei_cl *cl, |
| 870 | struct mei_io_list *cmpl_list) | 868 | struct mei_io_list *cmpl_list) |
| 871 | { | 869 | { |
| 872 | if ((*slots * sizeof(u32)) >= (sizeof(struct mei_msg_hdr) + | 870 | if ((*slots * sizeof(u32)) < (sizeof(struct mei_msg_hdr) + |
| 873 | sizeof(struct hbm_client_connect_request))) { | 871 | sizeof(struct hbm_client_connect_request))) { |
| 874 | cl->state = MEI_FILE_CONNECTING; | ||
| 875 | *slots -= mei_data2slots(sizeof(struct hbm_client_connect_request)); | ||
| 876 | if (mei_connect(dev, cl)) { | ||
| 877 | cl->status = -ENODEV; | ||
| 878 | cb_pos->information = 0; | ||
| 879 | list_del(&cb_pos->cb_list); | ||
| 880 | return -ENODEV; | ||
| 881 | } else { | ||
| 882 | list_move_tail(&cb_pos->cb_list, | ||
| 883 | &dev->ctrl_rd_list.mei_cb.cb_list); | ||
| 884 | cl->timer_count = MEI_CONNECT_TIMEOUT; | ||
| 885 | } | ||
| 886 | } else { | ||
| 887 | /* return the cancel routine */ | 872 | /* return the cancel routine */ |
| 888 | list_del(&cb_pos->cb_list); | 873 | list_del(&cb_pos->cb_list); |
| 889 | return -EBADMSG; | 874 | return -EBADMSG; |
| 890 | } | 875 | } |
| 891 | 876 | ||
| 877 | cl->state = MEI_FILE_CONNECTING; | ||
| 878 | *slots -= mei_data2slots(sizeof(struct hbm_client_connect_request)); | ||
| 879 | if (mei_connect(dev, cl)) { | ||
| 880 | cl->status = -ENODEV; | ||
| 881 | cb_pos->information = 0; | ||
| 882 | list_del(&cb_pos->cb_list); | ||
| 883 | return -ENODEV; | ||
| 884 | } else { | ||
| 885 | list_move_tail(&cb_pos->cb_list, | ||
| 886 | &dev->ctrl_rd_list.mei_cb.cb_list); | ||
| 887 | cl->timer_count = MEI_CONNECT_TIMEOUT; | ||
| 888 | } | ||
| 892 | return 0; | 889 | return 0; |
| 893 | } | 890 | } |
| 894 | 891 | ||
