162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
462306a36Sopenharmony_ci * Copyright (C) 2019-2020 Linaro Ltd.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/types.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include "ipa_gsi.h"
1062306a36Sopenharmony_ci#include "gsi_trans.h"
1162306a36Sopenharmony_ci#include "ipa.h"
1262306a36Sopenharmony_ci#include "ipa_endpoint.h"
1362306a36Sopenharmony_ci#include "ipa_data.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_civoid ipa_gsi_trans_complete(struct gsi_trans *trans)
1662306a36Sopenharmony_ci{
1762306a36Sopenharmony_ci	struct ipa *ipa = container_of(trans->gsi, struct ipa, gsi);
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci	ipa_endpoint_trans_complete(ipa->channel_map[trans->channel_id], trans);
2062306a36Sopenharmony_ci}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_civoid ipa_gsi_trans_release(struct gsi_trans *trans)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	struct ipa *ipa = container_of(trans->gsi, struct ipa, gsi);
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	ipa_endpoint_trans_release(ipa->channel_map[trans->channel_id], trans);
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_civoid ipa_gsi_channel_tx_queued(struct gsi *gsi, u32 channel_id, u32 count,
3062306a36Sopenharmony_ci			       u32 byte_count)
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci	struct ipa *ipa = container_of(gsi, struct ipa, gsi);
3362306a36Sopenharmony_ci	struct ipa_endpoint *endpoint;
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	endpoint = ipa->channel_map[channel_id];
3662306a36Sopenharmony_ci	if (endpoint->netdev)
3762306a36Sopenharmony_ci		netdev_sent_queue(endpoint->netdev, byte_count);
3862306a36Sopenharmony_ci}
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_civoid ipa_gsi_channel_tx_completed(struct gsi *gsi, u32 channel_id, u32 count,
4162306a36Sopenharmony_ci				  u32 byte_count)
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	struct ipa *ipa = container_of(gsi, struct ipa, gsi);
4462306a36Sopenharmony_ci	struct ipa_endpoint *endpoint;
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	endpoint = ipa->channel_map[channel_id];
4762306a36Sopenharmony_ci	if (endpoint->netdev)
4862306a36Sopenharmony_ci		netdev_completed_queue(endpoint->netdev, count, byte_count);
4962306a36Sopenharmony_ci}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci/* Indicate whether an endpoint config data entry is "empty" */
5262306a36Sopenharmony_cibool ipa_gsi_endpoint_data_empty(const struct ipa_gsi_endpoint_data *data)
5362306a36Sopenharmony_ci{
5462306a36Sopenharmony_ci	return data->ee_id == GSI_EE_AP && !data->channel.tlv_count;
5562306a36Sopenharmony_ci}
56