Example #1
0
static int __shutdown_subchannel_easy(struct subchannel_id schid, void *data)
{
	struct schib schib;

	if (stsch_reset(schid, &schib))
		return -ENXIO;
	if (!schib.pmcw.ena)
		return 0;
	switch(__disable_subchannel_easy(schid, &schib)) {
	case 0:
	case -ENODEV:
		break;
	default: /* -EBUSY */
		switch (schib.pmcw.st) {
		case SUBCHANNEL_TYPE_IO:
			if (__clear_io_subchannel_easy(schid))
				goto out; /* give up... */
			break;
		case SUBCHANNEL_TYPE_CHSC:
			__clear_chsc_subchannel_easy();
			break;
		default:
			/* No default clear strategy */
			break;
		}
		stsch(schid, &schib);
		__disable_subchannel_easy(schid, &schib);
	}
out:
	return 0;
}
Example #2
0
/* Make sure all subchannels are quiet before we re-ipl an lpar. */
void
reipl(unsigned long devno)
{
	unsigned int schid;

	local_irq_disable();
	for (schid=0;schid<=highest_subchannel;schid++) {
		struct schib schib;
		if (stsch(schid, &schib))
			goto out;
		if (!schib.pmcw.ena)
			continue;
		switch(__disable_subchannel_easy(schid, &schib)) {
		case 0:
		case -ENODEV:
			break;
		default: /* -EBUSY */
			if (__clear_subchannel_easy(schid))
				break; /* give up... */
			stsch(schid, &schib);
			__disable_subchannel_easy(schid, &schib);
		}
	}
out:
	do_reipl(devno);
}
Example #3
0
static int
__shutdown_subchannel_easy(struct subchannel_id schid, void *data)
{
	struct schib schib;

	if (stsch_err(schid, &schib))
		return -ENXIO;
	if (!schib.pmcw.ena)
		return 0;
	switch(__disable_subchannel_easy(schid, &schib)) {
	case 0:
	case -ENODEV:
		break;
	default: /* -EBUSY */
		if (__clear_subchannel_easy(schid))
			break; /* give up... */
		stsch(schid, &schib);
		__disable_subchannel_easy(schid, &schib);
	}
	return 0;
}
Example #4
0
/* Clear all subchannels. */
void
clear_all_subchannels(void)
{
	unsigned int schid;

	local_irq_disable();
	for (schid=0;schid<=highest_subchannel;schid++) {
		struct schib schib;
		if (stsch(schid, &schib))
			break; /* break out of the loop */
		if (!schib.pmcw.ena)
			continue;
		switch(__disable_subchannel_easy(schid, &schib)) {
		case 0:
		case -ENODEV:
			break;
		default: /* -EBUSY */
			if (__clear_subchannel_easy(schid))
				break; /* give up... jump out of switch */
			stsch(schid, &schib);
			__disable_subchannel_easy(schid, &schib);
		}
	}
}