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)