| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "device/usb/usb_device_handle_usbfs.h" | 5 #include "device/usb/usb_device_handle_usbfs.h" |
| 6 | 6 |
| 7 #if defined(OS_ANDROID) && __ANDROID_API__ < 21 | 7 #if defined(OS_ANDROID) && __ANDROID_API__ < 21 |
| 8 #include <linux/usb_ch9.h> | 8 #include <linux/usb_ch9.h> |
| 9 #else | 9 #else |
| 10 #include <linux/usb/ch9.h> | 10 #include <linux/usb/ch9.h> |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 } | 222 } |
| 223 | 223 |
| 224 void UsbDeviceHandleUsbfs::FileThreadHelper::WillDestroyCurrentMessageLoop() { | 224 void UsbDeviceHandleUsbfs::FileThreadHelper::WillDestroyCurrentMessageLoop() { |
| 225 DCHECK(thread_checker_.CalledOnValidThread()); | 225 DCHECK(thread_checker_.CalledOnValidThread()); |
| 226 delete this; | 226 delete this; |
| 227 } | 227 } |
| 228 | 228 |
| 229 struct UsbDeviceHandleUsbfs::Transfer { | 229 struct UsbDeviceHandleUsbfs::Transfer { |
| 230 Transfer() = delete; | 230 Transfer() = delete; |
| 231 Transfer(scoped_refptr<net::IOBuffer> buffer, | 231 Transfer(scoped_refptr<net::IOBuffer> buffer, |
| 232 const TransferCallback& callback); | 232 const TransferCallback& callback, |
| 233 scoped_refptr<base::SingleThreadTaskRunner> callback_runner); |
| 233 Transfer(scoped_refptr<net::IOBuffer> buffer, | 234 Transfer(scoped_refptr<net::IOBuffer> buffer, |
| 234 const IsochronousTransferCallback& callback); | 235 const IsochronousTransferCallback& callback); |
| 235 ~Transfer(); | 236 ~Transfer(); |
| 236 | 237 |
| 237 void* operator new(std::size_t size, size_t number_of_iso_packets); | 238 void* operator new(std::size_t size, size_t number_of_iso_packets); |
| 239 void RunCallback(UsbTransferStatus status, size_t bytes_transferred); |
| 240 void RunIsochronousCallback(const std::vector<IsochronousPacket>& packets); |
| 238 | 241 |
| 239 scoped_refptr<net::IOBuffer> control_transfer_buffer; | 242 scoped_refptr<net::IOBuffer> control_transfer_buffer; |
| 240 scoped_refptr<net::IOBuffer> buffer; | 243 scoped_refptr<net::IOBuffer> buffer; |
| 241 TransferCallback callback; | 244 TransferCallback callback; |
| 242 IsochronousTransferCallback isoc_callback; | 245 IsochronousTransferCallback isoc_callback; |
| 246 scoped_refptr<base::SingleThreadTaskRunner> callback_runner; |
| 243 base::CancelableClosure timeout_closure; | 247 base::CancelableClosure timeout_closure; |
| 244 bool cancelled = false; | 248 bool cancelled = false; |
| 245 | 249 |
| 246 // The |urb| field must be the last in the struct so that the extra space | 250 // The |urb| field must be the last in the struct so that the extra space |
| 247 // allocated by the overridden new function above extends the length of its | 251 // allocated by the overridden new function above extends the length of its |
| 248 // |iso_frame_desc| field. | 252 // |iso_frame_desc| field. |
| 249 usbdevfs_urb urb; | 253 usbdevfs_urb urb; |
| 250 | 254 |
| 251 private: | 255 private: |
| 252 DISALLOW_COPY_AND_ASSIGN(Transfer); | 256 DISALLOW_COPY_AND_ASSIGN(Transfer); |
| 253 }; | 257 }; |
| 254 | 258 |
| 255 UsbDeviceHandleUsbfs::Transfer::Transfer(scoped_refptr<net::IOBuffer> buffer, | 259 UsbDeviceHandleUsbfs::Transfer::Transfer( |
| 256 const TransferCallback& callback) | 260 scoped_refptr<net::IOBuffer> buffer, |
| 257 : buffer(buffer), callback(callback) { | 261 const TransferCallback& callback, |
| 262 scoped_refptr<base::SingleThreadTaskRunner> callback_runner) |
| 263 : buffer(buffer), callback(callback), callback_runner(callback_runner) { |
| 258 memset(&urb, 0, sizeof(urb)); | 264 memset(&urb, 0, sizeof(urb)); |
| 259 urb.usercontext = this; | 265 urb.usercontext = this; |
| 260 urb.buffer = buffer->data(); | 266 urb.buffer = buffer->data(); |
| 261 } | 267 } |
| 262 | 268 |
| 263 UsbDeviceHandleUsbfs::Transfer::Transfer( | 269 UsbDeviceHandleUsbfs::Transfer::Transfer( |
| 264 scoped_refptr<net::IOBuffer> buffer, | 270 scoped_refptr<net::IOBuffer> buffer, |
| 265 const IsochronousTransferCallback& callback) | 271 const IsochronousTransferCallback& callback) |
| 266 : buffer(buffer), isoc_callback(callback) { | 272 : buffer(buffer), isoc_callback(callback) { |
| 267 memset(&urb, 0, sizeof(urb) + | 273 memset(&urb, 0, sizeof(urb) + |
| 268 sizeof(usbdevfs_iso_packet_desc) * urb.number_of_packets); | 274 sizeof(usbdevfs_iso_packet_desc) * urb.number_of_packets); |
| 269 urb.usercontext = this; | 275 urb.usercontext = this; |
| 270 urb.buffer = buffer->data(); | 276 urb.buffer = buffer->data(); |
| 271 } | 277 } |
| 272 | 278 |
| 273 UsbDeviceHandleUsbfs::Transfer::~Transfer() = default; | 279 UsbDeviceHandleUsbfs::Transfer::~Transfer() = default; |
| 274 | 280 |
| 275 void* UsbDeviceHandleUsbfs::Transfer::operator new( | 281 void* UsbDeviceHandleUsbfs::Transfer::operator new( |
| 276 std::size_t size, | 282 std::size_t size, |
| 277 size_t number_of_iso_packets) { | 283 size_t number_of_iso_packets) { |
| 278 void* p = ::operator new( | 284 void* p = ::operator new( |
| 279 size + sizeof(usbdevfs_iso_packet_desc) * number_of_iso_packets); | 285 size + sizeof(usbdevfs_iso_packet_desc) * number_of_iso_packets); |
| 280 Transfer* transfer = static_cast<Transfer*>(p); | 286 Transfer* transfer = static_cast<Transfer*>(p); |
| 281 transfer->urb.number_of_packets = number_of_iso_packets; | 287 transfer->urb.number_of_packets = number_of_iso_packets; |
| 282 return p; | 288 return p; |
| 283 } | 289 } |
| 284 | 290 |
| 291 void UsbDeviceHandleUsbfs::Transfer::RunCallback(UsbTransferStatus status, |
| 292 size_t bytes_transferred) { |
| 293 DCHECK_NE(urb.type, USBDEVFS_URB_TYPE_ISO); |
| 294 DCHECK(!callback.is_null()); |
| 295 if (!callback_runner || callback_runner->BelongsToCurrentThread()) { |
| 296 callback.Run(status, buffer, bytes_transferred); |
| 297 } else { |
| 298 callback_runner->PostTask( |
| 299 FROM_HERE, base::Bind(callback, status, buffer, bytes_transferred)); |
| 300 } |
| 301 } |
| 302 |
| 303 void UsbDeviceHandleUsbfs::Transfer::RunIsochronousCallback( |
| 304 const std::vector<IsochronousPacket>& packets) { |
| 305 DCHECK_EQ(urb.type, USBDEVFS_URB_TYPE_ISO); |
| 306 DCHECK(!isoc_callback.is_null()); |
| 307 isoc_callback.Run(buffer, packets); |
| 308 } |
| 309 |
| 285 UsbDeviceHandleUsbfs::UsbDeviceHandleUsbfs( | 310 UsbDeviceHandleUsbfs::UsbDeviceHandleUsbfs( |
| 286 scoped_refptr<UsbDevice> device, | 311 scoped_refptr<UsbDevice> device, |
| 287 base::ScopedFD fd, | 312 base::ScopedFD fd, |
| 288 scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) | 313 scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) |
| 289 : device_(device), | 314 : device_(device), |
| 290 fd_(std::move(fd)), | 315 fd_(std::move(fd)), |
| 291 blocking_task_runner_(blocking_task_runner) { | 316 blocking_task_runner_(blocking_task_runner) { |
| 292 DCHECK(device_); | 317 DCHECK(device_); |
| 293 DCHECK(fd_.is_valid()); | 318 DCHECK(fd_.is_valid()); |
| 294 DCHECK(blocking_task_runner_); | 319 DCHECK(blocking_task_runner_); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 408 scoped_refptr<net::IOBuffer> buffer, | 433 scoped_refptr<net::IOBuffer> buffer, |
| 409 size_t length, | 434 size_t length, |
| 410 unsigned int timeout, | 435 unsigned int timeout, |
| 411 const TransferCallback& callback) { | 436 const TransferCallback& callback) { |
| 412 if (!device_) { | 437 if (!device_) { |
| 413 task_runner_->PostTask( | 438 task_runner_->PostTask( |
| 414 FROM_HERE, base::Bind(callback, USB_TRANSFER_DISCONNECT, nullptr, 0)); | 439 FROM_HERE, base::Bind(callback, USB_TRANSFER_DISCONNECT, nullptr, 0)); |
| 415 return; | 440 return; |
| 416 } | 441 } |
| 417 | 442 |
| 418 std::unique_ptr<Transfer> transfer(new (0) Transfer(buffer, callback)); | 443 std::unique_ptr<Transfer> transfer(new (0) |
| 444 Transfer(buffer, callback, nullptr)); |
| 419 transfer->control_transfer_buffer = | 445 transfer->control_transfer_buffer = |
| 420 BuildControlTransferBuffer(direction, request_type, recipient, request, | 446 BuildControlTransferBuffer(direction, request_type, recipient, request, |
| 421 value, index, buffer, length); | 447 value, index, buffer, length); |
| 422 transfer->urb.type = USBDEVFS_URB_TYPE_CONTROL; | 448 transfer->urb.type = USBDEVFS_URB_TYPE_CONTROL; |
| 423 transfer->urb.endpoint = 0; | 449 transfer->urb.endpoint = 0; |
| 424 transfer->urb.buffer = transfer->control_transfer_buffer->data(); | 450 transfer->urb.buffer = transfer->control_transfer_buffer->data(); |
| 425 transfer->urb.buffer_length = 8 + length; | 451 transfer->urb.buffer_length = 8 + length; |
| 426 | 452 |
| 427 // USBDEVFS_SUBMITURB appears to be non-blocking as completion is reported | 453 // USBDEVFS_SUBMITURB appears to be non-blocking as completion is reported |
| 428 // by USBDEVFS_REAPURBNDELAY. | 454 // by USBDEVFS_REAPURBNDELAY. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 439 } | 465 } |
| 440 | 466 |
| 441 void UsbDeviceHandleUsbfs::IsochronousTransferIn( | 467 void UsbDeviceHandleUsbfs::IsochronousTransferIn( |
| 442 uint8_t endpoint_number, | 468 uint8_t endpoint_number, |
| 443 const std::vector<uint32_t>& packet_lengths, | 469 const std::vector<uint32_t>& packet_lengths, |
| 444 unsigned int timeout, | 470 unsigned int timeout, |
| 445 const IsochronousTransferCallback& callback) { | 471 const IsochronousTransferCallback& callback) { |
| 446 uint8_t endpoint_address = USB_DIR_IN | endpoint_number; | 472 uint8_t endpoint_address = USB_DIR_IN | endpoint_number; |
| 447 size_t total_length = | 473 size_t total_length = |
| 448 std::accumulate(packet_lengths.begin(), packet_lengths.end(), 0u); | 474 std::accumulate(packet_lengths.begin(), packet_lengths.end(), 0u); |
| 449 IsochronousTransferInternal(endpoint_address, new net::IOBuffer(total_length), | 475 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(total_length)); |
| 450 total_length, packet_lengths, timeout, callback); | 476 IsochronousTransferInternal(endpoint_address, buffer, total_length, |
| 477 packet_lengths, timeout, callback); |
| 451 } | 478 } |
| 452 | 479 |
| 453 void UsbDeviceHandleUsbfs::IsochronousTransferOut( | 480 void UsbDeviceHandleUsbfs::IsochronousTransferOut( |
| 454 uint8_t endpoint_number, | 481 uint8_t endpoint_number, |
| 455 scoped_refptr<net::IOBuffer> buffer, | 482 scoped_refptr<net::IOBuffer> buffer, |
| 456 const std::vector<uint32_t>& packet_lengths, | 483 const std::vector<uint32_t>& packet_lengths, |
| 457 unsigned int timeout, | 484 unsigned int timeout, |
| 458 const IsochronousTransferCallback& callback) { | 485 const IsochronousTransferCallback& callback) { |
| 459 uint8_t endpoint_address = USB_DIR_OUT | endpoint_number; | 486 uint8_t endpoint_address = USB_DIR_OUT | endpoint_number; |
| 460 size_t total_length = | 487 size_t total_length = |
| 461 std::accumulate(packet_lengths.begin(), packet_lengths.end(), 0u); | 488 std::accumulate(packet_lengths.begin(), packet_lengths.end(), 0u); |
| 462 IsochronousTransferInternal(endpoint_address, buffer, total_length, | 489 IsochronousTransferInternal(endpoint_address, buffer, total_length, |
| 463 packet_lengths, timeout, callback); | 490 packet_lengths, timeout, callback); |
| 464 } | 491 } |
| 465 | 492 |
| 466 void UsbDeviceHandleUsbfs::GenericTransfer(UsbEndpointDirection direction, | 493 void UsbDeviceHandleUsbfs::GenericTransfer(UsbEndpointDirection direction, |
| 467 uint8_t endpoint_number, | 494 uint8_t endpoint_number, |
| 468 scoped_refptr<net::IOBuffer> buffer, | 495 scoped_refptr<net::IOBuffer> buffer, |
| 469 size_t length, | 496 size_t length, |
| 470 unsigned int timeout, | 497 unsigned int timeout, |
| 471 const TransferCallback& callback) { | 498 const TransferCallback& callback) { |
| 472 if (!device_) { | 499 if (task_runner_->BelongsToCurrentThread()) { |
| 500 GenericTransferInternal(direction, endpoint_number, buffer, length, timeout, |
| 501 callback, task_runner_); |
| 502 } else { |
| 473 task_runner_->PostTask( | 503 task_runner_->PostTask( |
| 474 FROM_HERE, base::Bind(callback, USB_TRANSFER_DISCONNECT, nullptr, 0)); | 504 FROM_HERE, |
| 475 return; | 505 base::Bind(&UsbDeviceHandleUsbfs::GenericTransferInternal, this, |
| 476 } | 506 direction, endpoint_number, buffer, length, timeout, |
| 477 | 507 callback, base::ThreadTaskRunnerHandle::Get())); |
| 478 uint8_t endpoint_address = | |
| 479 ConvertEndpointDirection(direction) | endpoint_number; | |
| 480 auto it = endpoints_.find(endpoint_address); | |
| 481 if (it == endpoints_.end()) { | |
| 482 USB_LOG(USER) << "Endpoint address " << static_cast<int>(endpoint_address) | |
| 483 << " is not part of a claimed interface."; | |
| 484 task_runner_->PostTask( | |
| 485 FROM_HERE, base::Bind(callback, USB_TRANSFER_ERROR, nullptr, 0)); | |
| 486 return; | |
| 487 } | |
| 488 | |
| 489 std::unique_ptr<Transfer> transfer(new (0) Transfer(buffer, callback)); | |
| 490 transfer->urb.endpoint = endpoint_address; | |
| 491 transfer->urb.buffer_length = length; | |
| 492 transfer->urb.type = ConvertTransferType(it->second.type); | |
| 493 | |
| 494 // USBDEVFS_SUBMITURB appears to be non-blocking as completion is reported | |
| 495 // by USBDEVFS_REAPURBNDELAY. This code assumes a recent kernel that can | |
| 496 // accept arbitrarily large transfer requests, hopefully also using a scatter- | |
| 497 // gather list. | |
| 498 int rc = HANDLE_EINTR(ioctl(fd_.get(), USBDEVFS_SUBMITURB, &transfer->urb)); | |
| 499 if (rc) { | |
| 500 rc = logging::GetLastSystemErrorCode(); | |
| 501 USB_PLOG(DEBUG) << "Failed to submit transfer"; | |
| 502 task_runner_->PostTask( | |
| 503 FROM_HERE, base::Bind(callback, ConvertTransferResult(rc), nullptr, 0)); | |
| 504 } else { | |
| 505 SetUpTimeoutCallback(transfer.get(), timeout); | |
| 506 transfers_.push_back(std::move(transfer)); | |
| 507 } | 508 } |
| 508 } | 509 } |
| 509 | 510 |
| 510 const UsbInterfaceDescriptor* UsbDeviceHandleUsbfs::FindInterfaceByEndpoint( | 511 const UsbInterfaceDescriptor* UsbDeviceHandleUsbfs::FindInterfaceByEndpoint( |
| 511 uint8_t endpoint_address) { | 512 uint8_t endpoint_address) { |
| 512 auto it = endpoints_.find(endpoint_address); | 513 auto it = endpoints_.find(endpoint_address); |
| 513 if (it != endpoints_.end()) | 514 if (it != endpoints_.end()) |
| 514 return it->second.interface; | 515 return it->second.interface; |
| 515 return nullptr; | 516 return nullptr; |
| 516 } | 517 } |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 if (rc) { | 676 if (rc) { |
| 676 rc = logging::GetLastSystemErrorCode(); | 677 rc = logging::GetLastSystemErrorCode(); |
| 677 USB_PLOG(DEBUG) << "Failed to submit transfer"; | 678 USB_PLOG(DEBUG) << "Failed to submit transfer"; |
| 678 ReportIsochronousError(packet_lengths, callback, ConvertTransferResult(rc)); | 679 ReportIsochronousError(packet_lengths, callback, ConvertTransferResult(rc)); |
| 679 } else { | 680 } else { |
| 680 SetUpTimeoutCallback(transfer.get(), timeout); | 681 SetUpTimeoutCallback(transfer.get(), timeout); |
| 681 transfers_.push_back(std::move(transfer)); | 682 transfers_.push_back(std::move(transfer)); |
| 682 } | 683 } |
| 683 } | 684 } |
| 684 | 685 |
| 686 void UsbDeviceHandleUsbfs::GenericTransferInternal( |
| 687 UsbEndpointDirection direction, |
| 688 uint8_t endpoint_number, |
| 689 scoped_refptr<net::IOBuffer> buffer, |
| 690 size_t length, |
| 691 unsigned int timeout, |
| 692 const TransferCallback& callback, |
| 693 scoped_refptr<base::SingleThreadTaskRunner> callback_runner) { |
| 694 if (!device_) { |
| 695 callback_runner->PostTask( |
| 696 FROM_HERE, base::Bind(callback, USB_TRANSFER_DISCONNECT, nullptr, 0)); |
| 697 return; |
| 698 } |
| 699 |
| 700 uint8_t endpoint_address = |
| 701 ConvertEndpointDirection(direction) | endpoint_number; |
| 702 auto it = endpoints_.find(endpoint_address); |
| 703 if (it == endpoints_.end()) { |
| 704 USB_LOG(USER) << "Endpoint address " << static_cast<int>(endpoint_address) |
| 705 << " is not part of a claimed interface."; |
| 706 callback_runner->PostTask( |
| 707 FROM_HERE, base::Bind(callback, USB_TRANSFER_ERROR, nullptr, 0)); |
| 708 return; |
| 709 } |
| 710 |
| 711 std::unique_ptr<Transfer> transfer( |
| 712 new (0) Transfer(buffer, callback, callback_runner)); |
| 713 transfer->urb.endpoint = endpoint_address; |
| 714 transfer->urb.buffer_length = length; |
| 715 transfer->urb.type = ConvertTransferType(it->second.type); |
| 716 |
| 717 // USBDEVFS_SUBMITURB appears to be non-blocking as completion is reported |
| 718 // by USBDEVFS_REAPURBNDELAY. This code assumes a recent kernel that can |
| 719 // accept arbitrarily large transfer requests, hopefully also using a scatter- |
| 720 // gather list. |
| 721 int rc = HANDLE_EINTR(ioctl(fd_.get(), USBDEVFS_SUBMITURB, &transfer->urb)); |
| 722 if (rc) { |
| 723 rc = logging::GetLastSystemErrorCode(); |
| 724 USB_PLOG(DEBUG) << "Failed to submit transfer"; |
| 725 callback_runner->PostTask( |
| 726 FROM_HERE, base::Bind(callback, ConvertTransferResult(rc), nullptr, 0)); |
| 727 } else { |
| 728 SetUpTimeoutCallback(transfer.get(), timeout); |
| 729 transfers_.push_back(std::move(transfer)); |
| 730 } |
| 731 } |
| 732 |
| 685 void UsbDeviceHandleUsbfs::ReapedUrbs(const std::vector<usbdevfs_urb*>& urbs) { | 733 void UsbDeviceHandleUsbfs::ReapedUrbs(const std::vector<usbdevfs_urb*>& urbs) { |
| 686 for (const auto& urb : urbs) { | 734 for (const auto& urb : urbs) { |
| 687 Transfer* this_transfer = static_cast<Transfer*>(urb->usercontext); | 735 Transfer* this_transfer = static_cast<Transfer*>(urb->usercontext); |
| 688 DCHECK_EQ(urb, &this_transfer->urb); | 736 DCHECK_EQ(urb, &this_transfer->urb); |
| 689 auto it = std::find_if( | 737 auto it = std::find_if( |
| 690 transfers_.begin(), transfers_.end(), | 738 transfers_.begin(), transfers_.end(), |
| 691 [this_transfer](const std::unique_ptr<Transfer>& transfer) -> bool { | 739 [this_transfer](const std::unique_ptr<Transfer>& transfer) -> bool { |
| 692 return transfer.get() == this_transfer; | 740 return transfer.get() == this_transfer; |
| 693 }); | 741 }); |
| 694 DCHECK(it != transfers_.end()); | 742 DCHECK(it != transfers_.end()); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 711 std::vector<IsochronousPacket> packets(transfer->urb.number_of_packets); | 759 std::vector<IsochronousPacket> packets(transfer->urb.number_of_packets); |
| 712 for (size_t i = 0; i < packets.size(); ++i) { | 760 for (size_t i = 0; i < packets.size(); ++i) { |
| 713 packets[i].length = transfer->urb.iso_frame_desc[i].length; | 761 packets[i].length = transfer->urb.iso_frame_desc[i].length; |
| 714 packets[i].transferred_length = | 762 packets[i].transferred_length = |
| 715 transfer->urb.iso_frame_desc[i].actual_length; | 763 transfer->urb.iso_frame_desc[i].actual_length; |
| 716 packets[i].status = ConvertTransferResult( | 764 packets[i].status = ConvertTransferResult( |
| 717 transfer->urb.status == 0 ? transfer->urb.iso_frame_desc[i].status | 765 transfer->urb.status == 0 ? transfer->urb.iso_frame_desc[i].status |
| 718 : transfer->urb.status); | 766 : transfer->urb.status); |
| 719 } | 767 } |
| 720 | 768 |
| 721 transfer->isoc_callback.Run(transfer->buffer, packets); | 769 transfer->RunIsochronousCallback(packets); |
| 722 } else { | 770 } else { |
| 723 if (transfer->urb.status == 0 && | 771 if (transfer->urb.status == 0 && |
| 724 transfer->urb.type == USBDEVFS_URB_TYPE_CONTROL) { | 772 transfer->urb.type == USBDEVFS_URB_TYPE_CONTROL) { |
| 725 // Copy the result of the control transfer back into the original buffer. | 773 // Copy the result of the control transfer back into the original buffer. |
| 726 memcpy(transfer->buffer->data(), | 774 memcpy(transfer->buffer->data(), |
| 727 transfer->control_transfer_buffer->data() + 8, | 775 transfer->control_transfer_buffer->data() + 8, |
| 728 transfer->urb.actual_length); | 776 transfer->urb.actual_length); |
| 729 } | 777 } |
| 730 | 778 |
| 731 transfer->callback.Run(ConvertTransferResult(-transfer->urb.status), | 779 transfer->RunCallback(ConvertTransferResult(-transfer->urb.status), |
| 732 transfer->buffer, transfer->urb.actual_length); | 780 transfer->urb.actual_length); |
| 733 } | 781 } |
| 734 } | 782 } |
| 735 | 783 |
| 736 void UsbDeviceHandleUsbfs::RefreshEndpointInfo() { | 784 void UsbDeviceHandleUsbfs::RefreshEndpointInfo() { |
| 737 endpoints_.clear(); | 785 endpoints_.clear(); |
| 738 | 786 |
| 739 const UsbConfigDescriptor* config = device_->GetActiveConfiguration(); | 787 const UsbConfigDescriptor* config = device_->GetActiveConfiguration(); |
| 740 if (!config) | 788 if (!config) |
| 741 return; | 789 return; |
| 742 | 790 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 791 // kernel and may be reaped later. | 839 // kernel and may be reaped later. |
| 792 transfer->cancelled = true; | 840 transfer->cancelled = true; |
| 793 transfer->timeout_closure.Cancel(); | 841 transfer->timeout_closure.Cancel(); |
| 794 if (transfer->urb.type == USBDEVFS_URB_TYPE_ISO) { | 842 if (transfer->urb.type == USBDEVFS_URB_TYPE_ISO) { |
| 795 std::vector<IsochronousPacket> packets(transfer->urb.number_of_packets); | 843 std::vector<IsochronousPacket> packets(transfer->urb.number_of_packets); |
| 796 for (size_t i = 0; i < packets.size(); ++i) { | 844 for (size_t i = 0; i < packets.size(); ++i) { |
| 797 packets[i].length = transfer->urb.iso_frame_desc[i].length; | 845 packets[i].length = transfer->urb.iso_frame_desc[i].length; |
| 798 packets[i].transferred_length = 0; | 846 packets[i].transferred_length = 0; |
| 799 packets[i].status = status; | 847 packets[i].status = status; |
| 800 } | 848 } |
| 801 transfer->isoc_callback.Run(transfer->buffer, packets); | 849 transfer->RunIsochronousCallback(packets); |
| 802 } else { | 850 } else { |
| 803 transfer->callback.Run(status, transfer->buffer, 0); | 851 transfer->RunCallback(status, 0); |
| 804 } | 852 } |
| 805 } | 853 } |
| 806 | 854 |
| 807 } // namespace device | 855 } // namespace device |
| OLD | NEW |