]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
s390/tape: Remove 3590 Read Opposite error recovery
authorJan Höppner <hoeppner@linux.ibm.com>
Thu, 16 Oct 2025 07:47:13 +0000 (09:47 +0200)
committerHeiko Carstens <hca@linux.ibm.com>
Tue, 21 Oct 2025 08:25:54 +0000 (10:25 +0200)
On old native type 3590 tape devices a Read Opposite error recovery
procedure on Error Recovery Action Code (ERA) 26 was issued if a Read
Forward command failed. This recovery procedure was implemented with the
Read Backward command. This is no longer supported.

Remove 3590 ERA 26 and Read Backward related recovery code.

Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
Reviewed-by: Jens Remus <jremus@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
drivers/s390/char/tape_3590.c

index 2a2931d303cb945e8789a47b7616daf15e758875..5b25f5415e4cde3ad15f68d0a3314aca3dbdd883 100644 (file)
@@ -550,31 +550,6 @@ tape_3590_mtseek(struct tape_device *device, int count)
        return tape_do_io_free(device, request);
 }
 
-/*
- * Read Opposite Error Recovery Function:
- * Used, when Read Forward does not work
- */
-static void
-tape_3590_read_opposite(struct tape_device *device,
-                       struct tape_request *request)
-{
-       struct tape_3590_disc_data *data;
-
-       /*
-        * We have allocated 4 ccws in tape_std_read, so we can now
-        * transform the request to a read backward, followed by a
-        * forward space block.
-        */
-       request->op = TO_RBA;
-       tape_ccw_cc(request->cpaddr, MODE_SET_DB, 1, device->modeset_byte);
-       data = device->discdata;
-       tape_ccw_cc_idal(request->cpaddr + 1, data->read_back_op,
-                        device->char_data.idal_buf);
-       tape_ccw_cc(request->cpaddr + 2, FORSPACEBLOCK, 0, NULL);
-       tape_ccw_end(request->cpaddr + 3, NOP, 0, NULL);
-       DBF_EVENT(6, "xrop ccwg\n");
-}
-
 /*
  * Read Attention Msg
  * This should be done after an interrupt with attention bit (0x80)
@@ -896,60 +871,6 @@ tape_3590_erp_special_interrupt(struct tape_device *device,
        return tape_3590_erp_basic(device, request, irb, -EIO);
 }
 
-/*
- *  RDA: Read Alternate
- */
-static int
-tape_3590_erp_read_alternate(struct tape_device *device,
-                            struct tape_request *request, struct irb *irb)
-{
-       struct tape_3590_disc_data *data;
-
-       /*
-        * The issued Read Backward or Read Previous command is not
-        * supported by the device
-        * The recovery action should be to issue another command:
-        * Read Revious: if Read Backward is not supported
-        * Read Backward: if Read Previous is not supported
-        */
-       data = device->discdata;
-       if (data->read_back_op == READ_PREVIOUS) {
-               DBF_EVENT(2, "(%08x): No support for READ_PREVIOUS command\n",
-                         device->cdev_id);
-               data->read_back_op = READ_BACKWARD;
-       } else {
-               DBF_EVENT(2, "(%08x): No support for READ_BACKWARD command\n",
-                         device->cdev_id);
-               data->read_back_op = READ_PREVIOUS;
-       }
-       tape_3590_read_opposite(device, request);
-       return tape_3590_erp_retry(device, request, irb);
-}
-
-/*
- * Error Recovery read opposite
- */
-static int
-tape_3590_erp_read_opposite(struct tape_device *device,
-                           struct tape_request *request, struct irb *irb)
-{
-       switch (request->op) {
-       case TO_RFO:
-               /*
-                * We did read forward, but the data could not be read.
-                * We will read backward and then skip forward again.
-                */
-               tape_3590_read_opposite(device, request);
-               return tape_3590_erp_retry(device, request, irb);
-       case TO_RBA:
-               /* We tried to read forward and backward, but hat no success */
-               return tape_3590_erp_failed(device, request, irb, -EIO);
-               break;
-       default:
-               return tape_3590_erp_failed(device, request, irb, -EIO);
-       }
-}
-
 /*
  * Print an MIM (Media Information  Message) (message code f0)
  */
@@ -1348,10 +1269,6 @@ tape_3590_unit_check(struct tape_device *device, struct tape_request *request,
                tape_3590_print_era_msg(device, irb);
                return tape_3590_erp_read_buf_log(device, request, irb);
 
-       case 0x2011:
-               tape_3590_print_era_msg(device, irb);
-               return tape_3590_erp_read_alternate(device, request, irb);
-
        case 0x2230:
        case 0x2231:
                tape_3590_print_era_msg(device, irb);
@@ -1405,12 +1322,6 @@ tape_3590_unit_check(struct tape_device *device, struct tape_request *request,
                        tape_3590_print_era_msg(device, irb);
                        return tape_3590_erp_swap(device, request, irb);
                }
-               if (sense->rac == 0x26) {
-                       /* Read Opposite */
-                       tape_3590_print_era_msg(device, irb);
-                       return tape_3590_erp_read_opposite(device, request,
-                                                          irb);
-               }
                return tape_3590_erp_basic(device, request, irb, -EIO);
        case 0x5020:
        case 0x5021: