aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/storage/Kconfig4
-rw-r--r--drivers/usb/storage/Makefile3
-rw-r--r--drivers/usb/storage/cypress_atacb.c88
-rw-r--r--drivers/usb/storage/unusual_cypress.h (renamed from drivers/usb/storage/cypress_atacb.h)27
-rw-r--r--drivers/usb/storage/unusual_devs.h16
-rw-r--r--drivers/usb/storage/usb.c11
-rw-r--r--drivers/usb/storage/usual-tables.c1
7 files changed, 111 insertions, 39 deletions
diff --git a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig
index e6cc245257f8..2c73fa97d94d 100644
--- a/drivers/usb/storage/Kconfig
+++ b/drivers/usb/storage/Kconfig
@@ -146,7 +146,7 @@ config USB_STORAGE_KARMA
146 operation. 146 operation.
147 147
148config USB_STORAGE_CYPRESS_ATACB 148config USB_STORAGE_CYPRESS_ATACB
149 bool "SAT emulation on Cypress USB/ATA Bridge with ATACB" 149 tristate "SAT emulation on Cypress USB/ATA Bridge with ATACB"
150 depends on USB_STORAGE 150 depends on USB_STORAGE
151 ---help--- 151 ---help---
152 Say Y here if you want to use SAT (ata pass through) on devices based 152 Say Y here if you want to use SAT (ata pass through) on devices based
@@ -156,6 +156,8 @@ config USB_STORAGE_CYPRESS_ATACB
156 If you say no here your device will still work with the standard usb 156 If you say no here your device will still work with the standard usb
157 mass storage class. 157 mass storage class.
158 158
159 If this driver is compiled as a module, it will be named ums-cypress.
160
159config USB_LIBUSUAL 161config USB_LIBUSUAL
160 bool "The shared table of common (or usual) storage devices" 162 bool "The shared table of common (or usual) storage devices"
161 depends on USB 163 depends on USB
diff --git a/drivers/usb/storage/Makefile b/drivers/usb/storage/Makefile
index 5fb7847e41a4..0650f022e561 100644
--- a/drivers/usb/storage/Makefile
+++ b/drivers/usb/storage/Makefile
@@ -17,7 +17,6 @@ usb-storage-obj-$(CONFIG_USB_STORAGE_JUMPSHOT) += jumpshot.o
17usb-storage-obj-$(CONFIG_USB_STORAGE_ALAUDA) += alauda.o 17usb-storage-obj-$(CONFIG_USB_STORAGE_ALAUDA) += alauda.o
18usb-storage-obj-$(CONFIG_USB_STORAGE_ONETOUCH) += onetouch.o 18usb-storage-obj-$(CONFIG_USB_STORAGE_ONETOUCH) += onetouch.o
19usb-storage-obj-$(CONFIG_USB_STORAGE_KARMA) += karma.o 19usb-storage-obj-$(CONFIG_USB_STORAGE_KARMA) += karma.o
20usb-storage-obj-$(CONFIG_USB_STORAGE_CYPRESS_ATACB) += cypress_atacb.o
21 20
22usb-storage-objs := scsiglue.o protocol.o transport.o usb.o \ 21usb-storage-objs := scsiglue.o protocol.o transport.o usb.o \
23 initializers.o sierra_ms.o option_ms.o $(usb-storage-obj-y) 22 initializers.o sierra_ms.o option_ms.o $(usb-storage-obj-y)
@@ -28,10 +27,12 @@ else
28 obj-$(CONFIG_USB) += libusual.o usual-tables.o 27 obj-$(CONFIG_USB) += libusual.o usual-tables.o
29endif 28endif
30 29
30obj-$(CONFIG_USB_STORAGE_CYPRESS_ATACB) += ums-cypress.o
31obj-$(CONFIG_USB_STORAGE_ISD200) += ums-isd200.o 31obj-$(CONFIG_USB_STORAGE_ISD200) += ums-isd200.o
32obj-$(CONFIG_USB_STORAGE_SDDR09) += ums-sddr09.o 32obj-$(CONFIG_USB_STORAGE_SDDR09) += ums-sddr09.o
33obj-$(CONFIG_USB_STORAGE_SDDR55) += ums-sddr55.o 33obj-$(CONFIG_USB_STORAGE_SDDR55) += ums-sddr55.o
34 34
35ums-cypress-objs := cypress_atacb.o
35ums-isd200-objs := isd200.o 36ums-isd200-objs := isd200.o
36ums-sddr09-objs := sddr09.o 37ums-sddr09-objs := sddr09.o
37ums-sddr55-objs := sddr55.o 38ums-sddr55-objs := sddr55.o
diff --git a/drivers/usb/storage/cypress_atacb.c b/drivers/usb/storage/cypress_atacb.c
index 9466a99baab6..19306f7b1dae 100644
--- a/drivers/usb/storage/cypress_atacb.c
+++ b/drivers/usb/storage/cypress_atacb.c
@@ -19,6 +19,7 @@
19 * 675 Mass Ave, Cambridge, MA 02139, USA. 19 * 675 Mass Ave, Cambridge, MA 02139, USA.
20 */ 20 */
21 21
22#include <linux/module.h>
22#include <scsi/scsi.h> 23#include <scsi/scsi.h>
23#include <scsi/scsi_cmnd.h> 24#include <scsi/scsi_cmnd.h>
24#include <scsi/scsi_eh.h> 25#include <scsi/scsi_eh.h>
@@ -29,6 +30,46 @@
29#include "scsiglue.h" 30#include "scsiglue.h"
30#include "debug.h" 31#include "debug.h"
31 32
33
34/*
35 * The table of devices
36 */
37#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
38 vendorName, productName, useProtocol, useTransport, \
39 initFunction, flags) \
40{ USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \
41 .driver_info = (flags)|(USB_US_TYPE_STOR<<24) }
42
43struct usb_device_id cypress_usb_ids[] = {
44# include "unusual_cypress.h"
45 { } /* Terminating entry */
46};
47MODULE_DEVICE_TABLE(usb, cypress_usb_ids);
48
49#undef UNUSUAL_DEV
50
51/*
52 * The flags table
53 */
54#define UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax, \
55 vendor_name, product_name, use_protocol, use_transport, \
56 init_function, Flags) \
57{ \
58 .vendorName = vendor_name, \
59 .productName = product_name, \
60 .useProtocol = use_protocol, \
61 .useTransport = use_transport, \
62 .initFunction = init_function, \
63}
64
65static struct us_unusual_dev cypress_unusual_dev_list[] = {
66# include "unusual_cypress.h"
67 { } /* Terminating entry */
68};
69
70#undef UNUSUAL_DEV
71
72
32/* 73/*
33 * ATACB is a protocol used on cypress usb<->ata bridge to 74 * ATACB is a protocol used on cypress usb<->ata bridge to
34 * send raw ATA command over mass storage 75 * send raw ATA command over mass storage
@@ -36,7 +77,7 @@
36 * More info that be found on cy7c68310_8.pdf and cy7c68300c_8.pdf 77 * More info that be found on cy7c68310_8.pdf and cy7c68300c_8.pdf
37 * datasheet from cypress.com. 78 * datasheet from cypress.com.
38 */ 79 */
39void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us) 80static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
40{ 81{
41 unsigned char save_cmnd[MAX_COMMAND_SIZE]; 82 unsigned char save_cmnd[MAX_COMMAND_SIZE];
42 83
@@ -197,3 +238,48 @@ end:
197 if (srb->cmnd[0] == ATA_12) 238 if (srb->cmnd[0] == ATA_12)
198 srb->cmd_len = 12; 239 srb->cmd_len = 12;
199} 240}
241
242
243static int cypress_probe(struct usb_interface *intf,
244 const struct usb_device_id *id)
245{
246 struct us_data *us;
247 int result;
248
249 result = usb_stor_probe1(&us, intf, id,
250 (id - cypress_usb_ids) + cypress_unusual_dev_list);
251 if (result)
252 return result;
253
254 us->protocol_name = "Transparent SCSI with Cypress ATACB";
255 us->proto_handler = cypress_atacb_passthrough;
256
257 result = usb_stor_probe2(us);
258 return result;
259}
260
261static struct usb_driver cypress_driver = {
262 .name = "ums-cypress",
263 .probe = cypress_probe,
264 .disconnect = usb_stor_disconnect,
265 .suspend = usb_stor_suspend,
266 .resume = usb_stor_resume,
267 .reset_resume = usb_stor_reset_resume,
268 .pre_reset = usb_stor_pre_reset,
269 .post_reset = usb_stor_post_reset,
270 .id_table = cypress_usb_ids,
271 .soft_unbind = 1,
272};
273
274static int __init cypress_init(void)
275{
276 return usb_register(&cypress_driver);
277}
278
279static void __exit cypress_exit(void)
280{
281 usb_deregister(&cypress_driver);
282}
283
284module_init(cypress_init);
285module_exit(cypress_exit);
diff --git a/drivers/usb/storage/cypress_atacb.h b/drivers/usb/storage/unusual_cypress.h
index fbada898d56b..44be6d75dab6 100644
--- a/drivers/usb/storage/cypress_atacb.h
+++ b/drivers/usb/storage/unusual_cypress.h
@@ -1,8 +1,5 @@
1/* 1/* Unusual Devices File for devices based on the Cypress USB/ATA bridge
2 * Support for emulating SAT (ata pass through) on devices based 2 * with support for ATACB
3 * on the Cypress USB/ATA bridge supporting ATACB.
4 *
5 * Copyright (c) 2008 Matthieu Castet (castet.matthieu@free.fr)
6 * 3 *
7 * This program is free software; you can redistribute it and/or modify it 4 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the 5 * under the terms of the GNU General Public License as published by the
@@ -19,7 +16,19 @@
19 * 675 Mass Ave, Cambridge, MA 02139, USA. 16 * 675 Mass Ave, Cambridge, MA 02139, USA.
20 */ 17 */
21 18
22#ifndef _CYPRESS_ATACB_H_ 19#if defined(CONFIG_USB_STORAGE_CYPRESS_ATACB) || \
23#define _CYPRESS_ATACB_H_ 20 defined(CONFIG_USB_STORAGE_CYPRESS_ATACB_MODULE)
24extern void cypress_atacb_passthrough(struct scsi_cmnd*, struct us_data*); 21
25#endif 22/* CY7C68300 : support atacb */
23UNUSUAL_DEV( 0x04b4, 0x6830, 0x0000, 0x9999,
24 "Cypress",
25 "Cypress AT2LP",
26 US_SC_CYP_ATACB, US_PR_DEVICE, NULL, 0),
27
28/* CY7C68310 : support atacb and atacb2 */
29UNUSUAL_DEV( 0x04b4, 0x6831, 0x0000, 0x9999,
30 "Cypress",
31 "Cypress ISD-300LP",
32 US_SC_CYP_ATACB, US_PR_DEVICE, NULL, 0),
33
34#endif /* defined(CONFIG_USB_STORAGE_CYPRESS_ATACB) || ... */
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
index 50034e141f94..eff97aed7bfe 100644
--- a/drivers/usb/storage/unusual_devs.h
+++ b/drivers/usb/storage/unusual_devs.h
@@ -375,22 +375,6 @@ UNUSUAL_DEV( 0x04b3, 0x4001, 0x0110, 0x0110,
375 US_SC_DEVICE, US_PR_CB, NULL, 375 US_SC_DEVICE, US_PR_CB, NULL,
376 US_FL_MAX_SECTORS_MIN), 376 US_FL_MAX_SECTORS_MIN),
377 377
378#ifdef CONFIG_USB_STORAGE_CYPRESS_ATACB
379/* CY7C68300 : support atacb */
380UNUSUAL_DEV( 0x04b4, 0x6830, 0x0000, 0x9999,
381 "Cypress",
382 "Cypress AT2LP",
383 US_SC_CYP_ATACB, US_PR_DEVICE, NULL,
384 0),
385
386/* CY7C68310 : support atacb and atacb2 */
387UNUSUAL_DEV( 0x04b4, 0x6831, 0x0000, 0x9999,
388 "Cypress",
389 "Cypress ISD-300LP",
390 US_SC_CYP_ATACB, US_PR_DEVICE, NULL,
391 0),
392#endif
393
394/* Reported by Simon Levitt <simon@whattf.com> 378/* Reported by Simon Levitt <simon@whattf.com>
395 * This entry needs Sub and Proto fields */ 379 * This entry needs Sub and Proto fields */
396UNUSUAL_DEV( 0x04b8, 0x0601, 0x0100, 0x0100, 380UNUSUAL_DEV( 0x04b8, 0x0601, 0x0100, 0x0100,
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
index 238f271d8171..241e1944cf10 100644
--- a/drivers/usb/storage/usb.c
+++ b/drivers/usb/storage/usb.c
@@ -87,9 +87,6 @@
87#ifdef CONFIG_USB_STORAGE_KARMA 87#ifdef CONFIG_USB_STORAGE_KARMA
88#include "karma.h" 88#include "karma.h"
89#endif 89#endif
90#ifdef CONFIG_USB_STORAGE_CYPRESS_ATACB
91#include "cypress_atacb.h"
92#endif
93#include "sierra_ms.h" 90#include "sierra_ms.h"
94#include "option_ms.h" 91#include "option_ms.h"
95 92
@@ -705,14 +702,6 @@ static void get_protocol(struct us_data *us)
705 us->protocol_name = "Uniform Floppy Interface (UFI)"; 702 us->protocol_name = "Uniform Floppy Interface (UFI)";
706 us->proto_handler = usb_stor_ufi_command; 703 us->proto_handler = usb_stor_ufi_command;
707 break; 704 break;
708
709#ifdef CONFIG_USB_STORAGE_CYPRESS_ATACB
710 case US_SC_CYP_ATACB:
711 us->protocol_name = "Transparent SCSI with Cypress ATACB";
712 us->proto_handler = cypress_atacb_passthrough;
713 break;
714#endif
715
716 } 705 }
717} 706}
718 707
diff --git a/drivers/usb/storage/usual-tables.c b/drivers/usb/storage/usual-tables.c
index 5f2703fa48e6..be461ee9f005 100644
--- a/drivers/usb/storage/usual-tables.c
+++ b/drivers/usb/storage/usual-tables.c
@@ -77,6 +77,7 @@ struct ignore_entry {
77} 77}
78 78
79static struct ignore_entry ignore_ids[] = { 79static struct ignore_entry ignore_ids[] = {
80# include "unusual_cypress.h"
80# include "unusual_isd200.h" 81# include "unusual_isd200.h"
81# include "unusual_sddr09.h" 82# include "unusual_sddr09.h"
82# include "unusual_sddr55.h" 83# include "unusual_sddr55.h"