3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * CDDL HEADER START
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * The contents of this file are subject to the terms of the
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Common Development and Distribution License (the "License").
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * You may not use this file except in compliance with the License.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * or http://www.opensolaris.org/os/licensing.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * See the License for the specific language governing permissions
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * and limitations under the License.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * When distributing Covered Code, include this CDDL HEADER in each
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * If applicable, add the following below this CDDL HEADER, with the
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * fields enclosed by brackets "[]" replaced with your own identifying
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * information: Portions Copyright [yyyy] [name of copyright owner]
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * CDDL HEADER END
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*
63b1987d5d7387bda49397c0f3f063b49651a5bcQiyan Sun - Sun Microsystems - San Diego United States * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Use is subject to license terms.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs#include <hxge_impl.h>
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs#include <hpi_pfc.h>
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs#define TCAM_COMPLETION_TRY_COUNT 10
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs#define HXGE_VLAN_TABLE_ENTRIES 128
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs#define HXGE_PFC_INT_STATUS_CLEAR 0x7ULL
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic uint64_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_tcam_check_completion(hpi_handle_t handle, tcam_op_t op_type)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint32_t try_counter, tcam_delay = 10;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_tcam_ctrl_t tctl;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs try_counter = TCAM_COMPLETION_TRY_COUNT;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs switch (op_type) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case TCAM_RWC_STAT:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs READ_TCAM_REG_CTL(handle, &tctl.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs while ((try_counter) &&
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (tctl.bits.status != TCAM_CTL_RWC_RWC_STAT)) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs try_counter--;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DELAY(tcam_delay);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs READ_TCAM_REG_CTL(handle, &tctl.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (!try_counter) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HPI_ERROR_MSG((handle.function, HPI_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs " TCAM RWC_STAT operation"
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs " failed to complete \n"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_PFC_TCAM_HW_ERROR);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tctl.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case TCAM_RWC_MATCH:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs READ_TCAM_REG_CTL(handle, &tctl.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs while ((try_counter) &&
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (tctl.bits.match != TCAM_CTL_RWC_RWC_MATCH)) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs try_counter--;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DELAY(tcam_delay);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs READ_TCAM_REG_CTL(handle, &tctl.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (!try_counter) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HPI_ERROR_MSG((handle.function, HPI_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs " TCAM Match operationfailed to find match \n"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs default:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HPI_ERROR_MSG((handle.function, HPI_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs " Invalid TCAM completion Request \n"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_PFC_ERROR | HPI_TCAM_ERROR | OPCODE_INVALID);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (tctl.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_tcam_entry_read(hpi_handle_t handle, uint32_t location,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_tcam_entry_t *tcam_ptr)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_tcam_ctrl_t tctl;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_tcam_ctrl_t tctl_rv;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Hydra doesn't allow to read TCAM entries. Use compare instead.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs WRITE_TCAM_REG_MASK0(handle, tcam_ptr->mask0);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs WRITE_TCAM_REG_MASK1(handle, tcam_ptr->mask1);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs WRITE_TCAM_REG_KEY0(handle, tcam_ptr->key0);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs WRITE_TCAM_REG_KEY1(handle, tcam_ptr->key1);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tctl.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tctl.bits.addr = location;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tctl.bits.cmd = TCAM_CTL_RWC_TCAM_CMP;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs WRITE_TCAM_REG_CTL(handle, tctl.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tctl_rv.value = hpi_pfc_tcam_check_completion(handle, TCAM_RWC_MATCH);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (tctl_rv.bits.match)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_FAILURE);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_tcam_asc_ram_entry_read(hpi_handle_t handle,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint32_t location, uint64_t *ram_data)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t tcam_stat;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_tcam_ctrl_t tctl;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tctl.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tctl.bits.addr = location;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tctl.bits.cmd = TCAM_CTL_RWC_RAM_RD;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs WRITE_TCAM_REG_CTL(handle, tctl.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcam_stat = hpi_pfc_tcam_check_completion(handle, TCAM_RWC_STAT);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (tcam_stat & HPI_FAILURE) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HPI_ERROR_MSG((handle.function, HPI_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "TCAM RAM read failed loc %d \n", location));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_PFC_ASC_RAM_RD_ERROR);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs READ_TCAM_REG_KEY0(handle, ram_data);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_tcam_asc_ram_entry_write(hpi_handle_t handle, uint32_t location,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t ram_data)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t tcam_stat = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_tcam_ctrl_t tctl;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs WRITE_TCAM_REG_KEY0(handle, ram_data);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tctl.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tctl.bits.addr = location;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tctl.bits.cmd = TCAM_CTL_RWC_RAM_WR;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HPI_DEBUG_MSG((handle.function, HPI_PFC_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs " tcam ascr write: location %x data %llx ctl value %llx \n",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs location, ram_data, tctl.value));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs WRITE_TCAM_REG_CTL(handle, tctl.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcam_stat = hpi_pfc_tcam_check_completion(handle, TCAM_RWC_STAT);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (tcam_stat & HPI_FAILURE) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HPI_ERROR_MSG((handle.function, HPI_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "TCAM RAM write failed loc %d \n", location));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_PFC_ASC_RAM_WR_ERROR);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic hpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_config(hpi_handle_t handle, pfc_config_t config)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_CONFIG;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, config.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic hpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_get_config(hpi_handle_t handle, pfc_config_t *configp)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_CONFIG;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_READ64(handle, offset, &configp->value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_tcam_enable(hpi_handle_t handle, boolean_t tcam)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_config_t config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Read the register first.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hpi_pfc_get_config(handle, &config);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (tcam)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs config.bits.tcam_en = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs config.bits.tcam_en = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (hpi_pfc_set_config(handle, config));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_l2_hash(hpi_handle_t handle, boolean_t l2_hash)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_config_t config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Read the register first.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hpi_pfc_get_config(handle, &config);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (l2_hash)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs config.bits.l2_hash_en = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs config.bits.l2_hash_en = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (hpi_pfc_set_config(handle, config));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_tcp_cksum(hpi_handle_t handle, boolean_t cksum)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_config_t config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Read the register first.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hpi_pfc_get_config(handle, &config);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (cksum)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs config.bits.tcp_cs_en = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs config.bits.tcp_cs_en = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (hpi_pfc_set_config(handle, config));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_default_dma(hpi_handle_t handle, uint32_t dma_channel_no)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_config_t config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hpi_pfc_get_config(handle, &config);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (dma_channel_no > PFC_MAX_DMA_CHANNELS)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_FAILURE);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs config.bits.default_dma = dma_channel_no;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (hpi_pfc_set_config(handle, config));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_mac_addr_enable(hpi_handle_t handle, uint32_t slot)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_config_t config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint32_t bit;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (slot >= PFC_N_MAC_ADDRESSES) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_FAILURE);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hpi_pfc_get_config(handle, &config);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
fe930412c257f961ae67039de3b164b83717976aqs if (slot < 24) {
fe930412c257f961ae67039de3b164b83717976aqs bit = 1 << slot;
fe930412c257f961ae67039de3b164b83717976aqs config.bits.mac_addr_en_l = config.bits.mac_addr_en_l | bit;
fe930412c257f961ae67039de3b164b83717976aqs } else {
fe930412c257f961ae67039de3b164b83717976aqs bit = 1 << (slot - 24);
fe930412c257f961ae67039de3b164b83717976aqs config.bits.mac_addr_en = config.bits.mac_addr_en | bit;
fe930412c257f961ae67039de3b164b83717976aqs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (hpi_pfc_set_config(handle, config));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_mac_addr_disable(hpi_handle_t handle, uint32_t slot)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_config_t config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint32_t bit;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (slot >= PFC_N_MAC_ADDRESSES) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_FAILURE);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hpi_pfc_get_config(handle, &config);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
fe930412c257f961ae67039de3b164b83717976aqs if (slot < 24) {
fe930412c257f961ae67039de3b164b83717976aqs bit = 1 << slot;
fe930412c257f961ae67039de3b164b83717976aqs config.bits.mac_addr_en_l = config.bits.mac_addr_en_l & ~bit;
fe930412c257f961ae67039de3b164b83717976aqs } else {
fe930412c257f961ae67039de3b164b83717976aqs bit = 1 << (slot - 24);
fe930412c257f961ae67039de3b164b83717976aqs config.bits.mac_addr_en = config.bits.mac_addr_en & ~bit;
fe930412c257f961ae67039de3b164b83717976aqs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (hpi_pfc_set_config(handle, config));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_force_csum(hpi_handle_t handle, boolean_t force)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_config_t config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hpi_pfc_get_config(handle, &config);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (force)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs config.bits.force_cs_en = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs config.bits.force_cs_en = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (hpi_pfc_set_config(handle, config));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_cfg_vlan_table_clear(hpi_handle_t handle)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int i;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int step = 8;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_vlan_table_t table_entry;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs table_entry.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs for (i = 0; i < HXGE_VLAN_TABLE_ENTRIES; i++) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs table_entry.bits.member = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_VLAN_TABLE + i * step;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, table_entry.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_cfg_vlan_table_entry_clear(hpi_handle_t handle, vlan_id_t vlan_id)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_vlan_table_t vlan_tbl_entry;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t bit;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Assumes that the hardware will generate the new parity
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * data.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_VLAN_REG_OFFSET(vlan_id);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_READ64(handle, offset, (uint64_t *)&vlan_tbl_entry.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs bit = PFC_VLAN_BIT_OFFSET(vlan_id);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs bit = 1 << bit;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs vlan_tbl_entry.bits.member = vlan_tbl_entry.bits.member & ~bit;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, vlan_tbl_entry.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_cfg_vlan_table_entry_set(hpi_handle_t handle, vlan_id_t vlan_id)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_vlan_table_t vlan_tbl_entry;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t bit;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Assumes that the hardware will generate the new parity
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * data.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_VLAN_REG_OFFSET(vlan_id);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_READ64(handle, offset, (uint64_t *)&vlan_tbl_entry.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs bit = PFC_VLAN_BIT_OFFSET(vlan_id);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs bit = 1 << bit;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs vlan_tbl_entry.bits.member = vlan_tbl_entry.bits.member | bit;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, vlan_tbl_entry.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_cfg_vlan_control_set(hpi_handle_t handle, boolean_t parity,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs boolean_t valid, vlan_id_t vlan_id)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_vlan_ctrl_t vlan_control;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs vlan_control.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (parity)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs vlan_control.bits.par_en = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs vlan_control.bits.par_en = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (valid)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs vlan_control.bits.valid = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs vlan_control.bits.valid = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs vlan_control.bits.id = vlan_id;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, PFC_VLAN_CTRL, vlan_control.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_get_vlan_parity_log(hpi_handle_t handle, pfc_vlan_par_err_log_t *logp)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_VLAN_PAR_ERR_LOG;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_READ64(handle, offset, &logp->value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_mac_address(hpi_handle_t handle, uint32_t slot, uint64_t address)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t moffset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_mac_addr_mask_t mask;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_mac_addr_t addr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (slot >= PFC_N_MAC_ADDRESSES)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_FAILURE);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_MAC_ADDRESS(slot);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs moffset = PFC_MAC_ADDRESS_MASK(slot);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
fe930412c257f961ae67039de3b164b83717976aqs addr.bits.addr = address >> 32;
fe930412c257f961ae67039de3b164b83717976aqs addr.bits.addr_l = address & 0xffffffff;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs mask.bits.mask = 0x0;
fe930412c257f961ae67039de3b164b83717976aqs mask.bits.mask_l = 0x0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, addr.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, moffset, mask.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (hpi_pfc_mac_addr_enable(handle, slot));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_clear_mac_address(hpi_handle_t handle, uint32_t slot)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset, moffset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t zaddr = 0x0ULL;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t zmask = 0x0ULL;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (slot >= PFC_N_MAC_ADDRESSES)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_FAILURE);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hpi_pfc_mac_addr_disable(handle, slot);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_MAC_ADDRESS(slot);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs moffset = PFC_MAC_ADDRESS_MASK(slot);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, zaddr);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, moffset, zmask);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_clear_multicast_hash_table(hpi_handle_t handle, uint32_t slot)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (slot >= PFC_N_MAC_ADDRESSES)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_FAILURE);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_HASH_ADDR(slot);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, 0ULL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_multicast_hash_table(hpi_handle_t handle, uint32_t slot,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t address)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (slot >= PFC_N_MAC_ADDRESSES)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_FAILURE);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_HASH_ADDR(slot);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, address);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_l2_class_slot(hpi_handle_t handle, uint16_t etype, boolean_t valid,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int slot)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_l2_class_config_t l2_config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (slot >= PFC_N_MAC_ADDRESSES)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_FAILURE);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs l2_config.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (valid)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs l2_config.bits.valid = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs l2_config.bits.valid = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs l2_config.bits.etype = etype;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs l2_config.bits.rsrvd = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_L2_CONFIG(slot);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, l2_config.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_l3_class_config(hpi_handle_t handle, tcam_class_t slot,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcam_key_cfg_t cfg)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_l3_class_config_t l3_config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (slot >= PFC_N_MAC_ADDRESSES)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_FAILURE);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs l3_config.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (cfg.lookup_enable)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs l3_config.bits.tsel = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs l3_config.bits.tsel = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (cfg.discard)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs l3_config.bits.discard = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs l3_config.bits.discard = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_L3_CONFIG(slot);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, l3_config.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_get_l3_class_config(hpi_handle_t handle, tcam_class_t slot,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcam_key_cfg_t *cfg)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_l3_class_config_t l3_config;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (slot >= PFC_N_MAC_ADDRESSES)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_FAILURE);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_L3_CONFIG(slot);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_READ64(handle, offset, &l3_config.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (l3_config.bits.tsel)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs cfg->lookup_enable = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs cfg->lookup_enable = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (l3_config.bits.discard)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs cfg->discard = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs cfg->discard = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic hpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_tcam_control(hpi_handle_t handle, pfc_tcam_ctrl_t *tcontrolp)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_TCAM_CTRL;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, tcontrolp->value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_tcam_entry_invalidate(hpi_handle_t handle, uint32_t location)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_tcam_entry_t tcam_ptr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) memset(&tcam_ptr, 0, sizeof (hxge_tcam_entry_t));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hpi_pfc_tcam_entry_write(handle, location, &tcam_ptr);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_tcam_invalidate_all(hpi_handle_t handle)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int i;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_tcam_ctrl_t tcontrol;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcontrol.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs for (i = 0; i < PFC_N_TCAM_ENTRIES; i++) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hpi_pfc_set_tcam_control(handle, &tcontrol);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hpi_pfc_tcam_entry_invalidate(handle, i);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_tcam_entry_write(hpi_handle_t handle, uint32_t location,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_tcam_entry_t *tcam_ptr)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t tcam_stat;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_tcam_ctrl_t tctl;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs WRITE_TCAM_REG_MASK0(handle, tcam_ptr->mask0);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs WRITE_TCAM_REG_MASK1(handle, tcam_ptr->mask1);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs WRITE_TCAM_REG_KEY0(handle, tcam_ptr->key0);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs WRITE_TCAM_REG_KEY1(handle, tcam_ptr->key1);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HPI_DEBUG_MSG((handle.function, HPI_PFC_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs " tcam write: location %x\n key: %llx %llx\n mask: %llx %llx\n",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs location, tcam_ptr->key0, tcam_ptr->key1,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcam_ptr->mask0, tcam_ptr->mask1));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tctl.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tctl.bits.addr = location;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tctl.bits.cmd = TCAM_CTL_RWC_TCAM_WR;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HPI_DEBUG_MSG((handle.function, HPI_PFC_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs " tcam write: ctl value %llx \n", tctl.value));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs WRITE_TCAM_REG_CTL(handle, tctl.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcam_stat = hpi_pfc_tcam_check_completion(handle, TCAM_RWC_STAT);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (tcam_stat & HPI_FAILURE) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HPI_ERROR_MSG((handle.function, HPI_ERR_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "TCAM Write failed loc %d \n", location));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_PFC_TCAM_WR_ERROR);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_get_tcam_parity_log(hpi_handle_t handle, pfc_tcam_par_err_log_t *logp)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_TCAM_PAR_ERR_LOG;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_READ64(handle, offset, &logp->value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_get_tcam_auto_init(hpi_handle_t handle, pfc_auto_init_t *autoinitp)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_AUTO_INIT;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_READ64(handle, offset, &autoinitp->value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_tcp_control_discard(hpi_handle_t handle, boolean_t discard)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp_ctrl_mask_t tcp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = TCP_CTRL_MASK;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_READ64(handle, offset, &tcp.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (discard)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.bits.discard = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.bits.discard = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, tcp.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_tcp_control_fin(hpi_handle_t handle, boolean_t fin)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp_ctrl_mask_t tcp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = TCP_CTRL_MASK;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_READ64(handle, offset, &tcp.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (fin)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.bits.fin = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.bits.fin = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, tcp.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_tcp_control_syn(hpi_handle_t handle, boolean_t syn)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp_ctrl_mask_t tcp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = TCP_CTRL_MASK;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_READ64(handle, offset, &tcp.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (syn)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.bits.syn = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.bits.syn = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, tcp.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_tcp_control_rst(hpi_handle_t handle, boolean_t rst)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp_ctrl_mask_t tcp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = TCP_CTRL_MASK;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_READ64(handle, offset, &tcp.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (rst)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.bits.rst = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.bits.rst = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, tcp.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_tcp_control_psh(hpi_handle_t handle, boolean_t push)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp_ctrl_mask_t tcp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = TCP_CTRL_MASK;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_READ64(handle, offset, &tcp.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (push)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.bits.psh = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.bits.psh = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, tcp.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_tcp_control_ack(hpi_handle_t handle, boolean_t ack)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp_ctrl_mask_t tcp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = TCP_CTRL_MASK;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_READ64(handle, offset, &tcp.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ack)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.bits.ack = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs tcp.bits.ack = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, tcp.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_hash_seed_value(hpi_handle_t handle, uint32_t seed)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs src_hash_val_t src_hash_seed;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs src_hash_seed.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs src_hash_seed.bits.seed = seed;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = SRC_HASH_VAL;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, src_hash_seed.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_get_interrupt_status(hpi_handle_t handle, pfc_int_status_t *statusp)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_INT_STATUS;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_READ64(handle, offset, &statusp->value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_clear_interrupt_status(hpi_handle_t handle)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_INT_STATUS;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, HXGE_PFC_INT_STATUS_CLEAR);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_interrupt_mask(hpi_handle_t handle, boolean_t drop,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs boolean_t tcam_parity_error, boolean_t vlan_parity_error)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_int_mask_t mask;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs mask.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (drop)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs mask.bits.pkt_drop_mask = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs mask.bits.pkt_drop_mask = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (tcam_parity_error)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs mask.bits.tcam_parity_err_mask = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs mask.bits.tcam_parity_err_mask = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (vlan_parity_error)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs mask.bits.vlan_parity_err_mask = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs mask.bits.vlan_parity_err_mask = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_INT_MASK;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, mask.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_get_drop_log(hpi_handle_t handle, pfc_drop_log_t *logp)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_DROP_LOG;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_READ64(handle, offset, &logp->value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_set_drop_log_mask(hpi_handle_t handle, boolean_t vlan_drop,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs boolean_t tcam_drop, boolean_t class_code_drop, boolean_t l2_addr_drop,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs boolean_t tcp_ctrl_drop)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pfc_drop_log_mask_t log;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs log.value = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (vlan_drop)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs log.bits.vlan_drop_mask = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (tcam_drop)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs log.bits.tcam_drop_mask = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (class_code_drop)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs log.bits.class_code_drop_mask = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (l2_addr_drop)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs log.bits.l2_addr_drop_mask = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (tcp_ctrl_drop)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs log.bits.tcp_ctrl_drop_mask = 1;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_DROP_LOG_MASK;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_WRITE64(handle, offset, log.value);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_get_bad_csum_counter(hpi_handle_t handle, uint64_t *countp)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_BAD_CS_COUNTER;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_READ64(handle, offset, countp);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_get_drop_counter(hpi_handle_t handle, uint64_t *countp)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t offset;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs offset = PFC_DROP_COUNTER;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs REG_PIO_READ64(handle, offset, countp);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_get_number_mac_addrs(hpi_handle_t handle, uint32_t *n_of_addrs)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_REG_RD32(handle, HCR_REG + HCR_N_MAC_ADDRS, n_of_addrs);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_mac_addr_get_i(hpi_handle_t handle, uint8_t *data, int slot)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint32_t step = sizeof (uint32_t);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint32_t addr_hi = 0, addr_lo = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (slot >= PFC_N_MAC_ADDRESSES)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_FAILURE);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Read the MAC address out of the SPROM at the blade's
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * specific location.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_REG_RD32(handle, HCR_REG + HCR_ADDR_LO + slot * step, &addr_lo);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_REG_RD32(handle, HCR_REG + HCR_ADDR_HI + slot * step, &addr_hi);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs data[0] = addr_lo & 0x000000ff;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs data[1] = (addr_lo & 0x0000ff00) >> 8;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs data[2] = (addr_lo & 0x00ff0000) >> 16;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs data[3] = (addr_lo & 0xff000000) >> 24;
63b1987d5d7387bda49397c0f3f063b49651a5bcQiyan Sun - Sun Microsystems - San Diego United States data[4] = (addr_hi & 0x0000000ff);
63b1987d5d7387bda49397c0f3f063b49651a5bcQiyan Sun - Sun Microsystems - San Diego United States data[5] = (addr_hi & 0x00000ff00) >> 8;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_status_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshpi_pfc_num_macs_get(hpi_handle_t handle, uint8_t *data)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint8_t addr[6];
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint8_t num = 0;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs int i;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs for (i = 0; i < 16; i++) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) hpi_pfc_mac_addr_get_i(handle, addr, i);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (addr[0] || addr[1] || addr[2] ||
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs addr[3] || addr[4] || addr[5])
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs num++;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *data = num;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (HPI_SUCCESS);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}