123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- /*
- * 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 */
- }
|