diff options
Diffstat (limited to 'drivers/s390/char/tape_3590.c')
-rw-r--r-- | drivers/s390/char/tape_3590.c | 105 |
1 files changed, 0 insertions, 105 deletions
diff --git a/drivers/s390/char/tape_3590.c b/drivers/s390/char/tape_3590.c index 49c6aab7ad78..a5c6614b0db2 100644 --- a/drivers/s390/char/tape_3590.c +++ b/drivers/s390/char/tape_3590.c | |||
@@ -670,92 +670,6 @@ tape_3590_schedule_work(struct tape_device *device, enum tape_op op) | |||
670 | return 0; | 670 | return 0; |
671 | } | 671 | } |
672 | 672 | ||
673 | #ifdef CONFIG_S390_TAPE_BLOCK | ||
674 | /* | ||
675 | * Tape Block READ | ||
676 | */ | ||
677 | static struct tape_request * | ||
678 | tape_3590_bread(struct tape_device *device, struct request *req) | ||
679 | { | ||
680 | struct tape_request *request; | ||
681 | struct ccw1 *ccw; | ||
682 | int count = 0, start_block; | ||
683 | unsigned off; | ||
684 | char *dst; | ||
685 | struct bio_vec *bv; | ||
686 | struct req_iterator iter; | ||
687 | |||
688 | DBF_EVENT(6, "xBREDid:"); | ||
689 | start_block = blk_rq_pos(req) >> TAPEBLOCK_HSEC_S2B; | ||
690 | DBF_EVENT(6, "start_block = %i\n", start_block); | ||
691 | |||
692 | rq_for_each_segment(bv, req, iter) | ||
693 | count += bv->bv_len >> (TAPEBLOCK_HSEC_S2B + 9); | ||
694 | |||
695 | request = tape_alloc_request(2 + count + 1, 4); | ||
696 | if (IS_ERR(request)) | ||
697 | return request; | ||
698 | request->op = TO_BLOCK; | ||
699 | *(__u32 *) request->cpdata = start_block; | ||
700 | ccw = request->cpaddr; | ||
701 | ccw = tape_ccw_cc(ccw, MODE_SET_DB, 1, device->modeset_byte); | ||
702 | |||
703 | /* | ||
704 | * We always setup a nop after the mode set ccw. This slot is | ||
705 | * used in tape_std_check_locate to insert a locate ccw if the | ||
706 | * current tape position doesn't match the start block to be read. | ||
707 | */ | ||
708 | ccw = tape_ccw_cc(ccw, NOP, 0, NULL); | ||
709 | |||
710 | rq_for_each_segment(bv, req, iter) { | ||
711 | dst = page_address(bv->bv_page) + bv->bv_offset; | ||
712 | for (off = 0; off < bv->bv_len; off += TAPEBLOCK_HSEC_SIZE) { | ||
713 | ccw->flags = CCW_FLAG_CC; | ||
714 | ccw->cmd_code = READ_FORWARD; | ||
715 | ccw->count = TAPEBLOCK_HSEC_SIZE; | ||
716 | set_normalized_cda(ccw, (void *) __pa(dst)); | ||
717 | ccw++; | ||
718 | dst += TAPEBLOCK_HSEC_SIZE; | ||
719 | } | ||
720 | BUG_ON(off > bv->bv_len); | ||
721 | } | ||
722 | ccw = tape_ccw_end(ccw, NOP, 0, NULL); | ||
723 | DBF_EVENT(6, "xBREDccwg\n"); | ||
724 | return request; | ||
725 | } | ||
726 | |||
727 | static void | ||
728 | tape_3590_free_bread(struct tape_request *request) | ||
729 | { | ||
730 | struct ccw1 *ccw; | ||
731 | |||
732 | /* Last ccw is a nop and doesn't need clear_normalized_cda */ | ||
733 | for (ccw = request->cpaddr; ccw->flags & CCW_FLAG_CC; ccw++) | ||
734 | if (ccw->cmd_code == READ_FORWARD) | ||
735 | clear_normalized_cda(ccw); | ||
736 | tape_free_request(request); | ||
737 | } | ||
738 | |||
739 | /* | ||
740 | * check_locate is called just before the tape request is passed to | ||
741 | * the common io layer for execution. It has to check the current | ||
742 | * tape position and insert a locate ccw if it doesn't match the | ||
743 | * start block for the request. | ||
744 | */ | ||
745 | static void | ||
746 | tape_3590_check_locate(struct tape_device *device, struct tape_request *request) | ||
747 | { | ||
748 | __u32 *start_block; | ||
749 | |||
750 | start_block = (__u32 *) request->cpdata; | ||
751 | if (*start_block != device->blk_data.block_position) { | ||
752 | /* Add the start offset of the file to get the real block. */ | ||
753 | *start_block += device->bof; | ||
754 | tape_ccw_cc(request->cpaddr + 1, LOCATE, 4, request->cpdata); | ||
755 | } | ||
756 | } | ||
757 | #endif | ||
758 | |||
759 | static void tape_3590_med_state_set(struct tape_device *device, | 673 | static void tape_3590_med_state_set(struct tape_device *device, |
760 | struct tape_3590_med_sense *sense) | 674 | struct tape_3590_med_sense *sense) |
761 | { | 675 | { |
@@ -1423,20 +1337,6 @@ tape_3590_unit_check(struct tape_device *device, struct tape_request *request, | |||
1423 | { | 1337 | { |
1424 | struct tape_3590_sense *sense; | 1338 | struct tape_3590_sense *sense; |
1425 | 1339 | ||
1426 | #ifdef CONFIG_S390_TAPE_BLOCK | ||
1427 | if (request->op == TO_BLOCK) { | ||
1428 | /* | ||
1429 | * Recovery for block device requests. Set the block_position | ||
1430 | * to something invalid and retry. | ||
1431 | */ | ||
1432 | device->blk_data.block_position = -1; | ||
1433 | if (request->retries-- <= 0) | ||
1434 | return tape_3590_erp_failed(device, request, irb, -EIO); | ||
1435 | else | ||
1436 | return tape_3590_erp_retry(device, request, irb); | ||
1437 | } | ||
1438 | #endif | ||
1439 | |||
1440 | sense = (struct tape_3590_sense *) irb->ecw; | 1340 | sense = (struct tape_3590_sense *) irb->ecw; |
1441 | 1341 | ||
1442 | DBF_EVENT(6, "Unit Check: RQC = %x\n", sense->rc_rqc); | 1342 | DBF_EVENT(6, "Unit Check: RQC = %x\n", sense->rc_rqc); |
@@ -1729,11 +1629,6 @@ static struct tape_discipline tape_discipline_3590 = { | |||
1729 | .irq = tape_3590_irq, | 1629 | .irq = tape_3590_irq, |
1730 | .read_block = tape_std_read_block, | 1630 | .read_block = tape_std_read_block, |
1731 | .write_block = tape_std_write_block, | 1631 | .write_block = tape_std_write_block, |
1732 | #ifdef CONFIG_S390_TAPE_BLOCK | ||
1733 | .bread = tape_3590_bread, | ||
1734 | .free_bread = tape_3590_free_bread, | ||
1735 | .check_locate = tape_3590_check_locate, | ||
1736 | #endif | ||
1737 | .ioctl_fn = tape_3590_ioctl, | 1632 | .ioctl_fn = tape_3590_ioctl, |
1738 | .mtop_array = tape_3590_mtop | 1633 | .mtop_array = tape_3590_mtop |
1739 | }; | 1634 | }; |