mei: streamline amthif write complete function
authorTomas Winkler <tomas.winkler@intel.com>
Sun, 18 Nov 2012 13:13:17 +0000 (15:13 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 21 Nov 2012 20:43:58 +0000 (12:43 -0800)
Rename the function mei_amthif_irq_process_completed
to mei_amthif_irq_write_complete
Remove cl from the parameter list as it
can be extracted from cb block.
Extract the common flow from if statements
and document the logic properly

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/mei/amthif.c
drivers/misc/mei/interrupt.c
drivers/misc/mei/mei_dev.h

index 095d0595a49e38b69b4f27d1b43ed39e0ec76651..18794aea606282a8925a4ef93d9596948760c3f0 100644 (file)
@@ -431,74 +431,64 @@ unsigned int mei_amthif_poll(struct mei_device *dev,
  *
  * returns 0, OK; otherwise, error.
  */
-int mei_amthif_irq_process_completed(struct mei_device *dev, s32 *slots,
-                       struct mei_cl_cb *cb_pos,
-                       struct mei_cl *cl,
-                       struct mei_cl_cb *cmpl_list)
+int mei_amthif_irq_write_complete(struct mei_device *dev, s32 *slots,
+                       struct mei_cl_cb *cb, struct mei_cl_cb *cmpl_list)
 {
        struct mei_msg_hdr *mei_hdr;
+       struct mei_cl *cl = cb->cl;
+       size_t len = dev->iamthif_msg_buf_size - dev->iamthif_msg_buf_index;
+       size_t msg_slots = mei_data2slots(len);
 
-       if ((*slots * sizeof(u32)) >= (sizeof(struct mei_msg_hdr) +
-                       dev->iamthif_msg_buf_size -
-                       dev->iamthif_msg_buf_index)) {
-               mei_hdr = (struct mei_msg_hdr *) &dev->wr_msg_buf[0];
-               mei_hdr->host_addr = cl->host_client_id;
-               mei_hdr->me_addr = cl->me_client_id;
-               mei_hdr->length = dev->iamthif_msg_buf_size -
-                       dev->iamthif_msg_buf_index;
+       mei_hdr = (struct mei_msg_hdr *)&dev->wr_msg_buf[0];
+       mei_hdr->host_addr = cl->host_client_id;
+       mei_hdr->me_addr = cl->me_client_id;
+       mei_hdr->reserved = 0;
+
+       if (*slots >= msg_slots) {
+               mei_hdr->length = len;
                mei_hdr->msg_complete = 1;
-               mei_hdr->reserved = 0;
+       /* Split the message only if we can write the whole host buffer */
+       } else if (*slots == dev->hbuf_depth) {
+               msg_slots = *slots;
+               len = (*slots * sizeof(u32)) - sizeof(struct mei_msg_hdr);
+               mei_hdr->length = len;
+               mei_hdr->msg_complete = 0;
+       } else {
+               /* wait for next time the host buffer is empty */
+               return 0;
+       }
 
-               *slots -= mei_data2slots(mei_hdr->length);
+       dev_dbg(&dev->pdev->dev, "msg: len = %d complete = %d\n",
+                       mei_hdr->length, mei_hdr->msg_complete);
 
-               if (mei_write_message(dev, mei_hdr,
-                                       (dev->iamthif_msg_buf +
-                                       dev->iamthif_msg_buf_index),
-                                       mei_hdr->length)) {
+       *slots -=  msg_slots;
+       if (mei_write_message(dev, mei_hdr,
+               dev->iamthif_msg_buf + dev->iamthif_msg_buf_index,
+               mei_hdr->length)) {
                        dev->iamthif_state = MEI_IAMTHIF_IDLE;
                        cl->status = -ENODEV;
-                       list_del(&cb_pos->list);
+                       list_del(&cb->list);
                        return -ENODEV;
-               } else {
-                       if (mei_flow_ctrl_reduce(dev, cl))
-                               return -ENODEV;
-                       dev->iamthif_msg_buf_index += mei_hdr->length;
-                       cb_pos->buf_idx = dev->iamthif_msg_buf_index;
-                       cl->status = 0;
-                       dev->iamthif_state = MEI_IAMTHIF_FLOW_CONTROL;
-                       dev->iamthif_flow_control_pending = true;
-                       /* save iamthif cb sent to amthi client */
-                       dev->iamthif_current_cb = cb_pos;
-                       list_move_tail(&cb_pos->list,
-                                       &dev->write_waiting_list.list);
+       }
 
-               }
-       } else if (*slots == dev->hbuf_depth) {
-               /* buffer is still empty */
-               mei_hdr = (struct mei_msg_hdr *) &dev->wr_msg_buf[0];
-               mei_hdr->host_addr = cl->host_client_id;
-               mei_hdr->me_addr = cl->me_client_id;
-               mei_hdr->length =
-                       (*slots * sizeof(u32)) - sizeof(struct mei_msg_hdr);
-               mei_hdr->msg_complete = 0;
-               mei_hdr->reserved = 0;
+       if (mei_flow_ctrl_reduce(dev, cl))
+               return -ENODEV;
 
-               *slots -= mei_data2slots(mei_hdr->length);
+       dev->iamthif_msg_buf_index += mei_hdr->length;
+       cl->status = 0;
 
-               if (mei_write_message(dev, mei_hdr,
-                                       (dev->iamthif_msg_buf +
-                                       dev->iamthif_msg_buf_index),
-                                       mei_hdr->length)) {
-                       cl->status = -ENODEV;
-                       list_del(&cb_pos->list);
-               } else {
-                       dev->iamthif_msg_buf_index += mei_hdr->length;
-               }
-               return -EMSGSIZE;
-       } else {
-               return -EBADMSG;
+       if (mei_hdr->msg_complete) {
+               dev->iamthif_state = MEI_IAMTHIF_FLOW_CONTROL;
+               dev->iamthif_flow_control_pending = true;
+
+               /* save iamthif cb sent to amthi client */
+               cb->buf_idx = dev->iamthif_msg_buf_index;
+               dev->iamthif_current_cb = cb;
+
+               list_move_tail(&cb->list, &dev->write_waiting_list.list);
        }
 
+
        return 0;
 }
 
index 85e272258ff132f3472884b140b034c310521c2d..d30db38d6188b6c3e636aa7e458885cb15e13138 100644 (file)
@@ -1046,8 +1046,8 @@ static int mei_irq_thread_write_handler(struct mei_cl_cb *cmpl_list,
                                        cl->host_client_id);
                                continue;
                        }
-                       ret = mei_amthif_irq_process_completed(dev, slots, pos,
-                                                               cl, cmpl_list);
+                       ret = mei_amthif_irq_write_complete(dev, slots,
+                                                       pos, cmpl_list);
                        if (ret)
                                return ret;
 
index 2a38e95e5de0155e6d8cc5c2f62d60260ce8974f..17d00aae74e6e4d75c8a5682b02f2393f7cb70ca 100644 (file)
@@ -407,10 +407,8 @@ void mei_amthif_run_next_cmd(struct mei_device *dev);
 int mei_amthif_read_message(struct mei_cl_cb *complete_list,
                struct mei_device *dev, struct mei_msg_hdr *mei_hdr);
 
-int mei_amthif_irq_process_completed(struct mei_device *dev, s32 *slots,
-                       struct mei_cl_cb *cb_pos,
-                       struct mei_cl *cl,
-                       struct mei_cl_cb *cmpl_list);
+int mei_amthif_irq_write_complete(struct mei_device *dev, s32 *slots,
+                       struct mei_cl_cb *cb, struct mei_cl_cb *cmpl_list);
 
 void mei_amthif_complete(struct mei_device *dev, struct mei_cl_cb *cb);
 int mei_amthif_irq_read_message(struct mei_cl_cb *complete_list,