aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/rpmsg/qcom_glink_native.c3
-rw-r--r--drivers/rpmsg/qcom_glink_smem.c14
-rw-r--r--drivers/rpmsg/qcom_smd.c9
-rw-r--r--drivers/rpmsg/rpmsg_char.c27
4 files changed, 27 insertions, 26 deletions
diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c
index e2ce4e638258..f46c787733e8 100644
--- a/drivers/rpmsg/qcom_glink_native.c
+++ b/drivers/rpmsg/qcom_glink_native.c
@@ -792,9 +792,6 @@ static int qcom_glink_rx_data(struct qcom_glink *glink, size_t avail)
792 return -EAGAIN; 792 return -EAGAIN;
793 } 793 }
794 794
795 if (WARN(chunk_size % 4, "Incoming data must be word aligned\n"))
796 return -EINVAL;
797
798 rcid = le16_to_cpu(hdr.msg.param1); 795 rcid = le16_to_cpu(hdr.msg.param1);
799 spin_lock_irqsave(&glink->idr_lock, flags); 796 spin_lock_irqsave(&glink->idr_lock, flags);
800 channel = idr_find(&glink->rcids, rcid); 797 channel = idr_find(&glink->rcids, rcid);
diff --git a/drivers/rpmsg/qcom_glink_smem.c b/drivers/rpmsg/qcom_glink_smem.c
index 2b5cf2790954..64a5ce324c7f 100644
--- a/drivers/rpmsg/qcom_glink_smem.c
+++ b/drivers/rpmsg/qcom_glink_smem.c
@@ -89,15 +89,11 @@ static void glink_smem_rx_peak(struct qcom_glink_pipe *np,
89 tail -= pipe->native.length; 89 tail -= pipe->native.length;
90 90
91 len = min_t(size_t, count, pipe->native.length - tail); 91 len = min_t(size_t, count, pipe->native.length - tail);
92 if (len) { 92 if (len)
93 __ioread32_copy(data, pipe->fifo + tail, 93 memcpy_fromio(data, pipe->fifo + tail, len);
94 len / sizeof(u32));
95 }
96 94
97 if (len != count) { 95 if (len != count)
98 __ioread32_copy(data + len, pipe->fifo, 96 memcpy_fromio(data + len, pipe->fifo, (count - len));
99 (count - len) / sizeof(u32));
100 }
101} 97}
102 98
103static void glink_smem_rx_advance(struct qcom_glink_pipe *np, 99static void glink_smem_rx_advance(struct qcom_glink_pipe *np,
@@ -205,7 +201,7 @@ struct qcom_glink *qcom_glink_smem_register(struct device *parent,
205 dev->parent = parent; 201 dev->parent = parent;
206 dev->of_node = node; 202 dev->of_node = node;
207 dev->release = qcom_glink_smem_release; 203 dev->release = qcom_glink_smem_release;
208 dev_set_name(dev, "%s:%s", node->parent->name, node->name); 204 dev_set_name(dev, "%pOFn:%pOFn", node->parent, node);
209 ret = device_register(dev); 205 ret = device_register(dev);
210 if (ret) { 206 if (ret) {
211 pr_err("failed to register glink edge\n"); 207 pr_err("failed to register glink edge\n");
diff --git a/drivers/rpmsg/qcom_smd.c b/drivers/rpmsg/qcom_smd.c
index 8da83a4ebadc..4abbeea782fa 100644
--- a/drivers/rpmsg/qcom_smd.c
+++ b/drivers/rpmsg/qcom_smd.c
@@ -1122,8 +1122,10 @@ static struct qcom_smd_channel *qcom_smd_create_channel(struct qcom_smd_edge *ed
1122 1122
1123 channel->edge = edge; 1123 channel->edge = edge;
1124 channel->name = kstrdup(name, GFP_KERNEL); 1124 channel->name = kstrdup(name, GFP_KERNEL);
1125 if (!channel->name) 1125 if (!channel->name) {
1126 return ERR_PTR(-ENOMEM); 1126 ret = -ENOMEM;
1127 goto free_channel;
1128 }
1127 1129
1128 spin_lock_init(&channel->tx_lock); 1130 spin_lock_init(&channel->tx_lock);
1129 spin_lock_init(&channel->recv_lock); 1131 spin_lock_init(&channel->recv_lock);
@@ -1173,6 +1175,7 @@ static struct qcom_smd_channel *qcom_smd_create_channel(struct qcom_smd_edge *ed
1173 1175
1174free_name_and_channel: 1176free_name_and_channel:
1175 kfree(channel->name); 1177 kfree(channel->name);
1178free_channel:
1176 kfree(channel); 1179 kfree(channel);
1177 1180
1178 return ERR_PTR(ret); 1181 return ERR_PTR(ret);
@@ -1454,7 +1457,7 @@ struct qcom_smd_edge *qcom_smd_register_edge(struct device *parent,
1454 edge->dev.release = qcom_smd_edge_release; 1457 edge->dev.release = qcom_smd_edge_release;
1455 edge->dev.of_node = node; 1458 edge->dev.of_node = node;
1456 edge->dev.groups = qcom_smd_edge_groups; 1459 edge->dev.groups = qcom_smd_edge_groups;
1457 dev_set_name(&edge->dev, "%s:%s", dev_name(parent), node->name); 1460 dev_set_name(&edge->dev, "%s:%pOFn", dev_name(parent), node);
1458 ret = device_register(&edge->dev); 1461 ret = device_register(&edge->dev);
1459 if (ret) { 1462 if (ret) {
1460 pr_err("failed to register smd edge\n"); 1463 pr_err("failed to register smd edge\n");
diff --git a/drivers/rpmsg/rpmsg_char.c b/drivers/rpmsg/rpmsg_char.c
index a76b963a7e50..eea5ebbb5119 100644
--- a/drivers/rpmsg/rpmsg_char.c
+++ b/drivers/rpmsg/rpmsg_char.c
@@ -167,9 +167,9 @@ static int rpmsg_eptdev_release(struct inode *inode, struct file *filp)
167 return 0; 167 return 0;
168} 168}
169 169
170static ssize_t rpmsg_eptdev_read(struct file *filp, char __user *buf, 170static ssize_t rpmsg_eptdev_read_iter(struct kiocb *iocb, struct iov_iter *to)
171 size_t len, loff_t *f_pos)
172{ 171{
172 struct file *filp = iocb->ki_filp;
173 struct rpmsg_eptdev *eptdev = filp->private_data; 173 struct rpmsg_eptdev *eptdev = filp->private_data;
174 unsigned long flags; 174 unsigned long flags;
175 struct sk_buff *skb; 175 struct sk_buff *skb;
@@ -205,8 +205,8 @@ static ssize_t rpmsg_eptdev_read(struct file *filp, char __user *buf,
205 if (!skb) 205 if (!skb)
206 return -EFAULT; 206 return -EFAULT;
207 207
208 use = min_t(size_t, len, skb->len); 208 use = min_t(size_t, iov_iter_count(to), skb->len);
209 if (copy_to_user(buf, skb->data, use)) 209 if (copy_to_iter(skb->data, use, to) != use)
210 use = -EFAULT; 210 use = -EFAULT;
211 211
212 kfree_skb(skb); 212 kfree_skb(skb);
@@ -214,16 +214,21 @@ static ssize_t rpmsg_eptdev_read(struct file *filp, char __user *buf,
214 return use; 214 return use;
215} 215}
216 216
217static ssize_t rpmsg_eptdev_write(struct file *filp, const char __user *buf, 217static ssize_t rpmsg_eptdev_write_iter(struct kiocb *iocb,
218 size_t len, loff_t *f_pos) 218 struct iov_iter *from)
219{ 219{
220 struct file *filp = iocb->ki_filp;
220 struct rpmsg_eptdev *eptdev = filp->private_data; 221 struct rpmsg_eptdev *eptdev = filp->private_data;
222 size_t len = iov_iter_count(from);
221 void *kbuf; 223 void *kbuf;
222 int ret; 224 int ret;
223 225
224 kbuf = memdup_user(buf, len); 226 kbuf = kzalloc(len, GFP_KERNEL);
225 if (IS_ERR(kbuf)) 227 if (!kbuf)
226 return PTR_ERR(kbuf); 228 return -ENOMEM;
229
230 if (!copy_from_iter_full(kbuf, len, from))
231 return -EFAULT;
227 232
228 if (mutex_lock_interruptible(&eptdev->ept_lock)) { 233 if (mutex_lock_interruptible(&eptdev->ept_lock)) {
229 ret = -ERESTARTSYS; 234 ret = -ERESTARTSYS;
@@ -281,8 +286,8 @@ static const struct file_operations rpmsg_eptdev_fops = {
281 .owner = THIS_MODULE, 286 .owner = THIS_MODULE,
282 .open = rpmsg_eptdev_open, 287 .open = rpmsg_eptdev_open,
283 .release = rpmsg_eptdev_release, 288 .release = rpmsg_eptdev_release,
284 .read = rpmsg_eptdev_read, 289 .read_iter = rpmsg_eptdev_read_iter,
285 .write = rpmsg_eptdev_write, 290 .write_iter = rpmsg_eptdev_write_iter,
286 .poll = rpmsg_eptdev_poll, 291 .poll = rpmsg_eptdev_poll,
287 .unlocked_ioctl = rpmsg_eptdev_ioctl, 292 .unlocked_ioctl = rpmsg_eptdev_ioctl,
288 .compat_ioctl = rpmsg_eptdev_ioctl, 293 .compat_ioctl = rpmsg_eptdev_ioctl,