0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/blk-mq.h>
0012 #include <linux/idr.h>
0013 #include <linux/hdreg.h>
0014 #include <linux/kthread.h>
0015 #include <linux/delay.h>
0016 #include <linux/slab.h>
0017 #include <linux/mutex.h>
0018 #include <linux/memstick.h>
0019 #include <linux/module.h>
0020
0021 #define DRIVER_NAME "mspro_block"
0022
0023 static int major;
0024 module_param(major, int, 0644);
0025
0026 #define MSPRO_BLOCK_MAX_SEGS 32
0027 #define MSPRO_BLOCK_MAX_PAGES ((2 << 16) - 1)
0028
0029 #define MSPRO_BLOCK_SIGNATURE 0xa5c3
0030 #define MSPRO_BLOCK_MAX_ATTRIBUTES 41
0031
0032 #define MSPRO_BLOCK_PART_SHIFT 3
0033
0034 enum {
0035 MSPRO_BLOCK_ID_SYSINFO = 0x10,
0036 MSPRO_BLOCK_ID_MODELNAME = 0x15,
0037 MSPRO_BLOCK_ID_MBR = 0x20,
0038 MSPRO_BLOCK_ID_PBR16 = 0x21,
0039 MSPRO_BLOCK_ID_PBR32 = 0x22,
0040 MSPRO_BLOCK_ID_SPECFILEVALUES1 = 0x25,
0041 MSPRO_BLOCK_ID_SPECFILEVALUES2 = 0x26,
0042 MSPRO_BLOCK_ID_DEVINFO = 0x30
0043 };
0044
0045 struct mspro_sys_attr {
0046 size_t size;
0047 void *data;
0048 unsigned char id;
0049 char name[32];
0050 struct device_attribute dev_attr;
0051 };
0052
0053 struct mspro_attr_entry {
0054 __be32 address;
0055 __be32 size;
0056 unsigned char id;
0057 unsigned char reserved[3];
0058 } __attribute__((packed));
0059
0060 struct mspro_attribute {
0061 __be16 signature;
0062 unsigned short version;
0063 unsigned char count;
0064 unsigned char reserved[11];
0065 struct mspro_attr_entry entries[];
0066 } __attribute__((packed));
0067
0068 struct mspro_sys_info {
0069 unsigned char class;
0070 unsigned char reserved0;
0071 __be16 block_size;
0072 __be16 block_count;
0073 __be16 user_block_count;
0074 __be16 page_size;
0075 unsigned char reserved1[2];
0076 unsigned char assembly_date[8];
0077 __be32 serial_number;
0078 unsigned char assembly_maker_code;
0079 unsigned char assembly_model_code[3];
0080 __be16 memory_maker_code;
0081 __be16 memory_model_code;
0082 unsigned char reserved2[4];
0083 unsigned char vcc;
0084 unsigned char vpp;
0085 __be16 controller_number;
0086 __be16 controller_function;
0087 __be16 start_sector;
0088 __be16 unit_size;
0089 unsigned char ms_sub_class;
0090 unsigned char reserved3[4];
0091 unsigned char interface_type;
0092 __be16 controller_code;
0093 unsigned char format_type;
0094 unsigned char reserved4;
0095 unsigned char device_type;
0096 unsigned char reserved5[7];
0097 unsigned char mspro_id[16];
0098 unsigned char reserved6[16];
0099 } __attribute__((packed));
0100
0101 struct mspro_mbr {
0102 unsigned char boot_partition;
0103 unsigned char start_head;
0104 unsigned char start_sector;
0105 unsigned char start_cylinder;
0106 unsigned char partition_type;
0107 unsigned char end_head;
0108 unsigned char end_sector;
0109 unsigned char end_cylinder;
0110 unsigned int start_sectors;
0111 unsigned int sectors_per_partition;
0112 } __attribute__((packed));
0113
0114 struct mspro_specfile {
0115 char name[8];
0116 char ext[3];
0117 unsigned char attr;
0118 unsigned char reserved[10];
0119 unsigned short time;
0120 unsigned short date;
0121 unsigned short cluster;
0122 unsigned int size;
0123 } __attribute__((packed));
0124
0125 struct mspro_devinfo {
0126 __be16 cylinders;
0127 __be16 heads;
0128 __be16 bytes_per_track;
0129 __be16 bytes_per_sector;
0130 __be16 sectors_per_track;
0131 unsigned char reserved[6];
0132 } __attribute__((packed));
0133
0134 struct mspro_block_data {
0135 struct memstick_dev *card;
0136 unsigned int caps;
0137 struct gendisk *disk;
0138 struct request_queue *queue;
0139 struct request *block_req;
0140 struct blk_mq_tag_set tag_set;
0141 spinlock_t q_lock;
0142
0143 unsigned short page_size;
0144 unsigned short cylinders;
0145 unsigned short heads;
0146 unsigned short sectors_per_track;
0147
0148 unsigned char system;
0149 unsigned char read_only:1,
0150 eject:1,
0151 data_dir:1,
0152 active:1;
0153 unsigned char transfer_cmd;
0154
0155 int (*mrq_handler)(struct memstick_dev *card,
0156 struct memstick_request **mrq);
0157
0158
0159
0160
0161
0162 void (*setup_transfer)(struct memstick_dev *card,
0163 u64 offset, size_t length);
0164
0165 struct attribute_group attr_group;
0166
0167 struct scatterlist req_sg[MSPRO_BLOCK_MAX_SEGS];
0168 unsigned int seg_count;
0169 unsigned int current_seg;
0170 unsigned int current_page;
0171 };
0172
0173 static DEFINE_IDR(mspro_block_disk_idr);
0174 static DEFINE_MUTEX(mspro_block_disk_lock);
0175
0176 static int mspro_block_complete_req(struct memstick_dev *card, int error);
0177
0178
0179
0180 static void mspro_block_bd_free_disk(struct gendisk *disk)
0181 {
0182 struct mspro_block_data *msb = disk->private_data;
0183 int disk_id = MINOR(disk_devt(disk)) >> MSPRO_BLOCK_PART_SHIFT;
0184
0185 mutex_lock(&mspro_block_disk_lock);
0186 idr_remove(&mspro_block_disk_idr, disk_id);
0187 mutex_unlock(&mspro_block_disk_lock);
0188
0189 kfree(msb);
0190 }
0191
0192 static int mspro_block_bd_getgeo(struct block_device *bdev,
0193 struct hd_geometry *geo)
0194 {
0195 struct mspro_block_data *msb = bdev->bd_disk->private_data;
0196
0197 geo->heads = msb->heads;
0198 geo->sectors = msb->sectors_per_track;
0199 geo->cylinders = msb->cylinders;
0200
0201 return 0;
0202 }
0203
0204 static const struct block_device_operations ms_block_bdops = {
0205 .owner = THIS_MODULE,
0206 .getgeo = mspro_block_bd_getgeo,
0207 .free_disk = mspro_block_bd_free_disk,
0208 };
0209
0210
0211
0212 static struct mspro_sys_attr *mspro_from_sysfs_attr(struct attribute *attr)
0213 {
0214 struct device_attribute *dev_attr
0215 = container_of(attr, struct device_attribute, attr);
0216 return container_of(dev_attr, struct mspro_sys_attr, dev_attr);
0217 }
0218
0219 static const char *mspro_block_attr_name(unsigned char tag)
0220 {
0221 switch (tag) {
0222 case MSPRO_BLOCK_ID_SYSINFO:
0223 return "attr_sysinfo";
0224 case MSPRO_BLOCK_ID_MODELNAME:
0225 return "attr_modelname";
0226 case MSPRO_BLOCK_ID_MBR:
0227 return "attr_mbr";
0228 case MSPRO_BLOCK_ID_PBR16:
0229 return "attr_pbr16";
0230 case MSPRO_BLOCK_ID_PBR32:
0231 return "attr_pbr32";
0232 case MSPRO_BLOCK_ID_SPECFILEVALUES1:
0233 return "attr_specfilevalues1";
0234 case MSPRO_BLOCK_ID_SPECFILEVALUES2:
0235 return "attr_specfilevalues2";
0236 case MSPRO_BLOCK_ID_DEVINFO:
0237 return "attr_devinfo";
0238 default:
0239 return NULL;
0240 }
0241 }
0242
0243 typedef ssize_t (*sysfs_show_t)(struct device *dev,
0244 struct device_attribute *attr,
0245 char *buffer);
0246
0247 static ssize_t mspro_block_attr_show_default(struct device *dev,
0248 struct device_attribute *attr,
0249 char *buffer)
0250 {
0251 struct mspro_sys_attr *s_attr = container_of(attr,
0252 struct mspro_sys_attr,
0253 dev_attr);
0254
0255 ssize_t cnt, rc = 0;
0256
0257 for (cnt = 0; cnt < s_attr->size; cnt++) {
0258 if (cnt && !(cnt % 16)) {
0259 if (PAGE_SIZE - rc)
0260 buffer[rc++] = '\n';
0261 }
0262
0263 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "%02x ",
0264 ((unsigned char *)s_attr->data)[cnt]);
0265 }
0266 return rc;
0267 }
0268
0269 static ssize_t mspro_block_attr_show_sysinfo(struct device *dev,
0270 struct device_attribute *attr,
0271 char *buffer)
0272 {
0273 struct mspro_sys_attr *x_attr = container_of(attr,
0274 struct mspro_sys_attr,
0275 dev_attr);
0276 struct mspro_sys_info *x_sys = x_attr->data;
0277 ssize_t rc = 0;
0278 int date_tz = 0, date_tz_f = 0;
0279
0280 if (x_sys->assembly_date[0] > 0x80U) {
0281 date_tz = (~x_sys->assembly_date[0]) + 1;
0282 date_tz_f = date_tz & 3;
0283 date_tz >>= 2;
0284 date_tz = -date_tz;
0285 date_tz_f *= 15;
0286 } else if (x_sys->assembly_date[0] < 0x80U) {
0287 date_tz = x_sys->assembly_date[0];
0288 date_tz_f = date_tz & 3;
0289 date_tz >>= 2;
0290 date_tz_f *= 15;
0291 }
0292
0293 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "class: %x\n",
0294 x_sys->class);
0295 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "block size: %x\n",
0296 be16_to_cpu(x_sys->block_size));
0297 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "block count: %x\n",
0298 be16_to_cpu(x_sys->block_count));
0299 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "user block count: %x\n",
0300 be16_to_cpu(x_sys->user_block_count));
0301 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "page size: %x\n",
0302 be16_to_cpu(x_sys->page_size));
0303 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "assembly date: "
0304 "GMT%+d:%d %04u-%02u-%02u %02u:%02u:%02u\n",
0305 date_tz, date_tz_f,
0306 be16_to_cpup((__be16 *)&x_sys->assembly_date[1]),
0307 x_sys->assembly_date[3], x_sys->assembly_date[4],
0308 x_sys->assembly_date[5], x_sys->assembly_date[6],
0309 x_sys->assembly_date[7]);
0310 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "serial number: %x\n",
0311 be32_to_cpu(x_sys->serial_number));
0312 rc += scnprintf(buffer + rc, PAGE_SIZE - rc,
0313 "assembly maker code: %x\n",
0314 x_sys->assembly_maker_code);
0315 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "assembly model code: "
0316 "%02x%02x%02x\n", x_sys->assembly_model_code[0],
0317 x_sys->assembly_model_code[1],
0318 x_sys->assembly_model_code[2]);
0319 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "memory maker code: %x\n",
0320 be16_to_cpu(x_sys->memory_maker_code));
0321 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "memory model code: %x\n",
0322 be16_to_cpu(x_sys->memory_model_code));
0323 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "vcc: %x\n",
0324 x_sys->vcc);
0325 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "vpp: %x\n",
0326 x_sys->vpp);
0327 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "controller number: %x\n",
0328 be16_to_cpu(x_sys->controller_number));
0329 rc += scnprintf(buffer + rc, PAGE_SIZE - rc,
0330 "controller function: %x\n",
0331 be16_to_cpu(x_sys->controller_function));
0332 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "start sector: %x\n",
0333 be16_to_cpu(x_sys->start_sector));
0334 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "unit size: %x\n",
0335 be16_to_cpu(x_sys->unit_size));
0336 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "sub class: %x\n",
0337 x_sys->ms_sub_class);
0338 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "interface type: %x\n",
0339 x_sys->interface_type);
0340 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "controller code: %x\n",
0341 be16_to_cpu(x_sys->controller_code));
0342 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "format type: %x\n",
0343 x_sys->format_type);
0344 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "device type: %x\n",
0345 x_sys->device_type);
0346 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "mspro id: %s\n",
0347 x_sys->mspro_id);
0348 return rc;
0349 }
0350
0351 static ssize_t mspro_block_attr_show_modelname(struct device *dev,
0352 struct device_attribute *attr,
0353 char *buffer)
0354 {
0355 struct mspro_sys_attr *s_attr = container_of(attr,
0356 struct mspro_sys_attr,
0357 dev_attr);
0358
0359 return scnprintf(buffer, PAGE_SIZE, "%s", (char *)s_attr->data);
0360 }
0361
0362 static ssize_t mspro_block_attr_show_mbr(struct device *dev,
0363 struct device_attribute *attr,
0364 char *buffer)
0365 {
0366 struct mspro_sys_attr *x_attr = container_of(attr,
0367 struct mspro_sys_attr,
0368 dev_attr);
0369 struct mspro_mbr *x_mbr = x_attr->data;
0370 ssize_t rc = 0;
0371
0372 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "boot partition: %x\n",
0373 x_mbr->boot_partition);
0374 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "start head: %x\n",
0375 x_mbr->start_head);
0376 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "start sector: %x\n",
0377 x_mbr->start_sector);
0378 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "start cylinder: %x\n",
0379 x_mbr->start_cylinder);
0380 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "partition type: %x\n",
0381 x_mbr->partition_type);
0382 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "end head: %x\n",
0383 x_mbr->end_head);
0384 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "end sector: %x\n",
0385 x_mbr->end_sector);
0386 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "end cylinder: %x\n",
0387 x_mbr->end_cylinder);
0388 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "start sectors: %x\n",
0389 x_mbr->start_sectors);
0390 rc += scnprintf(buffer + rc, PAGE_SIZE - rc,
0391 "sectors per partition: %x\n",
0392 x_mbr->sectors_per_partition);
0393 return rc;
0394 }
0395
0396 static ssize_t mspro_block_attr_show_specfile(struct device *dev,
0397 struct device_attribute *attr,
0398 char *buffer)
0399 {
0400 struct mspro_sys_attr *x_attr = container_of(attr,
0401 struct mspro_sys_attr,
0402 dev_attr);
0403 struct mspro_specfile *x_spfile = x_attr->data;
0404 char name[9], ext[4];
0405 ssize_t rc = 0;
0406
0407 memcpy(name, x_spfile->name, 8);
0408 name[8] = 0;
0409 memcpy(ext, x_spfile->ext, 3);
0410 ext[3] = 0;
0411
0412 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "name: %s\n", name);
0413 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "ext: %s\n", ext);
0414 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "attribute: %x\n",
0415 x_spfile->attr);
0416 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "time: %d:%d:%d\n",
0417 x_spfile->time >> 11,
0418 (x_spfile->time >> 5) & 0x3f,
0419 (x_spfile->time & 0x1f) * 2);
0420 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "date: %d-%d-%d\n",
0421 (x_spfile->date >> 9) + 1980,
0422 (x_spfile->date >> 5) & 0xf,
0423 x_spfile->date & 0x1f);
0424 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "start cluster: %x\n",
0425 x_spfile->cluster);
0426 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "size: %x\n",
0427 x_spfile->size);
0428 return rc;
0429 }
0430
0431 static ssize_t mspro_block_attr_show_devinfo(struct device *dev,
0432 struct device_attribute *attr,
0433 char *buffer)
0434 {
0435 struct mspro_sys_attr *x_attr = container_of(attr,
0436 struct mspro_sys_attr,
0437 dev_attr);
0438 struct mspro_devinfo *x_devinfo = x_attr->data;
0439 ssize_t rc = 0;
0440
0441 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "cylinders: %x\n",
0442 be16_to_cpu(x_devinfo->cylinders));
0443 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "heads: %x\n",
0444 be16_to_cpu(x_devinfo->heads));
0445 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "bytes per track: %x\n",
0446 be16_to_cpu(x_devinfo->bytes_per_track));
0447 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "bytes per sector: %x\n",
0448 be16_to_cpu(x_devinfo->bytes_per_sector));
0449 rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "sectors per track: %x\n",
0450 be16_to_cpu(x_devinfo->sectors_per_track));
0451 return rc;
0452 }
0453
0454 static sysfs_show_t mspro_block_attr_show(unsigned char tag)
0455 {
0456 switch (tag) {
0457 case MSPRO_BLOCK_ID_SYSINFO:
0458 return mspro_block_attr_show_sysinfo;
0459 case MSPRO_BLOCK_ID_MODELNAME:
0460 return mspro_block_attr_show_modelname;
0461 case MSPRO_BLOCK_ID_MBR:
0462 return mspro_block_attr_show_mbr;
0463 case MSPRO_BLOCK_ID_SPECFILEVALUES1:
0464 case MSPRO_BLOCK_ID_SPECFILEVALUES2:
0465 return mspro_block_attr_show_specfile;
0466 case MSPRO_BLOCK_ID_DEVINFO:
0467 return mspro_block_attr_show_devinfo;
0468 default:
0469 return mspro_block_attr_show_default;
0470 }
0471 }
0472
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482 static int h_mspro_block_req_init(struct memstick_dev *card,
0483 struct memstick_request **mrq)
0484 {
0485 struct mspro_block_data *msb = memstick_get_drvdata(card);
0486
0487 *mrq = &card->current_mrq;
0488 card->next_request = msb->mrq_handler;
0489 return 0;
0490 }
0491
0492 static int h_mspro_block_default(struct memstick_dev *card,
0493 struct memstick_request **mrq)
0494 {
0495 return mspro_block_complete_req(card, (*mrq)->error);
0496 }
0497
0498 static int h_mspro_block_default_bad(struct memstick_dev *card,
0499 struct memstick_request **mrq)
0500 {
0501 return -ENXIO;
0502 }
0503
0504 static int h_mspro_block_get_ro(struct memstick_dev *card,
0505 struct memstick_request **mrq)
0506 {
0507 struct mspro_block_data *msb = memstick_get_drvdata(card);
0508
0509 if (!(*mrq)->error) {
0510 if ((*mrq)->data[offsetof(struct ms_status_register, status0)]
0511 & MEMSTICK_STATUS0_WP)
0512 msb->read_only = 1;
0513 else
0514 msb->read_only = 0;
0515 }
0516
0517 return mspro_block_complete_req(card, (*mrq)->error);
0518 }
0519
0520 static int h_mspro_block_wait_for_ced(struct memstick_dev *card,
0521 struct memstick_request **mrq)
0522 {
0523 dev_dbg(&card->dev, "wait for ced: value %x\n", (*mrq)->data[0]);
0524
0525 if (!(*mrq)->error) {
0526 if ((*mrq)->data[0] & (MEMSTICK_INT_CMDNAK | MEMSTICK_INT_ERR))
0527 (*mrq)->error = -EFAULT;
0528 else if (!((*mrq)->data[0] & MEMSTICK_INT_CED))
0529 return 0;
0530 }
0531
0532 return mspro_block_complete_req(card, (*mrq)->error);
0533 }
0534
0535 static int h_mspro_block_transfer_data(struct memstick_dev *card,
0536 struct memstick_request **mrq)
0537 {
0538 struct mspro_block_data *msb = memstick_get_drvdata(card);
0539 unsigned char t_val = 0;
0540 struct scatterlist t_sg = { 0 };
0541 size_t t_offset;
0542
0543 if ((*mrq)->error)
0544 return mspro_block_complete_req(card, (*mrq)->error);
0545
0546 switch ((*mrq)->tpc) {
0547 case MS_TPC_WRITE_REG:
0548 memstick_init_req(*mrq, MS_TPC_SET_CMD, &msb->transfer_cmd, 1);
0549 (*mrq)->need_card_int = 1;
0550 return 0;
0551 case MS_TPC_SET_CMD:
0552 t_val = (*mrq)->int_reg;
0553 memstick_init_req(*mrq, MS_TPC_GET_INT, NULL, 1);
0554 if (msb->caps & MEMSTICK_CAP_AUTO_GET_INT)
0555 goto has_int_reg;
0556 return 0;
0557 case MS_TPC_GET_INT:
0558 t_val = (*mrq)->data[0];
0559 has_int_reg:
0560 if (t_val & (MEMSTICK_INT_CMDNAK | MEMSTICK_INT_ERR)) {
0561 t_val = MSPRO_CMD_STOP;
0562 memstick_init_req(*mrq, MS_TPC_SET_CMD, &t_val, 1);
0563 card->next_request = h_mspro_block_default;
0564 return 0;
0565 }
0566
0567 if (msb->current_page
0568 == (msb->req_sg[msb->current_seg].length
0569 / msb->page_size)) {
0570 msb->current_page = 0;
0571 msb->current_seg++;
0572
0573 if (msb->current_seg == msb->seg_count) {
0574 if (t_val & MEMSTICK_INT_CED) {
0575 return mspro_block_complete_req(card,
0576 0);
0577 } else {
0578 card->next_request
0579 = h_mspro_block_wait_for_ced;
0580 memstick_init_req(*mrq, MS_TPC_GET_INT,
0581 NULL, 1);
0582 return 0;
0583 }
0584 }
0585 }
0586
0587 if (!(t_val & MEMSTICK_INT_BREQ)) {
0588 memstick_init_req(*mrq, MS_TPC_GET_INT, NULL, 1);
0589 return 0;
0590 }
0591
0592 t_offset = msb->req_sg[msb->current_seg].offset;
0593 t_offset += msb->current_page * msb->page_size;
0594
0595 sg_set_page(&t_sg,
0596 nth_page(sg_page(&(msb->req_sg[msb->current_seg])),
0597 t_offset >> PAGE_SHIFT),
0598 msb->page_size, offset_in_page(t_offset));
0599
0600 memstick_init_req_sg(*mrq, msb->data_dir == READ
0601 ? MS_TPC_READ_LONG_DATA
0602 : MS_TPC_WRITE_LONG_DATA,
0603 &t_sg);
0604 (*mrq)->need_card_int = 1;
0605 return 0;
0606 case MS_TPC_READ_LONG_DATA:
0607 case MS_TPC_WRITE_LONG_DATA:
0608 msb->current_page++;
0609 if (msb->caps & MEMSTICK_CAP_AUTO_GET_INT) {
0610 t_val = (*mrq)->int_reg;
0611 goto has_int_reg;
0612 } else {
0613 memstick_init_req(*mrq, MS_TPC_GET_INT, NULL, 1);
0614 return 0;
0615 }
0616
0617 default:
0618 BUG();
0619 }
0620 }
0621
0622
0623
0624
0625
0626
0627
0628
0629
0630
0631 static void h_mspro_block_setup_cmd(struct memstick_dev *card, u64 offset,
0632 size_t length)
0633 {
0634 struct mspro_block_data *msb = memstick_get_drvdata(card);
0635 struct mspro_param_register param = {
0636 .system = msb->system,
0637 .data_count = cpu_to_be16((uint16_t)(length / msb->page_size)),
0638
0639 .data_address = 0,
0640 .tpc_param = 0
0641 };
0642
0643 do_div(offset, msb->page_size);
0644 param.data_address = cpu_to_be32((uint32_t)offset);
0645
0646 card->next_request = h_mspro_block_req_init;
0647 msb->mrq_handler = h_mspro_block_transfer_data;
0648 memstick_init_req(&card->current_mrq, MS_TPC_WRITE_REG,
0649 ¶m, sizeof(param));
0650 }
0651
0652
0653
0654 static int mspro_block_issue_req(struct memstick_dev *card)
0655 {
0656 struct mspro_block_data *msb = memstick_get_drvdata(card);
0657 u64 t_off;
0658 unsigned int count;
0659
0660 while (true) {
0661 msb->current_page = 0;
0662 msb->current_seg = 0;
0663 msb->seg_count = blk_rq_map_sg(msb->block_req->q,
0664 msb->block_req,
0665 msb->req_sg);
0666
0667 if (!msb->seg_count) {
0668 unsigned int bytes = blk_rq_cur_bytes(msb->block_req);
0669 bool chunk;
0670
0671 chunk = blk_update_request(msb->block_req,
0672 BLK_STS_RESOURCE,
0673 bytes);
0674 if (chunk)
0675 continue;
0676 __blk_mq_end_request(msb->block_req,
0677 BLK_STS_RESOURCE);
0678 msb->block_req = NULL;
0679 return -EAGAIN;
0680 }
0681
0682 t_off = blk_rq_pos(msb->block_req);
0683 t_off <<= 9;
0684 count = blk_rq_bytes(msb->block_req);
0685
0686 msb->setup_transfer(card, t_off, count);
0687
0688 msb->data_dir = rq_data_dir(msb->block_req);
0689 msb->transfer_cmd = msb->data_dir == READ
0690 ? MSPRO_CMD_READ_DATA
0691 : MSPRO_CMD_WRITE_DATA;
0692
0693 memstick_new_req(card->host);
0694 return 0;
0695 }
0696 }
0697
0698 static int mspro_block_complete_req(struct memstick_dev *card, int error)
0699 {
0700 struct mspro_block_data *msb = memstick_get_drvdata(card);
0701 int cnt;
0702 bool chunk;
0703 unsigned int t_len = 0;
0704 unsigned long flags;
0705
0706 spin_lock_irqsave(&msb->q_lock, flags);
0707 dev_dbg(&card->dev, "complete %d, %d\n", msb->block_req ? 1 : 0,
0708 error);
0709
0710 if (msb->block_req) {
0711
0712 if (error == -EAGAIN)
0713 error = 0;
0714
0715 if (error || (card->current_mrq.tpc == MSPRO_CMD_STOP)) {
0716 if (msb->data_dir == READ) {
0717 for (cnt = 0; cnt < msb->current_seg; cnt++) {
0718 t_len += msb->req_sg[cnt].length
0719 / msb->page_size;
0720
0721 if (msb->current_page)
0722 t_len += msb->current_page - 1;
0723
0724 t_len *= msb->page_size;
0725 }
0726 }
0727 } else
0728 t_len = blk_rq_bytes(msb->block_req);
0729
0730 dev_dbg(&card->dev, "transferred %x (%d)\n", t_len, error);
0731
0732 if (error && !t_len)
0733 t_len = blk_rq_cur_bytes(msb->block_req);
0734
0735 chunk = blk_update_request(msb->block_req,
0736 errno_to_blk_status(error), t_len);
0737 if (chunk) {
0738 error = mspro_block_issue_req(card);
0739 if (!error)
0740 goto out;
0741 } else {
0742 __blk_mq_end_request(msb->block_req,
0743 errno_to_blk_status(error));
0744 msb->block_req = NULL;
0745 }
0746 } else {
0747 if (!error)
0748 error = -EAGAIN;
0749 }
0750
0751 card->next_request = h_mspro_block_default_bad;
0752 complete_all(&card->mrq_complete);
0753 out:
0754 spin_unlock_irqrestore(&msb->q_lock, flags);
0755 return error;
0756 }
0757
0758 static void mspro_block_stop(struct memstick_dev *card)
0759 {
0760 struct mspro_block_data *msb = memstick_get_drvdata(card);
0761 int rc = 0;
0762 unsigned long flags;
0763
0764 while (1) {
0765 spin_lock_irqsave(&msb->q_lock, flags);
0766 if (!msb->block_req) {
0767 blk_mq_stop_hw_queues(msb->queue);
0768 rc = 1;
0769 }
0770 spin_unlock_irqrestore(&msb->q_lock, flags);
0771
0772 if (rc)
0773 break;
0774
0775 wait_for_completion(&card->mrq_complete);
0776 }
0777 }
0778
0779 static void mspro_block_start(struct memstick_dev *card)
0780 {
0781 struct mspro_block_data *msb = memstick_get_drvdata(card);
0782
0783 blk_mq_start_hw_queues(msb->queue);
0784 }
0785
0786 static blk_status_t mspro_queue_rq(struct blk_mq_hw_ctx *hctx,
0787 const struct blk_mq_queue_data *bd)
0788 {
0789 struct memstick_dev *card = hctx->queue->queuedata;
0790 struct mspro_block_data *msb = memstick_get_drvdata(card);
0791
0792 spin_lock_irq(&msb->q_lock);
0793
0794 if (msb->block_req) {
0795 spin_unlock_irq(&msb->q_lock);
0796 return BLK_STS_DEV_RESOURCE;
0797 }
0798
0799 if (msb->eject) {
0800 spin_unlock_irq(&msb->q_lock);
0801 blk_mq_start_request(bd->rq);
0802 return BLK_STS_IOERR;
0803 }
0804
0805 msb->block_req = bd->rq;
0806 blk_mq_start_request(bd->rq);
0807
0808 if (mspro_block_issue_req(card))
0809 msb->block_req = NULL;
0810
0811 spin_unlock_irq(&msb->q_lock);
0812 return BLK_STS_OK;
0813 }
0814
0815
0816
0817 static int mspro_block_wait_for_ced(struct memstick_dev *card)
0818 {
0819 struct mspro_block_data *msb = memstick_get_drvdata(card);
0820
0821 card->next_request = h_mspro_block_req_init;
0822 msb->mrq_handler = h_mspro_block_wait_for_ced;
0823 memstick_init_req(&card->current_mrq, MS_TPC_GET_INT, NULL, 1);
0824 memstick_new_req(card->host);
0825 wait_for_completion(&card->mrq_complete);
0826 return card->current_mrq.error;
0827 }
0828
0829 static int mspro_block_set_interface(struct memstick_dev *card,
0830 unsigned char sys_reg)
0831 {
0832 struct memstick_host *host = card->host;
0833 struct mspro_block_data *msb = memstick_get_drvdata(card);
0834 struct mspro_param_register param = {
0835 .system = sys_reg,
0836 .data_count = 0,
0837 .data_address = 0,
0838 .tpc_param = 0
0839 };
0840
0841 card->next_request = h_mspro_block_req_init;
0842 msb->mrq_handler = h_mspro_block_default;
0843 memstick_init_req(&card->current_mrq, MS_TPC_WRITE_REG, ¶m,
0844 sizeof(param));
0845 memstick_new_req(host);
0846 wait_for_completion(&card->mrq_complete);
0847 return card->current_mrq.error;
0848 }
0849
0850 static int mspro_block_switch_interface(struct memstick_dev *card)
0851 {
0852 struct memstick_host *host = card->host;
0853 struct mspro_block_data *msb = memstick_get_drvdata(card);
0854 int rc = 0;
0855
0856 try_again:
0857 if (msb->caps & MEMSTICK_CAP_PAR4)
0858 rc = mspro_block_set_interface(card, MEMSTICK_SYS_PAR4);
0859 else
0860 return 0;
0861
0862 if (rc) {
0863 printk(KERN_WARNING
0864 "%s: could not switch to 4-bit mode, error %d\n",
0865 dev_name(&card->dev), rc);
0866 return 0;
0867 }
0868
0869 msb->system = MEMSTICK_SYS_PAR4;
0870 host->set_param(host, MEMSTICK_INTERFACE, MEMSTICK_PAR4);
0871 printk(KERN_INFO "%s: switching to 4-bit parallel mode\n",
0872 dev_name(&card->dev));
0873
0874 if (msb->caps & MEMSTICK_CAP_PAR8) {
0875 rc = mspro_block_set_interface(card, MEMSTICK_SYS_PAR8);
0876
0877 if (!rc) {
0878 msb->system = MEMSTICK_SYS_PAR8;
0879 host->set_param(host, MEMSTICK_INTERFACE,
0880 MEMSTICK_PAR8);
0881 printk(KERN_INFO
0882 "%s: switching to 8-bit parallel mode\n",
0883 dev_name(&card->dev));
0884 } else
0885 printk(KERN_WARNING
0886 "%s: could not switch to 8-bit mode, error %d\n",
0887 dev_name(&card->dev), rc);
0888 }
0889
0890 card->next_request = h_mspro_block_req_init;
0891 msb->mrq_handler = h_mspro_block_default;
0892 memstick_init_req(&card->current_mrq, MS_TPC_GET_INT, NULL, 1);
0893 memstick_new_req(card->host);
0894 wait_for_completion(&card->mrq_complete);
0895 rc = card->current_mrq.error;
0896
0897 if (rc) {
0898 printk(KERN_WARNING
0899 "%s: interface error, trying to fall back to serial\n",
0900 dev_name(&card->dev));
0901 msb->system = MEMSTICK_SYS_SERIAL;
0902 host->set_param(host, MEMSTICK_POWER, MEMSTICK_POWER_OFF);
0903 msleep(10);
0904 host->set_param(host, MEMSTICK_POWER, MEMSTICK_POWER_ON);
0905 host->set_param(host, MEMSTICK_INTERFACE, MEMSTICK_SERIAL);
0906
0907 rc = memstick_set_rw_addr(card);
0908 if (!rc)
0909 rc = mspro_block_set_interface(card, msb->system);
0910
0911 if (!rc) {
0912 msleep(150);
0913 rc = mspro_block_wait_for_ced(card);
0914 if (rc)
0915 return rc;
0916
0917 if (msb->caps & MEMSTICK_CAP_PAR8) {
0918 msb->caps &= ~MEMSTICK_CAP_PAR8;
0919 goto try_again;
0920 }
0921 }
0922 }
0923 return rc;
0924 }
0925
0926
0927
0928
0929
0930 static int mspro_block_read_attributes(struct memstick_dev *card)
0931 {
0932 struct mspro_block_data *msb = memstick_get_drvdata(card);
0933 struct mspro_attribute *attr = NULL;
0934 struct mspro_sys_attr *s_attr = NULL;
0935 unsigned char *buffer = NULL;
0936 int cnt, rc, attr_count;
0937
0938
0939
0940
0941
0942 unsigned int addr, attr_offset = 0, attr_len = msb->page_size;
0943
0944 attr = kmalloc(msb->page_size, GFP_KERNEL);
0945 if (!attr)
0946 return -ENOMEM;
0947
0948 sg_init_one(&msb->req_sg[0], attr, msb->page_size);
0949 msb->seg_count = 1;
0950 msb->current_seg = 0;
0951 msb->current_page = 0;
0952 msb->data_dir = READ;
0953 msb->transfer_cmd = MSPRO_CMD_READ_ATRB;
0954
0955 msb->setup_transfer(card, attr_offset, attr_len);
0956
0957 memstick_new_req(card->host);
0958 wait_for_completion(&card->mrq_complete);
0959 if (card->current_mrq.error) {
0960 rc = card->current_mrq.error;
0961 goto out_free_attr;
0962 }
0963
0964 if (be16_to_cpu(attr->signature) != MSPRO_BLOCK_SIGNATURE) {
0965 printk(KERN_ERR "%s: unrecognized device signature %x\n",
0966 dev_name(&card->dev), be16_to_cpu(attr->signature));
0967 rc = -ENODEV;
0968 goto out_free_attr;
0969 }
0970
0971 if (attr->count > MSPRO_BLOCK_MAX_ATTRIBUTES) {
0972 printk(KERN_WARNING "%s: way too many attribute entries\n",
0973 dev_name(&card->dev));
0974 attr_count = MSPRO_BLOCK_MAX_ATTRIBUTES;
0975 } else
0976 attr_count = attr->count;
0977
0978 msb->attr_group.attrs = kcalloc(attr_count + 1,
0979 sizeof(*msb->attr_group.attrs),
0980 GFP_KERNEL);
0981 if (!msb->attr_group.attrs) {
0982 rc = -ENOMEM;
0983 goto out_free_attr;
0984 }
0985 msb->attr_group.name = "media_attributes";
0986
0987 buffer = kmemdup(attr, attr_len, GFP_KERNEL);
0988 if (!buffer) {
0989 rc = -ENOMEM;
0990 goto out_free_attr;
0991 }
0992
0993 for (cnt = 0; cnt < attr_count; ++cnt) {
0994 s_attr = kzalloc(sizeof(struct mspro_sys_attr), GFP_KERNEL);
0995 if (!s_attr) {
0996 rc = -ENOMEM;
0997 goto out_free_buffer;
0998 }
0999
1000 msb->attr_group.attrs[cnt] = &s_attr->dev_attr.attr;
1001 addr = be32_to_cpu(attr->entries[cnt].address);
1002 s_attr->size = be32_to_cpu(attr->entries[cnt].size);
1003 dev_dbg(&card->dev, "adding attribute %d: id %x, address %x, "
1004 "size %zx\n", cnt, attr->entries[cnt].id, addr,
1005 s_attr->size);
1006 s_attr->id = attr->entries[cnt].id;
1007 if (mspro_block_attr_name(s_attr->id))
1008 snprintf(s_attr->name, sizeof(s_attr->name), "%s",
1009 mspro_block_attr_name(attr->entries[cnt].id));
1010 else
1011 snprintf(s_attr->name, sizeof(s_attr->name),
1012 "attr_x%02x", attr->entries[cnt].id);
1013
1014 sysfs_attr_init(&s_attr->dev_attr.attr);
1015 s_attr->dev_attr.attr.name = s_attr->name;
1016 s_attr->dev_attr.attr.mode = S_IRUGO;
1017 s_attr->dev_attr.show = mspro_block_attr_show(s_attr->id);
1018
1019 if (!s_attr->size)
1020 continue;
1021
1022 s_attr->data = kmalloc(s_attr->size, GFP_KERNEL);
1023 if (!s_attr->data) {
1024 rc = -ENOMEM;
1025 goto out_free_buffer;
1026 }
1027
1028 if (((addr / msb->page_size) == (attr_offset / msb->page_size))
1029 && (((addr + s_attr->size - 1) / msb->page_size)
1030 == (attr_offset / msb->page_size))) {
1031 memcpy(s_attr->data, buffer + addr % msb->page_size,
1032 s_attr->size);
1033 continue;
1034 }
1035
1036 attr_offset = (addr / msb->page_size) * msb->page_size;
1037
1038 if ((attr_offset + attr_len) < (addr + s_attr->size)) {
1039 kfree(buffer);
1040 attr_len = (((addr + s_attr->size) / msb->page_size)
1041 + 1 ) * msb->page_size - attr_offset;
1042 buffer = kmalloc(attr_len, GFP_KERNEL);
1043 if (!buffer) {
1044 rc = -ENOMEM;
1045 goto out_free_attr;
1046 }
1047 }
1048
1049 sg_init_one(&msb->req_sg[0], buffer, attr_len);
1050 msb->seg_count = 1;
1051 msb->current_seg = 0;
1052 msb->current_page = 0;
1053 msb->data_dir = READ;
1054 msb->transfer_cmd = MSPRO_CMD_READ_ATRB;
1055
1056 dev_dbg(&card->dev, "reading attribute range %x, %x\n",
1057 attr_offset, attr_len);
1058
1059 msb->setup_transfer(card, attr_offset, attr_len);
1060 memstick_new_req(card->host);
1061 wait_for_completion(&card->mrq_complete);
1062 if (card->current_mrq.error) {
1063 rc = card->current_mrq.error;
1064 goto out_free_buffer;
1065 }
1066
1067 memcpy(s_attr->data, buffer + addr % msb->page_size,
1068 s_attr->size);
1069 }
1070
1071 rc = 0;
1072 out_free_buffer:
1073 kfree(buffer);
1074 out_free_attr:
1075 kfree(attr);
1076 return rc;
1077 }
1078
1079 static int mspro_block_init_card(struct memstick_dev *card)
1080 {
1081 struct mspro_block_data *msb = memstick_get_drvdata(card);
1082 struct memstick_host *host = card->host;
1083 int rc = 0;
1084
1085 msb->system = MEMSTICK_SYS_SERIAL;
1086 msb->setup_transfer = h_mspro_block_setup_cmd;
1087
1088 card->reg_addr.r_offset = offsetof(struct mspro_register, status);
1089 card->reg_addr.r_length = sizeof(struct ms_status_register);
1090 card->reg_addr.w_offset = offsetof(struct mspro_register, param);
1091 card->reg_addr.w_length = sizeof(struct mspro_param_register);
1092
1093 if (memstick_set_rw_addr(card))
1094 return -EIO;
1095
1096 msb->caps = host->caps;
1097
1098 msleep(150);
1099 rc = mspro_block_wait_for_ced(card);
1100 if (rc)
1101 return rc;
1102
1103 rc = mspro_block_switch_interface(card);
1104 if (rc)
1105 return rc;
1106
1107 dev_dbg(&card->dev, "card activated\n");
1108 if (msb->system != MEMSTICK_SYS_SERIAL)
1109 msb->caps |= MEMSTICK_CAP_AUTO_GET_INT;
1110
1111 card->next_request = h_mspro_block_req_init;
1112 msb->mrq_handler = h_mspro_block_get_ro;
1113 memstick_init_req(&card->current_mrq, MS_TPC_READ_REG, NULL,
1114 sizeof(struct ms_status_register));
1115 memstick_new_req(card->host);
1116 wait_for_completion(&card->mrq_complete);
1117 if (card->current_mrq.error)
1118 return card->current_mrq.error;
1119
1120 dev_dbg(&card->dev, "card r/w status %d\n", msb->read_only ? 0 : 1);
1121
1122 msb->page_size = 512;
1123 rc = mspro_block_read_attributes(card);
1124 if (rc)
1125 return rc;
1126
1127 dev_dbg(&card->dev, "attributes loaded\n");
1128 return 0;
1129
1130 }
1131
1132 static const struct blk_mq_ops mspro_mq_ops = {
1133 .queue_rq = mspro_queue_rq,
1134 };
1135
1136 static int mspro_block_init_disk(struct memstick_dev *card)
1137 {
1138 struct mspro_block_data *msb = memstick_get_drvdata(card);
1139 struct mspro_devinfo *dev_info = NULL;
1140 struct mspro_sys_info *sys_info = NULL;
1141 struct mspro_sys_attr *s_attr = NULL;
1142 int rc, disk_id;
1143 unsigned long capacity;
1144
1145 for (rc = 0; msb->attr_group.attrs[rc]; ++rc) {
1146 s_attr = mspro_from_sysfs_attr(msb->attr_group.attrs[rc]);
1147
1148 if (s_attr->id == MSPRO_BLOCK_ID_DEVINFO)
1149 dev_info = s_attr->data;
1150 else if (s_attr->id == MSPRO_BLOCK_ID_SYSINFO)
1151 sys_info = s_attr->data;
1152 }
1153
1154 if (!dev_info || !sys_info)
1155 return -ENODEV;
1156
1157 msb->cylinders = be16_to_cpu(dev_info->cylinders);
1158 msb->heads = be16_to_cpu(dev_info->heads);
1159 msb->sectors_per_track = be16_to_cpu(dev_info->sectors_per_track);
1160
1161 msb->page_size = be16_to_cpu(sys_info->unit_size);
1162
1163 mutex_lock(&mspro_block_disk_lock);
1164 disk_id = idr_alloc(&mspro_block_disk_idr, card, 0, 256, GFP_KERNEL);
1165 mutex_unlock(&mspro_block_disk_lock);
1166 if (disk_id < 0)
1167 return disk_id;
1168
1169 rc = blk_mq_alloc_sq_tag_set(&msb->tag_set, &mspro_mq_ops, 2,
1170 BLK_MQ_F_SHOULD_MERGE);
1171 if (rc)
1172 goto out_release_id;
1173
1174 msb->disk = blk_mq_alloc_disk(&msb->tag_set, card);
1175 if (IS_ERR(msb->disk)) {
1176 rc = PTR_ERR(msb->disk);
1177 goto out_free_tag_set;
1178 }
1179 msb->queue = msb->disk->queue;
1180
1181 blk_queue_max_hw_sectors(msb->queue, MSPRO_BLOCK_MAX_PAGES);
1182 blk_queue_max_segments(msb->queue, MSPRO_BLOCK_MAX_SEGS);
1183 blk_queue_max_segment_size(msb->queue,
1184 MSPRO_BLOCK_MAX_PAGES * msb->page_size);
1185
1186 msb->disk->major = major;
1187 msb->disk->first_minor = disk_id << MSPRO_BLOCK_PART_SHIFT;
1188 msb->disk->minors = 1 << MSPRO_BLOCK_PART_SHIFT;
1189 msb->disk->fops = &ms_block_bdops;
1190 msb->disk->private_data = msb;
1191
1192 sprintf(msb->disk->disk_name, "mspblk%d", disk_id);
1193
1194 blk_queue_logical_block_size(msb->queue, msb->page_size);
1195
1196 capacity = be16_to_cpu(sys_info->user_block_count);
1197 capacity *= be16_to_cpu(sys_info->block_size);
1198 capacity *= msb->page_size >> 9;
1199 set_capacity(msb->disk, capacity);
1200 dev_dbg(&card->dev, "capacity set %ld\n", capacity);
1201
1202 if (msb->read_only)
1203 set_disk_ro(msb->disk, true);
1204
1205 rc = device_add_disk(&card->dev, msb->disk, NULL);
1206 if (rc)
1207 goto out_cleanup_disk;
1208 msb->active = 1;
1209 return 0;
1210
1211 out_cleanup_disk:
1212 put_disk(msb->disk);
1213 out_free_tag_set:
1214 blk_mq_free_tag_set(&msb->tag_set);
1215 out_release_id:
1216 mutex_lock(&mspro_block_disk_lock);
1217 idr_remove(&mspro_block_disk_idr, disk_id);
1218 mutex_unlock(&mspro_block_disk_lock);
1219 return rc;
1220 }
1221
1222 static void mspro_block_data_clear(struct mspro_block_data *msb)
1223 {
1224 int cnt;
1225 struct mspro_sys_attr *s_attr;
1226
1227 if (msb->attr_group.attrs) {
1228 for (cnt = 0; msb->attr_group.attrs[cnt]; ++cnt) {
1229 s_attr = mspro_from_sysfs_attr(msb->attr_group
1230 .attrs[cnt]);
1231 kfree(s_attr->data);
1232 kfree(s_attr);
1233 }
1234 kfree(msb->attr_group.attrs);
1235 }
1236
1237 msb->card = NULL;
1238 }
1239
1240 static int mspro_block_check_card(struct memstick_dev *card)
1241 {
1242 struct mspro_block_data *msb = memstick_get_drvdata(card);
1243
1244 return (msb->active == 1);
1245 }
1246
1247 static int mspro_block_probe(struct memstick_dev *card)
1248 {
1249 struct mspro_block_data *msb;
1250 int rc = 0;
1251
1252 msb = kzalloc(sizeof(struct mspro_block_data), GFP_KERNEL);
1253 if (!msb)
1254 return -ENOMEM;
1255 memstick_set_drvdata(card, msb);
1256 msb->card = card;
1257 spin_lock_init(&msb->q_lock);
1258
1259 rc = mspro_block_init_card(card);
1260
1261 if (rc)
1262 goto out_free;
1263
1264 rc = sysfs_create_group(&card->dev.kobj, &msb->attr_group);
1265 if (rc)
1266 goto out_free;
1267
1268 rc = mspro_block_init_disk(card);
1269 if (!rc) {
1270 card->check = mspro_block_check_card;
1271 card->stop = mspro_block_stop;
1272 card->start = mspro_block_start;
1273 return 0;
1274 }
1275
1276 sysfs_remove_group(&card->dev.kobj, &msb->attr_group);
1277 out_free:
1278 memstick_set_drvdata(card, NULL);
1279 mspro_block_data_clear(msb);
1280 kfree(msb);
1281 return rc;
1282 }
1283
1284 static void mspro_block_remove(struct memstick_dev *card)
1285 {
1286 struct mspro_block_data *msb = memstick_get_drvdata(card);
1287 unsigned long flags;
1288
1289 spin_lock_irqsave(&msb->q_lock, flags);
1290 msb->eject = 1;
1291 spin_unlock_irqrestore(&msb->q_lock, flags);
1292 blk_mq_start_hw_queues(msb->queue);
1293
1294 del_gendisk(msb->disk);
1295 dev_dbg(&card->dev, "mspro block remove\n");
1296
1297 blk_mq_free_tag_set(&msb->tag_set);
1298 msb->queue = NULL;
1299
1300 sysfs_remove_group(&card->dev.kobj, &msb->attr_group);
1301
1302 mutex_lock(&mspro_block_disk_lock);
1303 mspro_block_data_clear(msb);
1304 mutex_unlock(&mspro_block_disk_lock);
1305
1306 put_disk(msb->disk);
1307 memstick_set_drvdata(card, NULL);
1308 }
1309
1310 #ifdef CONFIG_PM
1311
1312 static int mspro_block_suspend(struct memstick_dev *card, pm_message_t state)
1313 {
1314 struct mspro_block_data *msb = memstick_get_drvdata(card);
1315 unsigned long flags;
1316
1317 blk_mq_stop_hw_queues(msb->queue);
1318
1319 spin_lock_irqsave(&msb->q_lock, flags);
1320 msb->active = 0;
1321 spin_unlock_irqrestore(&msb->q_lock, flags);
1322
1323 return 0;
1324 }
1325
1326 static int mspro_block_resume(struct memstick_dev *card)
1327 {
1328 struct mspro_block_data *msb = memstick_get_drvdata(card);
1329 int rc = 0;
1330
1331 #ifdef CONFIG_MEMSTICK_UNSAFE_RESUME
1332
1333 struct mspro_block_data *new_msb;
1334 struct memstick_host *host = card->host;
1335 struct mspro_sys_attr *s_attr, *r_attr;
1336 unsigned char cnt;
1337
1338 mutex_lock(&host->lock);
1339 new_msb = kzalloc(sizeof(struct mspro_block_data), GFP_KERNEL);
1340 if (!new_msb) {
1341 rc = -ENOMEM;
1342 goto out_unlock;
1343 }
1344
1345 new_msb->card = card;
1346 memstick_set_drvdata(card, new_msb);
1347 rc = mspro_block_init_card(card);
1348 if (rc)
1349 goto out_free;
1350
1351 for (cnt = 0; new_msb->attr_group.attrs[cnt]
1352 && msb->attr_group.attrs[cnt]; ++cnt) {
1353 s_attr = mspro_from_sysfs_attr(new_msb->attr_group.attrs[cnt]);
1354 r_attr = mspro_from_sysfs_attr(msb->attr_group.attrs[cnt]);
1355
1356 if (s_attr->id == MSPRO_BLOCK_ID_SYSINFO
1357 && r_attr->id == s_attr->id) {
1358 if (memcmp(s_attr->data, r_attr->data, s_attr->size))
1359 break;
1360
1361 msb->active = 1;
1362 break;
1363 }
1364 }
1365
1366 out_free:
1367 memstick_set_drvdata(card, msb);
1368 mspro_block_data_clear(new_msb);
1369 kfree(new_msb);
1370 out_unlock:
1371 mutex_unlock(&host->lock);
1372
1373 #endif
1374
1375 blk_mq_start_hw_queues(msb->queue);
1376 return rc;
1377 }
1378
1379 #else
1380
1381 #define mspro_block_suspend NULL
1382 #define mspro_block_resume NULL
1383
1384 #endif
1385
1386 static struct memstick_device_id mspro_block_id_tbl[] = {
1387 {MEMSTICK_MATCH_ALL, MEMSTICK_TYPE_PRO, MEMSTICK_CATEGORY_STORAGE_DUO,
1388 MEMSTICK_CLASS_DUO},
1389 {}
1390 };
1391
1392
1393 static struct memstick_driver mspro_block_driver = {
1394 .driver = {
1395 .name = DRIVER_NAME,
1396 .owner = THIS_MODULE
1397 },
1398 .id_table = mspro_block_id_tbl,
1399 .probe = mspro_block_probe,
1400 .remove = mspro_block_remove,
1401 .suspend = mspro_block_suspend,
1402 .resume = mspro_block_resume
1403 };
1404
1405 static int __init mspro_block_init(void)
1406 {
1407 int rc = -ENOMEM;
1408
1409 rc = register_blkdev(major, DRIVER_NAME);
1410 if (rc < 0) {
1411 printk(KERN_ERR DRIVER_NAME ": failed to register "
1412 "major %d, error %d\n", major, rc);
1413 return rc;
1414 }
1415 if (!major)
1416 major = rc;
1417
1418 rc = memstick_register_driver(&mspro_block_driver);
1419 if (rc)
1420 unregister_blkdev(major, DRIVER_NAME);
1421 return rc;
1422 }
1423
1424 static void __exit mspro_block_exit(void)
1425 {
1426 memstick_unregister_driver(&mspro_block_driver);
1427 unregister_blkdev(major, DRIVER_NAME);
1428 idr_destroy(&mspro_block_disk_idr);
1429 }
1430
1431 module_init(mspro_block_init);
1432 module_exit(mspro_block_exit);
1433
1434 MODULE_LICENSE("GPL");
1435 MODULE_AUTHOR("Alex Dubov");
1436 MODULE_DESCRIPTION("Sony MemoryStickPro block device driver");
1437 MODULE_DEVICE_TABLE(memstick, mspro_block_id_tbl);