linux/drivers/memstick/core/ms_block.h
<<
>>
Prefs
   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
  55struct 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
  64struct 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
  71struct 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
  77struct 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
 110struct 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
 143struct 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
 149struct 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
 218enum 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
 235enum 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
 247enum 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
 257enum msb_reset_states {
 258        MSB_RS_SEND,
 259        MSB_RS_CONFIRM,
 260};
 261
 262enum msb_par_switch_states {
 263        MSB_PS_SEND_SWITCH_COMMAND,
 264        MSB_PS_SWICH_HOST,
 265        MSB_PS_CONFIRM,
 266};
 267
 268struct chs_entry {
 269        unsigned long size;
 270        unsigned char sec;
 271        unsigned short cyl;
 272        unsigned char head;
 273};
 274
 275static int msb_reset(struct msb_data *msb, bool full);
 276
 277static 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
 291