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