#include <linux/blkdev.h>
#include <linux/smp_lock.h>
#include <linux/completion.h>
-#include "scsi.h"
-#include "hosts.h"
struct us_data;
+struct scsi_cmnd;
/*
* Unusual device list definitions
/* Flag definitions: these entries are static */
#define US_FL_SINGLE_LUN 0x00000001 /* allow access to only LUN 0 */
#define US_FL_MODE_XLATE 0 /* [no longer used] */
+#define US_FL_NEED_OVERRIDE 0x00000004 /* unusual_devs entry is necessary */
#define US_FL_IGNORE_SER 0 /* [no longer used] */
#define US_FL_SCM_MULT_TARG 0x00000020 /* supports multiple targets */
#define US_FL_FIX_INQUIRY 0x00000040 /* INQUIRY response needs faking */
#define US_FL_FIX_CAPACITY 0x00000080 /* READ CAPACITY response too big */
+#define US_FL_IGNORE_RESIDUE 0x00000100 /* reported residue is wrong */
+#define US_FL_BULK32 0x00000200 /* Uses 32-byte CBW length */
/* Dynamic flag definitions: used in set_bit() etc. */
#define US_FLIDX_URB_ACTIVE 18 /* 0x00040000 current_urb is in use */
#define US_FLIDX_SG_ACTIVE 19 /* 0x00080000 current_sg is in use */
#define US_FLIDX_ABORTING 20 /* 0x00100000 abort is in progress */
#define US_FLIDX_DISCONNECTING 21 /* 0x00200000 disconnect in progress */
-#define DONT_SUBMIT ((1UL << US_FLIDX_ABORTING) | \
- (1UL << US_FLIDX_DISCONNECTING))
+#define ABORTING_OR_DISCONNECTING ((1UL << US_FLIDX_ABORTING) | \
+ (1UL << US_FLIDX_DISCONNECTING))
+#define US_FLIDX_RESETTING 22 /* 0x00400000 device reset in progress */
+#define US_FLIDX_TIMED_OUT 23 /* 0x00800000 SCSI midlayer timed out */
-/* processing state machine states */
-#define US_STATE_IDLE 1
-#define US_STATE_RUNNING 2
-#define US_STATE_RESETTING 3
-#define US_STATE_ABORTING 4
-
#define USB_STOR_STRING_LEN 32
/*
#define US_IOBUF_SIZE 64 /* Size of the DMA-mapped I/O buffer */
-typedef int (*trans_cmnd)(Scsi_Cmnd*, struct us_data*);
+typedef int (*trans_cmnd)(struct scsi_cmnd *, struct us_data*);
typedef int (*trans_reset)(struct us_data*);
-typedef void (*proto_cmnd)(Scsi_Cmnd*, struct us_data*);
+typedef void (*proto_cmnd)(struct scsi_cmnd*, struct us_data*);
typedef void (*extra_data_destructor)(void *); /* extra data destructor */
/* we allocate one of these for every device that we remember */
/* SCSI interfaces */
struct Scsi_Host *host; /* our dummy host data */
- Scsi_Cmnd *srb; /* current srb */
+ struct scsi_cmnd *srb; /* current srb */
/* thread information */
int pid; /* control thread */
- int sm_state; /* what we are doing */
/* control and bulk communications data */
struct urb *current_urb; /* USB requests */
dma_addr_t cr_dma; /* buffer DMA addresses */
dma_addr_t iobuf_dma;
- /* mutual exclusion structures */
+ /* mutual exclusion and synchronization structures */
struct semaphore sema; /* to sleep thread on */
- struct completion notify; /* thread begin/end */
+ struct completion notify; /* thread begin/end */
+ wait_queue_head_t dev_reset_wait; /* wait during reset */
+ wait_queue_head_t scsi_scan_wait; /* wait before scanning */
+ struct completion scsi_scan_done; /* scan thread end */
/* subdriver information */
void *extra; /* Any extra data */
#define scsi_unlock(host) spin_unlock_irq(host->host_lock)
#define scsi_lock(host) spin_lock_irq(host->host_lock)
+
+/* Vendor ID list for devices that require special handling */
+#define USB_VENDOR_ID_GENESYS 0x05e3 /* Genesys Logic */
+
#endif