Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 14 additions & 28 deletions drivers/rpmsg/qcom_glink_native.c
Original file line number Diff line number Diff line change
Expand Up @@ -1395,26 +1395,28 @@ static int qcom_glink_announce_create(struct rpmsg_device *rpdev)
return 0;
}

static void qcom_glink_destroy_ept(struct rpmsg_endpoint *ept)
static void qcom_glink_remove_rpmsg_device(struct qcom_glink *glink, struct glink_channel *channel)
{
struct glink_channel *channel = to_glink_channel(ept);
struct qcom_glink *glink = channel->glink;
struct rpmsg_channel_info chinfo;
unsigned long flags;

spin_lock_irqsave(&channel->recv_lock, flags);
channel->ept.cb = NULL;
spin_unlock_irqrestore(&channel->recv_lock, flags);

/* Decouple the potential rpdev from the channel */
if (channel->rpdev) {
strscpy_pad(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;
}

static void qcom_glink_destroy_ept(struct rpmsg_endpoint *ept)
{
struct glink_channel *channel = to_glink_channel(ept);
struct qcom_glink *glink = channel->glink;
unsigned long flags;

spin_lock_irqsave(&channel->recv_lock, flags);
channel->ept.cb = NULL;
spin_unlock_irqrestore(&channel->recv_lock, flags);

qcom_glink_send_close_req(glink, channel);
}
Expand Down Expand Up @@ -1705,7 +1707,6 @@ static int qcom_glink_rx_open(struct qcom_glink *glink, unsigned int rcid,

static void qcom_glink_rx_close(struct qcom_glink *glink, unsigned int rcid)
{
struct rpmsg_channel_info chinfo;
struct glink_channel *channel;
unsigned long flags;

Expand All @@ -1721,14 +1722,7 @@ static void qcom_glink_rx_close(struct qcom_glink *glink, unsigned int rcid)
/* cancel pending rx_done work */
cancel_work_sync(&channel->intent_work);

if (channel->rpdev) {
strscpy_pad(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;
qcom_glink_remove_rpmsg_device(glink, channel);

qcom_glink_send_close_ack(glink, channel);

Expand All @@ -1742,7 +1736,6 @@ 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;

Expand All @@ -1764,14 +1757,7 @@ static void qcom_glink_rx_close_ack(struct qcom_glink *glink, unsigned int lcid)
spin_unlock_irqrestore(&glink->idr_lock, flags);

/* Decouple the potential rpdev from the channel */
if (channel->rpdev) {
strscpy(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;
qcom_glink_remove_rpmsg_device(glink, channel);

kref_put(&channel->refcount, qcom_glink_channel_release);
}
Expand Down