aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc
diff options
context:
space:
mode:
authorTomas Winkler <tomas.winkler@intel.com>2012-07-23 07:05:39 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-08-16 12:40:28 -0400
commit07b509b7943e5594f3f228e5b62a49cf6a033709 (patch)
tree6271fdff08b54ab605cbc666cdcc054d41d3e44a /drivers/misc
parent0d7614f09c1ebdbaa1599a5aba7593f147bf96ee (diff)
mei: revamp me client search function
me client search functions returns index into me_client array according me client id or me client uuid. 1. Add common prefix for the functions mei_me_cl_<> 2. create new function mei_me_cl_by_id that wraps open coded loops scattered over the code 3. rename mei_find_me_client_index to mei_me_cl_by_uuid 4. rename mei_find_me_client_update_filext to mei_me_cl_update_filext and updates its parameter names Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/misc')
-rw-r--r--drivers/misc/mei/init.c38
-rw-r--r--drivers/misc/mei/iorw.c55
-rw-r--r--drivers/misc/mei/main.c31
-rw-r--r--drivers/misc/mei/mei_dev.h8
-rw-r--r--drivers/misc/mei/wd.c2
5 files changed, 60 insertions, 74 deletions
diff --git a/drivers/misc/mei/init.c b/drivers/misc/mei/init.c
index e77f86e69fb5..58b3bf47c8eb 100644
--- a/drivers/misc/mei/init.c
+++ b/drivers/misc/mei/init.c
@@ -522,12 +522,12 @@ void mei_cl_init(struct mei_cl *priv, struct mei_device *dev)
522 priv->dev = dev; 522 priv->dev = dev;
523} 523}
524 524
525int mei_find_me_client_index(const struct mei_device *dev, uuid_le cuuid) 525int mei_me_cl_by_uuid(const struct mei_device *dev, const uuid_le *cuuid)
526{ 526{
527 int i, res = -1; 527 int i, res = -ENOENT;
528 528
529 for (i = 0; i < dev->me_clients_num; ++i) 529 for (i = 0; i < dev->me_clients_num; ++i)
530 if (uuid_le_cmp(cuuid, 530 if (uuid_le_cmp(*cuuid,
531 dev->me_clients[i].props.protocol_name) == 0) { 531 dev->me_clients[i].props.protocol_name) == 0) {
532 res = i; 532 res = i;
533 break; 533 break;
@@ -538,35 +538,35 @@ int mei_find_me_client_index(const struct mei_device *dev, uuid_le cuuid)
538 538
539 539
540/** 540/**
541 * mei_find_me_client_update_filext - searches for ME client guid 541 * mei_me_cl_update_filext - searches for ME client guid
542 * sets client_id in mei_file_private if found 542 * sets client_id in mei_file_private if found
543 * @dev: the device structure 543 * @dev: the device structure
544 * @priv: private file structure to set client_id in 544 * @cl: private file structure to set client_id in
545 * @cguid: searched guid of ME client 545 * @cuuid: searched uuid of ME client
546 * @client_id: id of host client to be set in file private structure 546 * @client_id: id of host client to be set in file private structure
547 * 547 *
548 * returns ME client index 548 * returns ME client index
549 */ 549 */
550u8 mei_find_me_client_update_filext(struct mei_device *dev, struct mei_cl *priv, 550int mei_me_cl_update_filext(struct mei_device *dev, struct mei_cl *cl,
551 const uuid_le *cguid, u8 client_id) 551 const uuid_le *cuuid, u8 host_cl_id)
552{ 552{
553 int i; 553 int i;
554 554
555 if (!dev || !priv || !cguid) 555 if (!dev || !cl || !cuuid)
556 return 0; 556 return -EINVAL;
557 557
558 /* check for valid client id */ 558 /* check for valid client id */
559 i = mei_find_me_client_index(dev, *cguid); 559 i = mei_me_cl_by_uuid(dev, cuuid);
560 if (i >= 0) { 560 if (i >= 0) {
561 priv->me_client_id = dev->me_clients[i].client_id; 561 cl->me_client_id = dev->me_clients[i].client_id;
562 priv->state = MEI_FILE_CONNECTING; 562 cl->state = MEI_FILE_CONNECTING;
563 priv->host_client_id = client_id; 563 cl->host_client_id = host_cl_id;
564 564
565 list_add_tail(&priv->link, &dev->file_list); 565 list_add_tail(&cl->link, &dev->file_list);
566 return (u8)i; 566 return (u8)i;
567 } 567 }
568 568
569 return 0; 569 return -ENOENT;
570} 570}
571 571
572/** 572/**
@@ -577,16 +577,16 @@ u8 mei_find_me_client_update_filext(struct mei_device *dev, struct mei_cl *priv,
577 */ 577 */
578void mei_host_init_iamthif(struct mei_device *dev) 578void mei_host_init_iamthif(struct mei_device *dev)
579{ 579{
580 u8 i; 580 int i;
581 unsigned char *msg_buf; 581 unsigned char *msg_buf;
582 582
583 mei_cl_init(&dev->iamthif_cl, dev); 583 mei_cl_init(&dev->iamthif_cl, dev);
584 dev->iamthif_cl.state = MEI_FILE_DISCONNECTED; 584 dev->iamthif_cl.state = MEI_FILE_DISCONNECTED;
585 585
586 /* find ME amthi client */ 586 /* find ME amthi client */
587 i = mei_find_me_client_update_filext(dev, &dev->iamthif_cl, 587 i = mei_me_cl_update_filext(dev, &dev->iamthif_cl,
588 &mei_amthi_guid, MEI_IAMTHIF_HOST_CLIENT_ID); 588 &mei_amthi_guid, MEI_IAMTHIF_HOST_CLIENT_ID);
589 if (dev->iamthif_cl.state != MEI_FILE_CONNECTING) { 589 if (i < 0) {
590 dev_dbg(&dev->pdev->dev, "failed to find iamthif client.\n"); 590 dev_dbg(&dev->pdev->dev, "failed to find iamthif client.\n");
591 return; 591 return;
592 } 592 }
diff --git a/drivers/misc/mei/iorw.c b/drivers/misc/mei/iorw.c
index 50f52e21f587..9187d852ef9c 100644
--- a/drivers/misc/mei/iorw.c
+++ b/drivers/misc/mei/iorw.c
@@ -38,7 +38,31 @@
38#include <linux/mei.h> 38#include <linux/mei.h>
39#include "interface.h" 39#include "interface.h"
40 40
41/**
42 * mei_me_cl_by_id return index to me_clients for client_id
43 *
44 * @dev: the device structure
45 * @client_id: me client id
46 *
47 * Locking: called under "dev->device_lock" lock
48 *
49 * returns index on success, -ENOENT on failure.
50 */
41 51
52int mei_me_cl_by_id(struct mei_device *dev, u8 client_id)
53{
54 int i;
55 for (i = 0; i < dev->me_clients_num; i++)
56 if (dev->me_clients[i].client_id == client_id)
57 break;
58 if (WARN_ON(dev->me_clients[i].client_id != client_id))
59 return -ENOENT;
60
61 if (i == dev->me_clients_num)
62 return -ENOENT;
63
64 return i;
65}
42 66
43/** 67/**
44 * mei_ioctl_connect_client - the connect to fw client IOCTL function 68 * mei_ioctl_connect_client - the connect to fw client IOCTL function
@@ -95,7 +119,7 @@ int mei_ioctl_connect_client(struct file *file,
95 } 119 }
96 120
97 /* find ME client we're trying to connect to */ 121 /* find ME client we're trying to connect to */
98 i = mei_find_me_client_index(dev, data->in_client_uuid); 122 i = mei_me_cl_by_uuid(dev, &data->in_client_uuid);
99 if (i >= 0 && !dev->me_clients[i].props.fixed_address) { 123 if (i >= 0 && !dev->me_clients[i].props.fixed_address) {
100 cl->me_client_id = dev->me_clients[i].client_id; 124 cl->me_client_id = dev->me_clients[i].client_id;
101 cl->state = MEI_FILE_CONNECTING; 125 cl->state = MEI_FILE_CONNECTING;
@@ -273,19 +297,12 @@ int amthi_read(struct mei_device *dev, struct file *file,
273 return -ETIMEDOUT; 297 return -ETIMEDOUT;
274 } 298 }
275 299
276 for (i = 0; i < dev->me_clients_num; i++) { 300 i = mei_me_cl_by_id(dev, dev->iamthif_cl.me_client_id);
277 if (dev->me_clients[i].client_id ==
278 dev->iamthif_cl.me_client_id)
279 break;
280 }
281 301
282 if (i == dev->me_clients_num) { 302 if (i < 0) {
283 dev_dbg(&dev->pdev->dev, "amthi client not found.\n"); 303 dev_dbg(&dev->pdev->dev, "amthi client not found.\n");
284 return -ENODEV; 304 return -ENODEV;
285 } 305 }
286 if (WARN_ON(dev->me_clients[i].client_id != cl->me_client_id))
287 return -ENODEV;
288
289 dev_dbg(&dev->pdev->dev, "checking amthi data\n"); 306 dev_dbg(&dev->pdev->dev, "checking amthi data\n");
290 cb = find_amthi_read_list_entry(dev, file); 307 cb = find_amthi_read_list_entry(dev, file);
291 308
@@ -316,8 +333,7 @@ int amthi_read(struct mei_device *dev, struct file *file,
316 dev->iamthif_timer = 0; 333 dev->iamthif_timer = 0;
317 334
318 if (cb) { 335 if (cb) {
319 timeout = cb->read_time + 336 timeout = cb->read_time + msecs_to_jiffies(IAMTHIF_READ_TIMER);
320 msecs_to_jiffies(IAMTHIF_READ_TIMER);
321 dev_dbg(&dev->pdev->dev, "amthi timeout = %lud\n", 337 dev_dbg(&dev->pdev->dev, "amthi timeout = %lud\n",
322 timeout); 338 timeout);
323 339
@@ -401,19 +417,8 @@ int mei_start_read(struct mei_device *dev, struct mei_cl *cl)
401 417
402 dev_dbg(&dev->pdev->dev, "allocation call back successful. host client = %d, ME client = %d\n", 418 dev_dbg(&dev->pdev->dev, "allocation call back successful. host client = %d, ME client = %d\n",
403 cl->host_client_id, cl->me_client_id); 419 cl->host_client_id, cl->me_client_id);
404 420 i = mei_me_cl_by_id(dev, cl->me_client_id);
405 for (i = 0; i < dev->me_clients_num; i++) { 421 if (i < 0) {
406 if (dev->me_clients[i].client_id == cl->me_client_id)
407 break;
408
409 }
410
411 if (WARN_ON(dev->me_clients[i].client_id != cl->me_client_id)) {
412 rets = -ENODEV;
413 goto unlock;
414 }
415
416 if (i == dev->me_clients_num) {
417 rets = -ENODEV; 422 rets = -ENODEV;
418 goto unlock; 423 goto unlock;
419 } 424 }
diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c
index 092330208869..b0903bd44bf7 100644
--- a/drivers/misc/mei/main.c
+++ b/drivers/misc/mei/main.c
@@ -393,10 +393,9 @@ static ssize_t mei_read(struct file *file, char __user *ubuf,
393 393
394 if ((cl->sm_state & MEI_WD_STATE_INDEPENDENCE_MSG_SENT) == 0) { 394 if ((cl->sm_state & MEI_WD_STATE_INDEPENDENCE_MSG_SENT) == 0) {
395 /* Do not allow to read watchdog client */ 395 /* Do not allow to read watchdog client */
396 i = mei_find_me_client_index(dev, mei_wd_guid); 396 i = mei_me_cl_by_uuid(dev, &mei_wd_guid);
397 if (i >= 0) { 397 if (i >= 0) {
398 struct mei_me_client *me_client = &dev->me_clients[i]; 398 struct mei_me_client *me_client = &dev->me_clients[i];
399
400 if (cl->me_client_id == me_client->client_id) { 399 if (cl->me_client_id == me_client->client_id) {
401 rets = -EBADF; 400 rets = -EBADF;
402 goto out; 401 goto out;
@@ -620,22 +619,12 @@ static ssize_t mei_write(struct file *file, const char __user *ubuf,
620 rets = -ENODEV; 619 rets = -ENODEV;
621 goto unlock_dev; 620 goto unlock_dev;
622 } 621 }
623 for (i = 0; i < dev->me_clients_num; i++) { 622 i = mei_me_cl_by_id(dev, dev->iamthif_cl.me_client_id);
624 if (dev->me_clients[i].client_id == 623 if (i < 0) {
625 dev->iamthif_cl.me_client_id)
626 break;
627 }
628
629 if (WARN_ON(dev->me_clients[i].client_id != cl->me_client_id)) {
630 rets = -ENODEV; 624 rets = -ENODEV;
631 goto unlock_dev; 625 goto unlock_dev;
632 } 626 }
633 if (i == dev->me_clients_num || 627 if (length > dev->me_clients[i].props.max_msg_length ||
634 (dev->me_clients[i].client_id !=
635 dev->iamthif_cl.me_client_id)) {
636 rets = -ENODEV;
637 goto unlock_dev;
638 } else if (length > dev->me_clients[i].props.max_msg_length ||
639 length <= 0) { 628 length <= 0) {
640 rets = -EMSGSIZE; 629 rets = -EMSGSIZE;
641 goto unlock_dev; 630 goto unlock_dev;
@@ -688,16 +677,8 @@ static ssize_t mei_write(struct file *file, const char __user *ubuf,
688 cl->me_client_id); 677 cl->me_client_id);
689 goto unlock_dev; 678 goto unlock_dev;
690 } 679 }
691 for (i = 0; i < dev->me_clients_num; i++) { 680 i = mei_me_cl_by_id(dev, cl->me_client_id);
692 if (dev->me_clients[i].client_id == 681 if (i < 0) {
693 cl->me_client_id)
694 break;
695 }
696 if (WARN_ON(dev->me_clients[i].client_id != cl->me_client_id)) {
697 rets = -ENODEV;
698 goto unlock_dev;
699 }
700 if (i == dev->me_clients_num) {
701 rets = -ENODEV; 682 rets = -ENODEV;
702 goto unlock_dev; 683 goto unlock_dev;
703 } 684 }
diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h
index d61c4ddfc80c..1ff1fc678fb3 100644
--- a/drivers/misc/mei/mei_dev.h
+++ b/drivers/misc/mei/mei_dev.h
@@ -279,9 +279,10 @@ void mei_host_init_iamthif(struct mei_device *dev);
279void mei_allocate_me_clients_storage(struct mei_device *dev); 279void mei_allocate_me_clients_storage(struct mei_device *dev);
280 280
281 281
282u8 mei_find_me_client_update_filext(struct mei_device *dev, 282int mei_me_cl_update_filext(struct mei_device *dev, struct mei_cl *cl,
283 struct mei_cl *priv, 283 const uuid_le *cguid, u8 host_client_id);
284 const uuid_le *cguid, u8 client_id); 284int mei_me_cl_by_uuid(const struct mei_device *dev, const uuid_le *cuuid);
285int mei_me_cl_by_id(struct mei_device *dev, u8 client_id);
285 286
286/* 287/*
287 * MEI IO List Functions 288 * MEI IO List Functions
@@ -348,7 +349,6 @@ void mei_run_next_iamthif_cmd(struct mei_device *dev);
348 349
349void mei_free_cb_private(struct mei_cl_cb *priv_cb); 350void mei_free_cb_private(struct mei_cl_cb *priv_cb);
350 351
351int mei_find_me_client_index(const struct mei_device *dev, uuid_le cuuid);
352 352
353/* 353/*
354 * Register Access Function 354 * Register Access Function
diff --git a/drivers/misc/mei/wd.c b/drivers/misc/mei/wd.c
index 5133fd77b91c..912319e4fa90 100644
--- a/drivers/misc/mei/wd.c
+++ b/drivers/misc/mei/wd.c
@@ -69,7 +69,7 @@ int mei_wd_host_init(struct mei_device *dev)
69 dev->wd_timeout = AMT_WD_DEFAULT_TIMEOUT; 69 dev->wd_timeout = AMT_WD_DEFAULT_TIMEOUT;
70 70
71 /* find ME WD client */ 71 /* find ME WD client */
72 mei_find_me_client_update_filext(dev, &dev->wd_cl, 72 mei_me_cl_update_filext(dev, &dev->wd_cl,
73 &mei_wd_guid, MEI_WD_HOST_CLIENT_ID); 73 &mei_wd_guid, MEI_WD_HOST_CLIENT_ID);
74 74
75 dev_dbg(&dev->pdev->dev, "wd: check client\n"); 75 dev_dbg(&dev->pdev->dev, "wd: check client\n");