mirror of
https://github.com/qemu/qemu.git
synced 2025-08-09 10:25:06 +00:00
s390x/css: use SubchDev.orb
Instead of passing around a pointer to ORB let us simplify some function signatures by using the previously introduced ORB saved at the subchannel (SubchDev). Signed-off-by: Halil Pasic <pasic@linux.vnet.ibm.com> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> Message-Id: <20170711145441.33925-7-pasic@linux.vnet.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
This commit is contained in:
parent
e996583eb3
commit
b5f5a3afb6
@ -909,7 +909,7 @@ static int css_interpret_ccw(SubchDev *sch, hwaddr ccw_addr,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sch_handle_start_func_virtual(SubchDev *sch, ORB *orb)
|
static void sch_handle_start_func_virtual(SubchDev *sch)
|
||||||
{
|
{
|
||||||
|
|
||||||
PMCW *p = &sch->curr_status.pmcw;
|
PMCW *p = &sch->curr_status.pmcw;
|
||||||
@ -923,10 +923,10 @@ static void sch_handle_start_func_virtual(SubchDev *sch, ORB *orb)
|
|||||||
|
|
||||||
if (!(s->ctrl & SCSW_ACTL_SUSP)) {
|
if (!(s->ctrl & SCSW_ACTL_SUSP)) {
|
||||||
/* Start Function triggered via ssch, i.e. we have an ORB */
|
/* Start Function triggered via ssch, i.e. we have an ORB */
|
||||||
|
ORB *orb = &sch->orb;
|
||||||
s->cstat = 0;
|
s->cstat = 0;
|
||||||
s->dstat = 0;
|
s->dstat = 0;
|
||||||
/* Look at the orb and try to execute the channel program. */
|
/* Look at the orb and try to execute the channel program. */
|
||||||
assert(orb != NULL); /* resume does not pass an orb */
|
|
||||||
p->intparm = orb->intparm;
|
p->intparm = orb->intparm;
|
||||||
if (!(orb->lpm & path)) {
|
if (!(orb->lpm & path)) {
|
||||||
/* Generate a deferred cc 3 condition. */
|
/* Generate a deferred cc 3 condition. */
|
||||||
@ -940,8 +940,7 @@ static void sch_handle_start_func_virtual(SubchDev *sch, ORB *orb)
|
|||||||
sch->ccw_no_data_cnt = 0;
|
sch->ccw_no_data_cnt = 0;
|
||||||
suspend_allowed = !!(orb->ctrl0 & ORB_CTRL0_MASK_SPND);
|
suspend_allowed = !!(orb->ctrl0 & ORB_CTRL0_MASK_SPND);
|
||||||
} else {
|
} else {
|
||||||
/* Start Function resumed via rsch, i.e. we don't have an
|
/* Start Function resumed via rsch */
|
||||||
* ORB */
|
|
||||||
s->ctrl &= ~(SCSW_ACTL_SUSP | SCSW_ACTL_RESUME_PEND);
|
s->ctrl &= ~(SCSW_ACTL_SUSP | SCSW_ACTL_RESUME_PEND);
|
||||||
/* The channel program had been suspended before. */
|
/* The channel program had been suspended before. */
|
||||||
suspend_allowed = true;
|
suspend_allowed = true;
|
||||||
@ -1011,13 +1010,14 @@ static void sch_handle_start_func_virtual(SubchDev *sch, ORB *orb)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sch_handle_start_func_passthrough(SubchDev *sch, ORB *orb)
|
static int sch_handle_start_func_passthrough(SubchDev *sch)
|
||||||
{
|
{
|
||||||
|
|
||||||
PMCW *p = &sch->curr_status.pmcw;
|
PMCW *p = &sch->curr_status.pmcw;
|
||||||
SCSW *s = &sch->curr_status.scsw;
|
SCSW *s = &sch->curr_status.scsw;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
ORB *orb = &sch->orb;
|
||||||
if (!(s->ctrl & SCSW_ACTL_SUSP)) {
|
if (!(s->ctrl & SCSW_ACTL_SUSP)) {
|
||||||
assert(orb != NULL);
|
assert(orb != NULL);
|
||||||
p->intparm = orb->intparm;
|
p->intparm = orb->intparm;
|
||||||
@ -1062,7 +1062,7 @@ static int sch_handle_start_func_passthrough(SubchDev *sch, ORB *orb)
|
|||||||
* read/writes) asynchronous later on if we start supporting more than
|
* read/writes) asynchronous later on if we start supporting more than
|
||||||
* our current very simple devices.
|
* our current very simple devices.
|
||||||
*/
|
*/
|
||||||
int do_subchannel_work_virtual(SubchDev *sch, ORB *orb)
|
int do_subchannel_work_virtual(SubchDev *sch)
|
||||||
{
|
{
|
||||||
|
|
||||||
SCSW *s = &sch->curr_status.scsw;
|
SCSW *s = &sch->curr_status.scsw;
|
||||||
@ -1073,7 +1073,7 @@ int do_subchannel_work_virtual(SubchDev *sch, ORB *orb)
|
|||||||
sch_handle_halt_func(sch);
|
sch_handle_halt_func(sch);
|
||||||
} else if (s->ctrl & SCSW_FCTL_START_FUNC) {
|
} else if (s->ctrl & SCSW_FCTL_START_FUNC) {
|
||||||
/* Triggered by both ssch and rsch. */
|
/* Triggered by both ssch and rsch. */
|
||||||
sch_handle_start_func_virtual(sch, orb);
|
sch_handle_start_func_virtual(sch);
|
||||||
} else {
|
} else {
|
||||||
/* Cannot happen. */
|
/* Cannot happen. */
|
||||||
return 0;
|
return 0;
|
||||||
@ -1082,7 +1082,7 @@ int do_subchannel_work_virtual(SubchDev *sch, ORB *orb)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int do_subchannel_work_passthrough(SubchDev *sch, ORB *orb)
|
int do_subchannel_work_passthrough(SubchDev *sch)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
SCSW *s = &sch->curr_status.scsw;
|
SCSW *s = &sch->curr_status.scsw;
|
||||||
@ -1096,7 +1096,7 @@ int do_subchannel_work_passthrough(SubchDev *sch, ORB *orb)
|
|||||||
sch_handle_halt_func(sch);
|
sch_handle_halt_func(sch);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
} else if (s->ctrl & SCSW_FCTL_START_FUNC) {
|
} else if (s->ctrl & SCSW_FCTL_START_FUNC) {
|
||||||
ret = sch_handle_start_func_passthrough(sch, orb);
|
ret = sch_handle_start_func_passthrough(sch);
|
||||||
} else {
|
} else {
|
||||||
/* Cannot happen. */
|
/* Cannot happen. */
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
@ -1105,10 +1105,10 @@ int do_subchannel_work_passthrough(SubchDev *sch, ORB *orb)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int do_subchannel_work(SubchDev *sch, ORB *orb)
|
static int do_subchannel_work(SubchDev *sch)
|
||||||
{
|
{
|
||||||
if (sch->do_subchannel_work) {
|
if (sch->do_subchannel_work) {
|
||||||
return sch->do_subchannel_work(sch, orb);
|
return sch->do_subchannel_work(sch);
|
||||||
} else {
|
} else {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
@ -1315,7 +1315,7 @@ int css_do_csch(SubchDev *sch)
|
|||||||
s->ctrl &= ~(SCSW_CTRL_MASK_FCTL | SCSW_CTRL_MASK_ACTL);
|
s->ctrl &= ~(SCSW_CTRL_MASK_FCTL | SCSW_CTRL_MASK_ACTL);
|
||||||
s->ctrl |= SCSW_FCTL_CLEAR_FUNC | SCSW_ACTL_CLEAR_PEND;
|
s->ctrl |= SCSW_FCTL_CLEAR_FUNC | SCSW_ACTL_CLEAR_PEND;
|
||||||
|
|
||||||
do_subchannel_work(sch, NULL);
|
do_subchannel_work(sch);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
@ -1356,7 +1356,7 @@ int css_do_hsch(SubchDev *sch)
|
|||||||
}
|
}
|
||||||
s->ctrl |= SCSW_ACTL_HALT_PEND;
|
s->ctrl |= SCSW_ACTL_HALT_PEND;
|
||||||
|
|
||||||
do_subchannel_work(sch, NULL);
|
do_subchannel_work(sch);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
@ -1431,7 +1431,7 @@ int css_do_ssch(SubchDev *sch, ORB *orb)
|
|||||||
s->ctrl |= (SCSW_FCTL_START_FUNC | SCSW_ACTL_START_PEND);
|
s->ctrl |= (SCSW_FCTL_START_FUNC | SCSW_ACTL_START_PEND);
|
||||||
s->flags &= ~SCSW_FLAGS_MASK_PNO;
|
s->flags &= ~SCSW_FLAGS_MASK_PNO;
|
||||||
|
|
||||||
ret = do_subchannel_work(sch, orb);
|
ret = do_subchannel_work(sch);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return ret;
|
return ret;
|
||||||
@ -1710,7 +1710,7 @@ int css_do_rsch(SubchDev *sch)
|
|||||||
}
|
}
|
||||||
|
|
||||||
s->ctrl |= SCSW_ACTL_RESUME_PEND;
|
s->ctrl |= SCSW_ACTL_RESUME_PEND;
|
||||||
do_subchannel_work(sch, NULL);
|
do_subchannel_work(sch);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -94,7 +94,7 @@ struct SubchDev {
|
|||||||
/* transport-provided data: */
|
/* transport-provided data: */
|
||||||
int (*ccw_cb) (SubchDev *, CCW1);
|
int (*ccw_cb) (SubchDev *, CCW1);
|
||||||
void (*disable_cb)(SubchDev *);
|
void (*disable_cb)(SubchDev *);
|
||||||
int (*do_subchannel_work) (SubchDev *, ORB *);
|
int (*do_subchannel_work) (SubchDev *);
|
||||||
SenseId id;
|
SenseId id;
|
||||||
void *driver_data;
|
void *driver_data;
|
||||||
};
|
};
|
||||||
@ -157,8 +157,8 @@ void css_generate_chp_crws(uint8_t cssid, uint8_t chpid);
|
|||||||
void css_generate_css_crws(uint8_t cssid);
|
void css_generate_css_crws(uint8_t cssid);
|
||||||
void css_clear_sei_pending(void);
|
void css_clear_sei_pending(void);
|
||||||
int s390_ccw_cmd_request(ORB *orb, SCSW *scsw, void *data);
|
int s390_ccw_cmd_request(ORB *orb, SCSW *scsw, void *data);
|
||||||
int do_subchannel_work_virtual(SubchDev *sub, ORB *orb);
|
int do_subchannel_work_virtual(SubchDev *sub);
|
||||||
int do_subchannel_work_passthrough(SubchDev *sub, ORB *orb);
|
int do_subchannel_work_passthrough(SubchDev *sub);
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CSS_IO_ADAPTER_VIRTIO = 0,
|
CSS_IO_ADAPTER_VIRTIO = 0,
|
||||||
|
Loading…
Reference in New Issue
Block a user