| 1 |
|
| 2 | |
| 3 | * linux/drivers/acorn/scsi/queue.h: queue handling
|
| 4 | *
|
| 5 | * Copyright (C) 1997 Russell King
|
| 6 |
|
| 7 | #ifndef QUEUE_H
|
| 8 | #define QUEUE_H
|
| 9 |
|
| 10 | typedef struct {
|
| 11 | struct list_head head;
|
| 12 | struct list_head free;
|
| 13 | spinlock_t queue_lock;
|
| 14 | void *alloc;
|
| 15 | } Queue_t;
|
| 16 |
|
| 17 | |
| 18 | * Function: void queue_initialise (Queue_t *queue)
|
| 19 | * Purpose : initialise a queue
|
| 20 | * Params : queue - queue to initialise
|
| 21 |
|
| 22 | extern int queue_initialise (Queue_t *queue);
|
| 23 |
|
| 24 | |
| 25 | * Function: void queue_free (Queue_t *queue)
|
| 26 | * Purpose : free a queue
|
| 27 | * Params : queue - queue to free
|
| 28 |
|
| 29 | extern void queue_free (Queue_t *queue);
|
| 30 |
|
| 31 | |
| 32 | * Function: struct scsi_cmnd *queue_remove (queue)
|
| 33 | * Purpose : removes first SCSI command from a queue
|
| 34 | * Params : queue - queue to remove command from
|
| 35 | * Returns : struct scsi_cmnd if successful (and a reference), or NULL if no command available
|
| 36 |
|
| 37 | extern struct scsi_cmnd *queue_remove (Queue_t *queue);
|
| 38 |
|
| 39 | |
| 40 | * Function: struct scsi_cmnd *queue_remove_exclude_ref (queue, exclude)
|
| 41 | * Purpose : remove a SCSI command from a queue
|
| 42 | * Params : queue - queue to remove command from
|
| 43 | * exclude - array of busy LUNs
|
| 44 | * Returns : struct scsi_cmnd if successful (and a reference), or NULL if no command available
|
| 45 |
|
| 46 | extern struct scsi_cmnd *queue_remove_exclude(Queue_t *queue,
|
| 47 | unsigned long *exclude);
|
| 48 |
|
| 49 | #define queue_add_cmd_ordered(queue,SCpnt) \
|
| 50 | __queue_add(queue,SCpnt,(SCpnt)->cmnd[0] == REQUEST_SENSE)
|
| 51 | #define queue_add_cmd_tail(queue,SCpnt) \
|
| 52 | __queue_add(queue,SCpnt,0)
|
| 53 | |
| 54 | * Function: int __queue_add(Queue_t *queue, struct scsi_cmnd *SCpnt, int head)
|
| 55 | * Purpose : Add a new command onto a queue
|
| 56 | * Params : queue - destination queue
|
| 57 | * SCpnt - command to add
|
| 58 | * head - add command to head of queue
|
| 59 | * Returns : 0 on error, !0 on success
|
| 60 |
|
| 61 | extern int __queue_add(Queue_t *queue, struct scsi_cmnd *SCpnt, int head);
|
| 62 |
|
| 63 | |
| 64 | * Function: struct scsi_cmnd *queue_remove_tgtluntag (queue, target, lun, tag)
|
| 65 | * Purpose : remove a SCSI command from the queue for a specified target/lun/tag
|
| 66 | * Params : queue - queue to remove command from
|
| 67 | * target - target that we want
|
| 68 | * lun - lun on device
|
| 69 | * tag - tag on device
|
| 70 | * Returns : struct scsi_cmnd if successful, or NULL if no command satisfies requirements
|
| 71 |
|
| 72 | extern struct scsi_cmnd *queue_remove_tgtluntag(Queue_t *queue, int target,
|
| 73 | int lun, int tag);
|
| 74 |
|
| 75 | |
| 76 | * Function: queue_remove_all_target(queue, target)
|
| 77 | * Purpose : remove all SCSI commands from the queue for a specified target
|
| 78 | * Params : queue - queue to remove command from
|
| 79 | * target - target device id
|
| 80 | * Returns : nothing
|
| 81 |
|
| 82 | extern void queue_remove_all_target(Queue_t *queue, int target);
|
| 83 |
|
| 84 | |
| 85 | * Function: int queue_probetgtlun (queue, target, lun)
|
| 86 | * Purpose : check to see if we have a command in the queue for the specified
|
| 87 | * target/lun.
|
| 88 | * Params : queue - queue to look in
|
| 89 | * target - target we want to probe
|
| 90 | * lun - lun on target
|
| 91 | * Returns : 0 if not found, != 0 if found
|
| 92 |
|
| 93 | extern int queue_probetgtlun (Queue_t *queue, int target, int lun);
|
| 94 |
|
| 95 | |
| 96 | * Function: int queue_remove_cmd (Queue_t *queue, struct scsi_cmnd *SCpnt)
|
| 97 | * Purpose : remove a specific command from the queues
|
| 98 | * Params : queue - queue to look in
|
| 99 | * SCpnt - command to find
|
| 100 | * Returns : 0 if not found
|
| 101 |
|
| 102 | int queue_remove_cmd(Queue_t *queue, struct scsi_cmnd *SCpnt);
|
| 103 |
|
| 104 | #endif
|