Loading drivers/rpmsg/qcom_glink_native.c +49 −10 Original line number Diff line number Diff line Loading @@ -357,6 +357,9 @@ static int qcom_glink_tx(struct qcom_glink *glink, if (tlen >= glink->tx_pipe->length) return -EINVAL; if (atomic_read(&glink->in_reset)) return -ECONNRESET; spin_lock_irqsave(&glink->tx_lock, flags); while (qcom_glink_tx_avail(glink) < tlen) { Loading Loading @@ -1387,9 +1390,6 @@ static void qcom_glink_destroy_ept(struct rpmsg_endpoint *ept) channel->ept.cb = NULL; spin_unlock_irqrestore(&channel->recv_lock, flags); /* Decouple the potential rpdev from the channel */ channel->rpdev = NULL; qcom_glink_send_close_req(glink, channel); } Loading Loading @@ -1451,6 +1451,8 @@ static int __qcom_glink_send(struct glink_channel *channel, } __packed req; int ret; unsigned long flags; int chunk_size = len; int left_size = 0; if (!glink->intentless) { while (!intent) { Loading Loading @@ -1484,18 +1486,45 @@ static int __qcom_glink_send(struct glink_channel *channel, iid = intent->id; } if (wait && (chunk_size > SZ_8K)) { chunk_size = SZ_8K; left_size = len - chunk_size; } req.msg.cmd = cpu_to_le16(RPM_CMD_TX_DATA); req.msg.param1 = cpu_to_le16(channel->lcid); req.msg.param2 = cpu_to_le32(iid); req.chunk_size = cpu_to_le32(len); req.left_size = cpu_to_le32(0); req.chunk_size = cpu_to_le32(chunk_size); req.left_size = cpu_to_le32(left_size); ret = qcom_glink_tx(glink, &req, sizeof(req), data, len, wait); ret = qcom_glink_tx(glink, &req, sizeof(req), data, chunk_size, wait); /* Mark intent available if we failed */ if (ret && intent) if (ret && intent) { intent->in_use = false; return ret; } while (left_size > 0) { chunk_size = left_size; if (chunk_size > SZ_8K) chunk_size = SZ_8K; left_size -= chunk_size; req.msg.cmd = cpu_to_le16(RPM_CMD_TX_DATA_CONT); req.msg.param1 = cpu_to_le16(channel->lcid); req.msg.param2 = cpu_to_le32(iid); req.chunk_size = cpu_to_le32(chunk_size); req.left_size = cpu_to_le32(left_size); ret = qcom_glink_tx(glink, &req, sizeof(req), data, chunk_size, wait); /* Mark intent available if we failed */ if (ret && intent) { intent->in_use = false; break; } } return ret; } Loading Loading @@ -1685,6 +1714,7 @@ static void qcom_glink_rx_close(struct qcom_glink *glink, unsigned int rcid) rpmsg_unregister_device(glink->dev, &chinfo); } channel->rpdev = NULL; qcom_glink_send_close_ack(glink, channel->rcid); Loading @@ -1698,6 +1728,7 @@ static void qcom_glink_rx_close(struct qcom_glink *glink, unsigned int rcid) static void qcom_glink_rx_close_ack(struct qcom_glink *glink, unsigned int lcid) { struct rpmsg_channel_info chinfo; struct glink_channel *channel; unsigned long flags; Loading @@ -1713,6 +1744,16 @@ static void qcom_glink_rx_close_ack(struct qcom_glink *glink, unsigned int lcid) channel->lcid = 0; spin_unlock_irqrestore(&glink->idr_lock, flags); /* Decouple the potential rpdev from the channel */ if (channel->rpdev) { strlcpy(chinfo.name, channel->name, sizeof(chinfo.name)); chinfo.src = RPMSG_ADDR_ANY; chinfo.dst = RPMSG_ADDR_ANY; rpmsg_unregister_device(glink->dev, &chinfo); } channel->rpdev = NULL; kref_put(&channel->refcount, qcom_glink_channel_release); } Loading Loading @@ -1915,10 +1956,8 @@ struct qcom_glink *qcom_glink_native_probe(struct device *dev, ret = subsys_register_early_notifier(glink->name, XPORT_LAYER_NOTIF, qcom_glink_notif_reset, glink); if (ret) { if (ret) dev_err(dev, "failed to register early notif %d\n", ret); return ERR_PTR(ret); } irq = of_irq_get(dev->of_node, 0); ret = devm_request_irq(dev, irq, Loading Loading
drivers/rpmsg/qcom_glink_native.c +49 −10 Original line number Diff line number Diff line Loading @@ -357,6 +357,9 @@ static int qcom_glink_tx(struct qcom_glink *glink, if (tlen >= glink->tx_pipe->length) return -EINVAL; if (atomic_read(&glink->in_reset)) return -ECONNRESET; spin_lock_irqsave(&glink->tx_lock, flags); while (qcom_glink_tx_avail(glink) < tlen) { Loading Loading @@ -1387,9 +1390,6 @@ static void qcom_glink_destroy_ept(struct rpmsg_endpoint *ept) channel->ept.cb = NULL; spin_unlock_irqrestore(&channel->recv_lock, flags); /* Decouple the potential rpdev from the channel */ channel->rpdev = NULL; qcom_glink_send_close_req(glink, channel); } Loading Loading @@ -1451,6 +1451,8 @@ static int __qcom_glink_send(struct glink_channel *channel, } __packed req; int ret; unsigned long flags; int chunk_size = len; int left_size = 0; if (!glink->intentless) { while (!intent) { Loading Loading @@ -1484,18 +1486,45 @@ static int __qcom_glink_send(struct glink_channel *channel, iid = intent->id; } if (wait && (chunk_size > SZ_8K)) { chunk_size = SZ_8K; left_size = len - chunk_size; } req.msg.cmd = cpu_to_le16(RPM_CMD_TX_DATA); req.msg.param1 = cpu_to_le16(channel->lcid); req.msg.param2 = cpu_to_le32(iid); req.chunk_size = cpu_to_le32(len); req.left_size = cpu_to_le32(0); req.chunk_size = cpu_to_le32(chunk_size); req.left_size = cpu_to_le32(left_size); ret = qcom_glink_tx(glink, &req, sizeof(req), data, len, wait); ret = qcom_glink_tx(glink, &req, sizeof(req), data, chunk_size, wait); /* Mark intent available if we failed */ if (ret && intent) if (ret && intent) { intent->in_use = false; return ret; } while (left_size > 0) { chunk_size = left_size; if (chunk_size > SZ_8K) chunk_size = SZ_8K; left_size -= chunk_size; req.msg.cmd = cpu_to_le16(RPM_CMD_TX_DATA_CONT); req.msg.param1 = cpu_to_le16(channel->lcid); req.msg.param2 = cpu_to_le32(iid); req.chunk_size = cpu_to_le32(chunk_size); req.left_size = cpu_to_le32(left_size); ret = qcom_glink_tx(glink, &req, sizeof(req), data, chunk_size, wait); /* Mark intent available if we failed */ if (ret && intent) { intent->in_use = false; break; } } return ret; } Loading Loading @@ -1685,6 +1714,7 @@ static void qcom_glink_rx_close(struct qcom_glink *glink, unsigned int rcid) rpmsg_unregister_device(glink->dev, &chinfo); } channel->rpdev = NULL; qcom_glink_send_close_ack(glink, channel->rcid); Loading @@ -1698,6 +1728,7 @@ static void qcom_glink_rx_close(struct qcom_glink *glink, unsigned int rcid) static void qcom_glink_rx_close_ack(struct qcom_glink *glink, unsigned int lcid) { struct rpmsg_channel_info chinfo; struct glink_channel *channel; unsigned long flags; Loading @@ -1713,6 +1744,16 @@ static void qcom_glink_rx_close_ack(struct qcom_glink *glink, unsigned int lcid) channel->lcid = 0; spin_unlock_irqrestore(&glink->idr_lock, flags); /* Decouple the potential rpdev from the channel */ if (channel->rpdev) { strlcpy(chinfo.name, channel->name, sizeof(chinfo.name)); chinfo.src = RPMSG_ADDR_ANY; chinfo.dst = RPMSG_ADDR_ANY; rpmsg_unregister_device(glink->dev, &chinfo); } channel->rpdev = NULL; kref_put(&channel->refcount, qcom_glink_channel_release); } Loading Loading @@ -1915,10 +1956,8 @@ struct qcom_glink *qcom_glink_native_probe(struct device *dev, ret = subsys_register_early_notifier(glink->name, XPORT_LAYER_NOTIF, qcom_glink_notif_reset, glink); if (ret) { if (ret) dev_err(dev, "failed to register early notif %d\n", ret); return ERR_PTR(ret); } irq = of_irq_get(dev->of_node, 0); ret = devm_request_irq(dev, irq, Loading