Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Side by Side Diff: device/usb/usb_device_handle_usbfs.cc

Issue 1916053006: Support USB transfers from arbitrary threads in the new Linux backend. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « device/usb/usb_device_handle_usbfs.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « device/usb/usb_device_handle_usbfs.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698