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; }
/* 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); }
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; }
/* 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); } } }