diff options
Diffstat (limited to 'drivers/scsi/atari_scsi.c')
| -rw-r--r-- | drivers/scsi/atari_scsi.c | 84 | 
1 files changed, 39 insertions, 45 deletions
diff --git a/drivers/scsi/atari_scsi.c b/drivers/scsi/atari_scsi.c index ad7a23aef0e..b522134528d 100644 --- a/drivers/scsi/atari_scsi.c +++ b/drivers/scsi/atari_scsi.c @@ -67,12 +67,6 @@  #include <linux/module.h> -#define NDEBUG (0) - -#define NDEBUG_ABORT		0x00100000 -#define NDEBUG_TAGS		0x00200000 -#define NDEBUG_MERGING		0x00400000 -  #define AUTOSENSE  /* For the Atari version, use only polled IO or REAL_DMA */  #define	REAL_DMA @@ -90,6 +84,7 @@  #include <linux/init.h>  #include <linux/nvram.h>  #include <linux/bitops.h> +#include <linux/wait.h>  #include <asm/setup.h>  #include <asm/atarihw.h> @@ -313,7 +308,7 @@ static irqreturn_t scsi_tt_intr(int irq, void *dummy)  	dma_stat = tt_scsi_dma.dma_ctrl; -	INT_PRINTK("scsi%d: NCR5380 interrupt, DMA status = %02x\n", +	dprintk(NDEBUG_INTR, "scsi%d: NCR5380 interrupt, DMA status = %02x\n",  		   atari_scsi_host->host_no, dma_stat & 0xff);  	/* Look if it was the DMA that has interrupted: First possibility @@ -339,7 +334,7 @@ static irqreturn_t scsi_tt_intr(int irq, void *dummy)  	if ((dma_stat & 0x02) && !(dma_stat & 0x40)) {  		atari_dma_residual = HOSTDATA_DMALEN - (SCSI_DMA_READ_P(dma_addr) - atari_dma_startaddr); -		DMA_PRINTK("SCSI DMA: There are %ld residual bytes.\n", +		dprintk(NDEBUG_DMA, "SCSI DMA: There are %ld residual bytes.\n",  			   atari_dma_residual);  		if ((signed int)atari_dma_residual < 0) @@ -370,7 +365,7 @@ static irqreturn_t scsi_tt_intr(int irq, void *dummy)  			 * other command.  These shouldn't disconnect anyway.  			 */  			if (atari_dma_residual & 0x1ff) { -				DMA_PRINTK("SCSI DMA: DMA bug corrected, " +				dprintk(NDEBUG_DMA, "SCSI DMA: DMA bug corrected, "  					   "difference %ld bytes\n",  					   512 - (atari_dma_residual & 0x1ff));  				atari_dma_residual = (atari_dma_residual + 511) & ~0x1ff; @@ -437,7 +432,7 @@ static irqreturn_t scsi_falcon_intr(int irq, void *dummy)  			       "ST-DMA fifo\n", transferred & 15);  		atari_dma_residual = HOSTDATA_DMALEN - transferred; -		DMA_PRINTK("SCSI DMA: There are %ld residual bytes.\n", +		dprintk(NDEBUG_DMA, "SCSI DMA: There are %ld residual bytes.\n",  			   atari_dma_residual);  	} else  		atari_dma_residual = 0; @@ -473,11 +468,11 @@ static void atari_scsi_fetch_restbytes(void)  		/* there are 'nr' bytes left for the last long address  		   before the DMA pointer */  		phys_dst ^= nr; -		DMA_PRINTK("SCSI DMA: there are %d rest bytes for phys addr 0x%08lx", +		dprintk(NDEBUG_DMA, "SCSI DMA: there are %d rest bytes for phys addr 0x%08lx",  			   nr, phys_dst);  		/* The content of the DMA pointer is a physical address!  */  		dst = phys_to_virt(phys_dst); -		DMA_PRINTK(" = virt addr %p\n", dst); +		dprintk(NDEBUG_DMA, " = virt addr %p\n", dst);  		for (src = (char *)&tt_scsi_dma.dma_restdata; nr != 0; --nr)  			*dst++ = *src++;  	} @@ -549,8 +544,10 @@ static void falcon_get_lock(void)  	local_irq_save(flags); -	while (!in_irq() && falcon_got_lock && stdma_others_waiting()) -		sleep_on(&falcon_fairness_wait); +	wait_event_cmd(falcon_fairness_wait, +		in_interrupt() || !falcon_got_lock || !stdma_others_waiting(), +		local_irq_restore(flags), +		local_irq_save(flags));  	while (!falcon_got_lock) {  		if (in_irq()) @@ -562,7 +559,10 @@ static void falcon_get_lock(void)  			falcon_trying_lock = 0;  			wake_up(&falcon_try_wait);  		} else { -			sleep_on(&falcon_try_wait); +			wait_event_cmd(falcon_try_wait, +				falcon_got_lock && !falcon_trying_lock, +				local_irq_restore(flags), +				local_irq_save(flags));  		}  	} @@ -572,24 +572,7 @@ static void falcon_get_lock(void)  } -/* This is the wrapper function for NCR5380_queue_command(). It just - * tries to get the lock on the ST-DMA (see above) and then calls the - * original function. - */ - -#if 0 -int atari_queue_command(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)) -{ -	/* falcon_get_lock(); -	 * ++guenther: moved to NCR5380_queue_command() to prevent -	 * race condition, see there for an explanation. -	 */ -	return NCR5380_queue_command(cmd, done); -} -#endif - - -int __init atari_scsi_detect(struct scsi_host_template *host) +static int __init atari_scsi_detect(struct scsi_host_template *host)  {  	static int called = 0;  	struct Scsi_Host *instance; @@ -650,7 +633,7 @@ int __init atari_scsi_detect(struct scsi_host_template *host)  					"double buffer\n");  			return 0;  		} -		atari_dma_phys_buffer = virt_to_phys(atari_dma_buffer); +		atari_dma_phys_buffer = atari_stram_to_phys(atari_dma_buffer);  		atari_dma_orig_addr = 0;  	}  #endif @@ -741,26 +724,31 @@ int __init atari_scsi_detect(struct scsi_host_template *host)  	return 1;  } -int atari_scsi_release(struct Scsi_Host *sh) +static int atari_scsi_release(struct Scsi_Host *sh)  {  	if (IS_A_TT())  		free_irq(IRQ_TT_MFP_SCSI, sh);  	if (atari_dma_buffer)  		atari_stram_free(atari_dma_buffer); +	NCR5380_exit(sh);  	return 1;  } -void __init atari_scsi_setup(char *str, int *ints) +#ifndef MODULE +static int __init atari_scsi_setup(char *str)  {  	/* Format of atascsi parameter is:  	 *   atascsi=<can_queue>,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>  	 * Defaults depend on TT or Falcon, hostid determined at run time.  	 * Negative values mean don't change.  	 */ +	int ints[6]; + +	get_options(str, ARRAY_SIZE(ints), ints);  	if (ints[0] < 1) {  		printk("atari_scsi_setup: no arguments!\n"); -		return; +		return 0;  	}  	if (ints[0] >= 1) { @@ -793,9 +781,14 @@ void __init atari_scsi_setup(char *str, int *ints)  			setup_use_tagged_queuing = !!ints[5];  	}  #endif + +	return 1;  } -int atari_scsi_bus_reset(Scsi_Cmnd *cmd) +__setup("atascsi=", atari_scsi_setup); +#endif /* !MODULE */ + +static int atari_scsi_bus_reset(Scsi_Cmnd *cmd)  {  	int rv;  	struct NCR5380_hostdata *hostdata = @@ -828,7 +821,7 @@ int atari_scsi_bus_reset(Scsi_Cmnd *cmd)  	} else {  		atari_turnon_irq(IRQ_MFP_FSCSI);  	} -	if ((rv & SCSI_RESET_ACTION) == SCSI_RESET_SUCCESS) +	if (rv == SUCCESS)  		falcon_release_lock_if_possible(hostdata);  	return rv; @@ -868,7 +861,7 @@ static void __init atari_scsi_reset_boot(void)  #endif -const char *atari_scsi_info(struct Scsi_Host *host) +static const char *atari_scsi_info(struct Scsi_Host *host)  {  	/* atari_scsi_detect() is verbose enough... */  	static const char string[] = "Atari native SCSI"; @@ -878,12 +871,13 @@ const char *atari_scsi_info(struct Scsi_Host *host)  #if defined(REAL_DMA) -unsigned long atari_scsi_dma_setup(struct Scsi_Host *instance, void *data, -				   unsigned long count, int dir) +static unsigned long atari_scsi_dma_setup(struct Scsi_Host *instance, +					  void *data, unsigned long count, +					  int dir)  {  	unsigned long addr = virt_to_phys(data); -	DMA_PRINTK("scsi%d: setting up dma, data = %p, phys = %lx, count = %ld, " +	dprintk(NDEBUG_DMA, "scsi%d: setting up dma, data = %p, phys = %lx, count = %ld, "  		   "dir = %d\n", instance->host_no, data, addr, count, dir);  	if (!IS_A_TT() && !STRAM_ADDR(addr)) { @@ -1063,7 +1057,7 @@ static unsigned long atari_dma_xfer_len(unsigned long wanted_len,  		possible_len = limit;  	if (possible_len != wanted_len) -		DMA_PRINTK("Sorry, must cut DMA transfer size to %ld bytes " +		dprintk(NDEBUG_DMA, "Sorry, must cut DMA transfer size to %ld bytes "  			   "instead of %ld\n", possible_len, wanted_len);  	return possible_len; @@ -1106,7 +1100,7 @@ static void atari_scsi_falcon_reg_write(unsigned char reg, unsigned char value)  #include "atari_NCR5380.c"  static struct scsi_host_template driver_template = { -	.proc_info		= atari_scsi_proc_info, +	.show_info		= atari_scsi_show_info,  	.name			= "Atari native SCSI",  	.detect			= atari_scsi_detect,  	.release		= atari_scsi_release,  | 
