From f6f6adf1cb6347b8033bc437bf16fe2f7b250d74 Mon Sep 17 00:00:00 2001
From: yellows8 <yellows8@users.noreply.github.com>
Date: Thu, 16 May 2019 18:47:38 -0400
Subject: [PATCH] Use the proper IPC buffer type for _usbHsEpGetXferReport with
 [3.0.0+].

---
 nx/include/switch/services/usbhs.h | 1 +
 nx/source/services/usbhs.c         | 9 ++++++++-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/nx/include/switch/services/usbhs.h b/nx/include/switch/services/usbhs.h
index 7edc3b9d..cfd076eb 100644
--- a/nx/include/switch/services/usbhs.h
+++ b/nx/include/switch/services/usbhs.h
@@ -96,6 +96,7 @@ typedef struct {
 typedef struct {
     Service s;
     Event eventXfer;                      ///< [2.0.0+] Signaled when PostBufferAsync finishes.
+    size_t ptrbufsize;                    ///< [3.0.0+] IPC pointer buffer size.
 
     struct usb_endpoint_descriptor desc;
 } UsbHsClientEpSession;
diff --git a/nx/source/services/usbhs.c b/nx/source/services/usbhs.c
index 34a3e33a..56116e78 100644
--- a/nx/source/services/usbhs.c
+++ b/nx/source/services/usbhs.c
@@ -721,6 +721,8 @@ Result usbHsIfOpenUsbEp(UsbHsClientIfSession* s, UsbHsClientEpSession* ep, u16 m
             if (R_SUCCEEDED(rc)) rc = _usbHsGetEvent(&ep->s, &ep->eventXfer, 2);
         }
 
+        if (hosversionAtLeast(3,0,0) && R_SUCCEEDED(rc)) rc = ipcQueryPointerBufferSize(ep->s.handle, &ep->ptrbufsize);
+
         if (R_FAILED(rc)) {
             serviceClose(&ep->s);
             eventClose(&ep->eventXfer);
@@ -844,7 +846,12 @@ static Result _usbHsEpGetXferReport(UsbHsClientEpSession* s, UsbHsXferReport* re
         u32 max_reports;
     } *raw;
 
-    ipcAddRecvBuffer(&c, reports, sizeof(UsbHsXferReport) * max_reports, BufferType_Normal);
+    if (hosversionBefore(3,0,0)) {
+        ipcAddRecvBuffer(&c, reports, sizeof(UsbHsXferReport) * max_reports, BufferType_Normal);
+    }
+    else {
+        ipcAddRecvSmart(&c, s->ptrbufsize, reports, sizeof(UsbHsXferReport) * max_reports, 0);
+    }
 
     raw = serviceIpcPrepareHeader(&s->s, &c, sizeof(*raw));