cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

pt.c (23991B)


      1/* 
      2        pt.c    (c) 1998  Grant R. Guenther <grant@torque.net>
      3                          Under the terms of the GNU General Public License.
      4
      5        This is the high-level driver for parallel port ATAPI tape
      6        drives based on chips supported by the paride module.
      7
      8	The driver implements both rewinding and non-rewinding
      9	devices, filemarks, and the rewind ioctl.  It allocates
     10	a small internal "bounce buffer" for each open device, but
     11        otherwise expects buffering and blocking to be done at the
     12        user level.  As with most block-structured tapes, short
     13	writes are padded to full tape blocks, so reading back a file
     14        may return more data than was actually written.
     15
     16        By default, the driver will autoprobe for a single parallel
     17        port ATAPI tape drive, but if their individual parameters are
     18        specified, the driver can handle up to 4 drives.
     19
     20	The rewinding devices are named /dev/pt0, /dev/pt1, ...
     21	while the non-rewinding devices are /dev/npt0, /dev/npt1, etc.
     22
     23        The behaviour of the pt driver can be altered by setting
     24        some parameters from the insmod command line.  The following
     25        parameters are adjustable:
     26
     27            drive0      These four arguments can be arrays of       
     28            drive1      1-6 integers as follows:
     29            drive2
     30            drive3      <prt>,<pro>,<uni>,<mod>,<slv>,<dly>
     31
     32                        Where,
     33
     34                <prt>   is the base of the parallel port address for
     35                        the corresponding drive.  (required)
     36
     37                <pro>   is the protocol number for the adapter that
     38                        supports this drive.  These numbers are
     39                        logged by 'paride' when the protocol modules
     40                        are initialised.  (0 if not given)
     41
     42                <uni>   for those adapters that support chained
     43                        devices, this is the unit selector for the
     44                        chain of devices on the given port.  It should
     45                        be zero for devices that don't support chaining.
     46                        (0 if not given)
     47
     48                <mod>   this can be -1 to choose the best mode, or one
     49                        of the mode numbers supported by the adapter.
     50                        (-1 if not given)
     51
     52                <slv>   ATAPI devices can be jumpered to master or slave.
     53                        Set this to 0 to choose the master drive, 1 to
     54                        choose the slave, -1 (the default) to choose the
     55                        first drive found.
     56
     57                <dly>   some parallel ports require the driver to 
     58                        go more slowly.  -1 sets a default value that
     59                        should work with the chosen protocol.  Otherwise,
     60                        set this to a small integer, the larger it is
     61                        the slower the port i/o.  In some cases, setting
     62                        this to zero will speed up the device. (default -1)
     63
     64	    major	You may use this parameter to override the
     65			default major number (96) that this driver
     66			will use.  Be sure to change the device
     67			name as well.
     68
     69	    name	This parameter is a character string that
     70			contains the name the kernel will use for this
     71			device (in /proc output, for instance).
     72			(default "pt").
     73
     74            verbose     This parameter controls the amount of logging
     75                        that the driver will do.  Set it to 0 for
     76                        normal operation, 1 to see autoprobe progress
     77                        messages, or 2 to see additional debugging
     78                        output.  (default 0)
     79 
     80        If this driver is built into the kernel, you can use 
     81        the following command line parameters, with the same values
     82        as the corresponding module parameters listed above:
     83
     84            pt.drive0
     85            pt.drive1
     86            pt.drive2
     87            pt.drive3
     88
     89        In addition, you can use the parameter pt.disable to disable
     90        the driver entirely.
     91
     92*/
     93
     94/*   Changes:
     95
     96	1.01	GRG 1998.05.06	Round up transfer size, fix ready_wait,
     97			        loosed interpretation of ATAPI standard
     98				for clearing error status.
     99				Eliminate sti();
    100	1.02    GRG 1998.06.16  Eliminate an Ugh.
    101	1.03    GRG 1998.08.15  Adjusted PT_TMO, use HZ in loop timing,
    102				extra debugging
    103	1.04    GRG 1998.09.24  Repair minor coding error, added jumbo support
    104	
    105*/
    106
    107#define PT_VERSION      "1.04"
    108#define PT_MAJOR	96
    109#define PT_NAME		"pt"
    110#define PT_UNITS	4
    111
    112#include <linux/types.h>
    113
    114/* Here are things one can override from the insmod command.
    115   Most are autoprobed by paride unless set here.  Verbose is on
    116   by default.
    117
    118*/
    119
    120static int verbose = 0;
    121static int major = PT_MAJOR;
    122static char *name = PT_NAME;
    123static int disable = 0;
    124
    125static int drive0[6] = { 0, 0, 0, -1, -1, -1 };
    126static int drive1[6] = { 0, 0, 0, -1, -1, -1 };
    127static int drive2[6] = { 0, 0, 0, -1, -1, -1 };
    128static int drive3[6] = { 0, 0, 0, -1, -1, -1 };
    129
    130static int (*drives[4])[6] = {&drive0, &drive1, &drive2, &drive3};
    131
    132#define D_PRT   0
    133#define D_PRO   1
    134#define D_UNI   2
    135#define D_MOD   3
    136#define D_SLV   4
    137#define D_DLY   5
    138
    139#define DU              (*drives[unit])
    140
    141/* end of parameters */
    142
    143#include <linux/module.h>
    144#include <linux/init.h>
    145#include <linux/fs.h>
    146#include <linux/delay.h>
    147#include <linux/slab.h>
    148#include <linux/mtio.h>
    149#include <linux/device.h>
    150#include <linux/sched.h>	/* current, TASK_*, schedule_timeout() */
    151#include <linux/mutex.h>
    152
    153#include <linux/uaccess.h>
    154
    155module_param(verbose, int, 0);
    156module_param(major, int, 0);
    157module_param(name, charp, 0);
    158module_param_array(drive0, int, NULL, 0);
    159module_param_array(drive1, int, NULL, 0);
    160module_param_array(drive2, int, NULL, 0);
    161module_param_array(drive3, int, NULL, 0);
    162
    163#include "paride.h"
    164
    165#define PT_MAX_RETRIES  5
    166#define PT_TMO          3000	/* interrupt timeout in jiffies */
    167#define PT_SPIN_DEL     50	/* spin delay in micro-seconds  */
    168#define PT_RESET_TMO    30	/* 30 seconds */
    169#define PT_READY_TMO	60	/* 60 seconds */
    170#define PT_REWIND_TMO	1200	/* 20 minutes */
    171
    172#define PT_SPIN         ((1000000/(HZ*PT_SPIN_DEL))*PT_TMO)
    173
    174#define STAT_ERR        0x00001
    175#define STAT_INDEX      0x00002
    176#define STAT_ECC        0x00004
    177#define STAT_DRQ        0x00008
    178#define STAT_SEEK       0x00010
    179#define STAT_WRERR      0x00020
    180#define STAT_READY      0x00040
    181#define STAT_BUSY       0x00080
    182#define STAT_SENSE	0x1f000
    183
    184#define ATAPI_TEST_READY	0x00
    185#define ATAPI_REWIND		0x01
    186#define ATAPI_REQ_SENSE		0x03
    187#define ATAPI_READ_6		0x08
    188#define ATAPI_WRITE_6		0x0a
    189#define ATAPI_WFM		0x10
    190#define ATAPI_IDENTIFY		0x12
    191#define ATAPI_MODE_SENSE	0x1a
    192#define ATAPI_LOG_SENSE		0x4d
    193
    194static DEFINE_MUTEX(pt_mutex);
    195static int pt_open(struct inode *inode, struct file *file);
    196static long pt_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
    197static int pt_release(struct inode *inode, struct file *file);
    198static ssize_t pt_read(struct file *filp, char __user *buf,
    199		       size_t count, loff_t * ppos);
    200static ssize_t pt_write(struct file *filp, const char __user *buf,
    201			size_t count, loff_t * ppos);
    202static int pt_detect(void);
    203
    204/* bits in tape->flags */
    205
    206#define PT_MEDIA	1
    207#define PT_WRITE_OK	2
    208#define PT_REWIND	4
    209#define PT_WRITING      8
    210#define PT_READING     16
    211#define PT_EOF	       32
    212
    213#define PT_NAMELEN      8
    214#define PT_BUFSIZE  16384
    215
    216struct pt_unit {
    217	struct pi_adapter pia;	/* interface to paride layer */
    218	struct pi_adapter *pi;
    219	int flags;		/* various state flags */
    220	int last_sense;		/* result of last request sense */
    221	int drive;		/* drive */
    222	atomic_t available;	/* 1 if access is available 0 otherwise */
    223	int bs;			/* block size */
    224	int capacity;		/* Size of tape in KB */
    225	int present;		/* device present ? */
    226	char *bufptr;
    227	char name[PT_NAMELEN];	/* pf0, pf1, ... */
    228};
    229
    230static int pt_identify(struct pt_unit *tape);
    231
    232static struct pt_unit pt[PT_UNITS];
    233
    234static char pt_scratch[512];	/* scratch block buffer */
    235static void *par_drv;		/* reference of parport driver */
    236
    237/* kernel glue structures */
    238
    239static const struct file_operations pt_fops = {
    240	.owner = THIS_MODULE,
    241	.read = pt_read,
    242	.write = pt_write,
    243	.unlocked_ioctl = pt_ioctl,
    244	.open = pt_open,
    245	.release = pt_release,
    246	.llseek = noop_llseek,
    247};
    248
    249/* sysfs class support */
    250static struct class *pt_class;
    251
    252static inline int status_reg(struct pi_adapter *pi)
    253{
    254	return pi_read_regr(pi, 1, 6);
    255}
    256
    257static inline int read_reg(struct pi_adapter *pi, int reg)
    258{
    259	return pi_read_regr(pi, 0, reg);
    260}
    261
    262static inline void write_reg(struct pi_adapter *pi, int reg, int val)
    263{
    264	pi_write_regr(pi, 0, reg, val);
    265}
    266
    267static inline u8 DRIVE(struct pt_unit *tape)
    268{
    269	return 0xa0+0x10*tape->drive;
    270}
    271
    272static int pt_wait(struct pt_unit *tape, int go, int stop, char *fun, char *msg)
    273{
    274	int j, r, e, s, p;
    275	struct pi_adapter *pi = tape->pi;
    276
    277	j = 0;
    278	while ((((r = status_reg(pi)) & go) || (stop && (!(r & stop))))
    279	       && (j++ < PT_SPIN))
    280		udelay(PT_SPIN_DEL);
    281
    282	if ((r & (STAT_ERR & stop)) || (j > PT_SPIN)) {
    283		s = read_reg(pi, 7);
    284		e = read_reg(pi, 1);
    285		p = read_reg(pi, 2);
    286		if (j > PT_SPIN)
    287			e |= 0x100;
    288		if (fun)
    289			printk("%s: %s %s: alt=0x%x stat=0x%x err=0x%x"
    290			       " loop=%d phase=%d\n",
    291			       tape->name, fun, msg, r, s, e, j, p);
    292		return (e << 8) + s;
    293	}
    294	return 0;
    295}
    296
    297static int pt_command(struct pt_unit *tape, char *cmd, int dlen, char *fun)
    298{
    299	struct pi_adapter *pi = tape->pi;
    300	pi_connect(pi);
    301
    302	write_reg(pi, 6, DRIVE(tape));
    303
    304	if (pt_wait(tape, STAT_BUSY | STAT_DRQ, 0, fun, "before command")) {
    305		pi_disconnect(pi);
    306		return -1;
    307	}
    308
    309	write_reg(pi, 4, dlen % 256);
    310	write_reg(pi, 5, dlen / 256);
    311	write_reg(pi, 7, 0xa0);	/* ATAPI packet command */
    312
    313	if (pt_wait(tape, STAT_BUSY, STAT_DRQ, fun, "command DRQ")) {
    314		pi_disconnect(pi);
    315		return -1;
    316	}
    317
    318	if (read_reg(pi, 2) != 1) {
    319		printk("%s: %s: command phase error\n", tape->name, fun);
    320		pi_disconnect(pi);
    321		return -1;
    322	}
    323
    324	pi_write_block(pi, cmd, 12);
    325
    326	return 0;
    327}
    328
    329static int pt_completion(struct pt_unit *tape, char *buf, char *fun)
    330{
    331	struct pi_adapter *pi = tape->pi;
    332	int r, s, n, p;
    333
    334	r = pt_wait(tape, STAT_BUSY, STAT_DRQ | STAT_READY | STAT_ERR,
    335		    fun, "completion");
    336
    337	if (read_reg(pi, 7) & STAT_DRQ) {
    338		n = (((read_reg(pi, 4) + 256 * read_reg(pi, 5)) +
    339		      3) & 0xfffc);
    340		p = read_reg(pi, 2) & 3;
    341		if (p == 0)
    342			pi_write_block(pi, buf, n);
    343		if (p == 2)
    344			pi_read_block(pi, buf, n);
    345	}
    346
    347	s = pt_wait(tape, STAT_BUSY, STAT_READY | STAT_ERR, fun, "data done");
    348
    349	pi_disconnect(pi);
    350
    351	return (r ? r : s);
    352}
    353
    354static void pt_req_sense(struct pt_unit *tape, int quiet)
    355{
    356	char rs_cmd[12] = { ATAPI_REQ_SENSE, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0 };
    357	char buf[16];
    358	int r;
    359
    360	r = pt_command(tape, rs_cmd, 16, "Request sense");
    361	mdelay(1);
    362	if (!r)
    363		pt_completion(tape, buf, "Request sense");
    364
    365	tape->last_sense = -1;
    366	if (!r) {
    367		if (!quiet)
    368			printk("%s: Sense key: %x, ASC: %x, ASQ: %x\n",
    369			       tape->name, buf[2] & 0xf, buf[12], buf[13]);
    370		tape->last_sense = (buf[2] & 0xf) | ((buf[12] & 0xff) << 8)
    371		    | ((buf[13] & 0xff) << 16);
    372	}
    373}
    374
    375static int pt_atapi(struct pt_unit *tape, char *cmd, int dlen, char *buf, char *fun)
    376{
    377	int r;
    378
    379	r = pt_command(tape, cmd, dlen, fun);
    380	mdelay(1);
    381	if (!r)
    382		r = pt_completion(tape, buf, fun);
    383	if (r)
    384		pt_req_sense(tape, !fun);
    385
    386	return r;
    387}
    388
    389static void pt_sleep(int cs)
    390{
    391	schedule_timeout_interruptible(cs);
    392}
    393
    394static int pt_poll_dsc(struct pt_unit *tape, int pause, int tmo, char *msg)
    395{
    396	struct pi_adapter *pi = tape->pi;
    397	int k, e, s;
    398
    399	k = 0;
    400	e = 0;
    401	s = 0;
    402	while (k < tmo) {
    403		pt_sleep(pause);
    404		k++;
    405		pi_connect(pi);
    406		write_reg(pi, 6, DRIVE(tape));
    407		s = read_reg(pi, 7);
    408		e = read_reg(pi, 1);
    409		pi_disconnect(pi);
    410		if (s & (STAT_ERR | STAT_SEEK))
    411			break;
    412	}
    413	if ((k >= tmo) || (s & STAT_ERR)) {
    414		if (k >= tmo)
    415			printk("%s: %s DSC timeout\n", tape->name, msg);
    416		else
    417			printk("%s: %s stat=0x%x err=0x%x\n", tape->name, msg, s,
    418			       e);
    419		pt_req_sense(tape, 0);
    420		return 0;
    421	}
    422	return 1;
    423}
    424
    425static void pt_media_access_cmd(struct pt_unit *tape, int tmo, char *cmd, char *fun)
    426{
    427	if (pt_command(tape, cmd, 0, fun)) {
    428		pt_req_sense(tape, 0);
    429		return;
    430	}
    431	pi_disconnect(tape->pi);
    432	pt_poll_dsc(tape, HZ, tmo, fun);
    433}
    434
    435static void pt_rewind(struct pt_unit *tape)
    436{
    437	char rw_cmd[12] = { ATAPI_REWIND, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    438
    439	pt_media_access_cmd(tape, PT_REWIND_TMO, rw_cmd, "rewind");
    440}
    441
    442static void pt_write_fm(struct pt_unit *tape)
    443{
    444	char wm_cmd[12] = { ATAPI_WFM, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 };
    445
    446	pt_media_access_cmd(tape, PT_TMO, wm_cmd, "write filemark");
    447}
    448
    449#define DBMSG(msg)      ((verbose>1)?(msg):NULL)
    450
    451static int pt_reset(struct pt_unit *tape)
    452{
    453	struct pi_adapter *pi = tape->pi;
    454	int i, k, flg;
    455	int expect[5] = { 1, 1, 1, 0x14, 0xeb };
    456
    457	pi_connect(pi);
    458	write_reg(pi, 6, DRIVE(tape));
    459	write_reg(pi, 7, 8);
    460
    461	pt_sleep(20 * HZ / 1000);
    462
    463	k = 0;
    464	while ((k++ < PT_RESET_TMO) && (status_reg(pi) & STAT_BUSY))
    465		pt_sleep(HZ / 10);
    466
    467	flg = 1;
    468	for (i = 0; i < 5; i++)
    469		flg &= (read_reg(pi, i + 1) == expect[i]);
    470
    471	if (verbose) {
    472		printk("%s: Reset (%d) signature = ", tape->name, k);
    473		for (i = 0; i < 5; i++)
    474			printk("%3x", read_reg(pi, i + 1));
    475		if (!flg)
    476			printk(" (incorrect)");
    477		printk("\n");
    478	}
    479
    480	pi_disconnect(pi);
    481	return flg - 1;
    482}
    483
    484static int pt_ready_wait(struct pt_unit *tape, int tmo)
    485{
    486	char tr_cmd[12] = { ATAPI_TEST_READY, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    487	int k, p;
    488
    489	k = 0;
    490	while (k < tmo) {
    491		tape->last_sense = 0;
    492		pt_atapi(tape, tr_cmd, 0, NULL, DBMSG("test unit ready"));
    493		p = tape->last_sense;
    494		if (!p)
    495			return 0;
    496		if (!(((p & 0xffff) == 0x0402) || ((p & 0xff) == 6)))
    497			return p;
    498		k++;
    499		pt_sleep(HZ);
    500	}
    501	return 0x000020;	/* timeout */
    502}
    503
    504static void xs(char *buf, char *targ, int offs, int len)
    505{
    506	int j, k, l;
    507
    508	j = 0;
    509	l = 0;
    510	for (k = 0; k < len; k++)
    511		if ((buf[k + offs] != 0x20) || (buf[k + offs] != l))
    512			l = targ[j++] = buf[k + offs];
    513	if (l == 0x20)
    514		j--;
    515	targ[j] = 0;
    516}
    517
    518static int xn(char *buf, int offs, int size)
    519{
    520	int v, k;
    521
    522	v = 0;
    523	for (k = 0; k < size; k++)
    524		v = v * 256 + (buf[k + offs] & 0xff);
    525	return v;
    526}
    527
    528static int pt_identify(struct pt_unit *tape)
    529{
    530	int dt, s;
    531	char *ms[2] = { "master", "slave" };
    532	char mf[10], id[18];
    533	char id_cmd[12] = { ATAPI_IDENTIFY, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
    534	char ms_cmd[12] =
    535	    { ATAPI_MODE_SENSE, 0, 0x2a, 0, 36, 0, 0, 0, 0, 0, 0, 0 };
    536	char ls_cmd[12] =
    537	    { ATAPI_LOG_SENSE, 0, 0x71, 0, 0, 0, 0, 0, 36, 0, 0, 0 };
    538	char buf[36];
    539
    540	s = pt_atapi(tape, id_cmd, 36, buf, "identify");
    541	if (s)
    542		return -1;
    543
    544	dt = buf[0] & 0x1f;
    545	if (dt != 1) {
    546		if (verbose)
    547			printk("%s: Drive %d, unsupported type %d\n",
    548			       tape->name, tape->drive, dt);
    549		return -1;
    550	}
    551
    552	xs(buf, mf, 8, 8);
    553	xs(buf, id, 16, 16);
    554
    555	tape->flags = 0;
    556	tape->capacity = 0;
    557	tape->bs = 0;
    558
    559	if (!pt_ready_wait(tape, PT_READY_TMO))
    560		tape->flags |= PT_MEDIA;
    561
    562	if (!pt_atapi(tape, ms_cmd, 36, buf, "mode sense")) {
    563		if (!(buf[2] & 0x80))
    564			tape->flags |= PT_WRITE_OK;
    565		tape->bs = xn(buf, 10, 2);
    566	}
    567
    568	if (!pt_atapi(tape, ls_cmd, 36, buf, "log sense"))
    569		tape->capacity = xn(buf, 24, 4);
    570
    571	printk("%s: %s %s, %s", tape->name, mf, id, ms[tape->drive]);
    572	if (!(tape->flags & PT_MEDIA))
    573		printk(", no media\n");
    574	else {
    575		if (!(tape->flags & PT_WRITE_OK))
    576			printk(", RO");
    577		printk(", blocksize %d, %d MB\n", tape->bs, tape->capacity / 1024);
    578	}
    579
    580	return 0;
    581}
    582
    583
    584/*
    585 * returns  0, with id set if drive is detected
    586 *	   -1, if drive detection failed
    587 */
    588static int pt_probe(struct pt_unit *tape)
    589{
    590	if (tape->drive == -1) {
    591		for (tape->drive = 0; tape->drive <= 1; tape->drive++)
    592			if (!pt_reset(tape))
    593				return pt_identify(tape);
    594	} else {
    595		if (!pt_reset(tape))
    596			return pt_identify(tape);
    597	}
    598	return -1;
    599}
    600
    601static int pt_detect(void)
    602{
    603	struct pt_unit *tape;
    604	int specified = 0, found = 0;
    605	int unit;
    606
    607	printk("%s: %s version %s, major %d\n", name, name, PT_VERSION, major);
    608
    609	par_drv = pi_register_driver(name);
    610	if (!par_drv) {
    611		pr_err("failed to register %s driver\n", name);
    612		return -1;
    613	}
    614
    615	specified = 0;
    616	for (unit = 0; unit < PT_UNITS; unit++) {
    617		struct pt_unit *tape = &pt[unit];
    618		tape->pi = &tape->pia;
    619		atomic_set(&tape->available, 1);
    620		tape->flags = 0;
    621		tape->last_sense = 0;
    622		tape->present = 0;
    623		tape->bufptr = NULL;
    624		tape->drive = DU[D_SLV];
    625		snprintf(tape->name, PT_NAMELEN, "%s%d", name, unit);
    626		if (!DU[D_PRT])
    627			continue;
    628		specified++;
    629		if (pi_init(tape->pi, 0, DU[D_PRT], DU[D_MOD], DU[D_UNI],
    630		     DU[D_PRO], DU[D_DLY], pt_scratch, PI_PT,
    631		     verbose, tape->name)) {
    632			if (!pt_probe(tape)) {
    633				tape->present = 1;
    634				found++;
    635			} else
    636				pi_release(tape->pi);
    637		}
    638	}
    639	if (specified == 0) {
    640		tape = pt;
    641		if (pi_init(tape->pi, 1, -1, -1, -1, -1, -1, pt_scratch,
    642			    PI_PT, verbose, tape->name)) {
    643			if (!pt_probe(tape)) {
    644				tape->present = 1;
    645				found++;
    646			} else
    647				pi_release(tape->pi);
    648		}
    649
    650	}
    651	if (found)
    652		return 0;
    653
    654	pi_unregister_driver(par_drv);
    655	printk("%s: No ATAPI tape drive detected\n", name);
    656	return -1;
    657}
    658
    659static int pt_open(struct inode *inode, struct file *file)
    660{
    661	int unit = iminor(inode) & 0x7F;
    662	struct pt_unit *tape = pt + unit;
    663	int err;
    664
    665	mutex_lock(&pt_mutex);
    666	if (unit >= PT_UNITS || (!tape->present)) {
    667		mutex_unlock(&pt_mutex);
    668		return -ENODEV;
    669	}
    670
    671	err = -EBUSY;
    672	if (!atomic_dec_and_test(&tape->available))
    673		goto out;
    674
    675	pt_identify(tape);
    676
    677	err = -ENODEV;
    678	if (!(tape->flags & PT_MEDIA))
    679		goto out;
    680
    681	err = -EROFS;
    682	if ((!(tape->flags & PT_WRITE_OK)) && (file->f_mode & FMODE_WRITE))
    683		goto out;
    684
    685	if (!(iminor(inode) & 128))
    686		tape->flags |= PT_REWIND;
    687
    688	err = -ENOMEM;
    689	tape->bufptr = kmalloc(PT_BUFSIZE, GFP_KERNEL);
    690	if (tape->bufptr == NULL) {
    691		printk("%s: buffer allocation failed\n", tape->name);
    692		goto out;
    693	}
    694
    695	file->private_data = tape;
    696	mutex_unlock(&pt_mutex);
    697	return 0;
    698
    699out:
    700	atomic_inc(&tape->available);
    701	mutex_unlock(&pt_mutex);
    702	return err;
    703}
    704
    705static long pt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
    706{
    707	struct pt_unit *tape = file->private_data;
    708	struct mtop __user *p = (void __user *)arg;
    709	struct mtop mtop;
    710
    711	switch (cmd) {
    712	case MTIOCTOP:
    713		if (copy_from_user(&mtop, p, sizeof(struct mtop)))
    714			return -EFAULT;
    715
    716		switch (mtop.mt_op) {
    717
    718		case MTREW:
    719			mutex_lock(&pt_mutex);
    720			pt_rewind(tape);
    721			mutex_unlock(&pt_mutex);
    722			return 0;
    723
    724		case MTWEOF:
    725			mutex_lock(&pt_mutex);
    726			pt_write_fm(tape);
    727			mutex_unlock(&pt_mutex);
    728			return 0;
    729
    730		default:
    731			/* FIXME: rate limit ?? */
    732			printk(KERN_DEBUG "%s: Unimplemented mt_op %d\n", tape->name,
    733			       mtop.mt_op);
    734			return -EINVAL;
    735		}
    736
    737	default:
    738		return -ENOTTY;
    739	}
    740}
    741
    742static int
    743pt_release(struct inode *inode, struct file *file)
    744{
    745	struct pt_unit *tape = file->private_data;
    746
    747	if (atomic_read(&tape->available) > 1)
    748		return -EINVAL;
    749
    750	if (tape->flags & PT_WRITING)
    751		pt_write_fm(tape);
    752
    753	if (tape->flags & PT_REWIND)
    754		pt_rewind(tape);
    755
    756	kfree(tape->bufptr);
    757	tape->bufptr = NULL;
    758
    759	atomic_inc(&tape->available);
    760
    761	return 0;
    762
    763}
    764
    765static ssize_t pt_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos)
    766{
    767	struct pt_unit *tape = filp->private_data;
    768	struct pi_adapter *pi = tape->pi;
    769	char rd_cmd[12] = { ATAPI_READ_6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    770	int k, n, r, p, s, t, b;
    771
    772	if (!(tape->flags & (PT_READING | PT_WRITING))) {
    773		tape->flags |= PT_READING;
    774		if (pt_atapi(tape, rd_cmd, 0, NULL, "start read-ahead"))
    775			return -EIO;
    776	} else if (tape->flags & PT_WRITING)
    777		return -EIO;
    778
    779	if (tape->flags & PT_EOF)
    780		return 0;
    781
    782	t = 0;
    783
    784	while (count > 0) {
    785
    786		if (!pt_poll_dsc(tape, HZ / 100, PT_TMO, "read"))
    787			return -EIO;
    788
    789		n = count;
    790		if (n > 32768)
    791			n = 32768;	/* max per command */
    792		b = (n - 1 + tape->bs) / tape->bs;
    793		n = b * tape->bs;	/* rounded up to even block */
    794
    795		rd_cmd[4] = b;
    796
    797		r = pt_command(tape, rd_cmd, n, "read");
    798
    799		mdelay(1);
    800
    801		if (r) {
    802			pt_req_sense(tape, 0);
    803			return -EIO;
    804		}
    805
    806		while (1) {
    807
    808			r = pt_wait(tape, STAT_BUSY,
    809				    STAT_DRQ | STAT_ERR | STAT_READY,
    810				    DBMSG("read DRQ"), "");
    811
    812			if (r & STAT_SENSE) {
    813				pi_disconnect(pi);
    814				pt_req_sense(tape, 0);
    815				return -EIO;
    816			}
    817
    818			if (r)
    819				tape->flags |= PT_EOF;
    820
    821			s = read_reg(pi, 7);
    822
    823			if (!(s & STAT_DRQ))
    824				break;
    825
    826			n = (read_reg(pi, 4) + 256 * read_reg(pi, 5));
    827			p = (read_reg(pi, 2) & 3);
    828			if (p != 2) {
    829				pi_disconnect(pi);
    830				printk("%s: Phase error on read: %d\n", tape->name,
    831				       p);
    832				return -EIO;
    833			}
    834
    835			while (n > 0) {
    836				k = n;
    837				if (k > PT_BUFSIZE)
    838					k = PT_BUFSIZE;
    839				pi_read_block(pi, tape->bufptr, k);
    840				n -= k;
    841				b = k;
    842				if (b > count)
    843					b = count;
    844				if (copy_to_user(buf + t, tape->bufptr, b)) {
    845					pi_disconnect(pi);
    846					return -EFAULT;
    847				}
    848				t += b;
    849				count -= b;
    850			}
    851
    852		}
    853		pi_disconnect(pi);
    854		if (tape->flags & PT_EOF)
    855			break;
    856	}
    857
    858	return t;
    859
    860}
    861
    862static ssize_t pt_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
    863{
    864	struct pt_unit *tape = filp->private_data;
    865	struct pi_adapter *pi = tape->pi;
    866	char wr_cmd[12] = { ATAPI_WRITE_6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    867	int k, n, r, p, s, t, b;
    868
    869	if (!(tape->flags & PT_WRITE_OK))
    870		return -EROFS;
    871
    872	if (!(tape->flags & (PT_READING | PT_WRITING))) {
    873		tape->flags |= PT_WRITING;
    874		if (pt_atapi
    875		    (tape, wr_cmd, 0, NULL, "start buffer-available mode"))
    876			return -EIO;
    877	} else if (tape->flags & PT_READING)
    878		return -EIO;
    879
    880	if (tape->flags & PT_EOF)
    881		return -ENOSPC;
    882
    883	t = 0;
    884
    885	while (count > 0) {
    886
    887		if (!pt_poll_dsc(tape, HZ / 100, PT_TMO, "write"))
    888			return -EIO;
    889
    890		n = count;
    891		if (n > 32768)
    892			n = 32768;	/* max per command */
    893		b = (n - 1 + tape->bs) / tape->bs;
    894		n = b * tape->bs;	/* rounded up to even block */
    895
    896		wr_cmd[4] = b;
    897
    898		r = pt_command(tape, wr_cmd, n, "write");
    899
    900		mdelay(1);
    901
    902		if (r) {	/* error delivering command only */
    903			pt_req_sense(tape, 0);
    904			return -EIO;
    905		}
    906
    907		while (1) {
    908
    909			r = pt_wait(tape, STAT_BUSY,
    910				    STAT_DRQ | STAT_ERR | STAT_READY,
    911				    DBMSG("write DRQ"), NULL);
    912
    913			if (r & STAT_SENSE) {
    914				pi_disconnect(pi);
    915				pt_req_sense(tape, 0);
    916				return -EIO;
    917			}
    918
    919			if (r)
    920				tape->flags |= PT_EOF;
    921
    922			s = read_reg(pi, 7);
    923
    924			if (!(s & STAT_DRQ))
    925				break;
    926
    927			n = (read_reg(pi, 4) + 256 * read_reg(pi, 5));
    928			p = (read_reg(pi, 2) & 3);
    929			if (p != 0) {
    930				pi_disconnect(pi);
    931				printk("%s: Phase error on write: %d \n",
    932				       tape->name, p);
    933				return -EIO;
    934			}
    935
    936			while (n > 0) {
    937				k = n;
    938				if (k > PT_BUFSIZE)
    939					k = PT_BUFSIZE;
    940				b = k;
    941				if (b > count)
    942					b = count;
    943				if (copy_from_user(tape->bufptr, buf + t, b)) {
    944					pi_disconnect(pi);
    945					return -EFAULT;
    946				}
    947				pi_write_block(pi, tape->bufptr, k);
    948				t += b;
    949				count -= b;
    950				n -= k;
    951			}
    952
    953		}
    954		pi_disconnect(pi);
    955		if (tape->flags & PT_EOF)
    956			break;
    957	}
    958
    959	return t;
    960}
    961
    962static int __init pt_init(void)
    963{
    964	int unit;
    965	int err;
    966
    967	if (disable) {
    968		err = -EINVAL;
    969		goto out;
    970	}
    971
    972	if (pt_detect()) {
    973		err = -ENODEV;
    974		goto out;
    975	}
    976
    977	err = register_chrdev(major, name, &pt_fops);
    978	if (err < 0) {
    979		printk("pt_init: unable to get major number %d\n", major);
    980		for (unit = 0; unit < PT_UNITS; unit++)
    981			if (pt[unit].present)
    982				pi_release(pt[unit].pi);
    983		goto out;
    984	}
    985	major = err;
    986	pt_class = class_create(THIS_MODULE, "pt");
    987	if (IS_ERR(pt_class)) {
    988		err = PTR_ERR(pt_class);
    989		goto out_chrdev;
    990	}
    991
    992	for (unit = 0; unit < PT_UNITS; unit++)
    993		if (pt[unit].present) {
    994			device_create(pt_class, NULL, MKDEV(major, unit), NULL,
    995				      "pt%d", unit);
    996			device_create(pt_class, NULL, MKDEV(major, unit + 128),
    997				      NULL, "pt%dn", unit);
    998		}
    999	goto out;
   1000
   1001out_chrdev:
   1002	unregister_chrdev(major, "pt");
   1003out:
   1004	return err;
   1005}
   1006
   1007static void __exit pt_exit(void)
   1008{
   1009	int unit;
   1010	for (unit = 0; unit < PT_UNITS; unit++)
   1011		if (pt[unit].present) {
   1012			device_destroy(pt_class, MKDEV(major, unit));
   1013			device_destroy(pt_class, MKDEV(major, unit + 128));
   1014		}
   1015	class_destroy(pt_class);
   1016	unregister_chrdev(major, name);
   1017	for (unit = 0; unit < PT_UNITS; unit++)
   1018		if (pt[unit].present)
   1019			pi_release(pt[unit].pi);
   1020}
   1021
   1022MODULE_LICENSE("GPL");
   1023module_init(pt_init)
   1024module_exit(pt_exit)