1/*
2 * Copyright 2008-2023, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Michael Lotz <mmlr@mlotz.ch>
7 */
8#ifndef _USB_DISK_H_
9#define _USB_DISK_H_
10
11
12#include <util/Vector.h>
13#include <util/DoublyLinkedList.h>
14
15#include <lock.h>
16#include <USB3.h>
17#include <device_manager.h>
18#include <usb/USB_massbulk.h>
19
20
21#define REQUEST_MASS_STORAGE_RESET	0xff
22#define REQUEST_GET_MAX_LUN			0xfe
23#define MAX_LOGICAL_UNIT_NUMBER		15
24#define ATAPI_COMMAND_LENGTH		12
25
26#define SYNC_SUPPORT_RELOAD			5
27
28struct IOScheduler;
29struct DMAResource;
30typedef struct device_lun_s device_lun;
31
32// holds common information about an attached device (pointed to by luns)
33typedef struct disk_device_s {
34	disk_device_s();
35	~disk_device_s();
36
37	int32		number;
38	device_node	*node;
39
40	usb_device	device;
41	bool		removed;
42	uint32		open_count;
43	recursive_lock io_lock;
44	mutex		lock;
45
46	// IO operations
47	Vector<DMAResource*>	dma_resources;
48
49	// device state
50	usb_pipe	bulk_in;
51	usb_pipe	bulk_out;
52	usb_pipe	interrupt;
53	uint8		interface;
54	uint32		current_tag;
55	uint8		sync_support;
56	bool		tur_supported;
57	bool		is_atapi;
58	bool		is_ufi;
59
60	// used to store callback information
61	sem_id		notify;
62	status_t	status;
63	size_t		actual_length;
64
65	// used to store interrupt result
66	unsigned char interruptBuffer[2];
67	sem_id interruptLock;
68
69	// logical units of this device
70	uint8		lun_count;
71	device_lun **luns;
72} disk_device;
73
74
75// represents a logical unit on the pointed to device - this gets published
76struct device_lun_s {
77	disk_device *device;
78	char		name[32];
79	uint8		logical_unit_number;
80	bool		should_sync;
81
82	// device information through read capacity/inquiry
83	bool		media_present;
84	bool		media_changed;
85	uint64		block_count;
86	uint32		block_size;
87	uint32		physical_block_size;
88	uint8		device_type;
89	bool		removable;
90	bool		write_protected;
91
92	char		vendor_name[8];
93	char		product_name[16];
94	char		product_revision[4];
95};
96
97
98typedef struct interrupt_status_wrapper_s {
99	uint8		status;
100	uint8		misc;
101} _PACKED interrupt_status_wrapper;
102
103
104#endif // _USB_DISK_H_
105