Linux Audio

Check our new training course

Loading...
   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)
1