/* -- sjcd.c
 *
 *   Sanyo CD-ROM device driver implementation, Version 1.6
 *   Copyright (C) 1995  Vadim V. Model
 *
 *   model@cecmow.enet.dec.com
 *   vadim@rbrf.ru
 *   vadim@ipsun.ras.ru
 *
 *
 *  This driver is based on pre-works by Eberhard Moenkeberg (emoenke@gwdg.de);
 *  it was developed under use of mcd.c from Martin Harriss, with help of
 *  Eric van der Maarel (H.T.M.v.d.Maarel@marin.nl).
 *
 *  It is planned to include these routines into sbpcd.c later - to make
 *  a "mixed use" on one cable possible for all kinds of drives which use
 *  the SoundBlaster/Panasonic style CDROM interface. But today, the
 *  ability to install directly from CDROM is more important than flexibility.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *  History:
 *  1.1 First public release with kernel version 1.3.7.
 *      Written by Vadim Model.
 *  1.2 Added detection and configuration of cdrom interface
 *      on ISP16 soundcard.
 *      Allow for command line options: sjcd=<io_base>,<irq>,<dma>
 *  1.3 Some minor changes to README.sjcd.
 *  1.4 MSS Sound support!! Listen to a CD through the speakers.
 *  1.5 Module support and bugfixes.
 *      Tray locking.
 *  1.6 Removed ISP16 code from this driver.
 *      Allow only to set io base address on command line: sjcd=<io_base>
 *      Changes to Documentation/cdrom/sjcd
 *      Added cleanup after any error in the initialisation.
 *  1.7 Added code to set the sector size tables to prevent the bug present in 
 *      the previous version of this driver.  Coded added by Anthony Barbachan 
 *      from bugfix tip originally suggested by Alan Cox.
 *
 *  November 1999 -- Make kernel-parameter implementation work with 2.3.x 
 *	             Removed init_module & cleanup_module in favor of 
 *	             module_init & module_exit.
 *	             Torben Mathiasen <tmm@image.dk>
 */

#define SJCD_VERSION_MAJOR 1
#define SJCD_VERSION_MINOR 7

#include <linux/module.h>
#include <linux/errno.h>
#include <linux/sched.h>
#include <linux/mm.h>
#include <linux/timer.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/cdrom.h>
#include <linux/ioport.h>
#include <linux/string.h>
#include <linux/major.h>
#include <linux/init.h>

#include <asm/system.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <linux/blkdev.h>
#include "sjcd.h"

static int sjcd_present = 0;
static struct request_queue *sjcd_queue;

#define MAJOR_NR SANYO_CDROM_MAJOR
#define QUEUE (sjcd_queue)
#define CURRENT elv_next_request(sjcd_queue)

#define SJCD_BUF_SIZ 32		/* cdr-h94a has internal 64K buffer */

/*
 * buffer for block size conversion
 */
static char sjcd_buf[2048 * SJCD_BUF_SIZ];
static volatile int sjcd_buf_bn[SJCD_BUF_SIZ], sjcd_next_bn;
static volatile int sjcd_buf_in, sjcd_buf_out = -1;

/*
 * Status.
 */
static unsigned short sjcd_status_valid = 0;
static unsigned short sjcd_door_closed;
static unsigned short sjcd_door_was_open;
static unsigned short sjcd_media_is_available;
static unsigned short sjcd_media_is_changed;
static unsigned short sjcd_toc_uptodate = 0;
static unsigned short sjcd_command_failed;
static volatile unsigned char sjcd_completion_status = 0;
static volatile unsigned char sjcd_completion_error = 0;
static unsigned short sjcd_command_is_in_progress = 0;
static unsigned short sjcd_error_reported = 0;
static DEFINE_SPINLOCK(sjcd_lock);

static int sjcd_open_count;

static int sjcd_audio_status;
static struct sjcd_play_msf sjcd_playing;

static int sjcd_base = SJCD_BASE_ADDR;

module_param(sjcd_base, int, 0);

static DECLARE_WAIT_QUEUE_HEAD(sjcd_waitq);

/*
 * Data transfer.
 */
static volatile unsigned short sjcd_transfer_is_active = 0;

enum sjcd_transfer_state {
	SJCD_S_IDLE = 0,
	SJCD_S_START = 1,
	SJCD_S_MODE = 2,
	SJCD_S_READ = 3,
	SJCD_S_DATA = 4,
	SJCD_S_STOP = 5,
	SJCD_S_STOPPING = 6
};
static enum sjcd_transfer_state sjcd_transfer_state = SJCD_S_IDLE;
static long sjcd_transfer_timeout = 0;
static int sjcd_read_count = 0;
static unsigned char sjcd_mode = 0;

#define SJCD_READ_TIMEOUT 5000

#if defined( SJCD_GATHER_STAT )
/*
 * Statistic.
 */
static struct sjcd_stat statistic;
#endif

/*
 * Timer.
 */
static struct timer_list sjcd_delay_timer = TIMER_INITIALIZER(NULL, 0, 0);

#define SJCD_SET_TIMER( func, tmout )           \
    ( sjcd_delay_timer.expires = jiffies+tmout,         \
      sjcd_delay_timer.function = ( void * )func, \
      add_timer( &sjcd_delay_timer ) )

#define CLEAR_TIMER del_timer( &sjcd_delay_timer )

/*
 * Set up device, i.e., use command line data to set
 * base address.
 */
#ifndef MODULE
static int __init sjcd_setup(char *str)
{
	int ints[2];
	(void) get_options(str, ARRAY_SIZE(ints), ints);
	if (ints[0] > 0)
		sjcd_base = ints[1];

	return 1;
}

__setup("sjcd=", sjcd_setup);

#endif

/*
 * Special converters.
 */
static unsigned char bin2bcd(int bin)
{
	int u, v;

	u = bin % 10;
	v = bin / 10;
	return (u | (v << 4));
}

static int bcd2bin(unsigned char bcd)
{
	return ((bcd >> 4) * 10 + (bcd & 0x0F));
}

static long msf2hsg(struct msf *mp)
{
	return (bcd2bin(mp->frame) + bcd2bin(mp->sec) * 75
		+ bcd2bin(mp->min) * 4500 - 150);
}

static void hsg2msf(long hsg, struct msf *msf)
{
	hsg += 150;
	msf->min = hsg / 4500;
	hsg %= 4500;
	msf->sec = hsg / 75;
	msf->frame = hsg % 75;
	msf->min = bin2bcd(msf->min);	/* convert to BCD */
	msf->sec = bin2bcd(msf->sec);
	msf->frame = bin2bcd(msf->frame);
}

/*
 * Send a command to cdrom. Invalidate status.
 */
static void sjcd_send_cmd(unsigned char cmd)
{
#if defined( SJCD_TRACE )
	printk("SJCD: send_cmd( 0x%x )\n", cmd);
#endif
	outb(cmd, SJCDPORT(0));
	sjcd_command_is_in_progress = 1;
	sjcd_status_valid = 0;
	sjcd_command_failed = 0;
}

/*
 * Send a command with one arg to cdrom. Invalidate status.
 */
static void sjcd_send_1_cmd(unsigned char cmd, unsigned char a)
{
#if defined( SJCD_TRACE )
	printk("SJCD: send_1_cmd( 0x%x, 0x%x )\n", cmd, a);
#endif
	outb(cmd, SJCDPORT(0));
	outb(a, SJCDPORT(0));
	sjcd_command_is_in_progress = 1;
	sjcd_status_valid = 0;
	sjcd_command_failed = 0;
}

/*
 * Send a command with four args to cdrom. Invalidate status.
 */
static void sjcd_send_4_cmd(unsigned char cmd, unsigned char a,
			    unsigned char b, unsigned char c,
			    unsigned char d)
{
#if defined( SJCD_TRACE )
	printk("SJCD: send_4_cmd( 0x%x )\n", cmd);
#endif
	outb(cmd, SJCDPORT(0));
	outb(a, SJCDPORT(0));
	outb(b, SJCDPORT(0));
	outb(c, SJCDPORT(0));
	outb(d, SJCDPORT(0));
	sjcd_command_is_in_progress = 1;
	sjcd_status_valid = 0;
	sjcd_command_failed = 0;
}

/*
 * Send a play or read command to cdrom. Invalidate Status.
 */
static void sjcd_send_6_cmd(unsigned char cmd, struct sjcd_play_msf *pms)
{
#if defined( SJCD_TRACE )
	printk("SJCD: send_long_cmd( 0x%x )\n", cmd);
#endif
	outb(cmd, SJCDPORT(0));
	outb(pms->start.min, SJCDPORT(0));
	outb(pms->start.sec, SJCDPORT(0));
	outb(pms->start.frame, SJCDPORT(0));
	outb(pms->end.min, SJCDPORT(0));
	outb(pms->end.sec, SJCDPORT(0));
	outb(pms->end.frame, SJCDPORT(0));
	sjcd_command_is_in_progress = 1;
	sjcd_status_valid = 0;
	sjcd_command_failed = 0;
}

/*
 * Get a value from the data port. Should not block, so we use a little
 * wait for a while. Returns 0 if OK.
 */
static int sjcd_load_response(void *buf, int len)
{
	unsigned char *resp = (unsigned char *) buf;

	for (; len; --len) {
		int i;
		for (i = 200;
		     i-- && !SJCD_STATUS_AVAILABLE(inb(SJCDPORT(1))););
		if (i > 0)
			*resp++ = (unsigned char) inb(SJCDPORT(0));
		else
			break;
	}
	return (len);
}

/*
 * Load and parse command completion status (drive info byte and maybe error).
 * Sorry, no error classification yet.
 */
static void sjcd_load_status(void)
{
	sjcd_media_is_changed = 0;
	sjcd_completion_error = 0;
	sjcd_completion_status = inb(SJCDPORT(0));
	if (sjcd_completion_status & SST_DOOR_OPENED) {
		sjcd_door_closed = sjcd_media_is_available = 0;
	} else {
		sjcd_door_closed = 1;
		if (sjcd_completion_status & SST_MEDIA_CHANGED)
			sjcd_media_is_available = sjcd_media_is_changed =
			    1;
		else if (sjcd_completion_status & 0x0F) {
			/*
			 * OK, we seem to catch an error ...
			 */
			while (!SJCD_STATUS_AVAILABLE(inb(SJCDPORT(1))));
			sjcd_completion_error = inb(SJCDPORT(0));
			if ((sjcd_completion_status & 0x08) &&
			    (sjcd_completion_error & 0x40))
				sjcd_media_is_available = 0;
			else
				sjcd_command_failed = 1;
		} else
			sjcd_media_is_available = 1;
	}
	/*
	 * Ok, status loaded successfully.
	 */
	sjcd_status_valid = 1, sjcd_error_reported = 0;
	sjcd_command_is_in_progress = 0;

	/*
	 * If the disk is changed, the TOC is not valid.
	 */
	if (sjcd_media_is_changed)
		sjcd_toc_uptodate = 0;
#if defined( SJCD_TRACE )
	printk("SJCD: status %02x.%02x loaded.\n",
	       (int) sjcd_completion_status, (int) sjcd_completion_error);
#endif
}

/*
 * Read status from cdrom. Check to see if the status is available.
 */
static int sjcd_check_status(void)
{
	/*
	 * Try to load the response from cdrom into buffer.
	 */
	if (SJCD_STATUS_AVAILABLE(inb(SJCDPORT(1)))) {
		sjcd_load_status();
		return (1);
	} else {
		/*
		 * No status is available.
		 */
		return (0);
	}
}

/*
 * This is just timeout counter, and nothing more. Surprised ? :-)
 */
static volatile long sjcd_status_timeout;

/*
 * We need about 10 seconds to wait. The longest command takes about 5 seconds
 * to probe the disk (usually after tray closed or drive reset). Other values
 * should be thought of for other commands.
 */
#define SJCD_WAIT_FOR_STATUS_TIMEOUT 1000

static void sjcd_status_timer(void)
{
	if (sjcd_check_status()) {
		/*
		 * The command completed and status is loaded, stop waiting.
		 */
		wake_up(&sjcd_waitq);
	} else if (--sjcd_status_timeout <= 0) {
		/*
		 * We are timed out. 
		 */
		wake_up(&sjcd_waitq);
	} else {
		/*
		 * We have still some time to wait. Try again.
		 */
		SJCD_SET_TIMER(sjcd_status_timer, 1);
	}
}

/*
 * Wait for status for 10 sec approx. Returns non-positive when timed out.
 * Should not be used while reading data CDs.
 */
static int sjcd_wait_for_status(void)
{
	sjcd_status_timeout = SJCD_WAIT_FOR_STATUS_TIMEOUT;
	SJCD_SET_TIMER(sjcd_status_timer, 1);
	sleep_on(&sjcd_waitq);
#if defined( SJCD_DIAGNOSTIC ) || defined ( SJCD_TRACE )
	if (sjcd_status_timeout <= 0)
		printk("SJCD: Error Wait For Status.\n");
#endif
	return (sjcd_status_timeout);
}

static int sjcd_receive_status(void)
{
	int i;
#if defined( SJCD_TRACE )
	printk("SJCD: receive_status\n");
#endif
	/*
	 * Wait a bit for status available.
	 */
	for (i = 200; i-- && (sjcd_check_status() == 0););
	if (i < 0) {
#if defined( SJCD_TRACE )
		printk("SJCD: long wait for status\n");
#endif
		if (sjcd_wait_for_status() <= 0)
			printk("SJCD: Timeout when read status.\n");
		else
			i = 0;
	}
	return (i);
}

/*
 * Load the status. Issue get status command and wait for status available.
 */
static void sjcd_get_status(void)
{
#if defined( SJCD_TRACE )
	printk("SJCD: get_status\n");
#endif
	sjcd_send_cmd(SCMD_GET_STATUS);
	sjcd_receive_status();
}

/*
 * Check the drive if the disk is changed. Should be revised.
 */
static int sjcd_disk_change(struct gendisk *disk)
{
#if 0
	printk("SJCD: sjcd_disk_change(%s)\n", disk->disk_name);
#endif
	if (!sjcd_command_is_in_progress)
		sjcd_get_status();
	return (sjcd_status_valid ? sjcd_media_is_changed : 0);
}

/*
 * Read the table of contents (TOC) and TOC header if necessary.
 * We assume that the drive contains no more than 99 toc entries.
 */
static struct sjcd_hw_disk_info sjcd_table_of_contents[SJCD_MAX_TRACKS];
static unsigned char sjcd_first_track_no, sjcd_last_track_no;
#define sjcd_disk_length  sjcd_table_of_contents[0].un.track_msf

static int sjcd_update_toc(void)
{
	struct sjcd_hw_disk_info info;
	int i;
#if defined( SJCD_TRACE )
	printk("SJCD: update toc:\n");
#endif
	/*
	 * check to see if we need to do anything
	 */
	if (sjcd_toc_uptodate)
		return (0);

	/*
	 * Get the TOC start information.
	 */
	sjcd_send_1_cmd(SCMD_GET_DISK_INFO, SCMD_GET_1_TRACK);
	sjcd_receive_status();

	if (!sjcd_status_valid) {
		printk("SJCD: cannot load status.\n");
		return (-1);
	}

	if (!sjcd_media_is_available) {
		printk("SJCD: no disk in drive\n");
		return (-1);
	}

	if (!sjcd_command_failed) {
		if (sjcd_load_response(&info, sizeof(info)) != 0) {
			printk
			    ("SJCD: cannot load response about TOC start.\n");
			return (-1);
		}
		sjcd_first_track_no = bcd2bin(info.un.track_no);
	} else {
		printk("SJCD: get first failed\n");
		return (-1);
	}
#if defined( SJCD_TRACE )
	printk("SJCD: TOC start 0x%02x ", sjcd_first_track_no);
#endif
	/*
	 * Get the TOC finish information.
	 */
	sjcd_send_1_cmd(SCMD_GET_DISK_INFO, SCMD_GET_L_TRACK);
	sjcd_receive_status();

	if (!sjcd_status_valid) {
		printk("SJCD: cannot load status.\n");
		return (-1);
	}

	if (!sjcd_media_is_available) {
		printk("SJCD: no disk in drive\n");
		return (-1);
	}

	if (!sjcd_command_failed) {
		if (sjcd_load_response(&info, sizeof(info)) != 0) {
			printk
			    ("SJCD: cannot load response about TOC finish.\n");
			return (-1);
		}
		sjcd_last_track_no = bcd2bin(info.un.track_no);
	} else {
		printk("SJCD: get last failed\n");
		return (-1);
	}
#if defined( SJCD_TRACE )
	printk("SJCD: TOC finish 0x%02x ", sjcd_last_track_no);
#endif
	for (i = sjcd_first_track_no; i <= sjcd_last_track_no; i++) {
		/*
		 * Get the first track information.
		 */
		sjcd_send_1_cmd(SCMD_GET_DISK_INFO, bin2bcd(i));
		sjcd_receive_status();

		if (!sjcd_status_valid) {
			printk("SJCD: cannot load status.\n");
			return (-1);
		}

		if (!sjcd_media_is_available) {
			printk("SJCD: no disk in drive\n");
			return (-1);
		}

		if (!sjcd_command_failed) {
			if (sjcd_load_response(&sjcd_table_of_contents[i],
					       sizeof(struct
						      sjcd_hw_disk_info))
			    != 0) {
				printk
				    ("SJCD: cannot load info for %d track\n",
				     i);
				return (-1);
			}
		} else {
			printk("SJCD: get info %d failed\n", i);
			return (-1);
		}
	}

	/*
	 * Get the disk length info.
	 */
	sjcd_send_1_cmd(SCMD_GET_DISK_INFO, SCMD_GET_D_SIZE);
	sjcd_receive_status();

	if (!sjcd_status_valid) {
		printk("SJCD: cannot load status.\n");
		return (-1);
	}

	if (!sjcd_media_is_available) {
		printk("SJCD: no disk in drive\n");
		return (-1);
	}

	if (!sjcd_command_failed) {
		if (sjcd_load_response(&info, sizeof(info)) != 0) {
			printk
			    ("SJCD: cannot load response about disk size.\n");
			return (-1);
		}
		sjcd_disk_length.min = info.un.track_msf.min;
		sjcd_disk_length.sec = info.un.track_msf.sec;
		sjcd_disk_length.frame = info.un.track_msf.frame;
	} else {
		printk("SJCD: get size failed\n");
		return (1);
	}
#if defined( SJCD_TRACE )
	printk("SJCD: (%02x:%02x.%02x)\n", sjcd_disk_length.min,
	       sjcd_disk_length.sec, sjcd_disk_length.frame);
#endif
	return (0);
}

/*
 * Load subchannel information.
 */
static int sjcd_get_q_info(struct sjcd_hw_qinfo *qp)
{
	int s;
#if defined( SJCD_TRACE )
	printk("SJCD: load sub q\n");
#endif
	sjcd_send_cmd(SCMD_GET_QINFO);
	s = sjcd_receive_status();
	if (s < 0 || sjcd_command_failed || !sjcd_status_valid) {
		sjcd_send_cmd(0xF2);
		s = sjcd_receive_status();
		if (s < 0 || sjcd_command_failed || !sjcd_status_valid)
			return (-1);
		sjcd_send_cmd(SCMD_GET_QINFO);
		s = sjcd_receive_status();
		if (s < 0 || sjcd_command_failed || !sjcd_status_valid)
			return (-1);
	}
	if (sjcd_media_is_available)
		if (sjcd_load_response(qp, sizeof(*qp)) == 0)
			return (0);
	return (-1);
}

/*
 * Start playing from the specified position.
 */
static int sjcd_play(struct sjcd_play_msf *mp)
{
	struct sjcd_play_msf msf;

	/*
	 * Turn the device to play mode.
	 */
	sjcd_send_1_cmd(SCMD_SET_MODE, SCMD_MODE_PLAY);
	if (sjcd_receive_status() < 0)
		return (-1);

	/*
	 * Seek to the starting point.
	 */
	msf.start = mp->start;
	msf.end.min = msf.end.sec = msf.end.frame = 0x00;
	sjcd_send_6_cmd(SCMD_SEEK, &msf);
	if (sjcd_receive_status() < 0)
		return (-1);

	/*
	 * Start playing.
	 */
	sjcd_send_6_cmd(SCMD_PLAY, mp);
	return (sjcd_receive_status());
}

/*
 * Tray control functions.
 */
static int sjcd_tray_close(void)
{
#if defined( SJCD_TRACE )
	printk("SJCD: tray_close\n");
#endif
	sjcd_send_cmd(SCMD_CLOSE_TRAY);
	return (sjcd_receive_status());
}

static int sjcd_tray_lock(void)
{
#if defined( SJCD_TRACE )
	printk("SJCD: tray_lock\n");
#endif
	sjcd_send_cmd(SCMD_LOCK_TRAY);
	return (sjcd_receive_status());
}

static int sjcd_tray_unlock(void)
{
#if defined( SJCD_TRACE )
	printk("SJCD: tray_unlock\n");
#endif
	sjcd_send_cmd(SCMD_UNLOCK_TRAY);
	return (sjcd_receive_status());
}

static int sjcd_tray_open(void)
{
#if defined( SJCD_TRACE )
	printk("SJCD: tray_open\n");
#endif
	sjcd_send_cmd(SCMD_EJECT_TRAY);
	return (sjcd_receive_status());
}

/*
 * Do some user commands.
 */
static int sjcd_ioctl(struct inode *ip, struct file *fp,
		      unsigned int cmd, unsigned long arg)
{
	void __user *argp = (void __user *)arg;
#if defined( SJCD_TRACE )
	printk("SJCD:ioctl\n");
#endif

	sjcd_get_status();
	if (!sjcd_status_valid)
		return (-EIO);
	if (sjcd_update_toc() < 0)
		return (-EIO);

	switch (cmd) {
	case CDROMSTART:{
#if defined( SJCD_TRACE )
			printk("SJCD: ioctl: start\n");
#endif
			return (0);
		}

	case CDROMSTOP:{
#if defined( SJCD_TRACE )
			printk("SJCD: ioctl: stop\n");
#endif
			sjcd_send_cmd(SCMD_PAUSE);
			(void) sjcd_receive_status();
			sjcd_audio_status = CDROM_AUDIO_NO_STATUS;
			return (0);
		}

	case CDROMPAUSE:{
			struct sjcd_hw_qinfo q_info;
#if defined( SJCD_TRACE )
			printk("SJCD: ioctl: pause\n");
#endif
			if (sjcd_audio_status == CDROM_AUDIO_PLAY) {
				sjcd_send_cmd(SCMD_PAUSE);
				(void) sjcd_receive_status();
				if (sjcd_get_q_info(&q_info) < 0) {
					sjcd_audio_status =
					    CDROM_AUDIO_NO_STATUS;
				} else {
					sjcd_audio_status =
					    CDROM_AUDIO_PAUSED;
					sjcd_playing.start = q_info.abs;
				}
				return (0);
			} else
				return (-EINVAL);
		}

	case CDROMRESUME:{
#if defined( SJCD_TRACE )
			printk("SJCD: ioctl: resume\n");
#endif
			if (sjcd_audio_status == CDROM_AUDIO_PAUSED) {
				/*
				 * continue play starting at saved location
				 */
				if (sjcd_play(&sjcd_playing) < 0) {
					sjcd_audio_status =
					    CDROM_AUDIO_ERROR;
					return (-EIO);
				} else {
					sjcd_audio_status =
					    CDROM_AUDIO_PLAY;
					return (0);
				}
			} else
				return (-EINVAL);
		}

	case CDROMPLAYTRKIND:{
			struct cdrom_ti ti;
			int s = -EFAULT;
#if defined( SJCD_TRACE )
			printk("SJCD: ioctl: playtrkind\n");
#endif
			if (!copy_from_user(&ti, argp, sizeof(ti))) {
				s = 0;
				if (ti.cdti_trk0 < sjcd_first_track_no)
					return (-EINVAL);
				if (ti.cdti_trk1 > sjcd_last_track_no)
					ti.cdti_trk1 = sjcd_last_track_no;
				if (ti.cdti_trk0 > ti.cdti_trk1)
					return (-EINVAL);

				sjcd_playing.start =
				    sjcd_table_of_contents[ti.cdti_trk0].
				    un.track_msf;
				sjcd_playing.end =
				    (ti.cdti_trk1 <
				     sjcd_last_track_no) ?
				    sjcd_table_of_contents[ti.cdti_trk1 +
							   1].un.
				    track_msf : sjcd_table_of_contents[0].
				    un.track_msf;

				if (sjcd_play(&sjcd_playing) < 0) {
					sjcd_audio_status =
					    CDROM_AUDIO_ERROR;
					return (-EIO);
				} else
					sjcd_audio_status =
					    CDROM_AUDIO_PLAY;
			}
			return (s);
		}

	case CDROMPLAYMSF:{
			struct cdrom_msf sjcd_msf;
			int s;
#if defined( SJCD_TRACE )
			printk("SJCD: ioctl: playmsf\n");
#endif
			if ((s =
			     verify_area(VERIFY_READ, argp,
					 sizeof(sjcd_msf))) == 0) {
				if (sjcd_audio_status == CDROM_AUDIO_PLAY) {
					sjcd_send_cmd(SCMD_PAUSE);
					(void) sjcd_receive_status();
					sjcd_audio_status =
					    CDROM_AUDIO_NO_STATUS;
				}

				if (copy_from_user(&sjcd_msf, argp,
					       sizeof(sjcd_msf)))
					return (-EFAULT);

				sjcd_playing.start.min =
				    bin2bcd(sjcd_msf.cdmsf_min0);
				sjcd_playing.start.sec =
				    bin2bcd(sjcd_msf.cdmsf_sec0);
				sjcd_playing.start.frame =
				    bin2bcd(sjcd_msf.cdmsf_frame0);
				sjcd_playing.end.min =
				    bin2bcd(sjcd_msf.cdmsf_min1);
				sjcd_playing.end.sec =
				    bin2bcd(sjcd_msf.cdmsf_sec1);
				sjcd_playing.end.frame =
				    bin2bcd(sjcd_msf.cdmsf_frame1);

				if (sjcd_play(&sjcd_playing) < 0) {
					sjcd_audio_status =
					    CDROM_AUDIO_ERROR;
					return (-EIO);
				} else
					sjcd_audio_status =
					    CDROM_AUDIO_PLAY;
			}
			return (s);
		}

	case CDROMREADTOCHDR:{
			struct cdrom_tochdr toc_header;
#if defined (SJCD_TRACE )
			printk("SJCD: ioctl: readtocheader\n");
#endif
			toc_header.cdth_trk0 = sjcd_first_track_no;
			toc_header.cdth_trk1 = sjcd_last_track_no;
			if (copy_to_user(argp, &toc_header,
					 sizeof(toc_header)))
				return -EFAULT;
			return 0;
		}

	case CDROMREADTOCENTRY:{
			struct cdrom_tocentry toc_entry;
			int s;
#if defined( SJCD_TRACE )
			printk("SJCD: ioctl: readtocentry\n");
#endif
			if ((s =
			     verify_area(VERIFY_WRITE, argp,
					 sizeof(toc_entry))) == 0) {
				struct sjcd_hw_disk_info *tp;

				if (copy_from_user(&toc_entry, argp,
					       sizeof(toc_entry)))
					return (-EFAULT);
				if (toc_entry.cdte_track == CDROM_LEADOUT)
					tp = &sjcd_table_of_contents[0];
				else if (toc_entry.cdte_track <
					 sjcd_first_track_no)
					return (-EINVAL);
				else if (toc_entry.cdte_track >
					 sjcd_last_track_no)
					return (-EINVAL);
				else
					tp = &sjcd_table_of_contents
					    [toc_entry.cdte_track];

				toc_entry.cdte_adr =
				    tp->track_control & 0x0F;
				toc_entry.cdte_ctrl =
				    tp->track_control >> 4;

				switch (toc_entry.cdte_format) {
				case CDROM_LBA:
					toc_entry.cdte_addr.lba =
					    msf2hsg(&(tp->un.track_msf));
					break;
				case CDROM_MSF:
					toc_entry.cdte_addr.msf.minute =
					    bcd2bin(tp->un.track_msf.min);
					toc_entry.cdte_addr.msf.second =
					    bcd2bin(tp->un.track_msf.sec);
					toc_entry.cdte_addr.msf.frame =
					    bcd2bin(tp->un.track_msf.
						    frame);
					break;
				default:
					return (-EINVAL);
				}
				if (copy_to_user(argp, &toc_entry,
						 sizeof(toc_entry)))
					s = -EFAULT;
			}
			return (s);
		}

	case CDROMSUBCHNL:{
			struct cdrom_subchnl subchnl;
			int s;
#if defined( SJCD_TRACE )
			printk("SJCD: ioctl: subchnl\n");
#endif
			if ((s =
			     verify_area(VERIFY_WRITE, argp,
					 sizeof(subchnl))) == 0) {
				struct sjcd_hw_qinfo q_info;

				if (copy_from_user(&subchnl, argp,
					       sizeof(subchnl)))
					return (-EFAULT);

				if (sjcd_get_q_info(&q_info) < 0)
					return (-EIO);

				subchnl.cdsc_audiostatus =
				    sjcd_audio_status;
				subchnl.cdsc_adr =
				    q_info.track_control & 0x0F;
				subchnl.cdsc_ctrl =
				    q_info.track_control >> 4;
				subchnl.cdsc_trk =
				    bcd2bin(q_info.track_no);
				subchnl.cdsc_ind = bcd2bin(q_info.x);

				switch (subchnl.cdsc_format) {
				case CDROM_LBA:
					subchnl.cdsc_absaddr.lba =
					    msf2hsg(&(q_info.abs));
					subchnl.cdsc_reladdr.lba =
					    msf2hsg(&(q_info.rel));
					break;
				case CDROM_MSF:
					subchnl.cdsc_absaddr.msf.minute =
					    bcd2bin(q_info.abs.min);
					subchnl.cdsc_absaddr.msf.second =
					    bcd2bin(q_info.abs.sec);
					subchnl.cdsc_absaddr.msf.frame =
					    bcd2bin(q_info.abs.frame);
					subchnl.cdsc_reladdr.msf.minute =
					    bcd2bin(q_info.rel.min);
					subchnl.cdsc_reladdr.msf.second =
					    bcd2bin(q_info.rel.sec);
					subchnl.cdsc_reladdr.msf.frame =
					    bcd2bin(q_info.rel.frame);
					break;
				default:
					return (-EINVAL);
				}
				if (copy_to_user(argp, &subchnl,
					         sizeof(subchnl)))
					s = -EFAULT;
			}
			return (s);
		}

	case CDROMVOLCTRL:{
			struct cdrom_volctrl vol_ctrl;
			int s;
#if defined( SJCD_TRACE )
			printk("SJCD: ioctl: volctrl\n");
#endif
			if ((s =
			     verify_area(VERIFY_READ, argp,
					 sizeof(vol_ctrl))) == 0) {
				unsigned char dummy[4];

				if (copy_from_user(&vol_ctrl, argp,
					       sizeof(vol_ctrl)))
					return (-EFAULT);
				sjcd_send_4_cmd(SCMD_SET_VOLUME,
						vol_ctrl.channel0, 0xFF,
						vol_ctrl.channel1, 0xFF);
				if (sjcd_receive_status() < 0)
					return (-EIO);
				(void) sjcd_load_response(dummy, 4);
			}
			return (s);
		}

	case CDROMEJECT:{
#if defined( SJCD_TRACE )
			printk("SJCD: ioctl: eject\n");
#endif
			if (!sjcd_command_is_in_progress) {
				sjcd_tray_unlock();
				sjcd_send_cmd(SCMD_EJECT_TRAY);
				(void) sjcd_receive_status();
			}
			return (0);
		}

#if defined( SJCD_GATHER_STAT )
	case 0xABCD:{
#if defined( SJCD_TRACE )
			printk("SJCD: ioctl: statistic\n");
#endif
			if (copy_to_user(argp, &statistic, sizeof(statistic)))
				return -EFAULT;
			return 0;
		}
#endif

	default:
		return (-EINVAL);
	}
}

/*
 * Invalidate internal buffers of the driver.
 */
static void sjcd_invalidate_buffers(void)
{
	int i;
	for (i = 0; i < SJCD_BUF_SIZ; sjcd_buf_bn[i++] = -1);
	sjcd_buf_out = -1;
}

/*
 * Take care of the different block sizes between cdrom and Linux.
 * When Linux gets variable block sizes this will probably go away.
 */

static int current_valid(void)
{
        return CURRENT &&
		CURRENT->cmd == READ &&
		CURRENT->sector != -1;
}

static void sjcd_transfer(void)
{
#if defined( SJCD_TRACE )
	printk("SJCD: transfer:\n");
#endif
	if (current_valid()) {
		while (CURRENT->nr_sectors) {
			int i, bn = CURRENT->sector / 4;
			for (i = 0;
			     i < SJCD_BUF_SIZ && sjcd_buf_bn[i] != bn;
			     i++);
			if (i < SJCD_BUF_SIZ) {
				int offs =
				    (i * 4 + (CURRENT->sector & 3)) * 512;
				int nr_sectors = 4 - (CURRENT->sector & 3);
				if (sjcd_buf_out != i) {
					sjcd_buf_out = i;
					if (sjcd_buf_bn[i] != bn) {
						sjcd_buf_out = -1;
						continue;
					}
				}
				if (nr_sectors > CURRENT->nr_sectors)
					nr_sectors = CURRENT->nr_sectors;
#if defined( SJCD_TRACE )
				printk("SJCD: copy out\n");
#endif
				memcpy(CURRENT->buffer, sjcd_buf + offs,
				       nr_sectors * 512);
				CURRENT->nr_sectors -= nr_sectors;
				CURRENT->sector += nr_sectors;
				CURRENT->buffer += nr_sectors * 512;
			} else {
				sjcd_buf_out = -1;
				break;
			}
		}
	}
#if defined( SJCD_TRACE )
	printk("SJCD: transfer: done\n");
#endif
}

static void sjcd_poll(void)
{
#if defined( SJCD_GATHER_STAT )
	/*
	 * Update total number of ticks.
	 */
	statistic.ticks++;
	statistic.tticks[sjcd_transfer_state]++;
#endif

      ReSwitch:switch (sjcd_transfer_state) {

	case SJCD_S_IDLE:{
#if defined( SJCD_GATHER_STAT )
			statistic.idle_ticks++;
#endif
#if defined( SJCD_TRACE )
			printk("SJCD_S_IDLE\n");
#endif
			return;
		}

	case SJCD_S_START:{
#if defined( SJCD_GATHER_STAT )
			statistic.start_ticks++;
#endif
			sjcd_send_cmd(SCMD_GET_STATUS);
			sjcd_transfer_state =
			    sjcd_mode ==
			    SCMD_MODE_COOKED ? SJCD_S_READ : SJCD_S_MODE;
			sjcd_transfer_timeout = 500;
#if defined( SJCD_TRACE )
			printk("SJCD_S_START: goto SJCD_S_%s mode\n",
			       sjcd_transfer_state ==
			       SJCD_S_READ ? "READ" : "MODE");
#endif
			break;
		}

	case SJCD_S_MODE:{
			if (sjcd_check_status()) {
				/*
				 * Previous command is completed.
				 */
				if (!sjcd_status_valid
				    || sjcd_command_failed) {
#if defined( SJCD_TRACE )
					printk
					    ("SJCD_S_MODE: pre-cmd failed: goto to SJCD_S_STOP mode\n");
#endif
					sjcd_transfer_state = SJCD_S_STOP;
					goto ReSwitch;
				}

				sjcd_mode = 0;	/* unknown mode; should not be valid when failed */
				sjcd_send_1_cmd(SCMD_SET_MODE,
						SCMD_MODE_COOKED);
				sjcd_transfer_state = SJCD_S_READ;
				sjcd_transfer_timeout = 1000;
#if defined( SJCD_TRACE )
				printk
				    ("SJCD_S_MODE: goto SJCD_S_READ mode\n");
#endif
			}
#if defined( SJCD_GATHER_STAT )
			else
				statistic.mode_ticks++;
#endif
			break;
		}

	case SJCD_S_READ:{
			if (sjcd_status_valid ? 1 : sjcd_check_status()) {
				/*
				 * Previous command is completed.
				 */
				if (!sjcd_status_valid
				    || sjcd_command_failed) {
#if defined( SJCD_TRACE )
					printk
					    ("SJCD_S_READ: pre-cmd failed: goto to SJCD_S_STOP mode\n");
#endif
					sjcd_transfer_state = SJCD_S_STOP;
					goto ReSwitch;
				}
				if (!sjcd_media_is_available) {
#if defined( SJCD_TRACE )
					printk
					    ("SJCD_S_READ: no disk: goto to SJCD_S_STOP mode\n");
#endif
					sjcd_transfer_state = SJCD_S_STOP;
					goto ReSwitch;
				}
				if (sjcd_mode != SCMD_MODE_COOKED) {
					/*
					 * We seem to come from set mode. So discard one byte of result.
					 */
					if (sjcd_load_response
					    (&sjcd_mode, 1) != 0) {
#if defined( SJCD_TRACE )
						printk
						    ("SJCD_S_READ: load failed: goto to SJCD_S_STOP mode\n");
#endif
						sjcd_transfer_state =
						    SJCD_S_STOP;
						goto ReSwitch;
					}
					if (sjcd_mode != SCMD_MODE_COOKED) {
#if defined( SJCD_TRACE )
						printk
						    ("SJCD_S_READ: mode failed: goto to SJCD_S_STOP mode\n");
#endif
						sjcd_transfer_state =
						    SJCD_S_STOP;
						goto ReSwitch;
					}
				}

				if (current_valid()) {
					struct sjcd_play_msf msf;

					sjcd_next_bn = CURRENT->sector / 4;
					hsg2msf(sjcd_next_bn, &msf.start);
					msf.end.min = 0;
					msf.end.sec = 0;
					msf.end.frame = sjcd_read_count =
					    SJCD_BUF_SIZ;
#if defined( SJCD_TRACE )
					printk
					    ("SJCD: ---reading msf-address %x:%x:%x  %x:%x:%x\n",
					     msf.start.min, msf.start.sec,
					     msf.start.frame, msf.end.min,
					     msf.end.sec, msf.end.frame);
					printk
					    ("sjcd_next_bn:%x buf_in:%x buf_out:%x buf_bn:%x\n",
					     sjcd_next_bn, sjcd_buf_in,
					     sjcd_buf_out,
					     sjcd_buf_bn[sjcd_buf_in]);
#endif
					sjcd_send_6_cmd(SCMD_DATA_READ,
							&msf);
					sjcd_transfer_state = SJCD_S_DATA;
					sjcd_transfer_timeout = 500;
#if defined( SJCD_TRACE )
					printk
					    ("SJCD_S_READ: go to SJCD_S_DATA mode\n");
#endif
				} else {
#if defined( SJCD_TRACE )
					printk
					    ("SJCD_S_READ: nothing to read: go to SJCD_S_STOP mode\n");
#endif
					sjcd_transfer_state = SJCD_S_STOP;
					goto ReSwitch;
				}
			}
#if defined( SJCD_GATHER_STAT )
			else
				statistic.read_ticks++;
#endif
			break;
		}

	case SJCD_S_DATA:{
			unsigned char stat;

		      sjcd_s_data:stat =
			    inb(SJCDPORT
				(1));
#if defined( SJCD_TRACE )
			printk("SJCD_S_DATA: status = 0x%02x\n", stat);
#endif
			if (SJCD_STATUS_AVAILABLE(stat)) {
				/*
				 * No data is waiting for us in the drive buffer. Status of operation
				 * completion is available. Read and parse it.
				 */
				sjcd_load_status();

				if (!sjcd_status_valid
				    || sjcd_command_failed) {
#if defined( SJCD_TRACE )
					printk
					    ("SJCD: read block %d failed, maybe audio disk? Giving up\n",
					     sjcd_next_bn);
#endif
					if (current_valid())
						end_request(CURRENT, 0);
#if defined( SJCD_TRACE )
					printk
					    ("SJCD_S_DATA: pre-cmd failed: go to SJCD_S_STOP mode\n");
#endif
					sjcd_transfer_state = SJCD_S_STOP;
					goto ReSwitch;
				}

				if (!sjcd_media_is_available) {
					printk
					    ("SJCD_S_DATA: no disk: go to SJCD_S_STOP mode\n");
					sjcd_transfer_state = SJCD_S_STOP;
					goto ReSwitch;
				}

				sjcd_transfer_state = SJCD_S_READ;
				goto ReSwitch;
			} else if (SJCD_DATA_AVAILABLE(stat)) {
				/*
				 * One frame is read into device buffer. We must copy it to our memory.
				 * Otherwise cdrom hangs up. Check to see if we have something to copy
				 * to.
				 */
				if (!current_valid()
				    && sjcd_buf_in == sjcd_buf_out) {
#if defined( SJCD_TRACE )
					printk
					    ("SJCD_S_DATA: nothing to read: go to SJCD_S_STOP mode\n");
					printk
					    (" ... all the date would be discarded\n");
#endif
					sjcd_transfer_state = SJCD_S_STOP;
					goto ReSwitch;
				}

				/*
				 * Everything seems to be OK. Just read the frame and recalculate
				 * indices.
				 */
				sjcd_buf_bn[sjcd_buf_in] = -1;	/* ??? */
				insb(SJCDPORT(2),
				     sjcd_buf + 2048 * sjcd_buf_in, 2048);
#if defined( SJCD_TRACE )
				printk
				    ("SJCD_S_DATA: next_bn=%d, buf_in=%d, buf_out=%d, buf_bn=%d\n",
				     sjcd_next_bn, sjcd_buf_in,
				     sjcd_buf_out,
				     sjcd_buf_bn[sjcd_buf_in]);
#endif
				sjcd_buf_bn[sjcd_buf_in] = sjcd_next_bn++;
				if (sjcd_buf_out == -1)
					sjcd_buf_out = sjcd_buf_in;
				if (++sjcd_buf_in == SJCD_BUF_SIZ)
					sjcd_buf_in = 0;

				/*
				 * Only one frame is ready at time. So we should turn over to wait for
				 * another frame. If we need that, of course.
				 */
				if (--sjcd_read_count == 0) {
					/*
					 * OK, request seems to be precessed. Continue transferring...
					 */
					if (!sjcd_transfer_is_active) {
						while (current_valid()) {
							/*
							 * Continue transferring.
							 */
							sjcd_transfer();
							if (CURRENT->
							    nr_sectors ==
							    0)
								end_request
								    (CURRENT, 1);
							else
								break;
						}
					}
					if (current_valid() &&
					    (CURRENT->sector / 4 <
					     sjcd_next_bn
					     || CURRENT->sector / 4 >
					     sjcd_next_bn +
					     SJCD_BUF_SIZ)) {
#if defined( SJCD_TRACE )
						printk
						    ("SJCD_S_DATA: can't read: go to SJCD_S_STOP mode\n");
#endif
						sjcd_transfer_state =
						    SJCD_S_STOP;
						goto ReSwitch;
					}
				}
				/*
				 * Now we should turn around rather than wait for while.
				 */
				goto sjcd_s_data;
			}
#if defined( SJCD_GATHER_STAT )
			else
				statistic.data_ticks++;
#endif
			break;
		}

	case SJCD_S_STOP:{
			sjcd_read_count = 0;
			sjcd_send_cmd(SCMD_STOP);
			sjcd_transfer_state = SJCD_S_STOPPING;
			sjcd_transfer_timeout = 500;
#if defined( SJCD_GATHER_STAT )
			statistic.stop_ticks++;
#endif
			break;
		}

	case SJCD_S_STOPPING:{
			unsigned char stat;

			stat = inb(SJCDPORT(1));
#if defined( SJCD_TRACE )
			printk("SJCD_S_STOP: status = 0x%02x\n", stat);
#endif
			if (SJCD_DATA_AVAILABLE(stat)) {
				int i;
#if defined( SJCD_TRACE )
				printk("SJCD_S_STOP: discard data\n");
#endif
				/*
				 * Discard all the data from the pipe. Foolish method.
				 */
				for (i = 2048; i--;
				     (void) inb(SJCDPORT(2)));
				sjcd_transfer_timeout = 500;
			} else if (SJCD_STATUS_AVAILABLE(stat)) {
				sjcd_load_status();
				if (sjcd_status_valid
				    && sjcd_media_is_changed) {
					sjcd_toc_uptodate = 0;
					sjcd_invalidate_buffers();
				}
				if (current_valid()) {
					if (sjcd_status_valid)
						sjcd_transfer_state =
						    SJCD_S_READ;
					else
						sjcd_transfer_state =
						    SJCD_S_START;
				} else
					sjcd_transfer_state = SJCD_S_IDLE;
				goto ReSwitch;
			}
#if defined( SJCD_GATHER_STAT )
			else
				statistic.stopping_ticks++;
#endif
			break;
		}

	default:
		printk("SJCD: poll: invalid state %d\n",
		       sjcd_transfer_state);
		return;
	}

	if (--sjcd_transfer_timeout == 0) {
		printk("SJCD: timeout in state %d\n", sjcd_transfer_state);
		while (current_valid())
			end_request(CURRENT, 0);
		sjcd_send_cmd(SCMD_STOP);
		sjcd_transfer_state = SJCD_S_IDLE;
		goto ReSwitch;
	}

	/*
	 * Get back in some time. 1 should be replaced with count variable to
	 * avoid unnecessary testings.
	 */
	SJCD_SET_TIMER(sjcd_poll, 1);
}

static void do_sjcd_request(request_queue_t * q)
{
#if defined( SJCD_TRACE )
	printk("SJCD: do_sjcd_request(%ld+%ld)\n",
	       CURRENT->sector, CURRENT->nr_sectors);
#endif
	sjcd_transfer_is_active = 1;
	while (current_valid()) {
		sjcd_transfer();
		if (CURRENT->nr_sectors == 0)
			end_request(CURRENT, 1);
		else {
			sjcd_buf_out = -1;	/* Want to read a block not in buffer */
			if (sjcd_transfer_state == SJCD_S_IDLE) {
				if (!sjcd_toc_uptodate) {
					if (sjcd_update_toc() < 0) {
						printk
						    ("SJCD: transfer: discard\n");
						while (current_valid())
							end_request(CURRENT, 0);
						break;
					}
				}
				sjcd_transfer_state = SJCD_S_START;
				SJCD_SET_TIMER(sjcd_poll, HZ / 100);
			}
			break;
		}
	}
	sjcd_transfer_is_active = 0;
#if defined( SJCD_TRACE )
	printk
	    ("sjcd_next_bn:%x sjcd_buf_in:%x sjcd_buf_out:%x sjcd_buf_bn:%x\n",
	     sjcd_next_bn, sjcd_buf_in, sjcd_buf_out,
	     sjcd_buf_bn[sjcd_buf_in]);
	printk("do_sjcd_request ends\n");
#endif
}

/*
 * Open the device special file. Check disk is in.
 */
static int sjcd_open(struct inode *ip, struct file *fp)
{
	/*
	 * Check the presence of device.
	 */
	if (!sjcd_present)
		return (-ENXIO);

	/*
	 * Only read operations are allowed. Really? (:-)
	 */
	if (fp->f_mode & 2)
		return (-EROFS);

	if (sjcd_open_count == 0) {
		int s, sjcd_open_tries;
/* We don't know that, do we? */
/*
    sjcd_audio_status = CDROM_AUDIO_NO_STATUS;
*/
		sjcd_mode = 0;
		sjcd_door_was_open = 0;
		sjcd_transfer_state = SJCD_S_IDLE;
		sjcd_invalidate_buffers();
		sjcd_status_valid = 0;

		/*
		 * Strict status checking.
		 */
		for (sjcd_open_tries = 4; --sjcd_open_tries;) {
			if (!sjcd_status_valid)
				sjcd_get_status();
			if (!sjcd_status_valid) {
#if defined( SJCD_DIAGNOSTIC )
				printk
				    ("SJCD: open: timed out when check status.\n");
#endif
				goto err_out;
			} else if (!sjcd_media_is_available) {
#if defined( SJCD_DIAGNOSTIC )
				printk("SJCD: open: no disk in drive\n");
#endif
				if (!sjcd_door_closed) {
					sjcd_door_was_open = 1;
#if defined( SJCD_TRACE )
					printk
					    ("SJCD: open: close the tray\n");
#endif
					s = sjcd_tray_close();
					if (s < 0 || !sjcd_status_valid
					    || sjcd_command_failed) {
#if defined( SJCD_DIAGNOSTIC )
						printk
						    ("SJCD: open: tray close attempt failed\n");
#endif
						goto err_out;
					}
					continue;
				} else
					goto err_out;
			}
			break;
		}
		s = sjcd_tray_lock();
		if (s < 0 || !sjcd_status_valid || sjcd_command_failed) {
#if defined( SJCD_DIAGNOSTIC )
			printk("SJCD: open: tray lock attempt failed\n");
#endif
			goto err_out;
		}
#if defined( SJCD_TRACE )
		printk("SJCD: open: done\n");
#endif
	}

	++sjcd_open_count;
	return (0);

      err_out:
	return (-EIO);
}

/*
 * On close, we flush all sjcd blocks from the buffer cache.
 */
static int sjcd_release(struct inode *inode, struct file *file)
{
	int s;

#if defined( SJCD_TRACE )
	printk("SJCD: release\n");
#endif
	if (--sjcd_open_count == 0) {
		sjcd_invalidate_buffers();
		s = sjcd_tray_unlock();
		if (s < 0 || !sjcd_status_valid || sjcd_command_failed) {
#if defined( SJCD_DIAGNOSTIC )
			printk
			    ("SJCD: release: tray unlock attempt failed.\n");
#endif
		}
		if (sjcd_door_was_open) {
			s = sjcd_tray_open();
			if (s < 0 || !sjcd_status_valid
			    || sjcd_command_failed) {
#if defined( SJCD_DIAGNOSTIC )
				printk
				    ("SJCD: release: tray unload attempt failed.\n");
#endif
			}
		}
	}
	return 0;
}

/*
 * A list of file operations allowed for this cdrom.
 */
static struct block_device_operations sjcd_fops = {
	.owner		= THIS_MODULE,
	.open		= sjcd_open,
	.release	= sjcd_release,
	.ioctl		= sjcd_ioctl,
	.media_changed	= sjcd_disk_change,
};

/*
 * Following stuff is intended for initialization of the cdrom. It
 * first looks for presence of device. If the device is present, it
 * will be reset. Then read the version of the drive and load status.
 * The version is two BCD-coded bytes.
 */
static struct {
	unsigned char major, minor;
} sjcd_version;

static struct gendisk *sjcd_disk;

/*
 * Test for presence of drive and initialize it. Called at boot time.
 * Probe cdrom, find out version and status.
 */
static int __init sjcd_init(void)
{
	int i;

	printk(KERN_INFO
	       "SJCD: Sanyo CDR-H94A cdrom driver version %d.%d.\n",
	       SJCD_VERSION_MAJOR, SJCD_VERSION_MINOR);

#if defined( SJCD_TRACE )
	printk("SJCD: sjcd=0x%x: ", sjcd_base);
#endif

	if (register_blkdev(MAJOR_NR, "sjcd"))
		return -EIO;

	sjcd_queue = blk_init_queue(do_sjcd_request, &sjcd_lock);
	if (!sjcd_queue)
		goto out0;

	blk_queue_hardsect_size(sjcd_queue, 2048);

	sjcd_disk = alloc_disk(1);
	if (!sjcd_disk) {
		printk(KERN_ERR "SJCD: can't allocate disk");
		goto out1;
	}
	sjcd_disk->major = MAJOR_NR,
	sjcd_disk->first_minor = 0,
	sjcd_disk->fops = &sjcd_fops,
	sprintf(sjcd_disk->disk_name, "sjcd");
	sprintf(sjcd_disk->devfs_name, "sjcd");

	if (!request_region(sjcd_base, 4,"sjcd")) {
		printk
		    ("SJCD: Init failed, I/O port (%X) is already in use\n",
		     sjcd_base);
		goto out2;
	}

	/*
	 * Check for card. Since we are booting now, we can't use standard
	 * wait algorithm.
	 */
	printk(KERN_INFO "SJCD: Resetting: ");
	sjcd_send_cmd(SCMD_RESET);
	for (i = 1000; i > 0 && !sjcd_status_valid; --i) {
		unsigned long timer;

		/*
		 * Wait 10ms approx.
		 */
		for (timer = jiffies; time_before_eq(jiffies, timer););
		if ((i % 100) == 0)
			printk(".");
		(void) sjcd_check_status();
	}
	if (i == 0 || sjcd_command_failed) {
		printk(" reset failed, no drive found.\n");
		goto out3;
	} else
		printk("\n");

	/*
	 * Get and print out cdrom version.
	 */
	printk(KERN_INFO "SJCD: Getting version: ");
	sjcd_send_cmd(SCMD_GET_VERSION);
	for (i = 1000; i > 0 && !sjcd_status_valid; --i) {
		unsigned long timer;

		/*
		 * Wait 10ms approx.
		 */
		for (timer = jiffies; time_before_eq(jiffies, timer););
		if ((i % 100) == 0)
			printk(".");
		(void) sjcd_check_status();
	}
	if (i == 0 || sjcd_command_failed) {
		printk(" get version failed, no drive found.\n");
		goto out3;
	}

	if (sjcd_load_response(&sjcd_version, sizeof(sjcd_version)) == 0) {
		printk(" %1x.%02x\n", (int) sjcd_version.major,
		       (int) sjcd_version.minor);
	} else {
		printk(" read version failed, no drive found.\n");
		goto out3;
	}

	/*
	 * Check and print out the tray state. (if it is needed?).
	 */
	if (!sjcd_status_valid) {
		printk(KERN_INFO "SJCD: Getting status: ");
		sjcd_send_cmd(SCMD_GET_STATUS);
		for (i = 1000; i > 0 && !sjcd_status_valid; --i) {
			unsigned long timer;

			/*
			 * Wait 10ms approx.
			 */
			for (timer = jiffies;
			     time_before_eq(jiffies, timer););
			if ((i % 100) == 0)
				printk(".");
			(void) sjcd_check_status();
		}
		if (i == 0 || sjcd_command_failed) {
			printk(" get status failed, no drive found.\n");
			goto out3;
		} else
			printk("\n");
	}

	printk(KERN_INFO "SJCD: Status: port=0x%x.\n", sjcd_base);
	sjcd_disk->queue = sjcd_queue;
	add_disk(sjcd_disk);

	sjcd_present++;
	return (0);
out3:
	release_region(sjcd_base, 4);
out2:
	put_disk(sjcd_disk);
out1:
	blk_cleanup_queue(sjcd_queue);
out0:
	if ((unregister_blkdev(MAJOR_NR, "sjcd") == -EINVAL))
		printk("SJCD: cannot unregister device.\n");
	return (-EIO);
}

static void __exit sjcd_exit(void)
{
	del_gendisk(sjcd_disk);
	put_disk(sjcd_disk);
	release_region(sjcd_base, 4);
	blk_cleanup_queue(sjcd_queue);
	if ((unregister_blkdev(MAJOR_NR, "sjcd") == -EINVAL))
		printk("SJCD: cannot unregister device.\n");
	printk(KERN_INFO "SJCD: module: removed.\n");
}

module_init(sjcd_init);
module_exit(sjcd_exit);

MODULE_LICENSE("GPL");
MODULE_ALIAS_BLOCKDEV_MAJOR(SANYO_CDROM_MAJOR);
