root/drivers/usb/storage/alauda.c

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

DEFINITIONS

This source file includes following definitions.
  1. alauda_card_find_id
  2. nand_init_ecc
  3. nand_compute_ecc
  4. nand_compare_ecc
  5. nand_store_ecc
  6. alauda_free_maps
  7. alauda_get_media_status
  8. alauda_ack_media
  9. alauda_get_media_signature
  10. alauda_reset_media
  11. alauda_init_media
  12. alauda_check_media
  13. alauda_check_status2
  14. alauda_get_redu_data
  15. alauda_find_unused_pba
  16. alauda_read_map
  17. alauda_ensure_map_for_zone
  18. alauda_erase_block
  19. alauda_read_block_raw
  20. alauda_read_block
  21. alauda_write_block
  22. alauda_write_lba
  23. alauda_read_data
  24. alauda_write_data
  25. alauda_info_destructor
  26. init_alauda
  27. alauda_transport
  28. alauda_probe

   1 // SPDX-License-Identifier: GPL-2.0+
   2 /*
   3  * Driver for Alauda-based card readers
   4  *
   5  * Current development and maintenance by:
   6  *   (c) 2005 Daniel Drake <dsd@gentoo.org>
   7  *
   8  * The 'Alauda' is a chip manufacturered by RATOC for OEM use.
   9  *
  10  * Alauda implements a vendor-specific command set to access two media reader
  11  * ports (XD, SmartMedia). This driver converts SCSI commands to the commands
  12  * which are accepted by these devices.
  13  *
  14  * The driver was developed through reverse-engineering, with the help of the
  15  * sddr09 driver which has many similarities, and with some help from the
  16  * (very old) vendor-supplied GPL sma03 driver.
  17  *
  18  * For protocol info, see http://alauda.sourceforge.net
  19  */
  20 
  21 #include <linux/module.h>
  22 #include <linux/slab.h>
  23 
  24 #include <scsi/scsi.h>
  25 #include <scsi/scsi_cmnd.h>
  26 #include <scsi/scsi_device.h>
  27 
  28 #include "usb.h"
  29 #include "transport.h"
  30 #include "protocol.h"
  31 #include "debug.h"
  32 #include "scsiglue.h"
  33 
  34 #define DRV_NAME "ums-alauda"
  35 
  36 MODULE_DESCRIPTION("Driver for Alauda-based card readers");
  37 MODULE_AUTHOR("Daniel Drake <dsd@gentoo.org>");
  38 MODULE_LICENSE("GPL");
  39 MODULE_IMPORT_NS(USB_STORAGE);
  40 
  41 /*
  42  * Status bytes
  43  */
  44 #define ALAUDA_STATUS_ERROR             0x01
  45 #define ALAUDA_STATUS_READY             0x40
  46 
  47 /*
  48  * Control opcodes (for request field)
  49  */
  50 #define ALAUDA_GET_XD_MEDIA_STATUS      0x08
  51 #define ALAUDA_GET_SM_MEDIA_STATUS      0x98
  52 #define ALAUDA_ACK_XD_MEDIA_CHANGE      0x0a
  53 #define ALAUDA_ACK_SM_MEDIA_CHANGE      0x9a
  54 #define ALAUDA_GET_XD_MEDIA_SIG         0x86
  55 #define ALAUDA_GET_SM_MEDIA_SIG         0x96
  56 
  57 /*
  58  * Bulk command identity (byte 0)
  59  */
  60 #define ALAUDA_BULK_CMD                 0x40
  61 
  62 /*
  63  * Bulk opcodes (byte 1)
  64  */
  65 #define ALAUDA_BULK_GET_REDU_DATA       0x85
  66 #define ALAUDA_BULK_READ_BLOCK          0x94
  67 #define ALAUDA_BULK_ERASE_BLOCK         0xa3
  68 #define ALAUDA_BULK_WRITE_BLOCK         0xb4
  69 #define ALAUDA_BULK_GET_STATUS2         0xb7
  70 #define ALAUDA_BULK_RESET_MEDIA         0xe0
  71 
  72 /*
  73  * Port to operate on (byte 8)
  74  */
  75 #define ALAUDA_PORT_XD                  0x00
  76 #define ALAUDA_PORT_SM                  0x01
  77 
  78 /*
  79  * LBA and PBA are unsigned ints. Special values.
  80  */
  81 #define UNDEF    0xffff
  82 #define SPARE    0xfffe
  83 #define UNUSABLE 0xfffd
  84 
  85 struct alauda_media_info {
  86         unsigned long capacity;         /* total media size in bytes */
  87         unsigned int pagesize;          /* page size in bytes */
  88         unsigned int blocksize;         /* number of pages per block */
  89         unsigned int uzonesize;         /* number of usable blocks per zone */
  90         unsigned int zonesize;          /* number of blocks per zone */
  91         unsigned int blockmask;         /* mask to get page from address */
  92 
  93         unsigned char pageshift;
  94         unsigned char blockshift;
  95         unsigned char zoneshift;
  96 
  97         u16 **lba_to_pba;               /* logical to physical block map */
  98         u16 **pba_to_lba;               /* physical to logical block map */
  99 };
 100 
 101 struct alauda_info {
 102         struct alauda_media_info port[2];
 103         int wr_ep;                      /* endpoint to write data out of */
 104 
 105         unsigned char sense_key;
 106         unsigned long sense_asc;        /* additional sense code */
 107         unsigned long sense_ascq;       /* additional sense code qualifier */
 108 };
 109 
 110 #define short_pack(lsb,msb) ( ((u16)(lsb)) | ( ((u16)(msb))<<8 ) )
 111 #define LSB_of(s) ((s)&0xFF)
 112 #define MSB_of(s) ((s)>>8)
 113 
 114 #define MEDIA_PORT(us) us->srb->device->lun
 115 #define MEDIA_INFO(us) ((struct alauda_info *)us->extra)->port[MEDIA_PORT(us)]
 116 
 117 #define PBA_LO(pba) ((pba & 0xF) << 5)
 118 #define PBA_HI(pba) (pba >> 3)
 119 #define PBA_ZONE(pba) (pba >> 11)
 120 
 121 static int init_alauda(struct us_data *us);
 122 
 123 
 124 /*
 125  * The table of devices
 126  */
 127 #define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
 128                     vendorName, productName, useProtocol, useTransport, \
 129                     initFunction, flags) \
 130 { USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \
 131   .driver_info = (flags) }
 132 
 133 static struct usb_device_id alauda_usb_ids[] = {
 134 #       include "unusual_alauda.h"
 135         { }             /* Terminating entry */
 136 };
 137 MODULE_DEVICE_TABLE(usb, alauda_usb_ids);
 138 
 139 #undef UNUSUAL_DEV
 140 
 141 /*
 142  * The flags table
 143  */
 144 #define UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax, \
 145                     vendor_name, product_name, use_protocol, use_transport, \
 146                     init_function, Flags) \
 147 { \
 148         .vendorName = vendor_name,      \
 149         .productName = product_name,    \
 150         .useProtocol = use_protocol,    \
 151         .useTransport = use_transport,  \
 152         .initFunction = init_function,  \
 153 }
 154 
 155 static struct us_unusual_dev alauda_unusual_dev_list[] = {
 156 #       include "unusual_alauda.h"
 157         { }             /* Terminating entry */
 158 };
 159 
 160 #undef UNUSUAL_DEV
 161 
 162 
 163 /*
 164  * Media handling
 165  */
 166 
 167 struct alauda_card_info {
 168         unsigned char id;               /* id byte */
 169         unsigned char chipshift;        /* 1<<cs bytes total capacity */
 170         unsigned char pageshift;        /* 1<<ps bytes in a page */
 171         unsigned char blockshift;       /* 1<<bs pages per block */
 172         unsigned char zoneshift;        /* 1<<zs blocks per zone */
 173 };
 174 
 175 static struct alauda_card_info alauda_card_ids[] = {
 176         /* NAND flash */
 177         { 0x6e, 20, 8, 4, 8},   /* 1 MB */
 178         { 0xe8, 20, 8, 4, 8},   /* 1 MB */
 179         { 0xec, 20, 8, 4, 8},   /* 1 MB */
 180         { 0x64, 21, 8, 4, 9},   /* 2 MB */
 181         { 0xea, 21, 8, 4, 9},   /* 2 MB */
 182         { 0x6b, 22, 9, 4, 9},   /* 4 MB */
 183         { 0xe3, 22, 9, 4, 9},   /* 4 MB */
 184         { 0xe5, 22, 9, 4, 9},   /* 4 MB */
 185         { 0xe6, 23, 9, 4, 10},  /* 8 MB */
 186         { 0x73, 24, 9, 5, 10},  /* 16 MB */
 187         { 0x75, 25, 9, 5, 10},  /* 32 MB */
 188         { 0x76, 26, 9, 5, 10},  /* 64 MB */
 189         { 0x79, 27, 9, 5, 10},  /* 128 MB */
 190         { 0x71, 28, 9, 5, 10},  /* 256 MB */
 191 
 192         /* MASK ROM */
 193         { 0x5d, 21, 9, 4, 8},   /* 2 MB */
 194         { 0xd5, 22, 9, 4, 9},   /* 4 MB */
 195         { 0xd6, 23, 9, 4, 10},  /* 8 MB */
 196         { 0x57, 24, 9, 4, 11},  /* 16 MB */
 197         { 0x58, 25, 9, 4, 12},  /* 32 MB */
 198         { 0,}
 199 };
 200 
 201 static struct alauda_card_info *alauda_card_find_id(unsigned char id)
 202 {
 203         int i;
 204 
 205         for (i = 0; alauda_card_ids[i].id != 0; i++)
 206                 if (alauda_card_ids[i].id == id)
 207                         return &(alauda_card_ids[i]);
 208         return NULL;
 209 }
 210 
 211 /*
 212  * ECC computation.
 213  */
 214 
 215 static unsigned char parity[256];
 216 static unsigned char ecc2[256];
 217 
 218 static void nand_init_ecc(void)
 219 {
 220         int i, j, a;
 221 
 222         parity[0] = 0;
 223         for (i = 1; i < 256; i++)
 224                 parity[i] = (parity[i&(i-1)] ^ 1);
 225 
 226         for (i = 0; i < 256; i++) {
 227                 a = 0;
 228                 for (j = 0; j < 8; j++) {
 229                         if (i & (1<<j)) {
 230                                 if ((j & 1) == 0)
 231                                         a ^= 0x04;
 232                                 if ((j & 2) == 0)
 233                                         a ^= 0x10;
 234                                 if ((j & 4) == 0)
 235                                         a ^= 0x40;
 236                         }
 237                 }
 238                 ecc2[i] = ~(a ^ (a<<1) ^ (parity[i] ? 0xa8 : 0));
 239         }
 240 }
 241 
 242 /* compute 3-byte ecc on 256 bytes */
 243 static void nand_compute_ecc(unsigned char *data, unsigned char *ecc)
 244 {
 245         int i, j, a;
 246         unsigned char par = 0, bit, bits[8] = {0};
 247 
 248         /* collect 16 checksum bits */
 249         for (i = 0; i < 256; i++) {
 250                 par ^= data[i];
 251                 bit = parity[data[i]];
 252                 for (j = 0; j < 8; j++)
 253                         if ((i & (1<<j)) == 0)
 254                                 bits[j] ^= bit;
 255         }
 256 
 257         /* put 4+4+4 = 12 bits in the ecc */
 258         a = (bits[3] << 6) + (bits[2] << 4) + (bits[1] << 2) + bits[0];
 259         ecc[0] = ~(a ^ (a<<1) ^ (parity[par] ? 0xaa : 0));
 260 
 261         a = (bits[7] << 6) + (bits[6] << 4) + (bits[5] << 2) + bits[4];
 262         ecc[1] = ~(a ^ (a<<1) ^ (parity[par] ? 0xaa : 0));
 263 
 264         ecc[2] = ecc2[par];
 265 }
 266 
 267 static int nand_compare_ecc(unsigned char *data, unsigned char *ecc)
 268 {
 269         return (data[0] == ecc[0] && data[1] == ecc[1] && data[2] == ecc[2]);
 270 }
 271 
 272 static void nand_store_ecc(unsigned char *data, unsigned char *ecc)
 273 {
 274         memcpy(data, ecc, 3);
 275 }
 276 
 277 /*
 278  * Alauda driver
 279  */
 280 
 281 /*
 282  * Forget our PBA <---> LBA mappings for a particular port
 283  */
 284 static void alauda_free_maps (struct alauda_media_info *media_info)
 285 {
 286         unsigned int shift = media_info->zoneshift
 287                 + media_info->blockshift + media_info->pageshift;
 288         unsigned int num_zones = media_info->capacity >> shift;
 289         unsigned int i;
 290 
 291         if (media_info->lba_to_pba != NULL)
 292                 for (i = 0; i < num_zones; i++) {
 293                         kfree(media_info->lba_to_pba[i]);
 294                         media_info->lba_to_pba[i] = NULL;
 295                 }
 296 
 297         if (media_info->pba_to_lba != NULL)
 298                 for (i = 0; i < num_zones; i++) {
 299                         kfree(media_info->pba_to_lba[i]);
 300                         media_info->pba_to_lba[i] = NULL;
 301                 }
 302 }
 303 
 304 /*
 305  * Returns 2 bytes of status data
 306  * The first byte describes media status, and second byte describes door status
 307  */
 308 static int alauda_get_media_status(struct us_data *us, unsigned char *data)
 309 {
 310         int rc;
 311         unsigned char command;
 312 
 313         if (MEDIA_PORT(us) == ALAUDA_PORT_XD)
 314                 command = ALAUDA_GET_XD_MEDIA_STATUS;
 315         else
 316                 command = ALAUDA_GET_SM_MEDIA_STATUS;
 317 
 318         rc = usb_stor_ctrl_transfer(us, us->recv_ctrl_pipe,
 319                 command, 0xc0, 0, 1, data, 2);
 320 
 321         usb_stor_dbg(us, "Media status %02X %02X\n", data[0], data[1]);
 322 
 323         return rc;
 324 }
 325 
 326 /*
 327  * Clears the "media was changed" bit so that we know when it changes again
 328  * in the future.
 329  */
 330 static int alauda_ack_media(struct us_data *us)
 331 {
 332         unsigned char command;
 333 
 334         if (MEDIA_PORT(us) == ALAUDA_PORT_XD)
 335                 command = ALAUDA_ACK_XD_MEDIA_CHANGE;
 336         else
 337                 command = ALAUDA_ACK_SM_MEDIA_CHANGE;
 338 
 339         return usb_stor_ctrl_transfer(us, us->send_ctrl_pipe,
 340                 command, 0x40, 0, 1, NULL, 0);
 341 }
 342 
 343 /*
 344  * Retrieves a 4-byte media signature, which indicates manufacturer, capacity,
 345  * and some other details.
 346  */
 347 static int alauda_get_media_signature(struct us_data *us, unsigned char *data)
 348 {
 349         unsigned char command;
 350 
 351         if (MEDIA_PORT(us) == ALAUDA_PORT_XD)
 352                 command = ALAUDA_GET_XD_MEDIA_SIG;
 353         else
 354                 command = ALAUDA_GET_SM_MEDIA_SIG;
 355 
 356         return usb_stor_ctrl_transfer(us, us->recv_ctrl_pipe,
 357                 command, 0xc0, 0, 0, data, 4);
 358 }
 359 
 360 /*
 361  * Resets the media status (but not the whole device?)
 362  */
 363 static int alauda_reset_media(struct us_data *us)
 364 {
 365         unsigned char *command = us->iobuf;
 366 
 367         memset(command, 0, 9);
 368         command[0] = ALAUDA_BULK_CMD;
 369         command[1] = ALAUDA_BULK_RESET_MEDIA;
 370         command[8] = MEDIA_PORT(us);
 371 
 372         return usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
 373                 command, 9, NULL);
 374 }
 375 
 376 /*
 377  * Examines the media and deduces capacity, etc.
 378  */
 379 static int alauda_init_media(struct us_data *us)
 380 {
 381         unsigned char *data = us->iobuf;
 382         int ready = 0;
 383         struct alauda_card_info *media_info;
 384         unsigned int num_zones;
 385 
 386         while (ready == 0) {
 387                 msleep(20);
 388 
 389                 if (alauda_get_media_status(us, data) != USB_STOR_XFER_GOOD)
 390                         return USB_STOR_TRANSPORT_ERROR;
 391 
 392                 if (data[0] & 0x10)
 393                         ready = 1;
 394         }
 395 
 396         usb_stor_dbg(us, "We are ready for action!\n");
 397 
 398         if (alauda_ack_media(us) != USB_STOR_XFER_GOOD)
 399                 return USB_STOR_TRANSPORT_ERROR;
 400 
 401         msleep(10);
 402 
 403         if (alauda_get_media_status(us, data) != USB_STOR_XFER_GOOD)
 404                 return USB_STOR_TRANSPORT_ERROR;
 405 
 406         if (data[0] != 0x14) {
 407                 usb_stor_dbg(us, "Media not ready after ack\n");
 408                 return USB_STOR_TRANSPORT_ERROR;
 409         }
 410 
 411         if (alauda_get_media_signature(us, data) != USB_STOR_XFER_GOOD)
 412                 return USB_STOR_TRANSPORT_ERROR;
 413 
 414         usb_stor_dbg(us, "Media signature: %4ph\n", data);
 415         media_info = alauda_card_find_id(data[1]);
 416         if (media_info == NULL) {
 417                 pr_warn("alauda_init_media: Unrecognised media signature: %4ph\n",
 418                         data);
 419                 return USB_STOR_TRANSPORT_ERROR;
 420         }
 421 
 422         MEDIA_INFO(us).capacity = 1 << media_info->chipshift;
 423         usb_stor_dbg(us, "Found media with capacity: %ldMB\n",
 424                      MEDIA_INFO(us).capacity >> 20);
 425 
 426         MEDIA_INFO(us).pageshift = media_info->pageshift;
 427         MEDIA_INFO(us).blockshift = media_info->blockshift;
 428         MEDIA_INFO(us).zoneshift = media_info->zoneshift;
 429 
 430         MEDIA_INFO(us).pagesize = 1 << media_info->pageshift;
 431         MEDIA_INFO(us).blocksize = 1 << media_info->blockshift;
 432         MEDIA_INFO(us).zonesize = 1 << media_info->zoneshift;
 433 
 434         MEDIA_INFO(us).uzonesize = ((1 << media_info->zoneshift) / 128) * 125;
 435         MEDIA_INFO(us).blockmask = MEDIA_INFO(us).blocksize - 1;
 436 
 437         num_zones = MEDIA_INFO(us).capacity >> (MEDIA_INFO(us).zoneshift
 438                 + MEDIA_INFO(us).blockshift + MEDIA_INFO(us).pageshift);
 439         MEDIA_INFO(us).pba_to_lba = kcalloc(num_zones, sizeof(u16*), GFP_NOIO);
 440         MEDIA_INFO(us).lba_to_pba = kcalloc(num_zones, sizeof(u16*), GFP_NOIO);
 441 
 442         if (alauda_reset_media(us) != USB_STOR_XFER_GOOD)
 443                 return USB_STOR_TRANSPORT_ERROR;
 444 
 445         return USB_STOR_TRANSPORT_GOOD;
 446 }
 447 
 448 /*
 449  * Examines the media status and does the right thing when the media has gone,
 450  * appeared, or changed.
 451  */
 452 static int alauda_check_media(struct us_data *us)
 453 {
 454         struct alauda_info *info = (struct alauda_info *) us->extra;
 455         unsigned char status[2];
 456         int rc;
 457 
 458         rc = alauda_get_media_status(us, status);
 459 
 460         /* Check for no media or door open */
 461         if ((status[0] & 0x80) || ((status[0] & 0x1F) == 0x10)
 462                 || ((status[1] & 0x01) == 0)) {
 463                 usb_stor_dbg(us, "No media, or door open\n");
 464                 alauda_free_maps(&MEDIA_INFO(us));
 465                 info->sense_key = 0x02;
 466                 info->sense_asc = 0x3A;
 467                 info->sense_ascq = 0x00;
 468                 return USB_STOR_TRANSPORT_FAILED;
 469         }
 470 
 471         /* Check for media change */
 472         if (status[0] & 0x08) {
 473                 usb_stor_dbg(us, "Media change detected\n");
 474                 alauda_free_maps(&MEDIA_INFO(us));
 475                 alauda_init_media(us);
 476 
 477                 info->sense_key = UNIT_ATTENTION;
 478                 info->sense_asc = 0x28;
 479                 info->sense_ascq = 0x00;
 480                 return USB_STOR_TRANSPORT_FAILED;
 481         }
 482 
 483         return USB_STOR_TRANSPORT_GOOD;
 484 }
 485 
 486 /*
 487  * Checks the status from the 2nd status register
 488  * Returns 3 bytes of status data, only the first is known
 489  */
 490 static int alauda_check_status2(struct us_data *us)
 491 {
 492         int rc;
 493         unsigned char command[] = {
 494                 ALAUDA_BULK_CMD, ALAUDA_BULK_GET_STATUS2,
 495                 0, 0, 0, 0, 3, 0, MEDIA_PORT(us)
 496         };
 497         unsigned char data[3];
 498 
 499         rc = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
 500                 command, 9, NULL);
 501         if (rc != USB_STOR_XFER_GOOD)
 502                 return rc;
 503 
 504         rc = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
 505                 data, 3, NULL);
 506         if (rc != USB_STOR_XFER_GOOD)
 507                 return rc;
 508 
 509         usb_stor_dbg(us, "%3ph\n", data);
 510         if (data[0] & ALAUDA_STATUS_ERROR)
 511                 return USB_STOR_XFER_ERROR;
 512 
 513         return USB_STOR_XFER_GOOD;
 514 }
 515 
 516 /*
 517  * Gets the redundancy data for the first page of a PBA
 518  * Returns 16 bytes.
 519  */
 520 static int alauda_get_redu_data(struct us_data *us, u16 pba, unsigned char *data)
 521 {
 522         int rc;
 523         unsigned char command[] = {
 524                 ALAUDA_BULK_CMD, ALAUDA_BULK_GET_REDU_DATA,
 525                 PBA_HI(pba), PBA_ZONE(pba), 0, PBA_LO(pba), 0, 0, MEDIA_PORT(us)
 526         };
 527 
 528         rc = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
 529                 command, 9, NULL);
 530         if (rc != USB_STOR_XFER_GOOD)
 531                 return rc;
 532 
 533         return usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
 534                 data, 16, NULL);
 535 }
 536 
 537 /*
 538  * Finds the first unused PBA in a zone
 539  * Returns the absolute PBA of an unused PBA, or 0 if none found.
 540  */
 541 static u16 alauda_find_unused_pba(struct alauda_media_info *info,
 542         unsigned int zone)
 543 {
 544         u16 *pba_to_lba = info->pba_to_lba[zone];
 545         unsigned int i;
 546 
 547         for (i = 0; i < info->zonesize; i++)
 548                 if (pba_to_lba[i] == UNDEF)
 549                         return (zone << info->zoneshift) + i;
 550 
 551         return 0;
 552 }
 553 
 554 /*
 555  * Reads the redundancy data for all PBA's in a zone
 556  * Produces lba <--> pba mappings
 557  */
 558 static int alauda_read_map(struct us_data *us, unsigned int zone)
 559 {
 560         unsigned char *data = us->iobuf;
 561         int result;
 562         int i, j;
 563         unsigned int zonesize = MEDIA_INFO(us).zonesize;
 564         unsigned int uzonesize = MEDIA_INFO(us).uzonesize;
 565         unsigned int lba_offset, lba_real, blocknum;
 566         unsigned int zone_base_lba = zone * uzonesize;
 567         unsigned int zone_base_pba = zone * zonesize;
 568         u16 *lba_to_pba = kcalloc(zonesize, sizeof(u16), GFP_NOIO);
 569         u16 *pba_to_lba = kcalloc(zonesize, sizeof(u16), GFP_NOIO);
 570         if (lba_to_pba == NULL || pba_to_lba == NULL) {
 571                 result = USB_STOR_TRANSPORT_ERROR;
 572                 goto error;
 573         }
 574 
 575         usb_stor_dbg(us, "Mapping blocks for zone %d\n", zone);
 576 
 577         /* 1024 PBA's per zone */
 578         for (i = 0; i < zonesize; i++)
 579                 lba_to_pba[i] = pba_to_lba[i] = UNDEF;
 580 
 581         for (i = 0; i < zonesize; i++) {
 582                 blocknum = zone_base_pba + i;
 583 
 584                 result = alauda_get_redu_data(us, blocknum, data);
 585                 if (result != USB_STOR_XFER_GOOD) {
 586                         result = USB_STOR_TRANSPORT_ERROR;
 587                         goto error;
 588                 }
 589 
 590                 /* special PBAs have control field 0^16 */
 591                 for (j = 0; j < 16; j++)
 592                         if (data[j] != 0)
 593                                 goto nonz;
 594                 pba_to_lba[i] = UNUSABLE;
 595                 usb_stor_dbg(us, "PBA %d has no logical mapping\n", blocknum);
 596                 continue;
 597 
 598         nonz:
 599                 /* unwritten PBAs have control field FF^16 */
 600                 for (j = 0; j < 16; j++)
 601                         if (data[j] != 0xff)
 602                                 goto nonff;
 603                 continue;
 604 
 605         nonff:
 606                 /* normal PBAs start with six FFs */
 607                 if (j < 6) {
 608                         usb_stor_dbg(us, "PBA %d has no logical mapping: reserved area = %02X%02X%02X%02X data status %02X block status %02X\n",
 609                                      blocknum,
 610                                      data[0], data[1], data[2], data[3],
 611                                      data[4], data[5]);
 612                         pba_to_lba[i] = UNUSABLE;
 613                         continue;
 614                 }
 615 
 616                 if ((data[6] >> 4) != 0x01) {
 617                         usb_stor_dbg(us, "PBA %d has invalid address field %02X%02X/%02X%02X\n",
 618                                      blocknum, data[6], data[7],
 619                                      data[11], data[12]);
 620                         pba_to_lba[i] = UNUSABLE;
 621                         continue;
 622                 }
 623 
 624                 /* check even parity */
 625                 if (parity[data[6] ^ data[7]]) {
 626                         printk(KERN_WARNING
 627                                "alauda_read_map: Bad parity in LBA for block %d"
 628                                " (%02X %02X)\n", i, data[6], data[7]);
 629                         pba_to_lba[i] = UNUSABLE;
 630                         continue;
 631                 }
 632 
 633                 lba_offset = short_pack(data[7], data[6]);
 634                 lba_offset = (lba_offset & 0x07FF) >> 1;
 635                 lba_real = lba_offset + zone_base_lba;
 636 
 637                 /*
 638                  * Every 1024 physical blocks ("zone"), the LBA numbers
 639                  * go back to zero, but are within a higher block of LBA's.
 640                  * Also, there is a maximum of 1000 LBA's per zone.
 641                  * In other words, in PBA 1024-2047 you will find LBA 0-999
 642                  * which are really LBA 1000-1999. This allows for 24 bad
 643                  * or special physical blocks per zone.
 644                  */
 645 
 646                 if (lba_offset >= uzonesize) {
 647                         printk(KERN_WARNING
 648                                "alauda_read_map: Bad low LBA %d for block %d\n",
 649                                lba_real, blocknum);
 650                         continue;
 651                 }
 652 
 653                 if (lba_to_pba[lba_offset] != UNDEF) {
 654                         printk(KERN_WARNING
 655                                "alauda_read_map: "
 656                                "LBA %d seen for PBA %d and %d\n",
 657                                lba_real, lba_to_pba[lba_offset], blocknum);
 658                         continue;
 659                 }
 660 
 661                 pba_to_lba[i] = lba_real;
 662                 lba_to_pba[lba_offset] = blocknum;
 663                 continue;
 664         }
 665 
 666         MEDIA_INFO(us).lba_to_pba[zone] = lba_to_pba;
 667         MEDIA_INFO(us).pba_to_lba[zone] = pba_to_lba;
 668         result = 0;
 669         goto out;
 670 
 671 error:
 672         kfree(lba_to_pba);
 673         kfree(pba_to_lba);
 674 out:
 675         return result;
 676 }
 677 
 678 /*
 679  * Checks to see whether we have already mapped a certain zone
 680  * If we haven't, the map is generated
 681  */
 682 static void alauda_ensure_map_for_zone(struct us_data *us, unsigned int zone)
 683 {
 684         if (MEDIA_INFO(us).lba_to_pba[zone] == NULL
 685                 || MEDIA_INFO(us).pba_to_lba[zone] == NULL)
 686                 alauda_read_map(us, zone);
 687 }
 688 
 689 /*
 690  * Erases an entire block
 691  */
 692 static int alauda_erase_block(struct us_data *us, u16 pba)
 693 {
 694         int rc;
 695         unsigned char command[] = {
 696                 ALAUDA_BULK_CMD, ALAUDA_BULK_ERASE_BLOCK, PBA_HI(pba),
 697                 PBA_ZONE(pba), 0, PBA_LO(pba), 0x02, 0, MEDIA_PORT(us)
 698         };
 699         unsigned char buf[2];
 700 
 701         usb_stor_dbg(us, "Erasing PBA %d\n", pba);
 702 
 703         rc = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
 704                 command, 9, NULL);
 705         if (rc != USB_STOR_XFER_GOOD)
 706                 return rc;
 707 
 708         rc = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
 709                 buf, 2, NULL);
 710         if (rc != USB_STOR_XFER_GOOD)
 711                 return rc;
 712 
 713         usb_stor_dbg(us, "Erase result: %02X %02X\n", buf[0], buf[1]);
 714         return rc;
 715 }
 716 
 717 /*
 718  * Reads data from a certain offset page inside a PBA, including interleaved
 719  * redundancy data. Returns (pagesize+64)*pages bytes in data.
 720  */
 721 static int alauda_read_block_raw(struct us_data *us, u16 pba,
 722                 unsigned int page, unsigned int pages, unsigned char *data)
 723 {
 724         int rc;
 725         unsigned char command[] = {
 726                 ALAUDA_BULK_CMD, ALAUDA_BULK_READ_BLOCK, PBA_HI(pba),
 727                 PBA_ZONE(pba), 0, PBA_LO(pba) + page, pages, 0, MEDIA_PORT(us)
 728         };
 729 
 730         usb_stor_dbg(us, "pba %d page %d count %d\n", pba, page, pages);
 731 
 732         rc = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
 733                 command, 9, NULL);
 734         if (rc != USB_STOR_XFER_GOOD)
 735                 return rc;
 736 
 737         return usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
 738                 data, (MEDIA_INFO(us).pagesize + 64) * pages, NULL);
 739 }
 740 
 741 /*
 742  * Reads data from a certain offset page inside a PBA, excluding redundancy
 743  * data. Returns pagesize*pages bytes in data. Note that data must be big enough
 744  * to hold (pagesize+64)*pages bytes of data, but you can ignore those 'extra'
 745  * trailing bytes outside this function.
 746  */
 747 static int alauda_read_block(struct us_data *us, u16 pba,
 748                 unsigned int page, unsigned int pages, unsigned char *data)
 749 {
 750         int i, rc;
 751         unsigned int pagesize = MEDIA_INFO(us).pagesize;
 752 
 753         rc = alauda_read_block_raw(us, pba, page, pages, data);
 754         if (rc != USB_STOR_XFER_GOOD)
 755                 return rc;
 756 
 757         /* Cut out the redundancy data */
 758         for (i = 0; i < pages; i++) {
 759                 int dest_offset = i * pagesize;
 760                 int src_offset = i * (pagesize + 64);
 761                 memmove(data + dest_offset, data + src_offset, pagesize);
 762         }
 763 
 764         return rc;
 765 }
 766 
 767 /*
 768  * Writes an entire block of data and checks status after write.
 769  * Redundancy data must be already included in data. Data should be
 770  * (pagesize+64)*blocksize bytes in length.
 771  */
 772 static int alauda_write_block(struct us_data *us, u16 pba, unsigned char *data)
 773 {
 774         int rc;
 775         struct alauda_info *info = (struct alauda_info *) us->extra;
 776         unsigned char command[] = {
 777                 ALAUDA_BULK_CMD, ALAUDA_BULK_WRITE_BLOCK, PBA_HI(pba),
 778                 PBA_ZONE(pba), 0, PBA_LO(pba), 32, 0, MEDIA_PORT(us)
 779         };
 780 
 781         usb_stor_dbg(us, "pba %d\n", pba);
 782 
 783         rc = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
 784                 command, 9, NULL);
 785         if (rc != USB_STOR_XFER_GOOD)
 786                 return rc;
 787 
 788         rc = usb_stor_bulk_transfer_buf(us, info->wr_ep, data,
 789                 (MEDIA_INFO(us).pagesize + 64) * MEDIA_INFO(us).blocksize,
 790                 NULL);
 791         if (rc != USB_STOR_XFER_GOOD)
 792                 return rc;
 793 
 794         return alauda_check_status2(us);
 795 }
 796 
 797 /*
 798  * Write some data to a specific LBA.
 799  */
 800 static int alauda_write_lba(struct us_data *us, u16 lba,
 801                  unsigned int page, unsigned int pages,
 802                  unsigned char *ptr, unsigned char *blockbuffer)
 803 {
 804         u16 pba, lbap, new_pba;
 805         unsigned char *bptr, *cptr, *xptr;
 806         unsigned char ecc[3];
 807         int i, result;
 808         unsigned int uzonesize = MEDIA_INFO(us).uzonesize;
 809         unsigned int zonesize = MEDIA_INFO(us).zonesize;
 810         unsigned int pagesize = MEDIA_INFO(us).pagesize;
 811         unsigned int blocksize = MEDIA_INFO(us).blocksize;
 812         unsigned int lba_offset = lba % uzonesize;
 813         unsigned int new_pba_offset;
 814         unsigned int zone = lba / uzonesize;
 815 
 816         alauda_ensure_map_for_zone(us, zone);
 817 
 818         pba = MEDIA_INFO(us).lba_to_pba[zone][lba_offset];
 819         if (pba == 1) {
 820                 /*
 821                  * Maybe it is impossible to write to PBA 1.
 822                  * Fake success, but don't do anything.
 823                  */
 824                 printk(KERN_WARNING
 825                        "alauda_write_lba: avoid writing to pba 1\n");
 826                 return USB_STOR_TRANSPORT_GOOD;
 827         }
 828 
 829         new_pba = alauda_find_unused_pba(&MEDIA_INFO(us), zone);
 830         if (!new_pba) {
 831                 printk(KERN_WARNING
 832                        "alauda_write_lba: Out of unused blocks\n");
 833                 return USB_STOR_TRANSPORT_ERROR;
 834         }
 835 
 836         /* read old contents */
 837         if (pba != UNDEF) {
 838                 result = alauda_read_block_raw(us, pba, 0,
 839                         blocksize, blockbuffer);
 840                 if (result != USB_STOR_XFER_GOOD)
 841                         return result;
 842         } else {
 843                 memset(blockbuffer, 0, blocksize * (pagesize + 64));
 844         }
 845 
 846         lbap = (lba_offset << 1) | 0x1000;
 847         if (parity[MSB_of(lbap) ^ LSB_of(lbap)])
 848                 lbap ^= 1;
 849 
 850         /* check old contents and fill lba */
 851         for (i = 0; i < blocksize; i++) {
 852                 bptr = blockbuffer + (i * (pagesize + 64));
 853                 cptr = bptr + pagesize;
 854                 nand_compute_ecc(bptr, ecc);
 855                 if (!nand_compare_ecc(cptr+13, ecc)) {
 856                         usb_stor_dbg(us, "Warning: bad ecc in page %d- of pba %d\n",
 857                                      i, pba);
 858                         nand_store_ecc(cptr+13, ecc);
 859                 }
 860                 nand_compute_ecc(bptr + (pagesize / 2), ecc);
 861                 if (!nand_compare_ecc(cptr+8, ecc)) {
 862                         usb_stor_dbg(us, "Warning: bad ecc in page %d+ of pba %d\n",
 863                                      i, pba);
 864                         nand_store_ecc(cptr+8, ecc);
 865                 }
 866                 cptr[6] = cptr[11] = MSB_of(lbap);
 867                 cptr[7] = cptr[12] = LSB_of(lbap);
 868         }
 869 
 870         /* copy in new stuff and compute ECC */
 871         xptr = ptr;
 872         for (i = page; i < page+pages; i++) {
 873                 bptr = blockbuffer + (i * (pagesize + 64));
 874                 cptr = bptr + pagesize;
 875                 memcpy(bptr, xptr, pagesize);
 876                 xptr += pagesize;
 877                 nand_compute_ecc(bptr, ecc);
 878                 nand_store_ecc(cptr+13, ecc);
 879                 nand_compute_ecc(bptr + (pagesize / 2), ecc);
 880                 nand_store_ecc(cptr+8, ecc);
 881         }
 882 
 883         result = alauda_write_block(us, new_pba, blockbuffer);
 884         if (result != USB_STOR_XFER_GOOD)
 885                 return result;
 886 
 887         new_pba_offset = new_pba - (zone * zonesize);
 888         MEDIA_INFO(us).pba_to_lba[zone][new_pba_offset] = lba;
 889         MEDIA_INFO(us).lba_to_pba[zone][lba_offset] = new_pba;
 890         usb_stor_dbg(us, "Remapped LBA %d to PBA %d\n", lba, new_pba);
 891 
 892         if (pba != UNDEF) {
 893                 unsigned int pba_offset = pba - (zone * zonesize);
 894                 result = alauda_erase_block(us, pba);
 895                 if (result != USB_STOR_XFER_GOOD)
 896                         return result;
 897                 MEDIA_INFO(us).pba_to_lba[zone][pba_offset] = UNDEF;
 898         }
 899 
 900         return USB_STOR_TRANSPORT_GOOD;
 901 }
 902 
 903 /*
 904  * Read data from a specific sector address
 905  */
 906 static int alauda_read_data(struct us_data *us, unsigned long address,
 907                 unsigned int sectors)
 908 {
 909         unsigned char *buffer;
 910         u16 lba, max_lba;
 911         unsigned int page, len, offset;
 912         unsigned int blockshift = MEDIA_INFO(us).blockshift;
 913         unsigned int pageshift = MEDIA_INFO(us).pageshift;
 914         unsigned int blocksize = MEDIA_INFO(us).blocksize;
 915         unsigned int pagesize = MEDIA_INFO(us).pagesize;
 916         unsigned int uzonesize = MEDIA_INFO(us).uzonesize;
 917         struct scatterlist *sg;
 918         int result;
 919 
 920         /*
 921          * Since we only read in one block at a time, we have to create
 922          * a bounce buffer and move the data a piece at a time between the
 923          * bounce buffer and the actual transfer buffer.
 924          * We make this buffer big enough to hold temporary redundancy data,
 925          * which we use when reading the data blocks.
 926          */
 927 
 928         len = min(sectors, blocksize) * (pagesize + 64);
 929         buffer = kmalloc(len, GFP_NOIO);
 930         if (!buffer)
 931                 return USB_STOR_TRANSPORT_ERROR;
 932 
 933         /* Figure out the initial LBA and page */
 934         lba = address >> blockshift;
 935         page = (address & MEDIA_INFO(us).blockmask);
 936         max_lba = MEDIA_INFO(us).capacity >> (blockshift + pageshift);
 937 
 938         result = USB_STOR_TRANSPORT_GOOD;
 939         offset = 0;
 940         sg = NULL;
 941 
 942         while (sectors > 0) {
 943                 unsigned int zone = lba / uzonesize; /* integer division */
 944                 unsigned int lba_offset = lba - (zone * uzonesize);
 945                 unsigned int pages;
 946                 u16 pba;
 947                 alauda_ensure_map_for_zone(us, zone);
 948 
 949                 /* Not overflowing capacity? */
 950                 if (lba >= max_lba) {
 951                         usb_stor_dbg(us, "Error: Requested lba %u exceeds maximum %u\n",
 952                                      lba, max_lba);
 953                         result = USB_STOR_TRANSPORT_ERROR;
 954                         break;
 955                 }
 956 
 957                 /* Find number of pages we can read in this block */
 958                 pages = min(sectors, blocksize - page);
 959                 len = pages << pageshift;
 960 
 961                 /* Find where this lba lives on disk */
 962                 pba = MEDIA_INFO(us).lba_to_pba[zone][lba_offset];
 963 
 964                 if (pba == UNDEF) {     /* this lba was never written */
 965                         usb_stor_dbg(us, "Read %d zero pages (LBA %d) page %d\n",
 966                                      pages, lba, page);
 967 
 968                         /*
 969                          * This is not really an error. It just means
 970                          * that the block has never been written.
 971                          * Instead of returning USB_STOR_TRANSPORT_ERROR
 972                          * it is better to return all zero data.
 973                          */
 974 
 975                         memset(buffer, 0, len);
 976                 } else {
 977                         usb_stor_dbg(us, "Read %d pages, from PBA %d (LBA %d) page %d\n",
 978                                      pages, pba, lba, page);
 979 
 980                         result = alauda_read_block(us, pba, page, pages, buffer);
 981                         if (result != USB_STOR_TRANSPORT_GOOD)
 982                                 break;
 983                 }
 984 
 985                 /* Store the data in the transfer buffer */
 986                 usb_stor_access_xfer_buf(buffer, len, us->srb,
 987                                 &sg, &offset, TO_XFER_BUF);
 988 
 989                 page = 0;
 990                 lba++;
 991                 sectors -= pages;
 992         }
 993 
 994         kfree(buffer);
 995         return result;
 996 }
 997 
 998 /*
 999  * Write data to a specific sector address
1000  */
1001 static int alauda_write_data(struct us_data *us, unsigned long address,
1002                 unsigned int sectors)
1003 {
1004         unsigned char *buffer, *blockbuffer;
1005         unsigned int page, len, offset;
1006         unsigned int blockshift = MEDIA_INFO(us).blockshift;
1007         unsigned int pageshift = MEDIA_INFO(us).pageshift;
1008         unsigned int blocksize = MEDIA_INFO(us).blocksize;
1009         unsigned int pagesize = MEDIA_INFO(us).pagesize;
1010         struct scatterlist *sg;
1011         u16 lba, max_lba;
1012         int result;
1013 
1014         /*
1015          * Since we don't write the user data directly to the device,
1016          * we have to create a bounce buffer and move the data a piece
1017          * at a time between the bounce buffer and the actual transfer buffer.
1018          */
1019 
1020         len = min(sectors, blocksize) * pagesize;
1021         buffer = kmalloc(len, GFP_NOIO);
1022         if (!buffer)
1023                 return USB_STOR_TRANSPORT_ERROR;
1024 
1025         /*
1026          * We also need a temporary block buffer, where we read in the old data,
1027          * overwrite parts with the new data, and manipulate the redundancy data
1028          */
1029         blockbuffer = kmalloc_array(pagesize + 64, blocksize, GFP_NOIO);
1030         if (!blockbuffer) {
1031                 kfree(buffer);
1032                 return USB_STOR_TRANSPORT_ERROR;
1033         }
1034 
1035         /* Figure out the initial LBA and page */
1036         lba = address >> blockshift;
1037         page = (address & MEDIA_INFO(us).blockmask);
1038         max_lba = MEDIA_INFO(us).capacity >> (pageshift + blockshift);
1039 
1040         result = USB_STOR_TRANSPORT_GOOD;
1041         offset = 0;
1042         sg = NULL;
1043 
1044         while (sectors > 0) {
1045                 /* Write as many sectors as possible in this block */
1046                 unsigned int pages = min(sectors, blocksize - page);
1047                 len = pages << pageshift;
1048 
1049                 /* Not overflowing capacity? */
1050                 if (lba >= max_lba) {
1051                         usb_stor_dbg(us, "Requested lba %u exceeds maximum %u\n",
1052                                      lba, max_lba);
1053                         result = USB_STOR_TRANSPORT_ERROR;
1054                         break;
1055                 }
1056 
1057                 /* Get the data from the transfer buffer */
1058                 usb_stor_access_xfer_buf(buffer, len, us->srb,
1059                                 &sg, &offset, FROM_XFER_BUF);
1060 
1061                 result = alauda_write_lba(us, lba, page, pages, buffer,
1062                         blockbuffer);
1063                 if (result != USB_STOR_TRANSPORT_GOOD)
1064                         break;
1065 
1066                 page = 0;
1067                 lba++;
1068                 sectors -= pages;
1069         }
1070 
1071         kfree(buffer);
1072         kfree(blockbuffer);
1073         return result;
1074 }
1075 
1076 /*
1077  * Our interface with the rest of the world
1078  */
1079 
1080 static void alauda_info_destructor(void *extra)
1081 {
1082         struct alauda_info *info = (struct alauda_info *) extra;
1083         int port;
1084 
1085         if (!info)
1086                 return;
1087 
1088         for (port = 0; port < 2; port++) {
1089                 struct alauda_media_info *media_info = &info->port[port];
1090 
1091                 alauda_free_maps(media_info);
1092                 kfree(media_info->lba_to_pba);
1093                 kfree(media_info->pba_to_lba);
1094         }
1095 }
1096 
1097 /*
1098  * Initialize alauda_info struct and find the data-write endpoint
1099  */
1100 static int init_alauda(struct us_data *us)
1101 {
1102         struct alauda_info *info;
1103         struct usb_host_interface *altsetting = us->pusb_intf->cur_altsetting;
1104         nand_init_ecc();
1105 
1106         us->extra = kzalloc(sizeof(struct alauda_info), GFP_NOIO);
1107         if (!us->extra)
1108                 return USB_STOR_TRANSPORT_ERROR;
1109 
1110         info = (struct alauda_info *) us->extra;
1111         us->extra_destructor = alauda_info_destructor;
1112 
1113         info->wr_ep = usb_sndbulkpipe(us->pusb_dev,
1114                 altsetting->endpoint[0].desc.bEndpointAddress
1115                 & USB_ENDPOINT_NUMBER_MASK);
1116 
1117         return USB_STOR_TRANSPORT_GOOD;
1118 }
1119 
1120 static int alauda_transport(struct scsi_cmnd *srb, struct us_data *us)
1121 {
1122         int rc;
1123         struct alauda_info *info = (struct alauda_info *) us->extra;
1124         unsigned char *ptr = us->iobuf;
1125         static unsigned char inquiry_response[36] = {
1126                 0x00, 0x80, 0x00, 0x01, 0x1F, 0x00, 0x00, 0x00
1127         };
1128 
1129         if (srb->cmnd[0] == INQUIRY) {
1130                 usb_stor_dbg(us, "INQUIRY - Returning bogus response\n");
1131                 memcpy(ptr, inquiry_response, sizeof(inquiry_response));
1132                 fill_inquiry_response(us, ptr, 36);
1133                 return USB_STOR_TRANSPORT_GOOD;
1134         }
1135 
1136         if (srb->cmnd[0] == TEST_UNIT_READY) {
1137                 usb_stor_dbg(us, "TEST_UNIT_READY\n");
1138                 return alauda_check_media(us);
1139         }
1140 
1141         if (srb->cmnd[0] == READ_CAPACITY) {
1142                 unsigned int num_zones;
1143                 unsigned long capacity;
1144 
1145                 rc = alauda_check_media(us);
1146                 if (rc != USB_STOR_TRANSPORT_GOOD)
1147                         return rc;
1148 
1149                 num_zones = MEDIA_INFO(us).capacity >> (MEDIA_INFO(us).zoneshift
1150                         + MEDIA_INFO(us).blockshift + MEDIA_INFO(us).pageshift);
1151 
1152                 capacity = num_zones * MEDIA_INFO(us).uzonesize
1153                         * MEDIA_INFO(us).blocksize;
1154 
1155                 /* Report capacity and page size */
1156                 ((__be32 *) ptr)[0] = cpu_to_be32(capacity - 1);
1157                 ((__be32 *) ptr)[1] = cpu_to_be32(512);
1158 
1159                 usb_stor_set_xfer_buf(ptr, 8, srb);
1160                 return USB_STOR_TRANSPORT_GOOD;
1161         }
1162 
1163         if (srb->cmnd[0] == READ_10) {
1164                 unsigned int page, pages;
1165 
1166                 rc = alauda_check_media(us);
1167                 if (rc != USB_STOR_TRANSPORT_GOOD)
1168                         return rc;
1169 
1170                 page = short_pack(srb->cmnd[3], srb->cmnd[2]);
1171                 page <<= 16;
1172                 page |= short_pack(srb->cmnd[5], srb->cmnd[4]);
1173                 pages = short_pack(srb->cmnd[8], srb->cmnd[7]);
1174 
1175                 usb_stor_dbg(us, "READ_10: page %d pagect %d\n", page, pages);
1176 
1177                 return alauda_read_data(us, page, pages);
1178         }
1179 
1180         if (srb->cmnd[0] == WRITE_10) {
1181                 unsigned int page, pages;
1182 
1183                 rc = alauda_check_media(us);
1184                 if (rc != USB_STOR_TRANSPORT_GOOD)
1185                         return rc;
1186 
1187                 page = short_pack(srb->cmnd[3], srb->cmnd[2]);
1188                 page <<= 16;
1189                 page |= short_pack(srb->cmnd[5], srb->cmnd[4]);
1190                 pages = short_pack(srb->cmnd[8], srb->cmnd[7]);
1191 
1192                 usb_stor_dbg(us, "WRITE_10: page %d pagect %d\n", page, pages);
1193 
1194                 return alauda_write_data(us, page, pages);
1195         }
1196 
1197         if (srb->cmnd[0] == REQUEST_SENSE) {
1198                 usb_stor_dbg(us, "REQUEST_SENSE\n");
1199 
1200                 memset(ptr, 0, 18);
1201                 ptr[0] = 0xF0;
1202                 ptr[2] = info->sense_key;
1203                 ptr[7] = 11;
1204                 ptr[12] = info->sense_asc;
1205                 ptr[13] = info->sense_ascq;
1206                 usb_stor_set_xfer_buf(ptr, 18, srb);
1207 
1208                 return USB_STOR_TRANSPORT_GOOD;
1209         }
1210 
1211         if (srb->cmnd[0] == ALLOW_MEDIUM_REMOVAL) {
1212                 /*
1213                  * sure.  whatever.  not like we can stop the user from popping
1214                  * the media out of the device (no locking doors, etc)
1215                  */
1216                 return USB_STOR_TRANSPORT_GOOD;
1217         }
1218 
1219         usb_stor_dbg(us, "Gah! Unknown command: %d (0x%x)\n",
1220                      srb->cmnd[0], srb->cmnd[0]);
1221         info->sense_key = 0x05;
1222         info->sense_asc = 0x20;
1223         info->sense_ascq = 0x00;
1224         return USB_STOR_TRANSPORT_FAILED;
1225 }
1226 
1227 static struct scsi_host_template alauda_host_template;
1228 
1229 static int alauda_probe(struct usb_interface *intf,
1230                          const struct usb_device_id *id)
1231 {
1232         struct us_data *us;
1233         int result;
1234 
1235         result = usb_stor_probe1(&us, intf, id,
1236                         (id - alauda_usb_ids) + alauda_unusual_dev_list,
1237                         &alauda_host_template);
1238         if (result)
1239                 return result;
1240 
1241         us->transport_name  = "Alauda Control/Bulk";
1242         us->transport = alauda_transport;
1243         us->transport_reset = usb_stor_Bulk_reset;
1244         us->max_lun = 1;
1245 
1246         result = usb_stor_probe2(us);
1247         return result;
1248 }
1249 
1250 static struct usb_driver alauda_driver = {
1251         .name =         DRV_NAME,
1252         .probe =        alauda_probe,
1253         .disconnect =   usb_stor_disconnect,
1254         .suspend =      usb_stor_suspend,
1255         .resume =       usb_stor_resume,
1256         .reset_resume = usb_stor_reset_resume,
1257         .pre_reset =    usb_stor_pre_reset,
1258         .post_reset =   usb_stor_post_reset,
1259         .id_table =     alauda_usb_ids,
1260         .soft_unbind =  1,
1261         .no_dynamic_id = 1,
1262 };
1263 
1264 module_usb_stor_driver(alauda_driver, alauda_host_template, DRV_NAME);

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