Lines Matching +full:message +full:- +full:handling +full:- +full:unit
1 // SPDX-License-Identifier: GPL-2.0
37 * - Read Opposite: implemented
38 * - Read Device (buffered) log: BRA
39 * - Read Library log: BRA
40 * - Swap Devices: BRA
41 * - Long Busy: implemented
42 * - Special Intercept: BRA
43 * - Read Alternate: implemented
57 [0x25] = "Read-Only Format",
94 [0xa8] = "Vision System non-operational",
119 if (in->type == TAPE390_KEKL_TYPE_HASH) in ext_to_int_kekl()
120 out->flags |= 0x40; in ext_to_int_kekl()
121 if (in->type_on_tape == TAPE390_KEKL_TYPE_HASH) in ext_to_int_kekl()
122 out->flags |= 0x80; in ext_to_int_kekl()
123 len = min(sizeof(out->label), strlen(in->label)); in ext_to_int_kekl()
124 memcpy(out->label, in->label, len); in ext_to_int_kekl()
125 memset(out->label + len, ' ', sizeof(out->label) - len); in ext_to_int_kekl()
126 ASCEBC(out->label, sizeof(out->label)); in ext_to_int_kekl()
133 if(in->flags & 0x40) in int_to_ext_kekl()
134 out->type = TAPE390_KEKL_TYPE_HASH; in int_to_ext_kekl()
136 out->type = TAPE390_KEKL_TYPE_LABEL; in int_to_ext_kekl()
137 if(in->flags & 0x80) in int_to_ext_kekl()
138 out->type_on_tape = TAPE390_KEKL_TYPE_HASH; in int_to_ext_kekl()
140 out->type_on_tape = TAPE390_KEKL_TYPE_LABEL; in int_to_ext_kekl()
141 memcpy(out->label, in->label, sizeof(in->label)); in int_to_ext_kekl()
142 EBCASC(out->label, sizeof(in->label)); in int_to_ext_kekl()
143 strim(out->label); in int_to_ext_kekl()
149 if (in->count == 0) { in int_to_ext_kekl_pair()
150 out->kekl[0].type = TAPE390_KEKL_TYPE_NONE; in int_to_ext_kekl_pair()
151 out->kekl[0].type_on_tape = TAPE390_KEKL_TYPE_NONE; in int_to_ext_kekl_pair()
152 out->kekl[1].type = TAPE390_KEKL_TYPE_NONE; in int_to_ext_kekl_pair()
153 out->kekl[1].type_on_tape = TAPE390_KEKL_TYPE_NONE; in int_to_ext_kekl_pair()
154 } else if (in->count == 1) { in int_to_ext_kekl_pair()
155 int_to_ext_kekl(&in->kekl[0], &out->kekl[0]); in int_to_ext_kekl_pair()
156 out->kekl[1].type = TAPE390_KEKL_TYPE_NONE; in int_to_ext_kekl_pair()
157 out->kekl[1].type_on_tape = TAPE390_KEKL_TYPE_NONE; in int_to_ext_kekl_pair()
158 } else if (in->count == 2) { in int_to_ext_kekl_pair()
159 int_to_ext_kekl(&in->kekl[0], &out->kekl[0]); in int_to_ext_kekl_pair()
160 int_to_ext_kekl(&in->kekl[1], &out->kekl[1]); in int_to_ext_kekl_pair()
162 printk("Invalid KEKL number: %d\n", in->count); in int_to_ext_kekl_pair()
169 if (kekl->type == TAPE390_KEKL_TYPE_NONE) in check_ext_kekl()
171 if (kekl->type > TAPE390_KEKL_TYPE_HASH) in check_ext_kekl()
173 if (kekl->type_on_tape == TAPE390_KEKL_TYPE_NONE) in check_ext_kekl()
175 if (kekl->type_on_tape > TAPE390_KEKL_TYPE_HASH) in check_ext_kekl()
177 if ((kekl->type == TAPE390_KEKL_TYPE_HASH) && in check_ext_kekl()
178 (kekl->type_on_tape == TAPE390_KEKL_TYPE_LABEL)) in check_ext_kekl()
183 return -EINVAL; in check_ext_kekl()
188 if (check_ext_kekl(&kekls->kekl[0])) in check_ext_kekl_pair()
190 if (check_ext_kekl(&kekls->kekl[1])) in check_ext_kekl_pair()
195 return -EINVAL; in check_ext_kekl_pair()
212 return -ENOMEM; in tape_3592_kekl_query()
218 order = request->cpdata; in tape_3592_kekl_query()
220 order->code = 0xe2; in tape_3592_kekl_query()
221 order->max_count = 2; in tape_3592_kekl_query()
222 request->op = TO_KEKL_QUERY; in tape_3592_kekl_query()
223 tape_ccw_cc(request->cpaddr, PERF_SUBSYS_FUNC, sizeof(*order), order); in tape_3592_kekl_query()
224 tape_ccw_end(request->cpaddr + 1, READ_SS_DATA, sizeof(*int_kekls), in tape_3592_kekl_query()
229 int_to_ext_kekl_pair(&int_kekls->kekls, ext_kekls); in tape_3592_kekl_query()
250 return -ENOSYS; in tape_3592_ioctl_kekl_query()
252 return -EUNATCH; in tape_3592_ioctl_kekl_query()
255 return -ENOMEM; in tape_3592_ioctl_kekl_query()
260 rc = -EFAULT; in tape_3592_ioctl_kekl_query()
283 return -EINVAL; in tape_3592_kekl_set()
286 return -EBADSLT; in tape_3592_kekl_set()
290 order = request->cpdata; in tape_3592_kekl_set()
292 order->code = 0xe3; in tape_3592_kekl_set()
293 order->kekls.count = 2; in tape_3592_kekl_set()
294 ext_to_int_kekl(&ext_kekls->kekl[0], &order->kekls.kekl[0]); in tape_3592_kekl_set()
295 ext_to_int_kekl(&ext_kekls->kekl[1], &order->kekls.kekl[1]); in tape_3592_kekl_set()
296 request->op = TO_KEKL_SET; in tape_3592_kekl_set()
297 tape_ccw_end(request->cpaddr, PERF_SUBSYS_FUNC, sizeof(*order), order); in tape_3592_kekl_set()
313 return -ENOSYS; in tape_3592_ioctl_kekl_set()
315 return -EUNATCH; in tape_3592_ioctl_kekl_set()
334 return ERR_PTR(-ENOSYS); in __tape_3592_enable_crypt()
338 data = request->cpdata; in __tape_3592_enable_crypt()
349 request->op = TO_CRYPT_ON; in __tape_3592_enable_crypt()
350 tape_ccw_cc(request->cpaddr, MODE_SET_CB, 36, data); in __tape_3592_enable_crypt()
351 tape_ccw_end(request->cpaddr + 1, MODE_SET_CB, 36, data + 36); in __tape_3592_enable_crypt()
384 return ERR_PTR(-ENOSYS); in __tape_3592_disable_crypt()
388 data = request->cpdata; in __tape_3592_disable_crypt()
396 request->op = TO_CRYPT_OFF; in __tape_3592_disable_crypt()
397 tape_ccw_cc(request->cpaddr, MODE_SET_CB, 36, data); in __tape_3592_disable_crypt()
398 tape_ccw_end(request->cpaddr + 1, MODE_SET_CB, 36, data + 36); in __tape_3592_disable_crypt()
432 return -ENOSYS; in tape_3592_ioctl_crypt_set()
434 return -EFAULT; in tape_3592_ioctl_crypt_set()
436 return -EINVAL; in tape_3592_ioctl_crypt_set()
453 return -ENOSYS; in tape_3592_ioctl_crypt_query()
457 return -EFAULT; in tape_3592_ioctl_crypt_query()
473 return -EFAULT; in tape_3590_ioctl()
486 return -EINVAL; /* no additional ioctls */ in tape_3590_ioctl()
500 request->op = TO_MSEN; in tape_3590_sense_medium()
501 tape_ccw_end(request->cpaddr, MEDIUM_SENSE, 128, request->cpdata); in tape_3590_sense_medium()
512 request->op = TO_MSEN; in tape_3590_sense_medium_async()
513 tape_ccw_end(request->cpaddr, MEDIUM_SENSE, 128, request->cpdata); in tape_3590_sense_medium_async()
544 request->op = TO_LBL; in tape_3590_mtseek()
545 tape_ccw_cc(request->cpaddr, MODE_SET_DB, 1, device->modeset_byte); in tape_3590_mtseek()
546 *(__u32 *) request->cpdata = count; in tape_3590_mtseek()
547 tape_ccw_cc(request->cpaddr + 1, LOCATE, 4, request->cpdata); in tape_3590_mtseek()
548 tape_ccw_end(request->cpaddr + 2, NOP, 0, NULL); in tape_3590_mtseek()
567 request->op = TO_RBA; in tape_3590_read_opposite()
568 tape_ccw_cc(request->cpaddr, MODE_SET_DB, 1, device->modeset_byte); in tape_3590_read_opposite()
569 data = device->discdata; in tape_3590_read_opposite()
570 tape_ccw_cc_idal(request->cpaddr + 1, data->read_back_op, in tape_3590_read_opposite()
571 device->char_data.idal_buf); in tape_3590_read_opposite()
572 tape_ccw_cc(request->cpaddr + 2, FORSPACEBLOCK, 0, NULL); in tape_3590_read_opposite()
573 tape_ccw_end(request->cpaddr + 3, NOP, 0, NULL); in tape_3590_read_opposite()
582 * After a "read attention message" request there are two possible
585 * 1. A unit check is presented, when attention sense is present (e.g. when
587 * together with the unit check. The recovery action is either "retry"
588 * (in case there is an attention message pending) or "permanent error".
601 request->op = TO_READ_ATTMSG; in tape_3590_read_attmsg_async()
602 buf = request->cpdata; in tape_3590_read_attmsg_async()
605 tape_ccw_cc(request->cpaddr, PERFORM_SS_FUNC, 12, buf); in tape_3590_read_attmsg_async()
606 tape_ccw_cc(request->cpaddr + 1, READ_SS_DATA, 4096 - 12, buf + 12); in tape_3590_read_attmsg_async()
607 tape_ccw_end(request->cpaddr + 2, NOP, 0, NULL); in tape_3590_read_attmsg_async()
612 * These functions are used to schedule follow-up actions from within an
630 switch (p->op) { in tape_3590_work_handler()
632 tape_3590_sense_medium_async(p->device); in tape_3590_work_handler()
635 tape_3590_read_attmsg_async(p->device); in tape_3590_work_handler()
638 tape_3592_enable_crypt_async(p->device); in tape_3590_work_handler()
641 tape_3592_disable_crypt_async(p->device); in tape_3590_work_handler()
645 "operation 0x%02x\n", p->op); in tape_3590_work_handler()
647 tape_put_device(p->device); in tape_3590_work_handler()
657 return -ENOMEM; in tape_3590_schedule_work()
659 INIT_WORK(&p->work, tape_3590_work_handler); in tape_3590_schedule_work()
661 p->device = tape_get_device(device); in tape_3590_schedule_work()
662 p->op = op; in tape_3590_schedule_work()
664 queue_work(tape_3590_wq, &p->work); in tape_3590_schedule_work()
675 DBF_EVENT(6, "medium state: %x:%x\n", sense->macst, sense->masst); in tape_3590_med_state_set()
676 switch (sense->macst) { in tape_3590_med_state_set()
691 c_info->medium_status |= TAPE390_MEDIUM_LOADED_MASK; in tape_3590_med_state_set()
692 if (sense->flags & MSENSE_CRYPT_MASK) { in tape_3590_med_state_set()
693 DBF_EVENT(6, "Medium is encrypted (%04x)\n", sense->flags); in tape_3590_med_state_set()
694 c_info->medium_status |= TAPE390_MEDIUM_ENCRYPTED_MASK; in tape_3590_med_state_set()
696 DBF_EVENT(6, "Medium is not encrypted %04x\n", sense->flags); in tape_3590_med_state_set()
697 c_info->medium_status &= ~TAPE390_MEDIUM_ENCRYPTED_MASK; in tape_3590_med_state_set()
709 DBF_EVENT(6, "%s done\n", tape_op_verbose[request->op]); in tape_3590_done()
711 switch (request->op) { in tape_3590_done()
732 tape_3590_med_state_set(device, request->cpdata); in tape_3590_done()
737 *(device->modeset_byte) |= 0x03; in tape_3590_done()
742 *(device->modeset_byte) &= ~0x03; in tape_3590_done()
767 tape_op_verbose[request->op]); in tape_3590_erp_succeeded()
779 tape_op_verbose[request->op]); in tape_3590_erp_failed()
791 DBF_EVENT(2, "Retry: %s\n", tape_op_verbose[request->op]); in tape_3590_erp_retry()
802 if (irb->scsw.cmd.dstat == DEV_STAT_CHN_END) in tape_3590_unsolicited_irq()
805 else if (irb->scsw.cmd.dstat == 0x85) in tape_3590_unsolicited_irq()
807 DBF_EVENT(3, "unsol.irq! tape ready: %08x\n", device->cdev_id); in tape_3590_unsolicited_irq()
808 else if (irb->scsw.cmd.dstat & DEV_STAT_ATTENTION) { in tape_3590_unsolicited_irq()
811 DBF_EVENT(3, "unsol.irq! dev end: %08x\n", device->cdev_id); in tape_3590_unsolicited_irq()
828 sense = (struct tape_3590_sense *) irb->ecw; in tape_3590_erp_basic()
830 switch (sense->bra) { in tape_3590_erp_basic()
856 return tape_3590_erp_basic(device, request, irb, -EIO); in tape_3590_erp_read_buf_log()
872 dev_warn (&device->cdev->dev, "The tape medium must be loaded into a " in tape_3590_erp_swap()
873 "different tape unit\n"); in tape_3590_erp_swap()
874 return tape_3590_erp_basic(device, request, irb, -EIO); in tape_3590_erp_swap()
895 return tape_3590_erp_basic(device, request, irb, -EIO); in tape_3590_erp_special_interrupt()
914 data = device->discdata; in tape_3590_erp_read_alternate()
915 if (data->read_back_op == READ_PREVIOUS) { in tape_3590_erp_read_alternate()
917 device->cdev_id); in tape_3590_erp_read_alternate()
918 data->read_back_op = READ_BACKWARD; in tape_3590_erp_read_alternate()
921 device->cdev_id); in tape_3590_erp_read_alternate()
922 data->read_back_op = READ_PREVIOUS; in tape_3590_erp_read_alternate()
935 switch (request->op) { in tape_3590_erp_read_opposite()
945 return tape_3590_erp_failed(device, request, irb, -EIO); in tape_3590_erp_read_opposite()
948 return tape_3590_erp_failed(device, request, irb, -EIO); in tape_3590_erp_read_opposite()
953 * Print an MIM (Media Information Message) (message code f0)
967 sense = (struct tape_3590_sense *) irb->ecw; in tape_3590_print_mim_msg_f0()
968 /* Exception Message */ in tape_3590_print_mim_msg_f0()
969 switch (sense->fmt.f70.emc) { in tape_3590_print_mim_msg_f0()
975 sense->fmt.f70.mp); in tape_3590_print_mim_msg_f0()
982 sense->fmt.f70.mp); in tape_3590_print_mim_msg_f0()
989 sense->fmt.f70.md); in tape_3590_print_mim_msg_f0()
993 sense->fmt.f70.emc); in tape_3590_print_mim_msg_f0()
996 /* Service Message */ in tape_3590_print_mim_msg_f0()
997 switch (sense->fmt.f70.smc) { in tape_3590_print_mim_msg_f0()
1000 "procedure %i", sense->fmt.f70.md); in tape_3590_print_mim_msg_f0()
1004 sense->fmt.f70.smc); in tape_3590_print_mim_msg_f0()
1008 dev_warn (&device->cdev->dev, "Tape media information: exception %s, " in tape_3590_print_mim_msg_f0()
1017 * Print an I/O Subsystem Service Information Message (message code f1)
1031 sense = (struct tape_3590_sense *) irb->ecw; in tape_3590_print_io_sim_msg_f1()
1032 /* Exception Message */ in tape_3590_print_io_sim_msg_f1()
1033 switch (sense->fmt.f71.emc) { in tape_3590_print_io_sim_msg_f1()
1038 snprintf(exception, BUFSIZE, "CU Exception - no performance " in tape_3590_print_io_sim_msg_f1()
1043 "interface 0x%02x", sense->fmt.f71.md[0]); in tape_3590_print_io_sim_msg_f1()
1047 "0x%02x", sense->fmt.f71.md[0]); in tape_3590_print_io_sim_msg_f1()
1051 "0x%02x", sense->fmt.f71.md[0]); in tape_3590_print_io_sim_msg_f1()
1055 sense->fmt.f71.md[0]); in tape_3590_print_io_sim_msg_f1()
1059 "0x%02x", sense->fmt.f71.md[0]); in tape_3590_print_io_sim_msg_f1()
1063 sense->fmt.f71.emc); in tape_3590_print_io_sim_msg_f1()
1065 /* Service Message */ in tape_3590_print_io_sim_msg_f1()
1066 switch (sense->fmt.f71.smc) { in tape_3590_print_io_sim_msg_f1()
1075 if (sense->fmt.f71.mdf == 0) in tape_3590_print_io_sim_msg_f1()
1077 "0x%x on CU", sense->fmt.f71.md[1]); in tape_3590_print_io_sim_msg_f1()
1080 "nodes (0x%x-0x%x) on CU", sense->fmt.f71.md[1], in tape_3590_print_io_sim_msg_f1()
1081 sense->fmt.f71.md[2]); in tape_3590_print_io_sim_msg_f1()
1084 if (sense->fmt.f71.mdf == 0) in tape_3590_print_io_sim_msg_f1()
1087 sense->fmt.f71.md[1]); in tape_3590_print_io_sim_msg_f1()
1090 " paths (0x%x-0x%x) on CU", in tape_3590_print_io_sim_msg_f1()
1091 sense->fmt.f71.md[1], sense->fmt.f71.md[2]); in tape_3590_print_io_sim_msg_f1()
1094 if (sense->fmt.f71.mdf == 0) in tape_3590_print_io_sim_msg_f1()
1096 " path 0x%x on CU", sense->fmt.f71.md[1]); in tape_3590_print_io_sim_msg_f1()
1099 " paths (0x%x-0x%x) on CU", in tape_3590_print_io_sim_msg_f1()
1100 sense->fmt.f71.md[1], sense->fmt.f71.md[2]); in tape_3590_print_io_sim_msg_f1()
1103 if (sense->fmt.f71.mdf == 0) in tape_3590_print_io_sim_msg_f1()
1106 sense->fmt.f71.md[1]); in tape_3590_print_io_sim_msg_f1()
1109 "library paths (0x%x-0x%x) on CU", in tape_3590_print_io_sim_msg_f1()
1110 sense->fmt.f71.md[1], sense->fmt.f71.md[2]); in tape_3590_print_io_sim_msg_f1()
1117 sense->fmt.f71.smc); in tape_3590_print_io_sim_msg_f1()
1120 dev_warn (&device->cdev->dev, "I/O subsystem information: exception" in tape_3590_print_io_sim_msg_f1()
1128 * Print an Device Subsystem Service Information Message (message code f2)
1142 sense = (struct tape_3590_sense *) irb->ecw; in tape_3590_print_dev_sim_msg_f2()
1143 /* Exception Message */ in tape_3590_print_dev_sim_msg_f2()
1144 switch (sense->fmt.f71.emc) { in tape_3590_print_dev_sim_msg_f2()
1149 snprintf(exception, BUFSIZE, "DV Exception - no performance" in tape_3590_print_dev_sim_msg_f2()
1154 "interface 0x%02x", sense->fmt.f71.md[0]); in tape_3590_print_dev_sim_msg_f2()
1158 sense->fmt.f71.md[0]); in tape_3590_print_dev_sim_msg_f2()
1161 snprintf(exception, BUFSIZE, "DV Exception on message display" in tape_3590_print_dev_sim_msg_f2()
1162 " 0x%02x", sense->fmt.f71.md[0]); in tape_3590_print_dev_sim_msg_f2()
1172 sense->fmt.f71.emc); in tape_3590_print_dev_sim_msg_f2()
1174 /* Service Message */ in tape_3590_print_dev_sim_msg_f2()
1175 switch (sense->fmt.f71.smc) { in tape_3590_print_dev_sim_msg_f2()
1184 if (sense->fmt.f71.mdf == 0) in tape_3590_print_dev_sim_msg_f2()
1187 sense->fmt.f71.md[1]); in tape_3590_print_dev_sim_msg_f2()
1190 "channel path (0x%x-0x%x) on DV", in tape_3590_print_dev_sim_msg_f2()
1191 sense->fmt.f71.md[1], sense->fmt.f71.md[2]); in tape_3590_print_dev_sim_msg_f2()
1194 if (sense->fmt.f71.mdf == 0) in tape_3590_print_dev_sim_msg_f2()
1196 "interface 0x%x on DV", sense->fmt.f71.md[1]); in tape_3590_print_dev_sim_msg_f2()
1199 "interfaces (0x%x-0x%x) on DV", in tape_3590_print_dev_sim_msg_f2()
1200 sense->fmt.f71.md[1], sense->fmt.f71.md[2]); in tape_3590_print_dev_sim_msg_f2()
1203 if (sense->fmt.f71.mdf == 0) in tape_3590_print_dev_sim_msg_f2()
1205 " 0x%x on DV", sense->fmt.f71.md[1]); in tape_3590_print_dev_sim_msg_f2()
1208 " (0x%x-0x%x) on DV", in tape_3590_print_dev_sim_msg_f2()
1209 sense->fmt.f71.md[1], sense->fmt.f71.md[2]); in tape_3590_print_dev_sim_msg_f2()
1215 if (sense->fmt.f71.mdf == 0) in tape_3590_print_dev_sim_msg_f2()
1217 "message display 0x%x on DV", in tape_3590_print_dev_sim_msg_f2()
1218 sense->fmt.f71.md[1]); in tape_3590_print_dev_sim_msg_f2()
1221 "message displays (0x%x-0x%x) on DV", in tape_3590_print_dev_sim_msg_f2()
1222 sense->fmt.f71.md[1], sense->fmt.f71.md[2]); in tape_3590_print_dev_sim_msg_f2()
1229 sense->fmt.f71.smc); in tape_3590_print_dev_sim_msg_f2()
1232 dev_warn (&device->cdev->dev, "Device subsystem information: exception" in tape_3590_print_dev_sim_msg_f2()
1240 * Print standard ERA Message
1247 sense = (struct tape_3590_sense *) irb->ecw; in tape_3590_print_era_msg()
1248 if (sense->mc == 0) in tape_3590_print_era_msg()
1250 if ((sense->mc > 0) && (sense->mc < TAPE_3590_MAX_MSG)) { in tape_3590_print_era_msg()
1251 if (tape_3590_msg[sense->mc] != NULL) in tape_3590_print_era_msg()
1252 dev_warn (&device->cdev->dev, "The tape unit has " in tape_3590_print_era_msg()
1253 "issued sense message %s\n", in tape_3590_print_era_msg()
1254 tape_3590_msg[sense->mc]); in tape_3590_print_era_msg()
1256 dev_warn (&device->cdev->dev, "The tape unit has " in tape_3590_print_era_msg()
1257 "issued an unknown sense message code 0x%x\n", in tape_3590_print_era_msg()
1258 sense->mc); in tape_3590_print_era_msg()
1261 if (sense->mc == 0xf0) { in tape_3590_print_era_msg()
1262 /* Standard Media Information Message */ in tape_3590_print_era_msg()
1263 dev_warn (&device->cdev->dev, "MIM SEV=%i, MC=%02x, ES=%x/%x, " in tape_3590_print_era_msg()
1264 "RC=%02x-%04x-%02x\n", sense->fmt.f70.sev, sense->mc, in tape_3590_print_era_msg()
1265 sense->fmt.f70.emc, sense->fmt.f70.smc, in tape_3590_print_era_msg()
1266 sense->fmt.f70.refcode, sense->fmt.f70.mid, in tape_3590_print_era_msg()
1267 sense->fmt.f70.fid); in tape_3590_print_era_msg()
1271 if (sense->mc == 0xf1) { in tape_3590_print_era_msg()
1272 /* Standard I/O Subsystem Service Information Message */ in tape_3590_print_era_msg()
1273 dev_warn (&device->cdev->dev, "IOSIM SEV=%i, DEVTYPE=3590/%02x," in tape_3590_print_era_msg()
1274 " MC=%02x, ES=%x/%x, REF=0x%04x-0x%04x-0x%04x\n", in tape_3590_print_era_msg()
1275 sense->fmt.f71.sev, device->cdev->id.dev_model, in tape_3590_print_era_msg()
1276 sense->mc, sense->fmt.f71.emc, sense->fmt.f71.smc, in tape_3590_print_era_msg()
1277 sense->fmt.f71.refcode1, sense->fmt.f71.refcode2, in tape_3590_print_era_msg()
1278 sense->fmt.f71.refcode3); in tape_3590_print_era_msg()
1282 if (sense->mc == 0xf2) { in tape_3590_print_era_msg()
1283 /* Standard Device Service Information Message */ in tape_3590_print_era_msg()
1284 dev_warn (&device->cdev->dev, "DEVSIM SEV=%i, DEVTYPE=3590/%02x" in tape_3590_print_era_msg()
1285 ", MC=%02x, ES=%x/%x, REF=0x%04x-0x%04x-0x%04x\n", in tape_3590_print_era_msg()
1286 sense->fmt.f71.sev, device->cdev->id.dev_model, in tape_3590_print_era_msg()
1287 sense->mc, sense->fmt.f71.emc, sense->fmt.f71.smc, in tape_3590_print_era_msg()
1288 sense->fmt.f71.refcode1, sense->fmt.f71.refcode2, in tape_3590_print_era_msg()
1289 sense->fmt.f71.refcode3); in tape_3590_print_era_msg()
1293 if (sense->mc == 0xf3) { in tape_3590_print_era_msg()
1294 /* Standard Library Service Information Message */ in tape_3590_print_era_msg()
1297 dev_warn (&device->cdev->dev, "The tape unit has issued an unknown " in tape_3590_print_era_msg()
1298 "sense message code %x\n", sense->mc); in tape_3590_print_era_msg()
1308 sense = ((struct tape_3590_sense *) irb->ecw)->fmt.data; in tape_3590_crypt_error()
1313 return tape_3590_erp_basic(device, request, irb, -EKEYREJECTED); in tape_3590_crypt_error()
1316 return tape_3590_erp_basic(device, request, irb, -ENOTCONN); in tape_3590_crypt_error()
1318 dev_err (&device->cdev->dev, "The tape unit failed to obtain the " in tape_3590_crypt_error()
1321 return tape_3590_erp_basic(device, request, irb, -ENOKEY); in tape_3590_crypt_error()
1335 sense = (struct tape_3590_sense *) irb->ecw; in tape_3590_unit_check()
1337 DBF_EVENT(6, "Unit Check: RQC = %x\n", sense->rc_rqc); in tape_3590_unit_check()
1340 * First check all RC-QRCs where we want to do something special in tape_3590_unit_check()
1341 * - "break": basic error recovery is done in tape_3590_unit_check()
1342 * - "goto out:": just print error message if available in tape_3590_unit_check()
1344 switch (sense->rc_rqc) { in tape_3590_unit_check()
1363 device->cdev_id); in tape_3590_unit_check()
1364 return tape_3590_erp_basic(device, request, irb, -ENOSPC); in tape_3590_unit_check()
1367 device->cdev_id); in tape_3590_unit_check()
1368 return tape_3590_erp_basic(device, request, irb, -ENOSPC); in tape_3590_unit_check()
1370 DBF_EVENT(2, "(%08x): End of Data Mark\n", device->cdev_id); in tape_3590_unit_check()
1371 return tape_3590_erp_basic(device, request, irb, -ENOSPC); in tape_3590_unit_check()
1375 device->cdev_id); in tape_3590_unit_check()
1376 return tape_3590_erp_basic(device, request, irb, -EIO); in tape_3590_unit_check()
1379 device->cdev_id); in tape_3590_unit_check()
1391 return tape_3590_erp_basic(device, request, irb, -ENOMEDIUM); in tape_3590_unit_check()
1393 /* XXX: Also use long busy handling here? */ in tape_3590_unit_check()
1394 DBF_EVENT(6, "(%08x): LONG BUSY\n", device->cdev_id); in tape_3590_unit_check()
1396 return tape_3590_erp_basic(device, request, irb, -EBUSY); in tape_3590_unit_check()
1398 DBF_EVENT(6, "(%08x): Crypto LONG BUSY\n", device->cdev_id); in tape_3590_unit_check()
1402 if (sense->rac == 0xd0) { in tape_3590_unit_check()
1407 if (sense->rac == 0x26) { in tape_3590_unit_check()
1413 return tape_3590_erp_basic(device, request, irb, -EIO); in tape_3590_unit_check()
1425 return tape_3590_erp_basic(device, request, irb, -EMEDIUMTYPE); in tape_3590_unit_check()
1431 return tape_3590_erp_basic(device, request, irb, -ENOMEDIUM); in tape_3590_unit_check()
1434 return tape_3590_erp_basic(device, request, irb, -EMEDIUMTYPE); in tape_3590_unit_check()
1437 return tape_3590_erp_basic(device, request, irb, -EPERM); in tape_3590_unit_check()
1439 dev_warn (&device->cdev->dev, "A different host has privileged" in tape_3590_unit_check()
1440 " access to the tape unit\n"); in tape_3590_unit_check()
1441 return tape_3590_erp_basic(device, request, irb, -EPERM); in tape_3590_unit_check()
1443 return tape_3590_erp_basic(device, request, irb, -EIO); in tape_3590_unit_check()
1457 if ((irb->scsw.cmd.dstat & DEV_STAT_UNIT_EXCEP) && in tape_3590_irq()
1458 (irb->scsw.cmd.dstat & DEV_STAT_DEV_END) && in tape_3590_irq()
1459 (request->op == TO_WRI)) { in tape_3590_irq()
1462 return tape_3590_erp_failed(device, request, irb, -ENOSPC); in tape_3590_irq()
1465 if (irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) in tape_3590_irq()
1468 if (irb->scsw.cmd.dstat & DEV_STAT_DEV_END) { in tape_3590_irq()
1469 if (irb->scsw.cmd.dstat == DEV_STAT_UNIT_EXCEP) { in tape_3590_irq()
1470 if (request->op == TO_FSB || request->op == TO_BSB) in tape_3590_irq()
1471 request->rescnt++; in tape_3590_irq()
1473 DBF_EVENT(5, "Unit Exception!\n"); in tape_3590_irq()
1479 if (irb->scsw.cmd.dstat & DEV_STAT_CHN_END) { in tape_3590_irq()
1484 if (irb->scsw.cmd.dstat & DEV_STAT_ATTENTION) { in tape_3590_irq()
1485 DBF_EVENT(2, "Unit Attention when busy..\n"); in tape_3590_irq()
1504 request->op = TO_RDC; in tape_3590_read_dev_chars()
1505 tape_ccw_end(request->cpaddr, CCW_CMD_RDC, sizeof(*rdc_data), in tape_3590_read_dev_chars()
1506 request->cpdata); in tape_3590_read_dev_chars()
1509 memcpy(rdc_data, request->cpdata, sizeof(*rdc_data)); in tape_3590_read_dev_chars()
1527 return -ENOMEM; in tape_3590_setup_device()
1528 data->read_back_op = READ_PREVIOUS; in tape_3590_setup_device()
1529 device->discdata = data; in tape_3590_setup_device()
1533 rc = -ENOMEM; in tape_3590_setup_device()
1544 if (rdc_data->data[31] == 0x13) { in tape_3590_setup_device()
1545 data->crypt_info.capability |= TAPE390_CRYPT_SUPPORTED_MASK; in tape_3590_setup_device()
1574 kfree(device->discdata); in tape_3590_cleanup_device()
1575 device->discdata = NULL; in tape_3590_cleanup_device()
1640 return tape_generic_online(dev_get_drvdata(&cdev->dev), in tape_3590_online()
1675 return -ENOMEM; in tape_3590_init()