Don't disable irqs when waiting for the ST DMA "lock"; its release may require an interrupt. Introduce stdma_try_lock() for use in soft irq context. atari_scsi now tells the SCSI mid-layer to defer queueing a command if the ST DMA lock is not available, as per Michael's patch: http://marc.info/?l=linux-m68k&m=139095335824863&w=2 The falcon_got_lock variable is race prone: we can't disable IRQs while waiting to acquire the lock, so after acquiring it there must be some interval during which falcon_got_lock remains false. Introduce stdma_is_locked_by() to replace falcon_got_lock. The falcon_got_lock tests in the EH handlers are incorrect these days. It can happen that an EH handler is called after a command completes normally. Remove these checks along with falcon_got_lock. Also remove the complicated and racy fairness wait queues. If fairness is an issue (when SCSI competes with IDE for the ST DMA interrupt), the solution is likely to be a lower value for host->can_queue. Signed-off-by: Finn Thain <fthain@telegraphics.com.au> Reviewed-by: Hannes Reinecke <hare@suse.de> Tested-by: Michael Schmitz <schmitzmic@gmail.com> Acked-by: Geert Uytterhoeven <geert@linux-m68k.org> Signed-off-by: Christoph Hellwig <hch@lst.de>
		
			
				
	
	
		
			22 lines
		
	
	
	
		
			475 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			22 lines
		
	
	
	
		
			475 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
 | 
						|
#ifndef _atari_stdma_h
 | 
						|
#define _atari_stdma_h
 | 
						|
 | 
						|
 | 
						|
#include <linux/interrupt.h>
 | 
						|
 | 
						|
 | 
						|
/***************************** Prototypes *****************************/
 | 
						|
 | 
						|
int stdma_try_lock(irq_handler_t, void *);
 | 
						|
void stdma_lock(irq_handler_t handler, void *data);
 | 
						|
void stdma_release( void );
 | 
						|
int stdma_islocked( void );
 | 
						|
int stdma_is_locked_by(irq_handler_t);
 | 
						|
void stdma_init( void );
 | 
						|
 | 
						|
/************************* End of Prototypes **************************/
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#endif  /* _atari_stdma_h */
 |