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

Commit f694bb3a authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky
Browse files

s390/sclp: get rid of common response code handling



Get rid of common response code handling. Each command requires its
own response code handling anyway. Also the retry in case of -EBUSY
does not work and can be simply removed.

Reviewed-by: default avatarPeter Oberparleiter <oberpar@linux.vnet.ibm.com>
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 02407baa
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -224,7 +224,6 @@ extern unsigned long sclp_console_full;
extern char sclp_early_sccb[PAGE_SIZE];

void sclp_early_wait_irq(void);
int sclp_early_cmd_sync(sclp_cmdw_t cmd, void *sccb);
int sclp_early_cmd(sclp_cmdw_t cmd, void *sccb);
unsigned int sclp_early_con_check_linemode(struct init_sccb *sccb);
int sclp_early_set_event_mask(struct init_sccb *sccb,
+11 −16
Original line number Diff line number Diff line
@@ -62,20 +62,16 @@ EXPORT_SYMBOL(sclp);

static int __init sclp_early_read_info(struct read_info_sccb *sccb)
{
	int rc, i;
	int i;
	sclp_cmdw_t commands[] = {SCLP_CMDW_READ_SCP_INFO_FORCED,
				  SCLP_CMDW_READ_SCP_INFO};

	for (i = 0; i < ARRAY_SIZE(commands); i++) {
		do {
		memset(sccb, 0, sizeof(*sccb));
		sccb->header.length = sizeof(*sccb);
		sccb->header.function_code = 0x80;
		sccb->header.control_mask[2] = 0x80;
			rc = sclp_early_cmd_sync(commands[i], sccb);
		} while (rc == -EBUSY);

		if (rc)
		if (sclp_early_cmd(commands[i], sccb))
			break;
		if (sccb->header.response_code == 0x10)
			return 0;
@@ -167,16 +163,11 @@ static int sclp_early_core_info_valid __initdata;

static void __init sclp_early_init_core_info(struct read_cpu_info_sccb *sccb)
{
	int rc;

	if (!SCLP_HAS_CPU_INFO)
		return;
	memset(sccb, 0, sizeof(*sccb));
	sccb->header.length = sizeof(*sccb);
	do {
		rc = sclp_early_cmd_sync(SCLP_CMDW_READ_CPU_INFO, sccb);
	} while (rc == -EBUSY);
	if (rc)
	if (sclp_early_cmd(SCLP_CMDW_READ_CPU_INFO, sccb))
		return;
	if (sccb->header.response_code != 0x0010)
		return;
@@ -204,6 +195,8 @@ static long __init sclp_early_hsa_size_init(struct sdias_sccb *sccb)
	sccb->evbuf.dbs = 1;
	if (sclp_early_cmd(SCLP_CMDW_WRITE_EVENT_DATA, sccb))
		return -EIO;
	if (sccb->hdr.response_code != 0x20)
		return -EIO;
	if (sccb->evbuf.blk_cnt == 0)
		return 0;
	return (sccb->evbuf.blk_cnt - 1) * PAGE_SIZE;
@@ -215,6 +208,8 @@ static long __init sclp_early_hsa_copy_wait(struct sdias_sccb *sccb)
	sccb->hdr.length = PAGE_SIZE;
	if (sclp_early_cmd(SCLP_CMDW_READ_EVENT_DATA, sccb))
		return -EIO;
	if ((sccb->hdr.response_code != 0x20) && (sccb->hdr.response_code != 0x220))
		return -EIO;
	if (sccb->evbuf.blk_cnt == 0)
		return 0;
	return (sccb->evbuf.blk_cnt - 1) * PAGE_SIZE;
+6 −16
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@ void sclp_early_wait_irq(void)
	__ctl_load(cr0.val, 0, 0);
}

int sclp_early_cmd_sync(sclp_cmdw_t cmd, void *sccb)
int sclp_early_cmd(sclp_cmdw_t cmd, void *sccb)
{
	unsigned long flags;
	int rc;
@@ -65,20 +65,6 @@ int sclp_early_cmd_sync(sclp_cmdw_t cmd, void *sccb)
	return rc;
}

int sclp_early_cmd(sclp_cmdw_t cmd, void *sccb)
{
	int rc;

	do {
		rc = sclp_early_cmd_sync(cmd, sccb);
	} while (rc == -EBUSY);
	if (rc)
		return -EIO;
	if (((struct sccb_header *) sccb)->response_code != 0x0020)
		return -EIO;
	return 0;
}

struct write_sccb {
	struct sccb_header header;
	struct msg_buf msg;
@@ -163,7 +149,11 @@ int sclp_early_set_event_mask(struct init_sccb *sccb,
	sccb->mask_length = sizeof(sccb_mask_t);
	sccb->receive_mask = receive_mask;
	sccb->send_mask = send_mask;
	return sclp_early_cmd(SCLP_CMDW_WRITE_EVENT_MASK, sccb);
	if (sclp_early_cmd(SCLP_CMDW_WRITE_EVENT_MASK, sccb))
		return -EIO;
	if (sccb->header.response_code != 0x20)
		return -EIO;
	return 0;
}

unsigned int sclp_early_con_check_linemode(struct init_sccb *sccb)