git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
vserver 1.9.3
[linux-2.6.git]
/
drivers
/
usb
/
storage
/
transport.c
diff --git
a/drivers/usb/storage/transport.c
b/drivers/usb/storage/transport.c
index
2321558
..
42f7843
100644
(file)
--- a/
drivers/usb/storage/transport.c
+++ b/
drivers/usb/storage/transport.c
@@
-46,15
+46,20
@@
*/
#include <linux/config.h>
*/
#include <linux/config.h>
+#include <linux/sched.h>
+#include <linux/errno.h>
+#include <linux/slab.h>
+
+#include <scsi/scsi.h>
+#include <scsi/scsi_cmnd.h>
+#include <scsi/scsi_device.h>
+
#include "transport.h"
#include "protocol.h"
#include "scsiglue.h"
#include "usb.h"
#include "debug.h"
#include "transport.h"
#include "protocol.h"
#include "scsiglue.h"
#include "usb.h"
#include "debug.h"
-#include <linux/sched.h>
-#include <linux/errno.h>
-#include <linux/slab.h>
/***********************************************************************
* Data transfer routines
/***********************************************************************
* Data transfer routines
@@
-260,9
+265,7
@@
int usb_stor_clear_halt(struct us_data *us, unsigned int pipe)
USB_ENDPOINT_HALT, endp,
NULL, 0, 3*HZ);
USB_ENDPOINT_HALT, endp,
NULL, 0, 3*HZ);
- /* reset the toggles and endpoint flags */
- usb_endpoint_running(us->pusb_dev, usb_pipeendpoint(pipe),
- usb_pipeout(pipe));
+ /* reset the endpoint toggle */
usb_settoggle(us->pusb_dev, usb_pipeendpoint(pipe),
usb_pipeout(pipe), 0);
usb_settoggle(us->pusb_dev, usb_pipeendpoint(pipe),
usb_pipeout(pipe), 0);
@@
-522,7
+525,7
@@
int usb_stor_bulk_transfer_sg(struct us_data* us, unsigned int pipe,
* This is used by the protocol layers to actually send the message to
* the device and receive the response.
*/
* This is used by the protocol layers to actually send the message to
* the device and receive the response.
*/
-void usb_stor_invoke_transport(
Scsi_C
mnd *srb, struct us_data *us)
+void usb_stor_invoke_transport(
struct scsi_c
mnd *srb, struct us_data *us)
{
int need_auto_sense;
int result;
{
int need_auto_sense;
int result;
@@
-569,7
+572,7
@@
void usb_stor_invoke_transport(Scsi_Cmnd *srb, struct us_data *us)
* can signal most data-in errors by stalling the bulk-in pipe.
*/
if ((us->protocol == US_PR_CB || us->protocol == US_PR_DPCM_USB) &&
* can signal most data-in errors by stalling the bulk-in pipe.
*/
if ((us->protocol == US_PR_CB || us->protocol == US_PR_DPCM_USB) &&
- srb->sc_data_direction !=
SCSI_DATA_READ
) {
+ srb->sc_data_direction !=
DMA_FROM_DEVICE
) {
US_DEBUGP("-- CB transport device requiring auto-sense\n");
need_auto_sense = 1;
}
US_DEBUGP("-- CB transport device requiring auto-sense\n");
need_auto_sense = 1;
}
@@
-629,7
+632,7
@@
void usb_stor_invoke_transport(Scsi_Cmnd *srb, struct us_data *us)
/* set the transfer direction */
old_sc_data_direction = srb->sc_data_direction;
/* set the transfer direction */
old_sc_data_direction = srb->sc_data_direction;
- srb->sc_data_direction =
SCSI_DATA_READ
;
+ srb->sc_data_direction =
DMA_FROM_DEVICE
;
/* use the new buffer we have */
old_request_buffer = srb->request_buffer;
/* use the new buffer we have */
old_request_buffer = srb->request_buffer;
@@
-749,7
+752,7
@@
void usb_stor_stop_transport(struct us_data *us)
* Control/Bulk/Interrupt transport
*/
* Control/Bulk/Interrupt transport
*/
-int usb_stor_CBI_transport(
Scsi_C
mnd *srb, struct us_data *us)
+int usb_stor_CBI_transport(
struct scsi_c
mnd *srb, struct us_data *us)
{
unsigned int transfer_length = srb->request_bufflen;
unsigned int pipe = 0;
{
unsigned int transfer_length = srb->request_bufflen;
unsigned int pipe = 0;
@@
-778,7
+781,7
@@
int usb_stor_CBI_transport(Scsi_Cmnd *srb, struct us_data *us)
/* DATA STAGE */
/* transfer the data payload for this command, if one exists*/
if (transfer_length) {
/* DATA STAGE */
/* transfer the data payload for this command, if one exists*/
if (transfer_length) {
- pipe = srb->sc_data_direction ==
SCSI_DATA_READ
?
+ pipe = srb->sc_data_direction ==
DMA_FROM_DEVICE
?
us->recv_bulk_pipe : us->send_bulk_pipe;
result = usb_stor_bulk_transfer_sg(us, pipe,
srb->request_buffer, transfer_length,
us->recv_bulk_pipe : us->send_bulk_pipe;
result = usb_stor_bulk_transfer_sg(us, pipe,
srb->request_buffer, transfer_length,
@@
-849,7
+852,7
@@
int usb_stor_CBI_transport(Scsi_Cmnd *srb, struct us_data *us)
/*
* Control/Bulk transport
*/
/*
* Control/Bulk transport
*/
-int usb_stor_CB_transport(
Scsi_C
mnd *srb, struct us_data *us)
+int usb_stor_CB_transport(
struct scsi_c
mnd *srb, struct us_data *us)
{
unsigned int transfer_length = srb->request_bufflen;
int result;
{
unsigned int transfer_length = srb->request_bufflen;
int result;
@@
-877,7
+880,7
@@
int usb_stor_CB_transport(Scsi_Cmnd *srb, struct us_data *us)
/* DATA STAGE */
/* transfer the data payload for this command, if one exists*/
if (transfer_length) {
/* DATA STAGE */
/* transfer the data payload for this command, if one exists*/
if (transfer_length) {
- unsigned int pipe = srb->sc_data_direction ==
SCSI_DATA_READ
?
+ unsigned int pipe = srb->sc_data_direction ==
DMA_FROM_DEVICE
?
us->recv_bulk_pipe : us->send_bulk_pipe;
result = usb_stor_bulk_transfer_sg(us, pipe,
srb->request_buffer, transfer_length,
us->recv_bulk_pipe : us->send_bulk_pipe;
result = usb_stor_bulk_transfer_sg(us, pipe,
srb->request_buffer, transfer_length,
@@
-908,6
+911,7
@@
int usb_stor_Bulk_max_lun(struct us_data *us)
int result;
/* issue the command */
int result;
/* issue the command */
+ us->iobuf[0] = 0;
result = usb_stor_control_msg(us, us->recv_ctrl_pipe,
US_BULK_GET_MAX_LUN,
USB_DIR_IN | USB_TYPE_CLASS |
result = usb_stor_control_msg(us, us->recv_ctrl_pipe,
US_BULK_GET_MAX_LUN,
USB_DIR_IN | USB_TYPE_CLASS |
@@
-918,7
+922,7
@@
int usb_stor_Bulk_max_lun(struct us_data *us)
result, us->iobuf[0]);
/* if we have a successful request, return the result */
result, us->iobuf[0]);
/* if we have a successful request, return the result */
- if (result
== 1
)
+ if (result
>= 0
)
return us->iobuf[0];
/*
return us->iobuf[0];
/*
@@
-939,7
+943,7
@@
int usb_stor_Bulk_max_lun(struct us_data *us)
return -1;
}
return -1;
}
-int usb_stor_Bulk_transport(
Scsi_C
mnd *srb, struct us_data *us)
+int usb_stor_Bulk_transport(
struct scsi_c
mnd *srb, struct us_data *us)
{
struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
struct bulk_cs_wrap *bcs = (struct bulk_cs_wrap *) us->iobuf;
{
struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
struct bulk_cs_wrap *bcs = (struct bulk_cs_wrap *) us->iobuf;
@@
-952,7
+956,7
@@
int usb_stor_Bulk_transport(Scsi_Cmnd *srb, struct us_data *us)
/* set up the command wrapper */
bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
bcb->DataTransferLength = cpu_to_le32(transfer_length);
/* set up the command wrapper */
bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
bcb->DataTransferLength = cpu_to_le32(transfer_length);
- bcb->Flags = srb->sc_data_direction ==
SCSI_DATA_READ
? 1 << 7 : 0;
+ bcb->Flags = srb->sc_data_direction ==
DMA_FROM_DEVICE
? 1 << 7 : 0;
bcb->Tag = srb->serial_number;
bcb->Lun = srb->device->lun;
if (us->flags & US_FL_SCM_MULT_TARG)
bcb->Tag = srb->serial_number;
bcb->Lun = srb->device->lun;
if (us->flags & US_FL_SCM_MULT_TARG)
@@
-977,8
+981,14
@@
int usb_stor_Bulk_transport(Scsi_Cmnd *srb, struct us_data *us)
/* DATA STAGE */
/* send/receive data payload, if there is any */
/* DATA STAGE */
/* send/receive data payload, if there is any */
+
+ /* Genesys Logic interface chips need a 100us delay between the
+ * command phase and the data phase */
+ if (us->pusb_dev->descriptor.idVendor == USB_VENDOR_ID_GENESYS)
+ udelay(100);
+
if (transfer_length) {
if (transfer_length) {
- unsigned int pipe = srb->sc_data_direction ==
SCSI_DATA_READ
?
+ unsigned int pipe = srb->sc_data_direction ==
DMA_FROM_DEVICE
?
us->recv_bulk_pipe : us->send_bulk_pipe;
result = usb_stor_bulk_transfer_sg(us, pipe,
srb->request_buffer, transfer_length,
us->recv_bulk_pipe : us->send_bulk_pipe;
result = usb_stor_bulk_transfer_sg(us, pipe,
srb->request_buffer, transfer_length,