|
@@ -880,19 +880,15 @@ static void cio_reset_pgm_check_handler(void)
|
|
static int stsch_reset(struct subchannel_id schid, volatile struct schib *addr)
|
|
static int stsch_reset(struct subchannel_id schid, volatile struct schib *addr)
|
|
{
|
|
{
|
|
int rc;
|
|
int rc;
|
|
- register struct subchannel_id reg1 asm ("1") = schid;
|
|
|
|
|
|
|
|
pgm_check_occured = 0;
|
|
pgm_check_occured = 0;
|
|
s390_reset_pgm_handler = cio_reset_pgm_check_handler;
|
|
s390_reset_pgm_handler = cio_reset_pgm_check_handler;
|
|
|
|
+ rc = stsch(schid, addr);
|
|
|
|
+ s390_reset_pgm_handler = NULL;
|
|
|
|
|
|
- asm volatile(
|
|
|
|
- " stsch 0(%2)\n"
|
|
|
|
- " ipm %0\n"
|
|
|
|
- " srl %0,28"
|
|
|
|
- : "=d" (rc)
|
|
|
|
- : "d" (reg1), "a" (addr), "m" (*addr) : "memory", "cc");
|
|
|
|
|
|
+ /* The program check handler could have changed pgm_check_occured */
|
|
|
|
+ barrier();
|
|
|
|
|
|
- s390_reset_pgm_handler = NULL;
|
|
|
|
if (pgm_check_occured)
|
|
if (pgm_check_occured)
|
|
return -EIO;
|
|
return -EIO;
|
|
else
|
|
else
|