Commit 7e4d6c38 authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman

usb-storage: separate dynamic flags from fixed flags

This patch (as1089) separates out the dynamic atomic bitflags and the
static bitfields in usb-storage.  Until now the two sorts of flags
have been sharing the same word; this has always been awkward.

To help prevent possible confusion, the two new fields each have a
different name from the original.  us->fflags contains the fixed
bitfields (mostly taken from the USB ID table in unusual_devs.h), and
us->dflags contains the dynamic atomic bitflags (used with set_bit,
test_bit, and so on).
Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Cc: Matthew Dharm <mdharm-usb@one-eyed-alien.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 2742fd88
...@@ -586,7 +586,7 @@ static void isd200_invoke_transport( struct us_data *us, ...@@ -586,7 +586,7 @@ static void isd200_invoke_transport( struct us_data *us,
/* if the command gets aborted by the higher layers, we need to /* if the command gets aborted by the higher layers, we need to
* short-circuit all other processing * short-circuit all other processing
*/ */
if (test_bit(US_FLIDX_TIMED_OUT, &us->flags)) { if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
US_DEBUGP("-- command was aborted\n"); US_DEBUGP("-- command was aborted\n");
goto Handle_Abort; goto Handle_Abort;
} }
...@@ -633,7 +633,7 @@ static void isd200_invoke_transport( struct us_data *us, ...@@ -633,7 +633,7 @@ static void isd200_invoke_transport( struct us_data *us,
if (need_auto_sense) { if (need_auto_sense) {
result = isd200_read_regs(us); result = isd200_read_regs(us);
if (test_bit(US_FLIDX_TIMED_OUT, &us->flags)) { if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
US_DEBUGP("-- auto-sense aborted\n"); US_DEBUGP("-- auto-sense aborted\n");
goto Handle_Abort; goto Handle_Abort;
} }
...@@ -663,7 +663,7 @@ static void isd200_invoke_transport( struct us_data *us, ...@@ -663,7 +663,7 @@ static void isd200_invoke_transport( struct us_data *us,
srb->result = DID_ABORT << 16; srb->result = DID_ABORT << 16;
/* permit the reset transfer to take place */ /* permit the reset transfer to take place */
clear_bit(US_FLIDX_ABORTING, &us->flags); clear_bit(US_FLIDX_ABORTING, &us->dflags);
/* Need reset here */ /* Need reset here */
} }
......
...@@ -116,10 +116,10 @@ static int slave_configure(struct scsi_device *sdev) ...@@ -116,10 +116,10 @@ static int slave_configure(struct scsi_device *sdev)
* while others have trouble with more than 64K. At this time we * while others have trouble with more than 64K. At this time we
* are limiting both to 32K (64 sectores). * are limiting both to 32K (64 sectores).
*/ */
if (us->flags & (US_FL_MAX_SECTORS_64 | US_FL_MAX_SECTORS_MIN)) { if (us->fflags & (US_FL_MAX_SECTORS_64 | US_FL_MAX_SECTORS_MIN)) {
unsigned int max_sectors = 64; unsigned int max_sectors = 64;
if (us->flags & US_FL_MAX_SECTORS_MIN) if (us->fflags & US_FL_MAX_SECTORS_MIN)
max_sectors = PAGE_CACHE_SIZE >> 9; max_sectors = PAGE_CACHE_SIZE >> 9;
if (sdev->request_queue->max_sectors > max_sectors) if (sdev->request_queue->max_sectors > max_sectors)
blk_queue_max_sectors(sdev->request_queue, blk_queue_max_sectors(sdev->request_queue,
...@@ -148,7 +148,7 @@ static int slave_configure(struct scsi_device *sdev) ...@@ -148,7 +148,7 @@ static int slave_configure(struct scsi_device *sdev)
* majority of devices work fine, but a few still can't * majority of devices work fine, but a few still can't
* handle it. The sd driver will simply assume those * handle it. The sd driver will simply assume those
* devices are write-enabled. */ * devices are write-enabled. */
if (us->flags & US_FL_NO_WP_DETECT) if (us->fflags & US_FL_NO_WP_DETECT)
sdev->skip_ms_page_3f = 1; sdev->skip_ms_page_3f = 1;
/* A number of devices have problems with MODE SENSE for /* A number of devices have problems with MODE SENSE for
...@@ -158,13 +158,13 @@ static int slave_configure(struct scsi_device *sdev) ...@@ -158,13 +158,13 @@ static int slave_configure(struct scsi_device *sdev)
/* Some disks return the total number of blocks in response /* Some disks return the total number of blocks in response
* to READ CAPACITY rather than the highest block number. * to READ CAPACITY rather than the highest block number.
* If this device makes that mistake, tell the sd driver. */ * If this device makes that mistake, tell the sd driver. */
if (us->flags & US_FL_FIX_CAPACITY) if (us->fflags & US_FL_FIX_CAPACITY)
sdev->fix_capacity = 1; sdev->fix_capacity = 1;
/* A few disks have two indistinguishable version, one of /* A few disks have two indistinguishable version, one of
* which reports the correct capacity and the other does not. * which reports the correct capacity and the other does not.
* The sd driver has to guess which is the case. */ * The sd driver has to guess which is the case. */
if (us->flags & US_FL_CAPACITY_HEURISTICS) if (us->fflags & US_FL_CAPACITY_HEURISTICS)
sdev->guess_capacity = 1; sdev->guess_capacity = 1;
/* Some devices report a SCSI revision level above 2 but are /* Some devices report a SCSI revision level above 2 but are
...@@ -213,7 +213,7 @@ static int slave_configure(struct scsi_device *sdev) ...@@ -213,7 +213,7 @@ static int slave_configure(struct scsi_device *sdev)
/* Some devices choke when they receive a PREVENT-ALLOW MEDIUM /* Some devices choke when they receive a PREVENT-ALLOW MEDIUM
* REMOVAL command, so suppress those commands. */ * REMOVAL command, so suppress those commands. */
if (us->flags & US_FL_NOT_LOCKABLE) if (us->fflags & US_FL_NOT_LOCKABLE)
sdev->lockable = 0; sdev->lockable = 0;
/* this is to satisfy the compiler, tho I don't think the /* this is to satisfy the compiler, tho I don't think the
...@@ -238,7 +238,7 @@ static int queuecommand(struct scsi_cmnd *srb, ...@@ -238,7 +238,7 @@ static int queuecommand(struct scsi_cmnd *srb,
} }
/* fail the command if we are disconnecting */ /* fail the command if we are disconnecting */
if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) { if (test_bit(US_FLIDX_DISCONNECTING, &us->dflags)) {
US_DEBUGP("Fail command during disconnect\n"); US_DEBUGP("Fail command during disconnect\n");
srb->result = DID_NO_CONNECT << 16; srb->result = DID_NO_CONNECT << 16;
done(srb); done(srb);
...@@ -280,9 +280,9 @@ static int command_abort(struct scsi_cmnd *srb) ...@@ -280,9 +280,9 @@ static int command_abort(struct scsi_cmnd *srb)
* with the reset). Note that we must retain the host lock while * with the reset). Note that we must retain the host lock while
* calling usb_stor_stop_transport(); otherwise it might interfere * calling usb_stor_stop_transport(); otherwise it might interfere
* with an auto-reset that begins as soon as we release the lock. */ * with an auto-reset that begins as soon as we release the lock. */
set_bit(US_FLIDX_TIMED_OUT, &us->flags); set_bit(US_FLIDX_TIMED_OUT, &us->dflags);
if (!test_bit(US_FLIDX_RESETTING, &us->flags)) { if (!test_bit(US_FLIDX_RESETTING, &us->dflags)) {
set_bit(US_FLIDX_ABORTING, &us->flags); set_bit(US_FLIDX_ABORTING, &us->dflags);
usb_stor_stop_transport(us); usb_stor_stop_transport(us);
} }
scsi_unlock(us_to_host(us)); scsi_unlock(us_to_host(us));
...@@ -329,7 +329,7 @@ void usb_stor_report_device_reset(struct us_data *us) ...@@ -329,7 +329,7 @@ void usb_stor_report_device_reset(struct us_data *us)
struct Scsi_Host *host = us_to_host(us); struct Scsi_Host *host = us_to_host(us);
scsi_report_device_reset(host, 0, 0); scsi_report_device_reset(host, 0, 0);
if (us->flags & US_FL_SCM_MULT_TARG) { if (us->fflags & US_FL_SCM_MULT_TARG) {
for (i = 1; i < host->max_id; ++i) for (i = 1; i < host->max_id; ++i)
scsi_report_device_reset(host, 0, i); scsi_report_device_reset(host, 0, i);
} }
...@@ -400,7 +400,7 @@ static int proc_info (struct Scsi_Host *host, char *buffer, ...@@ -400,7 +400,7 @@ static int proc_info (struct Scsi_Host *host, char *buffer,
pos += sprintf(pos, " Quirks:"); pos += sprintf(pos, " Quirks:");
#define US_FLAG(name, value) \ #define US_FLAG(name, value) \
if (us->flags & value) pos += sprintf(pos, " " #name); if (us->fflags & value) pos += sprintf(pos, " " #name);
US_DO_ALL_FLAGS US_DO_ALL_FLAGS
#undef US_FLAG #undef US_FLAG
......
...@@ -75,14 +75,14 @@ ...@@ -75,14 +75,14 @@
* by a separate code path.) * by a separate code path.)
* *
* The abort function (usb_storage_command_abort() in scsiglue.c) first * The abort function (usb_storage_command_abort() in scsiglue.c) first
* sets the machine state and the ABORTING bit in us->flags to prevent * sets the machine state and the ABORTING bit in us->dflags to prevent
* new URBs from being submitted. It then calls usb_stor_stop_transport() * new URBs from being submitted. It then calls usb_stor_stop_transport()
* below, which atomically tests-and-clears the URB_ACTIVE bit in us->flags * below, which atomically tests-and-clears the URB_ACTIVE bit in us->dflags
* to see if the current_urb needs to be stopped. Likewise, the SG_ACTIVE * to see if the current_urb needs to be stopped. Likewise, the SG_ACTIVE
* bit is tested to see if the current_sg scatter-gather request needs to be * bit is tested to see if the current_sg scatter-gather request needs to be
* stopped. The timeout callback routine does much the same thing. * stopped. The timeout callback routine does much the same thing.
* *
* When a disconnect occurs, the DISCONNECTING bit in us->flags is set to * When a disconnect occurs, the DISCONNECTING bit in us->dflags is set to
* prevent new URBs from being submitted, and usb_stor_stop_transport() is * prevent new URBs from being submitted, and usb_stor_stop_transport() is
* called to stop any ongoing requests. * called to stop any ongoing requests.
* *
...@@ -128,7 +128,7 @@ static int usb_stor_msg_common(struct us_data *us, int timeout) ...@@ -128,7 +128,7 @@ static int usb_stor_msg_common(struct us_data *us, int timeout)
int status; int status;
/* don't submit URBs during abort/disconnect processing */ /* don't submit URBs during abort/disconnect processing */
if (us->flags & ABORTING_OR_DISCONNECTING) if (us->dflags & ABORTING_OR_DISCONNECTING)
return -EIO; return -EIO;
/* set up data structures for the wakeup system */ /* set up data structures for the wakeup system */
...@@ -159,13 +159,13 @@ static int usb_stor_msg_common(struct us_data *us, int timeout) ...@@ -159,13 +159,13 @@ static int usb_stor_msg_common(struct us_data *us, int timeout)
/* since the URB has been submitted successfully, it's now okay /* since the URB has been submitted successfully, it's now okay
* to cancel it */ * to cancel it */
set_bit(US_FLIDX_URB_ACTIVE, &us->flags); set_bit(US_FLIDX_URB_ACTIVE, &us->dflags);
/* did an abort/disconnect occur during the submission? */ /* did an abort/disconnect occur during the submission? */
if (us->flags & ABORTING_OR_DISCONNECTING) { if (us->dflags & ABORTING_OR_DISCONNECTING) {
/* cancel the URB, if it hasn't been cancelled already */ /* cancel the URB, if it hasn't been cancelled already */
if (test_and_clear_bit(US_FLIDX_URB_ACTIVE, &us->flags)) { if (test_and_clear_bit(US_FLIDX_URB_ACTIVE, &us->dflags)) {
US_DEBUGP("-- cancelling URB\n"); US_DEBUGP("-- cancelling URB\n");
usb_unlink_urb(us->current_urb); usb_unlink_urb(us->current_urb);
} }
...@@ -175,7 +175,7 @@ static int usb_stor_msg_common(struct us_data *us, int timeout) ...@@ -175,7 +175,7 @@ static int usb_stor_msg_common(struct us_data *us, int timeout)
timeleft = wait_for_completion_interruptible_timeout( timeleft = wait_for_completion_interruptible_timeout(
&urb_done, timeout ? : MAX_SCHEDULE_TIMEOUT); &urb_done, timeout ? : MAX_SCHEDULE_TIMEOUT);
clear_bit(US_FLIDX_URB_ACTIVE, &us->flags); clear_bit(US_FLIDX_URB_ACTIVE, &us->dflags);
if (timeleft <= 0) { if (timeleft <= 0) {
US_DEBUGP("%s -- cancelling URB\n", US_DEBUGP("%s -- cancelling URB\n",
...@@ -420,7 +420,7 @@ static int usb_stor_bulk_transfer_sglist(struct us_data *us, unsigned int pipe, ...@@ -420,7 +420,7 @@ static int usb_stor_bulk_transfer_sglist(struct us_data *us, unsigned int pipe,
int result; int result;
/* don't submit s-g requests during abort/disconnect processing */ /* don't submit s-g requests during abort/disconnect processing */
if (us->flags & ABORTING_OR_DISCONNECTING) if (us->dflags & ABORTING_OR_DISCONNECTING)
return USB_STOR_XFER_ERROR; return USB_STOR_XFER_ERROR;
/* initialize the scatter-gather request block */ /* initialize the scatter-gather request block */
...@@ -435,13 +435,13 @@ static int usb_stor_bulk_transfer_sglist(struct us_data *us, unsigned int pipe, ...@@ -435,13 +435,13 @@ static int usb_stor_bulk_transfer_sglist(struct us_data *us, unsigned int pipe,
/* since the block has been initialized successfully, it's now /* since the block has been initialized successfully, it's now
* okay to cancel it */ * okay to cancel it */
set_bit(US_FLIDX_SG_ACTIVE, &us->flags); set_bit(US_FLIDX_SG_ACTIVE, &us->dflags);
/* did an abort/disconnect occur during the submission? */ /* did an abort/disconnect occur during the submission? */
if (us->flags & ABORTING_OR_DISCONNECTING) { if (us->dflags & ABORTING_OR_DISCONNECTING) {
/* cancel the request, if it hasn't been cancelled already */ /* cancel the request, if it hasn't been cancelled already */
if (test_and_clear_bit(US_FLIDX_SG_ACTIVE, &us->flags)) { if (test_and_clear_bit(US_FLIDX_SG_ACTIVE, &us->dflags)) {
US_DEBUGP("-- cancelling sg request\n"); US_DEBUGP("-- cancelling sg request\n");
usb_sg_cancel(&us->current_sg); usb_sg_cancel(&us->current_sg);
} }
...@@ -449,7 +449,7 @@ static int usb_stor_bulk_transfer_sglist(struct us_data *us, unsigned int pipe, ...@@ -449,7 +449,7 @@ static int usb_stor_bulk_transfer_sglist(struct us_data *us, unsigned int pipe,
/* wait for the completion of the transfer */ /* wait for the completion of the transfer */
usb_sg_wait(&us->current_sg); usb_sg_wait(&us->current_sg);
clear_bit(US_FLIDX_SG_ACTIVE, &us->flags); clear_bit(US_FLIDX_SG_ACTIVE, &us->dflags);
result = us->current_sg.status; result = us->current_sg.status;
if (act_len) if (act_len)
...@@ -530,7 +530,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -530,7 +530,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
/* if the command gets aborted by the higher layers, we need to /* if the command gets aborted by the higher layers, we need to
* short-circuit all other processing * short-circuit all other processing
*/ */
if (test_bit(US_FLIDX_TIMED_OUT, &us->flags)) { if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
US_DEBUGP("-- command was aborted\n"); US_DEBUGP("-- command was aborted\n");
srb->result = DID_ABORT << 16; srb->result = DID_ABORT << 16;
goto Handle_Errors; goto Handle_Errors;
...@@ -616,7 +616,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -616,7 +616,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
/* let's clean up right away */ /* let's clean up right away */
scsi_eh_restore_cmnd(srb, &ses); scsi_eh_restore_cmnd(srb, &ses);
if (test_bit(US_FLIDX_TIMED_OUT, &us->flags)) { if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
US_DEBUGP("-- auto-sense aborted\n"); US_DEBUGP("-- auto-sense aborted\n");
srb->result = DID_ABORT << 16; srb->result = DID_ABORT << 16;
goto Handle_Errors; goto Handle_Errors;
...@@ -629,7 +629,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -629,7 +629,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
* auto-sense is perfectly valid * auto-sense is perfectly valid
*/ */
srb->result = DID_ERROR << 16; srb->result = DID_ERROR << 16;
if (!(us->flags & US_FL_SCM_MULT_TARG)) if (!(us->fflags & US_FL_SCM_MULT_TARG))
goto Handle_Errors; goto Handle_Errors;
return; return;
} }
...@@ -679,8 +679,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -679,8 +679,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
/* Set the RESETTING bit, and clear the ABORTING bit so that /* Set the RESETTING bit, and clear the ABORTING bit so that
* the reset may proceed. */ * the reset may proceed. */
scsi_lock(us_to_host(us)); scsi_lock(us_to_host(us));
set_bit(US_FLIDX_RESETTING, &us->flags); set_bit(US_FLIDX_RESETTING, &us->dflags);
clear_bit(US_FLIDX_ABORTING, &us->flags); clear_bit(US_FLIDX_ABORTING, &us->dflags);
scsi_unlock(us_to_host(us)); scsi_unlock(us_to_host(us));
/* We must release the device lock because the pre_reset routine /* We must release the device lock because the pre_reset routine
...@@ -695,7 +695,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -695,7 +695,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
scsi_unlock(us_to_host(us)); scsi_unlock(us_to_host(us));
us->transport_reset(us); us->transport_reset(us);
} }
clear_bit(US_FLIDX_RESETTING, &us->flags); clear_bit(US_FLIDX_RESETTING, &us->dflags);
} }
/* Stop the current URB transfer */ /* Stop the current URB transfer */
...@@ -707,13 +707,13 @@ void usb_stor_stop_transport(struct us_data *us) ...@@ -707,13 +707,13 @@ void usb_stor_stop_transport(struct us_data *us)
* let's wake it up. The test_and_clear_bit() call * let's wake it up. The test_and_clear_bit() call
* guarantees that if a URB has just been submitted, * guarantees that if a URB has just been submitted,
* it won't be cancelled more than once. */ * it won't be cancelled more than once. */
if (test_and_clear_bit(US_FLIDX_URB_ACTIVE, &us->flags)) { if (test_and_clear_bit(US_FLIDX_URB_ACTIVE, &us->dflags)) {
US_DEBUGP("-- cancelling URB\n"); US_DEBUGP("-- cancelling URB\n");
usb_unlink_urb(us->current_urb); usb_unlink_urb(us->current_urb);
} }
/* If we are waiting for a scatter-gather operation, cancel it. */ /* If we are waiting for a scatter-gather operation, cancel it. */
if (test_and_clear_bit(US_FLIDX_SG_ACTIVE, &us->flags)) { if (test_and_clear_bit(US_FLIDX_SG_ACTIVE, &us->dflags)) {
US_DEBUGP("-- cancelling sg request\n"); US_DEBUGP("-- cancelling sg request\n");
usb_sg_cancel(&us->current_sg); usb_sg_cancel(&us->current_sg);
} }
...@@ -914,7 +914,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -914,7 +914,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
unsigned int cbwlen = US_BULK_CB_WRAP_LEN; unsigned int cbwlen = US_BULK_CB_WRAP_LEN;
/* Take care of BULK32 devices; set extra byte to 0 */ /* Take care of BULK32 devices; set extra byte to 0 */
if ( unlikely(us->flags & US_FL_BULK32)) { if (unlikely(us->fflags & US_FL_BULK32)) {
cbwlen = 32; cbwlen = 32;
us->iobuf[31] = 0; us->iobuf[31] = 0;
} }
...@@ -925,7 +925,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -925,7 +925,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
bcb->Flags = srb->sc_data_direction == DMA_FROM_DEVICE ? 1 << 7 : 0; bcb->Flags = srb->sc_data_direction == DMA_FROM_DEVICE ? 1 << 7 : 0;
bcb->Tag = ++us->tag; bcb->Tag = ++us->tag;
bcb->Lun = srb->device->lun; bcb->Lun = srb->device->lun;
if (us->flags & US_FL_SCM_MULT_TARG) if (us->fflags & US_FL_SCM_MULT_TARG)
bcb->Lun |= srb->device->id << 4; bcb->Lun |= srb->device->id << 4;
bcb->Length = srb->cmd_len; bcb->Length = srb->cmd_len;
...@@ -951,7 +951,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -951,7 +951,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
/* Some USB-IDE converter chips need a 100us delay between the /* Some USB-IDE converter chips need a 100us delay between the
* command phase and the data phase. Some devices need a little * command phase and the data phase. Some devices need a little
* more than that, probably because of clock rate inaccuracies. */ * more than that, probably because of clock rate inaccuracies. */
if (unlikely(us->flags & US_FL_GO_SLOW)) if (unlikely(us->fflags & US_FL_GO_SLOW))
udelay(125); udelay(125);
if (transfer_length) { if (transfer_length) {
...@@ -1010,7 +1010,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -1010,7 +1010,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n", US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n",
le32_to_cpu(bcs->Signature), bcs->Tag, le32_to_cpu(bcs->Signature), bcs->Tag,
residue, bcs->Status); residue, bcs->Status);
if (!(bcs->Tag == us->tag || (us->flags & US_FL_BULK_IGNORE_TAG)) || if (!(bcs->Tag == us->tag || (us->fflags & US_FL_BULK_IGNORE_TAG)) ||
bcs->Status > US_BULK_STAT_PHASE) { bcs->Status > US_BULK_STAT_PHASE) {
US_DEBUGP("Bulk logical error\n"); US_DEBUGP("Bulk logical error\n");
return USB_STOR_TRANSPORT_ERROR; return USB_STOR_TRANSPORT_ERROR;
...@@ -1035,7 +1035,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -1035,7 +1035,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
/* try to compute the actual residue, based on how much data /* try to compute the actual residue, based on how much data
* was really transferred and what the device tells us */ * was really transferred and what the device tells us */
if (residue) { if (residue) {
if (!(us->flags & US_FL_IGNORE_RESIDUE)) { if (!(us->fflags & US_FL_IGNORE_RESIDUE)) {
residue = min(residue, transfer_length); residue = min(residue, transfer_length);
scsi_set_resid(srb, max(scsi_get_resid(srb), scsi_set_resid(srb, max(scsi_get_resid(srb),
(int) residue)); (int) residue));
...@@ -1090,7 +1090,7 @@ static int usb_stor_reset_common(struct us_data *us, ...@@ -1090,7 +1090,7 @@ static int usb_stor_reset_common(struct us_data *us,
int result; int result;
int result2; int result2;
if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) { if (test_bit(US_FLIDX_DISCONNECTING, &us->dflags)) {
US_DEBUGP("No reset during disconnect\n"); US_DEBUGP("No reset during disconnect\n");
return -EIO; return -EIO;
} }
...@@ -1103,12 +1103,12 @@ static int usb_stor_reset_common(struct us_data *us, ...@@ -1103,12 +1103,12 @@ static int usb_stor_reset_common(struct us_data *us,
return result; return result;
} }
/* Give the device some time to recover from the reset, /* Give the device some time to recover from the reset,
* but don't delay disconnect processing. */ * but don't delay disconnect processing. */
wait_event_interruptible_timeout(us->delay_wait, wait_event_interruptible_timeout(us->delay_wait,
test_bit(US_FLIDX_DISCONNECTING, &us->flags), test_bit(US_FLIDX_DISCONNECTING, &us->dflags),
HZ*6); HZ*6);
if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) { if (test_bit(US_FLIDX_DISCONNECTING, &us->dflags)) {
US_DEBUGP("Reset interrupted by disconnect\n"); US_DEBUGP("Reset interrupted by disconnect\n");
return -EIO; return -EIO;
} }
...@@ -1170,7 +1170,7 @@ int usb_stor_port_reset(struct us_data *us) ...@@ -1170,7 +1170,7 @@ int usb_stor_port_reset(struct us_data *us)
US_DEBUGP("unable to lock device for reset: %d\n", result); US_DEBUGP("unable to lock device for reset: %d\n", result);
else { else {
/* Were we disconnected while waiting for the lock? */ /* Were we disconnected while waiting for the lock? */
if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) { if (test_bit(US_FLIDX_DISCONNECTING, &us->dflags)) {
result = -EIO; result = -EIO;
US_DEBUGP("No reset during disconnect\n"); US_DEBUGP("No reset during disconnect\n");
} else { } else {
......
...@@ -321,7 +321,7 @@ static int usb_stor_control_thread(void * __us) ...@@ -321,7 +321,7 @@ static int usb_stor_control_thread(void * __us)
mutex_lock(&(us->dev_mutex)); mutex_lock(&(us->dev_mutex));
/* if the device has disconnected, we are free to exit */ /* if the device has disconnected, we are free to exit */
if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) { if (test_bit(US_FLIDX_DISCONNECTING, &us->dflags)) {
US_DEBUGP("-- exiting\n"); US_DEBUGP("-- exiting\n");
mutex_unlock(&us->dev_mutex); mutex_unlock(&us->dev_mutex);
break; break;
...@@ -331,7 +331,7 @@ static int usb_stor_control_thread(void * __us) ...@@ -331,7 +331,7 @@ static int usb_stor_control_thread(void * __us)
scsi_lock(host); scsi_lock(host);
/* has the command timed out *already* ? */ /* has the command timed out *already* ? */
if (test_bit(US_FLIDX_TIMED_OUT, &us->flags)) { if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
us->srb->result = DID_ABORT << 16; us->srb->result = DID_ABORT << 16;
goto SkipForAbort; goto SkipForAbort;
} }
...@@ -350,7 +350,7 @@ static int usb_stor_control_thread(void * __us) ...@@ -350,7 +350,7 @@ static int usb_stor_control_thread(void * __us)
* the maximum known LUN * the maximum known LUN
*/ */
else if (us->srb->device->id && else if (us->srb->device->id &&
!(us->flags & US_FL_SCM_MULT_TARG)) { !(us->fflags & US_FL_SCM_MULT_TARG)) {
US_DEBUGP("Bad target number (%d:%d)\n", US_DEBUGP("Bad target number (%d:%d)\n",
us->srb->device->id, us->srb->device->lun); us->srb->device->id, us->srb->device->lun);
us->srb->result = DID_BAD_TARGET << 16; us->srb->result = DID_BAD_TARGET << 16;
...@@ -365,7 +365,7 @@ static int usb_stor_control_thread(void * __us) ...@@ -365,7 +365,7 @@ static int usb_stor_control_thread(void * __us)
/* Handle those devices which need us to fake /* Handle those devices which need us to fake
* their inquiry data */ * their inquiry data */
else if ((us->srb->cmnd[0] == INQUIRY) && else if ((us->srb->cmnd[0] == INQUIRY) &&
(us->flags & US_FL_FIX_INQUIRY)) { (us->fflags & US_FL_FIX_INQUIRY)) {
unsigned char data_ptr[36] = { unsigned char data_ptr[36] = {
0x00, 0x80, 0x02, 0x02, 0x00, 0x80, 0x02, 0x02,
0x1F, 0x00, 0x00, 0x00}; 0x1F, 0x00, 0x00, 0x00};
...@@ -403,12 +403,12 @@ static int usb_stor_control_thread(void * __us) ...@@ -403,12 +403,12 @@ static int usb_stor_control_thread(void * __us)
* the TIMED_OUT flag, not srb->result == DID_ABORT, because * the TIMED_OUT flag, not srb->result == DID_ABORT, because
* the timeout might have occurred after the command had * the timeout might have occurred after the command had
* already completed with a different result code. */ * already completed with a different result code. */
if (test_bit(US_FLIDX_TIMED_OUT, &us->flags)) { if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
complete(&(us->notify)); complete(&(us->notify));
/* Allow USB transfers to resume */ /* Allow USB transfers to resume */
clear_bit(US_FLIDX_ABORTING, &us->flags); clear_bit(US_FLIDX_ABORTING, &us->dflags);
clear_bit(US_FLIDX_TIMED_OUT, &us->flags); clear_bit(US_FLIDX_TIMED_OUT, &us->dflags);
} }
/* finished working on this command */ /* finished working on this command */
...@@ -500,9 +500,9 @@ static int get_device_info(struct us_data *us, const struct usb_device_id *id) ...@@ -500,9 +500,9 @@ static int get_device_info(struct us_data *us, const struct usb_device_id *id)
us->protocol = (unusual_dev->useTransport == US_PR_DEVICE) ? us->protocol = (unusual_dev->useTransport == US_PR_DEVICE) ?
idesc->bInterfaceProtocol : idesc->bInterfaceProtocol :
unusual_dev->useTransport; unusual_dev->useTransport;
us->flags = USB_US_ORIG_FLAGS(id->driver_info); us->fflags = USB_US_ORIG_FLAGS(id->driver_info);
if (us->flags & US_FL_IGNORE_DEVICE) { if (us->fflags & US_FL_IGNORE_DEVICE) {
printk(KERN_INFO USB_STORAGE "device ignored\n"); printk(KERN_INFO USB_STORAGE "device ignored\n");
return -ENODEV; return -ENODEV;
} }
...@@ -512,7 +512,7 @@ static int get_device_info(struct us_data *us, const struct usb_device_id *id) ...@@ -512,7 +512,7 @@ static int get_device_info(struct us_data *us, const struct usb_device_id *id)
* disable it if we're in full-speed * disable it if we're in full-speed
*/ */
if (dev->speed != USB_SPEED_HIGH) if (dev->speed != USB_SPEED_HIGH)
us->flags &= ~US_FL_GO_SLOW; us->fflags &= ~US_FL_GO_SLOW;
/* Log a message if a non-generic unusual_dev entry contains an /* Log a message if a non-generic unusual_dev entry contains an
* unnecessary subclass or protocol override. This may stimulate * unnecessary subclass or protocol override. This may stimulate
...@@ -533,7 +533,7 @@ static int get_device_info(struct us_data *us, const struct usb_device_id *id) ...@@ -533,7 +533,7 @@ static int get_device_info(struct us_data *us, const struct usb_device_id *id)
if (unusual_dev->useTransport != US_PR_DEVICE && if (unusual_dev->useTransport != US_PR_DEVICE &&
us->protocol == idesc->bInterfaceProtocol) us->protocol == idesc->bInterfaceProtocol)
msg += 2; msg += 2;
if (msg >= 0 && !(us->flags & US_FL_NEED_OVERRIDE)) if (msg >= 0 && !(us->fflags & US_FL_NEED_OVERRIDE))
printk(KERN_NOTICE USB_STORAGE "This device " printk(KERN_NOTICE USB_STORAGE "This device "
"(%04x,%04x,%04x S %02x P %02x)" "(%04x,%04x,%04x S %02x P %02x)"
" has %s in unusual_devs.h (kernel" " has %s in unusual_devs.h (kernel"
...@@ -663,7 +663,7 @@ static int get_transport(struct us_data *us) ...@@ -663,7 +663,7 @@ static int get_transport(struct us_data *us)
US_DEBUGP("Transport: %s\n", us->transport_name); US_DEBUGP("Transport: %s\n", us->transport_name);
/* fix for single-lun devices */ /* fix for single-lun devices */
if (us->flags & US_FL_SINGLE_LUN) if (us->fflags & US_FL_SINGLE_LUN)
us->max_lun = 0; us->max_lun = 0;
return 0; return 0;
} }
...@@ -824,7 +824,7 @@ static void usb_stor_release_resources(struct us_data *us) ...@@ -824,7 +824,7 @@ static void usb_stor_release_resources(struct us_data *us)
* any more commands. * any more commands.
*/ */
US_DEBUGP("-- sending exit command to thread\n"); US_DEBUGP("-- sending exit command to thread\n");
set_bit(US_FLIDX_DISCONNECTING, &us->flags); set_bit(US_FLIDX_DISCONNECTING, &us->dflags);
up(&us->sema); up(&us->sema);
if (us->ctl_thread) if (us->ctl_thread)
kthread_stop(us->ctl_thread); kthread_stop(us->ctl_thread);
...@@ -868,7 +868,7 @@ static void quiesce_and_remove_host(struct us_data *us) ...@@ -868,7 +868,7 @@ static void quiesce_and_remove_host(struct us_data *us)
/* Prevent new USB transfers, stop the current command, and /* Prevent new USB transfers, stop the current command, and
* interrupt a SCSI-scan or device-reset delay */ * interrupt a SCSI-scan or device-reset delay */
scsi_lock(host); scsi_lock(host);
set_bit(US_FLIDX_DISCONNECTING, &us->flags); set_bit(US_FLIDX_DISCONNECTING, &us->dflags);
scsi_unlock(host); scsi_unlock(host);
usb_stor_stop_transport(us); usb_stor_stop_transport(us);
wake_up(&us->delay_wait); wake_up(&us->delay_wait);
...@@ -919,16 +919,16 @@ static int usb_stor_scan_thread(void * __us) ...@@ -919,16 +919,16 @@ static int usb_stor_scan_thread(void * __us)
printk(KERN_DEBUG "usb-storage: waiting for device " printk(KERN_DEBUG "usb-storage: waiting for device "
"to settle before scanning\n"); "to settle before scanning\n");
wait_event_freezable_timeout(us->delay_wait, wait_event_freezable_timeout(us->delay_wait,
test_bit(US_FLIDX_DISCONNECTING, &us->flags), test_bit(US_FLIDX_DISCONNECTING, &us->dflags),
delay_use * HZ); delay_use * HZ);
} }
/* If the device is still connected, perform the scanning */ /* If the device is still connected, perform the scanning */
if (!test_bit(US_FLIDX_DISCONNECTING, &us->flags)) { if (!test_bit(US_FLIDX_DISCONNECTING, &us->dflags)) {
/* For bulk-only devices, determine the max LUN value */ /* For bulk-only devices, determine the max LUN value */
if (us->protocol == US_PR_BULK && if (us->protocol == US_PR_BULK &&
!(us->flags & US_FL_SINGLE_LUN)) { !(us->fflags & US_FL_SINGLE_LUN)) {
mutex_lock(&us->dev_mutex); mutex_lock(&us->dev_mutex);
us->max_lun = usb_stor_Bulk_max_lun(us); us->max_lun = usb_stor_Bulk_max_lun(us);
mutex_unlock(&us->dev_mutex); mutex_unlock(&us->dev_mutex);
......
...@@ -67,15 +67,15 @@ struct us_unusual_dev { ...@@ -67,15 +67,15 @@ struct us_unusual_dev {
}; };
/* Dynamic flag definitions: used in set_bit() etc. */ /* Dynamic bitflag definitions (us->dflags): used in set_bit() etc. */
#define US_FLIDX_URB_ACTIVE 18 /* 0x00040000 current_urb is in use */ #define US_FLIDX_URB_ACTIVE 0 /* current_urb is in use */
#define US_FLIDX_SG_ACTIVE 19 /* 0x00080000 current_sg is in use */ #define US_FLIDX_SG_ACTIVE 1 /* current_sg is in use */
#define US_FLIDX_ABORTING 20 /* 0x00100000 abort is in progress */ #define US_FLIDX_ABORTING 2 /* abort is in progress */
#define US_FLIDX_DISCONNECTING 21 /* 0x00200000 disconnect in progress */ #define US_FLIDX_DISCONNECTING 3 /* disconnect in progress */
#define ABORTING_OR_DISCONNECTING ((1UL << US_FLIDX_ABORTING) | \ #define ABORTING_OR_DISCONNECTING ((1UL << US_FLIDX_ABORTING) | \
(1UL << US_FLIDX_DISCONNECTING)) (1UL << US_FLIDX_DISCONNECTING))
#define US_FLIDX_RESETTING 22 /* 0x00400000 device reset in progress */ #define US_FLIDX_RESETTING 4 /* device reset in progress */
#define US_FLIDX_TIMED_OUT 23 /* 0x00800000 SCSI midlayer timed out */ #define US_FLIDX_TIMED_OUT 5 /* SCSI midlayer timed out */
#define USB_STOR_STRING_LEN 32 #define USB_STOR_STRING_LEN 32
...@@ -109,7 +109,8 @@ struct us_data { ...@@ -109,7 +109,8 @@ struct us_data {
struct usb_device *pusb_dev; /* this usb_device */ struct usb_device *pusb_dev; /* this usb_device */
struct usb_interface *pusb_intf; /* this interface */ struct usb_interface *pusb_intf; /* this interface */
struct us_unusual_dev *unusual_dev; /* device-filter entry */ struct us_unusual_dev *unusual_dev; /* device-filter entry */
unsigned long flags; /* from filter initially */ unsigned long fflags; /* fixed flags from filter */
unsigned long dflags; /* dynamic atomic bitflags */
unsigned int send_bulk_pipe; /* cached pipe values */ unsigned int send_bulk_pipe; /* cached pipe values */
unsigned int recv_bulk_pipe; unsigned int recv_bulk_pipe;
unsigned int send_ctrl_pipe; unsigned int send_ctrl_pipe;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment