1 /* SPDX-License-Identifier: GPL-2.0-only */ 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; /* start of allocated mem */ 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 /* QUEUE_H */ 105