Commit b5f5a3af authored by Halil Pasic's avatar Halil Pasic Committed by Christian Borntraeger
Browse files

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: default avatarHalil Pasic <pasic@linux.vnet.ibm.com>
Reviewed-by: default avatarCornelia Huck <cornelia.huck@de.ibm.com>
Message-Id: <20170711145441.33925-7-pasic@linux.vnet.ibm.com>
Signed-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
parent e996583e
Loading
Loading
Loading
Loading
+15 −15
Original line number Diff line number Diff line
@@ -909,7 +909,7 @@ static int css_interpret_ccw(SubchDev *sch, hwaddr ccw_addr,
    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;
@@ -923,10 +923,10 @@ static void sch_handle_start_func_virtual(SubchDev *sch, ORB *orb)

    if (!(s->ctrl & SCSW_ACTL_SUSP)) {
        /* Start Function triggered via ssch, i.e. we have an ORB */
        ORB *orb = &sch->orb;
        s->cstat = 0;
        s->dstat = 0;
        /* Look at the orb and try to execute the channel program. */
        assert(orb != NULL); /* resume does not pass an orb */
        p->intparm = orb->intparm;
        if (!(orb->lpm & path)) {
            /* 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;
        suspend_allowed = !!(orb->ctrl0 & ORB_CTRL0_MASK_SPND);
    } else {
        /* Start Function resumed via rsch, i.e. we don't have an
         * ORB */
        /* Start Function resumed via rsch */
        s->ctrl &= ~(SCSW_ACTL_SUSP | SCSW_ACTL_RESUME_PEND);
        /* The channel program had been suspended before. */
        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;
    SCSW *s = &sch->curr_status.scsw;
    int ret;

    ORB *orb = &sch->orb;
    if (!(s->ctrl & SCSW_ACTL_SUSP)) {
        assert(orb != NULL);
        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
 * 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;
@@ -1073,7 +1073,7 @@ int do_subchannel_work_virtual(SubchDev *sch, ORB *orb)
        sch_handle_halt_func(sch);
    } else if (s->ctrl & SCSW_FCTL_START_FUNC) {
        /* Triggered by both ssch and rsch. */
        sch_handle_start_func_virtual(sch, orb);
        sch_handle_start_func_virtual(sch);
    } else {
        /* Cannot happen. */
        return 0;
@@ -1082,7 +1082,7 @@ int do_subchannel_work_virtual(SubchDev *sch, ORB *orb)
    return 0;
}

int do_subchannel_work_passthrough(SubchDev *sch, ORB *orb)
int do_subchannel_work_passthrough(SubchDev *sch)
{
    int ret;
    SCSW *s = &sch->curr_status.scsw;
@@ -1096,7 +1096,7 @@ int do_subchannel_work_passthrough(SubchDev *sch, ORB *orb)
        sch_handle_halt_func(sch);
        ret = 0;
    } else if (s->ctrl & SCSW_FCTL_START_FUNC) {
        ret = sch_handle_start_func_passthrough(sch, orb);
        ret = sch_handle_start_func_passthrough(sch);
    } else {
        /* Cannot happen. */
        return -ENODEV;
@@ -1105,10 +1105,10 @@ int do_subchannel_work_passthrough(SubchDev *sch, ORB *orb)
    return ret;
}

static int do_subchannel_work(SubchDev *sch, ORB *orb)
static int do_subchannel_work(SubchDev *sch)
{
    if (sch->do_subchannel_work) {
        return sch->do_subchannel_work(sch, orb);
        return sch->do_subchannel_work(sch);
    } else {
        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_FCTL_CLEAR_FUNC | SCSW_ACTL_CLEAR_PEND;

    do_subchannel_work(sch, NULL);
    do_subchannel_work(sch);
    ret = 0;

out:
@@ -1356,7 +1356,7 @@ int css_do_hsch(SubchDev *sch)
    }
    s->ctrl |= SCSW_ACTL_HALT_PEND;

    do_subchannel_work(sch, NULL);
    do_subchannel_work(sch);
    ret = 0;

out:
@@ -1431,7 +1431,7 @@ int css_do_ssch(SubchDev *sch, ORB *orb)
    s->ctrl |= (SCSW_FCTL_START_FUNC | SCSW_ACTL_START_PEND);
    s->flags &= ~SCSW_FLAGS_MASK_PNO;

    ret = do_subchannel_work(sch, orb);
    ret = do_subchannel_work(sch);

out:
    return ret;
@@ -1710,7 +1710,7 @@ int css_do_rsch(SubchDev *sch)
    }

    s->ctrl |= SCSW_ACTL_RESUME_PEND;
    do_subchannel_work(sch, NULL);
    do_subchannel_work(sch);
    ret = 0;

out:
+3 −3
Original line number Diff line number Diff line
@@ -94,7 +94,7 @@ struct SubchDev {
    /* transport-provided data: */
    int (*ccw_cb) (SubchDev *, CCW1);
    void (*disable_cb)(SubchDev *);
    int (*do_subchannel_work) (SubchDev *, ORB *);
    int (*do_subchannel_work) (SubchDev *);
    SenseId id;
    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_clear_sei_pending(void);
int s390_ccw_cmd_request(ORB *orb, SCSW *scsw, void *data);
int do_subchannel_work_virtual(SubchDev *sub, ORB *orb);
int do_subchannel_work_passthrough(SubchDev *sub, ORB *orb);
int do_subchannel_work_virtual(SubchDev *sub);
int do_subchannel_work_passthrough(SubchDev *sub);

typedef enum {
    CSS_IO_ADAPTER_VIRTIO = 0,