* [char-misc-next 2/4] mei: make mei_write_message more readable
2012-06-19 6:13 [char-misc-next 1/4] mei: check for error codes that mei_flow_ctrl_creds retuns Tomas Winkler
@ 2012-06-19 6:13 ` Tomas Winkler
2012-06-20 23:41 ` Greg KH
2012-06-19 6:13 ` [char-misc-next 3/4] mei: mei_irq_thread_write_handler check for overflow Tomas Winkler
2012-06-19 6:13 ` [char-misc-next 4/4] mei: group wd_interface_reg with watchdog variables within struct mei_device Tomas Winkler
2 siblings, 1 reply; 5+ messages in thread
From: Tomas Winkler @ 2012-06-19 6:13 UTC (permalink / raw)
To: gregkh; +Cc: arnd, alan, linux-kernel, Tomas Winkler
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
Change-Id: Idb7423bd7bc570a46437568908a0e8f6d7225555
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
drivers/misc/mei/interface.c | 49 +++++++++++++++--------------------------
1 files changed, 18 insertions(+), 31 deletions(-)
diff --git a/drivers/misc/mei/interface.c b/drivers/misc/mei/interface.c
index 428d21e..6c05691 100644
--- a/drivers/misc/mei/interface.c
+++ b/drivers/misc/mei/interface.c
@@ -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(®, &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);
--
1.7.4.4
^ permalink raw reply related [flat|nested] 5+ messages in thread* [char-misc-next 4/4] mei: group wd_interface_reg with watchdog variables within struct mei_device
2012-06-19 6:13 [char-misc-next 1/4] mei: check for error codes that mei_flow_ctrl_creds retuns Tomas Winkler
2012-06-19 6:13 ` [char-misc-next 2/4] mei: make mei_write_message more readable Tomas Winkler
2012-06-19 6:13 ` [char-misc-next 3/4] mei: mei_irq_thread_write_handler check for overflow Tomas Winkler
@ 2012-06-19 6:13 ` Tomas Winkler
2 siblings, 0 replies; 5+ messages in thread
From: Tomas Winkler @ 2012-06-19 6:13 UTC (permalink / raw)
To: gregkh; +Cc: arnd, alan, linux-kernel, Tomas Winkler
Change-Id: I846c81e5e729461f0a96d3229c0eb9cb1dff9e9a
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
drivers/misc/mei/mei_dev.h | 4 +---
1 files changed, 1 insertions(+), 3 deletions(-)
diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h
index 63d7ee9..4fe6533 100644
--- a/drivers/misc/mei/mei_dev.h
+++ b/drivers/misc/mei/mei_dev.h
@@ -237,6 +237,7 @@ struct mei_device {
bool mei_host_buffer_is_empty;
struct mei_cl wd_cl;
+ bool wd_interface_reg;
bool wd_pending;
bool wd_stopped;
bool wd_bypass; /* if false, don't refresh watchdog ME client */
@@ -245,7 +246,6 @@ struct mei_device {
unsigned char wd_data[MEI_START_WD_DATA_SIZE];
-
struct file *iamthif_file_object;
struct mei_cl iamthif_cl;
struct mei_cl_cb *iamthif_current_cb;
@@ -259,8 +259,6 @@ struct mei_device {
bool iamthif_flow_control_pending;
bool iamthif_ioctl;
bool iamthif_canceled;
-
- bool wd_interface_reg;
};
--
1.7.4.4
^ permalink raw reply related [flat|nested] 5+ messages in thread