root/drivers/memstick/core/ms_block.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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 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 
  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      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 
 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    header;
 141         struct ms_system_entry   entry;
 142         struct ms_boot_attr_info attr;
 143 } __packed;
 144 
 145 struct msb_data {
 146         unsigned int                    usage_count;
 147         struct memstick_dev             *card;
 148         struct gendisk                  *disk;
 149         struct request_queue            *queue;
 150         spinlock_t                      q_lock;
 151         struct blk_mq_tag_set           tag_set;
 152         struct hd_geometry              geometry;
 153         struct attribute_group          attr_group;
 154         struct request                  *req;
 155         int                             caps;
 156         int                             disk_id;
 157 
 158         /* IO */
 159         struct workqueue_struct         *io_queue;
 160         bool                            io_queue_stopped;
 161         struct work_struct              io_work;
 162         bool                            card_dead;
 163 
 164         /* Media properties */
 165         struct ms_boot_page             *boot_page;
 166         u16                             boot_block_locations[2];
 167         int                             boot_block_count;
 168 
 169         bool                            read_only;
 170         unsigned short                  page_size;
 171         int                             block_size;
 172         int                             pages_in_block;
 173         int                             zone_count;
 174         int                             block_count;
 175         int                             logical_block_count;
 176 
 177         /* FTL tables */
 178         unsigned long                   *used_blocks_bitmap;
 179         unsigned long                   *erased_blocks_bitmap;
 180         u16                             *lba_to_pba_table;
 181         int                             free_block_count[MS_MAX_ZONES];
 182         bool                            ftl_initialized;
 183 
 184         /* Cache */
 185         unsigned char                   *cache;
 186         unsigned long                   valid_cache_bitmap;
 187         int                             cache_block_lba;
 188         bool                            need_flush_cache;
 189         struct timer_list               cache_flush_timer;
 190 
 191         /* Preallocated buffers */
 192         unsigned char                   *block_buffer;
 193         struct scatterlist              prealloc_sg[MS_BLOCK_MAX_SEGS+1];
 194 
 195 
 196         /* handler's local data */
 197         struct ms_register_addr         reg_addr;
 198         bool                            addr_valid;
 199 
 200         u8                              command_value;
 201         bool                            command_need_oob;
 202         struct scatterlist              *current_sg;
 203         int                             current_sg_offset;
 204 
 205         struct ms_register              regs;
 206         int                             current_page;
 207 
 208         int                             state;
 209         int                             exit_error;
 210         bool                            int_polling;
 211         unsigned long                   int_timeout;
 212 
 213 };
 214 
 215 enum msb_readpage_states {
 216         MSB_RP_SEND_BLOCK_ADDRESS = 0,
 217         MSB_RP_SEND_READ_COMMAND,
 218 
 219         MSB_RP_SEND_INT_REQ,
 220         MSB_RP_RECEIVE_INT_REQ_RESULT,
 221 
 222         MSB_RP_SEND_READ_STATUS_REG,
 223         MSB_RP_RECEIVE_STATUS_REG,
 224 
 225         MSB_RP_SEND_OOB_READ,
 226         MSB_RP_RECEIVE_OOB_READ,
 227 
 228         MSB_RP_SEND_READ_DATA,
 229         MSB_RP_RECEIVE_READ_DATA,
 230 };
 231 
 232 enum msb_write_block_states {
 233         MSB_WB_SEND_WRITE_PARAMS = 0,
 234         MSB_WB_SEND_WRITE_OOB,
 235         MSB_WB_SEND_WRITE_COMMAND,
 236 
 237         MSB_WB_SEND_INT_REQ,
 238         MSB_WB_RECEIVE_INT_REQ,
 239 
 240         MSB_WB_SEND_WRITE_DATA,
 241         MSB_WB_RECEIVE_WRITE_CONFIRMATION,
 242 };
 243 
 244 enum msb_send_command_states {
 245         MSB_SC_SEND_WRITE_PARAMS,
 246         MSB_SC_SEND_WRITE_OOB,
 247         MSB_SC_SEND_COMMAND,
 248 
 249         MSB_SC_SEND_INT_REQ,
 250         MSB_SC_RECEIVE_INT_REQ,
 251 
 252 };
 253 
 254 enum msb_reset_states {
 255         MSB_RS_SEND,
 256         MSB_RS_CONFIRM,
 257 };
 258 
 259 enum msb_par_switch_states {
 260         MSB_PS_SEND_SWITCH_COMMAND,
 261         MSB_PS_SWICH_HOST,
 262         MSB_PS_CONFIRM,
 263 };
 264 
 265 struct chs_entry {
 266         unsigned long size;
 267         unsigned char sec;
 268         unsigned short cyl;
 269         unsigned char head;
 270 };
 271 
 272 static int msb_reset(struct msb_data *msb, bool full);
 273 
 274 static int h_msb_default_bad(struct memstick_dev *card,
 275                                                 struct memstick_request **mrq);
 276 
 277 #define __dbg(level, format, ...) \
 278         do { \
 279                 if (debug >= level) \
 280                         pr_err(format "\n", ## __VA_ARGS__); \
 281         } while (0)
 282 
 283 
 284 #define dbg(format, ...)                __dbg(1, format, ## __VA_ARGS__)
 285 #define dbg_verbose(format, ...)        __dbg(2, format, ## __VA_ARGS__)
 286 
 287 #endif

/* [<][>][^][v][top][bottom][index][help] */