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
117
118#define PKT_WRITE_CONGESTION_ON 10000
119#define PKT_WRITE_CONGESTION_OFF 9000
120
121
122struct packet_settings
123{
124 __u32 size;
125 __u8 fp;
126 __u8 link_loss;
127
128 __u8 write_type;
129 __u8 track_mode;
130 __u8 block_mode;
131};
132
133
134
135
136struct packet_stats
137{
138 unsigned long pkt_started;
139 unsigned long pkt_ended;
140 unsigned long secs_w;
141 unsigned long secs_rg;
142 unsigned long secs_r;
143};
144
145struct packet_cdrw
146{
147 struct list_head pkt_free_list;
148 struct list_head pkt_active_list;
149 spinlock_t active_list_lock;
150 struct task_struct *thread;
151 atomic_t pending_bios;
152};
153
154
155
156
157
158#define HI_SPEED_SWITCH 512
159
160struct packet_iosched
161{
162 atomic_t attention;
163 int writing;
164 spinlock_t lock;
165 struct bio *read_queue;
166 struct bio *read_queue_tail;
167 struct bio *write_queue;
168 struct bio *write_queue_tail;
169 sector_t last_write;
170 int successive_reads;
171};
172
173
174
175
176#if (PAGE_SIZE % CD_FRAMESIZE) != 0
177#error "PAGE_SIZE must be a multiple of CD_FRAMESIZE"
178#endif
179#define PACKET_MAX_SIZE 128
180#define FRAMES_PER_PAGE (PAGE_SIZE / CD_FRAMESIZE)
181#define PACKET_MAX_SECTORS (PACKET_MAX_SIZE * CD_FRAMESIZE >> 9)
182
183enum packet_data_state {
184 PACKET_IDLE_STATE,
185 PACKET_WAITING_STATE,
186
187
188 PACKET_READ_WAIT_STATE,
189 PACKET_WRITE_WAIT_STATE,
190 PACKET_RECOVERY_STATE,
191 PACKET_FINISHED_STATE,
192
193 PACKET_NUM_STATES
194};
195
196
197
198
199struct pktcdvd_device;
200
201struct packet_data
202{
203 struct list_head list;
204
205 spinlock_t lock;
206
207
208 struct bio *orig_bios;
209 struct bio *orig_bios_tail;
210 int write_size;
211
212
213 struct bio *w_bio;
214
215
216 sector_t sector;
217 int frames;
218
219 enum packet_data_state state;
220 atomic_t run_sm;
221
222 long sleep_time;
223
224
225 atomic_t io_wait;
226 atomic_t io_errors;
227
228 struct bio *r_bios[PACKET_MAX_SIZE];
229 struct page *pages[PACKET_MAX_SIZE / FRAMES_PER_PAGE];
230
231 int cache_valid;
232
233
234
235 int id;
236 struct pktcdvd_device *pd;
237};
238
239struct pkt_rb_node {
240 struct rb_node rb_node;
241 struct bio *bio;
242};
243
244struct packet_stacked_data
245{
246 struct bio *bio;
247 struct pktcdvd_device *pd;
248};
249#define PSD_POOL_SIZE 64
250
251struct pktcdvd_kobj
252{
253 struct kobject kobj;
254 struct pktcdvd_device *pd;
255};
256#define to_pktcdvdkobj(_k) \
257 ((struct pktcdvd_kobj*)container_of(_k,struct pktcdvd_kobj,kobj))
258
259struct pktcdvd_device
260{
261 struct block_device *bdev;
262 dev_t pkt_dev;
263 char name[20];
264 struct packet_settings settings;
265 struct packet_stats stats;
266 int refcnt;
267 int write_speed;
268 int read_speed;
269 unsigned long offset;
270 __u8 mode_offset;
271 __u8 type;
272 unsigned long flags;
273 __u16 mmc3_profile;
274 __u32 nwa;
275 __u32 lra;
276 struct packet_cdrw cdrw;
277 wait_queue_head_t wqueue;
278
279 spinlock_t lock;
280 struct rb_root bio_queue;
281 int bio_queue_size;
282 sector_t current_sector;
283 atomic_t scan_queue;
284
285 mempool_t *rb_pool;
286
287 struct packet_iosched iosched;
288 struct gendisk *disk;
289
290 int write_congestion_off;
291 int write_congestion_on;
292
293 struct device *dev;
294 struct pktcdvd_kobj *kobj_stat;
295 struct pktcdvd_kobj *kobj_wqueue;
296
297 struct dentry *dfs_d_root;
298 struct dentry *dfs_f_info;
299};
300
301#endif
302
303#endif
304