diff options
-rw-r--r-- | drivers/misc/mei/amthif.c | 5 | ||||
-rw-r--r-- | drivers/misc/mei/client.c | 19 | ||||
-rw-r--r-- | drivers/misc/mei/init.c | 5 | ||||
-rw-r--r-- | drivers/misc/mei/main.c | 6 | ||||
-rw-r--r-- | drivers/misc/mei/mei_dev.h | 1 |
5 files changed, 20 insertions, 16 deletions
diff --git a/drivers/misc/mei/amthif.c b/drivers/misc/mei/amthif.c index 226c3f3cd3e8..4f259d411a2c 100644 --- a/drivers/misc/mei/amthif.c +++ b/drivers/misc/mei/amthif.c | |||
@@ -58,6 +58,7 @@ void mei_amthif_reset_params(struct mei_device *dev) | |||
58 | dev->iamthif_state = MEI_IAMTHIF_IDLE; | 58 | dev->iamthif_state = MEI_IAMTHIF_IDLE; |
59 | dev->iamthif_timer = 0; | 59 | dev->iamthif_timer = 0; |
60 | dev->iamthif_stall_timer = 0; | 60 | dev->iamthif_stall_timer = 0; |
61 | dev->iamthif_open_count = 0; | ||
61 | } | 62 | } |
62 | 63 | ||
63 | /** | 64 | /** |
@@ -731,8 +732,8 @@ static bool mei_clear_lists(struct mei_device *dev, struct file *file) | |||
731 | */ | 732 | */ |
732 | int mei_amthif_release(struct mei_device *dev, struct file *file) | 733 | int mei_amthif_release(struct mei_device *dev, struct file *file) |
733 | { | 734 | { |
734 | if (dev->open_handle_count > 0) | 735 | if (dev->iamthif_open_count > 0) |
735 | dev->open_handle_count--; | 736 | dev->iamthif_open_count--; |
736 | 737 | ||
737 | if (dev->iamthif_file_object == file && | 738 | if (dev->iamthif_file_object == file && |
738 | dev->iamthif_state != MEI_IAMTHIF_IDLE) { | 739 | dev->iamthif_state != MEI_IAMTHIF_IDLE) { |
diff --git a/drivers/misc/mei/client.c b/drivers/misc/mei/client.c index 88770e040dd1..a48c0e71e69d 100644 --- a/drivers/misc/mei/client.c +++ b/drivers/misc/mei/client.c | |||
@@ -275,6 +275,7 @@ struct mei_cl_cb *mei_cl_find_read_cb(struct mei_cl *cl) | |||
275 | int mei_cl_link(struct mei_cl *cl, int id) | 275 | int mei_cl_link(struct mei_cl *cl, int id) |
276 | { | 276 | { |
277 | struct mei_device *dev; | 277 | struct mei_device *dev; |
278 | long open_handle_count; | ||
278 | 279 | ||
279 | if (WARN_ON(!cl || !cl->dev)) | 280 | if (WARN_ON(!cl || !cl->dev)) |
280 | return -EINVAL; | 281 | return -EINVAL; |
@@ -291,7 +292,8 @@ int mei_cl_link(struct mei_cl *cl, int id) | |||
291 | return -EMFILE; | 292 | return -EMFILE; |
292 | } | 293 | } |
293 | 294 | ||
294 | if (dev->open_handle_count >= MEI_MAX_OPEN_HANDLE_COUNT) { | 295 | open_handle_count = dev->open_handle_count + dev->iamthif_open_count; |
296 | if (open_handle_count >= MEI_MAX_OPEN_HANDLE_COUNT) { | ||
295 | dev_err(&dev->pdev->dev, "open_handle_count exceded %d", | 297 | dev_err(&dev->pdev->dev, "open_handle_count exceded %d", |
296 | MEI_MAX_OPEN_HANDLE_COUNT); | 298 | MEI_MAX_OPEN_HANDLE_COUNT); |
297 | return -EMFILE; | 299 | return -EMFILE; |
@@ -337,6 +339,17 @@ int mei_cl_unlink(struct mei_cl *cl) | |||
337 | 339 | ||
338 | cl_dbg(dev, cl, "unlink client"); | 340 | cl_dbg(dev, cl, "unlink client"); |
339 | 341 | ||
342 | if (dev->open_handle_count > 0) | ||
343 | dev->open_handle_count--; | ||
344 | |||
345 | /* never clear the 0 bit */ | ||
346 | if (cl->host_client_id) | ||
347 | clear_bit(cl->host_client_id, dev->host_clients_map); | ||
348 | |||
349 | list_del_init(&cl->link); | ||
350 | |||
351 | cl->state = MEI_FILE_INITIALIZING; | ||
352 | |||
340 | list_del_init(&cl->link); | 353 | list_del_init(&cl->link); |
341 | 354 | ||
342 | return 0; | 355 | return 0; |
@@ -358,10 +371,8 @@ void mei_host_client_init(struct work_struct *work) | |||
358 | /* | 371 | /* |
359 | * Reserving the first three client IDs | 372 | * Reserving the first three client IDs |
360 | * 0: Reserved for MEI Bus Message communications | 373 | * 0: Reserved for MEI Bus Message communications |
361 | * 1: Reserved for Watchdog | ||
362 | * 2: Reserved for AMTHI | ||
363 | */ | 374 | */ |
364 | bitmap_set(dev->host_clients_map, 0, 3); | 375 | bitmap_set(dev->host_clients_map, 0, 1); |
365 | 376 | ||
366 | for (i = 0; i < dev->me_clients_num; i++) { | 377 | for (i = 0; i < dev->me_clients_num; i++) { |
367 | client_props = &dev->me_clients[i].props; | 378 | client_props = &dev->me_clients[i].props; |
diff --git a/drivers/misc/mei/init.c b/drivers/misc/mei/init.c index 6197018e2f16..a7d29a7dcab2 100644 --- a/drivers/misc/mei/init.c +++ b/drivers/misc/mei/init.c | |||
@@ -165,12 +165,7 @@ void mei_reset(struct mei_device *dev, int interrupts_enabled) | |||
165 | /* remove entry if already in list */ | 165 | /* remove entry if already in list */ |
166 | dev_dbg(&dev->pdev->dev, "remove iamthif and wd from the file list.\n"); | 166 | dev_dbg(&dev->pdev->dev, "remove iamthif and wd from the file list.\n"); |
167 | mei_cl_unlink(&dev->wd_cl); | 167 | mei_cl_unlink(&dev->wd_cl); |
168 | if (dev->open_handle_count > 0) | ||
169 | dev->open_handle_count--; | ||
170 | mei_cl_unlink(&dev->iamthif_cl); | 168 | mei_cl_unlink(&dev->iamthif_cl); |
171 | if (dev->open_handle_count > 0) | ||
172 | dev->open_handle_count--; | ||
173 | |||
174 | mei_amthif_reset_params(dev); | 169 | mei_amthif_reset_params(dev); |
175 | memset(&dev->wr_ext_msg, 0, sizeof(dev->wr_ext_msg)); | 170 | memset(&dev->wr_ext_msg, 0, sizeof(dev->wr_ext_msg)); |
176 | } | 171 | } |
diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c index 87ab5ca1d633..9661a812f550 100644 --- a/drivers/misc/mei/main.c +++ b/drivers/misc/mei/main.c | |||
@@ -141,10 +141,6 @@ static int mei_release(struct inode *inode, struct file *file) | |||
141 | cl->host_client_id, | 141 | cl->host_client_id, |
142 | cl->me_client_id); | 142 | cl->me_client_id); |
143 | 143 | ||
144 | if (dev->open_handle_count > 0) { | ||
145 | clear_bit(cl->host_client_id, dev->host_clients_map); | ||
146 | dev->open_handle_count--; | ||
147 | } | ||
148 | mei_cl_unlink(cl); | 144 | mei_cl_unlink(cl); |
149 | 145 | ||
150 | 146 | ||
@@ -498,11 +494,11 @@ static int mei_ioctl_connect_client(struct file *file, | |||
498 | rets = -ENODEV; | 494 | rets = -ENODEV; |
499 | goto end; | 495 | goto end; |
500 | } | 496 | } |
501 | clear_bit(cl->host_client_id, dev->host_clients_map); | ||
502 | mei_cl_unlink(cl); | 497 | mei_cl_unlink(cl); |
503 | 498 | ||
504 | kfree(cl); | 499 | kfree(cl); |
505 | cl = NULL; | 500 | cl = NULL; |
501 | dev->iamthif_open_count++; | ||
506 | file->private_data = &dev->iamthif_cl; | 502 | file->private_data = &dev->iamthif_cl; |
507 | 503 | ||
508 | client = &data->out_client_properties; | 504 | client = &data->out_client_properties; |
diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h index 456b322013e2..406f68e05b4e 100644 --- a/drivers/misc/mei/mei_dev.h +++ b/drivers/misc/mei/mei_dev.h | |||
@@ -414,6 +414,7 @@ struct mei_device { | |||
414 | struct file *iamthif_file_object; | 414 | struct file *iamthif_file_object; |
415 | struct mei_cl iamthif_cl; | 415 | struct mei_cl iamthif_cl; |
416 | struct mei_cl_cb *iamthif_current_cb; | 416 | struct mei_cl_cb *iamthif_current_cb; |
417 | long iamthif_open_count; | ||
417 | int iamthif_mtu; | 418 | int iamthif_mtu; |
418 | unsigned long iamthif_timer; | 419 | unsigned long iamthif_timer; |
419 | u32 iamthif_stall_timer; | 420 | u32 iamthif_stall_timer; |