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