blob: b74603689b9e87f14412b2d20df2b043a47c0453 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/* Driver for SanDisk SDDR-09 SmartMedia reader
2 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07003 * (c) 2000, 2001 Robert Baruch (autophile@starband.net)
4 * (c) 2002 Andries Brouwer (aeb@cwi.nl)
5 * Developed with the assistance of:
6 * (c) 2002 Alan Stern <stern@rowland.org>
7 *
8 * The SanDisk SDDR-09 SmartMedia reader uses the Shuttle EUSB-01 chip.
9 * This chip is a programmable USB controller. In the SDDR-09, it has
10 * been programmed to obey a certain limited set of SCSI commands.
11 * This driver translates the "real" SCSI commands to the SDDR-09 SCSI
12 * commands.
13 *
14 * This program is free software; you can redistribute it and/or modify it
15 * under the terms of the GNU General Public License as published by the
16 * Free Software Foundation; either version 2, or (at your option) any
17 * later version.
18 *
19 * This program is distributed in the hope that it will be useful, but
20 * WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 * General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License along
25 * with this program; if not, write to the Free Software Foundation, Inc.,
26 * 675 Mass Ave, Cambridge, MA 02139, USA.
27 */
28
29/*
30 * Known vendor commands: 12 bytes, first byte is opcode
31 *
32 * E7: read scatter gather
33 * E8: read
34 * E9: write
35 * EA: erase
36 * EB: reset
37 * EC: read status
38 * ED: read ID
39 * EE: write CIS (?)
40 * EF: compute checksum (?)
41 */
42
Linus Torvalds1da177e2005-04-16 15:20:36 -070043#include <linux/errno.h>
Alan Stern0ff71882009-02-12 14:47:49 -050044#include <linux/module.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070045#include <linux/slab.h>
46
47#include <scsi/scsi.h>
48#include <scsi/scsi_cmnd.h>
Alan Sternc20b15f2008-12-01 10:36:15 -050049#include <scsi/scsi_device.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070050
51#include "usb.h"
52#include "transport.h"
53#include "protocol.h"
54#include "debug.h"
Akinobu Mitaaa519be2015-05-06 18:24:21 +090055#include "scsiglue.h"
56
57#define DRV_NAME "ums-sddr09"
Alan Stern0ff71882009-02-12 14:47:49 -050058
Maciej Grela4246b062009-02-28 12:39:20 -080059MODULE_DESCRIPTION("Driver for SanDisk SDDR-09 SmartMedia reader");
60MODULE_AUTHOR("Andries Brouwer <aeb@cwi.nl>, Robert Baruch <autophile@starband.net>");
61MODULE_LICENSE("GPL");
Alan Stern0ff71882009-02-12 14:47:49 -050062
63static int usb_stor_sddr09_dpcm_init(struct us_data *us);
64static int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us);
65static int usb_stor_sddr09_init(struct us_data *us);
66
67
68/*
69 * The table of devices
70 */
71#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
72 vendorName, productName, useProtocol, useTransport, \
73 initFunction, flags) \
74{ USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \
Sebastian Andrzej Siewiorf61870e2012-08-28 22:37:13 +020075 .driver_info = (flags) }
Alan Stern0ff71882009-02-12 14:47:49 -050076
Felipe Balbi6f871f92011-11-15 09:53:38 +020077static struct usb_device_id sddr09_usb_ids[] = {
Alan Stern0ff71882009-02-12 14:47:49 -050078# include "unusual_sddr09.h"
79 { } /* Terminating entry */
80};
81MODULE_DEVICE_TABLE(usb, sddr09_usb_ids);
82
83#undef UNUSUAL_DEV
84
85/*
86 * The flags table
87 */
88#define UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax, \
89 vendor_name, product_name, use_protocol, use_transport, \
90 init_function, Flags) \
91{ \
92 .vendorName = vendor_name, \
93 .productName = product_name, \
94 .useProtocol = use_protocol, \
95 .useTransport = use_transport, \
96 .initFunction = init_function, \
97}
98
99static struct us_unusual_dev sddr09_unusual_dev_list[] = {
100# include "unusual_sddr09.h"
101 { } /* Terminating entry */
102};
103
104#undef UNUSUAL_DEV
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105
106
107#define short_pack(lsb,msb) ( ((u16)(lsb)) | ( ((u16)(msb))<<8 ) )
108#define LSB_of(s) ((s)&0xFF)
109#define MSB_of(s) ((s)>>8)
110
Linus Torvalds1da177e2005-04-16 15:20:36 -0700111/*
112 * First some stuff that does not belong here:
113 * data on SmartMedia and other cards, completely
114 * unrelated to this driver.
115 * Similar stuff occurs in <linux/mtd/nand_ids.h>.
116 */
117
118struct nand_flash_dev {
119 int model_id;
120 int chipshift; /* 1<<cs bytes total capacity */
121 char pageshift; /* 1<<ps bytes in a page */
122 char blockshift; /* 1<<bs pages in an erase block */
123 char zoneshift; /* 1<<zs blocks in a zone */
124 /* # of logical blocks is 125/128 of this */
125 char pageadrlen; /* length of an address in bytes - 1 */
126};
127
128/*
129 * NAND Flash Manufacturer ID Codes
130 */
131#define NAND_MFR_AMD 0x01
132#define NAND_MFR_NATSEMI 0x8f
133#define NAND_MFR_TOSHIBA 0x98
134#define NAND_MFR_SAMSUNG 0xec
135
136static inline char *nand_flash_manufacturer(int manuf_id) {
137 switch(manuf_id) {
138 case NAND_MFR_AMD:
139 return "AMD";
140 case NAND_MFR_NATSEMI:
141 return "NATSEMI";
142 case NAND_MFR_TOSHIBA:
143 return "Toshiba";
144 case NAND_MFR_SAMSUNG:
145 return "Samsung";
146 default:
147 return "unknown";
148 }
149}
150
151/*
152 * It looks like it is unnecessary to attach manufacturer to the
153 * remaining data: SSFDC prescribes manufacturer-independent id codes.
154 *
155 * 256 MB NAND flash has a 5-byte ID with 2nd byte 0xaa, 0xba, 0xca or 0xda.
156 */
157
158static struct nand_flash_dev nand_flash_ids[] = {
159 /* NAND flash */
160 { 0x6e, 20, 8, 4, 8, 2}, /* 1 MB */
161 { 0xe8, 20, 8, 4, 8, 2}, /* 1 MB */
162 { 0xec, 20, 8, 4, 8, 2}, /* 1 MB */
163 { 0x64, 21, 8, 4, 9, 2}, /* 2 MB */
164 { 0xea, 21, 8, 4, 9, 2}, /* 2 MB */
165 { 0x6b, 22, 9, 4, 9, 2}, /* 4 MB */
166 { 0xe3, 22, 9, 4, 9, 2}, /* 4 MB */
167 { 0xe5, 22, 9, 4, 9, 2}, /* 4 MB */
168 { 0xe6, 23, 9, 4, 10, 2}, /* 8 MB */
169 { 0x73, 24, 9, 5, 10, 2}, /* 16 MB */
170 { 0x75, 25, 9, 5, 10, 2}, /* 32 MB */
171 { 0x76, 26, 9, 5, 10, 3}, /* 64 MB */
172 { 0x79, 27, 9, 5, 10, 3}, /* 128 MB */
173
174 /* MASK ROM */
175 { 0x5d, 21, 9, 4, 8, 2}, /* 2 MB */
176 { 0xd5, 22, 9, 4, 9, 2}, /* 4 MB */
177 { 0xd6, 23, 9, 4, 10, 2}, /* 8 MB */
178 { 0x57, 24, 9, 4, 11, 2}, /* 16 MB */
179 { 0x58, 25, 9, 4, 12, 2}, /* 32 MB */
180 { 0,}
181};
182
Linus Torvalds1da177e2005-04-16 15:20:36 -0700183static struct nand_flash_dev *
184nand_find_id(unsigned char id) {
185 int i;
186
Tobias Klauser52950ed2005-12-11 16:20:08 +0100187 for (i = 0; i < ARRAY_SIZE(nand_flash_ids); i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700188 if (nand_flash_ids[i].model_id == id)
189 return &(nand_flash_ids[i]);
190 return NULL;
191}
192
193/*
194 * ECC computation.
195 */
196static unsigned char parity[256];
197static unsigned char ecc2[256];
198
199static void nand_init_ecc(void) {
200 int i, j, a;
201
202 parity[0] = 0;
203 for (i = 1; i < 256; i++)
204 parity[i] = (parity[i&(i-1)] ^ 1);
205
206 for (i = 0; i < 256; i++) {
207 a = 0;
208 for (j = 0; j < 8; j++) {
209 if (i & (1<<j)) {
210 if ((j & 1) == 0)
211 a ^= 0x04;
212 if ((j & 2) == 0)
213 a ^= 0x10;
214 if ((j & 4) == 0)
215 a ^= 0x40;
216 }
217 }
218 ecc2[i] = ~(a ^ (a<<1) ^ (parity[i] ? 0xa8 : 0));
219 }
220}
221
222/* compute 3-byte ecc on 256 bytes */
223static void nand_compute_ecc(unsigned char *data, unsigned char *ecc) {
224 int i, j, a;
Emilio López4cb4f832013-05-12 11:43:22 -0300225 unsigned char par = 0, bit, bits[8] = {0};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700226
227 /* collect 16 checksum bits */
228 for (i = 0; i < 256; i++) {
229 par ^= data[i];
230 bit = parity[data[i]];
231 for (j = 0; j < 8; j++)
232 if ((i & (1<<j)) == 0)
233 bits[j] ^= bit;
234 }
235
236 /* put 4+4+4 = 12 bits in the ecc */
237 a = (bits[3] << 6) + (bits[2] << 4) + (bits[1] << 2) + bits[0];
238 ecc[0] = ~(a ^ (a<<1) ^ (parity[par] ? 0xaa : 0));
239
240 a = (bits[7] << 6) + (bits[6] << 4) + (bits[5] << 2) + bits[4];
241 ecc[1] = ~(a ^ (a<<1) ^ (parity[par] ? 0xaa : 0));
242
243 ecc[2] = ecc2[par];
244}
245
246static int nand_compare_ecc(unsigned char *data, unsigned char *ecc) {
247 return (data[0] == ecc[0] && data[1] == ecc[1] && data[2] == ecc[2]);
248}
249
250static void nand_store_ecc(unsigned char *data, unsigned char *ecc) {
251 memcpy(data, ecc, 3);
252}
253
254/*
255 * The actual driver starts here.
256 */
257
Matthew Dharmf5b8cb92005-12-04 21:57:51 -0800258struct sddr09_card_info {
259 unsigned long capacity; /* Size of card in bytes */
260 int pagesize; /* Size of page in bytes */
261 int pageshift; /* log2 of pagesize */
262 int blocksize; /* Size of block in pages */
263 int blockshift; /* log2 of blocksize */
264 int blockmask; /* 2^blockshift - 1 */
265 int *lba_to_pba; /* logical to physical map */
266 int *pba_to_lba; /* physical to logical map */
267 int lbact; /* number of available pages */
268 int flags;
269#define SDDR09_WP 1 /* write protected */
270};
271
Linus Torvalds1da177e2005-04-16 15:20:36 -0700272/*
273 * On my 16MB card, control blocks have size 64 (16 real control bytes,
274 * and 48 junk bytes). In reality of course the card uses 16 control bytes,
275 * so the reader makes up the remaining 48. Don't know whether these numbers
276 * depend on the card. For now a constant.
277 */
278#define CONTROL_SHIFT 6
279
280/*
281 * On my Combo CF/SM reader, the SM reader has LUN 1.
282 * (and things fail with LUN 0).
283 * It seems LUN is irrelevant for others.
284 */
285#define LUN 1
286#define LUNBITS (LUN << 5)
287
288/*
289 * LBA and PBA are unsigned ints. Special values.
290 */
291#define UNDEF 0xffffffff
292#define SPARE 0xfffffffe
293#define UNUSABLE 0xfffffffd
294
Arjan van de Ven4c4c9432005-11-29 09:43:42 +0100295static const int erase_bad_lba_entries = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296
297/* send vendor interface command (0x41) */
298/* called for requests 0, 1, 8 */
299static int
300sddr09_send_command(struct us_data *us,
301 unsigned char request,
302 unsigned char direction,
303 unsigned char *xfer_data,
304 unsigned int xfer_len) {
305 unsigned int pipe;
306 unsigned char requesttype = (0x41 | direction);
307 int rc;
308
309 // Get the receive or send control pipe number
310
311 if (direction == USB_DIR_IN)
312 pipe = us->recv_ctrl_pipe;
313 else
314 pipe = us->send_ctrl_pipe;
315
316 rc = usb_stor_ctrl_transfer(us, pipe, request, requesttype,
317 0, 0, xfer_data, xfer_len);
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800318 switch (rc) {
319 case USB_STOR_XFER_GOOD: return 0;
320 case USB_STOR_XFER_STALLED: return -EPIPE;
321 default: return -EIO;
322 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700323}
324
325static int
326sddr09_send_scsi_command(struct us_data *us,
327 unsigned char *command,
328 unsigned int command_len) {
329 return sddr09_send_command(us, 0, USB_DIR_OUT, command, command_len);
330}
331
332#if 0
333/*
334 * Test Unit Ready Command: 12 bytes.
335 * byte 0: opcode: 00
336 */
337static int
338sddr09_test_unit_ready(struct us_data *us) {
339 unsigned char *command = us->iobuf;
340 int result;
341
342 memset(command, 0, 6);
343 command[1] = LUNBITS;
344
345 result = sddr09_send_scsi_command(us, command, 6);
346
Joe Perches191648d2013-04-19 11:44:00 -0700347 usb_stor_dbg(us, "sddr09_test_unit_ready returns %d\n", result);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700348
349 return result;
350}
351#endif
352
353/*
354 * Request Sense Command: 12 bytes.
355 * byte 0: opcode: 03
356 * byte 4: data length
357 */
358static int
359sddr09_request_sense(struct us_data *us, unsigned char *sensebuf, int buflen) {
360 unsigned char *command = us->iobuf;
361 int result;
362
363 memset(command, 0, 12);
364 command[0] = 0x03;
365 command[1] = LUNBITS;
366 command[4] = buflen;
367
368 result = sddr09_send_scsi_command(us, command, 12);
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800369 if (result)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700370 return result;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700371
372 result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
373 sensebuf, buflen, NULL);
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800374 return (result == USB_STOR_XFER_GOOD ? 0 : -EIO);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700375}
376
377/*
378 * Read Command: 12 bytes.
379 * byte 0: opcode: E8
380 * byte 1: last two bits: 00: read data, 01: read blockwise control,
381 * 10: read both, 11: read pagewise control.
382 * It turns out we need values 20, 21, 22, 23 here (LUN 1).
383 * bytes 2-5: address (interpretation depends on byte 1, see below)
384 * bytes 10-11: count (idem)
385 *
386 * A page has 512 data bytes and 64 control bytes (16 control and 48 junk).
387 * A read data command gets data in 512-byte pages.
388 * A read control command gets control in 64-byte chunks.
389 * A read both command gets data+control in 576-byte chunks.
390 *
391 * Blocks are groups of 32 pages, and read blockwise control jumps to the
392 * next block, while read pagewise control jumps to the next page after
393 * reading a group of 64 control bytes.
394 * [Here 512 = 1<<pageshift, 32 = 1<<blockshift, 64 is constant?]
395 *
396 * (1 MB and 2 MB cards are a bit different, but I have only a 16 MB card.)
397 */
398
399static int
400sddr09_readX(struct us_data *us, int x, unsigned long fromaddress,
401 int nr_of_pages, int bulklen, unsigned char *buf,
402 int use_sg) {
403
404 unsigned char *command = us->iobuf;
405 int result;
406
407 command[0] = 0xE8;
408 command[1] = LUNBITS | x;
409 command[2] = MSB_of(fromaddress>>16);
410 command[3] = LSB_of(fromaddress>>16);
411 command[4] = MSB_of(fromaddress & 0xFFFF);
412 command[5] = LSB_of(fromaddress & 0xFFFF);
413 command[6] = 0;
414 command[7] = 0;
415 command[8] = 0;
416 command[9] = 0;
417 command[10] = MSB_of(nr_of_pages);
418 command[11] = LSB_of(nr_of_pages);
419
420 result = sddr09_send_scsi_command(us, command, 12);
421
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800422 if (result) {
Joe Perches191648d2013-04-19 11:44:00 -0700423 usb_stor_dbg(us, "Result for send_control in sddr09_read2%d %d\n",
424 x, result);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700425 return result;
426 }
427
428 result = usb_stor_bulk_transfer_sg(us, us->recv_bulk_pipe,
429 buf, bulklen, use_sg, NULL);
430
431 if (result != USB_STOR_XFER_GOOD) {
Joe Perches191648d2013-04-19 11:44:00 -0700432 usb_stor_dbg(us, "Result for bulk_transfer in sddr09_read2%d %d\n",
433 x, result);
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800434 return -EIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700435 }
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800436 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700437}
438
439/*
440 * Read Data
441 *
442 * fromaddress counts data shorts:
443 * increasing it by 256 shifts the bytestream by 512 bytes;
444 * the last 8 bits are ignored.
445 *
446 * nr_of_pages counts pages of size (1 << pageshift).
447 */
448static int
449sddr09_read20(struct us_data *us, unsigned long fromaddress,
450 int nr_of_pages, int pageshift, unsigned char *buf, int use_sg) {
451 int bulklen = nr_of_pages << pageshift;
452
453 /* The last 8 bits of fromaddress are ignored. */
454 return sddr09_readX(us, 0, fromaddress, nr_of_pages, bulklen,
455 buf, use_sg);
456}
457
458/*
459 * Read Blockwise Control
460 *
461 * fromaddress gives the starting position (as in read data;
462 * the last 8 bits are ignored); increasing it by 32*256 shifts
463 * the output stream by 64 bytes.
464 *
465 * count counts control groups of size (1 << controlshift).
466 * For me, controlshift = 6. Is this constant?
467 *
468 * After getting one control group, jump to the next block
469 * (fromaddress += 8192).
470 */
471static int
472sddr09_read21(struct us_data *us, unsigned long fromaddress,
473 int count, int controlshift, unsigned char *buf, int use_sg) {
474
475 int bulklen = (count << controlshift);
476 return sddr09_readX(us, 1, fromaddress, count, bulklen,
477 buf, use_sg);
478}
479
480/*
481 * Read both Data and Control
482 *
483 * fromaddress counts data shorts, ignoring control:
484 * increasing it by 256 shifts the bytestream by 576 = 512+64 bytes;
485 * the last 8 bits are ignored.
486 *
487 * nr_of_pages counts pages of size (1 << pageshift) + (1 << controlshift).
488 */
489static int
490sddr09_read22(struct us_data *us, unsigned long fromaddress,
491 int nr_of_pages, int pageshift, unsigned char *buf, int use_sg) {
492
493 int bulklen = (nr_of_pages << pageshift) + (nr_of_pages << CONTROL_SHIFT);
Joe Perches191648d2013-04-19 11:44:00 -0700494 usb_stor_dbg(us, "reading %d pages, %d bytes\n", nr_of_pages, bulklen);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700495 return sddr09_readX(us, 2, fromaddress, nr_of_pages, bulklen,
496 buf, use_sg);
497}
498
499#if 0
500/*
501 * Read Pagewise Control
502 *
503 * fromaddress gives the starting position (as in read data;
504 * the last 8 bits are ignored); increasing it by 256 shifts
505 * the output stream by 64 bytes.
506 *
507 * count counts control groups of size (1 << controlshift).
508 * For me, controlshift = 6. Is this constant?
509 *
510 * After getting one control group, jump to the next page
511 * (fromaddress += 256).
512 */
513static int
514sddr09_read23(struct us_data *us, unsigned long fromaddress,
515 int count, int controlshift, unsigned char *buf, int use_sg) {
516
517 int bulklen = (count << controlshift);
518 return sddr09_readX(us, 3, fromaddress, count, bulklen,
519 buf, use_sg);
520}
521#endif
522
523/*
524 * Erase Command: 12 bytes.
525 * byte 0: opcode: EA
526 * bytes 6-9: erase address (big-endian, counting shorts, sector aligned).
527 *
528 * Always precisely one block is erased; bytes 2-5 and 10-11 are ignored.
529 * The byte address being erased is 2*Eaddress.
530 * The CIS cannot be erased.
531 */
532static int
533sddr09_erase(struct us_data *us, unsigned long Eaddress) {
534 unsigned char *command = us->iobuf;
535 int result;
536
Joe Perches191648d2013-04-19 11:44:00 -0700537 usb_stor_dbg(us, "erase address %lu\n", Eaddress);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700538
539 memset(command, 0, 12);
540 command[0] = 0xEA;
541 command[1] = LUNBITS;
542 command[6] = MSB_of(Eaddress>>16);
543 command[7] = LSB_of(Eaddress>>16);
544 command[8] = MSB_of(Eaddress & 0xFFFF);
545 command[9] = LSB_of(Eaddress & 0xFFFF);
546
547 result = sddr09_send_scsi_command(us, command, 12);
548
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800549 if (result)
Joe Perches191648d2013-04-19 11:44:00 -0700550 usb_stor_dbg(us, "Result for send_control in sddr09_erase %d\n",
551 result);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700552
553 return result;
554}
555
556/*
557 * Write CIS Command: 12 bytes.
558 * byte 0: opcode: EE
559 * bytes 2-5: write address in shorts
560 * bytes 10-11: sector count
561 *
562 * This writes at the indicated address. Don't know how it differs
563 * from E9. Maybe it does not erase? However, it will also write to
564 * the CIS.
565 *
566 * When two such commands on the same page follow each other directly,
567 * the second one is not done.
568 */
569
570/*
571 * Write Command: 12 bytes.
572 * byte 0: opcode: E9
573 * bytes 2-5: write address (big-endian, counting shorts, sector aligned).
574 * bytes 6-9: erase address (big-endian, counting shorts, sector aligned).
575 * bytes 10-11: sector count (big-endian, in 512-byte sectors).
576 *
577 * If write address equals erase address, the erase is done first,
578 * otherwise the write is done first. When erase address equals zero
579 * no erase is done?
580 */
581static int
582sddr09_writeX(struct us_data *us,
583 unsigned long Waddress, unsigned long Eaddress,
584 int nr_of_pages, int bulklen, unsigned char *buf, int use_sg) {
585
586 unsigned char *command = us->iobuf;
587 int result;
588
589 command[0] = 0xE9;
590 command[1] = LUNBITS;
591
592 command[2] = MSB_of(Waddress>>16);
593 command[3] = LSB_of(Waddress>>16);
594 command[4] = MSB_of(Waddress & 0xFFFF);
595 command[5] = LSB_of(Waddress & 0xFFFF);
596
597 command[6] = MSB_of(Eaddress>>16);
598 command[7] = LSB_of(Eaddress>>16);
599 command[8] = MSB_of(Eaddress & 0xFFFF);
600 command[9] = LSB_of(Eaddress & 0xFFFF);
601
602 command[10] = MSB_of(nr_of_pages);
603 command[11] = LSB_of(nr_of_pages);
604
605 result = sddr09_send_scsi_command(us, command, 12);
606
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800607 if (result) {
Joe Perches191648d2013-04-19 11:44:00 -0700608 usb_stor_dbg(us, "Result for send_control in sddr09_writeX %d\n",
609 result);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700610 return result;
611 }
612
613 result = usb_stor_bulk_transfer_sg(us, us->send_bulk_pipe,
614 buf, bulklen, use_sg, NULL);
615
616 if (result != USB_STOR_XFER_GOOD) {
Joe Perches191648d2013-04-19 11:44:00 -0700617 usb_stor_dbg(us, "Result for bulk_transfer in sddr09_writeX %d\n",
618 result);
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800619 return -EIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700620 }
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800621 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700622}
623
624/* erase address, write same address */
625static int
626sddr09_write_inplace(struct us_data *us, unsigned long address,
627 int nr_of_pages, int pageshift, unsigned char *buf,
628 int use_sg) {
629 int bulklen = (nr_of_pages << pageshift) + (nr_of_pages << CONTROL_SHIFT);
630 return sddr09_writeX(us, address, address, nr_of_pages, bulklen,
631 buf, use_sg);
632}
633
634#if 0
635/*
636 * Read Scatter Gather Command: 3+4n bytes.
637 * byte 0: opcode E7
638 * byte 2: n
639 * bytes 4i-1,4i,4i+1: page address
640 * byte 4i+2: page count
641 * (i=1..n)
642 *
643 * This reads several pages from the card to a single memory buffer.
644 * The last two bits of byte 1 have the same meaning as for E8.
645 */
646static int
647sddr09_read_sg_test_only(struct us_data *us) {
648 unsigned char *command = us->iobuf;
649 int result, bulklen, nsg, ct;
650 unsigned char *buf;
651 unsigned long address;
652
653 nsg = bulklen = 0;
654 command[0] = 0xE7;
655 command[1] = LUNBITS;
656 command[2] = 0;
657 address = 040000; ct = 1;
658 nsg++;
659 bulklen += (ct << 9);
660 command[4*nsg+2] = ct;
661 command[4*nsg+1] = ((address >> 9) & 0xFF);
662 command[4*nsg+0] = ((address >> 17) & 0xFF);
663 command[4*nsg-1] = ((address >> 25) & 0xFF);
664
665 address = 0340000; ct = 1;
666 nsg++;
667 bulklen += (ct << 9);
668 command[4*nsg+2] = ct;
669 command[4*nsg+1] = ((address >> 9) & 0xFF);
670 command[4*nsg+0] = ((address >> 17) & 0xFF);
671 command[4*nsg-1] = ((address >> 25) & 0xFF);
672
673 address = 01000000; ct = 2;
674 nsg++;
675 bulklen += (ct << 9);
676 command[4*nsg+2] = ct;
677 command[4*nsg+1] = ((address >> 9) & 0xFF);
678 command[4*nsg+0] = ((address >> 17) & 0xFF);
679 command[4*nsg-1] = ((address >> 25) & 0xFF);
680
681 command[2] = nsg;
682
683 result = sddr09_send_scsi_command(us, command, 4*nsg+3);
684
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800685 if (result) {
Joe Perches191648d2013-04-19 11:44:00 -0700686 usb_stor_dbg(us, "Result for send_control in sddr09_read_sg %d\n",
687 result);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688 return result;
689 }
690
Robert P. J. Day5cbded52006-12-13 00:35:56 -0800691 buf = kmalloc(bulklen, GFP_NOIO);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700692 if (!buf)
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800693 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694
695 result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
696 buf, bulklen, NULL);
697 kfree(buf);
698 if (result != USB_STOR_XFER_GOOD) {
Joe Perches191648d2013-04-19 11:44:00 -0700699 usb_stor_dbg(us, "Result for bulk_transfer in sddr09_read_sg %d\n",
700 result);
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800701 return -EIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702 }
703
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800704 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700705}
706#endif
707
708/*
709 * Read Status Command: 12 bytes.
710 * byte 0: opcode: EC
711 *
712 * Returns 64 bytes, all zero except for the first.
713 * bit 0: 1: Error
714 * bit 5: 1: Suspended
715 * bit 6: 1: Ready
716 * bit 7: 1: Not write-protected
717 */
718
719static int
720sddr09_read_status(struct us_data *us, unsigned char *status) {
721
722 unsigned char *command = us->iobuf;
723 unsigned char *data = us->iobuf;
724 int result;
725
Joe Perches191648d2013-04-19 11:44:00 -0700726 usb_stor_dbg(us, "Reading status...\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700727
728 memset(command, 0, 12);
729 command[0] = 0xEC;
730 command[1] = LUNBITS;
731
732 result = sddr09_send_scsi_command(us, command, 12);
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800733 if (result)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700734 return result;
735
736 result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
737 data, 64, NULL);
738 *status = data[0];
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800739 return (result == USB_STOR_XFER_GOOD ? 0 : -EIO);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700740}
741
742static int
743sddr09_read_data(struct us_data *us,
744 unsigned long address,
745 unsigned int sectors) {
746
747 struct sddr09_card_info *info = (struct sddr09_card_info *) us->extra;
748 unsigned char *buffer;
749 unsigned int lba, maxlba, pba;
750 unsigned int page, pages;
Jens Axboe1f6f31a2007-05-11 12:33:09 +0200751 unsigned int len, offset;
752 struct scatterlist *sg;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700753 int result;
754
Matthew Dharma6c976c2005-12-04 21:59:45 -0800755 // Figure out the initial LBA and page
756 lba = address >> info->blockshift;
757 page = (address & info->blockmask);
758 maxlba = info->capacity >> (info->pageshift + info->blockshift);
759 if (lba >= maxlba)
760 return -EIO;
761
Linus Torvalds1da177e2005-04-16 15:20:36 -0700762 // Since we only read in one block at a time, we have to create
763 // a bounce buffer and move the data a piece at a time between the
764 // bounce buffer and the actual transfer buffer.
765
766 len = min(sectors, (unsigned int) info->blocksize) * info->pagesize;
767 buffer = kmalloc(len, GFP_NOIO);
768 if (buffer == NULL) {
Frank Seidel6f8aa652009-02-05 16:16:24 +0100769 printk(KERN_WARNING "sddr09_read_data: Out of memory\n");
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800770 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700771 }
772
Linus Torvalds1da177e2005-04-16 15:20:36 -0700773 // This could be made much more efficient by checking for
774 // contiguous LBA's. Another exercise left to the student.
775
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800776 result = 0;
Jens Axboe1f6f31a2007-05-11 12:33:09 +0200777 offset = 0;
778 sg = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700779
780 while (sectors > 0) {
781
782 /* Find number of pages we can read in this block */
783 pages = min(sectors, info->blocksize - page);
784 len = pages << info->pageshift;
785
786 /* Not overflowing capacity? */
787 if (lba >= maxlba) {
Joe Perches191648d2013-04-19 11:44:00 -0700788 usb_stor_dbg(us, "Error: Requested lba %u exceeds maximum %u\n",
789 lba, maxlba);
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800790 result = -EIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700791 break;
792 }
793
794 /* Find where this lba lives on disk */
795 pba = info->lba_to_pba[lba];
796
797 if (pba == UNDEF) { /* this lba was never written */
798
Joe Perches191648d2013-04-19 11:44:00 -0700799 usb_stor_dbg(us, "Read %d zero pages (LBA %d) page %d\n",
800 pages, lba, page);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700801
802 /* This is not really an error. It just means
803 that the block has never been written.
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800804 Instead of returning an error
Linus Torvalds1da177e2005-04-16 15:20:36 -0700805 it is better to return all zero data. */
806
807 memset(buffer, 0, len);
808
809 } else {
Joe Perches191648d2013-04-19 11:44:00 -0700810 usb_stor_dbg(us, "Read %d pages, from PBA %d (LBA %d) page %d\n",
811 pages, pba, lba, page);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700812
813 address = ((pba << info->blockshift) + page) <<
814 info->pageshift;
815
816 result = sddr09_read20(us, address>>1,
817 pages, info->pageshift, buffer, 0);
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800818 if (result)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700819 break;
820 }
821
822 // Store the data in the transfer buffer
823 usb_stor_access_xfer_buf(buffer, len, us->srb,
Jens Axboe1f6f31a2007-05-11 12:33:09 +0200824 &sg, &offset, TO_XFER_BUF);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700825
826 page = 0;
827 lba++;
828 sectors -= pages;
829 }
830
831 kfree(buffer);
832 return result;
833}
834
835static unsigned int
836sddr09_find_unused_pba(struct sddr09_card_info *info, unsigned int lba) {
837 static unsigned int lastpba = 1;
838 int zonestart, end, i;
839
840 zonestart = (lba/1000) << 10;
841 end = info->capacity >> (info->blockshift + info->pageshift);
842 end -= zonestart;
843 if (end > 1024)
844 end = 1024;
845
846 for (i = lastpba+1; i < end; i++) {
847 if (info->pba_to_lba[zonestart+i] == UNDEF) {
848 lastpba = i;
849 return zonestart+i;
850 }
851 }
852 for (i = 0; i <= lastpba; i++) {
853 if (info->pba_to_lba[zonestart+i] == UNDEF) {
854 lastpba = i;
855 return zonestart+i;
856 }
857 }
858 return 0;
859}
860
861static int
862sddr09_write_lba(struct us_data *us, unsigned int lba,
863 unsigned int page, unsigned int pages,
864 unsigned char *ptr, unsigned char *blockbuffer) {
865
866 struct sddr09_card_info *info = (struct sddr09_card_info *) us->extra;
867 unsigned long address;
868 unsigned int pba, lbap;
869 unsigned int pagelen;
870 unsigned char *bptr, *cptr, *xptr;
871 unsigned char ecc[3];
872 int i, result, isnew;
873
874 lbap = ((lba % 1000) << 1) | 0x1000;
875 if (parity[MSB_of(lbap) ^ LSB_of(lbap)])
876 lbap ^= 1;
877 pba = info->lba_to_pba[lba];
878 isnew = 0;
879
880 if (pba == UNDEF) {
881 pba = sddr09_find_unused_pba(info, lba);
882 if (!pba) {
Frank Seidel6f8aa652009-02-05 16:16:24 +0100883 printk(KERN_WARNING
884 "sddr09_write_lba: Out of unused blocks\n");
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800885 return -ENOSPC;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700886 }
887 info->pba_to_lba[pba] = lba;
888 info->lba_to_pba[lba] = pba;
889 isnew = 1;
890 }
891
892 if (pba == 1) {
893 /* Maybe it is impossible to write to PBA 1.
894 Fake success, but don't do anything. */
Frank Seidel6f8aa652009-02-05 16:16:24 +0100895 printk(KERN_WARNING "sddr09: avoid writing to pba 1\n");
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800896 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700897 }
898
899 pagelen = (1 << info->pageshift) + (1 << CONTROL_SHIFT);
900
901 /* read old contents */
902 address = (pba << (info->pageshift + info->blockshift));
903 result = sddr09_read22(us, address>>1, info->blocksize,
904 info->pageshift, blockbuffer, 0);
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800905 if (result)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700906 return result;
907
908 /* check old contents and fill lba */
909 for (i = 0; i < info->blocksize; i++) {
910 bptr = blockbuffer + i*pagelen;
911 cptr = bptr + info->pagesize;
912 nand_compute_ecc(bptr, ecc);
913 if (!nand_compare_ecc(cptr+13, ecc)) {
Joe Perches191648d2013-04-19 11:44:00 -0700914 usb_stor_dbg(us, "Warning: bad ecc in page %d- of pba %d\n",
915 i, pba);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700916 nand_store_ecc(cptr+13, ecc);
917 }
918 nand_compute_ecc(bptr+(info->pagesize / 2), ecc);
919 if (!nand_compare_ecc(cptr+8, ecc)) {
Joe Perches191648d2013-04-19 11:44:00 -0700920 usb_stor_dbg(us, "Warning: bad ecc in page %d+ of pba %d\n",
921 i, pba);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700922 nand_store_ecc(cptr+8, ecc);
923 }
924 cptr[6] = cptr[11] = MSB_of(lbap);
925 cptr[7] = cptr[12] = LSB_of(lbap);
926 }
927
928 /* copy in new stuff and compute ECC */
929 xptr = ptr;
930 for (i = page; i < page+pages; i++) {
931 bptr = blockbuffer + i*pagelen;
932 cptr = bptr + info->pagesize;
933 memcpy(bptr, xptr, info->pagesize);
934 xptr += info->pagesize;
935 nand_compute_ecc(bptr, ecc);
936 nand_store_ecc(cptr+13, ecc);
937 nand_compute_ecc(bptr+(info->pagesize / 2), ecc);
938 nand_store_ecc(cptr+8, ecc);
939 }
940
Joe Perches191648d2013-04-19 11:44:00 -0700941 usb_stor_dbg(us, "Rewrite PBA %d (LBA %d)\n", pba, lba);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700942
943 result = sddr09_write_inplace(us, address>>1, info->blocksize,
944 info->pageshift, blockbuffer, 0);
945
Joe Perches191648d2013-04-19 11:44:00 -0700946 usb_stor_dbg(us, "sddr09_write_inplace returns %d\n", result);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700947
948#if 0
949 {
950 unsigned char status = 0;
951 int result2 = sddr09_read_status(us, &status);
Matthew Dharm0dc08a32005-12-04 21:58:52 -0800952 if (result2)
Joe Perches191648d2013-04-19 11:44:00 -0700953 usb_stor_dbg(us, "cannot read status\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700954 else if (status != 0xc0)
Joe Perches191648d2013-04-19 11:44:00 -0700955 usb_stor_dbg(us, "status after write: 0x%x\n", status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700956 }
957#endif
958
959#if 0
960 {
961 int result2 = sddr09_test_unit_ready(us);
962 }
963#endif
964
965 return result;
966}
967
968static int
969sddr09_write_data(struct us_data *us,
970 unsigned long address,
971 unsigned int sectors) {
972
973 struct sddr09_card_info *info = (struct sddr09_card_info *) us->extra;
Matthew Dharma6c976c2005-12-04 21:59:45 -0800974 unsigned int lba, maxlba, page, pages;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700975 unsigned int pagelen, blocklen;
976 unsigned char *blockbuffer;
977 unsigned char *buffer;
Jens Axboe1f6f31a2007-05-11 12:33:09 +0200978 unsigned int len, offset;
979 struct scatterlist *sg;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700980 int result;
981
Matthew Dharma6c976c2005-12-04 21:59:45 -0800982 // Figure out the initial LBA and page
983 lba = address >> info->blockshift;
984 page = (address & info->blockmask);
985 maxlba = info->capacity >> (info->pageshift + info->blockshift);
986 if (lba >= maxlba)
987 return -EIO;
988
Linus Torvalds1da177e2005-04-16 15:20:36 -0700989 // blockbuffer is used for reading in the old data, overwriting
990 // with the new data, and performing ECC calculations
991
992 /* TODO: instead of doing kmalloc/kfree for each write,
993 add a bufferpointer to the info structure */
994
995 pagelen = (1 << info->pageshift) + (1 << CONTROL_SHIFT);
996 blocklen = (pagelen << info->blockshift);
997 blockbuffer = kmalloc(blocklen, GFP_NOIO);
998 if (!blockbuffer) {
Frank Seidel6f8aa652009-02-05 16:16:24 +0100999 printk(KERN_WARNING "sddr09_write_data: Out of memory\n");
Matthew Dharm0dc08a32005-12-04 21:58:52 -08001000 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001001 }
1002
1003 // Since we don't write the user data directly to the device,
1004 // we have to create a bounce buffer and move the data a piece
1005 // at a time between the bounce buffer and the actual transfer buffer.
1006
1007 len = min(sectors, (unsigned int) info->blocksize) * info->pagesize;
1008 buffer = kmalloc(len, GFP_NOIO);
1009 if (buffer == NULL) {
Frank Seidel6f8aa652009-02-05 16:16:24 +01001010 printk(KERN_WARNING "sddr09_write_data: Out of memory\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001011 kfree(blockbuffer);
Matthew Dharm0dc08a32005-12-04 21:58:52 -08001012 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001013 }
1014
Matthew Dharm0dc08a32005-12-04 21:58:52 -08001015 result = 0;
Jens Axboe1f6f31a2007-05-11 12:33:09 +02001016 offset = 0;
1017 sg = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001018
1019 while (sectors > 0) {
1020
1021 // Write as many sectors as possible in this block
1022
1023 pages = min(sectors, info->blocksize - page);
1024 len = (pages << info->pageshift);
1025
Matthew Dharma6c976c2005-12-04 21:59:45 -08001026 /* Not overflowing capacity? */
1027 if (lba >= maxlba) {
Joe Perches191648d2013-04-19 11:44:00 -07001028 usb_stor_dbg(us, "Error: Requested lba %u exceeds maximum %u\n",
1029 lba, maxlba);
Matthew Dharma6c976c2005-12-04 21:59:45 -08001030 result = -EIO;
1031 break;
1032 }
1033
Linus Torvalds1da177e2005-04-16 15:20:36 -07001034 // Get the data from the transfer buffer
1035 usb_stor_access_xfer_buf(buffer, len, us->srb,
Jens Axboe1f6f31a2007-05-11 12:33:09 +02001036 &sg, &offset, FROM_XFER_BUF);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001037
1038 result = sddr09_write_lba(us, lba, page, pages,
1039 buffer, blockbuffer);
Matthew Dharm0dc08a32005-12-04 21:58:52 -08001040 if (result)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001041 break;
1042
1043 page = 0;
1044 lba++;
1045 sectors -= pages;
1046 }
1047
1048 kfree(buffer);
1049 kfree(blockbuffer);
1050
1051 return result;
1052}
1053
1054static int
1055sddr09_read_control(struct us_data *us,
1056 unsigned long address,
1057 unsigned int blocks,
1058 unsigned char *content,
1059 int use_sg) {
1060
Joe Perches191648d2013-04-19 11:44:00 -07001061 usb_stor_dbg(us, "Read control address %lu, blocks %d\n",
1062 address, blocks);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001063
1064 return sddr09_read21(us, address, blocks,
1065 CONTROL_SHIFT, content, use_sg);
1066}
1067
1068/*
1069 * Read Device ID Command: 12 bytes.
1070 * byte 0: opcode: ED
1071 *
1072 * Returns 2 bytes: Manufacturer ID and Device ID.
1073 * On more recent cards 3 bytes: the third byte is an option code A5
1074 * signifying that the secret command to read an 128-bit ID is available.
1075 * On still more recent cards 4 bytes: the fourth byte C0 means that
1076 * a second read ID cmd is available.
1077 */
1078static int
1079sddr09_read_deviceID(struct us_data *us, unsigned char *deviceID) {
1080 unsigned char *command = us->iobuf;
1081 unsigned char *content = us->iobuf;
1082 int result, i;
1083
1084 memset(command, 0, 12);
1085 command[0] = 0xED;
1086 command[1] = LUNBITS;
1087
1088 result = sddr09_send_scsi_command(us, command, 12);
Matthew Dharm0dc08a32005-12-04 21:58:52 -08001089 if (result)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001090 return result;
1091
1092 result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
1093 content, 64, NULL);
1094
1095 for (i = 0; i < 4; i++)
1096 deviceID[i] = content[i];
1097
Matthew Dharm0dc08a32005-12-04 21:58:52 -08001098 return (result == USB_STOR_XFER_GOOD ? 0 : -EIO);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001099}
1100
1101static int
1102sddr09_get_wp(struct us_data *us, struct sddr09_card_info *info) {
1103 int result;
1104 unsigned char status;
1105
1106 result = sddr09_read_status(us, &status);
Matthew Dharm0dc08a32005-12-04 21:58:52 -08001107 if (result) {
Joe Perches191648d2013-04-19 11:44:00 -07001108 usb_stor_dbg(us, "read_status fails\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001109 return result;
1110 }
Joe Perches191648d2013-04-19 11:44:00 -07001111 usb_stor_dbg(us, "status 0x%02X", status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001112 if ((status & 0x80) == 0) {
1113 info->flags |= SDDR09_WP; /* write protected */
Joe Perches191648d2013-04-19 11:44:00 -07001114 US_DEBUGPX(" WP");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001115 }
1116 if (status & 0x40)
Joe Perches191648d2013-04-19 11:44:00 -07001117 US_DEBUGPX(" Ready");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001118 if (status & LUNBITS)
Joe Perches191648d2013-04-19 11:44:00 -07001119 US_DEBUGPX(" Suspended");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001120 if (status & 0x1)
Joe Perches191648d2013-04-19 11:44:00 -07001121 US_DEBUGPX(" Error");
1122 US_DEBUGPX("\n");
Matthew Dharm0dc08a32005-12-04 21:58:52 -08001123 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001124}
1125
1126#if 0
1127/*
1128 * Reset Command: 12 bytes.
1129 * byte 0: opcode: EB
1130 */
1131static int
1132sddr09_reset(struct us_data *us) {
1133
1134 unsigned char *command = us->iobuf;
1135
1136 memset(command, 0, 12);
1137 command[0] = 0xEB;
1138 command[1] = LUNBITS;
1139
1140 return sddr09_send_scsi_command(us, command, 12);
1141}
1142#endif
1143
1144static struct nand_flash_dev *
1145sddr09_get_cardinfo(struct us_data *us, unsigned char flags) {
1146 struct nand_flash_dev *cardinfo;
1147 unsigned char deviceID[4];
1148 char blurbtxt[256];
1149 int result;
1150
Joe Perches191648d2013-04-19 11:44:00 -07001151 usb_stor_dbg(us, "Reading capacity...\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001152
1153 result = sddr09_read_deviceID(us, deviceID);
1154
Matthew Dharm0dc08a32005-12-04 21:58:52 -08001155 if (result) {
Joe Perches191648d2013-04-19 11:44:00 -07001156 usb_stor_dbg(us, "Result of read_deviceID is %d\n", result);
Frank Seidel6f8aa652009-02-05 16:16:24 +01001157 printk(KERN_WARNING "sddr09: could not read card info\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001158 return NULL;
1159 }
1160
Andy Shevchenko7adce462014-09-05 17:56:25 +03001161 sprintf(blurbtxt, "sddr09: Found Flash card, ID = %4ph", deviceID);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001162
1163 /* Byte 0 is the manufacturer */
1164 sprintf(blurbtxt + strlen(blurbtxt),
1165 ": Manuf. %s",
1166 nand_flash_manufacturer(deviceID[0]));
1167
1168 /* Byte 1 is the device type */
1169 cardinfo = nand_find_id(deviceID[1]);
1170 if (cardinfo) {
1171 /* MB or MiB? It is neither. A 16 MB card has
1172 17301504 raw bytes, of which 16384000 are
1173 usable for user data. */
1174 sprintf(blurbtxt + strlen(blurbtxt),
1175 ", %d MB", 1<<(cardinfo->chipshift - 20));
1176 } else {
1177 sprintf(blurbtxt + strlen(blurbtxt),
1178 ", type unrecognized");
1179 }
1180
1181 /* Byte 2 is code to signal availability of 128-bit ID */
1182 if (deviceID[2] == 0xa5) {
1183 sprintf(blurbtxt + strlen(blurbtxt),
1184 ", 128-bit ID");
1185 }
1186
1187 /* Byte 3 announces the availability of another read ID command */
1188 if (deviceID[3] == 0xc0) {
1189 sprintf(blurbtxt + strlen(blurbtxt),
1190 ", extra cmd");
1191 }
1192
1193 if (flags & SDDR09_WP)
1194 sprintf(blurbtxt + strlen(blurbtxt),
1195 ", WP");
1196
Frank Seidel6f8aa652009-02-05 16:16:24 +01001197 printk(KERN_WARNING "%s\n", blurbtxt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001198
1199 return cardinfo;
1200}
1201
1202static int
1203sddr09_read_map(struct us_data *us) {
1204
1205 struct sddr09_card_info *info = (struct sddr09_card_info *) us->extra;
1206 int numblocks, alloc_len, alloc_blocks;
1207 int i, j, result;
1208 unsigned char *buffer, *buffer_end, *ptr;
1209 unsigned int lba, lbact;
1210
1211 if (!info->capacity)
1212 return -1;
1213
1214 // size of a block is 1 << (blockshift + pageshift) bytes
1215 // divide into the total capacity to get the number of blocks
1216
1217 numblocks = info->capacity >> (info->blockshift + info->pageshift);
1218
1219 // read 64 bytes for every block (actually 1 << CONTROL_SHIFT)
1220 // but only use a 64 KB buffer
1221 // buffer size used must be a multiple of (1 << CONTROL_SHIFT)
1222#define SDDR09_READ_MAP_BUFSZ 65536
1223
1224 alloc_blocks = min(numblocks, SDDR09_READ_MAP_BUFSZ >> CONTROL_SHIFT);
1225 alloc_len = (alloc_blocks << CONTROL_SHIFT);
1226 buffer = kmalloc(alloc_len, GFP_NOIO);
1227 if (buffer == NULL) {
Frank Seidel6f8aa652009-02-05 16:16:24 +01001228 printk(KERN_WARNING "sddr09_read_map: out of memory\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001229 result = -1;
1230 goto done;
1231 }
1232 buffer_end = buffer + alloc_len;
1233
1234#undef SDDR09_READ_MAP_BUFSZ
1235
1236 kfree(info->lba_to_pba);
1237 kfree(info->pba_to_lba);
1238 info->lba_to_pba = kmalloc(numblocks*sizeof(int), GFP_NOIO);
1239 info->pba_to_lba = kmalloc(numblocks*sizeof(int), GFP_NOIO);
1240
1241 if (info->lba_to_pba == NULL || info->pba_to_lba == NULL) {
Frank Seidel6f8aa652009-02-05 16:16:24 +01001242 printk(KERN_WARNING "sddr09_read_map: out of memory\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001243 result = -1;
1244 goto done;
1245 }
1246
1247 for (i = 0; i < numblocks; i++)
1248 info->lba_to_pba[i] = info->pba_to_lba[i] = UNDEF;
1249
1250 /*
1251 * Define lba-pba translation table
1252 */
1253
1254 ptr = buffer_end;
1255 for (i = 0; i < numblocks; i++) {
1256 ptr += (1 << CONTROL_SHIFT);
1257 if (ptr >= buffer_end) {
1258 unsigned long address;
1259
1260 address = i << (info->pageshift + info->blockshift);
1261 result = sddr09_read_control(
1262 us, address>>1,
1263 min(alloc_blocks, numblocks - i),
1264 buffer, 0);
Matthew Dharm0dc08a32005-12-04 21:58:52 -08001265 if (result) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001266 result = -1;
1267 goto done;
1268 }
1269 ptr = buffer;
1270 }
1271
1272 if (i == 0 || i == 1) {
1273 info->pba_to_lba[i] = UNUSABLE;
1274 continue;
1275 }
1276
1277 /* special PBAs have control field 0^16 */
1278 for (j = 0; j < 16; j++)
1279 if (ptr[j] != 0)
1280 goto nonz;
1281 info->pba_to_lba[i] = UNUSABLE;
Frank Seidel6f8aa652009-02-05 16:16:24 +01001282 printk(KERN_WARNING "sddr09: PBA %d has no logical mapping\n",
1283 i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001284 continue;
1285
1286 nonz:
1287 /* unwritten PBAs have control field FF^16 */
1288 for (j = 0; j < 16; j++)
1289 if (ptr[j] != 0xff)
1290 goto nonff;
1291 continue;
1292
1293 nonff:
1294 /* normal PBAs start with six FFs */
1295 if (j < 6) {
Frank Seidel6f8aa652009-02-05 16:16:24 +01001296 printk(KERN_WARNING
1297 "sddr09: PBA %d has no logical mapping: "
Linus Torvalds1da177e2005-04-16 15:20:36 -07001298 "reserved area = %02X%02X%02X%02X "
1299 "data status %02X block status %02X\n",
1300 i, ptr[0], ptr[1], ptr[2], ptr[3],
1301 ptr[4], ptr[5]);
1302 info->pba_to_lba[i] = UNUSABLE;
1303 continue;
1304 }
1305
1306 if ((ptr[6] >> 4) != 0x01) {
Frank Seidel6f8aa652009-02-05 16:16:24 +01001307 printk(KERN_WARNING
1308 "sddr09: PBA %d has invalid address field "
Linus Torvalds1da177e2005-04-16 15:20:36 -07001309 "%02X%02X/%02X%02X\n",
1310 i, ptr[6], ptr[7], ptr[11], ptr[12]);
1311 info->pba_to_lba[i] = UNUSABLE;
1312 continue;
1313 }
1314
1315 /* check even parity */
1316 if (parity[ptr[6] ^ ptr[7]]) {
Frank Seidel6f8aa652009-02-05 16:16:24 +01001317 printk(KERN_WARNING
1318 "sddr09: Bad parity in LBA for block %d"
Linus Torvalds1da177e2005-04-16 15:20:36 -07001319 " (%02X %02X)\n", i, ptr[6], ptr[7]);
1320 info->pba_to_lba[i] = UNUSABLE;
1321 continue;
1322 }
1323
1324 lba = short_pack(ptr[7], ptr[6]);
1325 lba = (lba & 0x07FF) >> 1;
1326
1327 /*
1328 * Every 1024 physical blocks ("zone"), the LBA numbers
1329 * go back to zero, but are within a higher block of LBA's.
1330 * Also, there is a maximum of 1000 LBA's per zone.
1331 * In other words, in PBA 1024-2047 you will find LBA 0-999
1332 * which are really LBA 1000-1999. This allows for 24 bad
1333 * or special physical blocks per zone.
1334 */
1335
1336 if (lba >= 1000) {
Frank Seidel6f8aa652009-02-05 16:16:24 +01001337 printk(KERN_WARNING
1338 "sddr09: Bad low LBA %d for block %d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001339 lba, i);
1340 goto possibly_erase;
1341 }
1342
1343 lba += 1000*(i/0x400);
1344
1345 if (info->lba_to_pba[lba] != UNDEF) {
Frank Seidel6f8aa652009-02-05 16:16:24 +01001346 printk(KERN_WARNING
1347 "sddr09: LBA %d seen for PBA %d and %d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001348 lba, info->lba_to_pba[lba], i);
1349 goto possibly_erase;
1350 }
1351
1352 info->pba_to_lba[i] = lba;
1353 info->lba_to_pba[lba] = i;
1354 continue;
1355
1356 possibly_erase:
1357 if (erase_bad_lba_entries) {
1358 unsigned long address;
1359
1360 address = (i << (info->pageshift + info->blockshift));
1361 sddr09_erase(us, address>>1);
1362 info->pba_to_lba[i] = UNDEF;
1363 } else
1364 info->pba_to_lba[i] = UNUSABLE;
1365 }
1366
1367 /*
1368 * Approximate capacity. This is not entirely correct yet,
1369 * since a zone with less than 1000 usable pages leads to
1370 * missing LBAs. Especially if it is the last zone, some
1371 * LBAs can be past capacity.
1372 */
1373 lbact = 0;
1374 for (i = 0; i < numblocks; i += 1024) {
1375 int ct = 0;
1376
1377 for (j = 0; j < 1024 && i+j < numblocks; j++) {
1378 if (info->pba_to_lba[i+j] != UNUSABLE) {
1379 if (ct >= 1000)
1380 info->pba_to_lba[i+j] = SPARE;
1381 else
1382 ct++;
1383 }
1384 }
1385 lbact += ct;
1386 }
1387 info->lbact = lbact;
Joe Perches191648d2013-04-19 11:44:00 -07001388 usb_stor_dbg(us, "Found %d LBA's\n", lbact);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001389 result = 0;
1390
1391 done:
1392 if (result != 0) {
1393 kfree(info->lba_to_pba);
1394 kfree(info->pba_to_lba);
1395 info->lba_to_pba = NULL;
1396 info->pba_to_lba = NULL;
1397 }
1398 kfree(buffer);
1399 return result;
1400}
1401
1402static void
1403sddr09_card_info_destructor(void *extra) {
1404 struct sddr09_card_info *info = (struct sddr09_card_info *)extra;
1405
1406 if (!info)
1407 return;
1408
1409 kfree(info->lba_to_pba);
1410 kfree(info->pba_to_lba);
1411}
1412
Matthew Dharmf5b8cb92005-12-04 21:57:51 -08001413static int
1414sddr09_common_init(struct us_data *us) {
1415 int result;
1416
1417 /* set the configuration -- STALL is an acceptable response here */
1418 if (us->pusb_dev->actconfig->desc.bConfigurationValue != 1) {
Joe Perches191648d2013-04-19 11:44:00 -07001419 usb_stor_dbg(us, "active config #%d != 1 ??\n",
1420 us->pusb_dev->actconfig->desc.bConfigurationValue);
Matthew Dharmf5b8cb92005-12-04 21:57:51 -08001421 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001422 }
Matthew Dharmf5b8cb92005-12-04 21:57:51 -08001423
1424 result = usb_reset_configuration(us->pusb_dev);
Joe Perches191648d2013-04-19 11:44:00 -07001425 usb_stor_dbg(us, "Result of usb_reset_configuration is %d\n", result);
Matthew Dharmf5b8cb92005-12-04 21:57:51 -08001426 if (result == -EPIPE) {
Joe Perches191648d2013-04-19 11:44:00 -07001427 usb_stor_dbg(us, "-- stall on control interface\n");
Matthew Dharmf5b8cb92005-12-04 21:57:51 -08001428 } else if (result != 0) {
1429 /* it's not a stall, but another error -- time to bail */
Joe Perches191648d2013-04-19 11:44:00 -07001430 usb_stor_dbg(us, "-- Unknown error. Rejecting device\n");
Matthew Dharmf5b8cb92005-12-04 21:57:51 -08001431 return -EINVAL;
1432 }
1433
1434 us->extra = kzalloc(sizeof(struct sddr09_card_info), GFP_NOIO);
1435 if (!us->extra)
1436 return -ENOMEM;
1437 us->extra_destructor = sddr09_card_info_destructor;
1438
1439 nand_init_ecc();
1440 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001441}
1442
Matthew Dharmf5b8cb92005-12-04 21:57:51 -08001443
Linus Torvalds1da177e2005-04-16 15:20:36 -07001444/*
1445 * This is needed at a very early stage. If this is not listed in the
1446 * unusual devices list but called from here then LUN 0 of the combo reader
1447 * is not recognized. But I do not know what precisely these calls do.
1448 */
Alan Stern0ff71882009-02-12 14:47:49 -05001449static int
Matthew Dharmf5b8cb92005-12-04 21:57:51 -08001450usb_stor_sddr09_dpcm_init(struct us_data *us) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001451 int result;
1452 unsigned char *data = us->iobuf;
1453
Matthew Dharmf5b8cb92005-12-04 21:57:51 -08001454 result = sddr09_common_init(us);
1455 if (result)
1456 return result;
1457
Linus Torvalds1da177e2005-04-16 15:20:36 -07001458 result = sddr09_send_command(us, 0x01, USB_DIR_IN, data, 2);
Matthew Dharm0dc08a32005-12-04 21:58:52 -08001459 if (result) {
Joe Perches191648d2013-04-19 11:44:00 -07001460 usb_stor_dbg(us, "send_command fails\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001461 return result;
1462 }
1463
Joe Perches191648d2013-04-19 11:44:00 -07001464 usb_stor_dbg(us, "%02X %02X\n", data[0], data[1]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001465 // get 07 02
1466
1467 result = sddr09_send_command(us, 0x08, USB_DIR_IN, data, 2);
Matthew Dharm0dc08a32005-12-04 21:58:52 -08001468 if (result) {
Joe Perches191648d2013-04-19 11:44:00 -07001469 usb_stor_dbg(us, "2nd send_command fails\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001470 return result;
1471 }
1472
Joe Perches191648d2013-04-19 11:44:00 -07001473 usb_stor_dbg(us, "%02X %02X\n", data[0], data[1]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001474 // get 07 00
1475
1476 result = sddr09_request_sense(us, data, 18);
Matthew Dharm0dc08a32005-12-04 21:58:52 -08001477 if (result == 0 && data[2] != 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001478 int j;
1479 for (j=0; j<18; j++)
1480 printk(" %02X", data[j]);
1481 printk("\n");
1482 // get 70 00 00 00 00 00 00 * 00 00 00 00 00 00
1483 // 70: current command
1484 // sense key 0, sense code 0, extd sense code 0
1485 // additional transfer length * = sizeof(data) - 7
1486 // Or: 70 00 06 00 00 00 00 0b 00 00 00 00 28 00 00 00 00 00
1487 // sense key 06, sense code 28: unit attention,
1488 // not ready to ready transition
1489 }
1490
1491 // test unit ready
1492
Matthew Dharmf5b8cb92005-12-04 21:57:51 -08001493 return 0; /* not result */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001494}
1495
1496/*
Alan Sternc20b15f2008-12-01 10:36:15 -05001497 * Transport for the Microtech DPCM-USB
1498 */
Alan Stern0ff71882009-02-12 14:47:49 -05001499static int dpcm_transport(struct scsi_cmnd *srb, struct us_data *us)
Alan Sternc20b15f2008-12-01 10:36:15 -05001500{
1501 int ret;
1502
Hannes Reinecke9cb78c12014-06-25 15:27:36 +02001503 usb_stor_dbg(us, "LUN=%d\n", (u8)srb->device->lun);
Alan Sternc20b15f2008-12-01 10:36:15 -05001504
1505 switch (srb->device->lun) {
1506 case 0:
1507
1508 /*
1509 * LUN 0 corresponds to the CompactFlash card reader.
1510 */
1511 ret = usb_stor_CB_transport(srb, us);
1512 break;
1513
1514 case 1:
1515
1516 /*
1517 * LUN 1 corresponds to the SmartMedia card reader.
1518 */
1519
1520 /*
1521 * Set the LUN to 0 (just in case).
1522 */
1523 srb->device->lun = 0;
1524 ret = sddr09_transport(srb, us);
1525 srb->device->lun = 1;
1526 break;
1527
1528 default:
Hannes Reinecke9cb78c12014-06-25 15:27:36 +02001529 usb_stor_dbg(us, "Invalid LUN %d\n", (u8)srb->device->lun);
Alan Sternc20b15f2008-12-01 10:36:15 -05001530 ret = USB_STOR_TRANSPORT_ERROR;
1531 break;
1532 }
1533 return ret;
1534}
1535
1536
1537/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001538 * Transport for the Sandisk SDDR-09
1539 */
Alan Stern0ff71882009-02-12 14:47:49 -05001540static int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001541{
1542 static unsigned char sensekey = 0, sensecode = 0;
1543 static unsigned char havefakesense = 0;
1544 int result, i;
1545 unsigned char *ptr = us->iobuf;
1546 unsigned long capacity;
1547 unsigned int page, pages;
1548
1549 struct sddr09_card_info *info;
1550
1551 static unsigned char inquiry_response[8] = {
1552 0x00, 0x80, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x00
1553 };
1554
1555 /* note: no block descriptor support */
1556 static unsigned char mode_page_01[19] = {
1557 0x00, 0x0F, 0x00, 0x0, 0x0, 0x0, 0x00,
1558 0x01, 0x0A,
1559 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1560 };
1561
1562 info = (struct sddr09_card_info *)us->extra;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001563
1564 if (srb->cmnd[0] == REQUEST_SENSE && havefakesense) {
1565 /* for a faked command, we have to follow with a faked sense */
1566 memset(ptr, 0, 18);
1567 ptr[0] = 0x70;
1568 ptr[2] = sensekey;
1569 ptr[7] = 11;
1570 ptr[12] = sensecode;
1571 usb_stor_set_xfer_buf(ptr, 18, srb);
1572 sensekey = sensecode = havefakesense = 0;
1573 return USB_STOR_TRANSPORT_GOOD;
1574 }
1575
1576 havefakesense = 1;
1577
1578 /* Dummy up a response for INQUIRY since SDDR09 doesn't
1579 respond to INQUIRY commands */
1580
1581 if (srb->cmnd[0] == INQUIRY) {
1582 memcpy(ptr, inquiry_response, 8);
1583 fill_inquiry_response(us, ptr, 36);
1584 return USB_STOR_TRANSPORT_GOOD;
1585 }
1586
1587 if (srb->cmnd[0] == READ_CAPACITY) {
1588 struct nand_flash_dev *cardinfo;
1589
1590 sddr09_get_wp(us, info); /* read WP bit */
1591
1592 cardinfo = sddr09_get_cardinfo(us, info->flags);
1593 if (!cardinfo) {
1594 /* probably no media */
1595 init_error:
1596 sensekey = 0x02; /* not ready */
1597 sensecode = 0x3a; /* medium not present */
1598 return USB_STOR_TRANSPORT_FAILED;
1599 }
1600
1601 info->capacity = (1 << cardinfo->chipshift);
1602 info->pageshift = cardinfo->pageshift;
1603 info->pagesize = (1 << info->pageshift);
1604 info->blockshift = cardinfo->blockshift;
1605 info->blocksize = (1 << info->blockshift);
1606 info->blockmask = info->blocksize - 1;
1607
1608 // map initialization, must follow get_cardinfo()
1609 if (sddr09_read_map(us)) {
1610 /* probably out of memory */
1611 goto init_error;
1612 }
1613
1614 // Report capacity
1615
1616 capacity = (info->lbact << info->blockshift) - 1;
1617
1618 ((__be32 *) ptr)[0] = cpu_to_be32(capacity);
1619
1620 // Report page size
1621
1622 ((__be32 *) ptr)[1] = cpu_to_be32(info->pagesize);
1623 usb_stor_set_xfer_buf(ptr, 8, srb);
1624
1625 return USB_STOR_TRANSPORT_GOOD;
1626 }
1627
1628 if (srb->cmnd[0] == MODE_SENSE_10) {
1629 int modepage = (srb->cmnd[2] & 0x3F);
1630
1631 /* They ask for the Read/Write error recovery page,
1632 or for all pages. */
1633 /* %% We should check DBD %% */
1634 if (modepage == 0x01 || modepage == 0x3F) {
Joe Perches191648d2013-04-19 11:44:00 -07001635 usb_stor_dbg(us, "Dummy up request for mode page 0x%x\n",
1636 modepage);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001637
1638 memcpy(ptr, mode_page_01, sizeof(mode_page_01));
1639 ((__be16*)ptr)[0] = cpu_to_be16(sizeof(mode_page_01) - 2);
1640 ptr[3] = (info->flags & SDDR09_WP) ? 0x80 : 0;
1641 usb_stor_set_xfer_buf(ptr, sizeof(mode_page_01), srb);
1642 return USB_STOR_TRANSPORT_GOOD;
1643 }
1644
1645 sensekey = 0x05; /* illegal request */
1646 sensecode = 0x24; /* invalid field in CDB */
1647 return USB_STOR_TRANSPORT_FAILED;
1648 }
1649
1650 if (srb->cmnd[0] == ALLOW_MEDIUM_REMOVAL)
1651 return USB_STOR_TRANSPORT_GOOD;
1652
1653 havefakesense = 0;
1654
1655 if (srb->cmnd[0] == READ_10) {
1656
1657 page = short_pack(srb->cmnd[3], srb->cmnd[2]);
1658 page <<= 16;
1659 page |= short_pack(srb->cmnd[5], srb->cmnd[4]);
1660 pages = short_pack(srb->cmnd[8], srb->cmnd[7]);
1661
Joe Perches191648d2013-04-19 11:44:00 -07001662 usb_stor_dbg(us, "READ_10: read page %d pagect %d\n",
1663 page, pages);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001664
Matthew Dharm0dc08a32005-12-04 21:58:52 -08001665 result = sddr09_read_data(us, page, pages);
1666 return (result == 0 ? USB_STOR_TRANSPORT_GOOD :
1667 USB_STOR_TRANSPORT_ERROR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001668 }
1669
1670 if (srb->cmnd[0] == WRITE_10) {
1671
1672 page = short_pack(srb->cmnd[3], srb->cmnd[2]);
1673 page <<= 16;
1674 page |= short_pack(srb->cmnd[5], srb->cmnd[4]);
1675 pages = short_pack(srb->cmnd[8], srb->cmnd[7]);
1676
Joe Perches191648d2013-04-19 11:44:00 -07001677 usb_stor_dbg(us, "WRITE_10: write page %d pagect %d\n",
1678 page, pages);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001679
Matthew Dharm0dc08a32005-12-04 21:58:52 -08001680 result = sddr09_write_data(us, page, pages);
1681 return (result == 0 ? USB_STOR_TRANSPORT_GOOD :
1682 USB_STOR_TRANSPORT_ERROR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001683 }
1684
1685 /* catch-all for all other commands, except
1686 * pass TEST_UNIT_READY and REQUEST_SENSE through
1687 */
1688 if (srb->cmnd[0] != TEST_UNIT_READY &&
1689 srb->cmnd[0] != REQUEST_SENSE) {
1690 sensekey = 0x05; /* illegal request */
1691 sensecode = 0x20; /* invalid command */
1692 havefakesense = 1;
1693 return USB_STOR_TRANSPORT_FAILED;
1694 }
1695
1696 for (; srb->cmd_len<12; srb->cmd_len++)
1697 srb->cmnd[srb->cmd_len] = 0;
1698
1699 srb->cmnd[1] = LUNBITS;
1700
1701 ptr[0] = 0;
1702 for (i=0; i<12; i++)
1703 sprintf(ptr+strlen(ptr), "%02X ", srb->cmnd[i]);
1704
Joe Perches191648d2013-04-19 11:44:00 -07001705 usb_stor_dbg(us, "Send control for command %s\n", ptr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001706
1707 result = sddr09_send_scsi_command(us, srb->cmnd, 12);
Matthew Dharm0dc08a32005-12-04 21:58:52 -08001708 if (result) {
Joe Perches191648d2013-04-19 11:44:00 -07001709 usb_stor_dbg(us, "sddr09_send_scsi_command returns %d\n",
1710 result);
Matthew Dharm0dc08a32005-12-04 21:58:52 -08001711 return USB_STOR_TRANSPORT_ERROR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001712 }
1713
Boaz Harrosh41c24972007-09-09 20:47:26 +03001714 if (scsi_bufflen(srb) == 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001715 return USB_STOR_TRANSPORT_GOOD;
1716
1717 if (srb->sc_data_direction == DMA_TO_DEVICE ||
1718 srb->sc_data_direction == DMA_FROM_DEVICE) {
1719 unsigned int pipe = (srb->sc_data_direction == DMA_TO_DEVICE)
1720 ? us->send_bulk_pipe : us->recv_bulk_pipe;
1721
Joe Perches191648d2013-04-19 11:44:00 -07001722 usb_stor_dbg(us, "%s %d bytes\n",
1723 (srb->sc_data_direction == DMA_TO_DEVICE) ?
1724 "sending" : "receiving",
1725 scsi_bufflen(srb));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001726
Boaz Harrosh41c24972007-09-09 20:47:26 +03001727 result = usb_stor_bulk_srb(us, pipe, srb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001728
1729 return (result == USB_STOR_XFER_GOOD ?
1730 USB_STOR_TRANSPORT_GOOD : USB_STOR_TRANSPORT_ERROR);
1731 }
1732
1733 return USB_STOR_TRANSPORT_GOOD;
1734}
1735
Matthew Dharmf5b8cb92005-12-04 21:57:51 -08001736/*
1737 * Initialization routine for the sddr09 subdriver
1738 */
Alan Stern0ff71882009-02-12 14:47:49 -05001739static int
Matthew Dharmf5b8cb92005-12-04 21:57:51 -08001740usb_stor_sddr09_init(struct us_data *us) {
1741 return sddr09_common_init(us);
1742}
Alan Stern0ff71882009-02-12 14:47:49 -05001743
Akinobu Mitaaa519be2015-05-06 18:24:21 +09001744static struct scsi_host_template sddr09_host_template;
1745
Alan Stern0ff71882009-02-12 14:47:49 -05001746static int sddr09_probe(struct usb_interface *intf,
1747 const struct usb_device_id *id)
1748{
1749 struct us_data *us;
1750 int result;
1751
1752 result = usb_stor_probe1(&us, intf, id,
Akinobu Mitaaa519be2015-05-06 18:24:21 +09001753 (id - sddr09_usb_ids) + sddr09_unusual_dev_list,
1754 &sddr09_host_template);
Alan Stern0ff71882009-02-12 14:47:49 -05001755 if (result)
1756 return result;
1757
Michal Nazarewicz8fa7fd72010-10-07 13:05:21 +02001758 if (us->protocol == USB_PR_DPCM_USB) {
Alan Stern0ff71882009-02-12 14:47:49 -05001759 us->transport_name = "Control/Bulk-EUSB/SDDR09";
1760 us->transport = dpcm_transport;
1761 us->transport_reset = usb_stor_CB_reset;
1762 us->max_lun = 1;
1763 } else {
1764 us->transport_name = "EUSB/SDDR09";
1765 us->transport = sddr09_transport;
1766 us->transport_reset = usb_stor_CB_reset;
1767 us->max_lun = 0;
1768 }
1769
1770 result = usb_stor_probe2(us);
1771 return result;
1772}
1773
1774static struct usb_driver sddr09_driver = {
Akinobu Mitaaa519be2015-05-06 18:24:21 +09001775 .name = DRV_NAME,
Alan Stern0ff71882009-02-12 14:47:49 -05001776 .probe = sddr09_probe,
1777 .disconnect = usb_stor_disconnect,
1778 .suspend = usb_stor_suspend,
1779 .resume = usb_stor_resume,
1780 .reset_resume = usb_stor_reset_resume,
1781 .pre_reset = usb_stor_pre_reset,
1782 .post_reset = usb_stor_post_reset,
1783 .id_table = sddr09_usb_ids,
1784 .soft_unbind = 1,
Huajun Lie73b2db2012-01-14 10:15:21 +08001785 .no_dynamic_id = 1,
Alan Stern0ff71882009-02-12 14:47:49 -05001786};
1787
Akinobu Mitaaa519be2015-05-06 18:24:21 +09001788module_usb_stor_driver(sddr09_driver, sddr09_host_template, DRV_NAME);