1*d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * linux/drivers/acorn/scsi/queue.h: queue handling 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Copyright (C) 1997 Russell King 61da177e4SLinus Torvalds */ 71da177e4SLinus Torvalds #ifndef QUEUE_H 81da177e4SLinus Torvalds #define QUEUE_H 91da177e4SLinus Torvalds 101da177e4SLinus Torvalds typedef struct { 111da177e4SLinus Torvalds struct list_head head; 121da177e4SLinus Torvalds struct list_head free; 131da177e4SLinus Torvalds spinlock_t queue_lock; 141da177e4SLinus Torvalds void *alloc; /* start of allocated mem */ 151da177e4SLinus Torvalds } Queue_t; 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds /* 181da177e4SLinus Torvalds * Function: void queue_initialise (Queue_t *queue) 191da177e4SLinus Torvalds * Purpose : initialise a queue 201da177e4SLinus Torvalds * Params : queue - queue to initialise 211da177e4SLinus Torvalds */ 221da177e4SLinus Torvalds extern int queue_initialise (Queue_t *queue); 231da177e4SLinus Torvalds 241da177e4SLinus Torvalds /* 251da177e4SLinus Torvalds * Function: void queue_free (Queue_t *queue) 261da177e4SLinus Torvalds * Purpose : free a queue 271da177e4SLinus Torvalds * Params : queue - queue to free 281da177e4SLinus Torvalds */ 291da177e4SLinus Torvalds extern void queue_free (Queue_t *queue); 301da177e4SLinus Torvalds 311da177e4SLinus Torvalds /* 32ee0ca6baSHenne * Function: struct scsi_cmnd *queue_remove (queue) 331da177e4SLinus Torvalds * Purpose : removes first SCSI command from a queue 341da177e4SLinus Torvalds * Params : queue - queue to remove command from 35ee0ca6baSHenne * Returns : struct scsi_cmnd if successful (and a reference), or NULL if no command available 361da177e4SLinus Torvalds */ 37ee0ca6baSHenne extern struct scsi_cmnd *queue_remove (Queue_t *queue); 381da177e4SLinus Torvalds 391da177e4SLinus Torvalds /* 40ee0ca6baSHenne * Function: struct scsi_cmnd *queue_remove_exclude_ref (queue, exclude) 411da177e4SLinus Torvalds * Purpose : remove a SCSI command from a queue 421da177e4SLinus Torvalds * Params : queue - queue to remove command from 431da177e4SLinus Torvalds * exclude - array of busy LUNs 44ee0ca6baSHenne * Returns : struct scsi_cmnd if successful (and a reference), or NULL if no command available 451da177e4SLinus Torvalds */ 46ee0ca6baSHenne extern struct scsi_cmnd *queue_remove_exclude(Queue_t *queue, 47ee0ca6baSHenne unsigned long *exclude); 481da177e4SLinus Torvalds 491da177e4SLinus Torvalds #define queue_add_cmd_ordered(queue,SCpnt) \ 501da177e4SLinus Torvalds __queue_add(queue,SCpnt,(SCpnt)->cmnd[0] == REQUEST_SENSE) 511da177e4SLinus Torvalds #define queue_add_cmd_tail(queue,SCpnt) \ 521da177e4SLinus Torvalds __queue_add(queue,SCpnt,0) 531da177e4SLinus Torvalds /* 54ee0ca6baSHenne * Function: int __queue_add(Queue_t *queue, struct scsi_cmnd *SCpnt, int head) 551da177e4SLinus Torvalds * Purpose : Add a new command onto a queue 561da177e4SLinus Torvalds * Params : queue - destination queue 571da177e4SLinus Torvalds * SCpnt - command to add 581da177e4SLinus Torvalds * head - add command to head of queue 591da177e4SLinus Torvalds * Returns : 0 on error, !0 on success 601da177e4SLinus Torvalds */ 61ee0ca6baSHenne extern int __queue_add(Queue_t *queue, struct scsi_cmnd *SCpnt, int head); 621da177e4SLinus Torvalds 631da177e4SLinus Torvalds /* 64ee0ca6baSHenne * Function: struct scsi_cmnd *queue_remove_tgtluntag (queue, target, lun, tag) 651da177e4SLinus Torvalds * Purpose : remove a SCSI command from the queue for a specified target/lun/tag 661da177e4SLinus Torvalds * Params : queue - queue to remove command from 671da177e4SLinus Torvalds * target - target that we want 681da177e4SLinus Torvalds * lun - lun on device 691da177e4SLinus Torvalds * tag - tag on device 70ee0ca6baSHenne * Returns : struct scsi_cmnd if successful, or NULL if no command satisfies requirements 711da177e4SLinus Torvalds */ 72ee0ca6baSHenne extern struct scsi_cmnd *queue_remove_tgtluntag(Queue_t *queue, int target, 73ee0ca6baSHenne int lun, int tag); 741da177e4SLinus Torvalds 751da177e4SLinus Torvalds /* 761da177e4SLinus Torvalds * Function: queue_remove_all_target(queue, target) 771da177e4SLinus Torvalds * Purpose : remove all SCSI commands from the queue for a specified target 781da177e4SLinus Torvalds * Params : queue - queue to remove command from 791da177e4SLinus Torvalds * target - target device id 801da177e4SLinus Torvalds * Returns : nothing 811da177e4SLinus Torvalds */ 821da177e4SLinus Torvalds extern void queue_remove_all_target(Queue_t *queue, int target); 831da177e4SLinus Torvalds 841da177e4SLinus Torvalds /* 851da177e4SLinus Torvalds * Function: int queue_probetgtlun (queue, target, lun) 861da177e4SLinus Torvalds * Purpose : check to see if we have a command in the queue for the specified 871da177e4SLinus Torvalds * target/lun. 881da177e4SLinus Torvalds * Params : queue - queue to look in 891da177e4SLinus Torvalds * target - target we want to probe 901da177e4SLinus Torvalds * lun - lun on target 911da177e4SLinus Torvalds * Returns : 0 if not found, != 0 if found 921da177e4SLinus Torvalds */ 931da177e4SLinus Torvalds extern int queue_probetgtlun (Queue_t *queue, int target, int lun); 941da177e4SLinus Torvalds 951da177e4SLinus Torvalds /* 96ee0ca6baSHenne * Function: int queue_remove_cmd (Queue_t *queue, struct scsi_cmnd *SCpnt) 971da177e4SLinus Torvalds * Purpose : remove a specific command from the queues 981da177e4SLinus Torvalds * Params : queue - queue to look in 991da177e4SLinus Torvalds * SCpnt - command to find 1001da177e4SLinus Torvalds * Returns : 0 if not found 1011da177e4SLinus Torvalds */ 102ee0ca6baSHenne int queue_remove_cmd(Queue_t *queue, struct scsi_cmnd *SCpnt); 1031da177e4SLinus Torvalds 1041da177e4SLinus Torvalds #endif /* QUEUE_H */ 105