All of lore.kernel.org
 help / color / mirror / Atom feed
* [char-misc-next 1/4] mei: check for error codes that mei_flow_ctrl_creds  retuns
@ 2012-06-19  6:13 Tomas Winkler
  2012-06-19  6:13 ` [char-misc-next 2/4] mei: make mei_write_message more readable Tomas Winkler
                   ` (2 more replies)
  0 siblings, 3 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

we cannot use if(!mei_flow_ctrl_creds()) logic as
mei_flow_ctrl_creds also negative error codes

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/misc/mei/interrupt.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c
index 23f5463..86380fd 100644
--- a/drivers/misc/mei/interrupt.c
+++ b/drivers/misc/mei/interrupt.c
@@ -1326,7 +1326,7 @@ static int mei_irq_thread_write_handler(struct mei_io_list *cmpl_list,
 			continue;
 
 		if (cl != &dev->iamthif_cl) {
-			if (!mei_flow_ctrl_creds(dev, cl)) {
+			if (mei_flow_ctrl_creds(dev, cl) <= 0) {
 				dev_dbg(&dev->pdev->dev,
 					"No flow control"
 				    " credentials for client"
@@ -1343,7 +1343,7 @@ static int mei_irq_thread_write_handler(struct mei_io_list *cmpl_list,
 		} else if (cl == &dev->iamthif_cl) {
 			/* IAMTHIF IOCTL */
 			dev_dbg(&dev->pdev->dev, "complete amthi write cb.\n");
-			if (!mei_flow_ctrl_creds(dev, cl)) {
+			if (mei_flow_ctrl_creds(dev, cl) <= 0) {
 				dev_dbg(&dev->pdev->dev,
 					"No flow control"
 				    " credentials for amthi"
-- 
1.7.4.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [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(&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);
-- 
1.7.4.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [char-misc-next 3/4] mei: mei_irq_thread_write_handler check for overflow
  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 ` 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, 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

check for overflow when retrieving empty write slots

Change-Id: Icdbe6c671686e55c322de66901dada365a3ea105
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/misc/mei/interrupt.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c
index 86380fd..7ea0254 100644
--- a/drivers/misc/mei/interrupt.c
+++ b/drivers/misc/mei/interrupt.c
@@ -1204,6 +1204,9 @@ static int mei_irq_thread_write_handler(struct mei_io_list *cmpl_list,
 		return 0;
 	}
 	*slots = mei_count_empty_write_slots(dev);
+	if (*slots <= 0)
+		return -EMSGSIZE;
+
 	/* complete all waiting for write CB */
 	dev_dbg(&dev->pdev->dev, "complete all waiting for write cb.\n");
 
-- 
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

* Re: [char-misc-next 2/4] mei: make mei_write_message more readable
  2012-06-19  6:13 ` [char-misc-next 2/4] mei: make mei_write_message more readable Tomas Winkler
@ 2012-06-20 23:41   ` Greg KH
  0 siblings, 0 replies; 5+ messages in thread
From: Greg KH @ 2012-06-20 23:41 UTC (permalink / raw)
  To: Tomas Winkler; +Cc: arnd, alan, linux-kernel

On Tue, Jun 19, 2012 at 09:13:35AM +0300, Tomas Winkler wrote:
> 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

What is that nonsense?

Ick.

I'll delete it this time, but please, never again...

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-06-20 23:41 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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-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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.