Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1b9fd76e authored by Michael Holzheu's avatar Michael Holzheu Committed by Martin Schwidefsky
Browse files

[S390] tape: Fix medium state handling



Currently there are situations, where the tape medium state (loaded, unloaded,
unknown) is not set correctly. The reason is that the medium association
field is used to determine the medium state. This not always leads to
correct results. To fix that we use another field of the medium sense
data instead.

Signed-off-by: default avatarMichael Holzheu <holzheu@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent a004fb0c
Loading
Loading
Loading
Loading
+17 −9
Original line number Original line Diff line number Diff line
@@ -708,16 +708,22 @@ static void tape_3590_med_state_set(struct tape_device *device,


	c_info = &TAPE_3590_CRYPT_INFO(device);
	c_info = &TAPE_3590_CRYPT_INFO(device);


	if (sense->masst == MSENSE_UNASSOCIATED) {
	DBF_EVENT(6, "medium state: %x:%x\n", sense->macst, sense->masst);
	switch (sense->macst) {
	case 0x04:
	case 0x05:
	case 0x06:
		tape_med_state_set(device, MS_UNLOADED);
		tape_med_state_set(device, MS_UNLOADED);
		TAPE_3590_CRYPT_INFO(device).medium_status = 0;
		TAPE_3590_CRYPT_INFO(device).medium_status = 0;
		return;
		return;
	}
	case 0x08:
	if (sense->masst != MSENSE_ASSOCIATED_MOUNT) {
	case 0x09:
		PRINT_ERR("Unknown medium state: %x\n", sense->masst);
		tape_med_state_set(device, MS_LOADED);
		break;
	default:
		tape_med_state_set(device, MS_UNKNOWN);
		return;
		return;
	}
	}
	tape_med_state_set(device, MS_LOADED);
	c_info->medium_status |= TAPE390_MEDIUM_LOADED_MASK;
	c_info->medium_status |= TAPE390_MEDIUM_LOADED_MASK;
	if (sense->flags & MSENSE_CRYPT_MASK) {
	if (sense->flags & MSENSE_CRYPT_MASK) {
		PRINT_INFO("Medium is encrypted (%04x)\n", sense->flags);
		PRINT_INFO("Medium is encrypted (%04x)\n", sense->flags);
@@ -835,15 +841,17 @@ tape_3590_unsolicited_irq(struct tape_device *device, struct irb *irb)
		/* Probably result of halt ssch */
		/* Probably result of halt ssch */
		return TAPE_IO_PENDING;
		return TAPE_IO_PENDING;
	else if (irb->scsw.dstat == 0x85)
	else if (irb->scsw.dstat == 0x85)
		/* Device Ready -> check medium state */
		/* Device Ready */
		tape_3590_schedule_work(device, TO_MSEN);
		DBF_EVENT(3, "unsol.irq! tape ready: %08x\n", device->cdev_id);
	else if (irb->scsw.dstat & DEV_STAT_ATTENTION)
	else if (irb->scsw.dstat & DEV_STAT_ATTENTION) {
		tape_3590_schedule_work(device, TO_READ_ATTMSG);
		tape_3590_schedule_work(device, TO_READ_ATTMSG);
	else {
	} else {
		DBF_EVENT(3, "unsol.irq! dev end: %08x\n", device->cdev_id);
		DBF_EVENT(3, "unsol.irq! dev end: %08x\n", device->cdev_id);
		PRINT_WARN("Unsolicited IRQ (Device End) caught.\n");
		PRINT_WARN("Unsolicited IRQ (Device End) caught.\n");
		tape_dump_sense(device, NULL, irb);
		tape_dump_sense(device, NULL, irb);
	}
	}
	/* check medium state */
	tape_3590_schedule_work(device, TO_MSEN);
	return TAPE_IO_SUCCESS;
	return TAPE_IO_SUCCESS;
}
}