diff options
author | Tomas Winkler <tomas.winkler@intel.com> | 2014-02-19 10:35:50 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-02-28 18:15:57 -0500 |
commit | b6d81fd66155fb6d0965502e146b136047e428b3 (patch) | |
tree | 867b6e6e1429f038a3c0670abb43b43f31493810 /drivers/misc | |
parent | 7ca96aa278f8b9983184e318b06a0ed9ad0297b8 (diff) |
mei: wd: simplify wd_send command
Add reduce credits to wd_send to remove code
repetition and simplify error handling
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/misc')
-rw-r--r-- | drivers/misc/mei/interrupt.c | 7 | ||||
-rw-r--r-- | drivers/misc/mei/wd.c | 52 |
2 files changed, 30 insertions, 29 deletions
diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c index 31cb3452b9d7..834220af814f 100644 --- a/drivers/misc/mei/interrupt.c +++ b/drivers/misc/mei/interrupt.c | |||
@@ -480,10 +480,9 @@ int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list) | |||
480 | if (mei_cl_is_connected(&dev->wd_cl)) { | 480 | if (mei_cl_is_connected(&dev->wd_cl)) { |
481 | if (dev->wd_pending && | 481 | if (dev->wd_pending && |
482 | mei_cl_flow_ctrl_creds(&dev->wd_cl) > 0) { | 482 | mei_cl_flow_ctrl_creds(&dev->wd_cl) > 0) { |
483 | if (mei_wd_send(dev)) | 483 | ret = mei_wd_send(dev); |
484 | dev_dbg(&dev->pdev->dev, "wd send failed.\n"); | 484 | if (ret) |
485 | else if (mei_cl_flow_ctrl_reduce(&dev->wd_cl)) | 485 | return ret; |
486 | return -EIO; | ||
487 | dev->wd_pending = false; | 486 | dev->wd_pending = false; |
488 | } | 487 | } |
489 | } | 488 | } |
diff --git a/drivers/misc/mei/wd.c b/drivers/misc/mei/wd.c index 4644b62e9055..13bb7a91ae12 100644 --- a/drivers/misc/mei/wd.c +++ b/drivers/misc/mei/wd.c | |||
@@ -111,13 +111,16 @@ int mei_wd_host_init(struct mei_device *dev) | |||
111 | * returns 0 if success, | 111 | * returns 0 if success, |
112 | * -EIO when message send fails | 112 | * -EIO when message send fails |
113 | * -EINVAL when invalid message is to be sent | 113 | * -EINVAL when invalid message is to be sent |
114 | * -ENODEV on flow control failure | ||
114 | */ | 115 | */ |
115 | int mei_wd_send(struct mei_device *dev) | 116 | int mei_wd_send(struct mei_device *dev) |
116 | { | 117 | { |
118 | struct mei_cl *cl = &dev->wd_cl; | ||
117 | struct mei_msg_hdr hdr; | 119 | struct mei_msg_hdr hdr; |
120 | int ret; | ||
118 | 121 | ||
119 | hdr.host_addr = dev->wd_cl.host_client_id; | 122 | hdr.host_addr = cl->host_client_id; |
120 | hdr.me_addr = dev->wd_cl.me_client_id; | 123 | hdr.me_addr = cl->me_client_id; |
121 | hdr.msg_complete = 1; | 124 | hdr.msg_complete = 1; |
122 | hdr.reserved = 0; | 125 | hdr.reserved = 0; |
123 | hdr.internal = 0; | 126 | hdr.internal = 0; |
@@ -126,10 +129,24 @@ int mei_wd_send(struct mei_device *dev) | |||
126 | hdr.length = MEI_WD_START_MSG_SIZE; | 129 | hdr.length = MEI_WD_START_MSG_SIZE; |
127 | else if (!memcmp(dev->wd_data, mei_stop_wd_params, MEI_WD_HDR_SIZE)) | 130 | else if (!memcmp(dev->wd_data, mei_stop_wd_params, MEI_WD_HDR_SIZE)) |
128 | hdr.length = MEI_WD_STOP_MSG_SIZE; | 131 | hdr.length = MEI_WD_STOP_MSG_SIZE; |
129 | else | 132 | else { |
133 | dev_err(&dev->pdev->dev, "wd: invalid message is to be sent, aborting\n"); | ||
130 | return -EINVAL; | 134 | return -EINVAL; |
135 | } | ||
136 | |||
137 | ret = mei_write_message(dev, &hdr, dev->wd_data); | ||
138 | if (ret) { | ||
139 | dev_err(&dev->pdev->dev, "wd: write message failed\n"); | ||
140 | return ret; | ||
141 | } | ||
131 | 142 | ||
132 | return mei_write_message(dev, &hdr, dev->wd_data); | 143 | ret = mei_cl_flow_ctrl_reduce(cl); |
144 | if (ret) { | ||
145 | dev_err(&dev->pdev->dev, "wd: flow_ctrl_reduce failed.\n"); | ||
146 | return ret; | ||
147 | } | ||
148 | |||
149 | return 0; | ||
133 | } | 150 | } |
134 | 151 | ||
135 | /** | 152 | /** |
@@ -159,16 +176,9 @@ int mei_wd_stop(struct mei_device *dev) | |||
159 | goto out; | 176 | goto out; |
160 | 177 | ||
161 | if (ret && mei_hbuf_acquire(dev)) { | 178 | if (ret && mei_hbuf_acquire(dev)) { |
162 | ret = 0; | 179 | ret = mei_wd_send(dev); |
163 | 180 | if (ret) | |
164 | if (!mei_wd_send(dev)) { | 181 | goto out; |
165 | ret = mei_cl_flow_ctrl_reduce(&dev->wd_cl); | ||
166 | if (ret) | ||
167 | goto out; | ||
168 | } else { | ||
169 | dev_err(&dev->pdev->dev, "wd: send stop failed\n"); | ||
170 | } | ||
171 | |||
172 | dev->wd_pending = false; | 182 | dev->wd_pending = false; |
173 | } else { | 183 | } else { |
174 | dev->wd_pending = true; | 184 | dev->wd_pending = true; |
@@ -289,18 +299,10 @@ static int mei_wd_ops_ping(struct watchdog_device *wd_dev) | |||
289 | 299 | ||
290 | dev_dbg(&dev->pdev->dev, "wd: sending ping\n"); | 300 | dev_dbg(&dev->pdev->dev, "wd: sending ping\n"); |
291 | 301 | ||
292 | if (mei_wd_send(dev)) { | 302 | ret = mei_wd_send(dev); |
293 | dev_err(&dev->pdev->dev, "wd: send failed.\n"); | 303 | if (ret) |
294 | ret = -EIO; | ||
295 | goto end; | 304 | goto end; |
296 | } | 305 | dev->wd_pending = false; |
297 | |||
298 | if (mei_cl_flow_ctrl_reduce(&dev->wd_cl)) { | ||
299 | dev_err(&dev->pdev->dev, "wd: mei_cl_flow_ctrl_reduce() failed.\n"); | ||
300 | ret = -EIO; | ||
301 | goto end; | ||
302 | } | ||
303 | |||
304 | } else { | 306 | } else { |
305 | dev->wd_pending = true; | 307 | dev->wd_pending = true; |
306 | } | 308 | } |