mei: don't query HCSR for host buffer depth
authorTomas Winkler <tomas.winkler@intel.com>
Mon, 25 Jun 2012 20:46:27 +0000 (23:46 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 26 Jun 2012 22:59:44 +0000 (15:59 -0700)
1. We record host (write) buffer depth during reset
 so we don't need to query HCSR register later on.
 The host buffer depth doesn't change after the reset
2. Use mei_hbuf_max_data function to compute payload size in bytes

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

index a7d0bb0880ece4c4319eac1cd4f6fbe64c358d55..d39b2774535be405eae1a5abd11dbb610ea72de0 100644 (file)
@@ -162,6 +162,9 @@ int mei_hw_init(struct mei_device *dev)
        if ((dev->host_hw_state & H_IS) == H_IS)
                mei_reg_write(dev, H_CSR, dev->host_hw_state);
 
+       /* Doesn't change in runtime */
+       dev->hbuf_depth = (dev->host_hw_state & H_CBD) >> 24;
+
        dev->recvd_msg = false;
        dev_dbg(&dev->pdev->dev, "reset in start the mei device.\n");
 
index 6c0569177646e3e243735d5ea41165c6b91871d8..784a60626fa1c71375d5c8e94edc0f809dacfc0f 100644 (file)
@@ -103,15 +103,14 @@ int mei_host_buffer_is_empty(struct mei_device *dev)
  */
 int mei_count_empty_write_slots(struct mei_device *dev)
 {
-       unsigned char buffer_depth, filled_slots, empty_slots;
+       unsigned char filled_slots, empty_slots;
 
        dev->host_hw_state = mei_hcsr_read(dev);
-       buffer_depth = (unsigned char) ((dev->host_hw_state & H_CBD) >> 24);
        filled_slots = _host_get_filled_slots(dev);
-       empty_slots = buffer_depth - filled_slots;
+       empty_slots = dev->hbuf_depth - filled_slots;
 
        /* check for overflow */
-       if (filled_slots > buffer_depth)
+       if (filled_slots > dev->hbuf_depth)
                return -EOVERFLOW;
 
        return empty_slots;
index ddff5d16616fe80bf4bab59c21c06c0695d26f28..8723d88801499e28f36e9259c3a8bddc641a152a 100644 (file)
@@ -49,6 +49,12 @@ int mei_count_empty_write_slots(struct mei_device *dev);
 
 int mei_flow_ctrl_creds(struct mei_device *dev, struct mei_cl *cl);
 
+static inline size_t mei_hbuf_max_data(const struct mei_device *dev)
+{
+       return dev->hbuf_depth * sizeof(u32) - sizeof(struct mei_msg_hdr);
+}
+
+
 int mei_wd_send(struct mei_device *dev);
 int mei_wd_stop(struct mei_device *dev, bool preserve);
 int mei_wd_host_init(struct mei_device *dev);
index 8e4dd74b96e5c24ba7c238fce440dca6e105aa4f..4ad6a6bab5a307ab3480a1c551f651ad58751341 100644 (file)
@@ -951,7 +951,7 @@ static int _mei_irq_thread_cmpl(struct mei_device *dev,     s32 *slots,
                        list_move_tail(&cb_pos->cb_list,
                                &dev->write_waiting_list.mei_cb.cb_list);
                }
-       } else if (*slots == ((dev->host_hw_state & H_CBD) >> 24)) {
+       } 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;
@@ -1046,8 +1046,8 @@ static int _mei_irq_thread_cmpl_iamthif(struct mei_device *dev, s32 *slots,
                                &dev->write_waiting_list.mei_cb.cb_list);
 
                }
-       } else if (*slots == ((dev->host_hw_state & H_CBD) >> 24)) {
-                       /* buffer is still empty */
+       } 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;
index f9cced69b65e79d388405285eb9c010cac58c6f0..50f52e21f587a229e374a9f72149186aace43777 100644 (file)
@@ -481,12 +481,8 @@ int amthi_write(struct mei_device *dev, struct mei_cl_cb *cb)
        if (ret && dev->mei_host_buffer_is_empty) {
                ret = 0;
                dev->mei_host_buffer_is_empty = false;
-               if (cb->request_buffer.size >
-                       (((dev->host_hw_state & H_CBD) >> 24) * sizeof(u32))
-                               -sizeof(struct mei_msg_hdr)) {
-                       mei_hdr.length =
-                           (((dev->host_hw_state & H_CBD) >> 24) *
-                           sizeof(u32)) - sizeof(struct mei_msg_hdr);
+               if (cb->request_buffer.size > mei_hbuf_max_data(dev)) {
+                       mei_hdr.length = mei_hbuf_max_data(dev);
                        mei_hdr.msg_complete = 0;
                } else {
                        mei_hdr.length = cb->request_buffer.size;
index c70333228337d28bc76d1c61510bb57b615d3a68..aaf2683ea154cb923612ff487cd497582f50fa0d 100644 (file)
@@ -714,13 +714,8 @@ static ssize_t mei_write(struct file *file, const char __user *ubuf,
        if (rets && dev->mei_host_buffer_is_empty) {
                rets = 0;
                dev->mei_host_buffer_is_empty = false;
-               if (length > ((((dev->host_hw_state & H_CBD) >> 24) *
-                       sizeof(u32)) - sizeof(struct mei_msg_hdr))) {
-
-                       mei_hdr.length =
-                               (((dev->host_hw_state & H_CBD) >> 24) *
-                               sizeof(u32)) -
-                               sizeof(struct mei_msg_hdr);
+               if (length >  mei_hbuf_max_data(dev)) {
+                       mei_hdr.length = mei_hbuf_max_data(dev);
                        mei_hdr.msg_complete = 0;
                } else {
                        mei_hdr.length = length;
index 4fe653392a490054e99e61de0e8d55a45352e385..d60250d663c69579540ad68dd62c7d83c6b2f594 100644 (file)
@@ -167,7 +167,10 @@ struct mei_io_list {
        struct mei_cl_cb mei_cb;
 };
 
-/* MEI private device struct */
+/**
+ * struct mei_deive -  MEI private device struct
+ * @hbuf_depth - depth of host(write) buffer
+ */
 struct mei_device {
        struct pci_dev *pdev;   /* pointer to pci device struct */
        /*
@@ -205,6 +208,7 @@ struct mei_device {
         */
        u32 host_hw_state;
        u32 me_hw_state;
+       u8  hbuf_depth;
        /*
         * waiting queue for receive message from FW
         */