*/
 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:
        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.
         */