usb-storage: make karma a separate module

This patch (as1216) converts usb-storage's karma subdriver into a
separate module.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Alan Stern 2009-02-12 14:48:26 -05:00 committed by Greg Kroah-Hartman
parent a74bba3bf9
commit c10337846c
8 changed files with 123 additions and 33 deletions

View File

@ -144,7 +144,7 @@ config USB_STORAGE_ONETOUCH
cuts) cuts)
config USB_STORAGE_KARMA config USB_STORAGE_KARMA
bool "Support for Rio Karma music player" tristate "Support for Rio Karma music player"
depends on USB_STORAGE depends on USB_STORAGE
help help
Say Y here to include additional code to support the Rio Karma Say Y here to include additional code to support the Rio Karma
@ -155,6 +155,8 @@ config USB_STORAGE_KARMA
on the resulting scsi device node returns the Karma to normal on the resulting scsi device node returns the Karma to normal
operation. operation.
If this driver is compiled as a module, it will be named ums-karma.
config USB_STORAGE_CYPRESS_ATACB config USB_STORAGE_CYPRESS_ATACB
tristate "SAT emulation on Cypress USB/ATA Bridge with ATACB" tristate "SAT emulation on Cypress USB/ATA Bridge with ATACB"
depends on USB_STORAGE depends on USB_STORAGE

View File

@ -11,7 +11,6 @@ obj-$(CONFIG_USB_STORAGE) += usb-storage.o
usb-storage-obj-$(CONFIG_USB_STORAGE_DEBUG) += debug.o usb-storage-obj-$(CONFIG_USB_STORAGE_DEBUG) += debug.o
usb-storage-obj-$(CONFIG_USB_STORAGE_ONETOUCH) += onetouch.o usb-storage-obj-$(CONFIG_USB_STORAGE_ONETOUCH) += onetouch.o
usb-storage-obj-$(CONFIG_USB_STORAGE_KARMA) += karma.o
usb-storage-objs := scsiglue.o protocol.o transport.o usb.o \ usb-storage-objs := scsiglue.o protocol.o transport.o usb.o \
initializers.o sierra_ms.o option_ms.o $(usb-storage-obj-y) initializers.o sierra_ms.o option_ms.o $(usb-storage-obj-y)
@ -28,6 +27,7 @@ obj-$(CONFIG_USB_STORAGE_DATAFAB) += ums-datafab.o
obj-$(CONFIG_USB_STORAGE_FREECOM) += ums-freecom.o obj-$(CONFIG_USB_STORAGE_FREECOM) += ums-freecom.o
obj-$(CONFIG_USB_STORAGE_ISD200) += ums-isd200.o obj-$(CONFIG_USB_STORAGE_ISD200) += ums-isd200.o
obj-$(CONFIG_USB_STORAGE_JUMPSHOT) += ums-jumpshot.o obj-$(CONFIG_USB_STORAGE_JUMPSHOT) += ums-jumpshot.o
obj-$(CONFIG_USB_STORAGE_KARMA) += ums-karma.o
obj-$(CONFIG_USB_STORAGE_SDDR09) += ums-sddr09.o obj-$(CONFIG_USB_STORAGE_SDDR09) += ums-sddr09.o
obj-$(CONFIG_USB_STORAGE_SDDR55) += ums-sddr55.o obj-$(CONFIG_USB_STORAGE_SDDR55) += ums-sddr55.o
obj-$(CONFIG_USB_STORAGE_USBAT) += ums-usbat.o obj-$(CONFIG_USB_STORAGE_USBAT) += ums-usbat.o
@ -38,6 +38,7 @@ ums-datafab-objs := datafab.o
ums-freecom-objs := freecom.o ums-freecom-objs := freecom.o
ums-isd200-objs := isd200.o ums-isd200-objs := isd200.o
ums-jumpshot-objs := jumpshot.o ums-jumpshot-objs := jumpshot.o
ums-karma-objs := karma.o
ums-sddr09-objs := sddr09.o ums-sddr09-objs := sddr09.o
ums-sddr55-objs := sddr55.o ums-sddr55-objs := sddr55.o
ums-usbat-objs := shuttle_usbat.o ums-usbat-objs := shuttle_usbat.o

View File

@ -18,6 +18,8 @@
* 675 Mass Ave, Cambridge, MA 02139, USA. * 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#include <linux/module.h>
#include <scsi/scsi.h> #include <scsi/scsi.h>
#include <scsi/scsi_cmnd.h> #include <scsi/scsi_cmnd.h>
#include <scsi/scsi_device.h> #include <scsi/scsi_device.h>
@ -25,7 +27,6 @@
#include "usb.h" #include "usb.h"
#include "transport.h" #include "transport.h"
#include "debug.h" #include "debug.h"
#include "karma.h"
#define RIO_PREFIX "RIOP\x00" #define RIO_PREFIX "RIOP\x00"
#define RIO_PREFIX_LEN 5 #define RIO_PREFIX_LEN 5
@ -36,13 +37,53 @@
#define RIO_LEAVE_STORAGE 0x2 #define RIO_LEAVE_STORAGE 0x2
#define RIO_RESET 0xC #define RIO_RESET 0xC
extern int usb_stor_Bulk_transport(struct scsi_cmnd *, struct us_data *);
struct karma_data { struct karma_data {
int in_storage; int in_storage;
char *recv; char *recv;
}; };
static int rio_karma_init(struct us_data *us);
/*
* The table of devices
*/
#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
vendorName, productName, useProtocol, useTransport, \
initFunction, flags) \
{ USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \
.driver_info = (flags)|(USB_US_TYPE_STOR<<24) }
struct usb_device_id karma_usb_ids[] = {
# include "unusual_karma.h"
{ } /* Terminating entry */
};
MODULE_DEVICE_TABLE(usb, karma_usb_ids);
#undef UNUSUAL_DEV
/*
* The flags table
*/
#define UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax, \
vendor_name, product_name, use_protocol, use_transport, \
init_function, Flags) \
{ \
.vendorName = vendor_name, \
.productName = product_name, \
.useProtocol = use_protocol, \
.useTransport = use_transport, \
.initFunction = init_function, \
}
static struct us_unusual_dev karma_unusual_dev_list[] = {
# include "unusual_karma.h"
{ } /* Terminating entry */
};
#undef UNUSUAL_DEV
/* /*
* Send commands to Rio Karma. * Send commands to Rio Karma.
* *
@ -104,7 +145,7 @@ err:
* Trap START_STOP and READ_10 to leave/re-enter storage mode. * Trap START_STOP and READ_10 to leave/re-enter storage mode.
* Everything else is propagated to the normal bulk layer. * Everything else is propagated to the normal bulk layer.
*/ */
int rio_karma_transport(struct scsi_cmnd *srb, struct us_data *us) static int rio_karma_transport(struct scsi_cmnd *srb, struct us_data *us)
{ {
int ret; int ret;
struct karma_data *data = (struct karma_data *) us->extra; struct karma_data *data = (struct karma_data *) us->extra;
@ -133,7 +174,7 @@ static void rio_karma_destructor(void *extra)
kfree(data->recv); kfree(data->recv);
} }
int rio_karma_init(struct us_data *us) static int rio_karma_init(struct us_data *us)
{ {
int ret = 0; int ret = 0;
struct karma_data *data = kzalloc(sizeof(struct karma_data), GFP_NOIO); struct karma_data *data = kzalloc(sizeof(struct karma_data), GFP_NOIO);
@ -153,3 +194,48 @@ int rio_karma_init(struct us_data *us)
out: out:
return ret; return ret;
} }
static int karma_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
struct us_data *us;
int result;
result = usb_stor_probe1(&us, intf, id,
(id - karma_usb_ids) + karma_unusual_dev_list);
if (result)
return result;
us->transport_name = "Rio Karma/Bulk";
us->transport = rio_karma_transport;
us->transport_reset = usb_stor_Bulk_reset;
result = usb_stor_probe2(us);
return result;
}
static struct usb_driver karma_driver = {
.name = "ums-karma",
.probe = karma_probe,
.disconnect = usb_stor_disconnect,
.suspend = usb_stor_suspend,
.resume = usb_stor_resume,
.reset_resume = usb_stor_reset_resume,
.pre_reset = usb_stor_pre_reset,
.post_reset = usb_stor_post_reset,
.id_table = karma_usb_ids,
.soft_unbind = 1,
};
static int __init karma_init(void)
{
return usb_register(&karma_driver);
}
static void __exit karma_exit(void)
{
usb_deregister(&karma_driver);
}
module_init(karma_init);
module_exit(karma_exit);

View File

@ -1,7 +0,0 @@
#ifndef _KARMA_USB_H
#define _KARMA_USB_H
extern int rio_karma_init(struct us_data *us);
extern int rio_karma_transport(struct scsi_cmnd *srb, struct us_data *us);
#endif

View File

@ -276,13 +276,6 @@ UNUSUAL_DEV( 0x0457, 0x0151, 0x0100, 0x0100,
US_SC_DEVICE, US_PR_DEVICE, NULL, US_SC_DEVICE, US_PR_DEVICE, NULL,
US_FL_NOT_LOCKABLE ), US_FL_NOT_LOCKABLE ),
#ifdef CONFIG_USB_STORAGE_KARMA
UNUSUAL_DEV( 0x045a, 0x5210, 0x0101, 0x0101,
"Rio",
"Rio Karma",
US_SC_SCSI, US_PR_KARMA, rio_karma_init, 0),
#endif
/* Reported by Tamas Kerecsen <kerecsen@bigfoot.com> /* Reported by Tamas Kerecsen <kerecsen@bigfoot.com>
* Obviously the PROM has not been customized by the VAR; * Obviously the PROM has not been customized by the VAR;
* the Vendor and Product string descriptors are: * the Vendor and Product string descriptors are:

View File

@ -0,0 +1,26 @@
/* Unusual Devices File for the Rio Karma
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2, or (at your option) any
* later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#if defined(CONFIG_USB_STORAGE_KARMA) || \
defined(CONFIG_USB_STORAGE_KARMA_MODULE)
UNUSUAL_DEV( 0x045a, 0x5210, 0x0101, 0x0101,
"Rio",
"Rio Karma",
US_SC_SCSI, US_PR_KARMA, rio_karma_init, 0),
#endif /* defined(CONFIG_USB_STORAGE_KARMA) || ... */

View File

@ -69,9 +69,6 @@
#ifdef CONFIG_USB_STORAGE_ONETOUCH #ifdef CONFIG_USB_STORAGE_ONETOUCH
#include "onetouch.h" #include "onetouch.h"
#endif #endif
#ifdef CONFIG_USB_STORAGE_KARMA
#include "karma.h"
#endif
#include "sierra_ms.h" #include "sierra_ms.h"
#include "option_ms.h" #include "option_ms.h"
@ -594,15 +591,6 @@ static void get_transport(struct us_data *us)
us->transport = usb_stor_Bulk_transport; us->transport = usb_stor_Bulk_transport;
us->transport_reset = usb_stor_Bulk_reset; us->transport_reset = usb_stor_Bulk_reset;
break; break;
#ifdef CONFIG_USB_STORAGE_KARMA
case US_PR_KARMA:
us->transport_name = "Rio Karma/Bulk";
us->transport = rio_karma_transport;
us->transport_reset = usb_stor_Bulk_reset;
break;
#endif
} }
} }

View File

@ -83,6 +83,7 @@ static struct ignore_entry ignore_ids[] = {
# include "unusual_freecom.h" # include "unusual_freecom.h"
# include "unusual_isd200.h" # include "unusual_isd200.h"
# include "unusual_jumpshot.h" # include "unusual_jumpshot.h"
# include "unusual_karma.h"
# include "unusual_sddr09.h" # include "unusual_sddr09.h"
# include "unusual_sddr55.h" # include "unusual_sddr55.h"
# include "unusual_usbat.h" # include "unusual_usbat.h"