LMS uses /dev/mei to talk to mei, which is not present in recent kernels.
So LMS fails to initialize and is broken. In addition to that the select 
timesout
post write in SendMessage api which causes communication to mei fail leading to
malfunctioning of LMS.

0003-Fix-device-file-referanc*.patch uses /dev/mei0 and removes select post 
write
in SendMessage api and relies on write return length for write verification.

This patch is required to get LMS properly working.

Signed-off-by: Anand Vastrad <[email protected]>
---
 ...-file-referance-to-dev-mei0-remove-select.patch | 91 ++++++++++++++++++++++
 common/recipes-bsp/amt/lms8_8.0.0-7.bb             |  1 +
 2 files changed, 92 insertions(+)
 create mode 100644 
common/recipes-bsp/amt/lms/0003-Fix-device-file-referance-to-dev-mei0-remove-select.patch

diff --git 
a/common/recipes-bsp/amt/lms/0003-Fix-device-file-referance-to-dev-mei0-remove-select.patch
 
b/common/recipes-bsp/amt/lms/0003-Fix-device-file-referance-to-dev-mei0-remove-select.patch
new file mode 100644
index 0000000..433d301
--- /dev/null
+++ 
b/common/recipes-bsp/amt/lms/0003-Fix-device-file-referance-to-dev-mei0-remove-select.patch
@@ -0,0 +1,91 @@
+Fix device file referance to /dev/mei0, remove select post write.
+
+LMS uses /dev/mei character device which is absent on current kernel versions 
causing LMS fail to initialize. LMS sends messages to MEI with a post select 
timeout. Select timeout causes SendMessage to fail causing LMS to not to 
communicate properly with MEI.
+
+Adding /dev/mei0 device file reference to check first and then /dev/mei 
sucessfully initializes LMS. Rely on write return length and remove select with 
timeout to fix communication with MEI.
+
+Upstream-Status: Pending
+
+Signed-off-by: Anand Vastrad <[email protected]>
+---
+ src/mei/MEILinux.cpp | 43 +++++++------------------------------------
+ 1 file changed, 7 insertions(+), 36 deletions(-)
+
+diff --git a/src/mei/MEILinux.cpp b/src/mei/MEILinux.cpp
+index 1e9d28f..6d23f54 100755
+--- a/src/mei/MEILinux.cpp
++++ b/src/mei/MEILinux.cpp
+@@ -94,13 +94,17 @@ bool MEILinux::Init(unsigned char reqProtocolVersion)
+               Deinit();
+       }
+ 
+-      _fd = open("/dev/mei", O_RDWR);
++      _fd = open("/dev/mei0", O_RDWR);
+ 
+       if (_fd == -1 ) {
+               if (_verbose) {
+-                      fprintf(stderr, "Error: Cannot establish a handle to 
the MEI driver\n");
++                      fprintf(stderr, "Warning: Cannot establish a handle to 
the MEI driver mei0, retrying with mei \n");
++              }
++              _fd = open("/dev/mei", O_RDWR);
++              if (_fd == -1 ) {
++                      fprintf(stderr, "Error: Cannot establish a handle to 
the MEI driver mei\n");
++                      return false;
+               }
+-              return false;
+       }
+       _initialized = true;
+ 
+@@ -181,13 +185,7 @@ int MEILinux::ReceiveMessage(unsigned char *buffer, int 
len, unsigned long timeo
+ int MEILinux::SendMessage(const unsigned char *buffer, int len, unsigned long 
timeout)
+ {
+       int rv = 0;
+-      int return_length =0;
+       int error = 0;
+-      fd_set set;
+-      struct timeval tv;
+-
+-      tv.tv_sec =  timeout / 1000;
+-      tv.tv_usec =(timeout % 1000) * 1000000;
+ 
+       if (_verbose) {
+               fprintf(stdout, "call write length = %d\n", len);
+@@ -198,35 +196,8 @@ int MEILinux::SendMessage(const unsigned char *buffer, 
int len, unsigned long ti
+               if (_verbose) {
+                       fprintf(stderr,"write failed with status %d %d\n", rv, 
error);
+               }
+-              goto out;
+-      }
+-
+-      return_length = rv;
+-
+-      FD_ZERO(&set);
+-      FD_SET(_fd, &set);
+-      rv = select(_fd+1 ,&set, NULL, NULL, &tv);
+-      if (rv > 0 && FD_ISSET(_fd, &set)) {
+-              if (_verbose) {
+-                      fprintf(stderr, "write success\n");
+-              }
+       }
+-      else if (rv == 0) {
+-              if (_verbose) {
+-                      fprintf(stderr, "write failed on timeout with 
status\n");
+-              }
+-              goto out;
+-      }
+-      else { //rv<0
+-              if (_verbose) {
+-                      fprintf(stderr, "write failed on select with status 
%d\n", rv);
+-              }
+-              goto out;
+-      }
+-
+-      rv = return_length;
+ 
+-out:
+       if (rv < 0) {
+               Deinit();
+       }
+-- 
+2.7.4
+
diff --git a/common/recipes-bsp/amt/lms8_8.0.0-7.bb 
b/common/recipes-bsp/amt/lms8_8.0.0-7.bb
index 842e34a..145b307 100644
--- a/common/recipes-bsp/amt/lms8_8.0.0-7.bb
+++ b/common/recipes-bsp/amt/lms8_8.0.0-7.bb
@@ -12,6 +12,7 @@ SRC_URI = 
"http://software.intel.com/sites/default/files/${BPN}-${PV}.tar.gz \
            
file://0001-Protocol.cpp-Add-whitespace-for-gcc6-compile-error.patch \
            file://0001-Include-sys-select.h-for-fd_set.patch \
            file://0002-Use-proper-netinet-in.h-API.patch \
+           
file://0003-Fix-device-file-referance-to-dev-mei0-remove-select.patch \
            "
 
 COMPATIBLE_HOST = '(i.86|x86_64).*-linux'
-- 
2.7.4

-- 
_______________________________________________
meta-intel mailing list
[email protected]
https://lists.yoctoproject.org/listinfo/meta-intel

Reply via email to