|
@@ -105,7 +105,10 @@ static int pfn_array_alloc_pin(struct pfn_array *pa, struct device *mdev,
|
|
|
{
|
|
|
int ret = 0;
|
|
|
|
|
|
- if (!len || pa->pa_nr)
|
|
|
+ if (!len)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if (pa->pa_nr)
|
|
|
return -EINVAL;
|
|
|
|
|
|
pa->pa_iova = iova;
|
|
@@ -501,6 +504,16 @@ static int ccwchain_fetch_direct(struct ccwchain *chain,
|
|
|
|
|
|
ccw = chain->ch_ccw + idx;
|
|
|
|
|
|
+ if (!ccw->count) {
|
|
|
+ /*
|
|
|
+ * We just want the translation result of any direct ccw
|
|
|
+ * to be an IDA ccw, so let's add the IDA flag for it.
|
|
|
+ * Although the flag will be ignored by firmware.
|
|
|
+ */
|
|
|
+ ccw->flags |= CCW_FLAG_IDA;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* Pin data page(s) in memory.
|
|
|
* The number of pages actually is the count of the idaws which will be
|
|
@@ -541,6 +554,9 @@ static int ccwchain_fetch_idal(struct ccwchain *chain,
|
|
|
|
|
|
ccw = chain->ch_ccw + idx;
|
|
|
|
|
|
+ if (!ccw->count)
|
|
|
+ return 0;
|
|
|
+
|
|
|
/* Calculate size of idaws. */
|
|
|
ret = copy_from_iova(cp->mdev, &idaw_iova, ccw->cda, sizeof(idaw_iova));
|
|
|
if (ret)
|
|
@@ -569,10 +585,6 @@ static int ccwchain_fetch_idal(struct ccwchain *chain,
|
|
|
|
|
|
for (i = 0; i < idaw_nr; i++) {
|
|
|
idaw_iova = *(idaws + i);
|
|
|
- if (IS_ERR_VALUE(idaw_iova)) {
|
|
|
- ret = -EFAULT;
|
|
|
- goto out_free_idaws;
|
|
|
- }
|
|
|
|
|
|
ret = pfn_array_alloc_pin(pat->pat_pa + i, cp->mdev,
|
|
|
idaw_iova, 1);
|