diff options
author | Chris Dickens <christopher.a.dickens@gmail.com> | 2020-03-16 20:14:24 -0700 |
---|---|---|
committer | Chris Dickens <christopher.a.dickens@gmail.com> | 2020-03-16 20:14:24 -0700 |
commit | 8b93a7157d3b7dad8531c61af860352efca29b20 (patch) | |
tree | c916e72d55606d6109e44ea1a128380b12c4a881 /libusb/os | |
parent | e32f1fd7bff3a483ce25717342a50af24b73a0c1 (diff) | |
download | libusb-8b93a7157d3b7dad8531c61af860352efca29b20.tar.gz |
Haiku: Fix some issues in the backend
Since commit 8cfcc63f4f ("haiku_usb_raw: Add missing wrap_sys_device
field to usbi_os_backend"), compilation of the Haiku backend has been
broken. Since the code is C++, named initializers are not supported. Fix
this by going back to the original style of initializing
usbi_os_backend.
Additionally, commit db99ef3451 ("Various fixes for the Haiku port")
further broken some things. The ClearHalt() function was defined as a
member of the USBDevice class but is declared and needed as a member of
the USBDeviceHandle class. The ioctl command code also contained a typo.
Signed-off-by: Chris Dickens <christopher.a.dickens@gmail.com>
Diffstat (limited to 'libusb/os')
-rw-r--r-- | libusb/os/haiku_pollfs.cpp | 2 | ||||
-rw-r--r-- | libusb/os/haiku_usb.h | 14 | ||||
-rw-r--r-- | libusb/os/haiku_usb_backend.cpp | 41 | ||||
-rw-r--r-- | libusb/os/haiku_usb_raw.cpp | 80 |
4 files changed, 80 insertions, 57 deletions
diff --git a/libusb/os/haiku_pollfs.cpp b/libusb/os/haiku_pollfs.cpp index 90c795a..cb28c51 100644 --- a/libusb/os/haiku_pollfs.cpp +++ b/libusb/os/haiku_pollfs.cpp @@ -125,7 +125,7 @@ WatchedEntry::WatchedEntry(BMessenger *messenger, entry_ref *ref) addr += tmp + 1; parent_path.GetParent(&parent_path); } - sscanf(path.Path(), "/dev/bus/usb/%d", &dev->bus_number); + sscanf(path.Path(), "/dev/bus/usb/%hhu", &dev->bus_number); dev->device_address = addr - (dev->bus_number + 1); if (usbi_sanitize_device(dev) < 0) { diff --git a/libusb/os/haiku_usb.h b/libusb/os/haiku_usb.h index f15e58e..9a87859 100644 --- a/libusb/os/haiku_usb.h +++ b/libusb/os/haiku_usb.h @@ -38,22 +38,22 @@ public: const char* Location() const; uint8 CountConfigurations() const; const usb_device_descriptor* Descriptor() const; - const usb_configuration_descriptor* ConfigurationDescriptor(uint32) const; + const usb_configuration_descriptor* ConfigurationDescriptor(uint8) const; const usb_configuration_descriptor* ActiveConfiguration() const; uint8 EndpointToIndex(uint8) const; uint8 EndpointToInterface(uint8) const; int ClaimInterface(int); int ReleaseInterface(int); - int CheckInterfacesFree(int); - int SetActiveConfiguration(int); - int ActiveConfigurationIndex() const; + int CheckInterfacesFree(uint8); + void SetActiveConfiguration(uint8); + uint8 ActiveConfigurationIndex() const; bool InitCheck(); private: int Initialise(); unsigned int fClaimedInterfaces; // Max Interfaces can be 32. Using a bitmask usb_device_descriptor fDeviceDescriptor; unsigned char** fConfigurationDescriptors; - int fActiveConfiguration; + uint8 fActiveConfiguration; char* fPath; map<uint8,uint8> fConfigToIndex; map<uint8,uint8>* fEndpointToIndex; @@ -67,9 +67,9 @@ public: virtual ~USBDeviceHandle(); int ClaimInterface(int); int ReleaseInterface(int); - int SetConfiguration(int); + int SetConfiguration(uint8); int SetAltSetting(int, int); - int ClearHalt(int); + int ClearHalt(uint8); status_t SubmitTransfer(struct usbi_transfer *); status_t CancelTransfer(USBTransfer *); bool InitCheck(); diff --git a/libusb/os/haiku_usb_backend.cpp b/libusb/os/haiku_usb_backend.cpp index 6e59ded..9eda263 100644 --- a/libusb/os/haiku_usb_backend.cpp +++ b/libusb/os/haiku_usb_backend.cpp @@ -215,7 +215,7 @@ USBDeviceHandle::CancelTransfer(USBTransfer *transfer) fTransfersLock.Lock(); bool removed = fTransfers.RemoveItem(transfer); fTransfersLock.Unlock(); - if(removed) + if (removed) usbi_signal_transfer_completion(transfer->UsbiTransfer()); return LIBUSB_SUCCESS; } @@ -242,7 +242,7 @@ USBDeviceHandle::~USBDeviceHandle() { if (fRawFD > 0) close(fRawFD); - for(int i = 0; i < 32; i++) { + for (int i = 0; i < 32; i++) { if (fClaimedInterfaces & (1U << i)) ReleaseInterface(i); } @@ -269,10 +269,10 @@ USBDeviceHandle::ReleaseInterface(int inumber) } int -USBDeviceHandle::SetConfiguration(int config) +USBDeviceHandle::SetConfiguration(uint8 config) { int config_index = fUSBDevice->CheckInterfacesFree(config); - if(config_index == LIBUSB_ERROR_BUSY || config_index == LIBUSB_ERROR_NOT_FOUND) + if (config_index == LIBUSB_ERROR_BUSY || config_index == LIBUSB_ERROR_NOT_FOUND) return config_index; usb_raw_command command; command.config.config_index = config_index; @@ -280,7 +280,7 @@ USBDeviceHandle::SetConfiguration(int config) command.config.status != B_USB_RAW_STATUS_SUCCESS) { return _errno_to_libusb(command.config.status); } - fUSBDevice->SetActiveConfiguration(config_index); + fUSBDevice->SetActiveConfiguration((uint8)config_index); return LIBUSB_SUCCESS; } @@ -309,9 +309,8 @@ USBDeviceHandle::SetAltSetting(int inumber, int alt) return LIBUSB_SUCCESS; } - int -USBDevice::ClearHalt(int endpoint) +USBDeviceHandle::ClearHalt(uint8 endpoint) { usb_raw_command command; command.control.request_type = USB_REQTYPE_ENDPOINT_OUT; @@ -324,6 +323,7 @@ USBDevice::ClearHalt(int endpoint) command.control.status != B_USB_RAW_STATUS_SUCCESS) { return _errno_to_libusb(command.control.status); } + return LIBUSB_SUCCESS; } @@ -345,7 +345,7 @@ USBDevice::~USBDevice() { free(fPath); if (fConfigurationDescriptors) { - for(int i = 0; i < fDeviceDescriptor.num_configurations; i++) { + for (uint8 i = 0; i < fDeviceDescriptor.num_configurations; i++) { if (fConfigurationDescriptors[i]) delete fConfigurationDescriptors[i]; } @@ -382,7 +382,7 @@ USBDevice::Descriptor() const } const usb_configuration_descriptor * -USBDevice::ConfigurationDescriptor(uint32 index) const +USBDevice::ConfigurationDescriptor(uint8 index) const { if (index > CountConfigurations()) return NULL; @@ -395,7 +395,7 @@ USBDevice::ActiveConfiguration() const return (usb_configuration_descriptor *) fConfigurationDescriptors[fActiveConfiguration]; } -int +uint8 USBDevice::ActiveConfigurationIndex() const { return fActiveConfiguration; @@ -418,20 +418,19 @@ int USBDevice::ReleaseInterface(int interface) } int -USBDevice::CheckInterfacesFree(int config) +USBDevice::CheckInterfacesFree(uint8 config) { if (fConfigToIndex.count(config) == 0) return LIBUSB_ERROR_NOT_FOUND; if (fClaimedInterfaces == 0) - return fConfigToIndex[(uint8)config]; + return fConfigToIndex[config]; return LIBUSB_ERROR_BUSY; } -int -USBDevice::SetActiveConfiguration(int config_index) +void +USBDevice::SetActiveConfiguration(uint8 config_index) { fActiveConfiguration = config_index; - return LIBUSB_SUCCESS; } uint8 @@ -463,7 +462,7 @@ USBDevice::Initialise() //Do we need more error checking, etc? How to report? fConfigurationDescriptors = new(std::nothrow) unsigned char *[fDeviceDescriptor.num_configurations]; fEndpointToIndex = new(std::nothrow) map<uint8,uint8> [fDeviceDescriptor.num_configurations]; fEndpointToInterface = new(std::nothrow) map<uint8,uint8> [fDeviceDescriptor.num_configurations]; - for (int i = 0; i < fDeviceDescriptor.num_configurations; i++) { + for (uint8 i = 0; i < fDeviceDescriptor.num_configurations; i++) { usb_configuration_descriptor tmp_config; command.config.descriptor = &tmp_config; command.config.config_index = i; @@ -479,14 +478,14 @@ USBDevice::Initialise() //Do we need more error checking, etc? How to report? command.config_etc.descriptor = (usb_configuration_descriptor*)fConfigurationDescriptors[i]; command.config_etc.length = tmp_config.total_length; command.config_etc.config_index = i; - if (ioctl(fRawFD, B_USB_COMMAND_GET_CONFIGURATION_DESCRIPTOR_ETC, &command, sizeof(command)) || + if (ioctl(fRawFD, B_USB_RAW_COMMAND_GET_CONFIGURATION_DESCRIPTOR_ETC, &command, sizeof(command)) || command.config_etc.status != B_USB_RAW_STATUS_SUCCESS) { usbi_err(NULL, "failed retrieving full configuration descriptor"); close(fRawFD); return B_ERROR; } - for (int j = 0; j < tmp_config.number_interfaces; j++) { + for (uint8 j = 0; j < tmp_config.number_interfaces; j++) { command.alternate.config_index = i; command.alternate.interface_index = j; if (ioctl(fRawFD, B_USB_RAW_COMMAND_GET_ALT_INTERFACE_COUNT, &command, sizeof(command)) || @@ -495,8 +494,8 @@ USBDevice::Initialise() //Do we need more error checking, etc? How to report? close(fRawFD); return B_ERROR; } - int num_alternate = command.alternate.alternate_info; - for (int k = 0; k < num_alternate; k++) { + uint8 num_alternate = (uint8)command.alternate.alternate_info; + for (uint8 k = 0; k < num_alternate; k++) { usb_interface_descriptor tmp_interface; command.interface_etc.config_index = i; command.interface_etc.interface_index = j; @@ -508,7 +507,7 @@ USBDevice::Initialise() //Do we need more error checking, etc? How to report? close(fRawFD); return B_ERROR; } - for (int l = 0; l < tmp_interface.num_endpoints; l++) { + for (uint8 l = 0; l < tmp_interface.num_endpoints; l++) { usb_endpoint_descriptor tmp_endpoint; command.endpoint_etc.config_index = i; command.endpoint_etc.interface_index = j; diff --git a/libusb/os/haiku_usb_raw.cpp b/libusb/os/haiku_usb_raw.cpp index 7c0c4db..af28c0b 100644 --- a/libusb/os/haiku_usb_raw.cpp +++ b/libusb/os/haiku_usb_raw.cpp @@ -111,7 +111,9 @@ static int haiku_set_configuration(struct libusb_device_handle *dev_handle, int config) { USBDeviceHandle *handle= *((USBDeviceHandle **)usbi_get_device_handle_priv(dev_handle)); - return handle->SetConfiguration(config); + if (config <= 0) + return LIBUSB_ERROR_NOT_SUPPORTED; // cannot unconfigure + return handle->SetConfiguration((uint8)config); } static int @@ -187,31 +189,53 @@ haiku_handle_transfer_completion(struct usbi_transfer *itransfer) } const struct usbi_os_backend usbi_backend = { - .name = "Haiku usbfs", - .caps = 0, - .init = haiku_init, - .exit = haiku_exit, - .open = haiku_open, - .close = haiku_close, - - .get_device_descriptor = haiku_get_device_descriptor, - .get_active_config_descriptor = haiku_get_active_config_descriptor, - .get_config_descriptor = haiku_get_config_descriptor, - - .set_configuration = haiku_set_configuration, - - .claim_interface = haiku_claim_interface, - .release_interface = haiku_release_interface, - - .set_interface_altsetting = haiku_set_altsetting, - .clear_halt = haiku_clear_halt, - - .submit_transfer = haiku_submit_transfer, - .cancel_transfer = haiku_cancel_transfer, - - .handle_transfer_completion = haiku_handle_transfer_completion, - - .device_priv_size = sizeof(USBDevice *), - .device_handle_priv_size = sizeof(USBDeviceHandle *), - .transfer_priv_size = sizeof(USBTransfer *), + /*.name =*/ "Haiku usbfs", + /*.caps =*/ 0, + /*.init =*/ haiku_init, + /*.exit =*/ haiku_exit, + /*.set_option =*/ NULL, + /*.get_device_list =*/ NULL, + /*.hotplug_poll =*/ NULL, + /*.wrap_sys_device =*/ NULL, + /*.open =*/ haiku_open, + /*.close =*/ haiku_close, + + /*.get_device_descriptor =*/ haiku_get_device_descriptor, + /*.get_active_config_descriptor =*/ haiku_get_active_config_descriptor, + /*.get_config_descriptor =*/ haiku_get_config_descriptor, + /*.get_config_descriptor_by_value =*/ NULL, + + /*.get_configuration =*/ NULL, + /*.set_configuration =*/ haiku_set_configuration, + + /*.claim_interface =*/ haiku_claim_interface, + /*.release_interface =*/ haiku_release_interface, + /*.set_interface_altsetting =*/ haiku_set_altsetting, + + /*.clear_halt =*/ haiku_clear_halt, + /*.reset_device =*/ NULL, + + /*.alloc_streams =*/ NULL, + /*.free_streams =*/ NULL, + + /*.dev_mem_alloc =*/ NULL, + /*.dev_mem_free =*/ NULL, + + /*.kernel_driver_active =*/ NULL, + /*.detach_kernel_driver =*/ NULL, + /*.attach_kernel_driver =*/ NULL, + + /*.destroy_device =*/ NULL, + + /*.submit_transfer =*/ haiku_submit_transfer, + /*.cancel_transfer =*/ haiku_cancel_transfer, + /*.clear_transfer_priv =*/ NULL, + + /*.handle_events =*/ NULL, + /*.handle_transfer_completion =*/ haiku_handle_transfer_completion, + + /*.context_priv_size =*/ 0, + /*.device_priv_size =*/ sizeof(USBDevice *), + /*.device_handle_priv_size =*/ sizeof(USBDeviceHandle *), + /*.transfer_priv_size =*/ sizeof(USBTransfer *), }; |