74 lines
2.4 KiB
C
74 lines
2.4 KiB
C
/* Header file for the hpusbscsi driver */
|
|
/* (C) Copyright 2001 Oliver Neukum */
|
|
/* sponsored by the Linux Usb Project */
|
|
/* large parts based on or taken from code by John Fremlin and Matt Dharm */
|
|
/* this file is licensed under the GPL */
|
|
|
|
/* A big thanks to Jose for untiring testing */
|
|
|
|
typedef void (*scsi_callback)(Scsi_Cmnd *);
|
|
|
|
#define SENSE_COMMAND_SIZE 6
|
|
#define HPUSBSCSI_SENSE_LENGTH 0x16
|
|
|
|
struct hpusbscsi
|
|
{
|
|
struct usb_device *dev; /* NULL indicates unplugged device */
|
|
int ep_out;
|
|
int ep_in;
|
|
int ep_int;
|
|
int interrupt_interval;
|
|
int number;
|
|
int fragment;
|
|
struct Scsi_Host *host;
|
|
|
|
scsi_callback scallback;
|
|
Scsi_Cmnd *srb;
|
|
|
|
|
|
wait_queue_head_t pending;
|
|
wait_queue_head_t deathrow;
|
|
|
|
struct urb *dataurb;
|
|
struct urb *controlurb;
|
|
|
|
|
|
int state;
|
|
int current_data_pipe;
|
|
u8 sense_command[SENSE_COMMAND_SIZE];
|
|
u8 scsi_state_byte;
|
|
};
|
|
|
|
#define SCSI_ERR_MASK ~0x3fu
|
|
|
|
static const unsigned char scsi_command_direction[256/8] = {
|
|
0x28, 0x81, 0x14, 0x14, 0x20, 0x01, 0x90, 0x77,
|
|
0x0C, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
#define DIRECTION_IS_IN(x) ((scsi_command_direction[x>>3] >> (x & 7)) & 1)
|
|
|
|
static void simple_command_callback(struct urb *u, struct pt_regs *regs);
|
|
static void scatter_gather_callback(struct urb *u, struct pt_regs *regs);
|
|
static void simple_payload_callback (struct urb *u, struct pt_regs *regs);
|
|
static void request_sense_callback (struct urb *u, struct pt_regs *regs);
|
|
static void control_interrupt_callback (struct urb *u, struct pt_regs *regs);
|
|
static void simple_done (struct urb *u, struct pt_regs *regs);
|
|
static int hpusbscsi_scsi_queuecommand (Scsi_Cmnd *srb, scsi_callback callback);
|
|
static int hpusbscsi_scsi_host_reset (Scsi_Cmnd *srb);
|
|
static int hpusbscsi_scsi_abort (Scsi_Cmnd *srb);
|
|
static void issue_request_sense (struct hpusbscsi *hpusbscsi);
|
|
|
|
/* defines for internal driver state */
|
|
#define HP_STATE_FREE 0 /*ready for next request */
|
|
#define HP_STATE_BEGINNING 1 /*command being transferred */
|
|
#define HP_STATE_WORKING 2 /* data transfer stage */
|
|
#define HP_STATE_ERROR 3 /* error has been reported */
|
|
#define HP_STATE_WAIT 4 /* waiting for status transfer */
|
|
#define HP_STATE_PREMATURE 5 /* status prematurely reported */
|
|
|
|
|
|
|