From 798365846d59a0704b25c632f75276a673d49e88 Mon Sep 17 00:00:00 2001 From: zeroZshadow Date: Thu, 13 Aug 2015 18:25:17 +0200 Subject: [PATCH 1/3] Improve TAP_Win32 error logging --- Source/Core/Core/HW/BBA-TAP/TAP_Win32.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Source/Core/Core/HW/BBA-TAP/TAP_Win32.cpp b/Source/Core/Core/HW/BBA-TAP/TAP_Win32.cpp index e9ffd400f4..6f60f3f380 100644 --- a/Source/Core/Core/HW/BBA-TAP/TAP_Win32.cpp +++ b/Source/Core/Core/HW/BBA-TAP/TAP_Win32.cpp @@ -304,15 +304,17 @@ bool CEXIETHERNET::RecvStart() DWORD res = ReadFile(mHAdapter, mRecvBuffer, BBA_RECV_SIZE, (LPDWORD)&mRecvBufferLength, &mReadOverlapped); - if (!res && (GetLastError() != ERROR_IO_PENDING)) + DWORD err = GetLastError(); + if (!res && err != ERROR_IO_PENDING) { // error occurred + ERROR_LOG(SP1, "Failed to recieve packet with error 0x%X", err); return false; } if (res) { - // Completed immediately + // Synce the read is syncronouse here, complete immediately RecvHandlePacket(); } @@ -326,6 +328,9 @@ void CEXIETHERNET::RecvStop() UnregisterWaitEx(mHReadWait, INVALID_HANDLE_VALUE); - CloseHandle(mHRecvEvent); - mHRecvEvent = INVALID_HANDLE_VALUE; + if (mHRecvEvent != INVALID_HANDLE_VALUE) + { + CloseHandle(mHRecvEvent); + mHRecvEvent = INVALID_HANDLE_VALUE; + } } From 8925b828aa75b21d1069d2c238dca944088309c0 Mon Sep 17 00:00:00 2001 From: zeroZshadow Date: Thu, 13 Aug 2015 19:27:19 +0200 Subject: [PATCH 2/3] Ignore all writes to BBA_TXFIFOCNT --- Source/Core/Core/HW/BBA-TAP/TAP_Win32.cpp | 4 ++-- Source/Core/Core/HW/EXI_DeviceEthernet.cpp | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Source/Core/Core/HW/BBA-TAP/TAP_Win32.cpp b/Source/Core/Core/HW/BBA-TAP/TAP_Win32.cpp index 6f60f3f380..dbe0116400 100644 --- a/Source/Core/Core/HW/BBA-TAP/TAP_Win32.cpp +++ b/Source/Core/Core/HW/BBA-TAP/TAP_Win32.cpp @@ -248,7 +248,7 @@ bool CEXIETHERNET::SendFrame(u8 *frame, u32 size) OVERLAPPED overlap; ZeroMemory(&overlap, sizeof(overlap)); - //WriteFile will always return false because the TAP handle is async + // WriteFile will always return false because the TAP handle is async WriteFile(mHAdapter, frame, size, NULL, &overlap); DWORD res = GetLastError(); @@ -314,7 +314,7 @@ bool CEXIETHERNET::RecvStart() if (res) { - // Synce the read is syncronouse here, complete immediately + // Since the read is synchronous here, complete immediately RecvHandlePacket(); } diff --git a/Source/Core/Core/HW/EXI_DeviceEthernet.cpp b/Source/Core/Core/HW/EXI_DeviceEthernet.cpp index 3468bad8d8..2de81059af 100644 --- a/Source/Core/Core/HW/EXI_DeviceEthernet.cpp +++ b/Source/Core/Core/HW/EXI_DeviceEthernet.cpp @@ -358,6 +358,12 @@ void CEXIETHERNET::MXCommandHandler(u32 data, u32 size) data &= (data & 0xff) ^ 0xff; goto write_to_register; + case BBA_TXFIFOCNT: + case BBA_TXFIFOCNT+1: + // Ignore all writes to BBA_TXFIFOCNT + transfer.address += size; + return; + write_to_register: default: for (int i = size - 1; i >= 0; i--) From 84764db3b222d707c00adbd6100ddefb38a909ef Mon Sep 17 00:00:00 2001 From: zeroZshadow Date: Sat, 15 Aug 2015 16:45:44 +0200 Subject: [PATCH 3/3] Rewrite RecvStart error checking as suggested by shuffle2 --- Source/Core/Core/HW/BBA-TAP/TAP_Win32.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/Source/Core/Core/HW/BBA-TAP/TAP_Win32.cpp b/Source/Core/Core/HW/BBA-TAP/TAP_Win32.cpp index dbe0116400..ce9a18825e 100644 --- a/Source/Core/Core/HW/BBA-TAP/TAP_Win32.cpp +++ b/Source/Core/Core/HW/BBA-TAP/TAP_Win32.cpp @@ -304,21 +304,25 @@ bool CEXIETHERNET::RecvStart() DWORD res = ReadFile(mHAdapter, mRecvBuffer, BBA_RECV_SIZE, (LPDWORD)&mRecvBufferLength, &mReadOverlapped); - DWORD err = GetLastError(); - if (!res && err != ERROR_IO_PENDING) - { - // error occurred - ERROR_LOG(SP1, "Failed to recieve packet with error 0x%X", err); - return false; - } - if (res) { // Since the read is synchronous here, complete immediately RecvHandlePacket(); + return true; + } + else + { + DWORD err = GetLastError(); + if (err == ERROR_IO_PENDING) + { + return true; + } + + // Unexpected error + ERROR_LOG(SP1, "Failed to recieve packet with error 0x%X", err); + return false; } - return true; } void CEXIETHERNET::RecvStop()