[edk2,v2] OptionRomPkg: Ax88772b: Fixing register access issue in Apple Eth Adapter

Message ID 1459329254-1551-1-git-send-email-shivamurthy.shastri@linaro.org
State Accepted
Commit 7361d3ff88e51a82282d86f268d83366f79a5075
Headers show

Commit Message

Shivamurthy Shastri March 30, 2016, 9:14 a.m.
The USB command CMD_RXQTC ("RX Queue Cascade Threshold Control") tries
to access the register and is always failing when using the Apple
Ethernet adapter.

It is fixed by checking flag before sending command.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Shivamurthy Shastri <shivamurthy.shastri@linaro.org>

---
 .../Bus/Usb/UsbNetworking/Ax88772b/Ax88772.c       | 19 ++++++-----
 .../Bus/Usb/UsbNetworking/Ax88772b/Ax88772.h       |  4 ++-
 .../Bus/Usb/UsbNetworking/Ax88772b/DriverBinding.c | 37 ++++++++++++++++++++++
 3 files changed, 51 insertions(+), 9 deletions(-)

-- 
1.9.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Patch

diff --git a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772.c b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772.c
index 45ba3e5..e014d52 100644
--- a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772.c
+++ b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772.c
@@ -625,15 +625,18 @@  Ax88772Reset (
                                   
   if (EFI_ERROR(Status)) goto err;  
 
-  SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
-                        | USB_TARGET_DEVICE; 
-  SetupMsg.Request = CMD_RXQTC;
-  SetupMsg.Value = 0x8000;
-  SetupMsg.Index = 0x8001;
-  SetupMsg.Length = 0;
-  Status = Ax88772UsbCommand ( pNicDevice,
+  if (pNicDevice->Flags != FLAG_TYPE_AX88772) {
+        SetupMsg.RequestType = USB_REQ_TYPE_VENDOR
+                        | USB_TARGET_DEVICE;
+        SetupMsg.Request = CMD_RXQTC;
+        SetupMsg.Value = 0x8000;
+        SetupMsg.Index = 0x8001;
+        SetupMsg.Length = 0;
+        Status = Ax88772UsbCommand ( pNicDevice,
                                   &SetupMsg,
-                                  NULL ); 
+                                  NULL );
+  }
+
 err:
   return Status;
 }
diff --git a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772.h b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772.h
index a2109cf..92ac64d 100644
--- a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772.h
+++ b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/Ax88772.h
@@ -404,7 +404,9 @@  typedef struct {
   RX_PKT * pFirstFill;
   UINTN   PktCntInQueue;
   UINT8 * pBulkInBuff;
- 
+
+  INT32 Flags;
+
 } NIC_DEVICE;
 
 #define DEV_FROM_SIMPLE_NETWORK(a)  CR (a, NIC_DEVICE, SimpleNetwork, DEV_SIGNATURE)  ///< Locate NIC_DEVICE from Simple Network Protocol
diff --git a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/DriverBinding.c b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/DriverBinding.c
index d64bc73..bf05c74 100644
--- a/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/DriverBinding.c
+++ b/OptionRomPkg/Bus/Usb/UsbNetworking/Ax88772b/DriverBinding.c
@@ -124,6 +124,8 @@  DriverStart (
 	UINTN							LengthInBytes;
 	EFI_DEVICE_PATH_PROTOCOL        *ParentDevicePath = NULL;
 	MAC_ADDR_DEVICE_PATH            MacDeviceNode;
+        EFI_USB_DEVICE_DESCRIPTOR       Device;
+        UINT32                          Index;
 
   //
 	//  Allocate the device structure
@@ -178,6 +180,41 @@  DriverStart (
 		  goto EXIT;
   }
 
+  Status = pNicDevice->pUsbIo->UsbGetDeviceDescriptor ( pNicDevice->pUsbIo, &Device );
+  if (EFI_ERROR ( Status )) {
+     gBS->CloseProtocol (
+               Controller,
+               &gEfiUsbIoProtocolGuid,
+               pThis->DriverBindingHandle,
+               Controller
+               );
+     gBS->FreePool ( pNicDevice );
+              goto EXIT;
+  } else {
+      //
+      //  Validate the adapter
+      //
+      for (Index = 0; ASIX_DONGLES[Index].VendorId != 0; Index++) {
+          if (ASIX_DONGLES[Index].VendorId == Device.IdVendor &&
+              ASIX_DONGLES[Index].ProductId == Device.IdProduct) {
+                break;
+          }
+      }
+
+      if (ASIX_DONGLES[Index].VendorId == 0) {
+         gBS->CloseProtocol (
+                   Controller,
+                   &gEfiUsbIoProtocolGuid,
+                   pThis->DriverBindingHandle,
+                   Controller
+                   );
+          gBS->FreePool ( pNicDevice );
+                   goto EXIT;
+      }
+
+      pNicDevice->Flags = ASIX_DONGLES[Index].Flags;
+  }
+
 	//
   // Set Device Path
   //