kfree((void *)(u64)ccw->cda);
 }
 
-/* Unpin the pages then free the memory resources. */
-static void cp_unpin_free(struct channel_program *cp)
-{
-       struct ccwchain *chain, *temp;
-       int i;
-
-       cp->initialized = false;
-       list_for_each_entry_safe(chain, temp, &cp->ccwchain_list, next) {
-               for (i = 0; i < chain->ch_len; i++) {
-                       pfn_array_table_unpin_free(chain->ch_pat + i,
-                                                  cp->mdev);
-                       ccwchain_cda_free(chain, i);
-               }
-               ccwchain_free(chain);
-       }
-}
-
 /**
  * ccwchain_calc_length - calculate the length of the ccw chain.
  * @iova: guest physical address of the target ccw chain
        /* Now loop for its TICs. */
        ret = ccwchain_loop_tic(chain, cp);
        if (ret)
-               cp_unpin_free(cp);
+               cp_free(cp);
        /* It is safe to force: if not set but idals used
         * ccwchain_calc_length returns an error.
         */
  */
 void cp_free(struct channel_program *cp)
 {
-       if (cp->initialized)
-               cp_unpin_free(cp);
+       struct ccwchain *chain, *temp;
+       int i;
+
+       if (!cp->initialized)
+               return;
+
+       cp->initialized = false;
+       list_for_each_entry_safe(chain, temp, &cp->ccwchain_list, next) {
+               for (i = 0; i < chain->ch_len; i++) {
+                       pfn_array_table_unpin_free(chain->ch_pat + i,
+                                                  cp->mdev);
+                       ccwchain_cda_free(chain, i);
+               }
+               ccwchain_free(chain);
+       }
 }
 
 /**