1/* 2** Copyright 2002/03, Thomas Kurschel. All rights reserved. 3** Distributed under the terms of the MIT License. 4*/ 5 6/* 7 Part of Open SCSI bus manager 8 9 Special locks 10 11 The only one defined herein is a spinlock that automatically 12 disabled IRQs on enter and restores them on leave. Probably, 13 this should be made public as it's quite basic. 14*/ 15 16#ifndef __SCSI_LOCK_H__ 17#define __SCSI_LOCK_H__ 18 19#include <KernelExport.h> 20 21 22// enhanced spinlock that automatically disables irqs when lock is hold 23typedef struct spinlock_irq { 24 spinlock lock; // normal spinlock 25 cpu_status prev_irq_state; // irq state before spinlock was entered 26} spinlock_irq; 27 28 29static inline void 30spinlock_irq_init(spinlock_irq *lock) 31{ 32 B_INITIALIZE_SPINLOCK(&lock->lock); 33} 34 35static inline void 36acquire_spinlock_irq(spinlock_irq *lock) 37{ 38 cpu_status prev_irq_state = disable_interrupts(); 39 40 acquire_spinlock(&lock->lock); 41 lock->prev_irq_state = prev_irq_state; 42} 43 44static inline void 45release_spinlock_irq(spinlock_irq *lock) 46{ 47 cpu_status prev_irq_state = lock->prev_irq_state; 48 49 release_spinlock(&lock->lock); 50 restore_interrupts(prev_irq_state); 51} 52 53#endif 54