1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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
113
114
115
116
117
118static int verbose = 0;
119static int major = PT_MAJOR;
120static char *name = PT_NAME;
121static int disable = 0;
122
123static int drive0[6] = { 0, 0, 0, -1, -1, -1 };
124static int drive1[6] = { 0, 0, 0, -1, -1, -1 };
125static int drive2[6] = { 0, 0, 0, -1, -1, -1 };
126static int drive3[6] = { 0, 0, 0, -1, -1, -1 };
127
128static 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
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>
149#include <linux/mutex.h>
150
151#include <asm/uaccess.h>
152
153module_param(verbose, bool, 0);
154module_param(major, int, 0);
155module_param(name, charp, 0);
156module_param_array(drive0, int, NULL, 0);
157module_param_array(drive1, int, NULL, 0);
158module_param_array(drive2, int, NULL, 0);
159module_param_array(drive3, int, NULL, 0);
160
161#include "paride.h"
162
163#define PT_MAX_RETRIES 5
164#define PT_TMO 3000
165#define PT_SPIN_DEL 50
166#define PT_RESET_TMO 30
167#define PT_READY_TMO 60
168#define PT_REWIND_TMO 1200
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
192static DEFINE_MUTEX(pt_mutex);
193static int pt_open(struct inode *inode, struct file *file);
194static long pt_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
195static int pt_release(struct inode *inode, struct file *file);
196static ssize_t pt_read(struct file *filp, char __user *buf,
197 size_t count, loff_t * ppos);
198static ssize_t pt_write(struct file *filp, const char __user *buf,
199 size_t count, loff_t * ppos);
200static int pt_detect(void);
201
202
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
214struct pt_unit {
215 struct pi_adapter pia;
216 struct pi_adapter *pi;
217 int flags;
218 int last_sense;
219 int drive;
220 atomic_t available;
221 int bs;
222 int capacity;
223 int present;
224 char *bufptr;
225 char name[PT_NAMELEN];
226};
227
228static int pt_identify(struct pt_unit *tape);
229
230static struct pt_unit pt[PT_UNITS];
231
232static char pt_scratch[512];
233
234
235
236static 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
247static struct class *pt_class;
248
249static inline int status_reg(struct pi_adapter *pi)
250{
251 return pi_read_regr(pi, 1, 6);
252}
253
254static inline int read_reg(struct pi_adapter *pi, int reg)
255{
256 return pi_read_regr(pi, 0, reg);
257}
258
259static inline void write_reg(struct pi_adapter *pi, int reg, int val)
260{
261 pi_write_regr(pi, 0, reg, val);
262}
263
264static inline u8 DRIVE(struct pt_unit *tape)
265{
266 return 0xa0+0x10*tape->drive;
267}
268
269static 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
294static 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);
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
326static 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
351static 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
372static 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
386static void pt_sleep(int cs)
387{
388 schedule_timeout_interruptible(cs);
389}
390
391static 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
422static 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
432static 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
439static 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
448static 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
481static 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;
499}
500
501static 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
515static 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
525static 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
583
584
585static 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
598static 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
649static 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
689out:
690 atomic_inc(&tape->available);
691 mutex_unlock(&pt_mutex);
692 return err;
693}
694
695static 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
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
732static int
733pt_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
755static 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;
782 b = (n - 1 + tape->bs) / tape->bs;
783 n = b * tape->bs;
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
852static 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;
883 b = (n - 1 + tape->bs) / tape->bs;
884 n = b * tape->bs;
885
886 wr_cmd[4] = b;
887
888 r = pt_command(tape, wr_cmd, n, "write");
889
890 mdelay(1);
891
892 if (r) {
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
952static 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
991out_chrdev:
992 unregister_chrdev(major, "pt");
993out:
994 return err;
995}
996
997static 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
1012MODULE_LICENSE("GPL");
1013module_init(pt_init)
1014module_exit(pt_exit)
1015