Loading adb/daemon/usb.cpp +20 −7 Original line number Diff line number Diff line Loading @@ -528,14 +528,16 @@ struct UsbFfsConnection : public Connection { } if (id.direction == TransferDirection::READ) { HandleRead(id, event.res); if (!HandleRead(id, event.res)) { return; } } else { HandleWrite(id); } } } void HandleRead(TransferId id, int64_t size) { bool HandleRead(TransferId id, int64_t size) { uint64_t read_idx = id.id % kUsbReadQueueDepth; IoReadBlock* block = &read_requests_[read_idx]; block->pending = false; Loading @@ -545,7 +547,7 @@ struct UsbFfsConnection : public Connection { if (block->id().id != needed_read_id_) { LOG(VERBOSE) << "read " << block->id().id << " completed while waiting for " << needed_read_id_; return; return true; } for (uint64_t id = needed_read_id_;; ++id) { Loading @@ -554,15 +556,22 @@ struct UsbFfsConnection : public Connection { if (current_block->pending) { break; } ProcessRead(current_block); if (!ProcessRead(current_block)) { return false; } ++needed_read_id_; } return true; } void ProcessRead(IoReadBlock* block) { bool ProcessRead(IoReadBlock* block) { if (!block->payload.empty()) { if (!incoming_header_.has_value()) { CHECK_EQ(sizeof(amessage), block->payload.size()); if (block->payload.size() != sizeof(amessage)) { HandleError("received packet of unexpected length while reading header"); return false; } amessage& msg = incoming_header_.emplace(); memcpy(&msg, block->payload.data(), sizeof(msg)); LOG(DEBUG) << "USB read:" << dump_header(&msg); Loading @@ -570,7 +579,10 @@ struct UsbFfsConnection : public Connection { } else { size_t bytes_left = incoming_header_->data_length - incoming_payload_.size(); Block payload = std::move(block->payload); CHECK_LE(payload.size(), bytes_left); if (block->payload.size() > bytes_left) { HandleError("received too many bytes while waiting for payload"); return false; } incoming_payload_.append(std::move(payload)); } Loading @@ -593,6 +605,7 @@ struct UsbFfsConnection : public Connection { PrepareReadBlock(block, block->id().id + kUsbReadQueueDepth); SubmitRead(block); return true; } bool SubmitRead(IoReadBlock* block) { Loading adb/daemon/usb_ffs.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -299,6 +299,7 @@ bool open_functionfs(android::base::unique_fd* out_control, android::base::uniqu } // Signal only when writing the descriptors to ffs android::base::SetProperty("sys.usb.ffs.ready", "1"); *out_control = std::move(control); } bulk_out.reset(adb_open(USB_FFS_ADB_OUT, O_RDONLY)); Loading @@ -313,7 +314,6 @@ bool open_functionfs(android::base::unique_fd* out_control, android::base::uniqu return false; } *out_control = std::move(control); *out_bulk_in = std::move(bulk_in); *out_bulk_out = std::move(bulk_out); return true; Loading Loading
adb/daemon/usb.cpp +20 −7 Original line number Diff line number Diff line Loading @@ -528,14 +528,16 @@ struct UsbFfsConnection : public Connection { } if (id.direction == TransferDirection::READ) { HandleRead(id, event.res); if (!HandleRead(id, event.res)) { return; } } else { HandleWrite(id); } } } void HandleRead(TransferId id, int64_t size) { bool HandleRead(TransferId id, int64_t size) { uint64_t read_idx = id.id % kUsbReadQueueDepth; IoReadBlock* block = &read_requests_[read_idx]; block->pending = false; Loading @@ -545,7 +547,7 @@ struct UsbFfsConnection : public Connection { if (block->id().id != needed_read_id_) { LOG(VERBOSE) << "read " << block->id().id << " completed while waiting for " << needed_read_id_; return; return true; } for (uint64_t id = needed_read_id_;; ++id) { Loading @@ -554,15 +556,22 @@ struct UsbFfsConnection : public Connection { if (current_block->pending) { break; } ProcessRead(current_block); if (!ProcessRead(current_block)) { return false; } ++needed_read_id_; } return true; } void ProcessRead(IoReadBlock* block) { bool ProcessRead(IoReadBlock* block) { if (!block->payload.empty()) { if (!incoming_header_.has_value()) { CHECK_EQ(sizeof(amessage), block->payload.size()); if (block->payload.size() != sizeof(amessage)) { HandleError("received packet of unexpected length while reading header"); return false; } amessage& msg = incoming_header_.emplace(); memcpy(&msg, block->payload.data(), sizeof(msg)); LOG(DEBUG) << "USB read:" << dump_header(&msg); Loading @@ -570,7 +579,10 @@ struct UsbFfsConnection : public Connection { } else { size_t bytes_left = incoming_header_->data_length - incoming_payload_.size(); Block payload = std::move(block->payload); CHECK_LE(payload.size(), bytes_left); if (block->payload.size() > bytes_left) { HandleError("received too many bytes while waiting for payload"); return false; } incoming_payload_.append(std::move(payload)); } Loading @@ -593,6 +605,7 @@ struct UsbFfsConnection : public Connection { PrepareReadBlock(block, block->id().id + kUsbReadQueueDepth); SubmitRead(block); return true; } bool SubmitRead(IoReadBlock* block) { Loading
adb/daemon/usb_ffs.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -299,6 +299,7 @@ bool open_functionfs(android::base::unique_fd* out_control, android::base::uniqu } // Signal only when writing the descriptors to ffs android::base::SetProperty("sys.usb.ffs.ready", "1"); *out_control = std::move(control); } bulk_out.reset(adb_open(USB_FFS_ADB_OUT, O_RDONLY)); Loading @@ -313,7 +314,6 @@ bool open_functionfs(android::base::unique_fd* out_control, android::base::uniqu return false; } *out_control = std::move(control); *out_bulk_in = std::move(bulk_in); *out_bulk_out = std::move(bulk_out); return true; Loading