/*
 * acsi_slm.c -- Device driver for the Atari SLM laser printer
 *
 * Copyright 1995 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file COPYING in the main directory of this archive for
 * more details.
 * 
 */

/*

Notes:

The major number for SLM printers is 28 (like ACSI), but as a character
device, not block device. The minor number is the number of the printer (if
you have more than one SLM; currently max. 2 (#define-constant) SLMs are
supported). The device can be opened for reading and writing. If reading it,
you get some status infos (MODE SENSE data). Writing mode is used for the data
to be printed. Some ioctls allow to get the printer status and to tune printer
modes and some internal variables.

A special problem of the SLM driver is the timing and thus the buffering of
the print data. The problem is that all the data for one page must be present
in memory when printing starts, else --when swapping occurs-- the timing could
not be guaranteed. There are several ways to assure this:

 1) Reserve a buffer of 1196k (maximum page size) statically by
    atari_stram_alloc(). The data are collected there until they're complete,
	and then printing starts. Since the buffer is reserved, no further
	considerations about memory and swapping are needed. So this is the
	simplest method, but it needs a lot of memory for just the SLM.

    An striking advantage of this method is (supposed the SLM_CONT_CNT_REPROG
	method works, see there), that there are no timing problems with the DMA
	anymore.
	
 2) The other method would be to reserve the buffer dynamically each time
    printing is required. I could think of looking at mem_map where the
	largest unallocted ST-RAM area is, taking the area, and then extending it
	by swapping out the neighbored pages, until the needed size is reached.
	This requires some mm hacking, but seems possible. The only obstacle could
	be pages that cannot be swapped out (reserved pages)...

 3) Another possibility would be to leave the real data in user space and to
    work with two dribble buffers of about 32k in the driver: While the one
	buffer is DMAed to the SLM, the other can be filled with new data. But
	to keep the timing, that requires that the user data remain in memory and
	are not swapped out. Requires mm hacking, too, but maybe not so bad as
	method 2).

*/

#include <linux/module.h>

#include <linux/errno.h>
#include <linux/sched.h>
#include <linux/timer.h>
#include <linux/fs.h>
#include <linux/major.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/time.h>
#include <linux/mm.h>
#include <linux/slab.h>

#include <asm/pgtable.h>
#include <asm/system.h>
#include <asm/uaccess.h>
#include <asm/atarihw.h>
#include <asm/atariints.h>
#include <asm/atari_acsi.h>
#include <asm/atari_stdma.h>
#include <asm/atari_stram.h>
#include <asm/atari_SLM.h>


#undef	DEBUG

/* Define this if the page data are continuous in physical memory. That
 * requires less reprogramming of the ST-DMA */
#define	SLM_CONTINUOUS_DMA

/* Use continuous reprogramming of the ST-DMA counter register. This is
 * --strictly speaking-- not allowed, Atari recommends not to look at the
 * counter register while a DMA is going on. But I don't know if that applies
 * only for reading the register, or also writing to it. Writing only works
 * fine for me... The advantage is that the timing becomes absolutely
 * uncritical: Just update each, say 200ms, the counter reg to its maximum,
 * and the DMA will work until the status byte interrupt occurs.
 */
#define	SLM_CONT_CNT_REPROG

#define CMDSET_TARG_LUN(cmd,targ,lun)			\
    do {										\
		cmd[0] = (cmd[0] & ~0xe0) | (targ)<<5;	\
		cmd[1] = (cmd[1] & ~0xe0) | (lun)<<5;	\
	} while(0)

#define	START_TIMER(to)	mod_timer(&slm_timer, jiffies + (to))
#define	STOP_TIMER()	del_timer(&slm_timer)


static char slmreqsense_cmd[6] = { 0x03, 0, 0, 0, 0, 0 };
static char slmprint_cmd[6]    = { 0x0a, 0, 0, 0, 0, 0 };
static char slminquiry_cmd[6]  = { 0x12, 0, 0, 0, 0, 0x80 };
static char slmmsense_cmd[6]   = { 0x1a, 0, 0, 0, 255, 0 };
#if 0
static char slmmselect_cmd[6]  = { 0x15, 0, 0, 0, 0, 0 };
#endif


#define	MAX_SLM		2

static struct slm {
	unsigned	target;			/* target number */
	unsigned	lun;			/* LUN in target controller */
	atomic_t	wr_ok; 			/* set to 0 if output part busy */
	atomic_t	rd_ok;			/* set to 0 if status part busy */
} slm_info[MAX_SLM];

int N_SLM_Printers = 0;

/* printer buffer */
static unsigned char	*SLMBuffer;	/* start of buffer */
static unsigned char	*BufferP;	/* current position in buffer */
static int				BufferSize;	/* length of buffer for page size */

typedef enum { IDLE, FILLING, PRINTING } SLMSTATE;
static SLMSTATE			SLMState;
static int				SLMBufOwner;	/* SLM# currently using the buffer */

/* DMA variables */
#ifndef SLM_CONT_CNT_REPROG
static unsigned long	SLMCurAddr;		/* current base addr of DMA chunk */
static unsigned long	SLMEndAddr;		/* expected end addr */
static unsigned long	SLMSliceSize;	/* size of one DMA chunk */
#endif
static int				SLMError;

/* wait queues */
static DECLARE_WAIT_QUEUE_HEAD(slm_wait);	/* waiting for buffer */
static DECLARE_WAIT_QUEUE_HEAD(print_wait);	/* waiting for printing finished */

/* status codes */
#define	SLMSTAT_OK		0x00
#define	SLMSTAT_ORNERY	0x02
#define	SLMSTAT_TONER	0x03
#define	SLMSTAT_WARMUP	0x04
#define	SLMSTAT_PAPER	0x05
#define	SLMSTAT_DRUM	0x06
#define	SLMSTAT_INJAM	0x07
#define	SLMSTAT_THRJAM	0x08
#define	SLMSTAT_OUTJAM	0x09
#define	SLMSTAT_COVER	0x0a
#define	SLMSTAT_FUSER	0x0b
#define	SLMSTAT_IMAGER	0x0c
#define	SLMSTAT_MOTOR	0x0d
#define	SLMSTAT_VIDEO	0x0e
#define	SLMSTAT_SYSTO	0x10
#define	SLMSTAT_OPCODE	0x12
#define	SLMSTAT_DEVNUM	0x15
#define	SLMSTAT_PARAM	0x1a
#define	SLMSTAT_ACSITO	0x1b	/* driver defined */
#define	SLMSTAT_NOTALL	0x1c	/* driver defined */

static char *SLMErrors[] = {
	/* 0x00 */	"OK and ready",
	/* 0x01 */	NULL,
	/* 0x02 */	"ornery printer",
	/* 0x03 */	"toner empty",
	/* 0x04 */	"warming up",
	/* 0x05 */	"paper empty",
	/* 0x06 */	"drum empty",
	/* 0x07 */	"input jam",
	/* 0x08 */	"through jam",
	/* 0x09 */	"output jam",
	/* 0x0a */	"cover open",
	/* 0x0b */	"fuser malfunction",
	/* 0x0c */	"imager malfunction",
	/* 0x0d */	"motor malfunction",
	/* 0x0e */	"video malfunction",
	/* 0x0f */	NULL,
	/* 0x10 */	"printer system timeout",
	/* 0x11 */	NULL,
	/* 0x12 */	"invalid operation code",
	/* 0x13 */	NULL,
	/* 0x14 */	NULL,
	/* 0x15 */	"invalid device number",
	/* 0x16 */	NULL,
	/* 0x17 */	NULL,
	/* 0x18 */	NULL,
	/* 0x19 */	NULL,
	/* 0x1a */	"invalid parameter list",
	/* 0x1b */	"ACSI timeout",
	/* 0x1c */	"not all printed"
};

#define	N_ERRORS	(sizeof(SLMErrors)/sizeof(*SLMErrors))

/* real (driver caused) error? */
#define	IS_REAL_ERROR(x)	(x > 0x10)


static struct {
	char	*name;
	int 	w, h;
} StdPageSize[] = {
	{ "Letter", 2400, 3180 },
	{ "Legal",  2400, 4080 },
	{ "A4",     2336, 3386 },
	{ "B5",     2016, 2914 }
};

#define	N_STD_SIZES		(sizeof(StdPageSize)/sizeof(*StdPageSize))

#define	SLM_BUFFER_SIZE	(2336*3386/8)	/* A4 for now */
#define	SLM_DMA_AMOUNT	255				/* #sectors to program the DMA for */

#ifdef	SLM_CONTINUOUS_DMA
# define	SLM_DMA_INT_OFFSET	0		/* DMA goes until seccnt 0, no offs */
# define	SLM_DMA_END_OFFSET	32		/* 32 Byte ST-DMA FIFO */
# define	SLM_SLICE_SIZE(w) 	(255*512)
#else
# define	SLM_DMA_INT_OFFSET	32		/* 32 Byte ST-DMA FIFO */
# define	SLM_DMA_END_OFFSET	32		/* 32 Byte ST-DMA FIFO */
# define	SLM_SLICE_SIZE(w)	((254*512)/(w/8)*(w/8))
#endif

/* calculate the number of jiffies to wait for 'n' bytes */
#ifdef SLM_CONT_CNT_REPROG
#define	DMA_TIME_FOR(n)		50
#define	DMA_STARTUP_TIME	0
#else
#define	DMA_TIME_FOR(n)		(n/1400-1)
#define	DMA_STARTUP_TIME	650
#endif

/***************************** Prototypes *****************************/

static char *slm_errstr( int stat );
static int slm_getstats( char *buffer, int device );
static ssize_t slm_read( struct file* file, char *buf, size_t count, loff_t
                         *ppos );
static void start_print( int device );
static irqreturn_t slm_interrupt(int irc, void *data);
static void slm_test_ready( unsigned long dummy );
static void set_dma_addr( unsigned long paddr );
static unsigned long get_dma_addr( void );
static ssize_t slm_write( struct file *file, const char *buf, size_t count,
                          loff_t *ppos );
static int slm_ioctl( struct inode *inode, struct file *file, unsigned int
                      cmd, unsigned long arg );
static int slm_open( struct inode *inode, struct file *file );
static int slm_release( struct inode *inode, struct file *file );
static int slm_req_sense( int device );
static int slm_mode_sense( int device, char *buffer, int abs_flag );
#if 0
static int slm_mode_select( int device, char *buffer, int len, int
                            default_flag );
#endif
static int slm_get_pagesize( int device, int *w, int *h );

/************************* End of Prototypes **************************/


static DEFINE_TIMER(slm_timer, slm_test_ready, 0, 0);

static const struct file_operations slm_fops = {
	.owner =	THIS_MODULE,
	.read =		slm_read,
	.write =	slm_write,
	.ioctl =	slm_ioctl,
	.open =		slm_open,
	.release =	slm_release,
};


/* ---------------------------------------------------------------------- */
/*							   Status Functions							  */


static char *slm_errstr( int stat )

{	char *p;
	static char	str[22];

	stat &= 0x1f;
	if (stat >= 0 && stat < N_ERRORS && (p = SLMErrors[stat]))
		return( p );
	sprintf( str, "unknown status 0x%02x", stat );
	return( str );
}


static int slm_getstats( char *buffer, int device )

{	int 			len = 0, stat, i, w, h;
	unsigned char	buf[256];
	
	stat = slm_mode_sense( device, buf, 0 );
	if (IS_REAL_ERROR(stat))
		return( -EIO );
	
#define SHORTDATA(i)		((buf[i] << 8) | buf[i+1])
#define	BOOLDATA(i,mask)	((buf[i] & mask) ? "on" : "off")

	w = SHORTDATA( 3 );
	h = SHORTDATA( 1 );
		
	len += sprintf( buffer+len, "Status\t\t%s\n",
					slm_errstr( stat ) );
	len += sprintf( buffer+len, "Page Size\t%dx%d",
					w, h );

	for( i = 0; i < N_STD_SIZES; ++i ) {
		if (w == StdPageSize[i].w && h == StdPageSize[i].h)
			break;
	}
	if (i < N_STD_SIZES)
		len += sprintf( buffer+len, " (%s)", StdPageSize[i].name );
	buffer[len++] = '\n';

	len += sprintf( buffer+len, "Top/Left Margin\t%d/%d\n",
					SHORTDATA( 5 ), SHORTDATA( 7 ) );
	len += sprintf( buffer+len, "Manual Feed\t%s\n",
					BOOLDATA( 9, 0x01 ) );
	len += sprintf( buffer+len, "Input Select\t%d\n",
					(buf[9] >> 1) & 7 );
	len += sprintf( buffer+len, "Auto Select\t%s\n",
					BOOLDATA( 9, 0x10 ) );
	len += sprintf( buffer+len, "Prefeed Paper\t%s\n",
					BOOLDATA( 9, 0x20 ) );
	len += sprintf( buffer+len, "Thick Pixels\t%s\n",
					BOOLDATA( 9, 0x40 ) );
	len += sprintf( buffer+len, "H/V Resol.\t%d/%d dpi\n",
					SHORTDATA( 12 ), SHORTDATA( 10 ) );
	len += sprintf( buffer+len, "System Timeout\t%d\n",
					buf[14] );
	len += sprintf( buffer+len, "Scan Time\t%d\n",
					SHORTDATA( 15 ) );
	len += sprintf( buffer+len, "Page Count\t%d\n",
					SHORTDATA( 17 ) );
	len += sprintf( buffer+len, "In/Out Cap.\t%d/%d\n",
					SHORTDATA( 19 ), SHORTDATA( 21 ) );
	len += sprintf( buffer+len, "Stagger Output\t%s\n",
					BOOLDATA( 23, 0x01 ) );
	len += sprintf( buffer+len, "Output Select\t%d\n",
					(buf[23] >> 1) & 7 );
	len += sprintf( buffer+len, "Duplex Print\t%s\n",
					BOOLDATA( 23, 0x10 ) );
	len += sprintf( buffer+len, "Color Sep.\t%s\n",
					BOOLDATA( 23, 0x20 ) );

	return( len );
}


static ssize_t slm_read( struct file *file, char *buf, size_t count,
						 loff_t *ppos )

{
	struct inode *node = file->f_path.dentry->d_inode;
	unsigned long page;
	int length;
	int end;

	if (!(page = __get_free_page( GFP_KERNEL )))
		return( -ENOMEM );
	
	length = slm_getstats( (char *)page, iminor(node) );
	if (length < 0) {
		count = length;
		goto out;
	}
	if (file->f_pos >= length) {
		count = 0;
		goto out;
	}
	if (count + file->f_pos > length)
		count = length - file->f_pos;
	end = count + file->f_pos;
	if (copy_to_user(buf, (char *)page + file->f_pos, count)) {
		count = -EFAULT;
		goto out;
	}
	file->f_pos = end;
out:	free_page( page );
	return( count );
}


/* ---------------------------------------------------------------------- */
/*								   Printing								  */


static void start_print( int device )

{	struct slm *sip = &slm_info[device];
	unsigned char	*cmd;
	unsigned long	paddr;
	int				i;
	
	stdma_lock( slm_interrupt, NULL );

	CMDSET_TARG_LUN( slmprint_cmd, sip->target, sip->lun );
	cmd = slmprint_cmd;
	paddr = virt_to_phys( SLMBuffer );
	dma_cache_maintenance( paddr, virt_to_phys(BufferP)-paddr, 1 );
	DISABLE_IRQ();

	/* Low on A1 */
	dma_wd.dma_mode_status = 0x88;
	MFPDELAY();

	/* send the command bytes except the last */
	for( i = 0; i < 5; ++i ) {
		DMA_LONG_WRITE( *cmd++, 0x8a );
		udelay(20);
		if (!acsi_wait_for_IRQ( HZ/2 )) {
			SLMError = 1;
			return; /* timeout */
		}
	}
	/* last command byte */
	DMA_LONG_WRITE( *cmd++, 0x82 );
	MFPDELAY();
	/* set DMA address */
	set_dma_addr( paddr );
	/* program DMA for write and select sector counter reg */
	dma_wd.dma_mode_status = 0x192;
	MFPDELAY();
	/* program for 255*512 bytes and start DMA */
	DMA_LONG_WRITE( SLM_DMA_AMOUNT, 0x112 );

#ifndef SLM_CONT_CNT_REPROG
	SLMCurAddr = paddr;
	SLMEndAddr = paddr + SLMSliceSize + SLM_DMA_INT_OFFSET;
#endif
	START_TIMER( DMA_STARTUP_TIME + DMA_TIME_FOR( SLMSliceSize ));
#if !defined(SLM_CONT_CNT_REPROG) && defined(DEBUG)
	printk( "SLM: CurAddr=%#lx EndAddr=%#lx timer=%ld\n",
			SLMCurAddr, SLMEndAddr, DMA_TIME_FOR( SLMSliceSize ) );
#endif
	
	ENABLE_IRQ();
}


/* Only called when an error happened or at the end of a page */

static irqreturn_t slm_interrupt(int irc, void *data)

{	unsigned long	addr;
	int				stat;
	
	STOP_TIMER();
	addr = get_dma_addr();
	stat = acsi_getstatus();
	SLMError = (stat < 0)             ? SLMSTAT_ACSITO :
		       (addr < virt_to_phys(BufferP)) ? SLMSTAT_NOTALL :
									    stat;

	dma_wd.dma_mode_status = 0x80;
	MFPDELAY();
#ifdef DEBUG
	printk( "SLM: interrupt, addr=%#lx, error=%d\n", addr, SLMError );
#endif

	wake_up( &print_wait );
	stdma_release();
	ENABLE_IRQ();
	return IRQ_HANDLED;
}


static void slm_test_ready( unsigned long dummy )

{
#ifdef SLM_CONT_CNT_REPROG
	/* program for 255*512 bytes again */
	dma_wd.fdc_acces_seccount = SLM_DMA_AMOUNT;
	START_TIMER( DMA_TIME_FOR(0) );
#ifdef DEBUG
	printk( "SLM: reprogramming timer for %d jiffies, addr=%#lx\n",
			DMA_TIME_FOR(0), get_dma_addr() );
#endif
	
#else /* !SLM_CONT_CNT_REPROG */

	unsigned long	flags, addr;
	int				d, ti;
#ifdef DEBUG
	struct timeval start_tm, end_tm;
	int			   did_wait = 0;
#endif

	local_irq_save(flags);

	addr = get_dma_addr();
	if ((d = SLMEndAddr - addr) > 0) {
		local_irq_restore(flags);
		
		/* slice not yet finished, decide whether to start another timer or to
		 * busy-wait */
		ti = DMA_TIME_FOR( d );
		if (ti > 0) {
#ifdef DEBUG
			printk( "SLM: reprogramming timer for %d jiffies, rest %d bytes\n",
					ti, d );
#endif
			START_TIMER( ti );
			return;
		}
		/* wait for desired end address to be reached */
#ifdef DEBUG
		do_gettimeofday( &start_tm );
		did_wait = 1;
#endif
		local_irq_disable();
		while( get_dma_addr() < SLMEndAddr )
			barrier();
	}

	/* slice finished, start next one */
	SLMCurAddr += SLMSliceSize;

#ifdef SLM_CONTINUOUS_DMA
	/* program for 255*512 bytes again */
	dma_wd.fdc_acces_seccount = SLM_DMA_AMOUNT;
#else
	/* set DMA address;
	 * add 2 bytes for the ones in the SLM controller FIFO! */
	set_dma_addr( SLMCurAddr + 2 );
	/* toggle DMA to write and select sector counter reg */
	dma_wd.dma_mode_status = 0x92;
	MFPDELAY();
	dma_wd.dma_mode_status = 0x192;
	MFPDELAY();
	/* program for 255*512 bytes and start DMA */
	DMA_LONG_WRITE( SLM_DMA_AMOUNT, 0x112 );
#endif
	
	local_irq_restore(flags);

#ifdef DEBUG
	if (did_wait) {
		int ms;
		do_gettimeofday( &end_tm );
		ms = (end_tm.tv_sec*1000000+end_tm.tv_usec) -
			 (start_tm.tv_sec*1000000+start_tm.tv_usec); 
		printk( "SLM: did %ld.%ld ms busy waiting for %d bytes\n",
				ms/1000, ms%1000, d );
	}
	else
		printk( "SLM: didn't wait (!)\n" );
#endif

	if ((unsigned char *)PTOV( SLMCurAddr + SLMSliceSize ) >= BufferP) {
		/* will be last slice, no timer necessary */
#ifdef DEBUG
		printk( "SLM: CurAddr=%#lx EndAddr=%#lx last slice -> no timer\n",
				SLMCurAddr, SLMEndAddr );
#endif
	}
	else {
		/* not last slice */
		SLMEndAddr = SLMCurAddr + SLMSliceSize + SLM_DMA_INT_OFFSET;
		START_TIMER( DMA_TIME_FOR( SLMSliceSize ));
#ifdef DEBUG
		printk( "SLM: CurAddr=%#lx EndAddr=%#lx timer=%ld\n",
				SLMCurAddr, SLMEndAddr, DMA_TIME_FOR( SLMSliceSize ) );
#endif
	}
#endif /* SLM_CONT_CNT_REPROG */
}


static void set_dma_addr( unsigned long paddr )

{	unsigned long flags;

	local_irq_save(flags);
	dma_wd.dma_lo = (unsigned char)paddr;
	paddr >>= 8;
	MFPDELAY();
	dma_wd.dma_md = (unsigned char)paddr;
	paddr >>= 8;
	MFPDELAY();
	if (ATARIHW_PRESENT( EXTD_DMA ))
		st_dma_ext_dmahi = (unsigned short)paddr;
	else
		dma_wd.dma_hi = (unsigned char)paddr;
	MFPDELAY();
	local_irq_restore(flags);
}


static unsigned long get_dma_addr( void )

{	unsigned long	addr;
	
	addr = dma_wd.dma_lo & 0xff;
	MFPDELAY();
	addr |= (dma_wd.dma_md & 0xff) << 8;
	MFPDELAY();
	addr |= (dma_wd.dma_hi & 0xff) << 16;
	MFPDELAY();

	return( addr );
}


static ssize_t slm_write( struct file *file, const char *buf, size_t count,
						  loff_t *ppos )

{
	struct inode *node = file->f_path.dentry->d_inode;
	int		device = iminor(node);
	int		n, filled, w, h;

	while( SLMState == PRINTING ||
		   (SLMState == FILLING && SLMBufOwner != device) ) {
		interruptible_sleep_on( &slm_wait );
		if (signal_pending(current))
			return( -ERESTARTSYS );
	}
	if (SLMState == IDLE) {
		/* first data of page: get current page size  */
		if (slm_get_pagesize( device, &w, &h ))
			return( -EIO );
		BufferSize = w*h/8;
		if (BufferSize > SLM_BUFFER_SIZE)
			return( -ENOMEM );

		SLMState = FILLING;
		SLMBufOwner = device;
	}

	n = count;
	filled = BufferP - SLMBuffer;
	if (filled + n > BufferSize)
		n = BufferSize - filled;

	if (copy_from_user(BufferP, buf, n))
		return -EFAULT;
	BufferP += n;
	filled += n;

	if (filled == BufferSize) {
		/* Check the paper size again! The user may have switched it in the
		 * time between starting the data and finishing them. Would end up in
		 * a trashy page... */
		if (slm_get_pagesize( device, &w, &h ))
			return( -EIO );
		if (BufferSize != w*h/8) {
			printk( KERN_NOTICE "slm%d: page size changed while printing\n",
					device );
			return( -EAGAIN );
		}

		SLMState = PRINTING;
		/* choose a slice size that is a multiple of the line size */
#ifndef SLM_CONT_CNT_REPROG
		SLMSliceSize = SLM_SLICE_SIZE(w);
#endif
		
		start_print( device );
		sleep_on( &print_wait );
		if (SLMError && IS_REAL_ERROR(SLMError)) {
			printk( KERN_ERR "slm%d: %s\n", device, slm_errstr(SLMError) );
			n = -EIO;
		}

		SLMState = IDLE;
		BufferP = SLMBuffer;
		wake_up_interruptible( &slm_wait );
	}
	
	return( n );
}


/* ---------------------------------------------------------------------- */
/*							   ioctl Functions							  */


static int slm_ioctl( struct inode *inode, struct file *file,
					  unsigned int cmd, unsigned long arg )

{	int		device = iminor(inode), err;
	
	/* I can think of setting:
	 *  - manual feed
	 *  - paper format
	 *  - copy count
	 *  - ...
	 * but haven't implemented that yet :-)
	 * BTW, has anybody better docs about the MODE SENSE/MODE SELECT data?
	 */
	switch( cmd ) {

	  case SLMIORESET:		/* reset buffer, i.e. empty the buffer */
		if (!(file->f_mode & 2))
			return( -EINVAL );
		if (SLMState == PRINTING)
			return( -EBUSY );
		SLMState = IDLE;
		BufferP = SLMBuffer;
		wake_up_interruptible( &slm_wait );
		return( 0 );
		
	  case SLMIOGSTAT: {	/* get status */
		int stat;
		char *str;

		stat = slm_req_sense( device );
		if (arg) {
			str = slm_errstr( stat );
			if (put_user(stat,
    	    	    	    	     (long *)&((struct SLM_status *)arg)->stat))
    	    	    	    	return -EFAULT;
			if (copy_to_user( ((struct SLM_status *)arg)->str, str,
						 strlen(str) + 1))
				return -EFAULT;
		}
		return( stat );
	  }
		
	  case SLMIOGPSIZE: {	/* get paper size */
		int w, h;
		
		if ((err = slm_get_pagesize( device, &w, &h ))) return( err );
		
    	    	if (put_user(w, (long *)&((struct SLM_paper_size *)arg)->width))
			return -EFAULT;
		if (put_user(h, (long *)&((struct SLM_paper_size *)arg)->height))
			return -EFAULT;
		return( 0 );
	  }
		
	  case SLMIOGMFEED:	/* get manual feed */
		return( -EINVAL );

	  case SLMIOSPSIZE:	/* set paper size */
		return( -EINVAL );

	  case SLMIOSMFEED:	/* set manual feed */
		return( -EINVAL );

	}
	return( -EINVAL );
}


/* ---------------------------------------------------------------------- */
/*							 Opening and Closing						  */


static int slm_open( struct inode *inode, struct file *file )

{	int device;
	struct slm *sip;
	
	device = iminor(inode);
	if (device >= N_SLM_Printers)
		return( -ENXIO );
	sip = &slm_info[device];

	if (file->f_mode & 2) {
		/* open for writing is exclusive */
		if ( !atomic_dec_and_test(&sip->wr_ok) ) {
			atomic_inc(&sip->wr_ok);	
			return( -EBUSY );
		}
	}
	if (file->f_mode & 1) {
		/* open for reading is exclusive */
                if ( !atomic_dec_and_test(&sip->rd_ok) ) {
                        atomic_inc(&sip->rd_ok);
                        return( -EBUSY );
                }
	}

	return( 0 );
}


static int slm_release( struct inode *inode, struct file *file )

{	int device;
	struct slm *sip;
	
	device = iminor(inode);
	sip = &slm_info[device];

	if (file->f_mode & 2)
		atomic_inc( &sip->wr_ok );
	if (file->f_mode & 1)
		atomic_inc( &sip->rd_ok );
	
	return( 0 );
}


/* ---------------------------------------------------------------------- */
/*						 ACSI Primitives for the SLM					  */


static int slm_req_sense( int device )

{	int			stat, rv;
	struct slm *sip = &slm_info[device];
	
	stdma_lock( NULL, NULL );

	CMDSET_TARG_LUN( slmreqsense_cmd, sip->target, sip->lun );
	if (!acsicmd_nodma( slmreqsense_cmd, 0 ) ||
		(stat = acsi_getstatus()) < 0)
		rv = SLMSTAT_ACSITO;
	else
		rv = stat & 0x1f;

	ENABLE_IRQ();
	stdma_release();
	return( rv );
}


static int slm_mode_sense( int device, char *buffer, int abs_flag )

{	unsigned char	stat, len;
	int				rv = 0;
	struct slm		*sip = &slm_info[device];
	
	stdma_lock( NULL, NULL );

	CMDSET_TARG_LUN( slmmsense_cmd, sip->target, sip->lun );
	slmmsense_cmd[5] = abs_flag ? 0x80 : 0;
	if (!acsicmd_nodma( slmmsense_cmd, 0 )) {
		rv = SLMSTAT_ACSITO;
		goto the_end;
	}

	if (!acsi_extstatus( &stat, 1 )) {
		acsi_end_extstatus();
		rv = SLMSTAT_ACSITO;
		goto the_end;
	}
	
	if (!acsi_extstatus( &len, 1 )) {
		acsi_end_extstatus();
		rv = SLMSTAT_ACSITO;
		goto the_end;
	}
	buffer[0] = len;
	if (!acsi_extstatus( buffer+1, len )) {
		acsi_end_extstatus();
		rv = SLMSTAT_ACSITO;
		goto the_end;
	}
	
	acsi_end_extstatus();
	rv = stat & 0x1f;

  the_end:
	ENABLE_IRQ();
	stdma_release();
	return( rv );
}


#if 0
/* currently unused */
static int slm_mode_select( int device, char *buffer, int len,
							int default_flag )

{	int			stat, rv;
	struct slm	*sip = &slm_info[device];
	
	stdma_lock( NULL, NULL );

	CMDSET_TARG_LUN( slmmselect_cmd, sip->target, sip->lun );
	slmmselect_cmd[5] = default_flag ? 0x80 : 0;
	if (!acsicmd_nodma( slmmselect_cmd, 0 )) {
		rv = SLMSTAT_ACSITO;
		goto the_end;
	}

	if (!default_flag) {
		unsigned char c = len;
		if (!acsi_extcmd( &c, 1 )) {
			rv = SLMSTAT_ACSITO;
			goto the_end;
		}
		if (!acsi_extcmd( buffer, len )) {
			rv = SLMSTAT_ACSITO;
			goto the_end;
		}
	}
	
	stat = acsi_getstatus();
	rv = (stat < 0 ? SLMSTAT_ACSITO : stat);

  the_end:
	ENABLE_IRQ();
	stdma_release();
	return( rv );
}
#endif


static int slm_get_pagesize( int device, int *w, int *h )

{	char	buf[256];
	int		stat;
	
	stat = slm_mode_sense( device, buf, 0 );
	ENABLE_IRQ();
	stdma_release();

	if (stat != SLMSTAT_OK)
		return( -EIO );

	*w = (buf[3] << 8) | buf[4];
	*h = (buf[1] << 8) | buf[2];
	return( 0 );
}


/* ---------------------------------------------------------------------- */
/*								Initialization							  */


int attach_slm( int target, int lun )

{	static int	did_register;
	int			len;

	if (N_SLM_Printers >= MAX_SLM) {
		printk( KERN_WARNING "Too much SLMs\n" );
		return( 0 );
	}
	
	/* do an INQUIRY */
	udelay(100);
	CMDSET_TARG_LUN( slminquiry_cmd, target, lun );
	if (!acsicmd_nodma( slminquiry_cmd, 0 )) {
	  inq_timeout:
		printk( KERN_ERR "SLM inquiry command timed out.\n" );
	  inq_fail:
		acsi_end_extstatus();
		return( 0 );
	}
	/* read status and header of return data */
	if (!acsi_extstatus( SLMBuffer, 6 ))
		goto inq_timeout;

	if (SLMBuffer[1] != 2) { /* device type == printer? */
		printk( KERN_ERR "SLM inquiry returned device type != printer\n" );
		goto inq_fail;
	}
	len = SLMBuffer[5];
	
	/* read id string */
	if (!acsi_extstatus( SLMBuffer, len ))
		goto inq_timeout;
	acsi_end_extstatus();
	SLMBuffer[len] = 0;

	if (!did_register) {
		did_register = 1;
	}

	slm_info[N_SLM_Printers].target = target;
	slm_info[N_SLM_Printers].lun    = lun;
	atomic_set(&slm_info[N_SLM_Printers].wr_ok, 1 ); 
	atomic_set(&slm_info[N_SLM_Printers].rd_ok, 1 );
	
	printk( KERN_INFO "  Printer: %s\n", SLMBuffer );
	printk( KERN_INFO "Detected slm%d at id %d lun %d\n",
			N_SLM_Printers, target, lun );
	N_SLM_Printers++;
	return( 1 );
}

int slm_init( void )

{
	int i;
	if (register_chrdev( ACSI_MAJOR, "slm", &slm_fops )) {
		printk( KERN_ERR "Unable to get major %d for ACSI SLM\n", ACSI_MAJOR );
		return -EBUSY;
	}
	
	if (!(SLMBuffer = atari_stram_alloc( SLM_BUFFER_SIZE, "SLM" ))) {
		printk( KERN_ERR "Unable to get SLM ST-Ram buffer.\n" );
		unregister_chrdev( ACSI_MAJOR, "slm" );
		return -ENOMEM;
	}
	BufferP = SLMBuffer;
	SLMState = IDLE;
	
	return 0;
}

#ifdef MODULE

/* from acsi.c */
void acsi_attach_SLMs( int (*attach_func)( int, int ) );

int init_module(void)
{
	int err;

	if ((err = slm_init()))
		return( err );
	/* This calls attach_slm() for every target/lun where acsi.c detected a
	 * printer */
	acsi_attach_SLMs( attach_slm );
	return( 0 );
}

void cleanup_module(void)
{
	if (unregister_chrdev( ACSI_MAJOR, "slm" ) != 0)
		printk( KERN_ERR "acsi_slm: cleanup_module failed\n");
	atari_stram_free( SLMBuffer );
}
#endif
