Skip to content

Commit

Permalink
s390/sclp: get rid of common response code handling
Browse files Browse the repository at this point in the history
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: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
  • Loading branch information
Heiko Carstens authored and Martin Schwidefsky committed Feb 8, 2017
1 parent 02407ba commit f694bb3
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 33 deletions.
1 change: 0 additions & 1 deletion drivers/s390/char/sclp.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
27 changes: 11 additions & 16 deletions drivers/s390/char/sclp_early.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
memset(sccb, 0, sizeof(*sccb));
sccb->header.length = sizeof(*sccb);
sccb->header.function_code = 0x80;
sccb->header.control_mask[2] = 0x80;
if (sclp_early_cmd(commands[i], sccb))
break;
if (sccb->header.response_code == 0x10)
return 0;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down
22 changes: 6 additions & 16 deletions drivers/s390/char/sclp_early_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit f694bb3

Please sign in to comment.