forked from brl/citadel
92 lines
2.6 KiB
Diff
92 lines
2.6 KiB
Diff
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 <anand.vastrad@intel.com>
|
|
---
|
|
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
|
|
|