[haiku-commits] haiku: hrev52983 - in src/add-ons/kernel: drivers/audio/usb busses/usb

  • From: waddlesplash <waddlesplash@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 9 Mar 2019 17:54:24 -0500 (EST)

hrev52983 adds 3 changesets to branch 'master'
old head: e6a55c69fe898183c5f4075b21cd392cc9284b28
new head: 7356f1de4b7b36f61f1e259b470319304d58db60
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=7356f1de4b7b+%5Ee6a55c69fe89

----------------------------------------------------------------------------

965d4047bb8a: usb_audio: Trim trailing spaces; change device basename to 
"hmulti/usb".

c5c392585c7d: usb_audio: Fixes for SMAP.

7356f1de4b7b: XHCI: Properly handle partially-failed transfers.

                              [ Augustin Cavalier <waddlesplash@xxxxxxxxx> ]

----------------------------------------------------------------------------

4 files changed, 33 insertions(+), 14 deletions(-)
src/add-ons/kernel/busses/usb/xhci.cpp           |  8 +++--
.../drivers/audio/usb/AudioControlInterface.cpp  |  4 +--
src/add-ons/kernel/drivers/audio/usb/Device.cpp  | 33 +++++++++++++++-----
src/add-ons/kernel/drivers/audio/usb/Driver.cpp  |  2 +-

############################################################################

Commit:      965d4047bb8a2f3c2f47e1af2451cb747fe321e6
URL:         https://git.haiku-os.org/haiku/commit/?id=965d4047bb8a
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Sat Mar  9 21:10:07 2019 UTC

usb_audio: Trim trailing spaces; change device basename to "hmulti/usb".

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/drivers/audio/usb/AudioControlInterface.cpp 
b/src/add-ons/kernel/drivers/audio/usb/AudioControlInterface.cpp
index 9eee24e07f..80e3d2f09c 100644
--- a/src/add-ons/kernel/drivers/audio/usb/AudioControlInterface.cpp
+++ b/src/add-ons/kernel/drivers/audio/usb/AudioControlInterface.cpp
@@ -1653,12 +1653,12 @@ 
AudioControlInterface::_ListMixControlsForMixerUnit(int32& index,
 
        Vector<_MixPageCollector*> mixControls;
 
-       _MixPageCollector* genericPage = new(std::nothrow) 
_MixPageCollector("Mixer"); 
+       _MixPageCollector* genericPage = new(std::nothrow) 
_MixPageCollector("Mixer");
        mixControls.PushBack(genericPage);
 
        // page for extended in (>2) and out (>2) mixer controls
        size_t controlsOnExMixerPage = 0;
-       _MixPageCollector* exMixerPage = new(std::nothrow) 
_MixPageCollector("Mixer"); 
+       _MixPageCollector* exMixerPage = new(std::nothrow) 
_MixPageCollector("Mixer");
 
        AudioChannelCluster* outCluster = mixer->OutCluster();
 
diff --git a/src/add-ons/kernel/drivers/audio/usb/Driver.cpp 
b/src/add-ons/kernel/drivers/audio/usb/Driver.cpp
index 96c748d88d..d304850dd6 100644
--- a/src/add-ons/kernel/drivers/audio/usb/Driver.cpp
+++ b/src/add-ons/kernel/drivers/audio/usb/Driver.cpp
@@ -14,7 +14,7 @@
 #include "Settings.h"
 
 
-static const char* sDeviceBaseName = "audio/hmulti/usb_audio/";
+static const char* sDeviceBaseName = "audio/hmulti/usb/";
 
 usb_module_info* gUSBModule = NULL;
 

############################################################################

Commit:      c5c392585c7df6968bb74150c88960e21b85681d
URL:         https://git.haiku-os.org/haiku/commit/?id=c5c392585c7d
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Sat Mar  9 21:35:02 2019 UTC

usb_audio: Fixes for SMAP.

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/drivers/audio/usb/Device.cpp 
b/src/add-ons/kernel/drivers/audio/usb/Device.cpp
index ed61aa3f9a..8ffd0a94ef 100644
--- a/src/add-ons/kernel/drivers/audio/usb/Device.cpp
+++ b/src/add-ons/kernel/drivers/audio/usb/Device.cpp
@@ -168,13 +168,12 @@ Device::Control(uint32 op, void* buffer, size_t length)
 
                case B_MULTI_GET_ENABLED_CHANNELS:
                {
-                       multi_channel_enable* data = 
(multi_channel_enable*)buffer;
                        multi_channel_enable enable;
                        uint32 enable_bits;
                        uchar* orig_enable_bits;
 
-                       if (user_memcpy(&enable, data, sizeof(enable)) != B_OK
-                               || !IS_USER_ADDRESS(enable.enable_bits)) {
+                       if (user_memcpy(&enable, buffer, sizeof(enable)) != B_OK
+                                       || 
!IS_USER_ADDRESS(enable.enable_bits)) {
                                return B_BAD_ADDRESS;
                        }
 
@@ -229,7 +228,7 @@ Device::Control(uint32 op, void* buffer, size_t length)
 
                        status_t status = _MultiGetGlobalFormat(&info);
                        if (status != B_OK)
-                               return B_OK;
+                               return status;
                        if (user_memcpy(buffer, &info, 
sizeof(multi_format_info)) != B_OK)
                                return B_BAD_ADDRESS;
                        return B_OK;
@@ -242,7 +241,7 @@ Device::Control(uint32 op, void* buffer, size_t length)
 
                        status_t status = _MultiSetGlobalFormat(&info);
                        if (status != B_OK)
-                               return B_OK;
+                               return status;
                        return user_memcpy(buffer, &info, 
sizeof(multi_format_info));
                }
                case B_MULTI_GET_CHANNEL_FORMATS:
@@ -254,10 +253,28 @@ Device::Control(uint32 op, void* buffer, size_t length)
                        return B_ERROR;
 
                case B_MULTI_GET_MIX:
-                       return _MultiGetMix((multi_mix_value_info*)buffer);
+               case B_MULTI_SET_MIX: {
+                       multi_mix_value_info info;
+                       if (user_memcpy(&info, buffer, 
sizeof(multi_mix_value_info)) != B_OK)
+                               return B_BAD_ADDRESS;
 
-               case B_MULTI_SET_MIX:
-                       return _MultiSetMix((multi_mix_value_info*)buffer);
+                       multi_mix_value* originalValues = info.values;
+                       size_t mixValueSize = info.item_count * 
sizeof(multi_mix_value);
+                       multi_mix_value* values = 
(multi_mix_value*)alloca(mixValueSize);
+                       if (user_memcpy(values, info.values, mixValueSize) != 
B_OK)
+                               return B_BAD_ADDRESS;
+                       info.values = values;
+
+                       status_t status;
+                       if (op == B_MULTI_GET_MIX)
+                               status = _MultiGetMix(&info);
+                       else
+                               status = _MultiSetMix(&info);
+                       if (status != B_OK)
+                               return status;
+                       // the multi_mix_value_info is not modified
+                       return user_memcpy(originalValues, values, 
mixValueSize);
+               }
 
                case B_MULTI_LIST_MIX_CHANNELS:
                        TRACE(ERR, "B_MULTI_LIST_MIX_CHANNELS n/i\n");

############################################################################

Revision:    hrev52983
Commit:      7356f1de4b7b36f61f1e259b470319304d58db60
URL:         https://git.haiku-os.org/haiku/commit/?id=7356f1de4b7b
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Sat Mar  9 22:53:31 2019 UTC

XHCI: Properly handle partially-failed transfers.

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/busses/usb/xhci.cpp 
b/src/add-ons/kernel/busses/usb/xhci.cpp
index e44325c501..6d1489a283 100644
--- a/src/add-ons/kernel/busses/usb/xhci.cpp
+++ b/src/add-ons/kernel/busses/usb/xhci.cpp
@@ -2223,7 +2223,9 @@ XHCI::HandleTransferComplete(xhci_trb* trb)
                // The TRB at offset trb_used will be the link TRB, which we do 
not
                // care about (and should not generate an interrupt at all.)
                // We really care about the properly last TRB, at index "count 
- 1".
-               if (offset == td->trb_used - 1) {
+               // Additionally, if we have an unsuccessful completion code, 
the transfer
+               // likely failed midway; so just accept it anyway.
+               if (offset == (td->trb_used - 1) || completionCode != 
COMP_SUCCESS) {
                        _UnlinkDescriptorForPipe(td, endpoint);
                        mutex_unlock(&endpoint->lock);
 
@@ -2241,8 +2243,8 @@ XHCI::HandleTransferComplete(xhci_trb* trb)
                        TRACE("HandleTransferComplete td %p done\n", td);
                } else {
                        mutex_unlock(&endpoint->lock);
-                       TRACE_ERROR("TRB %" B_PRIxADDR " was found, but it 
wasn't the "
-                               "last in the TD!\n", source);
+                       TRACE_ERROR("successful TRB %" B_PRIxADDR " was found, 
but it wasn't "
+                               "the last in the TD!\n", source);
                }
                return;
        }


Other related posts: