6b13f685e
김민수
BSP 최초 추가
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
|
#ifndef __PKTCDVD_H
#define __PKTCDVD_H
#include <linux/blkdev.h>
#include <linux/completion.h>
#include <linux/cdrom.h>
#include <linux/kobject.h>
#include <linux/sysfs.h>
#include <linux/mempool.h>
#include <uapi/linux/pktcdvd.h>
#define PKT_WRITE_CONGESTION_ON 10000
#define PKT_WRITE_CONGESTION_OFF 9000
struct packet_settings
{
__u32 size;
__u8 fp;
__u8 link_loss;
__u8 write_type;
__u8 track_mode;
__u8 block_mode;
};
struct packet_stats
{
unsigned long pkt_started;
unsigned long pkt_ended;
unsigned long secs_w;
unsigned long secs_rg;
unsigned long secs_r;
};
struct packet_cdrw
{
struct list_head pkt_free_list;
struct list_head pkt_active_list;
spinlock_t active_list_lock;
struct task_struct *thread;
atomic_t pending_bios;
};
#define HI_SPEED_SWITCH 512
struct packet_iosched
{
atomic_t attention;
int writing;
spinlock_t lock;
struct bio_list read_queue;
struct bio_list write_queue;
sector_t last_write;
int successive_reads;
};
#if (PAGE_SIZE % CD_FRAMESIZE) != 0
#error "PAGE_SIZE must be a multiple of CD_FRAMESIZE"
#endif
#define PACKET_MAX_SIZE 128
#define FRAMES_PER_PAGE (PAGE_SIZE / CD_FRAMESIZE)
#define PACKET_MAX_SECTORS (PACKET_MAX_SIZE * CD_FRAMESIZE >> 9)
enum packet_data_state {
PACKET_IDLE_STATE,
PACKET_WAITING_STATE,
PACKET_READ_WAIT_STATE,
PACKET_WRITE_WAIT_STATE,
PACKET_RECOVERY_STATE,
PACKET_FINISHED_STATE,
PACKET_NUM_STATES
};
struct pktcdvd_device;
struct packet_data
{
struct list_head list;
spinlock_t lock;
struct bio_list orig_bios;
int write_size;
struct bio *w_bio;
sector_t sector;
int frames;
enum packet_data_state state;
atomic_t run_sm;
long sleep_time;
atomic_t io_wait;
atomic_t io_errors;
struct bio *r_bios[PACKET_MAX_SIZE];
struct page *pages[PACKET_MAX_SIZE / FRAMES_PER_PAGE];
int cache_valid;
int id;
struct pktcdvd_device *pd;
};
struct pkt_rb_node {
struct rb_node rb_node;
struct bio *bio;
};
struct packet_stacked_data
{
struct bio *bio;
struct pktcdvd_device *pd;
};
#define PSD_POOL_SIZE 64
struct pktcdvd_kobj
{
struct kobject kobj;
struct pktcdvd_device *pd;
};
#define to_pktcdvdkobj(_k) \
((struct pktcdvd_kobj*)container_of(_k,struct pktcdvd_kobj,kobj))
struct pktcdvd_device
{
struct block_device *bdev;
dev_t pkt_dev;
char name[20];
struct packet_settings settings;
struct packet_stats stats;
int refcnt;
int write_speed;
int read_speed;
unsigned long offset;
__u8 mode_offset;
__u8 type;
unsigned long flags;
__u16 mmc3_profile;
__u32 nwa;
__u32 lra;
struct packet_cdrw cdrw;
wait_queue_head_t wqueue;
spinlock_t lock;
struct rb_root bio_queue;
int bio_queue_size;
sector_t current_sector;
atomic_t scan_queue;
mempool_t *rb_pool;
struct packet_iosched iosched;
struct gendisk *disk;
int write_congestion_off;
int write_congestion_on;
struct device *dev;
struct pktcdvd_kobj *kobj_stat;
struct pktcdvd_kobj *kobj_wqueue;
struct dentry *dfs_d_root;
struct dentry *dfs_f_info;
};
#endif /* __PKTCDVD_H */
|