ms_block.h (7108B)
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 51struct ms_boot_header { 52 unsigned short block_id; 53 unsigned short format_reserved; 54 unsigned char reserved0[184]; 55 unsigned char data_entry; 56 unsigned char reserved1[179]; 57} __packed; 58 59 60struct 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 67struct 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 73struct 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 extra_data_size; 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 106struct 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 139struct ms_boot_page { 140 struct ms_boot_header header; 141 struct ms_system_entry entry; 142 struct ms_boot_attr_info attr; 143} __packed; 144 145struct 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 214enum 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 231enum 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 243enum 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 253enum msb_reset_states { 254 MSB_RS_SEND, 255 MSB_RS_CONFIRM, 256}; 257 258enum msb_par_switch_states { 259 MSB_PS_SEND_SWITCH_COMMAND, 260 MSB_PS_SWICH_HOST, 261 MSB_PS_CONFIRM, 262}; 263 264struct chs_entry { 265 unsigned long size; 266 unsigned char sec; 267 unsigned short cyl; 268 unsigned char head; 269}; 270 271static int msb_reset(struct msb_data *msb, bool full); 272 273static 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