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 | |