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