Lines Matching +full:0 +full:us
74 #define LSB_of(s) ((s)&0xFF)
83 } while (0)
104 #define NOT_ALLOCATED 0xffffffff
105 #define BAD_BLOCK 0xffff
106 #define CIS_BLOCK 0x400
107 #define UNUSED_BLOCK 0x3ff
110 sddr55_bulk_transport(struct us_data *us, int direction, in sddr55_bulk_transport() argument
112 struct sddr55_card_info *info = (struct sddr55_card_info *)us->extra; in sddr55_bulk_transport()
114 us->recv_bulk_pipe : us->send_bulk_pipe; in sddr55_bulk_transport()
119 return usb_stor_bulk_transfer_buf(us, pipe, data, len, NULL); in sddr55_bulk_transport()
127 static int sddr55_status(struct us_data *us) in sddr55_status() argument
130 unsigned char *command = us->iobuf; in sddr55_status()
131 unsigned char *status = us->iobuf; in sddr55_status()
132 struct sddr55_card_info *info = (struct sddr55_card_info *)us->extra; in sddr55_status()
135 memset(command, 0, 8); in sddr55_status()
136 command[5] = 0xB0; in sddr55_status()
137 command[7] = 0x80; in sddr55_status()
138 result = sddr55_bulk_transport(us, in sddr55_status()
141 usb_stor_dbg(us, "Result for send_command in status %d\n", result); in sddr55_status()
144 set_sense_info (4, 0, 0); /* hardware error */ in sddr55_status()
148 result = sddr55_bulk_transport(us, in sddr55_status()
159 info->fatal_error = 0; in sddr55_status()
160 info->force_read_only = 0; in sddr55_status()
162 set_sense_info (2, 0x3a, 0); /* not ready, medium not present */ in sddr55_status()
167 set_sense_info (4, 0, 0); /* hardware error */ in sddr55_status()
172 info->read_only = (status[0] & 0x20); in sddr55_status()
175 result = sddr55_bulk_transport(us, in sddr55_status()
179 set_sense_info (4, 0, 0); /* hardware error */ in sddr55_status()
187 static int sddr55_read_data(struct us_data *us, in sddr55_read_data() argument
193 unsigned char *command = us->iobuf; in sddr55_read_data()
194 unsigned char *status = us->iobuf; in sddr55_read_data()
195 struct sddr55_card_info *info = (struct sddr55_card_info *)us->extra; in sddr55_read_data()
214 offset = 0; in sddr55_read_data()
217 while (sectors>0) { in sddr55_read_data()
231 usb_stor_dbg(us, "Read %02X pages, from PBA %04X (LBA %04X) page %02X\n", in sddr55_read_data()
236 memset (buffer, 0, len); in sddr55_read_data()
241 command[0] = 0; in sddr55_read_data()
246 command[4] = 0; in sddr55_read_data()
247 command[5] = 0xB0; in sddr55_read_data()
249 command[7] = 0x85; in sddr55_read_data()
252 result = sddr55_bulk_transport(us, in sddr55_read_data()
255 usb_stor_dbg(us, "Result for send_command in read_data %d\n", in sddr55_read_data()
264 result = sddr55_bulk_transport(us, in sddr55_read_data()
273 result = sddr55_bulk_transport(us, in sddr55_read_data()
282 if (status[0] == 0xff && status[1] == 0x4) { in sddr55_read_data()
283 set_sense_info (3, 0x11, 0); in sddr55_read_data()
290 usb_stor_access_xfer_buf(buffer, len, us->srb, in sddr55_read_data()
293 page = 0; in sddr55_read_data()
306 static int sddr55_write_data(struct us_data *us, in sddr55_write_data() argument
312 unsigned char *command = us->iobuf; in sddr55_write_data()
313 unsigned char *status = us->iobuf; in sddr55_write_data()
314 struct sddr55_card_info *info = (struct sddr55_card_info *)us->extra; in sddr55_write_data()
328 set_sense_info (7, 0x27, 0); /* read only */ in sddr55_write_data()
341 offset = 0; in sddr55_write_data()
344 while (sectors > 0) { in sddr55_write_data()
359 usb_stor_access_xfer_buf(buffer, len, us->srb, in sddr55_write_data()
362 usb_stor_dbg(us, "Write %02X pages, to PBA %04X (LBA %04X) page %02X\n", in sddr55_write_data()
365 command[4] = 0; in sddr55_write_data()
371 int found_count = 0; in sddr55_write_data()
377 usb_stor_dbg(us, "No PBA for LBA %04X\n", lba); in sddr55_write_data()
388 for (i = 0; i < max_pba; i++, pba++) { in sddr55_write_data()
400 usb_stor_dbg(us, "Couldn't find unallocated block\n"); in sddr55_write_data()
402 set_sense_info (3, 0x31, 0); /* medium error */ in sddr55_write_data()
407 usb_stor_dbg(us, "Allocating PBA %04X for LBA %04X\n", in sddr55_write_data()
411 command[4] = 0x40; in sddr55_write_data()
421 command[0] = LSB_of(lba % 1000); in sddr55_write_data()
425 command[5] = 0xB0; in sddr55_write_data()
426 command[7] = 0x86; in sddr55_write_data()
429 result = sddr55_bulk_transport(us, in sddr55_write_data()
433 usb_stor_dbg(us, "Result for send_command in write_data %d\n", in sddr55_write_data()
437 set_sense_info (3, 0x3, 0);/* peripheral write error */ in sddr55_write_data()
443 result = sddr55_bulk_transport(us, in sddr55_write_data()
447 usb_stor_dbg(us, "Result for send_data in write_data %d\n", in sddr55_write_data()
451 set_sense_info (3, 0x3, 0);/* peripheral write error */ in sddr55_write_data()
457 result = sddr55_bulk_transport(us, DMA_FROM_DEVICE, status, 6); in sddr55_write_data()
460 usb_stor_dbg(us, "Result for get_status in write_data %d\n", in sddr55_write_data()
464 set_sense_info (3, 0x3, 0);/* peripheral write error */ in sddr55_write_data()
479 if (status[0] == 0xff && status[1] == 0x4) { in sddr55_write_data()
482 set_sense_info (3, 0x0c, 0); in sddr55_write_data()
487 usb_stor_dbg(us, "Updating maps for LBA %04X: old PBA %04X, new PBA %04X\n", in sddr55_write_data()
499 set_sense_info (3, 0x31, 0); in sddr55_write_data()
507 page = 0; in sddr55_write_data()
518 static int sddr55_read_deviceID(struct us_data *us, in sddr55_read_deviceID() argument
523 unsigned char *command = us->iobuf; in sddr55_read_deviceID()
524 unsigned char *content = us->iobuf; in sddr55_read_deviceID()
526 memset(command, 0, 8); in sddr55_read_deviceID()
527 command[5] = 0xB0; in sddr55_read_deviceID()
528 command[7] = 0x84; in sddr55_read_deviceID()
529 result = sddr55_bulk_transport(us, DMA_TO_DEVICE, command, 8); in sddr55_read_deviceID()
531 usb_stor_dbg(us, "Result of send_control for device ID is %d\n", in sddr55_read_deviceID()
537 result = sddr55_bulk_transport(us, in sddr55_read_deviceID()
543 *manufacturerID = content[0]; in sddr55_read_deviceID()
546 if (content[0] != 0xff) { in sddr55_read_deviceID()
547 result = sddr55_bulk_transport(us, in sddr55_read_deviceID()
555 static int sddr55_reset(struct us_data *us) in sddr55_reset() argument
557 return 0; in sddr55_reset()
561 static unsigned long sddr55_get_capacity(struct us_data *us) { in sddr55_get_capacity() argument
566 struct sddr55_card_info *info = (struct sddr55_card_info *)us->extra; in sddr55_get_capacity()
568 usb_stor_dbg(us, "Reading capacity...\n"); in sddr55_get_capacity()
570 result = sddr55_read_deviceID(us, in sddr55_get_capacity()
574 usb_stor_dbg(us, "Result of read_deviceID is %d\n", result); in sddr55_get_capacity()
577 return 0; in sddr55_get_capacity()
579 usb_stor_dbg(us, "Device ID = %02X\n", deviceID); in sddr55_get_capacity()
580 usb_stor_dbg(us, "Manuf ID = %02X\n", manufacturerID); in sddr55_get_capacity()
583 info->smallpageshift = 0; in sddr55_get_capacity()
590 case 0x6e: // 1MB in sddr55_get_capacity()
591 case 0xe8: in sddr55_get_capacity()
592 case 0xec: in sddr55_get_capacity()
595 return 0x00100000; in sddr55_get_capacity()
597 case 0xea: // 2MB in sddr55_get_capacity()
598 case 0x64: in sddr55_get_capacity()
602 case 0x5d: // 5d is a ROM card with pagesize 512. in sddr55_get_capacity()
603 return 0x00200000; in sddr55_get_capacity()
605 case 0xe3: // 4MB in sddr55_get_capacity()
606 case 0xe5: in sddr55_get_capacity()
607 case 0x6b: in sddr55_get_capacity()
608 case 0xd5: in sddr55_get_capacity()
609 return 0x00400000; in sddr55_get_capacity()
611 case 0xe6: // 8MB in sddr55_get_capacity()
612 case 0xd6: in sddr55_get_capacity()
613 return 0x00800000; in sddr55_get_capacity()
615 case 0x73: // 16MB in sddr55_get_capacity()
619 return 0x01000000; in sddr55_get_capacity()
621 case 0x75: // 32MB in sddr55_get_capacity()
625 return 0x02000000; in sddr55_get_capacity()
627 case 0x76: // 64MB in sddr55_get_capacity()
631 return 0x04000000; in sddr55_get_capacity()
633 case 0x79: // 128MB in sddr55_get_capacity()
637 return 0x08000000; in sddr55_get_capacity()
640 return 0; in sddr55_get_capacity()
645 static int sddr55_read_map(struct us_data *us) { in sddr55_read_map() argument
647 struct sddr55_card_info *info = (struct sddr55_card_info *)(us->extra); in sddr55_read_map()
650 unsigned char *command = us->iobuf; in sddr55_read_map()
666 memset(command, 0, 8); in sddr55_read_map()
667 command[5] = 0xB0; in sddr55_read_map()
669 command[7] = 0x8A; in sddr55_read_map()
671 result = sddr55_bulk_transport(us, DMA_TO_DEVICE, command, 8); in sddr55_read_map()
678 result = sddr55_bulk_transport(us, DMA_FROM_DEVICE, buffer, numblocks * 2); in sddr55_read_map()
685 result = sddr55_bulk_transport(us, DMA_FROM_DEVICE, command, 2); in sddr55_read_map()
706 memset(info->lba_to_pba, 0xff, numblocks*sizeof(int)); in sddr55_read_map()
707 memset(info->pba_to_lba, 0xff, numblocks*sizeof(int)); in sddr55_read_map()
719 for (i=0; i<numblocks; i++) { in sddr55_read_map()
729 * 1024-2047 you will find LBA 0-999 which are in sddr55_read_map()
737 * SDDR55 returns 0xffff for a bad block, and 0x400 for the in sddr55_read_map()
756 if (lba<0x10 || (lba>=0x3E0 && lba<0x3EF)) in sddr55_read_map()
757 usb_stor_dbg(us, "LBA %04X <-> PBA %04X\n", lba, i); in sddr55_read_map()
763 return 0; in sddr55_read_map()
781 static int sddr55_transport(struct scsi_cmnd *srb, struct us_data *us) in sddr55_transport() argument
785 0x00, 0x80, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x00 in sddr55_transport()
789 0x0, 0x12, 0x00, 0x80, 0x0, 0x0, 0x0, 0x0, in sddr55_transport()
790 0x01, 0x0A, in sddr55_transport()
791 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 in sddr55_transport()
793 unsigned char *ptr = us->iobuf; in sddr55_transport()
801 if (!us->extra) { in sddr55_transport()
802 us->extra = kzalloc( in sddr55_transport()
804 if (!us->extra) in sddr55_transport()
806 us->extra_destructor = sddr55_card_info_destructor; in sddr55_transport()
809 info = (struct sddr55_card_info *)(us->extra); in sddr55_transport()
811 if (srb->cmnd[0] == REQUEST_SENSE) { in sddr55_transport()
812 usb_stor_dbg(us, "request sense %02x/%02x/%02x\n", in sddr55_transport()
818 ptr[0] = 0x70; in sddr55_transport()
821 memset (info->sense_data, 0, sizeof info->sense_data); in sddr55_transport()
826 memset (info->sense_data, 0, sizeof info->sense_data); in sddr55_transport()
833 if (srb->cmnd[0] == INQUIRY) { in sddr55_transport()
835 fill_inquiry_response(us, ptr, 36); in sddr55_transport()
846 result = sddr55_status (us); in sddr55_transport()
848 result = sddr55_status (us); in sddr55_transport()
850 set_sense_info (6, 0x28, 0); /* new media, set unit attention, not ready to ready */ in sddr55_transport()
862 set_sense_info (3, 0x31, 0); in sddr55_transport()
866 if (srb->cmnd[0] == READ_CAPACITY) { in sddr55_transport()
868 capacity = sddr55_get_capacity(us); in sddr55_transport()
871 set_sense_info (3, 0x30, 0); /* incompatible medium */ in sddr55_transport()
892 ((__be32 *) ptr)[0] = cpu_to_be32(capacity); in sddr55_transport()
896 sddr55_read_map(us); in sddr55_transport()
901 if (srb->cmnd[0] == MODE_SENSE_10) { in sddr55_transport()
904 ptr[3] = (info->read_only || info->force_read_only) ? 0x80 : 0; in sddr55_transport()
907 if ( (srb->cmnd[2] & 0x3F) == 0x01 ) { in sddr55_transport()
908 usb_stor_dbg(us, "Dummy up request for mode page 1\n"); in sddr55_transport()
911 } else if ( (srb->cmnd[2] & 0x3F) == 0x3F ) { in sddr55_transport()
912 usb_stor_dbg(us, "Dummy up request for all mode pages\n"); in sddr55_transport()
916 set_sense_info (5, 0x24, 0); /* invalid field in command */ in sddr55_transport()
920 if (srb->cmnd[0] == ALLOW_MEDIUM_REMOVAL) { in sddr55_transport()
922 usb_stor_dbg(us, "%s medium removal. Not that I can do anything about it...\n", in sddr55_transport()
923 (srb->cmnd[4]&0x03) ? "Prevent" : "Allow"); in sddr55_transport()
929 if (srb->cmnd[0] == READ_10 || srb->cmnd[0] == WRITE_10) { in sddr55_transport()
947 usb_stor_dbg(us, "Error: Requested LBA %04X exceeds maximum block %04X\n", in sddr55_transport()
950 set_sense_info (5, 0x24, 0); /* invalid field in command */ in sddr55_transport()
957 if (srb->cmnd[0] == WRITE_10) { in sddr55_transport()
958 usb_stor_dbg(us, "WRITE_10: write block %04X (LBA %04X) page %01X pages %d\n", in sddr55_transport()
961 return sddr55_write_data(us, lba, page, pages); in sddr55_transport()
963 usb_stor_dbg(us, "READ_10: read block %04X (LBA %04X) page %01X pages %d\n", in sddr55_transport()
966 return sddr55_read_data(us, lba, page, pages); in sddr55_transport()
971 if (srb->cmnd[0] == TEST_UNIT_READY) { in sddr55_transport()
975 if (srb->cmnd[0] == START_STOP) { in sddr55_transport()
979 set_sense_info (5, 0x20, 0); /* illegal command */ in sddr55_transport()
989 struct us_data *us; in sddr55_probe() local
992 result = usb_stor_probe1(&us, intf, id, in sddr55_probe()
998 us->transport_name = "SDDR55"; in sddr55_probe()
999 us->transport = sddr55_transport; in sddr55_probe()
1000 us->transport_reset = sddr55_reset; in sddr55_probe()
1001 us->max_lun = 0; in sddr55_probe()
1003 result = usb_stor_probe2(us); in sddr55_probe()