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

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
...@@ -224,7 +224,6 @@ extern unsigned long sclp_console_full; ...@@ -224,7 +224,6 @@ extern unsigned long sclp_console_full;
extern char sclp_early_sccb[PAGE_SIZE]; extern char sclp_early_sccb[PAGE_SIZE];
void sclp_early_wait_irq(void); 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); int sclp_early_cmd(sclp_cmdw_t cmd, void *sccb);
unsigned int sclp_early_con_check_linemode(struct init_sccb *sccb); unsigned int sclp_early_con_check_linemode(struct init_sccb *sccb);
int sclp_early_set_event_mask(struct init_sccb *sccb, int sclp_early_set_event_mask(struct init_sccb *sccb,
......
...@@ -62,20 +62,16 @@ EXPORT_SYMBOL(sclp); ...@@ -62,20 +62,16 @@ EXPORT_SYMBOL(sclp);
static int __init sclp_early_read_info(struct read_info_sccb *sccb) 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_t commands[] = {SCLP_CMDW_READ_SCP_INFO_FORCED,
SCLP_CMDW_READ_SCP_INFO}; SCLP_CMDW_READ_SCP_INFO};
for (i = 0; i < ARRAY_SIZE(commands); i++) { for (i = 0; i < ARRAY_SIZE(commands); i++) {
do { memset(sccb, 0, sizeof(*sccb));
memset(sccb, 0, sizeof(*sccb)); sccb->header.length = sizeof(*sccb);
sccb->header.length = sizeof(*sccb); sccb->header.function_code = 0x80;
sccb->header.function_code = 0x80; sccb->header.control_mask[2] = 0x80;
sccb->header.control_mask[2] = 0x80; if (sclp_early_cmd(commands[i], sccb))
rc = sclp_early_cmd_sync(commands[i], sccb);
} while (rc == -EBUSY);
if (rc)
break; break;
if (sccb->header.response_code == 0x10) if (sccb->header.response_code == 0x10)
return 0; return 0;
...@@ -167,16 +163,11 @@ static int sclp_early_core_info_valid __initdata; ...@@ -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) static void __init sclp_early_init_core_info(struct read_cpu_info_sccb *sccb)
{ {
int rc;
if (!SCLP_HAS_CPU_INFO) if (!SCLP_HAS_CPU_INFO)
return; return;
memset(sccb, 0, sizeof(*sccb)); memset(sccb, 0, sizeof(*sccb));
sccb->header.length = sizeof(*sccb); sccb->header.length = sizeof(*sccb);
do { if (sclp_early_cmd(SCLP_CMDW_READ_CPU_INFO, sccb))
rc = sclp_early_cmd_sync(SCLP_CMDW_READ_CPU_INFO, sccb);
} while (rc == -EBUSY);
if (rc)
return; return;
if (sccb->header.response_code != 0x0010) if (sccb->header.response_code != 0x0010)
return; return;
...@@ -204,6 +195,8 @@ static long __init sclp_early_hsa_size_init(struct sdias_sccb *sccb) ...@@ -204,6 +195,8 @@ static long __init sclp_early_hsa_size_init(struct sdias_sccb *sccb)
sccb->evbuf.dbs = 1; sccb->evbuf.dbs = 1;
if (sclp_early_cmd(SCLP_CMDW_WRITE_EVENT_DATA, sccb)) if (sclp_early_cmd(SCLP_CMDW_WRITE_EVENT_DATA, sccb))
return -EIO; return -EIO;
if (sccb->hdr.response_code != 0x20)
return -EIO;
if (sccb->evbuf.blk_cnt == 0) if (sccb->evbuf.blk_cnt == 0)
return 0; return 0;
return (sccb->evbuf.blk_cnt - 1) * PAGE_SIZE; return (sccb->evbuf.blk_cnt - 1) * PAGE_SIZE;
...@@ -215,6 +208,8 @@ static long __init sclp_early_hsa_copy_wait(struct sdias_sccb *sccb) ...@@ -215,6 +208,8 @@ static long __init sclp_early_hsa_copy_wait(struct sdias_sccb *sccb)
sccb->hdr.length = PAGE_SIZE; sccb->hdr.length = PAGE_SIZE;
if (sclp_early_cmd(SCLP_CMDW_READ_EVENT_DATA, sccb)) if (sclp_early_cmd(SCLP_CMDW_READ_EVENT_DATA, sccb))
return -EIO; return -EIO;
if ((sccb->hdr.response_code != 0x20) && (sccb->hdr.response_code != 0x220))
return -EIO;
if (sccb->evbuf.blk_cnt == 0) if (sccb->evbuf.blk_cnt == 0)
return 0; return 0;
return (sccb->evbuf.blk_cnt - 1) * PAGE_SIZE; return (sccb->evbuf.blk_cnt - 1) * PAGE_SIZE;
......
...@@ -50,7 +50,7 @@ void sclp_early_wait_irq(void) ...@@ -50,7 +50,7 @@ void sclp_early_wait_irq(void)
__ctl_load(cr0.val, 0, 0); __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; unsigned long flags;
int rc; int rc;
...@@ -65,20 +65,6 @@ int sclp_early_cmd_sync(sclp_cmdw_t cmd, void *sccb) ...@@ -65,20 +65,6 @@ int sclp_early_cmd_sync(sclp_cmdw_t cmd, void *sccb)
return rc; 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 write_sccb {
struct sccb_header header; struct sccb_header header;
struct msg_buf msg; struct msg_buf msg;
...@@ -163,7 +149,11 @@ int sclp_early_set_event_mask(struct init_sccb *sccb, ...@@ -163,7 +149,11 @@ int sclp_early_set_event_mask(struct init_sccb *sccb,
sccb->mask_length = sizeof(sccb_mask_t); sccb->mask_length = sizeof(sccb_mask_t);
sccb->receive_mask = receive_mask; sccb->receive_mask = receive_mask;
sccb->send_mask = send_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) unsigned int sclp_early_con_check_linemode(struct init_sccb *sccb)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment