Lines Matching +full:message +full:- +full:handling +full:- +full:unit

1 // SPDX-License-Identifier: GPL-2.0
38 * - Read Opposite: implemented
39 * - Read Device (buffered) log: BRA
40 * - Read Library log: BRA
41 * - Swap Devices: BRA
42 * - Long Busy: implemented
43 * - Special Intercept: BRA
44 * - Read Alternate: implemented
58 [0x25] = "Read-Only Format",
95 [0xa8] = "Vision System non-operational",
120 if (in->type == TAPE390_KEKL_TYPE_HASH) in ext_to_int_kekl()
121 out->flags |= 0x40; in ext_to_int_kekl()
122 if (in->type_on_tape == TAPE390_KEKL_TYPE_HASH) in ext_to_int_kekl()
123 out->flags |= 0x80; in ext_to_int_kekl()
124 len = min(sizeof(out->label), strlen(in->label)); in ext_to_int_kekl()
125 memcpy(out->label, in->label, len); in ext_to_int_kekl()
126 memset(out->label + len, ' ', sizeof(out->label) - len); in ext_to_int_kekl()
127 ASCEBC(out->label, sizeof(out->label)); in ext_to_int_kekl()
134 if(in->flags & 0x40) in int_to_ext_kekl()
135 out->type = TAPE390_KEKL_TYPE_HASH; in int_to_ext_kekl()
137 out->type = TAPE390_KEKL_TYPE_LABEL; in int_to_ext_kekl()
138 if(in->flags & 0x80) in int_to_ext_kekl()
139 out->type_on_tape = TAPE390_KEKL_TYPE_HASH; in int_to_ext_kekl()
141 out->type_on_tape = TAPE390_KEKL_TYPE_LABEL; in int_to_ext_kekl()
142 memcpy(out->label, in->label, sizeof(in->label)); in int_to_ext_kekl()
143 EBCASC(out->label, sizeof(in->label)); in int_to_ext_kekl()
144 strim(out->label); in int_to_ext_kekl()
150 if (in->count == 0) { in int_to_ext_kekl_pair()
151 out->kekl[0].type = TAPE390_KEKL_TYPE_NONE; in int_to_ext_kekl_pair()
152 out->kekl[0].type_on_tape = TAPE390_KEKL_TYPE_NONE; in int_to_ext_kekl_pair()
153 out->kekl[1].type = TAPE390_KEKL_TYPE_NONE; in int_to_ext_kekl_pair()
154 out->kekl[1].type_on_tape = TAPE390_KEKL_TYPE_NONE; in int_to_ext_kekl_pair()
155 } else if (in->count == 1) { in int_to_ext_kekl_pair()
156 int_to_ext_kekl(&in->kekl[0], &out->kekl[0]); in int_to_ext_kekl_pair()
157 out->kekl[1].type = TAPE390_KEKL_TYPE_NONE; in int_to_ext_kekl_pair()
158 out->kekl[1].type_on_tape = TAPE390_KEKL_TYPE_NONE; in int_to_ext_kekl_pair()
159 } else if (in->count == 2) { in int_to_ext_kekl_pair()
160 int_to_ext_kekl(&in->kekl[0], &out->kekl[0]); in int_to_ext_kekl_pair()
161 int_to_ext_kekl(&in->kekl[1], &out->kekl[1]); in int_to_ext_kekl_pair()
163 printk("Invalid KEKL number: %d\n", in->count); in int_to_ext_kekl_pair()
170 if (kekl->type == TAPE390_KEKL_TYPE_NONE) in check_ext_kekl()
172 if (kekl->type > TAPE390_KEKL_TYPE_HASH) in check_ext_kekl()
174 if (kekl->type_on_tape == TAPE390_KEKL_TYPE_NONE) in check_ext_kekl()
176 if (kekl->type_on_tape > TAPE390_KEKL_TYPE_HASH) in check_ext_kekl()
178 if ((kekl->type == TAPE390_KEKL_TYPE_HASH) && in check_ext_kekl()
179 (kekl->type_on_tape == TAPE390_KEKL_TYPE_LABEL)) in check_ext_kekl()
184 return -EINVAL; in check_ext_kekl()
189 if (check_ext_kekl(&kekls->kekl[0])) in check_ext_kekl_pair()
191 if (check_ext_kekl(&kekls->kekl[1])) in check_ext_kekl_pair()
196 return -EINVAL; in check_ext_kekl_pair()
213 return -ENOMEM; in tape_3592_kekl_query()
219 order = request->cpdata; in tape_3592_kekl_query()
221 order->code = 0xe2; in tape_3592_kekl_query()
222 order->max_count = 2; in tape_3592_kekl_query()
223 request->op = TO_KEKL_QUERY; in tape_3592_kekl_query()
224 tape_ccw_cc(request->cpaddr, PERF_SUBSYS_FUNC, sizeof(*order), order); in tape_3592_kekl_query()
225 tape_ccw_end(request->cpaddr + 1, READ_SS_DATA, sizeof(*int_kekls), in tape_3592_kekl_query()
230 int_to_ext_kekl_pair(&int_kekls->kekls, ext_kekls); in tape_3592_kekl_query()
251 return -ENOSYS; in tape_3592_ioctl_kekl_query()
253 return -EUNATCH; in tape_3592_ioctl_kekl_query()
256 return -ENOMEM; in tape_3592_ioctl_kekl_query()
261 rc = -EFAULT; in tape_3592_ioctl_kekl_query()
284 return -EINVAL; in tape_3592_kekl_set()
287 return -EBADSLT; in tape_3592_kekl_set()
291 order = request->cpdata; in tape_3592_kekl_set()
293 order->code = 0xe3; in tape_3592_kekl_set()
294 order->kekls.count = 2; in tape_3592_kekl_set()
295 ext_to_int_kekl(&ext_kekls->kekl[0], &order->kekls.kekl[0]); in tape_3592_kekl_set()
296 ext_to_int_kekl(&ext_kekls->kekl[1], &order->kekls.kekl[1]); in tape_3592_kekl_set()
297 request->op = TO_KEKL_SET; in tape_3592_kekl_set()
298 tape_ccw_end(request->cpaddr, PERF_SUBSYS_FUNC, sizeof(*order), order); in tape_3592_kekl_set()
314 return -ENOSYS; in tape_3592_ioctl_kekl_set()
316 return -EUNATCH; in tape_3592_ioctl_kekl_set()
335 return ERR_PTR(-ENOSYS); in __tape_3592_enable_crypt()
339 data = request->cpdata; in __tape_3592_enable_crypt()
350 request->op = TO_CRYPT_ON; in __tape_3592_enable_crypt()
351 tape_ccw_cc(request->cpaddr, MODE_SET_CB, 36, data); in __tape_3592_enable_crypt()
352 tape_ccw_end(request->cpaddr + 1, MODE_SET_CB, 36, data + 36); in __tape_3592_enable_crypt()
385 return ERR_PTR(-ENOSYS); in __tape_3592_disable_crypt()
389 data = request->cpdata; in __tape_3592_disable_crypt()
397 request->op = TO_CRYPT_OFF; in __tape_3592_disable_crypt()
398 tape_ccw_cc(request->cpaddr, MODE_SET_CB, 36, data); in __tape_3592_disable_crypt()
399 tape_ccw_end(request->cpaddr + 1, MODE_SET_CB, 36, data + 36); in __tape_3592_disable_crypt()
433 return -ENOSYS; in tape_3592_ioctl_crypt_set()
435 return -EFAULT; in tape_3592_ioctl_crypt_set()
437 return -EINVAL; in tape_3592_ioctl_crypt_set()
454 return -ENOSYS; in tape_3592_ioctl_crypt_query()
458 return -EFAULT; in tape_3592_ioctl_crypt_query()
474 return -EFAULT; in tape_3590_ioctl()
487 return -EINVAL; /* no additional ioctls */ in tape_3590_ioctl()
501 request->op = TO_MSEN; in tape_3590_sense_medium()
502 tape_ccw_end(request->cpaddr, MEDIUM_SENSE, 128, request->cpdata); in tape_3590_sense_medium()
513 request->op = TO_MSEN; in tape_3590_sense_medium_async()
514 tape_ccw_end(request->cpaddr, MEDIUM_SENSE, 128, request->cpdata); in tape_3590_sense_medium_async()
545 request->op = TO_LBL; in tape_3590_mtseek()
546 tape_ccw_cc(request->cpaddr, MODE_SET_DB, 1, device->modeset_byte); in tape_3590_mtseek()
547 *(__u32 *) request->cpdata = count; in tape_3590_mtseek()
548 tape_ccw_cc(request->cpaddr + 1, LOCATE, 4, request->cpdata); in tape_3590_mtseek()
549 tape_ccw_end(request->cpaddr + 2, NOP, 0, NULL); in tape_3590_mtseek()
568 request->op = TO_RBA; in tape_3590_read_opposite()
569 tape_ccw_cc(request->cpaddr, MODE_SET_DB, 1, device->modeset_byte); in tape_3590_read_opposite()
570 data = device->discdata; in tape_3590_read_opposite()
571 tape_ccw_cc_idal(request->cpaddr + 1, data->read_back_op, in tape_3590_read_opposite()
572 device->char_data.idal_buf); in tape_3590_read_opposite()
573 tape_ccw_cc(request->cpaddr + 2, FORSPACEBLOCK, 0, NULL); in tape_3590_read_opposite()
574 tape_ccw_end(request->cpaddr + 3, NOP, 0, NULL); in tape_3590_read_opposite()
583 * After a "read attention message" request there are two possible
586 * 1. A unit check is presented, when attention sense is present (e.g. when
588 * together with the unit check. The recovery action is either "retry"
589 * (in case there is an attention message pending) or "permanent error".
602 request->op = TO_READ_ATTMSG; in tape_3590_read_attmsg_async()
603 buf = request->cpdata; in tape_3590_read_attmsg_async()
606 tape_ccw_cc(request->cpaddr, PERFORM_SS_FUNC, 12, buf); in tape_3590_read_attmsg_async()
607 tape_ccw_cc(request->cpaddr + 1, READ_SS_DATA, 4096 - 12, buf + 12); in tape_3590_read_attmsg_async()
608 tape_ccw_end(request->cpaddr + 2, NOP, 0, NULL); in tape_3590_read_attmsg_async()
613 * These functions are used to schedule follow-up actions from within an
631 switch (p->op) { in tape_3590_work_handler()
633 tape_3590_sense_medium_async(p->device); in tape_3590_work_handler()
636 tape_3590_read_attmsg_async(p->device); in tape_3590_work_handler()
639 tape_3592_enable_crypt_async(p->device); in tape_3590_work_handler()
642 tape_3592_disable_crypt_async(p->device); in tape_3590_work_handler()
646 "operation 0x%02x\n", p->op); in tape_3590_work_handler()
648 tape_put_device(p->device); in tape_3590_work_handler()
658 return -ENOMEM; in tape_3590_schedule_work()
660 INIT_WORK(&p->work, tape_3590_work_handler); in tape_3590_schedule_work()
662 p->device = tape_get_device(device); in tape_3590_schedule_work()
663 p->op = op; in tape_3590_schedule_work()
665 queue_work(tape_3590_wq, &p->work); in tape_3590_schedule_work()
676 DBF_EVENT(6, "medium state: %x:%x\n", sense->macst, sense->masst); in tape_3590_med_state_set()
677 switch (sense->macst) { in tape_3590_med_state_set()
692 c_info->medium_status |= TAPE390_MEDIUM_LOADED_MASK; in tape_3590_med_state_set()
693 if (sense->flags & MSENSE_CRYPT_MASK) { in tape_3590_med_state_set()
694 DBF_EVENT(6, "Medium is encrypted (%04x)\n", sense->flags); in tape_3590_med_state_set()
695 c_info->medium_status |= TAPE390_MEDIUM_ENCRYPTED_MASK; in tape_3590_med_state_set()
697 DBF_EVENT(6, "Medium is not encrypted %04x\n", sense->flags); in tape_3590_med_state_set()
698 c_info->medium_status &= ~TAPE390_MEDIUM_ENCRYPTED_MASK; in tape_3590_med_state_set()
710 DBF_EVENT(6, "%s done\n", tape_op_verbose[request->op]); in tape_3590_done()
712 switch (request->op) { in tape_3590_done()
733 tape_3590_med_state_set(device, request->cpdata); in tape_3590_done()
738 *(device->modeset_byte) |= 0x03; in tape_3590_done()
743 *(device->modeset_byte) &= ~0x03; in tape_3590_done()
768 tape_op_verbose[request->op]); in tape_3590_erp_succeeded()
780 tape_op_verbose[request->op]); in tape_3590_erp_failed()
792 DBF_EVENT(2, "Retry: %s\n", tape_op_verbose[request->op]); in tape_3590_erp_retry()
803 if (irb->scsw.cmd.dstat == DEV_STAT_CHN_END) in tape_3590_unsolicited_irq()
806 else if (irb->scsw.cmd.dstat == 0x85) in tape_3590_unsolicited_irq()
808 DBF_EVENT(3, "unsol.irq! tape ready: %08x\n", device->cdev_id); in tape_3590_unsolicited_irq()
809 else if (irb->scsw.cmd.dstat & DEV_STAT_ATTENTION) { in tape_3590_unsolicited_irq()
812 DBF_EVENT(3, "unsol.irq! dev end: %08x\n", device->cdev_id); in tape_3590_unsolicited_irq()
829 sense = (struct tape_3590_sense *) irb->ecw; in tape_3590_erp_basic()
831 switch (sense->bra) { in tape_3590_erp_basic()
857 return tape_3590_erp_basic(device, request, irb, -EIO); in tape_3590_erp_read_buf_log()
873 dev_warn (&device->cdev->dev, "The tape medium must be loaded into a " in tape_3590_erp_swap()
874 "different tape unit\n"); in tape_3590_erp_swap()
875 return tape_3590_erp_basic(device, request, irb, -EIO); in tape_3590_erp_swap()
896 return tape_3590_erp_basic(device, request, irb, -EIO); in tape_3590_erp_special_interrupt()
915 data = device->discdata; in tape_3590_erp_read_alternate()
916 if (data->read_back_op == READ_PREVIOUS) { in tape_3590_erp_read_alternate()
918 device->cdev_id); in tape_3590_erp_read_alternate()
919 data->read_back_op = READ_BACKWARD; in tape_3590_erp_read_alternate()
922 device->cdev_id); in tape_3590_erp_read_alternate()
923 data->read_back_op = READ_PREVIOUS; in tape_3590_erp_read_alternate()
936 switch (request->op) { in tape_3590_erp_read_opposite()
946 return tape_3590_erp_failed(device, request, irb, -EIO); in tape_3590_erp_read_opposite()
949 return tape_3590_erp_failed(device, request, irb, -EIO); in tape_3590_erp_read_opposite()
954 * Print an MIM (Media Information Message) (message code f0)
968 sense = (struct tape_3590_sense *) irb->ecw; in tape_3590_print_mim_msg_f0()
969 /* Exception Message */ in tape_3590_print_mim_msg_f0()
970 switch (sense->fmt.f70.emc) { in tape_3590_print_mim_msg_f0()
976 sense->fmt.f70.mp); in tape_3590_print_mim_msg_f0()
983 sense->fmt.f70.mp); in tape_3590_print_mim_msg_f0()
990 sense->fmt.f70.md); in tape_3590_print_mim_msg_f0()
994 sense->fmt.f70.emc); in tape_3590_print_mim_msg_f0()
997 /* Service Message */ in tape_3590_print_mim_msg_f0()
998 switch (sense->fmt.f70.smc) { in tape_3590_print_mim_msg_f0()
1001 "procedure %i", sense->fmt.f70.md); in tape_3590_print_mim_msg_f0()
1005 sense->fmt.f70.smc); in tape_3590_print_mim_msg_f0()
1009 dev_warn (&device->cdev->dev, "Tape media information: exception %s, " in tape_3590_print_mim_msg_f0()
1018 * Print an I/O Subsystem Service Information Message (message code f1)
1032 sense = (struct tape_3590_sense *) irb->ecw; in tape_3590_print_io_sim_msg_f1()
1033 /* Exception Message */ in tape_3590_print_io_sim_msg_f1()
1034 switch (sense->fmt.f71.emc) { in tape_3590_print_io_sim_msg_f1()
1039 snprintf(exception, BUFSIZE, "CU Exception - no performance " in tape_3590_print_io_sim_msg_f1()
1044 "interface 0x%02x", sense->fmt.f71.md[0]); in tape_3590_print_io_sim_msg_f1()
1048 "0x%02x", sense->fmt.f71.md[0]); in tape_3590_print_io_sim_msg_f1()
1052 "0x%02x", sense->fmt.f71.md[0]); in tape_3590_print_io_sim_msg_f1()
1056 sense->fmt.f71.md[0]); in tape_3590_print_io_sim_msg_f1()
1060 "0x%02x", sense->fmt.f71.md[0]); in tape_3590_print_io_sim_msg_f1()
1064 sense->fmt.f71.emc); in tape_3590_print_io_sim_msg_f1()
1066 /* Service Message */ in tape_3590_print_io_sim_msg_f1()
1067 switch (sense->fmt.f71.smc) { in tape_3590_print_io_sim_msg_f1()
1076 if (sense->fmt.f71.mdf == 0) in tape_3590_print_io_sim_msg_f1()
1078 "0x%x on CU", sense->fmt.f71.md[1]); in tape_3590_print_io_sim_msg_f1()
1081 "nodes (0x%x-0x%x) on CU", sense->fmt.f71.md[1], in tape_3590_print_io_sim_msg_f1()
1082 sense->fmt.f71.md[2]); in tape_3590_print_io_sim_msg_f1()
1085 if (sense->fmt.f71.mdf == 0) in tape_3590_print_io_sim_msg_f1()
1088 sense->fmt.f71.md[1]); in tape_3590_print_io_sim_msg_f1()
1091 " paths (0x%x-0x%x) on CU", in tape_3590_print_io_sim_msg_f1()
1092 sense->fmt.f71.md[1], sense->fmt.f71.md[2]); in tape_3590_print_io_sim_msg_f1()
1095 if (sense->fmt.f71.mdf == 0) in tape_3590_print_io_sim_msg_f1()
1097 " path 0x%x on CU", sense->fmt.f71.md[1]); in tape_3590_print_io_sim_msg_f1()
1100 " paths (0x%x-0x%x) on CU", in tape_3590_print_io_sim_msg_f1()
1101 sense->fmt.f71.md[1], sense->fmt.f71.md[2]); in tape_3590_print_io_sim_msg_f1()
1104 if (sense->fmt.f71.mdf == 0) in tape_3590_print_io_sim_msg_f1()
1107 sense->fmt.f71.md[1]); in tape_3590_print_io_sim_msg_f1()
1110 "library paths (0x%x-0x%x) on CU", in tape_3590_print_io_sim_msg_f1()
1111 sense->fmt.f71.md[1], sense->fmt.f71.md[2]); in tape_3590_print_io_sim_msg_f1()
1118 sense->fmt.f71.smc); in tape_3590_print_io_sim_msg_f1()
1121 dev_warn (&device->cdev->dev, "I/O subsystem information: exception" in tape_3590_print_io_sim_msg_f1()
1129 * Print an Device Subsystem Service Information Message (message code f2)
1143 sense = (struct tape_3590_sense *) irb->ecw; in tape_3590_print_dev_sim_msg_f2()
1144 /* Exception Message */ in tape_3590_print_dev_sim_msg_f2()
1145 switch (sense->fmt.f71.emc) { in tape_3590_print_dev_sim_msg_f2()
1150 snprintf(exception, BUFSIZE, "DV Exception - no performance" in tape_3590_print_dev_sim_msg_f2()
1155 "interface 0x%02x", sense->fmt.f71.md[0]); in tape_3590_print_dev_sim_msg_f2()
1159 sense->fmt.f71.md[0]); in tape_3590_print_dev_sim_msg_f2()
1162 snprintf(exception, BUFSIZE, "DV Exception on message display" in tape_3590_print_dev_sim_msg_f2()
1163 " 0x%02x", sense->fmt.f71.md[0]); in tape_3590_print_dev_sim_msg_f2()
1173 sense->fmt.f71.emc); in tape_3590_print_dev_sim_msg_f2()
1175 /* Service Message */ in tape_3590_print_dev_sim_msg_f2()
1176 switch (sense->fmt.f71.smc) { in tape_3590_print_dev_sim_msg_f2()
1185 if (sense->fmt.f71.mdf == 0) in tape_3590_print_dev_sim_msg_f2()
1188 sense->fmt.f71.md[1]); in tape_3590_print_dev_sim_msg_f2()
1191 "channel path (0x%x-0x%x) on DV", in tape_3590_print_dev_sim_msg_f2()
1192 sense->fmt.f71.md[1], sense->fmt.f71.md[2]); in tape_3590_print_dev_sim_msg_f2()
1195 if (sense->fmt.f71.mdf == 0) in tape_3590_print_dev_sim_msg_f2()
1197 "interface 0x%x on DV", sense->fmt.f71.md[1]); in tape_3590_print_dev_sim_msg_f2()
1200 "interfaces (0x%x-0x%x) on DV", in tape_3590_print_dev_sim_msg_f2()
1201 sense->fmt.f71.md[1], sense->fmt.f71.md[2]); in tape_3590_print_dev_sim_msg_f2()
1204 if (sense->fmt.f71.mdf == 0) in tape_3590_print_dev_sim_msg_f2()
1206 " 0x%x on DV", sense->fmt.f71.md[1]); in tape_3590_print_dev_sim_msg_f2()
1209 " (0x%x-0x%x) on DV", in tape_3590_print_dev_sim_msg_f2()
1210 sense->fmt.f71.md[1], sense->fmt.f71.md[2]); in tape_3590_print_dev_sim_msg_f2()
1216 if (sense->fmt.f71.mdf == 0) in tape_3590_print_dev_sim_msg_f2()
1218 "message display 0x%x on DV", in tape_3590_print_dev_sim_msg_f2()
1219 sense->fmt.f71.md[1]); in tape_3590_print_dev_sim_msg_f2()
1222 "message displays (0x%x-0x%x) on DV", in tape_3590_print_dev_sim_msg_f2()
1223 sense->fmt.f71.md[1], sense->fmt.f71.md[2]); in tape_3590_print_dev_sim_msg_f2()
1230 sense->fmt.f71.smc); in tape_3590_print_dev_sim_msg_f2()
1233 dev_warn (&device->cdev->dev, "Device subsystem information: exception" in tape_3590_print_dev_sim_msg_f2()
1241 * Print standard ERA Message
1248 sense = (struct tape_3590_sense *) irb->ecw; in tape_3590_print_era_msg()
1249 if (sense->mc == 0) in tape_3590_print_era_msg()
1251 if ((sense->mc > 0) && (sense->mc < TAPE_3590_MAX_MSG)) { in tape_3590_print_era_msg()
1252 if (tape_3590_msg[sense->mc] != NULL) in tape_3590_print_era_msg()
1253 dev_warn (&device->cdev->dev, "The tape unit has " in tape_3590_print_era_msg()
1254 "issued sense message %s\n", in tape_3590_print_era_msg()
1255 tape_3590_msg[sense->mc]); in tape_3590_print_era_msg()
1257 dev_warn (&device->cdev->dev, "The tape unit has " in tape_3590_print_era_msg()
1258 "issued an unknown sense message code 0x%x\n", in tape_3590_print_era_msg()
1259 sense->mc); in tape_3590_print_era_msg()
1262 if (sense->mc == 0xf0) { in tape_3590_print_era_msg()
1263 /* Standard Media Information Message */ in tape_3590_print_era_msg()
1264 dev_warn (&device->cdev->dev, "MIM SEV=%i, MC=%02x, ES=%x/%x, " in tape_3590_print_era_msg()
1265 "RC=%02x-%04x-%02x\n", sense->fmt.f70.sev, sense->mc, in tape_3590_print_era_msg()
1266 sense->fmt.f70.emc, sense->fmt.f70.smc, in tape_3590_print_era_msg()
1267 sense->fmt.f70.refcode, sense->fmt.f70.mid, in tape_3590_print_era_msg()
1268 sense->fmt.f70.fid); in tape_3590_print_era_msg()
1272 if (sense->mc == 0xf1) { in tape_3590_print_era_msg()
1273 /* Standard I/O Subsystem Service Information Message */ in tape_3590_print_era_msg()
1274 dev_warn (&device->cdev->dev, "IOSIM SEV=%i, DEVTYPE=3590/%02x," in tape_3590_print_era_msg()
1275 " MC=%02x, ES=%x/%x, REF=0x%04x-0x%04x-0x%04x\n", in tape_3590_print_era_msg()
1276 sense->fmt.f71.sev, device->cdev->id.dev_model, in tape_3590_print_era_msg()
1277 sense->mc, sense->fmt.f71.emc, sense->fmt.f71.smc, in tape_3590_print_era_msg()
1278 sense->fmt.f71.refcode1, sense->fmt.f71.refcode2, in tape_3590_print_era_msg()
1279 sense->fmt.f71.refcode3); in tape_3590_print_era_msg()
1283 if (sense->mc == 0xf2) { in tape_3590_print_era_msg()
1284 /* Standard Device Service Information Message */ in tape_3590_print_era_msg()
1285 dev_warn (&device->cdev->dev, "DEVSIM SEV=%i, DEVTYPE=3590/%02x" in tape_3590_print_era_msg()
1286 ", MC=%02x, ES=%x/%x, REF=0x%04x-0x%04x-0x%04x\n", in tape_3590_print_era_msg()
1287 sense->fmt.f71.sev, device->cdev->id.dev_model, in tape_3590_print_era_msg()
1288 sense->mc, sense->fmt.f71.emc, sense->fmt.f71.smc, in tape_3590_print_era_msg()
1289 sense->fmt.f71.refcode1, sense->fmt.f71.refcode2, in tape_3590_print_era_msg()
1290 sense->fmt.f71.refcode3); in tape_3590_print_era_msg()
1294 if (sense->mc == 0xf3) { in tape_3590_print_era_msg()
1295 /* Standard Library Service Information Message */ in tape_3590_print_era_msg()
1298 dev_warn (&device->cdev->dev, "The tape unit has issued an unknown " in tape_3590_print_era_msg()
1299 "sense message code %x\n", sense->mc); in tape_3590_print_era_msg()
1309 sense = ((struct tape_3590_sense *) irb->ecw)->fmt.data; in tape_3590_crypt_error()
1314 return tape_3590_erp_basic(device, request, irb, -EKEYREJECTED); in tape_3590_crypt_error()
1317 return tape_3590_erp_basic(device, request, irb, -ENOTCONN); in tape_3590_crypt_error()
1319 dev_err (&device->cdev->dev, "The tape unit failed to obtain the " in tape_3590_crypt_error()
1322 return tape_3590_erp_basic(device, request, irb, -ENOKEY); in tape_3590_crypt_error()
1336 sense = (struct tape_3590_sense *) irb->ecw; in tape_3590_unit_check()
1338 DBF_EVENT(6, "Unit Check: RQC = %x\n", sense->rc_rqc); in tape_3590_unit_check()
1341 * First check all RC-QRCs where we want to do something special in tape_3590_unit_check()
1342 * - "break": basic error recovery is done in tape_3590_unit_check()
1343 * - "goto out:": just print error message if available in tape_3590_unit_check()
1345 switch (sense->rc_rqc) { in tape_3590_unit_check()
1364 device->cdev_id); in tape_3590_unit_check()
1365 return tape_3590_erp_basic(device, request, irb, -ENOSPC); in tape_3590_unit_check()
1368 device->cdev_id); in tape_3590_unit_check()
1369 return tape_3590_erp_basic(device, request, irb, -ENOSPC); in tape_3590_unit_check()
1371 DBF_EVENT(2, "(%08x): End of Data Mark\n", device->cdev_id); in tape_3590_unit_check()
1372 return tape_3590_erp_basic(device, request, irb, -ENOSPC); in tape_3590_unit_check()
1376 device->cdev_id); in tape_3590_unit_check()
1377 return tape_3590_erp_basic(device, request, irb, -EIO); in tape_3590_unit_check()
1380 device->cdev_id); in tape_3590_unit_check()
1392 return tape_3590_erp_basic(device, request, irb, -ENOMEDIUM); in tape_3590_unit_check()
1394 /* XXX: Also use long busy handling here? */ in tape_3590_unit_check()
1395 DBF_EVENT(6, "(%08x): LONG BUSY\n", device->cdev_id); in tape_3590_unit_check()
1397 return tape_3590_erp_basic(device, request, irb, -EBUSY); in tape_3590_unit_check()
1399 DBF_EVENT(6, "(%08x): Crypto LONG BUSY\n", device->cdev_id); in tape_3590_unit_check()
1403 if (sense->rac == 0xd0) { in tape_3590_unit_check()
1408 if (sense->rac == 0x26) { in tape_3590_unit_check()
1414 return tape_3590_erp_basic(device, request, irb, -EIO); in tape_3590_unit_check()
1426 return tape_3590_erp_basic(device, request, irb, -EMEDIUMTYPE); in tape_3590_unit_check()
1432 return tape_3590_erp_basic(device, request, irb, -ENOMEDIUM); in tape_3590_unit_check()
1435 return tape_3590_erp_basic(device, request, irb, -EMEDIUMTYPE); in tape_3590_unit_check()
1438 return tape_3590_erp_basic(device, request, irb, -EPERM); in tape_3590_unit_check()
1440 dev_warn (&device->cdev->dev, "A different host has privileged" in tape_3590_unit_check()
1441 " access to the tape unit\n"); in tape_3590_unit_check()
1442 return tape_3590_erp_basic(device, request, irb, -EPERM); in tape_3590_unit_check()
1444 return tape_3590_erp_basic(device, request, irb, -EIO); in tape_3590_unit_check()
1458 if ((irb->scsw.cmd.dstat & DEV_STAT_UNIT_EXCEP) && in tape_3590_irq()
1459 (irb->scsw.cmd.dstat & DEV_STAT_DEV_END) && in tape_3590_irq()
1460 (request->op == TO_WRI)) { in tape_3590_irq()
1463 return tape_3590_erp_failed(device, request, irb, -ENOSPC); in tape_3590_irq()
1466 if (irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) in tape_3590_irq()
1469 if (irb->scsw.cmd.dstat & DEV_STAT_DEV_END) { in tape_3590_irq()
1470 if (irb->scsw.cmd.dstat == DEV_STAT_UNIT_EXCEP) { in tape_3590_irq()
1471 if (request->op == TO_FSB || request->op == TO_BSB) in tape_3590_irq()
1472 request->rescnt++; in tape_3590_irq()
1474 DBF_EVENT(5, "Unit Exception!\n"); in tape_3590_irq()
1480 if (irb->scsw.cmd.dstat & DEV_STAT_CHN_END) { in tape_3590_irq()
1485 if (irb->scsw.cmd.dstat & DEV_STAT_ATTENTION) { in tape_3590_irq()
1486 DBF_EVENT(2, "Unit Attention when busy..\n"); in tape_3590_irq()
1505 request->op = TO_RDC; in tape_3590_read_dev_chars()
1506 tape_ccw_end(request->cpaddr, CCW_CMD_RDC, sizeof(*rdc_data), in tape_3590_read_dev_chars()
1507 request->cpdata); in tape_3590_read_dev_chars()
1510 memcpy(rdc_data, request->cpdata, sizeof(*rdc_data)); in tape_3590_read_dev_chars()
1528 return -ENOMEM; in tape_3590_setup_device()
1529 data->read_back_op = READ_PREVIOUS; in tape_3590_setup_device()
1530 device->discdata = data; in tape_3590_setup_device()
1534 rc = -ENOMEM; in tape_3590_setup_device()
1545 if (rdc_data->data[31] == 0x13) { in tape_3590_setup_device()
1546 data->crypt_info.capability |= TAPE390_CRYPT_SUPPORTED_MASK; in tape_3590_setup_device()
1575 kfree(device->discdata); in tape_3590_cleanup_device()
1576 device->discdata = NULL; in tape_3590_cleanup_device()
1641 return tape_generic_online(dev_get_drvdata(&cdev->dev), in tape_3590_online()
1676 return -ENOMEM; in tape_3590_init()