Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  *  ms_block.h - Sony MemoryStick (legacy) storage support
0004 
0005  *  Copyright (C) 2013 Maxim Levitsky <maximlevitsky@gmail.com>
0006  *
0007  * Minor portions of the driver are copied from mspro_block.c which is
0008  * Copyright (C) 2007 Alex Dubov <oakad@yahoo.com>
0009  *
0010  * Also ms structures were copied from old broken driver by same author
0011  * These probably come from MS spec
0012  */
0013 
0014 #ifndef MS_BLOCK_NEW_H
0015 #define MS_BLOCK_NEW_H
0016 
0017 #define MS_BLOCK_MAX_SEGS      32
0018 #define MS_BLOCK_MAX_PAGES     ((2 << 16) - 1)
0019 
0020 #define MS_BLOCK_MAX_BOOT_ADDR 0x000c
0021 #define MS_BLOCK_BOOT_ID       0x0001
0022 #define MS_BLOCK_INVALID       0xffff
0023 #define MS_MAX_ZONES           16
0024 #define MS_BLOCKS_IN_ZONE      512
0025 
0026 #define MS_BLOCK_MAP_LINE_SZ   16
0027 #define MS_BLOCK_PART_SHIFT    3
0028 
0029 
0030 #define MEMSTICK_UNCORR_ERROR (MEMSTICK_STATUS1_UCFG | \
0031         MEMSTICK_STATUS1_UCEX | MEMSTICK_STATUS1_UCDT)
0032 
0033 #define MEMSTICK_CORR_ERROR (MEMSTICK_STATUS1_FGER | MEMSTICK_STATUS1_EXER | \
0034     MEMSTICK_STATUS1_DTER)
0035 
0036 #define MEMSTICK_INT_ERROR (MEMSTICK_INT_CMDNAK | MEMSTICK_INT_ERR)
0037 
0038 #define MEMSTICK_OVERWRITE_FLAG_NORMAL \
0039     (MEMSTICK_OVERWRITE_PGST1 | \
0040     MEMSTICK_OVERWRITE_PGST0  | \
0041     MEMSTICK_OVERWRITE_BKST)
0042 
0043 #define MEMSTICK_OV_PG_NORMAL \
0044     (MEMSTICK_OVERWRITE_PGST1 | MEMSTICK_OVERWRITE_PGST0)
0045 
0046 #define MEMSTICK_MANAGEMENT_FLAG_NORMAL \
0047     (MEMSTICK_MANAGEMENT_SYSFLG |  \
0048     MEMSTICK_MANAGEMENT_SCMS1   |  \
0049     MEMSTICK_MANAGEMENT_SCMS0)     \
0050 
0051 struct ms_boot_header {
0052     unsigned short block_id;
0053     unsigned short format_reserved;
0054     unsigned char  reserved0[184];
0055     unsigned char  data_entry;
0056     unsigned char  reserved1[179];
0057 } __packed;
0058 
0059 
0060 struct ms_system_item {
0061     unsigned int  start_addr;
0062     unsigned int  data_size;
0063     unsigned char data_type_id;
0064     unsigned char reserved[3];
0065 } __packed;
0066 
0067 struct ms_system_entry {
0068     struct ms_system_item disabled_block;
0069     struct ms_system_item cis_idi;
0070     unsigned char         reserved[24];
0071 } __packed;
0072 
0073 struct ms_boot_attr_info {
0074     unsigned char      memorystick_class;
0075     unsigned char      format_unique_value1;
0076     unsigned short     block_size;
0077     unsigned short     number_of_blocks;
0078     unsigned short     number_of_effective_blocks;
0079     unsigned short     page_size;
0080     unsigned char      extra_data_size;
0081     unsigned char      format_unique_value2;
0082     unsigned char      assembly_time[8];
0083     unsigned char      format_unique_value3;
0084     unsigned char      serial_number[3];
0085     unsigned char      assembly_manufacturer_code;
0086     unsigned char      assembly_model_code[3];
0087     unsigned short     memory_manufacturer_code;
0088     unsigned short     memory_device_code;
0089     unsigned short     implemented_capacity;
0090     unsigned char      format_unique_value4[2];
0091     unsigned char      vcc;
0092     unsigned char      vpp;
0093     unsigned short     controller_number;
0094     unsigned short     controller_function;
0095     unsigned char      reserved0[9];
0096     unsigned char      transfer_supporting;
0097     unsigned short     format_unique_value5;
0098     unsigned char      format_type;
0099     unsigned char      memorystick_application;
0100     unsigned char      device_type;
0101     unsigned char      reserved1[22];
0102     unsigned char      format_uniqure_value6[2];
0103     unsigned char      reserved2[15];
0104 } __packed;
0105 
0106 struct ms_cis_idi {
0107     unsigned short general_config;
0108     unsigned short logical_cylinders;
0109     unsigned short reserved0;
0110     unsigned short logical_heads;
0111     unsigned short track_size;
0112     unsigned short page_size;
0113     unsigned short pages_per_track;
0114     unsigned short msw;
0115     unsigned short lsw;
0116     unsigned short reserved1;
0117     unsigned char  serial_number[20];
0118     unsigned short buffer_type;
0119     unsigned short buffer_size_increments;
0120     unsigned short long_command_ecc;
0121     unsigned char  firmware_version[28];
0122     unsigned char  model_name[18];
0123     unsigned short reserved2[5];
0124     unsigned short pio_mode_number;
0125     unsigned short dma_mode_number;
0126     unsigned short field_validity;
0127     unsigned short current_logical_cylinders;
0128     unsigned short current_logical_heads;
0129     unsigned short current_pages_per_track;
0130     unsigned int   current_page_capacity;
0131     unsigned short mutiple_page_setting;
0132     unsigned int   addressable_pages;
0133     unsigned short single_word_dma;
0134     unsigned short multi_word_dma;
0135     unsigned char  reserved3[128];
0136 } __packed;
0137 
0138 
0139 struct ms_boot_page {
0140     struct ms_boot_header    header;
0141     struct ms_system_entry   entry;
0142     struct ms_boot_attr_info attr;
0143 } __packed;
0144 
0145 struct msb_data {
0146     struct memstick_dev     *card;
0147     struct gendisk          *disk;
0148     struct request_queue        *queue;
0149     spinlock_t          q_lock;
0150     struct blk_mq_tag_set       tag_set;
0151     struct hd_geometry      geometry;
0152     struct attribute_group      attr_group;
0153     struct request          *req;
0154     int             caps;
0155     int             disk_id;
0156 
0157     /* IO */
0158     struct workqueue_struct     *io_queue;
0159     bool                io_queue_stopped;
0160     struct work_struct      io_work;
0161     bool                card_dead;
0162 
0163     /* Media properties */
0164     struct ms_boot_page     *boot_page;
0165     u16             boot_block_locations[2];
0166     int             boot_block_count;
0167 
0168     bool                read_only;
0169     unsigned short          page_size;
0170     int             block_size;
0171     int             pages_in_block;
0172     int             zone_count;
0173     int             block_count;
0174     int             logical_block_count;
0175 
0176     /* FTL tables */
0177     unsigned long           *used_blocks_bitmap;
0178     unsigned long           *erased_blocks_bitmap;
0179     u16             *lba_to_pba_table;
0180     int             free_block_count[MS_MAX_ZONES];
0181     bool                ftl_initialized;
0182 
0183     /* Cache */
0184     unsigned char           *cache;
0185     unsigned long           valid_cache_bitmap;
0186     int             cache_block_lba;
0187     bool                need_flush_cache;
0188     struct timer_list       cache_flush_timer;
0189 
0190     /* Preallocated buffers */
0191     unsigned char           *block_buffer;
0192     struct scatterlist      prealloc_sg[MS_BLOCK_MAX_SEGS+1];
0193 
0194 
0195     /* handler's local data */
0196     struct ms_register_addr     reg_addr;
0197     bool                addr_valid;
0198 
0199     u8              command_value;
0200     bool                command_need_oob;
0201     struct scatterlist      *current_sg;
0202     int             current_sg_offset;
0203 
0204     struct ms_register      regs;
0205     int             current_page;
0206 
0207     int             state;
0208     int             exit_error;
0209     bool                int_polling;
0210     unsigned long           int_timeout;
0211 
0212 };
0213 
0214 enum msb_readpage_states {
0215     MSB_RP_SEND_BLOCK_ADDRESS = 0,
0216     MSB_RP_SEND_READ_COMMAND,
0217 
0218     MSB_RP_SEND_INT_REQ,
0219     MSB_RP_RECEIVE_INT_REQ_RESULT,
0220 
0221     MSB_RP_SEND_READ_STATUS_REG,
0222     MSB_RP_RECEIVE_STATUS_REG,
0223 
0224     MSB_RP_SEND_OOB_READ,
0225     MSB_RP_RECEIVE_OOB_READ,
0226 
0227     MSB_RP_SEND_READ_DATA,
0228     MSB_RP_RECEIVE_READ_DATA,
0229 };
0230 
0231 enum msb_write_block_states {
0232     MSB_WB_SEND_WRITE_PARAMS = 0,
0233     MSB_WB_SEND_WRITE_OOB,
0234     MSB_WB_SEND_WRITE_COMMAND,
0235 
0236     MSB_WB_SEND_INT_REQ,
0237     MSB_WB_RECEIVE_INT_REQ,
0238 
0239     MSB_WB_SEND_WRITE_DATA,
0240     MSB_WB_RECEIVE_WRITE_CONFIRMATION,
0241 };
0242 
0243 enum msb_send_command_states {
0244     MSB_SC_SEND_WRITE_PARAMS,
0245     MSB_SC_SEND_WRITE_OOB,
0246     MSB_SC_SEND_COMMAND,
0247 
0248     MSB_SC_SEND_INT_REQ,
0249     MSB_SC_RECEIVE_INT_REQ,
0250 
0251 };
0252 
0253 enum msb_reset_states {
0254     MSB_RS_SEND,
0255     MSB_RS_CONFIRM,
0256 };
0257 
0258 enum msb_par_switch_states {
0259     MSB_PS_SEND_SWITCH_COMMAND,
0260     MSB_PS_SWICH_HOST,
0261     MSB_PS_CONFIRM,
0262 };
0263 
0264 struct chs_entry {
0265     unsigned long size;
0266     unsigned char sec;
0267     unsigned short cyl;
0268     unsigned char head;
0269 };
0270 
0271 static int msb_reset(struct msb_data *msb, bool full);
0272 
0273 static int h_msb_default_bad(struct memstick_dev *card,
0274                         struct memstick_request **mrq);
0275 
0276 #define __dbg(level, format, ...) \
0277     do { \
0278         if (debug >= level) \
0279             pr_err(format "\n", ## __VA_ARGS__); \
0280     } while (0)
0281 
0282 
0283 #define dbg(format, ...)        __dbg(1, format, ## __VA_ARGS__)
0284 #define dbg_verbose(format, ...)    __dbg(2, format, ## __VA_ARGS__)
0285 
0286 #endif