mei: make mei_write_message more readable
authorTomas Winkler <tomas.winkler@intel.com>
Tue, 19 Jun 2012 06:13:35 +0000 (09:13 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Jun 2012 23:41:38 +0000 (16:41 -0700)
1. reduce hairy casting
2. replace open code with mei_count_empty_write_slots
4. include header size in check for overflow
3. use concise for loop instead of a while loop

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

index 428d21e364160f0002a1ccb5e07c01fb42c94c41..6c0569177646e3e243735d5ea41165c6b91871d8 100644 (file)
@@ -127,52 +127,39 @@ int mei_count_empty_write_slots(struct mei_device *dev)
  *
  * This function returns -EIO if write has failed
  */
-int mei_write_message(struct mei_device *dev,
-                     struct mei_msg_hdr *header,
-                     unsigned char *write_buffer,
-                     unsigned long write_length)
+int mei_write_message(struct mei_device *dev, struct mei_msg_hdr *header,
+                     unsigned char *buf, unsigned long length)
 {
-       u32 temp_msg = 0;
-       unsigned long bytes_written = 0;
-       unsigned char buffer_depth, filled_slots, empty_slots;
-       unsigned long dw_to_write;
-
-       dev->host_hw_state = mei_hcsr_read(dev);
+       unsigned long rem, dw_cnt;
+       u32 *reg_buf = (u32 *)buf;
+       int i;
+       int empty_slots;
 
-       dev_dbg(&dev->pdev->dev,
-                       "host_hw_state = 0x%08x.\n",
-                       dev->host_hw_state);
 
        dev_dbg(&dev->pdev->dev,
                        "mei_write_message header=%08x.\n",
                        *((u32 *) header));
 
-       buffer_depth = (unsigned char) ((dev->host_hw_state & H_CBD) >> 24);
-       filled_slots = _host_get_filled_slots(dev);
-       empty_slots = buffer_depth - filled_slots;
-       dev_dbg(&dev->pdev->dev,
-                       "filled = %hu, empty = %hu.\n",
-                       filled_slots, empty_slots);
-
-       dw_to_write = ((write_length + 3) / 4);
+       empty_slots = mei_count_empty_write_slots(dev);
+       dev_dbg(&dev->pdev->dev, "empty slots = %hu.\n", empty_slots);
 
-       if (dw_to_write > empty_slots)
+       dw_cnt = (length + sizeof(*header) + 3) / 4;
+       if (empty_slots < 0 || dw_cnt > empty_slots)
                return -EIO;
 
        mei_reg_write(dev, H_CB_WW, *((u32 *) header));
 
-       while (write_length >= 4) {
-               mei_reg_write(dev, H_CB_WW,
-                               *(u32 *) (write_buffer + bytes_written));
-               bytes_written += 4;
-               write_length -= 4;
-       }
+       for (i = 0; i < length / 4; i++)
+               mei_reg_write(dev, H_CB_WW, reg_buf[i]);
 
-       if (write_length > 0) {
-               memcpy(&temp_msg, &write_buffer[bytes_written], write_length);
-               mei_reg_write(dev, H_CB_WW, temp_msg);
+       rem = length & 0x3;
+       if (rem > 0) {
+               u32 reg = 0;
+               memcpy(&reg, &buf[length - rem], rem);
+               mei_reg_write(dev, H_CB_WW, reg);
        }
 
+       dev->host_hw_state = mei_hcsr_read(dev);
        dev->host_hw_state |= H_IG;
        mei_hcsr_set(dev);
        dev->me_hw_state = mei_mecsr_read(dev);