diff options
Diffstat (limited to 'drivers/misc/mei/interrupt.c')
-rw-r--r-- | drivers/misc/mei/interrupt.c | 36 |
1 files changed, 14 insertions, 22 deletions
diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c index 14becc0d5563..92246465ea11 100644 --- a/drivers/misc/mei/interrupt.c +++ b/drivers/misc/mei/interrupt.c | |||
@@ -446,15 +446,14 @@ static void mei_client_disconnect_request(struct mei_device *dev, | |||
446 | dev->iamthif_timer = 0; | 446 | dev->iamthif_timer = 0; |
447 | 447 | ||
448 | /* prepare disconnect response */ | 448 | /* prepare disconnect response */ |
449 | (void)mei_hbm_hdr(&dev->ext_msg_buf[0], len); | 449 | (void)mei_hbm_hdr((u32 *)&dev->wr_ext_msg.hdr, len); |
450 | disconnect_res = | 450 | disconnect_res = |
451 | (struct hbm_client_connect_response *) | 451 | (struct hbm_client_connect_response *) |
452 | &dev->ext_msg_buf[1]; | 452 | &dev->wr_ext_msg.data; |
453 | disconnect_res->hbm_cmd = CLIENT_DISCONNECT_RES_CMD; | 453 | disconnect_res->hbm_cmd = CLIENT_DISCONNECT_RES_CMD; |
454 | disconnect_res->host_addr = pos->host_client_id; | 454 | disconnect_res->host_addr = pos->host_client_id; |
455 | disconnect_res->me_addr = pos->me_client_id; | 455 | disconnect_res->me_addr = pos->me_client_id; |
456 | disconnect_res->status = 0; | 456 | disconnect_res->status = 0; |
457 | dev->extra_write_index = 2; | ||
458 | break; | 457 | break; |
459 | } | 458 | } |
460 | } | 459 | } |
@@ -643,16 +642,13 @@ static void mei_irq_thread_read_bus_message(struct mei_device *dev, | |||
643 | { | 642 | { |
644 | /* prepare stop request: sent in next interrupt event */ | 643 | /* prepare stop request: sent in next interrupt event */ |
645 | 644 | ||
646 | u32 *buf = dev->ext_msg_buf; | ||
647 | const size_t len = sizeof(struct hbm_host_stop_request); | 645 | const size_t len = sizeof(struct hbm_host_stop_request); |
648 | 646 | ||
649 | mei_hdr = mei_hbm_hdr(&buf[0], len); | 647 | mei_hdr = mei_hbm_hdr((u32 *)&dev->wr_ext_msg.hdr, len); |
650 | stop_req = (struct hbm_host_stop_request *)&buf[1]; | 648 | stop_req = (struct hbm_host_stop_request *)&dev->wr_ext_msg.data; |
651 | memset(stop_req, 0, len); | 649 | memset(stop_req, 0, len); |
652 | stop_req->hbm_cmd = HOST_STOP_REQ_CMD; | 650 | stop_req->hbm_cmd = HOST_STOP_REQ_CMD; |
653 | stop_req->reason = DRIVER_STOP_REQUEST; | 651 | stop_req->reason = DRIVER_STOP_REQUEST; |
654 | |||
655 | dev->extra_write_index = 2; | ||
656 | break; | 652 | break; |
657 | } | 653 | } |
658 | default: | 654 | default: |
@@ -988,15 +984,11 @@ static int mei_irq_thread_write_handler(struct mei_cl_cb *cmpl_list, | |||
988 | wake_up_interruptible(&dev->wait_stop_wd); | 984 | wake_up_interruptible(&dev->wait_stop_wd); |
989 | } | 985 | } |
990 | 986 | ||
991 | if (dev->extra_write_index) { | 987 | if (dev->wr_ext_msg.hdr.length) { |
992 | dev_dbg(&dev->pdev->dev, "extra_write_index =%d.\n", | 988 | mei_write_message(dev, &dev->wr_ext_msg.hdr, |
993 | dev->extra_write_index); | 989 | dev->wr_ext_msg.data, dev->wr_ext_msg.hdr.length); |
994 | mei_write_message(dev, | 990 | *slots -= mei_data2slots(dev->wr_ext_msg.hdr.length); |
995 | (struct mei_msg_hdr *) &dev->ext_msg_buf[0], | 991 | dev->wr_ext_msg.hdr.length = 0; |
996 | (unsigned char *) &dev->ext_msg_buf[1], | ||
997 | (dev->extra_write_index - 1) * sizeof(u32)); | ||
998 | *slots -= dev->extra_write_index; | ||
999 | dev->extra_write_index = 0; | ||
1000 | } | 992 | } |
1001 | if (dev->dev_state == MEI_DEV_ENABLED) { | 993 | if (dev->dev_state == MEI_DEV_ENABLED) { |
1002 | if (dev->wd_pending && | 994 | if (dev->wd_pending && |
@@ -1263,11 +1255,11 @@ irqreturn_t mei_interrupt_thread_handler(int irq, void *dev_id) | |||
1263 | } | 1255 | } |
1264 | /* check slots available for reading */ | 1256 | /* check slots available for reading */ |
1265 | slots = mei_count_full_read_slots(dev); | 1257 | slots = mei_count_full_read_slots(dev); |
1266 | dev_dbg(&dev->pdev->dev, "slots =%08x extra_write_index =%08x.\n", | 1258 | while (slots > 0) { |
1267 | slots, dev->extra_write_index); | 1259 | /* we have urgent data to send so break the read */ |
1268 | while (slots > 0 && !dev->extra_write_index) { | 1260 | if (dev->wr_ext_msg.hdr.length) |
1269 | dev_dbg(&dev->pdev->dev, "slots =%08x extra_write_index =%08x.\n", | 1261 | break; |
1270 | slots, dev->extra_write_index); | 1262 | dev_dbg(&dev->pdev->dev, "slots =%08x\n", slots); |
1271 | dev_dbg(&dev->pdev->dev, "call mei_irq_thread_read_handler.\n"); | 1263 | dev_dbg(&dev->pdev->dev, "call mei_irq_thread_read_handler.\n"); |
1272 | rets = mei_irq_thread_read_handler(&complete_list, dev, &slots); | 1264 | rets = mei_irq_thread_read_handler(&complete_list, dev, &slots); |
1273 | if (rets) | 1265 | if (rets) |