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

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

Issue 2849893003: Shorten USB enumeration control transfer timeouts to 2 seconds (Closed)
Patch Set: Add units to the constant name Created 3 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 | « no previous file | device/usb/webusb_descriptors.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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_descriptors.h" 5 #include "device/usb/usb_descriptors.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
(...skipping 23 matching lines...) Expand all
34 const uint8_t kInterfaceDescriptorType = 0x04; 34 const uint8_t kInterfaceDescriptorType = 0x04;
35 const uint8_t kEndpointDescriptorType = 0x05; 35 const uint8_t kEndpointDescriptorType = 0x05;
36 const uint8_t kInterfaceAssociationDescriptorType = 11; 36 const uint8_t kInterfaceAssociationDescriptorType = 11;
37 37
38 const uint8_t kDeviceDescriptorLength = 18; 38 const uint8_t kDeviceDescriptorLength = 18;
39 const uint8_t kConfigurationDescriptorLength = 9; 39 const uint8_t kConfigurationDescriptorLength = 9;
40 const uint8_t kInterfaceDescriptorLength = 9; 40 const uint8_t kInterfaceDescriptorLength = 9;
41 const uint8_t kEndpointDescriptorLength = 7; 41 const uint8_t kEndpointDescriptorLength = 7;
42 const uint8_t kInterfaceAssociationDescriptorLength = 8; 42 const uint8_t kInterfaceAssociationDescriptorLength = 8;
43 43
44 const int kControlTransferTimeout = 60000; // 1 minute 44 const int kControlTransferTimeoutMs = 2000; // 2 seconds
45 45
46 struct UsbInterfaceAssociationDescriptor { 46 struct UsbInterfaceAssociationDescriptor {
47 UsbInterfaceAssociationDescriptor(uint8_t first_interface, 47 UsbInterfaceAssociationDescriptor(uint8_t first_interface,
48 uint8_t interface_count) 48 uint8_t interface_count)
49 : first_interface(first_interface), interface_count(interface_count) {} 49 : first_interface(first_interface), interface_count(interface_count) {}
50 50
51 bool operator<(const UsbInterfaceAssociationDescriptor& other) const { 51 bool operator<(const UsbInterfaceAssociationDescriptor& other) const {
52 return first_interface < other.first_interface; 52 return first_interface < other.first_interface;
53 } 53 }
54 54
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 scoped_refptr<IOBuffer> header, 116 scoped_refptr<IOBuffer> header,
117 size_t length) { 117 size_t length) {
118 if (status == UsbTransferStatus::COMPLETED && length == 4) { 118 if (status == UsbTransferStatus::COMPLETED && length == 4) {
119 const uint8_t* data = reinterpret_cast<const uint8_t*>(header->data()); 119 const uint8_t* data = reinterpret_cast<const uint8_t*>(header->data());
120 uint16_t total_length = data[2] | data[3] << 8; 120 uint16_t total_length = data[2] | data[3] << 8;
121 scoped_refptr<IOBuffer> buffer = new IOBuffer(total_length); 121 scoped_refptr<IOBuffer> buffer = new IOBuffer(total_length);
122 device_handle->ControlTransfer( 122 device_handle->ControlTransfer(
123 UsbTransferDirection::INBOUND, UsbControlTransferType::STANDARD, 123 UsbTransferDirection::INBOUND, UsbControlTransferType::STANDARD,
124 UsbControlTransferRecipient::DEVICE, kGetDescriptorRequest, 124 UsbControlTransferRecipient::DEVICE, kGetDescriptorRequest,
125 kConfigurationDescriptorType << 8 | index, 0, buffer, total_length, 125 kConfigurationDescriptorType << 8 | index, 0, buffer, total_length,
126 kControlTransferTimeout, 126 kControlTransferTimeoutMs,
127 base::Bind(&OnReadConfigDescriptor, desc, closure)); 127 base::Bind(&OnReadConfigDescriptor, desc, closure));
128 } else { 128 } else {
129 LOG(ERROR) << "Failed to read length for configuration " 129 LOG(ERROR) << "Failed to read length for configuration "
130 << static_cast<int>(index) << "."; 130 << static_cast<int>(index) << ".";
131 closure.Run(); 131 closure.Run();
132 } 132 }
133 } 133 }
134 134
135 void OnReadDeviceDescriptor( 135 void OnReadDeviceDescriptor(
136 scoped_refptr<UsbDeviceHandle> device_handle, 136 scoped_refptr<UsbDeviceHandle> device_handle,
(...skipping 25 matching lines...) Expand all
162 base::Closure closure = base::BarrierClosure( 162 base::Closure closure = base::BarrierClosure(
163 num_configurations, 163 num_configurations,
164 base::Bind(OnDoneReadingConfigDescriptors, device_handle, 164 base::Bind(OnDoneReadingConfigDescriptors, device_handle,
165 base::Passed(&desc), callback)); 165 base::Passed(&desc), callback));
166 for (uint8_t i = 0; i < num_configurations; ++i) { 166 for (uint8_t i = 0; i < num_configurations; ++i) {
167 scoped_refptr<IOBufferWithSize> header = new IOBufferWithSize(4); 167 scoped_refptr<IOBufferWithSize> header = new IOBufferWithSize(4);
168 device_handle->ControlTransfer( 168 device_handle->ControlTransfer(
169 UsbTransferDirection::INBOUND, UsbControlTransferType::STANDARD, 169 UsbTransferDirection::INBOUND, UsbControlTransferType::STANDARD,
170 UsbControlTransferRecipient::DEVICE, kGetDescriptorRequest, 170 UsbControlTransferRecipient::DEVICE, kGetDescriptorRequest,
171 kConfigurationDescriptorType << 8 | i, 0, header, header->size(), 171 kConfigurationDescriptorType << 8 | i, 0, header, header->size(),
172 kControlTransferTimeout, 172 kControlTransferTimeoutMs,
173 base::Bind(&OnReadConfigDescriptorHeader, device_handle, desc_ptr, i, 173 base::Bind(&OnReadConfigDescriptorHeader, device_handle, desc_ptr, i,
174 closure)); 174 closure));
175 } 175 }
176 } 176 }
177 177
178 void StoreStringDescriptor(IndexMap::iterator it, 178 void StoreStringDescriptor(IndexMap::iterator it,
179 const base::Closure& callback, 179 const base::Closure& callback,
180 const base::string16& string) { 180 const base::string16& string) {
181 it->second = string; 181 it->second = string;
182 callback.Run(); 182 callback.Run();
(...skipping 18 matching lines...) Expand all
201 void ReadStringDescriptor( 201 void ReadStringDescriptor(
202 scoped_refptr<UsbDeviceHandle> device_handle, 202 scoped_refptr<UsbDeviceHandle> device_handle,
203 uint8_t index, 203 uint8_t index,
204 uint16_t language_id, 204 uint16_t language_id,
205 const base::Callback<void(const base::string16&)>& callback) { 205 const base::Callback<void(const base::string16&)>& callback) {
206 scoped_refptr<IOBufferWithSize> buffer = new IOBufferWithSize(255); 206 scoped_refptr<IOBufferWithSize> buffer = new IOBufferWithSize(255);
207 device_handle->ControlTransfer( 207 device_handle->ControlTransfer(
208 UsbTransferDirection::INBOUND, UsbControlTransferType::STANDARD, 208 UsbTransferDirection::INBOUND, UsbControlTransferType::STANDARD,
209 UsbControlTransferRecipient::DEVICE, kGetDescriptorRequest, 209 UsbControlTransferRecipient::DEVICE, kGetDescriptorRequest,
210 kStringDescriptorType << 8 | index, language_id, buffer, buffer->size(), 210 kStringDescriptorType << 8 | index, language_id, buffer, buffer->size(),
211 kControlTransferTimeout, base::Bind(&OnReadStringDescriptor, callback)); 211 kControlTransferTimeoutMs, base::Bind(&OnReadStringDescriptor, callback));
212 } 212 }
213 213
214 void OnReadLanguageIds(scoped_refptr<UsbDeviceHandle> device_handle, 214 void OnReadLanguageIds(scoped_refptr<UsbDeviceHandle> device_handle,
215 IndexMapPtr index_map, 215 IndexMapPtr index_map,
216 const base::Callback<void(IndexMapPtr)>& callback, 216 const base::Callback<void(IndexMapPtr)>& callback,
217 const base::string16& languages) { 217 const base::string16& languages) {
218 // Default to English unless the device provides a language and then just pick 218 // Default to English unless the device provides a language and then just pick
219 // the first one. 219 // the first one.
220 uint16_t language_id = languages.empty() ? 0x0409 : languages[0]; 220 uint16_t language_id = languages.empty() ? 0x0409 : languages[0];
221 221
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 496
497 void ReadUsbDescriptors(scoped_refptr<UsbDeviceHandle> device_handle, 497 void ReadUsbDescriptors(scoped_refptr<UsbDeviceHandle> device_handle,
498 const base::Callback<void( 498 const base::Callback<void(
499 std::unique_ptr<UsbDeviceDescriptor>)>& callback) { 499 std::unique_ptr<UsbDeviceDescriptor>)>& callback) {
500 scoped_refptr<IOBufferWithSize> buffer = 500 scoped_refptr<IOBufferWithSize> buffer =
501 new IOBufferWithSize(kDeviceDescriptorLength); 501 new IOBufferWithSize(kDeviceDescriptorLength);
502 device_handle->ControlTransfer( 502 device_handle->ControlTransfer(
503 UsbTransferDirection::INBOUND, UsbControlTransferType::STANDARD, 503 UsbTransferDirection::INBOUND, UsbControlTransferType::STANDARD,
504 UsbControlTransferRecipient::DEVICE, kGetDescriptorRequest, 504 UsbControlTransferRecipient::DEVICE, kGetDescriptorRequest,
505 kDeviceDescriptorType << 8, 0, buffer, buffer->size(), 505 kDeviceDescriptorType << 8, 0, buffer, buffer->size(),
506 kControlTransferTimeout, 506 kControlTransferTimeoutMs,
507 base::Bind(&OnReadDeviceDescriptor, device_handle, callback)); 507 base::Bind(&OnReadDeviceDescriptor, device_handle, callback));
508 } 508 }
509 509
510 bool ParseUsbStringDescriptor(const std::vector<uint8_t>& descriptor, 510 bool ParseUsbStringDescriptor(const std::vector<uint8_t>& descriptor,
511 base::string16* output) { 511 base::string16* output) {
512 if (descriptor.size() < 2 || descriptor[1] != kStringDescriptorType) 512 if (descriptor.size() < 2 || descriptor[1] != kStringDescriptorType)
513 return false; 513 return false;
514 514
515 // Let the device return a buffer larger than the actual string but prefer the 515 // Let the device return a buffer larger than the actual string but prefer the
516 // length reported inside the descriptor. 516 // length reported inside the descriptor.
(...skipping 19 matching lines...) Expand all
536 callback.Run(std::move(index_map)); 536 callback.Run(std::move(index_map));
537 return; 537 return;
538 } 538 }
539 539
540 ReadStringDescriptor(device_handle, 0, 0, 540 ReadStringDescriptor(device_handle, 0, 0,
541 base::Bind(&OnReadLanguageIds, device_handle, 541 base::Bind(&OnReadLanguageIds, device_handle,
542 base::Passed(&index_map), callback)); 542 base::Passed(&index_map), callback));
543 } 543 }
544 544
545 } // namespace device 545 } // namespace device
OLDNEW
« no previous file with comments | « no previous file | device/usb/webusb_descriptors.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698