Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / memstick / core / ms_block.h
1 /*
2  *  ms_block.h - Sony MemoryStick (legacy) storage support
3
4  *  Copyright (C) 2013 Maxim Levitsky <maximlevitsky@gmail.com>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * Minor portions of the driver are copied from mspro_block.c which is
11  * Copyright (C) 2007 Alex Dubov <oakad@yahoo.com>
12  *
13  * Also ms structures were copied from old broken driver by same author
14  * These probably come from MS spec
15  *
16  */
17
18 #ifndef MS_BLOCK_NEW_H
19 #define MS_BLOCK_NEW_H
20
21 #define MS_BLOCK_MAX_SEGS      32
22 #define MS_BLOCK_MAX_PAGES     ((2 << 16) - 1)
23
24 #define MS_BLOCK_MAX_BOOT_ADDR 0x000c
25 #define MS_BLOCK_BOOT_ID       0x0001
26 #define MS_BLOCK_INVALID       0xffff
27 #define MS_MAX_ZONES           16
28 #define MS_BLOCKS_IN_ZONE      512
29
30 #define MS_BLOCK_MAP_LINE_SZ   16
31 #define MS_BLOCK_PART_SHIFT    3
32
33
34 #define MEMSTICK_UNCORR_ERROR (MEMSTICK_STATUS1_UCFG | \
35                 MEMSTICK_STATUS1_UCEX | MEMSTICK_STATUS1_UCDT)
36
37 #define MEMSTICK_CORR_ERROR (MEMSTICK_STATUS1_FGER | MEMSTICK_STATUS1_EXER | \
38         MEMSTICK_STATUS1_DTER)
39
40 #define MEMSTICK_INT_ERROR (MEMSTICK_INT_CMDNAK | MEMSTICK_INT_ERR)
41
42 #define MEMSTICK_OVERWRITE_FLAG_NORMAL \
43         (MEMSTICK_OVERWRITE_PGST1 | \
44         MEMSTICK_OVERWRITE_PGST0  | \
45         MEMSTICK_OVERWRITE_BKST)
46
47 #define MEMSTICK_OV_PG_NORMAL \
48         (MEMSTICK_OVERWRITE_PGST1 | MEMSTICK_OVERWRITE_PGST0)
49
50 #define MEMSTICK_MANAGMENT_FLAG_NORMAL \
51         (MEMSTICK_MANAGEMENT_SYSFLG |  \
52         MEMSTICK_MANAGEMENT_SCMS1   |  \
53         MEMSTICK_MANAGEMENT_SCMS0)     \
54
55 struct ms_boot_header {
56         unsigned short block_id;
57         unsigned short format_reserved;
58         unsigned char  reserved0[184];
59         unsigned char  data_entry;
60         unsigned char  reserved1[179];
61 } __packed;
62
63
64 struct ms_system_item {
65         unsigned int  start_addr;
66         unsigned int  data_size;
67         unsigned char data_type_id;
68         unsigned char reserved[3];
69 } __packed;
70
71 struct ms_system_entry {
72         struct ms_system_item disabled_block;
73         struct ms_system_item cis_idi;
74         unsigned char         reserved[24];
75 } __packed;
76
77 struct ms_boot_attr_info {
78         unsigned char      memorystick_class;
79         unsigned char      format_unique_value1;
80         unsigned short     block_size;
81         unsigned short     number_of_blocks;
82         unsigned short     number_of_effective_blocks;
83         unsigned short     page_size;
84         unsigned char      extra_data_size;
85         unsigned char      format_unique_value2;
86         unsigned char      assembly_time[8];
87         unsigned char      format_unique_value3;
88         unsigned char      serial_number[3];
89         unsigned char      assembly_manufacturer_code;
90         unsigned char      assembly_model_code[3];
91         unsigned short     memory_manufacturer_code;
92         unsigned short     memory_device_code;
93         unsigned short     implemented_capacity;
94         unsigned char      format_unique_value4[2];
95         unsigned char      vcc;
96         unsigned char      vpp;
97         unsigned short     controller_number;
98         unsigned short     controller_function;
99         unsigned char      reserved0[9];
100         unsigned char      transfer_supporting;
101         unsigned short     format_unique_value5;
102         unsigned char      format_type;
103         unsigned char      memorystick_application;
104         unsigned char      device_type;
105         unsigned char      reserved1[22];
106         unsigned char      format_uniqure_value6[2];
107         unsigned char      reserved2[15];
108 } __packed;
109
110 struct ms_cis_idi {
111         unsigned short general_config;
112         unsigned short logical_cylinders;
113         unsigned short reserved0;
114         unsigned short logical_heads;
115         unsigned short track_size;
116         unsigned short page_size;
117         unsigned short pages_per_track;
118         unsigned short msw;
119         unsigned short lsw;
120         unsigned short reserved1;
121         unsigned char  serial_number[20];
122         unsigned short buffer_type;
123         unsigned short buffer_size_increments;
124         unsigned short long_command_ecc;
125         unsigned char  firmware_version[28];
126         unsigned char  model_name[18];
127         unsigned short reserved2[5];
128         unsigned short pio_mode_number;
129         unsigned short dma_mode_number;
130         unsigned short field_validity;
131         unsigned short current_logical_cylinders;
132         unsigned short current_logical_heads;
133         unsigned short current_pages_per_track;
134         unsigned int   current_page_capacity;
135         unsigned short mutiple_page_setting;
136         unsigned int   addressable_pages;
137         unsigned short single_word_dma;
138         unsigned short multi_word_dma;
139         unsigned char  reserved3[128];
140 } __packed;
141
142
143 struct ms_boot_page {
144         struct ms_boot_header    header;
145         struct ms_system_entry   entry;
146         struct ms_boot_attr_info attr;
147 } __packed;
148
149 struct msb_data {
150         unsigned int                    usage_count;
151         struct memstick_dev             *card;
152         struct gendisk                  *disk;
153         struct request_queue            *queue;
154         spinlock_t                      q_lock;
155         struct hd_geometry              geometry;
156         struct attribute_group          attr_group;
157         struct request                  *req;
158         int                             caps;
159         int                             disk_id;
160
161         /* IO */
162         struct workqueue_struct         *io_queue;
163         bool                            io_queue_stopped;
164         struct work_struct              io_work;
165         bool                            card_dead;
166
167         /* Media properties */
168         struct ms_boot_page             *boot_page;
169         u16                             boot_block_locations[2];
170         int                             boot_block_count;
171
172         bool                            read_only;
173         unsigned short                  page_size;
174         int                             block_size;
175         int                             pages_in_block;
176         int                             zone_count;
177         int                             block_count;
178         int                             logical_block_count;
179
180         /* FTL tables */
181         unsigned long                   *used_blocks_bitmap;
182         unsigned long                   *erased_blocks_bitmap;
183         u16                             *lba_to_pba_table;
184         int                             free_block_count[MS_MAX_ZONES];
185         bool                            ftl_initialized;
186
187         /* Cache */
188         unsigned char                   *cache;
189         unsigned long                   valid_cache_bitmap;
190         int                             cache_block_lba;
191         bool                            need_flush_cache;
192         struct timer_list               cache_flush_timer;
193
194         /* Preallocated buffers */
195         unsigned char                   *block_buffer;
196         struct scatterlist              prealloc_sg[MS_BLOCK_MAX_SEGS+1];
197
198
199         /* handler's local data */
200         struct ms_register_addr         reg_addr;
201         bool                            addr_valid;
202
203         u8                              command_value;
204         bool                            command_need_oob;
205         struct scatterlist              *current_sg;
206         int                             current_sg_offset;
207
208         struct ms_register              regs;
209         int                             current_page;
210
211         int                             state;
212         int                             exit_error;
213         bool                            int_polling;
214         unsigned long                   int_timeout;
215
216 };
217
218 enum msb_readpage_states {
219         MSB_RP_SEND_BLOCK_ADDRESS = 0,
220         MSB_RP_SEND_READ_COMMAND,
221
222         MSB_RP_SEND_INT_REQ,
223         MSB_RP_RECEIVE_INT_REQ_RESULT,
224
225         MSB_RP_SEND_READ_STATUS_REG,
226         MSB_RP_RECEIVE_STATUS_REG,
227
228         MSB_RP_SEND_OOB_READ,
229         MSB_RP_RECEIVE_OOB_READ,
230
231         MSB_RP_SEND_READ_DATA,
232         MSB_RP_RECEIVE_READ_DATA,
233 };
234
235 enum msb_write_block_states {
236         MSB_WB_SEND_WRITE_PARAMS = 0,
237         MSB_WB_SEND_WRITE_OOB,
238         MSB_WB_SEND_WRITE_COMMAND,
239
240         MSB_WB_SEND_INT_REQ,
241         MSB_WB_RECEIVE_INT_REQ,
242
243         MSB_WB_SEND_WRITE_DATA,
244         MSB_WB_RECEIVE_WRITE_CONFIRMATION,
245 };
246
247 enum msb_send_command_states {
248         MSB_SC_SEND_WRITE_PARAMS,
249         MSB_SC_SEND_WRITE_OOB,
250         MSB_SC_SEND_COMMAND,
251
252         MSB_SC_SEND_INT_REQ,
253         MSB_SC_RECEIVE_INT_REQ,
254
255 };
256
257 enum msb_reset_states {
258         MSB_RS_SEND,
259         MSB_RS_CONFIRM,
260 };
261
262 enum msb_par_switch_states {
263         MSB_PS_SEND_SWITCH_COMMAND,
264         MSB_PS_SWICH_HOST,
265         MSB_PS_CONFIRM,
266 };
267
268 struct chs_entry {
269         unsigned long size;
270         unsigned char sec;
271         unsigned short cyl;
272         unsigned char head;
273 };
274
275 static int msb_reset(struct msb_data *msb, bool full);
276
277 static int h_msb_default_bad(struct memstick_dev *card,
278                                                 struct memstick_request **mrq);
279
280 #define __dbg(level, format, ...) \
281         do { \
282                 if (debug >= level) \
283                         pr_err(format "\n", ## __VA_ARGS__); \
284         } while (0)
285
286
287 #define dbg(format, ...)                __dbg(1, format, ## __VA_ARGS__)
288 #define dbg_verbose(format, ...)        __dbg(2, format, ## __VA_ARGS__)
289
290 #endif