1 /* 2 * drivers/s390/char/tape_34xx.c 3 * tape device discipline for 3480/3490 tapes. 4 * 5 * Copyright (C) IBM Corp. 2001,2006 6 * Author(s): Carsten Otte <cotte@de.ibm.com> 7 * Tuan Ngo-Anh <ngoanh@de.ibm.com> 8 * Martin Schwidefsky <schwidefsky@de.ibm.com> 9 */ 10 11 #include <linux/config.h> 12 #include <linux/module.h> 13 #include <linux/init.h> 14 #include <linux/bio.h> 15 #include <linux/workqueue.h> 16 17 #define TAPE_DBF_AREA tape_34xx_dbf 18 19 #include "tape.h" 20 #include "tape_std.h" 21 22 #define PRINTK_HEADER "TAPE_34XX: " 23 24 /* 25 * Pointer to debug area. 26 */ 27 debug_info_t *TAPE_DBF_AREA = NULL; 28 EXPORT_SYMBOL(TAPE_DBF_AREA); 29 30 #define TAPE34XX_FMT_3480 0 31 #define TAPE34XX_FMT_3480_2_XF 1 32 #define TAPE34XX_FMT_3480_XF 2 33 34 struct tape_34xx_block_id { 35 unsigned int wrap : 1; 36 unsigned int segment : 7; 37 unsigned int format : 2; 38 unsigned int block : 22; 39 }; 40 41 /* 42 * A list of block ID's is used to faster seek blocks. 43 */ 44 struct tape_34xx_sbid { 45 struct list_head list; 46 struct tape_34xx_block_id bid; 47 }; 48 49 static void tape_34xx_delete_sbid_from(struct tape_device *, int); 50 51 /* 52 * Medium sense for 34xx tapes. There is no 'real' medium sense call. 53 * So we just do a normal sense. 54 */ 55 static int 56 tape_34xx_medium_sense(struct tape_device *device) 57 { 58 struct tape_request *request; 59 unsigned char *sense; 60 int rc; 61 62 request = tape_alloc_request(1, 32); 63 if (IS_ERR(request)) { 64 DBF_EXCEPTION(6, "MSEN fail\n"); 65 return PTR_ERR(request); 66 } 67 68 request->op = TO_MSEN; 69 tape_ccw_end(request->cpaddr, SENSE, 32, request->cpdata); 70 71 rc = tape_do_io_interruptible(device, request); 72 if (request->rc == 0) { 73 sense = request->cpdata; 74 75 /* 76 * This isn't quite correct. But since INTERVENTION_REQUIRED 77 * means that the drive is 'neither ready nor on-line' it is 78 * only slightly inaccurate to say there is no tape loaded if 79 * the drive isn't online... 80 */ 81 if (sense[0] & SENSE_INTERVENTION_REQUIRED) 82 tape_med_state_set(device, MS_UNLOADED); 83 else 84 tape_med_state_set(device, MS_LOADED); 85 86 if (sense[1] & SENSE_WRITE_PROTECT) 87 device->tape_generic_status |= GMT_WR_PROT(~0); 88 else 89 device->tape_generic_status &= ~GMT_WR_PROT(~0); 90 } else { 91 DBF_EVENT(4, "tape_34xx: medium sense failed with rc=%d\n", 92 request->rc); 93 } 94 tape_free_request(request); 95 96 return rc; 97 } 98 99 /* 100 * These functions are currently used only to schedule a medium_sense for 101 * later execution. This is because we get an interrupt whenever a medium 102 * is inserted but cannot call tape_do_io* from an interrupt context. 103 * Maybe that's useful for other actions we want to start from the 104 * interrupt handler. 105 */ 106 static void 107 tape_34xx_work_handler(void *data) 108 { 109 struct { 110 struct tape_device *device; 111 enum tape_op op; 112 struct work_struct work; 113 } *p = data; 114 115 switch(p->op) { 116 case TO_MSEN: 117 tape_34xx_medium_sense(p->device); 118 break; 119 default: 120 DBF_EVENT(3, "T34XX: internal error: unknown work\n"); 121 } 122 123 p->device = tape_put_device(p->device); 124 kfree(p); 125 } 126 127 static int 128 tape_34xx_schedule_work(struct tape_device *device, enum tape_op op) 129 { 130 struct { 131 struct tape_device *device; 132 enum tape_op op; 133 struct work_struct work; 134 } *p; 135 136 if ((p = kmalloc(sizeof(*p), GFP_ATOMIC)) == NULL) 137 return -ENOMEM; 138 139 memset(p, 0, sizeof(*p)); 140 INIT_WORK(&p->work, tape_34xx_work_handler, p); 141 142 p->device = tape_get_device_reference(device); 143 p->op = op; 144 145 schedule_work(&p->work); 146 return 0; 147 } 148 149 /* 150 * Done Handler is called when dev stat = DEVICE-END (successful operation) 151 */ 152 static inline int 153 tape_34xx_done(struct tape_request *request) 154 { 155 DBF_EVENT(6, "%s done\n", tape_op_verbose[request->op]); 156 157 switch (request->op) { 158 case TO_DSE: 159 case TO_RUN: 160 case TO_WRI: 161 case TO_WTM: 162 case TO_ASSIGN: 163 case TO_UNASSIGN: 164 tape_34xx_delete_sbid_from(request->device, 0); 165 break; 166 default: 167 ; 168 } 169 return TAPE_IO_SUCCESS; 170 } 171 172 static inline int 173 tape_34xx_erp_failed(struct tape_request *request, int rc) 174 { 175 DBF_EVENT(3, "Error recovery failed for %s (RC=%d)\n", 176 tape_op_verbose[request->op], rc); 177 return rc; 178 } 179 180 static inline int 181 tape_34xx_erp_succeeded(struct tape_request *request) 182 { 183 DBF_EVENT(3, "Error Recovery successful for %s\n", 184 tape_op_verbose[request->op]); 185 return tape_34xx_done(request); 186 } 187 188 static inline int 189 tape_34xx_erp_retry(struct tape_request *request) 190 { 191 DBF_EVENT(3, "xerp retr %s\n", tape_op_verbose[request->op]); 192 return TAPE_IO_RETRY; 193 } 194 195 /* 196 * This function is called, when no request is outstanding and we get an 197 * interrupt 198 */ 199 static int 200 tape_34xx_unsolicited_irq(struct tape_device *device, struct irb *irb) 201 { 202 if (irb->scsw.dstat == 0x85 /* READY */) { 203 /* A medium was inserted in the drive. */ 204 DBF_EVENT(6, "xuud med\n"); 205 tape_34xx_delete_sbid_from(device, 0); 206 tape_34xx_schedule_work(device, TO_MSEN); 207 } else { 208 DBF_EVENT(3, "unsol.irq! dev end: %08x\n", device->cdev_id); 209 PRINT_WARN("Unsolicited IRQ (Device End) caught.\n"); 210 tape_dump_sense(device, NULL, irb); 211 } 212 return TAPE_IO_SUCCESS; 213 } 214 215 /* 216 * Read Opposite Error Recovery Function: 217 * Used, when Read Forward does not work 218 */ 219 static int 220 tape_34xx_erp_read_opposite(struct tape_device *device, 221 struct tape_request *request) 222 { 223 if (request->op == TO_RFO) { 224 /* 225 * We did read forward, but the data could not be read 226 * *correctly*. We transform the request to a read backward 227 * and try again. 228 */ 229 tape_std_read_backward(device, request); 230 return tape_34xx_erp_retry(request); 231 } 232 if (request->op != TO_RBA) 233 PRINT_ERR("read_opposite called with state:%s\n", 234 tape_op_verbose[request->op]); 235 /* 236 * We tried to read forward and backward, but hat no 237 * success -> failed. 238 */ 239 return tape_34xx_erp_failed(request, -EIO); 240 } 241 242 static int 243 tape_34xx_erp_bug(struct tape_device *device, struct tape_request *request, 244 struct irb *irb, int no) 245 { 246 if (request->op != TO_ASSIGN) { 247 PRINT_WARN("An unexpected condition #%d was caught in " 248 "tape error recovery.\n", no); 249 PRINT_WARN("Please report this incident.\n"); 250 if (request) 251 PRINT_WARN("Operation of tape:%s\n", 252 tape_op_verbose[request->op]); 253 tape_dump_sense(device, request, irb); 254 } 255 return tape_34xx_erp_failed(request, -EIO); 256 } 257 258 /* 259 * Handle data overrun between cu and drive. The channel speed might 260 * be too slow. 261 */ 262 static int 263 tape_34xx_erp_overrun(struct tape_device *device, struct tape_request *request, 264 struct irb *irb) 265 { 266 if (irb->ecw[3] == 0x40) { 267 PRINT_WARN ("Data overrun error between control-unit " 268 "and drive. Use a faster channel connection, " 269 "if possible! \n"); 270 return tape_34xx_erp_failed(request, -EIO); 271 } 272 return tape_34xx_erp_bug(device, request, irb, -1); 273 } 274 275 /* 276 * Handle record sequence error. 277 */ 278 static int 279 tape_34xx_erp_sequence(struct tape_device *device, 280 struct tape_request *request, struct irb *irb) 281 { 282 if (irb->ecw[3] == 0x41) { 283 /* 284 * cu detected incorrect block-id sequence on tape. 285 */ 286 PRINT_WARN("Illegal block-id sequence found!\n"); 287 return tape_34xx_erp_failed(request, -EIO); 288 } 289 /* 290 * Record sequence error bit is set, but erpa does not 291 * show record sequence error. 292 */ 293 return tape_34xx_erp_bug(device, request, irb, -2); 294 } 295 296 /* 297 * This function analyses the tape's sense-data in case of a unit-check. 298 * If possible, it tries to recover from the error. Else the user is 299 * informed about the problem. 300 */ 301 static int 302 tape_34xx_unit_check(struct tape_device *device, struct tape_request *request, 303 struct irb *irb) 304 { 305 int inhibit_cu_recovery; 306 __u8* sense; 307 308 inhibit_cu_recovery = (*device->modeset_byte & 0x80) ? 1 : 0; 309 sense = irb->ecw; 310 311 #ifdef CONFIG_S390_TAPE_BLOCK 312 if (request->op == TO_BLOCK) { 313 /* 314 * Recovery for block device requests. Set the block_position 315 * to something invalid and retry. 316 */ 317 device->blk_data.block_position = -1; 318 if (request->retries-- <= 0) 319 return tape_34xx_erp_failed(request, -EIO); 320 else 321 return tape_34xx_erp_retry(request); 322 } 323 #endif 324 325 if ( 326 sense[0] & SENSE_COMMAND_REJECT && 327 sense[1] & SENSE_WRITE_PROTECT 328 ) { 329 if ( 330 request->op == TO_DSE || 331 request->op == TO_WRI || 332 request->op == TO_WTM 333 ) { 334 /* medium is write protected */ 335 return tape_34xx_erp_failed(request, -EACCES); 336 } else { 337 return tape_34xx_erp_bug(device, request, irb, -3); 338 } 339 } 340 341 /* 342 * Special cases for various tape-states when reaching 343 * end of recorded area 344 * 345 * FIXME: Maybe a special case of the special case: 346 * sense[0] == SENSE_EQUIPMENT_CHECK && 347 * sense[1] == SENSE_DRIVE_ONLINE && 348 * sense[3] == 0x47 (Volume Fenced) 349 * 350 * This was caused by continued FSF or FSR after an 351 * 'End Of Data'. 352 */ 353 if (( 354 sense[0] == SENSE_DATA_CHECK || 355 sense[0] == SENSE_EQUIPMENT_CHECK || 356 sense[0] == SENSE_EQUIPMENT_CHECK + SENSE_DEFERRED_UNIT_CHECK 357 ) && ( 358 sense[1] == SENSE_DRIVE_ONLINE || 359 sense[1] == SENSE_BEGINNING_OF_TAPE + SENSE_WRITE_MODE 360 )) { 361 switch (request->op) { 362 /* 363 * sense[0] == SENSE_DATA_CHECK && 364 * sense[1] == SENSE_DRIVE_ONLINE 365 * sense[3] == 0x36 (End Of Data) 366 * 367 * Further seeks might return a 'Volume Fenced'. 368 */ 369 case TO_FSF: 370 case TO_FSB: 371 /* Trying to seek beyond end of recorded area */ 372 return tape_34xx_erp_failed(request, -ENOSPC); 373 case TO_BSB: 374 return tape_34xx_erp_retry(request); 375 376 /* 377 * sense[0] == SENSE_DATA_CHECK && 378 * sense[1] == SENSE_DRIVE_ONLINE && 379 * sense[3] == 0x36 (End Of Data) 380 */ 381 case TO_LBL: 382 /* Block could not be located. */ 383 tape_34xx_delete_sbid_from(device, 0); 384 return tape_34xx_erp_failed(request, -EIO); 385 386 case TO_RFO: 387 /* Read beyond end of recorded area -> 0 bytes read */ 388 return tape_34xx_erp_failed(request, 0); 389 390 /* 391 * sense[0] == SENSE_EQUIPMENT_CHECK && 392 * sense[1] == SENSE_DRIVE_ONLINE && 393 * sense[3] == 0x38 (Physical End Of Volume) 394 */ 395 case TO_WRI: 396 /* Writing at physical end of volume */ 397 return tape_34xx_erp_failed(request, -ENOSPC); 398 default: 399 PRINT_ERR("Invalid op in %s:%i\n", 400 __FUNCTION__, __LINE__); 401 return tape_34xx_erp_failed(request, 0); 402 } 403 } 404 405 /* Sensing special bits */ 406 if (sense[0] & SENSE_BUS_OUT_CHECK) 407 return tape_34xx_erp_retry(request); 408 409 if (sense[0] & SENSE_DATA_CHECK) { 410 /* 411 * hardware failure, damaged tape or improper 412 * operating conditions 413 */ 414 switch (sense[3]) { 415 case 0x23: 416 /* a read data check occurred */ 417 if ((sense[2] & SENSE_TAPE_SYNC_MODE) || 418 inhibit_cu_recovery) 419 // data check is not permanent, may be 420 // recovered. We always use async-mode with 421 // cu-recovery, so this should *never* happen. 422 return tape_34xx_erp_bug(device, request, 423 irb, -4); 424 425 /* data check is permanent, CU recovery has failed */ 426 PRINT_WARN("Permanent read error\n"); 427 return tape_34xx_erp_failed(request, -EIO); 428 case 0x25: 429 // a write data check occurred 430 if ((sense[2] & SENSE_TAPE_SYNC_MODE) || 431 inhibit_cu_recovery) 432 // data check is not permanent, may be 433 // recovered. We always use async-mode with 434 // cu-recovery, so this should *never* happen. 435 return tape_34xx_erp_bug(device, request, 436 irb, -5); 437 438 // data check is permanent, cu-recovery has failed 439 PRINT_WARN("Permanent write error\n"); 440 return tape_34xx_erp_failed(request, -EIO); 441 case 0x26: 442 /* Data Check (read opposite) occurred. */ 443 return tape_34xx_erp_read_opposite(device, request); 444 case 0x28: 445 /* ID-Mark at tape start couldn't be written */ 446 PRINT_WARN("ID-Mark could not be written.\n"); 447 return tape_34xx_erp_failed(request, -EIO); 448 case 0x31: 449 /* Tape void. Tried to read beyond end of device. */ 450 PRINT_WARN("Read beyond end of recorded area.\n"); 451 return tape_34xx_erp_failed(request, -ENOSPC); 452 case 0x41: 453 /* Record sequence error. */ 454 PRINT_WARN("Invalid block-id sequence found.\n"); 455 return tape_34xx_erp_failed(request, -EIO); 456 default: 457 /* all data checks for 3480 should result in one of 458 * the above erpa-codes. For 3490, other data-check 459 * conditions do exist. */ 460 if (device->cdev->id.driver_info == tape_3480) 461 return tape_34xx_erp_bug(device, request, 462 irb, -6); 463 } 464 } 465 466 if (sense[0] & SENSE_OVERRUN) 467 return tape_34xx_erp_overrun(device, request, irb); 468 469 if (sense[1] & SENSE_RECORD_SEQUENCE_ERR) 470 return tape_34xx_erp_sequence(device, request, irb); 471 472 /* Sensing erpa codes */ 473 switch (sense[3]) { 474 case 0x00: 475 /* Unit check with erpa code 0. Report and ignore. */ 476 PRINT_WARN("Non-error sense was found. " 477 "Unit-check will be ignored.\n"); 478 return TAPE_IO_SUCCESS; 479 case 0x21: 480 /* 481 * Data streaming not operational. CU will switch to 482 * interlock mode. Reissue the command. 483 */ 484 PRINT_WARN("Data streaming not operational. " 485 "Switching to interlock-mode.\n"); 486 return tape_34xx_erp_retry(request); 487 case 0x22: 488 /* 489 * Path equipment check. Might be drive adapter error, buffer 490 * error on the lower interface, internal path not usable, 491 * or error during cartridge load. 492 */ 493 PRINT_WARN("A path equipment check occurred. One of the " 494 "following conditions occurred:\n"); 495 PRINT_WARN("drive adapter error, buffer error on the lower " 496 "interface, internal path not usable, error " 497 "during cartridge load.\n"); 498 return tape_34xx_erp_failed(request, -EIO); 499 case 0x24: 500 /* 501 * Load display check. Load display was command was issued, 502 * but the drive is displaying a drive check message. Can 503 * be threated as "device end". 504 */ 505 return tape_34xx_erp_succeeded(request); 506 case 0x27: 507 /* 508 * Command reject. May indicate illegal channel program or 509 * buffer over/underrun. Since all channel programs are 510 * issued by this driver and ought be correct, we assume a 511 * over/underrun situation and retry the channel program. 512 */ 513 return tape_34xx_erp_retry(request); 514 case 0x29: 515 /* 516 * Function incompatible. Either the tape is idrc compressed 517 * but the hardware isn't capable to do idrc, or a perform 518 * subsystem func is issued and the CU is not on-line. 519 */ 520 PRINT_WARN ("Function incompatible. Try to switch off idrc\n"); 521 return tape_34xx_erp_failed(request, -EIO); 522 case 0x2a: 523 /* 524 * Unsolicited environmental data. An internal counter 525 * overflows, we can ignore this and reissue the cmd. 526 */ 527 return tape_34xx_erp_retry(request); 528 case 0x2b: 529 /* 530 * Environmental data present. Indicates either unload 531 * completed ok or read buffered log command completed ok. 532 */ 533 if (request->op == TO_RUN) { 534 /* Rewind unload completed ok. */ 535 tape_med_state_set(device, MS_UNLOADED); 536 return tape_34xx_erp_succeeded(request); 537 } 538 /* tape_34xx doesn't use read buffered log commands. */ 539 return tape_34xx_erp_bug(device, request, irb, sense[3]); 540 case 0x2c: 541 /* 542 * Permanent equipment check. CU has tried recovery, but 543 * did not succeed. 544 */ 545 return tape_34xx_erp_failed(request, -EIO); 546 case 0x2d: 547 /* Data security erase failure. */ 548 if (request->op == TO_DSE) 549 return tape_34xx_erp_failed(request, -EIO); 550 /* Data security erase failure, but no such command issued. */ 551 return tape_34xx_erp_bug(device, request, irb, sense[3]); 552 case 0x2e: 553 /* 554 * Not capable. This indicates either that the drive fails 555 * reading the format id mark or that that format specified 556 * is not supported by the drive. 557 */ 558 PRINT_WARN("Drive not capable processing the tape format!\n"); 559 return tape_34xx_erp_failed(request, -EMEDIUMTYPE); 560 case 0x30: 561 /* The medium is write protected. */ 562 PRINT_WARN("Medium is write protected!\n"); 563 return tape_34xx_erp_failed(request, -EACCES); 564 case 0x32: 565 // Tension loss. We cannot recover this, it's an I/O error. 566 PRINT_WARN("The drive lost tape tension.\n"); 567 return tape_34xx_erp_failed(request, -EIO); 568 case 0x33: 569 /* 570 * Load Failure. The cartridge was not inserted correctly or 571 * the tape is not threaded correctly. 572 */ 573 PRINT_WARN("Cartridge load failure. Reload the cartridge " 574 "and try again.\n"); 575 tape_34xx_delete_sbid_from(device, 0); 576 return tape_34xx_erp_failed(request, -EIO); 577 case 0x34: 578 /* 579 * Unload failure. The drive cannot maintain tape tension 580 * and control tape movement during an unload operation. 581 */ 582 PRINT_WARN("Failure during cartridge unload. " 583 "Please try manually.\n"); 584 if (request->op == TO_RUN) 585 return tape_34xx_erp_failed(request, -EIO); 586 return tape_34xx_erp_bug(device, request, irb, sense[3]); 587 case 0x35: 588 /* 589 * Drive equipment check. One of the following: 590 * - cu cannot recover from a drive detected error 591 * - a check code message is shown on drive display 592 * - the cartridge loader does not respond correctly 593 * - a failure occurs during an index, load, or unload cycle 594 */ 595 PRINT_WARN("Equipment check! Please check the drive and " 596 "the cartridge loader.\n"); 597 return tape_34xx_erp_failed(request, -EIO); 598 case 0x36: 599 if (device->cdev->id.driver_info == tape_3490) 600 /* End of data. */ 601 return tape_34xx_erp_failed(request, -EIO); 602 /* This erpa is reserved for 3480 */ 603 return tape_34xx_erp_bug(device, request, irb, sense[3]); 604 case 0x37: 605 /* 606 * Tape length error. The tape is shorter than reported in 607 * the beginning-of-tape data. 608 */ 609 PRINT_WARN("Tape length error.\n"); 610 return tape_34xx_erp_failed(request, -EIO); 611 case 0x38: 612 /* 613 * Physical end of tape. A read/write operation reached 614 * the physical end of tape. 615 */ 616 if (request->op==TO_WRI || 617 request->op==TO_DSE || 618 request->op==TO_WTM) 619 return tape_34xx_erp_failed(request, -ENOSPC); 620 return tape_34xx_erp_failed(request, -EIO); 621 case 0x39: 622 /* Backward at Beginning of tape. */ 623 return tape_34xx_erp_failed(request, -EIO); 624 case 0x3a: 625 /* Drive switched to not ready. */ 626 PRINT_WARN("Drive not ready. Turn the ready/not ready switch " 627 "to ready position and try again.\n"); 628 return tape_34xx_erp_failed(request, -EIO); 629 case 0x3b: 630 /* Manual rewind or unload. This causes an I/O error. */ 631 PRINT_WARN("Medium was rewound or unloaded manually.\n"); 632 tape_34xx_delete_sbid_from(device, 0); 633 return tape_34xx_erp_failed(request, -EIO); 634 case 0x42: 635 /* 636 * Degraded mode. A condition that can cause degraded 637 * performance is detected. 638 */ 639 PRINT_WARN("Subsystem is running in degraded mode.\n"); 640 return tape_34xx_erp_retry(request); 641 case 0x43: 642 /* Drive not ready. */ 643 tape_34xx_delete_sbid_from(device, 0); 644 tape_med_state_set(device, MS_UNLOADED); 645 /* Some commands commands are successful even in this case */ 646 if (sense[1] & SENSE_DRIVE_ONLINE) { 647 switch(request->op) { 648 case TO_ASSIGN: 649 case TO_UNASSIGN: 650 case TO_DIS: 651 case TO_NOP: 652 return tape_34xx_done(request); 653 break; 654 default: 655 break; 656 } 657 } 658 PRINT_WARN("The drive is not ready.\n"); 659 return tape_34xx_erp_failed(request, -ENOMEDIUM); 660 case 0x44: 661 /* Locate Block unsuccessful. */ 662 if (request->op != TO_BLOCK && request->op != TO_LBL) 663 /* No locate block was issued. */ 664 return tape_34xx_erp_bug(device, request, 665 irb, sense[3]); 666 return tape_34xx_erp_failed(request, -EIO); 667 case 0x45: 668 /* The drive is assigned to a different channel path. */ 669 PRINT_WARN("The drive is assigned elsewhere.\n"); 670 return tape_34xx_erp_failed(request, -EIO); 671 case 0x46: 672 /* 673 * Drive not on-line. Drive may be switched offline, 674 * the power supply may be switched off or 675 * the drive address may not be set correctly. 676 */ 677 PRINT_WARN("The drive is not on-line."); 678 return tape_34xx_erp_failed(request, -EIO); 679 case 0x47: 680 /* Volume fenced. CU reports volume integrity is lost. */ 681 PRINT_WARN("Volume fenced. The volume integrity is lost.\n"); 682 tape_34xx_delete_sbid_from(device, 0); 683 return tape_34xx_erp_failed(request, -EIO); 684 case 0x48: 685 /* Log sense data and retry request. */ 686 return tape_34xx_erp_retry(request); 687 case 0x49: 688 /* Bus out check. A parity check error on the bus was found. */ 689 PRINT_WARN("Bus out check. A data transfer over the bus " 690 "has been corrupted.\n"); 691 return tape_34xx_erp_failed(request, -EIO); 692 case 0x4a: 693 /* Control unit erp failed. */ 694 PRINT_WARN("The control unit I/O error recovery failed.\n"); 695 return tape_34xx_erp_failed(request, -EIO); 696 case 0x4b: 697 /* 698 * CU and drive incompatible. The drive requests micro-program 699 * patches, which are not available on the CU. 700 */ 701 PRINT_WARN("The drive needs microprogram patches from the " 702 "control unit, which are not available.\n"); 703 return tape_34xx_erp_failed(request, -EIO); 704 case 0x4c: 705 /* 706 * Recovered Check-One failure. Cu develops a hardware error, 707 * but is able to recover. 708 */ 709 return tape_34xx_erp_retry(request); 710 case 0x4d: 711 if (device->cdev->id.driver_info == tape_3490) 712 /* 713 * Resetting event received. Since the driver does 714 * not support resetting event recovery (which has to 715 * be handled by the I/O Layer), retry our command. 716 */ 717 return tape_34xx_erp_retry(request); 718 /* This erpa is reserved for 3480. */ 719 return tape_34xx_erp_bug(device, request, irb, sense[3]); 720 case 0x4e: 721 if (device->cdev->id.driver_info == tape_3490) { 722 /* 723 * Maximum block size exceeded. This indicates, that 724 * the block to be written is larger than allowed for 725 * buffered mode. 726 */ 727 PRINT_WARN("Maximum block size for buffered " 728 "mode exceeded.\n"); 729 return tape_34xx_erp_failed(request, -ENOBUFS); 730 } 731 /* This erpa is reserved for 3480. */ 732 return tape_34xx_erp_bug(device, request, irb, sense[3]); 733 case 0x50: 734 /* 735 * Read buffered log (Overflow). CU is running in extended 736 * buffered log mode, and a counter overflows. This should 737 * never happen, since we're never running in extended 738 * buffered log mode. 739 */ 740 return tape_34xx_erp_retry(request); 741 case 0x51: 742 /* 743 * Read buffered log (EOV). EOF processing occurs while the 744 * CU is in extended buffered log mode. This should never 745 * happen, since we're never running in extended buffered 746 * log mode. 747 */ 748 return tape_34xx_erp_retry(request); 749 case 0x52: 750 /* End of Volume complete. Rewind unload completed ok. */ 751 if (request->op == TO_RUN) { 752 tape_med_state_set(device, MS_UNLOADED); 753 tape_34xx_delete_sbid_from(device, 0); 754 return tape_34xx_erp_succeeded(request); 755 } 756 return tape_34xx_erp_bug(device, request, irb, sense[3]); 757 case 0x53: 758 /* Global command intercept. */ 759 return tape_34xx_erp_retry(request); 760 case 0x54: 761 /* Channel interface recovery (temporary). */ 762 return tape_34xx_erp_retry(request); 763 case 0x55: 764 /* Channel interface recovery (permanent). */ 765 PRINT_WARN("A permanent channel interface error occurred.\n"); 766 return tape_34xx_erp_failed(request, -EIO); 767 case 0x56: 768 /* Channel protocol error. */ 769 PRINT_WARN("A channel protocol error occurred.\n"); 770 return tape_34xx_erp_failed(request, -EIO); 771 case 0x57: 772 if (device->cdev->id.driver_info == tape_3480) { 773 /* Attention intercept. */ 774 PRINT_WARN("An attention intercept occurred, " 775 "which will be recovered.\n"); 776 return tape_34xx_erp_retry(request); 777 } else { 778 /* Global status intercept. */ 779 PRINT_WARN("An global status intercept was received, " 780 "which will be recovered.\n"); 781 return tape_34xx_erp_retry(request); 782 } 783 case 0x5a: 784 /* 785 * Tape length incompatible. The tape inserted is too long, 786 * which could cause damage to the tape or the drive. 787 */ 788 PRINT_WARN("Tape Length Incompatible\n"); 789 PRINT_WARN("Tape length exceeds IBM enhanced capacity " 790 "cartdridge length or a medium\n"); 791 PRINT_WARN("with EC-CST identification mark has been mounted " 792 "in a device that writes\n"); 793 PRINT_WARN("3480 or 3480 XF format.\n"); 794 return tape_34xx_erp_failed(request, -EIO); 795 case 0x5b: 796 /* Format 3480 XF incompatible */ 797 if (sense[1] & SENSE_BEGINNING_OF_TAPE) 798 /* The tape will get overwritten. */ 799 return tape_34xx_erp_retry(request); 800 PRINT_WARN("Format 3480 XF Incompatible\n"); 801 PRINT_WARN("Medium has been created in 3480 format. " 802 "To change the format writes\n"); 803 PRINT_WARN("must be issued at BOT.\n"); 804 return tape_34xx_erp_failed(request, -EIO); 805 case 0x5c: 806 /* Format 3480-2 XF incompatible */ 807 PRINT_WARN("Format 3480-2 XF Incompatible\n"); 808 PRINT_WARN("Device can only read 3480 or 3480 XF format.\n"); 809 return tape_34xx_erp_failed(request, -EIO); 810 case 0x5d: 811 /* Tape length violation. */ 812 PRINT_WARN("Tape Length Violation\n"); 813 PRINT_WARN("The mounted tape exceeds IBM Enhanced Capacity " 814 "Cartdridge System Tape length.\n"); 815 PRINT_WARN("This may cause damage to the drive or tape when " 816 "processing to the EOV\n"); 817 return tape_34xx_erp_failed(request, -EMEDIUMTYPE); 818 case 0x5e: 819 /* Compaction algorithm incompatible. */ 820 PRINT_WARN("Compaction Algorithm Incompatible\n"); 821 PRINT_WARN("The volume is recorded using an incompatible " 822 "compaction algorithm,\n"); 823 PRINT_WARN("which is not supported by the device.\n"); 824 return tape_34xx_erp_failed(request, -EMEDIUMTYPE); 825 826 /* The following erpas should have been covered earlier. */ 827 case 0x23: /* Read data check. */ 828 case 0x25: /* Write data check. */ 829 case 0x26: /* Data check (read opposite). */ 830 case 0x28: /* Write id mark check. */ 831 case 0x31: /* Tape void. */ 832 case 0x40: /* Overrun error. */ 833 case 0x41: /* Record sequence error. */ 834 /* All other erpas are reserved for future use. */ 835 default: 836 return tape_34xx_erp_bug(device, request, irb, sense[3]); 837 } 838 } 839 840 /* 841 * 3480/3490 interrupt handler 842 */ 843 static int 844 tape_34xx_irq(struct tape_device *device, struct tape_request *request, 845 struct irb *irb) 846 { 847 if (request == NULL) 848 return tape_34xx_unsolicited_irq(device, irb); 849 850 if ((irb->scsw.dstat & DEV_STAT_UNIT_EXCEP) && 851 (irb->scsw.dstat & DEV_STAT_DEV_END) && 852 (request->op == TO_WRI)) { 853 /* Write at end of volume */ 854 PRINT_INFO("End of volume\n"); /* XXX */ 855 return tape_34xx_erp_failed(request, -ENOSPC); 856 } 857 858 if (irb->scsw.dstat & DEV_STAT_UNIT_CHECK) 859 return tape_34xx_unit_check(device, request, irb); 860 861 if (irb->scsw.dstat & DEV_STAT_DEV_END) { 862 /* 863 * A unit exception occurs on skipping over a tapemark block. 864 */ 865 if (irb->scsw.dstat & DEV_STAT_UNIT_EXCEP) { 866 if (request->op == TO_BSB || request->op == TO_FSB) 867 request->rescnt++; 868 else 869 DBF_EVENT(5, "Unit Exception!\n"); 870 } 871 return tape_34xx_done(request); 872 } 873 874 DBF_EVENT(6, "xunknownirq\n"); 875 PRINT_ERR("Unexpected interrupt.\n"); 876 PRINT_ERR("Current op is: %s", tape_op_verbose[request->op]); 877 tape_dump_sense(device, request, irb); 878 return TAPE_IO_STOP; 879 } 880 881 /* 882 * ioctl_overload 883 */ 884 static int 885 tape_34xx_ioctl(struct tape_device *device, unsigned int cmd, unsigned long arg) 886 { 887 if (cmd == TAPE390_DISPLAY) { 888 struct display_struct disp; 889 890 if (copy_from_user(&disp, (char __user *) arg, sizeof(disp)) != 0) 891 return -EFAULT; 892 893 return tape_std_display(device, &disp); 894 } else 895 return -EINVAL; 896 } 897 898 static inline void 899 tape_34xx_append_new_sbid(struct tape_34xx_block_id bid, struct list_head *l) 900 { 901 struct tape_34xx_sbid * new_sbid; 902 903 new_sbid = kmalloc(sizeof(*new_sbid), GFP_ATOMIC); 904 if (!new_sbid) 905 return; 906 907 new_sbid->bid = bid; 908 list_add(&new_sbid->list, l); 909 } 910 911 /* 912 * Build up the search block ID list. The block ID consists of a logical 913 * block number and a hardware specific part. The hardware specific part 914 * helps the tape drive to speed up searching for a specific block. 915 */ 916 static void 917 tape_34xx_add_sbid(struct tape_device *device, struct tape_34xx_block_id bid) 918 { 919 struct list_head * sbid_list; 920 struct tape_34xx_sbid * sbid; 921 struct list_head * l; 922 923 /* 924 * immediately return if there is no list at all or the block to add 925 * is located in segment 1 of wrap 0 because this position is used 926 * if no hardware position data is supplied. 927 */ 928 sbid_list = (struct list_head *) device->discdata; 929 if (!sbid_list || (bid.segment < 2 && bid.wrap == 0)) 930 return; 931 932 /* 933 * Search the position where to insert the new entry. Hardware 934 * acceleration uses only the segment and wrap number. So we 935 * need only one entry for a specific wrap/segment combination. 936 * If there is a block with a lower number but the same hard- 937 * ware position data we just update the block number in the 938 * existing entry. 939 */ 940 list_for_each(l, sbid_list) { 941 sbid = list_entry(l, struct tape_34xx_sbid, list); 942 943 if ( 944 (sbid->bid.segment == bid.segment) && 945 (sbid->bid.wrap == bid.wrap) 946 ) { 947 if (bid.block < sbid->bid.block) 948 sbid->bid = bid; 949 else return; 950 break; 951 } 952 953 /* Sort in according to logical block number. */ 954 if (bid.block < sbid->bid.block) { 955 tape_34xx_append_new_sbid(bid, l->prev); 956 break; 957 } 958 } 959 /* List empty or new block bigger than last entry. */ 960 if (l == sbid_list) 961 tape_34xx_append_new_sbid(bid, l->prev); 962 963 DBF_LH(4, "Current list is:\n"); 964 list_for_each(l, sbid_list) { 965 sbid = list_entry(l, struct tape_34xx_sbid, list); 966 DBF_LH(4, "%d:%03d@%05d\n", 967 sbid->bid.wrap, 968 sbid->bid.segment, 969 sbid->bid.block 970 ); 971 } 972 } 973 974 /* 975 * Delete all entries from the search block ID list that belong to tape blocks 976 * equal or higher than the given number. 977 */ 978 static void 979 tape_34xx_delete_sbid_from(struct tape_device *device, int from) 980 { 981 struct list_head * sbid_list; 982 struct tape_34xx_sbid * sbid; 983 struct list_head * l; 984 struct list_head * n; 985 986 sbid_list = (struct list_head *) device->discdata; 987 if (!sbid_list) 988 return; 989 990 list_for_each_safe(l, n, sbid_list) { 991 sbid = list_entry(l, struct tape_34xx_sbid, list); 992 if (sbid->bid.block >= from) { 993 DBF_LH(4, "Delete sbid %d:%03d@%05d\n", 994 sbid->bid.wrap, 995 sbid->bid.segment, 996 sbid->bid.block 997 ); 998 list_del(l); 999 kfree(sbid); 1000 } 1001 } 1002 } 1003 1004 /* 1005 * Merge hardware position data into a block id. 1006 */ 1007 static void 1008 tape_34xx_merge_sbid( 1009 struct tape_device * device, 1010 struct tape_34xx_block_id * bid 1011 ) { 1012 struct tape_34xx_sbid * sbid; 1013 struct tape_34xx_sbid * sbid_to_use; 1014 struct list_head * sbid_list; 1015 struct list_head * l; 1016 1017 sbid_list = (struct list_head *) device->discdata; 1018 bid->wrap = 0; 1019 bid->segment = 1; 1020 1021 if (!sbid_list || list_empty(sbid_list)) 1022 return; 1023 1024 sbid_to_use = NULL; 1025 list_for_each(l, sbid_list) { 1026 sbid = list_entry(l, struct tape_34xx_sbid, list); 1027 1028 if (sbid->bid.block >= bid->block) 1029 break; 1030 sbid_to_use = sbid; 1031 } 1032 if (sbid_to_use) { 1033 bid->wrap = sbid_to_use->bid.wrap; 1034 bid->segment = sbid_to_use->bid.segment; 1035 DBF_LH(4, "Use %d:%03d@%05d for %05d\n", 1036 sbid_to_use->bid.wrap, 1037 sbid_to_use->bid.segment, 1038 sbid_to_use->bid.block, 1039 bid->block 1040 ); 1041 } 1042 } 1043 1044 static int 1045 tape_34xx_setup_device(struct tape_device * device) 1046 { 1047 int rc; 1048 struct list_head * discdata; 1049 1050 DBF_EVENT(6, "34xx device setup\n"); 1051 if ((rc = tape_std_assign(device)) == 0) { 1052 if ((rc = tape_34xx_medium_sense(device)) != 0) { 1053 DBF_LH(3, "34xx medium sense returned %d\n", rc); 1054 } 1055 } 1056 discdata = kmalloc(sizeof(struct list_head), GFP_KERNEL); 1057 if (discdata) { 1058 INIT_LIST_HEAD(discdata); 1059 device->discdata = discdata; 1060 } 1061 1062 return rc; 1063 } 1064 1065 static void 1066 tape_34xx_cleanup_device(struct tape_device *device) 1067 { 1068 tape_std_unassign(device); 1069 1070 if (device->discdata) { 1071 tape_34xx_delete_sbid_from(device, 0); 1072 kfree(device->discdata); 1073 device->discdata = NULL; 1074 } 1075 } 1076 1077 1078 /* 1079 * MTTELL: Tell block. Return the number of block relative to current file. 1080 */ 1081 static int 1082 tape_34xx_mttell(struct tape_device *device, int mt_count) 1083 { 1084 struct { 1085 struct tape_34xx_block_id cbid; 1086 struct tape_34xx_block_id dbid; 1087 } __attribute__ ((packed)) block_id; 1088 int rc; 1089 1090 rc = tape_std_read_block_id(device, (__u64 *) &block_id); 1091 if (rc) 1092 return rc; 1093 1094 tape_34xx_add_sbid(device, block_id.cbid); 1095 return block_id.cbid.block; 1096 } 1097 1098 /* 1099 * MTSEEK: seek to the specified block. 1100 */ 1101 static int 1102 tape_34xx_mtseek(struct tape_device *device, int mt_count) 1103 { 1104 struct tape_request *request; 1105 struct tape_34xx_block_id * bid; 1106 1107 if (mt_count > 0x3fffff) { 1108 DBF_EXCEPTION(6, "xsee parm\n"); 1109 return -EINVAL; 1110 } 1111 request = tape_alloc_request(3, 4); 1112 if (IS_ERR(request)) 1113 return PTR_ERR(request); 1114 1115 /* setup ccws */ 1116 request->op = TO_LBL; 1117 bid = (struct tape_34xx_block_id *) request->cpdata; 1118 bid->format = (*device->modeset_byte & 0x08) ? 1119 TAPE34XX_FMT_3480_XF : TAPE34XX_FMT_3480; 1120 bid->block = mt_count; 1121 tape_34xx_merge_sbid(device, bid); 1122 1123 tape_ccw_cc(request->cpaddr, MODE_SET_DB, 1, device->modeset_byte); 1124 tape_ccw_cc(request->cpaddr + 1, LOCATE, 4, request->cpdata); 1125 tape_ccw_end(request->cpaddr + 2, NOP, 0, NULL); 1126 1127 /* execute it */ 1128 return tape_do_io_free(device, request); 1129 } 1130 1131 #ifdef CONFIG_S390_TAPE_BLOCK 1132 /* 1133 * Tape block read for 34xx. 1134 */ 1135 static struct tape_request * 1136 tape_34xx_bread(struct tape_device *device, struct request *req) 1137 { 1138 struct tape_request *request; 1139 struct ccw1 *ccw; 1140 int count = 0, i; 1141 unsigned off; 1142 char *dst; 1143 struct bio_vec *bv; 1144 struct bio *bio; 1145 struct tape_34xx_block_id * start_block; 1146 1147 DBF_EVENT(6, "xBREDid:"); 1148 1149 /* Count the number of blocks for the request. */ 1150 rq_for_each_bio(bio, req) { 1151 bio_for_each_segment(bv, bio, i) { 1152 count += bv->bv_len >> (TAPEBLOCK_HSEC_S2B + 9); 1153 } 1154 } 1155 1156 /* Allocate the ccw request. */ 1157 request = tape_alloc_request(3+count+1, 8); 1158 if (IS_ERR(request)) 1159 return request; 1160 1161 /* Setup ccws. */ 1162 request->op = TO_BLOCK; 1163 start_block = (struct tape_34xx_block_id *) request->cpdata; 1164 start_block->block = req->sector >> TAPEBLOCK_HSEC_S2B; 1165 DBF_EVENT(6, "start_block = %i\n", start_block->block); 1166 1167 ccw = request->cpaddr; 1168 ccw = tape_ccw_cc(ccw, MODE_SET_DB, 1, device->modeset_byte); 1169 1170 /* 1171 * We always setup a nop after the mode set ccw. This slot is 1172 * used in tape_std_check_locate to insert a locate ccw if the 1173 * current tape position doesn't match the start block to be read. 1174 * The second nop will be filled with a read block id which is in 1175 * turn used by tape_34xx_free_bread to populate the segment bid 1176 * table. 1177 */ 1178 ccw = tape_ccw_cc(ccw, NOP, 0, NULL); 1179 ccw = tape_ccw_cc(ccw, NOP, 0, NULL); 1180 1181 rq_for_each_bio(bio, req) { 1182 bio_for_each_segment(bv, bio, i) { 1183 dst = kmap(bv->bv_page) + bv->bv_offset; 1184 for (off = 0; off < bv->bv_len; 1185 off += TAPEBLOCK_HSEC_SIZE) { 1186 ccw->flags = CCW_FLAG_CC; 1187 ccw->cmd_code = READ_FORWARD; 1188 ccw->count = TAPEBLOCK_HSEC_SIZE; 1189 set_normalized_cda(ccw, (void*) __pa(dst)); 1190 ccw++; 1191 dst += TAPEBLOCK_HSEC_SIZE; 1192 } 1193 } 1194 } 1195 1196 ccw = tape_ccw_end(ccw, NOP, 0, NULL); 1197 DBF_EVENT(6, "xBREDccwg\n"); 1198 return request; 1199 } 1200 1201 static void 1202 tape_34xx_free_bread (struct tape_request *request) 1203 { 1204 struct ccw1* ccw; 1205 1206 ccw = request->cpaddr; 1207 if ((ccw + 2)->cmd_code == READ_BLOCK_ID) { 1208 struct { 1209 struct tape_34xx_block_id cbid; 1210 struct tape_34xx_block_id dbid; 1211 } __attribute__ ((packed)) *rbi_data; 1212 1213 rbi_data = request->cpdata; 1214 1215 if (request->device) 1216 tape_34xx_add_sbid(request->device, rbi_data->cbid); 1217 } 1218 1219 /* Last ccw is a nop and doesn't need clear_normalized_cda */ 1220 for (; ccw->flags & CCW_FLAG_CC; ccw++) 1221 if (ccw->cmd_code == READ_FORWARD) 1222 clear_normalized_cda(ccw); 1223 tape_free_request(request); 1224 } 1225 1226 /* 1227 * check_locate is called just before the tape request is passed to 1228 * the common io layer for execution. It has to check the current 1229 * tape position and insert a locate ccw if it doesn't match the 1230 * start block for the request. 1231 */ 1232 static void 1233 tape_34xx_check_locate(struct tape_device *device, struct tape_request *request) 1234 { 1235 struct tape_34xx_block_id * start_block; 1236 1237 start_block = (struct tape_34xx_block_id *) request->cpdata; 1238 if (start_block->block == device->blk_data.block_position) 1239 return; 1240 1241 DBF_LH(4, "Block seek(%06d+%06d)\n", start_block->block, device->bof); 1242 start_block->wrap = 0; 1243 start_block->segment = 1; 1244 start_block->format = (*device->modeset_byte & 0x08) ? 1245 TAPE34XX_FMT_3480_XF : 1246 TAPE34XX_FMT_3480; 1247 start_block->block = start_block->block + device->bof; 1248 tape_34xx_merge_sbid(device, start_block); 1249 tape_ccw_cc(request->cpaddr + 1, LOCATE, 4, request->cpdata); 1250 tape_ccw_cc(request->cpaddr + 2, READ_BLOCK_ID, 8, request->cpdata); 1251 } 1252 #endif 1253 1254 /* 1255 * List of 3480/3490 magnetic tape commands. 1256 */ 1257 static tape_mtop_fn tape_34xx_mtop[TAPE_NR_MTOPS] = { 1258 [MTRESET] = tape_std_mtreset, 1259 [MTFSF] = tape_std_mtfsf, 1260 [MTBSF] = tape_std_mtbsf, 1261 [MTFSR] = tape_std_mtfsr, 1262 [MTBSR] = tape_std_mtbsr, 1263 [MTWEOF] = tape_std_mtweof, 1264 [MTREW] = tape_std_mtrew, 1265 [MTOFFL] = tape_std_mtoffl, 1266 [MTNOP] = tape_std_mtnop, 1267 [MTRETEN] = tape_std_mtreten, 1268 [MTBSFM] = tape_std_mtbsfm, 1269 [MTFSFM] = tape_std_mtfsfm, 1270 [MTEOM] = tape_std_mteom, 1271 [MTERASE] = tape_std_mterase, 1272 [MTRAS1] = NULL, 1273 [MTRAS2] = NULL, 1274 [MTRAS3] = NULL, 1275 [MTSETBLK] = tape_std_mtsetblk, 1276 [MTSETDENSITY] = NULL, 1277 [MTSEEK] = tape_34xx_mtseek, 1278 [MTTELL] = tape_34xx_mttell, 1279 [MTSETDRVBUFFER] = NULL, 1280 [MTFSS] = NULL, 1281 [MTBSS] = NULL, 1282 [MTWSM] = NULL, 1283 [MTLOCK] = NULL, 1284 [MTUNLOCK] = NULL, 1285 [MTLOAD] = tape_std_mtload, 1286 [MTUNLOAD] = tape_std_mtunload, 1287 [MTCOMPRESSION] = tape_std_mtcompression, 1288 [MTSETPART] = NULL, 1289 [MTMKPART] = NULL 1290 }; 1291 1292 /* 1293 * Tape discipline structure for 3480 and 3490. 1294 */ 1295 static struct tape_discipline tape_discipline_34xx = { 1296 .owner = THIS_MODULE, 1297 .setup_device = tape_34xx_setup_device, 1298 .cleanup_device = tape_34xx_cleanup_device, 1299 .process_eov = tape_std_process_eov, 1300 .irq = tape_34xx_irq, 1301 .read_block = tape_std_read_block, 1302 .write_block = tape_std_write_block, 1303 #ifdef CONFIG_S390_TAPE_BLOCK 1304 .bread = tape_34xx_bread, 1305 .free_bread = tape_34xx_free_bread, 1306 .check_locate = tape_34xx_check_locate, 1307 #endif 1308 .ioctl_fn = tape_34xx_ioctl, 1309 .mtop_array = tape_34xx_mtop 1310 }; 1311 1312 static struct ccw_device_id tape_34xx_ids[] = { 1313 { CCW_DEVICE_DEVTYPE(0x3480, 0, 0x3480, 0), driver_info: tape_3480}, 1314 { CCW_DEVICE_DEVTYPE(0x3490, 0, 0x3490, 0), driver_info: tape_3490}, 1315 { /* end of list */ } 1316 }; 1317 1318 static int 1319 tape_34xx_online(struct ccw_device *cdev) 1320 { 1321 return tape_generic_online( 1322 cdev->dev.driver_data, 1323 &tape_discipline_34xx 1324 ); 1325 } 1326 1327 static int 1328 tape_34xx_offline(struct ccw_device *cdev) 1329 { 1330 return tape_generic_offline(cdev->dev.driver_data); 1331 } 1332 1333 static struct ccw_driver tape_34xx_driver = { 1334 .name = "tape_34xx", 1335 .owner = THIS_MODULE, 1336 .ids = tape_34xx_ids, 1337 .probe = tape_generic_probe, 1338 .remove = tape_generic_remove, 1339 .set_online = tape_34xx_online, 1340 .set_offline = tape_34xx_offline, 1341 }; 1342 1343 static int 1344 tape_34xx_init (void) 1345 { 1346 int rc; 1347 1348 TAPE_DBF_AREA = debug_register ( "tape_34xx", 2, 2, 4*sizeof(long)); 1349 debug_register_view(TAPE_DBF_AREA, &debug_sprintf_view); 1350 #ifdef DBF_LIKE_HELL 1351 debug_set_level(TAPE_DBF_AREA, 6); 1352 #endif 1353 1354 DBF_EVENT(3, "34xx init\n"); 1355 /* Register driver for 3480/3490 tapes. */ 1356 rc = ccw_driver_register(&tape_34xx_driver); 1357 if (rc) 1358 DBF_EVENT(3, "34xx init failed\n"); 1359 else 1360 DBF_EVENT(3, "34xx registered\n"); 1361 return rc; 1362 } 1363 1364 static void 1365 tape_34xx_exit(void) 1366 { 1367 ccw_driver_unregister(&tape_34xx_driver); 1368 1369 debug_unregister(TAPE_DBF_AREA); 1370 } 1371 1372 MODULE_DEVICE_TABLE(ccw, tape_34xx_ids); 1373 MODULE_AUTHOR("(C) 2001-2002 IBM Deutschland Entwicklung GmbH"); 1374 MODULE_DESCRIPTION("Linux on zSeries channel attached 3480 tape device driver"); 1375 MODULE_LICENSE("GPL"); 1376 1377 module_init(tape_34xx_init); 1378 module_exit(tape_34xx_exit); 1379