|  | /* | 
|  | *  drivers/s390/char/sclp_info.c | 
|  | * | 
|  | *    Copyright IBM Corp. 2007 | 
|  | *    Author(s): Heiko Carstens <heiko.carstens@de.ibm.com> | 
|  | */ | 
|  |  | 
|  | #include <linux/init.h> | 
|  | #include <linux/errno.h> | 
|  | #include <linux/string.h> | 
|  | #include <asm/sclp.h> | 
|  | #include "sclp.h" | 
|  |  | 
|  | struct sclp_readinfo_sccb s390_readinfo_sccb; | 
|  |  | 
|  | void __init sclp_readinfo_early(void) | 
|  | { | 
|  | sclp_cmdw_t command; | 
|  | struct sccb_header *sccb; | 
|  | int ret; | 
|  |  | 
|  | __ctl_set_bit(0, 9); /* enable service signal subclass mask */ | 
|  |  | 
|  | sccb = &s390_readinfo_sccb.header; | 
|  | command = SCLP_CMDW_READ_SCP_INFO_FORCED; | 
|  | while (1) { | 
|  | u16 response; | 
|  |  | 
|  | memset(&s390_readinfo_sccb, 0, sizeof(s390_readinfo_sccb)); | 
|  | sccb->length = sizeof(s390_readinfo_sccb); | 
|  | sccb->control_mask[2] = 0x80; | 
|  |  | 
|  | ret = sclp_service_call(command, &s390_readinfo_sccb); | 
|  |  | 
|  | if (ret == -EIO) | 
|  | goto out; | 
|  | if (ret == -EBUSY) | 
|  | continue; | 
|  |  | 
|  | __load_psw_mask(PSW_BASE_BITS | PSW_MASK_EXT | | 
|  | PSW_MASK_WAIT | PSW_DEFAULT_KEY); | 
|  | local_irq_disable(); | 
|  | barrier(); | 
|  |  | 
|  | response = sccb->response_code; | 
|  |  | 
|  | if (response == 0x10) | 
|  | break; | 
|  |  | 
|  | if (response != 0x1f0 || command == SCLP_CMDW_READ_SCP_INFO) | 
|  | break; | 
|  |  | 
|  | command = SCLP_CMDW_READ_SCP_INFO; | 
|  | } | 
|  | out: | 
|  | __ctl_clear_bit(0, 9); /* disable service signal subclass mask */ | 
|  | } |