Serenity Operating System
1/*
2 * Copyright (c) 2021, Jesse Buhagiar <jooster669@gmail.com>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <AK/AtomicRefCounted.h>
10#include <AK/OwnPtr.h>
11#include <Kernel/Bus/USB/PacketTypes.h>
12#include <Kernel/Bus/USB/USBPipe.h>
13#include <Kernel/Library/LockRefPtr.h>
14#include <Kernel/Memory/AnonymousVMObject.h>
15#include <Kernel/Memory/PhysicalPage.h>
16#include <Kernel/Memory/Region.h>
17
18// TODO: Callback stuff in this class please!
19namespace Kernel::USB {
20
21class Transfer final : public AtomicRefCounted<Transfer> {
22public:
23 static ErrorOr<NonnullLockRefPtr<Transfer>> create(Pipe&, u16 length, Memory::Region& dma_buffer, USBAsyncCallback callback = nullptr);
24
25 Transfer() = delete;
26 ~Transfer();
27
28 void set_setup_packet(USBRequestData const& request);
29 void set_complete() { m_complete = true; }
30 void set_error_occurred() { m_error_occurred = true; }
31
32 ErrorOr<void> write_buffer(u16 len, void* data);
33
34 // `const` here makes sure we don't blow up by writing to a physical address
35 USBRequestData const& request() const { return m_request; }
36 Pipe const& pipe() const { return m_pipe; }
37 Pipe& pipe() { return m_pipe; }
38 VirtualAddress buffer() const { return m_dma_buffer.vaddr(); }
39 PhysicalAddress buffer_physical() const { return m_dma_buffer.physical_page(0)->paddr(); }
40 u16 transfer_data_size() const { return m_transfer_data_size; }
41 bool complete() const { return m_complete; }
42 bool error_occurred() const { return m_error_occurred; }
43
44 void invoke_async_callback();
45
46private:
47 Transfer(Pipe& pipe, u16 len, Memory::Region& dma_buffer, USBAsyncCallback callback);
48 Pipe& m_pipe; // Pipe that initiated this transfer
49 Memory::Region& m_dma_buffer; // DMA buffer
50 USBRequestData m_request; // USB request
51 u16 m_transfer_data_size { 0 }; // Size of the transfer's data stage
52 bool m_complete { false }; // Has this transfer been completed?
53 bool m_error_occurred { false }; // Did an error occur during this transfer?
54 USBAsyncCallback m_callback { nullptr };
55};
56
57}