1
2
3
4
5
6
7
8
9
10
11
12#ifndef __PKTCDVD_H
13#define __PKTCDVD_H
14
15#include <linux/types.h>
16
17
18
19
20#define PACKET_DEBUG 1
21
22#define MAX_WRITERS 8
23
24#define PKT_RB_POOL_SIZE 512
25
26
27
28
29#define PACKET_WAIT_TIME (HZ * 5 / 1000)
30
31
32
33
34
35
36#if defined(CONFIG_CDROM_PKTCDVD_WCACHE)
37#define USE_WCACHING 1
38#else
39#define USE_WCACHING 0
40#endif
41
42
43
44
45
46
47
48
49#define PACKET_CDR 1
50#define PACKET_CDRW 2
51#define PACKET_DVDR 3
52#define PACKET_DVDRW 4
53
54
55
56
57#define PACKET_WRITABLE 1
58#define PACKET_NWA_VALID 2
59#define PACKET_LRA_VALID 3
60#define PACKET_MERGE_SEGS 4
61
62
63
64
65
66#define PACKET_DISC_EMPTY 0
67#define PACKET_DISC_INCOMPLETE 1
68#define PACKET_DISC_COMPLETE 2
69#define PACKET_DISC_OTHER 3
70
71
72
73
74#define PACKET_MODE1 1
75#define PACKET_MODE2 2
76#define PACKET_BLOCK_MODE1 8
77#define PACKET_BLOCK_MODE2 10
78
79
80
81
82#define PACKET_SESSION_EMPTY 0
83#define PACKET_SESSION_INCOMPLETE 1
84#define PACKET_SESSION_RESERVED 2
85#define PACKET_SESSION_COMPLETE 3
86
87#define PACKET_MCN "4a656e734178626f65323030300000"
88
89#undef PACKET_USE_LS
90
91#define PKT_CTRL_CMD_SETUP 0
92#define PKT_CTRL_CMD_TEARDOWN 1
93#define PKT_CTRL_CMD_STATUS 2
94
95struct pkt_ctrl_command {
96 __u32 command;
97 __u32 dev_index;
98 __u32 dev;
99 __u32 pkt_dev;
100 __u32 num_devices;
101 __u32 padding;
102};
103
104
105
106
107#define PACKET_IOCTL_MAGIC ('X')
108#define PACKET_CTRL_CMD _IOWR(PACKET_IOCTL_MAGIC, 1, struct pkt_ctrl_command)
109
110#ifdef __KERNEL__
111#include <linux/blkdev.h>
112#include <linux/completion.h>
113#include <linux/cdrom.h>
114#include <linux/kobject.h>
115#include <linux/sysfs.h>
116#include <linux/mempool.h>
117
118
119#define PKT_WRITE_CONGESTION_ON 10000
120#define PKT_WRITE_CONGESTION_OFF 9000
121
122
123struct packet_settings
124{
125 __u32 size;
126 __u8 fp;
127 __u8 link_loss;
128
129 __u8 write_type;
130 __u8 track_mode;
131 __u8 block_mode;
132};
133
134
135
136
137struct packet_stats
138{
139 unsigned long pkt_started;
140 unsigned long pkt_ended;
141 unsigned long secs_w;
142 unsigned long secs_rg;
143 unsigned long secs_r;
144};
145
146struct packet_cdrw
147{
148 struct list_head pkt_free_list;
149 struct list_head pkt_active_list;
150 spinlock_t active_list_lock;
151 struct task_struct *thread;
152 atomic_t pending_bios;
153};
154
155
156
157
158
159#define HI_SPEED_SWITCH 512
160
161struct packet_iosched
162{
163 atomic_t attention;
164 int writing;
165 spinlock_t lock;
166 struct bio *read_queue;
167 struct bio *read_queue_tail;
168 struct bio *write_queue;
169 struct bio *write_queue_tail;
170 sector_t last_write;
171 int successive_reads;
172};
173
174
175
176
177#if (PAGE_SIZE % CD_FRAMESIZE) != 0
178#error "PAGE_SIZE must be a multiple of CD_FRAMESIZE"
179#endif
180#define PACKET_MAX_SIZE 128
181#define FRAMES_PER_PAGE (PAGE_SIZE / CD_FRAMESIZE)
182#define PACKET_MAX_SECTORS (PACKET_MAX_SIZE * CD_FRAMESIZE >> 9)
183
184enum packet_data_state {
185 PACKET_IDLE_STATE,
186 PACKET_WAITING_STATE,
187
188
189 PACKET_READ_WAIT_STATE,
190 PACKET_WRITE_WAIT_STATE,
191 PACKET_RECOVERY_STATE,
192 PACKET_FINISHED_STATE,
193
194 PACKET_NUM_STATES
195};
196
197
198
199
200struct pktcdvd_device;
201
202struct packet_data
203{
204 struct list_head list;
205
206 spinlock_t lock;
207
208
209 struct bio *orig_bios;
210 struct bio *orig_bios_tail;
211 int write_size;
212
213
214 struct bio *w_bio;
215
216
217 sector_t sector;
218 int frames;
219
220 enum packet_data_state state;
221 atomic_t run_sm;
222
223 long sleep_time;
224
225
226 atomic_t io_wait;
227 atomic_t io_errors;
228
229 struct bio *r_bios[PACKET_MAX_SIZE];
230 struct page *pages[PACKET_MAX_SIZE / FRAMES_PER_PAGE];
231
232 int cache_valid;
233
234
235
236 int id;
237 struct pktcdvd_device *pd;
238};
239
240struct pkt_rb_node {
241 struct rb_node rb_node;
242 struct bio *bio;
243};
244
245struct packet_stacked_data
246{
247 struct bio *bio;
248 struct pktcdvd_device *pd;
249};
250#define PSD_POOL_SIZE 64
251
252struct pktcdvd_kobj
253{
254 struct kobject kobj;
255 struct pktcdvd_device *pd;
256};
257#define to_pktcdvdkobj(_k) \
258 ((struct pktcdvd_kobj*)container_of(_k,struct pktcdvd_kobj,kobj))
259
260struct pktcdvd_device
261{
262 struct block_device *bdev;
263 dev_t pkt_dev;
264 char name[20];
265 struct packet_settings settings;
266 struct packet_stats stats;
267 int refcnt;
268 int write_speed;
269 int read_speed;
270 unsigned long offset;
271 __u8 mode_offset;
272 __u8 type;
273 unsigned long flags;
274 __u16 mmc3_profile;
275 __u32 nwa;
276 __u32 lra;
277 struct packet_cdrw cdrw;
278 wait_queue_head_t wqueue;
279
280 spinlock_t lock;
281 struct rb_root bio_queue;
282 int bio_queue_size;
283 sector_t current_sector;
284 atomic_t scan_queue;
285
286 mempool_t *rb_pool;
287
288 struct packet_iosched iosched;
289 struct gendisk *disk;
290
291 int write_congestion_off;
292 int write_congestion_on;
293
294 struct device *dev;
295 struct pktcdvd_kobj *kobj_stat;
296 struct pktcdvd_kobj *kobj_wqueue;
297
298 struct dentry *dfs_d_root;
299 struct dentry *dfs_f_info;
300};
301
302#endif
303
304#endif
305