/*
 * Copyright(c) 2017 Intel Corporation.
 *
 * This file is provided under a dual BSD/GPLv2 license.  When using or
 * redistributing this file, you may do so under either license.
 *
 * GPL LICENSE SUMMARY
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * BSD LICENSE
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  - Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  - Neither the name of Intel Corporation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

/*
 * This file contains OPA VNIC EMA Interface functions.
 */

#include "opa_vnic_internal.h"

/**
 * opa_vnic_vema_report_event - sent trap to report the specified event
 * @adapter: vnic port adapter
 * @event: event to be reported
 *
 * This function calls vema api to sent a trap for the given event.
 */
void opa_vnic_vema_report_event(struct opa_vnic_adapter *adapter, u8 event)
{
	struct __opa_veswport_info *info = &adapter->info;
	struct __opa_veswport_trap trap_data;

	trap_data.fabric_id = info->vesw.fabric_id;
	trap_data.veswid = info->vesw.vesw_id;
	trap_data.veswportnum = info->vport.port_num;
	trap_data.opaportnum = adapter->port_num;
	trap_data.veswportindex = adapter->vport_num;
	trap_data.opcode = event;

	opa_vnic_vema_send_trap(adapter, &trap_data, info->vport.encap_slid);
}

/**
 * opa_vnic_get_summary_counters - get summary counters
 * @adapter: vnic port adapter
 * @cntrs: pointer to destination summary counters structure
 *
 * This function populates the summary counters that is maintained by the
 * given adapter to destination address provided.
 */
void opa_vnic_get_summary_counters(struct opa_vnic_adapter *adapter,
				   struct opa_veswport_summary_counters *cntrs)
{
	struct opa_vnic_stats vstats;
	__be64 *dst;
	u64 *src;

	memset(&vstats, 0, sizeof(vstats));
	spin_lock(&adapter->stats_lock);
	adapter->rn_ops->ndo_get_stats64(adapter->netdev, &vstats.netstats);
	spin_unlock(&adapter->stats_lock);

	cntrs->vp_instance = cpu_to_be16(adapter->vport_num);
	cntrs->vesw_id = cpu_to_be16(adapter->info.vesw.vesw_id);
	cntrs->veswport_num = cpu_to_be32(adapter->port_num);

	cntrs->tx_errors = cpu_to_be64(vstats.netstats.tx_errors);
	cntrs->rx_errors = cpu_to_be64(vstats.netstats.rx_errors);
	cntrs->tx_packets = cpu_to_be64(vstats.netstats.tx_packets);
	cntrs->rx_packets = cpu_to_be64(vstats.netstats.rx_packets);
	cntrs->tx_bytes = cpu_to_be64(vstats.netstats.tx_bytes);
	cntrs->rx_bytes = cpu_to_be64(vstats.netstats.rx_bytes);

	/*
	 * This loop depends on layout of
	 * opa_veswport_summary_counters opa_vnic_stats structures.
	 */
	for (dst = &cntrs->tx_unicast, src = &vstats.tx_grp.unicast;
	     dst < &cntrs->reserved[0]; dst++, src++) {
		*dst = cpu_to_be64(*src);
	}
}

/**
 * opa_vnic_get_error_counters - get error counters
 * @adapter: vnic port adapter
 * @cntrs: pointer to destination error counters structure
 *
 * This function populates the error counters that is maintained by the
 * given adapter to destination address provided.
 */
void opa_vnic_get_error_counters(struct opa_vnic_adapter *adapter,
				 struct opa_veswport_error_counters *cntrs)
{
	struct opa_vnic_stats vstats;

	memset(&vstats, 0, sizeof(vstats));
	spin_lock(&adapter->stats_lock);
	adapter->rn_ops->ndo_get_stats64(adapter->netdev, &vstats.netstats);
	spin_unlock(&adapter->stats_lock);

	cntrs->vp_instance = cpu_to_be16(adapter->vport_num);
	cntrs->vesw_id = cpu_to_be16(adapter->info.vesw.vesw_id);
	cntrs->veswport_num = cpu_to_be32(adapter->port_num);

	cntrs->tx_errors = cpu_to_be64(vstats.netstats.tx_errors);
	cntrs->rx_errors = cpu_to_be64(vstats.netstats.rx_errors);
	cntrs->tx_dlid_zero = cpu_to_be64(vstats.tx_dlid_zero);
	cntrs->tx_drop_state = cpu_to_be64(vstats.tx_drop_state);
	cntrs->tx_logic = cpu_to_be64(vstats.netstats.tx_fifo_errors +
				      vstats.netstats.tx_carrier_errors);

	cntrs->rx_bad_veswid = cpu_to_be64(vstats.netstats.rx_nohandler);
	cntrs->rx_runt = cpu_to_be64(vstats.rx_runt);
	cntrs->rx_oversize = cpu_to_be64(vstats.rx_oversize);
	cntrs->rx_drop_state = cpu_to_be64(vstats.rx_drop_state);
	cntrs->rx_logic = cpu_to_be64(vstats.netstats.rx_fifo_errors);
}

/**
 * opa_vnic_get_vesw_info -- Get the vesw information
 * @adapter: vnic port adapter
 * @info: pointer to destination vesw info structure
 *
 * This function copies the vesw info that is maintained by the
 * given adapter to destination address provided.
 */
void opa_vnic_get_vesw_info(struct opa_vnic_adapter *adapter,
			    struct opa_vesw_info *info)
{
	struct __opa_vesw_info *src = &adapter->info.vesw;
	int i;

	info->fabric_id = cpu_to_be16(src->fabric_id);
	info->vesw_id = cpu_to_be16(src->vesw_id);
	memcpy(info->rsvd0, src->rsvd0, ARRAY_SIZE(src->rsvd0));
	info->def_port_mask = cpu_to_be16(src->def_port_mask);
	memcpy(info->rsvd1, src->rsvd1, ARRAY_SIZE(src->rsvd1));
	info->pkey = cpu_to_be16(src->pkey);

	memcpy(info->rsvd2, src->rsvd2, ARRAY_SIZE(src->rsvd2));
	info->u_mcast_dlid = cpu_to_be32(src->u_mcast_dlid);
	for (i = 0; i < OPA_VESW_MAX_NUM_DEF_PORT; i++)
		info->u_ucast_dlid[i] = cpu_to_be32(src->u_ucast_dlid[i]);

	info->rc = cpu_to_be32(src->rc);

	memcpy(info->rsvd3, src->rsvd3, ARRAY_SIZE(src->rsvd3));
	info->eth_mtu = cpu_to_be16(src->eth_mtu);
	memcpy(info->rsvd4, src->rsvd4, ARRAY_SIZE(src->rsvd4));
}

/**
 * opa_vnic_set_vesw_info -- Set the vesw information
 * @adapter: vnic port adapter
 * @info: pointer to vesw info structure
 *
 * This function updates the vesw info that is maintained by the
 * given adapter with vesw info provided. Reserved fields are stored
 * and returned back to EM as is.
 */
void opa_vnic_set_vesw_info(struct opa_vnic_adapter *adapter,
			    struct opa_vesw_info *info)
{
	struct __opa_vesw_info *dst = &adapter->info.vesw;
	int i;

	dst->fabric_id = be16_to_cpu(info->fabric_id);
	dst->vesw_id = be16_to_cpu(info->vesw_id);
	memcpy(dst->rsvd0, info->rsvd0, ARRAY_SIZE(info->rsvd0));
	dst->def_port_mask = be16_to_cpu(info->def_port_mask);
	memcpy(dst->rsvd1, info->rsvd1, ARRAY_SIZE(info->rsvd1));
	dst->pkey = be16_to_cpu(info->pkey);

	memcpy(dst->rsvd2, info->rsvd2, ARRAY_SIZE(info->rsvd2));
	dst->u_mcast_dlid = be32_to_cpu(info->u_mcast_dlid);
	for (i = 0; i < OPA_VESW_MAX_NUM_DEF_PORT; i++)
		dst->u_ucast_dlid[i] = be32_to_cpu(info->u_ucast_dlid[i]);

	dst->rc = be32_to_cpu(info->rc);

	memcpy(dst->rsvd3, info->rsvd3, ARRAY_SIZE(info->rsvd3));
	dst->eth_mtu = be16_to_cpu(info->eth_mtu);
	memcpy(dst->rsvd4, info->rsvd4, ARRAY_SIZE(info->rsvd4));
}

/**
 * opa_vnic_get_per_veswport_info -- Get the vesw per port information
 * @adapter: vnic port adapter
 * @info: pointer to destination vport info structure
 *
 * This function copies the vesw per port info that is maintained by the
 * given adapter to destination address provided.
 * Note that the read only fields are not copied.
 */
void opa_vnic_get_per_veswport_info(struct opa_vnic_adapter *adapter,
				    struct opa_per_veswport_info *info)
{
	struct __opa_per_veswport_info *src = &adapter->info.vport;

	info->port_num = cpu_to_be32(src->port_num);
	info->eth_link_status = src->eth_link_status;
	memcpy(info->rsvd0, src->rsvd0, ARRAY_SIZE(src->rsvd0));

	memcpy(info->base_mac_addr, src->base_mac_addr,
	       ARRAY_SIZE(info->base_mac_addr));
	info->config_state = src->config_state;
	info->oper_state = src->oper_state;
	info->max_mac_tbl_ent = cpu_to_be16(src->max_mac_tbl_ent);
	info->max_smac_ent = cpu_to_be16(src->max_smac_ent);
	info->mac_tbl_digest = cpu_to_be32(src->mac_tbl_digest);
	memcpy(info->rsvd1, src->rsvd1, ARRAY_SIZE(src->rsvd1));

	info->encap_slid = cpu_to_be32(src->encap_slid);
	memcpy(info->pcp_to_sc_uc, src->pcp_to_sc_uc,
	       ARRAY_SIZE(info->pcp_to_sc_uc));
	memcpy(info->pcp_to_vl_uc, src->pcp_to_vl_uc,
	       ARRAY_SIZE(info->pcp_to_vl_uc));
	memcpy(info->pcp_to_sc_mc, src->pcp_to_sc_mc,
	       ARRAY_SIZE(info->pcp_to_sc_mc));
	memcpy(info->pcp_to_vl_mc, src->pcp_to_vl_mc,
	       ARRAY_SIZE(info->pcp_to_vl_mc));
	info->non_vlan_sc_uc = src->non_vlan_sc_uc;
	info->non_vlan_vl_uc = src->non_vlan_vl_uc;
	info->non_vlan_sc_mc = src->non_vlan_sc_mc;
	info->non_vlan_vl_mc = src->non_vlan_vl_mc;
	memcpy(info->rsvd2, src->rsvd2, ARRAY_SIZE(src->rsvd2));

	info->uc_macs_gen_count = cpu_to_be16(src->uc_macs_gen_count);
	info->mc_macs_gen_count = cpu_to_be16(src->mc_macs_gen_count);
	memcpy(info->rsvd3, src->rsvd3, ARRAY_SIZE(src->rsvd3));
}

/**
 * opa_vnic_set_per_veswport_info -- Set vesw per port information
 * @adapter: vnic port adapter
 * @info: pointer to vport info structure
 *
 * This function updates the vesw per port info that is maintained by the
 * given adapter with vesw per port info provided. Reserved fields are
 * stored and returned back to EM as is.
 */
void opa_vnic_set_per_veswport_info(struct opa_vnic_adapter *adapter,
				    struct opa_per_veswport_info *info)
{
	struct __opa_per_veswport_info *dst = &adapter->info.vport;

	dst->port_num = be32_to_cpu(info->port_num);
	memcpy(dst->rsvd0, info->rsvd0, ARRAY_SIZE(info->rsvd0));

	memcpy(dst->base_mac_addr, info->base_mac_addr,
	       ARRAY_SIZE(dst->base_mac_addr));
	dst->config_state = info->config_state;
	memcpy(dst->rsvd1, info->rsvd1, ARRAY_SIZE(info->rsvd1));

	dst->encap_slid = be32_to_cpu(info->encap_slid);
	memcpy(dst->pcp_to_sc_uc, info->pcp_to_sc_uc,
	       ARRAY_SIZE(dst->pcp_to_sc_uc));
	memcpy(dst->pcp_to_vl_uc, info->pcp_to_vl_uc,
	       ARRAY_SIZE(dst->pcp_to_vl_uc));
	memcpy(dst->pcp_to_sc_mc, info->pcp_to_sc_mc,
	       ARRAY_SIZE(dst->pcp_to_sc_mc));
	memcpy(dst->pcp_to_vl_mc, info->pcp_to_vl_mc,
	       ARRAY_SIZE(dst->pcp_to_vl_mc));
	dst->non_vlan_sc_uc = info->non_vlan_sc_uc;
	dst->non_vlan_vl_uc = info->non_vlan_vl_uc;
	dst->non_vlan_sc_mc = info->non_vlan_sc_mc;
	dst->non_vlan_vl_mc = info->non_vlan_vl_mc;
	memcpy(dst->rsvd2, info->rsvd2, ARRAY_SIZE(info->rsvd2));
	memcpy(dst->rsvd3, info->rsvd3, ARRAY_SIZE(info->rsvd3));
}

/**
 * opa_vnic_query_mcast_macs - query multicast mac list
 * @adapter: vnic port adapter
 * @macs: pointer mac list
 *
 * This function populates the provided mac list with the configured
 * multicast addresses in the adapter.
 */
void opa_vnic_query_mcast_macs(struct opa_vnic_adapter *adapter,
			       struct opa_veswport_iface_macs *macs)
{
	u16 start_idx, num_macs, idx = 0, count = 0;
	struct netdev_hw_addr *ha;

	start_idx = be16_to_cpu(macs->start_idx);
	num_macs = be16_to_cpu(macs->num_macs_in_msg);
	netdev_for_each_mc_addr(ha, adapter->netdev) {
		struct opa_vnic_iface_mac_entry *entry = &macs->entry[count];

		if (start_idx > idx++)
			continue;
		else if (num_macs == count)
			break;
		memcpy(entry, ha->addr, sizeof(*entry));
		count++;
	}

	macs->tot_macs_in_lst = cpu_to_be16(netdev_mc_count(adapter->netdev));
	macs->num_macs_in_msg = cpu_to_be16(count);
	macs->gen_count = cpu_to_be16(adapter->info.vport.mc_macs_gen_count);
}

/**
 * opa_vnic_query_ucast_macs - query unicast mac list
 * @adapter: vnic port adapter
 * @macs: pointer mac list
 *
 * This function populates the provided mac list with the configured
 * unicast addresses in the adapter.
 */
void opa_vnic_query_ucast_macs(struct opa_vnic_adapter *adapter,
			       struct opa_veswport_iface_macs *macs)
{
	u16 start_idx, tot_macs, num_macs, idx = 0, count = 0, em_macs = 0;
	struct netdev_hw_addr *ha;

	start_idx = be16_to_cpu(macs->start_idx);
	num_macs = be16_to_cpu(macs->num_macs_in_msg);
	/* loop through dev_addrs list first */
	for_each_dev_addr(adapter->netdev, ha) {
		struct opa_vnic_iface_mac_entry *entry = &macs->entry[count];

		/* Do not include EM specified MAC address */
		if (!memcmp(adapter->info.vport.base_mac_addr, ha->addr,
			    ARRAY_SIZE(adapter->info.vport.base_mac_addr))) {
			em_macs++;
			continue;
		}

		if (start_idx > idx++)
			continue;
		else if (num_macs == count)
			break;
		memcpy(entry, ha->addr, sizeof(*entry));
		count++;
	}

	/* loop through uc list */
	netdev_for_each_uc_addr(ha, adapter->netdev) {
		struct opa_vnic_iface_mac_entry *entry = &macs->entry[count];

		if (start_idx > idx++)
			continue;
		else if (num_macs == count)
			break;
		memcpy(entry, ha->addr, sizeof(*entry));
		count++;
	}

	tot_macs = netdev_hw_addr_list_count(&adapter->netdev->dev_addrs) +
		   netdev_uc_count(adapter->netdev) - em_macs;
	macs->tot_macs_in_lst = cpu_to_be16(tot_macs);
	macs->num_macs_in_msg = cpu_to_be16(count);
	macs->gen_count = cpu_to_be16(adapter->info.vport.uc_macs_gen_count);
}
