s390/cio: Use generalized CCW handler in cp_init()
It is now pretty apparent that ccwchain_handle_ccw() (nee ccwchain_handle_tic()) does everything that cp_init() wants to do. Let's remove that duplicated code from cp_init() and let ccwchain_handle_ccw() handle it itself. Signed-off-by: Eric Farman <farman@linux.ibm.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Message-Id: <20190606202831.44135-5-farman@linux.ibm.com> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
This commit is contained in:
parent
363fe5f7ae
commit
99afcb05d9
@ -744,9 +744,7 @@ static int ccwchain_fetch_one(struct ccwchain *chain,
|
||||
*/
|
||||
int cp_init(struct channel_program *cp, struct device *mdev, union orb *orb)
|
||||
{
|
||||
u64 iova = orb->cmd.cpa;
|
||||
struct ccwchain *chain;
|
||||
int len, ret;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* XXX:
|
||||
@ -759,28 +757,11 @@ int cp_init(struct channel_program *cp, struct device *mdev, union orb *orb)
|
||||
memcpy(&cp->orb, orb, sizeof(*orb));
|
||||
cp->mdev = mdev;
|
||||
|
||||
/* Get chain length. */
|
||||
len = ccwchain_calc_length(iova, cp);
|
||||
if (len < 0)
|
||||
return len;
|
||||
|
||||
/* Alloc mem for the head chain. */
|
||||
chain = ccwchain_alloc(cp, len);
|
||||
if (!chain)
|
||||
return -ENOMEM;
|
||||
chain->ch_iova = iova;
|
||||
|
||||
/* Copy the head chain from guest. */
|
||||
ret = copy_ccw_from_iova(cp, chain->ch_ccw, iova, len);
|
||||
if (ret) {
|
||||
ccwchain_free(chain);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Now loop for its TICs. */
|
||||
ret = ccwchain_loop_tic(chain, cp);
|
||||
/* Build a ccwchain for the first CCW segment */
|
||||
ret = ccwchain_handle_ccw(orb->cmd.cpa, cp);
|
||||
if (ret)
|
||||
cp_free(cp);
|
||||
|
||||
/* It is safe to force: if not set but idals used
|
||||
* ccwchain_calc_length returns an error.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user