mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 09:59:32 +00:00
[PATCH] USB: shuttle_usbat: Hardcode detection of HP CDRW devices
Use USB vendor and product IDs to determine whether the attached device is a CDROM or a Flash device. Daniel Drake says that the *same* vendor and product IDs for non-HP vendor ID could be either flash or cdrom, so try to probe for them. Signed-off-by: Peter Chubb <peterc@gelato.unsw.edu.au> Signed-off-by: Daniel Drake <dsd@gentoo.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
141804d401
commit
bdcfd9e349
3 changed files with 43 additions and 20 deletions
|
@ -893,22 +893,28 @@ static int usbat_identify_device(struct us_data *us,
|
||||||
* Set the transport function based on the device type
|
* Set the transport function based on the device type
|
||||||
*/
|
*/
|
||||||
static int usbat_set_transport(struct us_data *us,
|
static int usbat_set_transport(struct us_data *us,
|
||||||
struct usbat_info *info)
|
struct usbat_info *info,
|
||||||
|
int devicetype)
|
||||||
{
|
{
|
||||||
int rc;
|
|
||||||
|
|
||||||
if (!info->devicetype) {
|
if (!info->devicetype)
|
||||||
rc = usbat_identify_device(us, info);
|
info->devicetype = devicetype;
|
||||||
if (rc != USB_STOR_TRANSPORT_GOOD) {
|
|
||||||
US_DEBUGP("usbat_set_transport: Could not identify device\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (usbat_get_device_type(us) == USBAT_DEV_HP8200)
|
if (!info->devicetype)
|
||||||
|
usbat_identify_device(us, info);
|
||||||
|
|
||||||
|
switch (info->devicetype) {
|
||||||
|
default:
|
||||||
|
return USB_STOR_TRANSPORT_ERROR;
|
||||||
|
|
||||||
|
case USBAT_DEV_HP8200:
|
||||||
us->transport = usbat_hp8200e_transport;
|
us->transport = usbat_hp8200e_transport;
|
||||||
else if (usbat_get_device_type(us) == USBAT_DEV_FLASH)
|
break;
|
||||||
|
|
||||||
|
case USBAT_DEV_FLASH:
|
||||||
us->transport = usbat_flash_transport;
|
us->transport = usbat_flash_transport;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1316,7 +1322,7 @@ static int usbat_select_and_test_registers(struct us_data *us)
|
||||||
/*
|
/*
|
||||||
* Initialize the USBAT processor and the storage device
|
* Initialize the USBAT processor and the storage device
|
||||||
*/
|
*/
|
||||||
int init_usbat(struct us_data *us)
|
static int init_usbat(struct us_data *us, int devicetype)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
struct usbat_info *info;
|
struct usbat_info *info;
|
||||||
|
@ -1398,7 +1404,7 @@ int init_usbat(struct us_data *us)
|
||||||
US_DEBUGP("INIT 9\n");
|
US_DEBUGP("INIT 9\n");
|
||||||
|
|
||||||
/* At this point, we need to detect which device we are using */
|
/* At this point, we need to detect which device we are using */
|
||||||
if (usbat_set_transport(us, info))
|
if (usbat_set_transport(us, info, devicetype))
|
||||||
return USB_STOR_TRANSPORT_ERROR;
|
return USB_STOR_TRANSPORT_ERROR;
|
||||||
|
|
||||||
US_DEBUGP("INIT 10\n");
|
US_DEBUGP("INIT 10\n");
|
||||||
|
@ -1701,6 +1707,22 @@ static int usbat_flash_transport(struct scsi_cmnd * srb, struct us_data *us)
|
||||||
return USB_STOR_TRANSPORT_FAILED;
|
return USB_STOR_TRANSPORT_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int init_usbat_cd(struct us_data *us)
|
||||||
|
{
|
||||||
|
return init_usbat(us, USBAT_DEV_HP8200);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int init_usbat_flash(struct us_data *us)
|
||||||
|
{
|
||||||
|
return init_usbat(us, USBAT_DEV_FLASH);
|
||||||
|
}
|
||||||
|
|
||||||
|
int init_usbat_probe(struct us_data *us)
|
||||||
|
{
|
||||||
|
return init_usbat(us, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Default transport function. Attempts to detect which transport function
|
* Default transport function. Attempts to detect which transport function
|
||||||
* should be called, makes it the new default, and calls it.
|
* should be called, makes it the new default, and calls it.
|
||||||
|
@ -1714,9 +1736,8 @@ int usbat_transport(struct scsi_cmnd *srb, struct us_data *us)
|
||||||
{
|
{
|
||||||
struct usbat_info *info = (struct usbat_info*) (us->extra);
|
struct usbat_info *info = (struct usbat_info*) (us->extra);
|
||||||
|
|
||||||
if (usbat_set_transport(us, info))
|
if (usbat_set_transport(us, info, 0))
|
||||||
return USB_STOR_TRANSPORT_ERROR;
|
return USB_STOR_TRANSPORT_ERROR;
|
||||||
|
|
||||||
return us->transport(srb, us);
|
return us->transport(srb, us);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,9 @@
|
||||||
#define USBAT_FEAT_ET2 0x01
|
#define USBAT_FEAT_ET2 0x01
|
||||||
|
|
||||||
extern int usbat_transport(struct scsi_cmnd *srb, struct us_data *us);
|
extern int usbat_transport(struct scsi_cmnd *srb, struct us_data *us);
|
||||||
extern int init_usbat(struct us_data *us);
|
extern int init_usbat_cd(struct us_data *us);
|
||||||
|
extern int init_usbat_flash(struct us_data *us);
|
||||||
|
extern int init_usbat_probe(struct us_data *us);
|
||||||
|
|
||||||
struct usbat_info {
|
struct usbat_info {
|
||||||
int devicetype;
|
int devicetype;
|
||||||
|
|
|
@ -78,12 +78,12 @@ UNUSUAL_DEV( 0x03f0, 0x0107, 0x0200, 0x0200,
|
||||||
UNUSUAL_DEV( 0x03f0, 0x0207, 0x0001, 0x0001,
|
UNUSUAL_DEV( 0x03f0, 0x0207, 0x0001, 0x0001,
|
||||||
"HP",
|
"HP",
|
||||||
"CD-Writer+ 8200e",
|
"CD-Writer+ 8200e",
|
||||||
US_SC_8070, US_PR_USBAT, init_usbat, 0),
|
US_SC_8070, US_PR_USBAT, init_usbat_cd, 0),
|
||||||
|
|
||||||
UNUSUAL_DEV( 0x03f0, 0x0307, 0x0001, 0x0001,
|
UNUSUAL_DEV( 0x03f0, 0x0307, 0x0001, 0x0001,
|
||||||
"HP",
|
"HP",
|
||||||
"CD-Writer+ CD-4e",
|
"CD-Writer+ CD-4e",
|
||||||
US_SC_8070, US_PR_USBAT, init_usbat, 0),
|
US_SC_8070, US_PR_USBAT, init_usbat_cd, 0),
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Reported by Sebastian Kapfer <sebastian_kapfer@gmx.net>
|
/* Reported by Sebastian Kapfer <sebastian_kapfer@gmx.net>
|
||||||
|
@ -393,7 +393,7 @@ UNUSUAL_DEV( 0x04fc, 0x80c2, 0x0100, 0x0100,
|
||||||
UNUSUAL_DEV( 0x04e6, 0x1010, 0x0000, 0x9999,
|
UNUSUAL_DEV( 0x04e6, 0x1010, 0x0000, 0x9999,
|
||||||
"Shuttle/SCM",
|
"Shuttle/SCM",
|
||||||
"USBAT-02",
|
"USBAT-02",
|
||||||
US_SC_SCSI, US_PR_USBAT, init_usbat,
|
US_SC_SCSI, US_PR_USBAT, init_usbat_probe,
|
||||||
US_FL_SINGLE_LUN),
|
US_FL_SINGLE_LUN),
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -797,7 +797,7 @@ UNUSUAL_DEV( 0x0781, 0x0002, 0x0009, 0x0009,
|
||||||
UNUSUAL_DEV( 0x0781, 0x0005, 0x0005, 0x0005,
|
UNUSUAL_DEV( 0x0781, 0x0005, 0x0005, 0x0005,
|
||||||
"Sandisk",
|
"Sandisk",
|
||||||
"ImageMate SDDR-05b",
|
"ImageMate SDDR-05b",
|
||||||
US_SC_SCSI, US_PR_USBAT, init_usbat,
|
US_SC_SCSI, US_PR_USBAT, init_usbat_flash,
|
||||||
US_FL_SINGLE_LUN ),
|
US_FL_SINGLE_LUN ),
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue