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;
}