diff options
author | Cornelia Huck <cornelia.huck@de.ibm.com> | 2008-04-30 07:38:39 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2008-04-30 07:38:45 -0400 |
commit | edf2209692769d3e461c0351553098bc017c2caf (patch) | |
tree | 833d40fbff5e35a06fcd3c55736d20e4e82901f6 /drivers/s390/cio/cio.c | |
parent | 47494f6a84cdae2740b62e1d86a1860df85d9bbb (diff) |
[S390] cio: Make isc handling more robust.
Introduce an ->isc field in the subchannel to store the desired
interruption subclass, since sch->schib.pmcw.isc may be overwritten
by the hardware on stsch() after machine checks.
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/cio/cio.c')
-rw-r--r-- | drivers/s390/cio/cio.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index 23ffcc4768a..08a57816130 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
@@ -407,8 +407,7 @@ cio_modify (struct subchannel *sch) | |||
407 | /* | 407 | /* |
408 | * Enable subchannel. | 408 | * Enable subchannel. |
409 | */ | 409 | */ |
410 | int cio_enable_subchannel(struct subchannel *sch, unsigned int isc, | 410 | int cio_enable_subchannel(struct subchannel *sch, u32 intparm) |
411 | u32 intparm) | ||
412 | { | 411 | { |
413 | char dbf_txt[15]; | 412 | char dbf_txt[15]; |
414 | int ccode; | 413 | int ccode; |
@@ -426,7 +425,7 @@ int cio_enable_subchannel(struct subchannel *sch, unsigned int isc, | |||
426 | 425 | ||
427 | for (retry = 5, ret = 0; retry > 0; retry--) { | 426 | for (retry = 5, ret = 0; retry > 0; retry--) { |
428 | sch->schib.pmcw.ena = 1; | 427 | sch->schib.pmcw.ena = 1; |
429 | sch->schib.pmcw.isc = isc; | 428 | sch->schib.pmcw.isc = sch->isc; |
430 | sch->schib.pmcw.intparm = intparm; | 429 | sch->schib.pmcw.intparm = intparm; |
431 | ret = cio_modify(sch); | 430 | ret = cio_modify(sch); |
432 | if (ret == -ENODEV) | 431 | if (ret == -ENODEV) |
@@ -600,6 +599,7 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid) | |||
600 | else | 599 | else |
601 | sch->opm = chp_get_sch_opm(sch); | 600 | sch->opm = chp_get_sch_opm(sch); |
602 | sch->lpm = sch->schib.pmcw.pam & sch->opm; | 601 | sch->lpm = sch->schib.pmcw.pam & sch->opm; |
602 | sch->isc = 3; | ||
603 | 603 | ||
604 | CIO_DEBUG(KERN_INFO, 0, | 604 | CIO_DEBUG(KERN_INFO, 0, |
605 | "Detected device %04x on subchannel 0.%x.%04X" | 605 | "Detected device %04x on subchannel 0.%x.%04X" |
@@ -610,13 +610,11 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid) | |||
610 | 610 | ||
611 | /* | 611 | /* |
612 | * We now have to initially ... | 612 | * We now have to initially ... |
613 | * ... set "interruption subclass" | ||
614 | * ... enable "concurrent sense" | 613 | * ... enable "concurrent sense" |
615 | * ... enable "multipath mode" if more than one | 614 | * ... enable "multipath mode" if more than one |
616 | * CHPID is available. This is done regardless | 615 | * CHPID is available. This is done regardless |
617 | * whether multiple paths are available for us. | 616 | * whether multiple paths are available for us. |
618 | */ | 617 | */ |
619 | sch->schib.pmcw.isc = 3; /* could be smth. else */ | ||
620 | sch->schib.pmcw.csense = 1; /* concurrent sense */ | 618 | sch->schib.pmcw.csense = 1; /* concurrent sense */ |
621 | sch->schib.pmcw.ena = 0; | 619 | sch->schib.pmcw.ena = 0; |
622 | if ((sch->lpm & (sch->lpm - 1)) != 0) | 620 | if ((sch->lpm & (sch->lpm - 1)) != 0) |
@@ -812,6 +810,7 @@ cio_probe_console(void) | |||
812 | * enable console I/O-interrupt subclass 7 | 810 | * enable console I/O-interrupt subclass 7 |
813 | */ | 811 | */ |
814 | ctl_set_bit(6, 24); | 812 | ctl_set_bit(6, 24); |
813 | console_subchannel.isc = 7; | ||
815 | console_subchannel.schib.pmcw.isc = 7; | 814 | console_subchannel.schib.pmcw.isc = 7; |
816 | console_subchannel.schib.pmcw.intparm = | 815 | console_subchannel.schib.pmcw.intparm = |
817 | (u32)(addr_t)&console_subchannel; | 816 | (u32)(addr_t)&console_subchannel; |