freebsd-nq/sys/dev/vxge/vxgehal/vxgehal-virtualpath.c

12144 lines
326 KiB
C
Raw Normal View History

/*-
* Copyright(c) 2002-2011 Exar Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification are permitted provided the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. 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.
*
* 3. Neither the name of the Exar 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.
*/
/*$FreeBSD$*/
#include <dev/vxge/vxgehal/vxgehal.h>
/*
* __hal_vpath_fw_memo_get - Get the fw memo interface parameters
* @pdev: PCI device object.
* @regh0: BAR0 mapped memory handle, or simply PCI device @pdev
* (Linux and the rest.)
* @vp_id: Vpath id
* @vpath_reg: Pointer to vpath registers
* @action: Action for FW Interface
* @param_index: Index of the parameter
* @data0: Buffer to return data 0 register contents
* @data1: Buffer to return data 1 register contents
*
* Returns FW memo interface parameters
*
*/
vxge_hal_status_e
__hal_vpath_fw_memo_get(
pci_dev_h pdev,
pci_reg_h regh0,
u32 vp_id,
vxge_hal_vpath_reg_t *vpath_reg,
u32 action,
u64 param_index,
u64 *data0,
u64 *data1)
{
u64 val64;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert((vpath_reg != NULL) && (data0 != NULL) && (data1 != NULL));
vxge_hal_trace_log_driver("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_driver(
"pdev = 0x"VXGE_OS_STXFMT", regh0 = 0x"VXGE_OS_STXFMT", "
"vp_id = %d, vpath_reg = 0x"VXGE_OS_STXFMT", action = %d, "
"param_index = %lld, data0 = 0x"VXGE_OS_STXFMT", "
"data1 = 0x"VXGE_OS_STXFMT, (ptr_t) pdev, (ptr_t) regh0,
vp_id, (ptr_t) vpath_reg, action, param_index,
(ptr_t) data0, (ptr_t) data1);
vxge_os_pio_mem_write64(pdev,
regh0,
0,
&vpath_reg->rts_access_steer_ctrl);
vxge_os_wmb();
vxge_os_pio_mem_write64(pdev,
regh0,
param_index,
&vpath_reg->rts_access_steer_data0);
vxge_os_pio_mem_write64(pdev,
regh0,
0,
&vpath_reg->rts_access_steer_data1);
vxge_os_wmb();
val64 = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION(action) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_FW_MEMO) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_OFFSET(0);
vxge_hal_pio_mem_write32_lower(pdev,
regh0,
(u32) bVAL32(val64, 32),
&vpath_reg->rts_access_steer_ctrl);
vxge_os_wmb();
vxge_hal_pio_mem_write32_upper(pdev,
regh0,
(u32) bVAL32(val64, 0),
&vpath_reg->rts_access_steer_ctrl);
vxge_os_wmb();
status = vxge_hal_device_register_poll(pdev, regh0,
&vpath_reg->rts_access_steer_ctrl, 0,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE,
WAIT_FACTOR * VXGE_HAL_DEF_DEVICE_POLL_MILLIS);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
val64 = vxge_os_pio_mem_read64(pdev, regh0,
&vpath_reg->rts_access_steer_ctrl);
if (val64 & VXGE_HAL_RTS_ACCESS_STEER_CTRL_RMACJ_STATUS) {
*data0 = vxge_os_pio_mem_read64(pdev, regh0,
&vpath_reg->rts_access_steer_data0);
*data1 = vxge_os_pio_mem_read64(pdev, regh0,
&vpath_reg->rts_access_steer_data1);
status = VXGE_HAL_OK;
} else {
status = VXGE_HAL_FAIL;
}
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vpath_fw_flash_ver_get - Get the fw version
* @pdev: PCI device object.
* @regh0: BAR0 mapped memory handle, or simply PCI device @pdev
* (Linux and the rest.)
* @vp_id: Vpath id
* @vpath_reg: Pointer to vpath registers
* @fw_version: Buffer to return FW Version (Major)
* @fw_date: Buffer to return FW Version (date)
* @flash_version: Buffer to return FW Version (Major)
* @flash_date: Buffer to return FW Version (date)
*
* Returns FW Version
*
*/
vxge_hal_status_e
__hal_vpath_fw_flash_ver_get(
pci_dev_h pdev,
pci_reg_h regh0,
u32 vp_id,
vxge_hal_vpath_reg_t *vpath_reg,
vxge_hal_device_version_t *fw_version,
vxge_hal_device_date_t *fw_date,
vxge_hal_device_version_t *flash_version,
vxge_hal_device_date_t *flash_date)
{
u64 data1 = 0ULL;
u64 data2 = 0ULL;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert((vpath_reg != NULL) && (fw_version != NULL) &&
(fw_date != NULL) && (flash_version != NULL) &&
(flash_date != NULL));
vxge_hal_trace_log_driver("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_driver(
"pdev = 0x"VXGE_OS_STXFMT", regh0 = 0x"VXGE_OS_STXFMT", "
"vp_id = %d, vpath_reg = 0x"VXGE_OS_STXFMT", "
"fw_version = 0x"VXGE_OS_STXFMT", "
"fw_date = 0x"VXGE_OS_STXFMT", "
"flash_version = 0x"VXGE_OS_STXFMT", "
"flash_date = 0x"VXGE_OS_STXFMT,
(ptr_t) pdev, (ptr_t) regh0, vp_id, (ptr_t) vpath_reg,
(ptr_t) fw_version, (ptr_t) fw_date,
(ptr_t) flash_version, (ptr_t) flash_date);
status = __hal_vpath_fw_memo_get(pdev, regh0, vp_id, vpath_reg,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FW_MEMO_VERSION,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_FW_VERSION,
&data1, &data2);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
fw_date->day =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_FW_VER_DAY(data1);
fw_date->month =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_FW_VER_MONTH(data1);
fw_date->year =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_FW_VER_YEAR(data1);
(void) vxge_os_snprintf(fw_date->date, sizeof(fw_date->date),
"%2.2d/%2.2d/%4.4d",
fw_date->month, fw_date->day, fw_date->year);
fw_version->major =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_FW_VER_MAJOR(data1);
fw_version->minor =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_FW_VER_MINOR(data1);
fw_version->build =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_FW_VER_BUILD(data1);
(void) vxge_os_snprintf(fw_version->version,
sizeof(fw_version->version),
"%d.%d.%d", fw_version->major,
fw_version->minor, fw_version->build);
status = __hal_vpath_fw_memo_get(pdev, regh0, vp_id, vpath_reg,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FW_MEMO_CARD_INFO,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_FLASH_VERSION,
&data1, &data2);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
flash_date->day =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_FLASH_VER_DAY(data1);
flash_date->month =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_FLASH_VER_MONTH(data1);
flash_date->year =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_FLASH_VER_YEAR(data1);
(void) vxge_os_snprintf(flash_date->date, sizeof(flash_date->date),
"%2.2d/%2.2d/%4.4d", flash_date->month, flash_date->day,
flash_date->year);
flash_version->major =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_FLASH_VER_MAJOR(data1);
flash_version->minor =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_FLASH_VER_MINOR(data1);
flash_version->build =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_FLASH_VER_BUILD(data1);
(void) vxge_os_snprintf(flash_version->version,
sizeof(flash_version->version),
"%d.%d.%d", flash_version->major,
flash_version->minor, flash_version->build);
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vpath_card_info_get - Get the card infor
* @pdev: PCI device object.
* @regh0: BAR0 mapped memory handle, or simply PCI device @pdev
* (Linux and the rest.)
* @vp_id: Vpath id
* @vpath_reg: Pointer to vpath registers
* @serial_number: Buffer to return card serial number
* @part_number: Buffer to return card part number
* @product_description: Buffer to return card description
*
* Returns Card Info
*
*/
vxge_hal_status_e
__hal_vpath_card_info_get(
pci_dev_h pdev,
pci_reg_h regh0,
u32 vp_id,
vxge_hal_vpath_reg_t *vpath_reg,
u8 *serial_number,
u8 *part_number,
u8 *product_description)
{
u32 i, j;
u64 data1 = 0ULL;
u64 data2 = 0ULL;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert((vpath_reg != NULL) && (serial_number != NULL) &&
(part_number != NULL) && (product_description != NULL));
vxge_hal_trace_log_driver("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_driver(
"pdev = 0x"VXGE_OS_STXFMT", regh0 = 0x"VXGE_OS_STXFMT", "
"vp_id = %d, vpath_reg = 0x"VXGE_OS_STXFMT", "
"serial_number = 0x"VXGE_OS_STXFMT", "
"part_number = 0x"VXGE_OS_STXFMT", "
"product_description = 0x"VXGE_OS_STXFMT,
(ptr_t) pdev, (ptr_t) regh0, vp_id, (ptr_t) vpath_reg,
(ptr_t) serial_number, (ptr_t) part_number,
(ptr_t) product_description);
*serial_number = 0;
*part_number = 0;
*product_description = 0;
status = __hal_vpath_fw_memo_get(pdev, regh0, vp_id, vpath_reg,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FW_MEMO_CARD_INFO,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_SERIAL_NUMBER,
&data1, &data2);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/* LINTED */
((u64 *) serial_number)[0] = vxge_os_ntohll(data1);
/* LINTED */
((u64 *) serial_number)[1] = vxge_os_ntohll(data2);
status = __hal_vpath_fw_memo_get(pdev, regh0, vp_id, vpath_reg,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FW_MEMO_CARD_INFO,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_PART_NUMBER,
&data1, &data2);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/* LINTED */
((u64 *) part_number)[0] = vxge_os_ntohll(data1);
/* LINTED */
((u64 *) part_number)[1] = vxge_os_ntohll(data2);
j = 0;
for (i = VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_DESC_0;
i <= VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_DESC_3;
i++) {
status = __hal_vpath_fw_memo_get(pdev, regh0, vp_id, vpath_reg,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FW_MEMO_CARD_INFO,
i,
&data1, &data2);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/* LINTED */
((u64 *) product_description)[j++] = vxge_os_ntohll(data1);
/* LINTED */
((u64 *) product_description)[j++] = vxge_os_ntohll(data2);
}
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vpath_pmd_info_get - Get the PMD info
* @pdev: PCI device object.
* @regh0: BAR0 mapped memory handle, or simply PCI device @pdev
* (Linux and the rest.)
* @vp_id: Vpath id
* @vpath_reg: Pointer to vpath registers
* @ports: Number of ports supported
* @pmd_port0: Buffer to return PMD info for port 0
* @pmd_port1: Buffer to return PMD info for port 1
*
* Returns PMD Info
*
*/
vxge_hal_status_e
__hal_vpath_pmd_info_get(
pci_dev_h pdev,
pci_reg_h regh0,
u32 vp_id,
vxge_hal_vpath_reg_t *vpath_reg,
u32 *ports,
vxge_hal_device_pmd_info_t *pmd_port0,
vxge_hal_device_pmd_info_t *pmd_port1)
{
u64 data1 = 0ULL;
u64 data2 = 0ULL;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert((vpath_reg != NULL) &&
(pmd_port0 != NULL) && (pmd_port1 != NULL));
vxge_hal_trace_log_driver("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_driver(
"pdev = 0x"VXGE_OS_STXFMT", regh0 = 0x"VXGE_OS_STXFMT", "
"vp_id = %d, vpath_reg = 0x"VXGE_OS_STXFMT", "
"ports = 0x"VXGE_OS_STXFMT", "
"pmd_port0 = 0x"VXGE_OS_STXFMT", "
"pmd_port1 = 0x"VXGE_OS_STXFMT,
(ptr_t) pdev, (ptr_t) regh0, vp_id, (ptr_t) vpath_reg,
(ptr_t) ports, (ptr_t) pmd_port0, (ptr_t) pmd_port1);
status = __hal_vpath_fw_memo_get(pdev, regh0, vp_id, vpath_reg,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FW_MEMO_CARD_INFO,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_PORTS,
&data1, &data2);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
*ports = (u32) data1;
status = __hal_vpath_fw_memo_get(pdev, regh0, vp_id, vpath_reg,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FW_MEMO_CARD_INFO,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_PORT0_PMD_TYPE,
&data1, &data2);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
if (data1) {
pmd_port0->type = (u32) data1;
status = __hal_vpath_fw_memo_get(pdev, regh0, vp_id, vpath_reg,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FW_MEMO_CARD_INFO,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_PORT0_PMD_VENDOR,
&data1, &data2);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/* LINTED */
((u64 *) pmd_port0->vendor)[0] = vxge_os_ntohll(data1);
/* LINTED */
((u64 *) pmd_port0->vendor)[1] = vxge_os_ntohll(data2);
status = __hal_vpath_fw_memo_get(pdev, regh0, vp_id, vpath_reg,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FW_MEMO_CARD_INFO,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_PORT0_PMD_PARTNO,
&data1, &data2);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/* LINTED */
((u64 *) pmd_port0->part_num)[0] = vxge_os_ntohll(data1);
/* LINTED */
((u64 *) pmd_port0->part_num)[1] = vxge_os_ntohll(data2);
status = __hal_vpath_fw_memo_get(pdev, regh0, vp_id, vpath_reg,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FW_MEMO_CARD_INFO,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_PORT0_PMD_SERNO,
&data1, &data2);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/* LINTED */
((u64 *) pmd_port0->ser_num)[0] = vxge_os_ntohll(data1);
/* LINTED */
((u64 *) pmd_port0->ser_num)[1] = vxge_os_ntohll(data2);
} else {
vxge_os_memzero(pmd_port0, sizeof(vxge_hal_device_pmd_info_t));
}
status = __hal_vpath_fw_memo_get(pdev, regh0, vp_id, vpath_reg,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FW_MEMO_CARD_INFO,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_PORT1_PMD_TYPE,
&data1, &data2);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
if (data1) {
pmd_port1->type = (u32) data1;
status = __hal_vpath_fw_memo_get(pdev, regh0, vp_id, vpath_reg,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FW_MEMO_CARD_INFO,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_PORT1_PMD_VENDOR,
&data1, &data2);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/* LINTED */
((u64 *) pmd_port1->vendor)[0] = vxge_os_ntohll(data1);
/* LINTED */
((u64 *) pmd_port1->vendor)[1] = vxge_os_ntohll(data2);
status = __hal_vpath_fw_memo_get(pdev, regh0, vp_id, vpath_reg,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FW_MEMO_CARD_INFO,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_PORT1_PMD_PARTNO,
&data1, &data2);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/* LINTED */
((u64 *) pmd_port1->part_num)[0] = vxge_os_ntohll(data1);
/* LINTED */
((u64 *) pmd_port1->part_num)[1] = vxge_os_ntohll(data2);
status = __hal_vpath_fw_memo_get(pdev, regh0, vp_id, vpath_reg,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FW_MEMO_CARD_INFO,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_PORT1_PMD_SERNO,
&data1, &data2);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/* LINTED */
((u64 *) pmd_port1->ser_num)[0] = vxge_os_ntohll(data1);
/* LINTED */
((u64 *) pmd_port1->ser_num)[1] = vxge_os_ntohll(data2);
} else {
vxge_os_memzero(pmd_port1, sizeof(vxge_hal_device_pmd_info_t));
}
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vpath_pci_func_mode_get - Get the pci mode
* @pdev: PCI device object.
* @regh0: BAR0 mapped memory handle, or simply PCI device @pdev
* (Linux and the rest.)
* @vp_id: Vpath id
* @vpath_reg: Pointer to vpath registers
*
* Returns pci function mode
*
*/
u64
__hal_vpath_pci_func_mode_get(
pci_dev_h pdev,
pci_reg_h regh0,
u32 vp_id,
vxge_hal_vpath_reg_t *vpath_reg)
{
u64 data1 = 0ULL;
u64 data2 = 0ULL;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert(vpath_reg != NULL);
vxge_hal_trace_log_driver("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_driver(
"pdev = 0x"VXGE_OS_STXFMT", regh0 = 0x"VXGE_OS_STXFMT", "
"vp_id = %d, vpath_reg = 0x"VXGE_OS_STXFMT,
(ptr_t) pdev, (ptr_t) regh0, vp_id, (ptr_t) vpath_reg);
status = __hal_vpath_fw_memo_get(pdev, regh0, vp_id, vpath_reg,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_GET_FUNC_MODE,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_PCI_MODE,
&data1, &data2);
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (data1);
}
/*
* __hal_vpath_lag_mode_get - Get the LAG mode
* @vpath: VIrtual Path
*
* Returns the LAG mode in use
*/
vxge_hal_device_lag_mode_e
__hal_vpath_lag_mode_get(__hal_virtualpath_t *vpath)
{
u64 data1 = 0ULL;
u64 data2 = 0ULL;
u32 lag_mode = VXGE_HAL_DEVICE_LAG_MODE_UNKNOWN;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert(vpath != NULL);
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath);
(void) __hal_vpath_fw_memo_get(hldev->header.pdev, hldev->header.regh0,
vpath->vp_id, vpath->vp_reg,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_PORT_INFO,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_LAG_MODE,
&data1, &data2);
if (VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_MEMO_ITEM_STATUS(data1) ==
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MEMO_ITEM_STATUS_SUCCESS) {
lag_mode = (u32)
VXGE_HAL_RTS_ACCESS_STEER_DATA1_MEMO_ITEM_GET_LAG_MODE(data2);
status = VXGE_HAL_OK;
} else {
status = VXGE_HAL_FAIL;
}
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return ((vxge_hal_device_lag_mode_e) lag_mode);
}
/*
* __hal_vpath_vpath_map_get - Get the vpath map
* @pdev: PCI device object.
* @regh0: BAR0 mapped memory handle, or simply PCI device @pdev
* (Linux and the rest.)
* @vp_id: Vpath id
* @vh: Virtual Hierrachy
* @func: Function number
* @vpath_reg: Pointer to vpath registers
*
* Returns vpath map for a give hierarchy and function
*
*/
u64
__hal_vpath_vpath_map_get(pci_dev_h pdev, pci_reg_h regh0,
u32 vp_id, u32 vh, u32 func,
vxge_hal_vpath_reg_t *vpath_reg)
{
u64 i;
u64 val64 = 0ULL;
u64 data1 = 0ULL;
u64 data2 = 0ULL;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert(vpath_reg != NULL);
vxge_hal_trace_log_driver("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_driver(
"pdev = 0x"VXGE_OS_STXFMT", regh0 = 0x"VXGE_OS_STXFMT", "
"vp_id = %d, vh = %d, func = %d, vpath_reg = 0x"VXGE_OS_STXFMT,
(ptr_t) pdev, (ptr_t) regh0, vp_id, vh, func, (ptr_t) vpath_reg);
status = __hal_vpath_fw_memo_get(pdev, regh0, vp_id, vpath_reg,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_VPATH_MAP,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_VH(vh) |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_FUNCTION(func),
&data1, &data2);
for (i = 0; i < VXGE_HAL_MAX_VIRTUAL_PATHS; i++) {
if (data2 & VXGE_HAL_RTS_ACCESS_STEER_DATA1_IS_VPATH_ASSIGNED(i))
val64 |= mBIT(i);
}
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (val64);
}
/*
* __hal_vpath_pci_read - Read the content of given address
* in pci config space.
* @vpath: Virtual Path object.
* @offset: Configuration address(offset)to read from
* @length: Length of the data (1, 2 or 4 bytes)
* @val: Pointer to a buffer to return the content of the address
*
* Read from the vpath pci config space.
*
*/
vxge_hal_status_e
__hal_vpath_pci_read(struct __hal_device_t *hldev,
u32 vp_id, u32 offset,
u32 length, void *val)
{
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert((hldev != NULL) && (val != NULL));
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("hldev = 0x"VXGE_OS_STXFMT", vp_id = %d, "
"offset = %d, val = 0x"VXGE_OS_STXFMT,
(ptr_t) hldev, vp_id, offset, (ptr_t) val);
switch (length) {
case 1:
vxge_os_pci_read8(hldev->header.pdev,
hldev->header.cfgh,
offset,
((u8 *) val));
break;
case 2:
vxge_os_pci_read16(hldev->header.pdev,
hldev->header.cfgh,
offset,
((u16 *) val));
break;
case 4:
vxge_os_pci_read32(hldev->header.pdev,
hldev->header.cfgh,
offset,
((u32 *) val));
break;
default:
status = VXGE_HAL_FAIL;
vxge_os_memzero(val, length);
break;
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vpath_fw_upgrade - Upgrade the firmware
* @pdev: PCI device object.
* @regh0: BAR0 mapped memory handle, or simply PCI device @pdev
* (Linux and the rest.)
* @vp_id: Vpath id
* @vpath_reg: Pointer to vpath registers
* @buffer: Buffer containing F/W image
* @length: Length of F/W image
*
* Upgrade the firmware
*
*/
vxge_hal_status_e
__hal_vpath_fw_upgrade(
pci_dev_h pdev,
pci_reg_h regh0,
u32 vp_id,
vxge_hal_vpath_reg_t *vpath_reg,
u8 *buffer,
u32 length)
{
u32 i = 0;
u64 val64;
u32 not_done = TRUE;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert((vpath_reg != NULL) && (buffer != NULL));
vxge_hal_trace_log_driver("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_driver(
"pdev = 0x"VXGE_OS_STXFMT", regh0 = 0x"VXGE_OS_STXFMT", "
"vp_id = %d, vpath_reg = 0x"VXGE_OS_STXFMT", "
"buffer = 0x"VXGE_OS_STXFMT", length = %d\n",
(ptr_t) pdev, (ptr_t) regh0, vp_id, (ptr_t) vpath_reg,
(ptr_t) buffer, length);
vxge_os_pio_mem_write64(pdev,
regh0,
0,
&vpath_reg->rts_access_steer_ctrl);
vxge_os_wmb();
vxge_os_pio_mem_write64(pdev,
regh0,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_FW_UPGRADE_STREAM_SKIP,
&vpath_reg->rts_access_steer_data0);
vxge_os_pio_mem_write64(pdev,
regh0,
0,
&vpath_reg->rts_access_steer_data1);
vxge_os_wmb();
val64 = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FW_UPGRADE) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_FW_MEMO) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_OFFSET(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_OFFSET_FW_UPGRADE_MODE);
vxge_hal_pio_mem_write32_lower(pdev, regh0,
(u32) bVAL32(val64, 32),
&vpath_reg->rts_access_steer_ctrl);
vxge_os_wmb();
vxge_hal_pio_mem_write32_upper(pdev, regh0,
(u32) bVAL32(val64, 0),
&vpath_reg->rts_access_steer_ctrl);
vxge_os_wmb();
status = __hal_device_register_stall(pdev, regh0,
&vpath_reg->rts_access_steer_ctrl, 0,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE,
WAIT_FACTOR * VXGE_HAL_DEF_DEVICE_POLL_MILLIS);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
val64 = vxge_os_pio_mem_read64(pdev, regh0,
&vpath_reg->rts_access_steer_ctrl);
if (!(val64 & VXGE_HAL_RTS_ACCESS_STEER_CTRL_RMACJ_STATUS)) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_FAIL);
return (VXGE_HAL_FAIL);
}
while (not_done) {
if ((i + 16) > length) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_FAIL);
return (VXGE_HAL_FAIL);
}
vxge_os_pio_mem_write64(pdev, regh0, ((u64) (buffer[i])) |
((u64) (buffer[i + 1]) << 8) |
((u64) (buffer[i + 2]) << 16) |
((u64) (buffer[i + 3]) << 24) |
((u64) (buffer[i + 4]) << 32) |
((u64) (buffer[i + 5]) << 40) |
((u64) (buffer[i + 6]) << 48) |
((u64) (buffer[i + 7]) << 56),
&vpath_reg->rts_access_steer_data0);
vxge_os_pio_mem_write64(pdev, regh0,
((u64) (buffer[i + 8])) |
((u64) (buffer[i + 9]) << 8) |
((u64) (buffer[i + 10]) << 16) |
((u64) (buffer[i + 11]) << 24) |
((u64) (buffer[i + 12]) << 32) |
((u64) (buffer[i + 13]) << 40) |
((u64) (buffer[i + 14]) << 48) |
((u64) (buffer[i + 15]) << 56),
&vpath_reg->rts_access_steer_data1);
vxge_os_wmb();
val64 = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FW_UPGRADE) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_FW_MEMO) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_OFFSET(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_OFFSET_FW_UPGRADE_DATA);
vxge_hal_pio_mem_write32_lower(pdev, regh0,
(u32) bVAL32(val64, 32),
&vpath_reg->rts_access_steer_ctrl);
vxge_os_wmb();
vxge_hal_pio_mem_write32_upper(pdev, regh0,
(u32) bVAL32(val64, 0), &vpath_reg->rts_access_steer_ctrl);
vxge_os_wmb();
status = __hal_device_register_stall(pdev, regh0,
&vpath_reg->rts_access_steer_ctrl, 0,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE,
WAIT_FACTOR * VXGE_HAL_DEF_DEVICE_POLL_MILLIS);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
val64 = vxge_os_pio_mem_read64(pdev, regh0,
&vpath_reg->rts_access_steer_ctrl);
if (!(val64 & VXGE_HAL_RTS_ACCESS_STEER_CTRL_RMACJ_STATUS)) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_FAIL);
return (VXGE_HAL_FAIL);
}
val64 = vxge_os_pio_mem_read64(pdev, regh0,
&vpath_reg->rts_access_steer_data0);
switch (VXGE_HAL_RTS_ACCESS_STEER_DATA0_FW_UPGRADE_GET_RET_CODE(val64)) {
case VXGE_HAL_RTS_ACCESS_STEER_DATA0_FW_UPGRADE_GET_RET_CODE_OK:
i += 16;
break;
case VXGE_HAL_RTS_ACCESS_STEER_DATA0_FW_UPGRADE_GET_RET_CODE_DONE:
not_done = FALSE;
break;
case VXGE_HAL_RTS_ACCESS_STEER_DATA0_FW_UPGRADE_GET_RET_CODE_SKIP:
i += 16;
i += (u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_FW_UPGRADE_GET_SKIP_BYTES(val64);
break;
case VXGE_HAL_RTS_ACCESS_STEER_DATA0_FW_UPGRADE_GET_RET_CODE_ERROR:
default:
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_FAIL);
return (VXGE_HAL_FAIL);
}
}
vxge_os_pio_mem_write64(pdev,
regh0,
0,
&vpath_reg->rts_access_steer_data0);
vxge_os_pio_mem_write64(pdev,
regh0,
0,
&vpath_reg->rts_access_steer_data1);
vxge_os_wmb();
val64 = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FW_UPGRADE) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_FW_MEMO) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_OFFSET(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_OFFSET_FW_UPGRADE_COMMIT);
vxge_hal_pio_mem_write32_lower(pdev,
regh0,
(u32) bVAL32(val64, 32),
&vpath_reg->rts_access_steer_ctrl);
vxge_os_wmb();
vxge_hal_pio_mem_write32_upper(pdev,
regh0,
(u32) bVAL32(val64, 0),
&vpath_reg->rts_access_steer_ctrl);
vxge_os_wmb();
status = __hal_device_register_stall(pdev, regh0,
&vpath_reg->rts_access_steer_ctrl, 0,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE,
100 * VXGE_HAL_DEF_DEVICE_POLL_MILLIS);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
val64 = vxge_os_pio_mem_read64(pdev, regh0,
&vpath_reg->rts_access_steer_ctrl);
if (!(val64 & VXGE_HAL_RTS_ACCESS_STEER_CTRL_RMACJ_STATUS)) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_FAIL);
return (VXGE_HAL_FAIL);
}
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_OK);
return (VXGE_HAL_OK);
}
/*
* __hal_vpath_flick_link_led - Flick (blink) link LED.
* @hldev: HAL device.
* @vp_id: Vpath Id
* @port : Port number 0, or 1
* @on_off: TRUE if flickering to be on, FALSE to be off
*
* Flicker the link LED.
*/
vxge_hal_status_e
__hal_vpath_flick_link_led(struct __hal_device_t *hldev,
u32 vp_id, u32 port, u32 on_off)
{
u64 val64;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_hal_vpath_reg_t *vp_reg;
vxge_assert(hldev != NULL);
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"hldev = 0x"VXGE_OS_STXFMT", vp_id = %d, port = %d, on_off = %d",
(ptr_t) hldev, vp_id, port, on_off);
vp_reg = hldev->vpath_reg[vp_id];
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
0,
&vp_reg->rts_access_steer_ctrl);
vxge_os_wmb();
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
(u64) on_off,
&vp_reg->rts_access_steer_data0);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
0,
&vp_reg->rts_access_steer_data1);
vxge_os_wmb();
val64 = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_LED_CONTROL) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_FW_MEMO) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_OFFSET(0);
vxge_hal_pio_mem_write32_lower(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 32),
&vp_reg->rts_access_steer_ctrl);
vxge_os_wmb();
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&vp_reg->rts_access_steer_ctrl);
vxge_os_wmb();
status = vxge_hal_device_register_poll(hldev->header.pdev,
hldev->header.regh0,
&vp_reg->rts_access_steer_ctrl, 0,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE,
WAIT_FACTOR * hldev->header.config.device_poll_millis);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (VXGE_HAL_OK);
}
/*
* __hal_vpath_udp_rth_set - Enable or Disable UDP/RTH.
* @hldev: HAL device.
* @vp_id: Vpath Id
* @on_off: TRUE if UDP/RTH to be enabled, FALSE to be disabled
*
* Enable or Disable UDP/RTH.
*/
vxge_hal_status_e
__hal_vpath_udp_rth_set(
struct __hal_device_t *hldev,
u32 vp_id,
u32 on_off)
{
u64 val64;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_hal_vpath_reg_t *vp_reg;
vxge_assert(hldev != NULL);
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"hldev = 0x"VXGE_OS_STXFMT", vp_id = %d, on_off = %d",
(ptr_t) hldev, vp_id, on_off);
vp_reg = hldev->vpath_reg[vp_id];
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
0,
&vp_reg->rts_access_steer_ctrl);
vxge_os_wmb();
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
((on_off) ? VXGE_HAL_RTS_ACCESS_STEER_DATA0_UDP_RTH_ENABLE : 0),
&vp_reg->rts_access_steer_data0);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
0,
&vp_reg->rts_access_steer_data1);
vxge_os_wmb();
val64 = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_UDP_RTH) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_FW_MEMO) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_OFFSET(0);
vxge_hal_pio_mem_write32_lower(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 32),
&vp_reg->rts_access_steer_ctrl);
vxge_os_wmb();
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&vp_reg->rts_access_steer_ctrl);
vxge_os_wmb();
status = vxge_hal_device_register_poll(hldev->header.pdev,
hldev->header.regh0,
&vp_reg->rts_access_steer_ctrl, 0,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE,
WAIT_FACTOR * hldev->header.config.device_poll_millis);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (VXGE_HAL_OK);
}
/*
* __hal_vpath_pcie_func_mode_set - Set PCI-E function mode.
* @hldev: HAL device.
* @vp_id: Vpath Id
* @func_mode: func_mode to be set
*
* Set PCI-E function mode.
*/
vxge_hal_status_e
__hal_vpath_pcie_func_mode_set(struct __hal_device_t *hldev,
u32 vp_id, u32 func_mode)
{
u64 val64;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_hal_vpath_reg_t *vp_reg;
vxge_assert(hldev != NULL);
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"hldev = 0x"VXGE_OS_STXFMT", vp_id = %d, func_mode = %d",
(ptr_t) hldev, vp_id, func_mode);
vp_reg = hldev->vpath_reg[vp_id];
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
0,
&vp_reg->rts_access_steer_ctrl);
vxge_os_wmb();
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_FUNC_MODE(func_mode),
&vp_reg->rts_access_steer_data0);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
0,
&vp_reg->rts_access_steer_data1);
vxge_os_wmb();
val64 = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_FUNC_MODE) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_FW_MEMO) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_OFFSET(0);
vxge_hal_pio_mem_write32_lower(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 32),
&vp_reg->rts_access_steer_ctrl);
vxge_os_wmb();
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&vp_reg->rts_access_steer_ctrl);
vxge_os_wmb();
status = vxge_hal_device_register_poll(hldev->header.pdev,
hldev->header.regh0,
&vp_reg->rts_access_steer_ctrl, 0,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE,
WAIT_FACTOR * hldev->header.config.device_poll_millis);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vp_reg->rts_access_steer_ctrl);
if (!(val64 & VXGE_HAL_RTS_ACCESS_STEER_CTRL_RMACJ_STATUS)) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_FAIL);
return (VXGE_HAL_FAIL);
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
0,
&vp_reg->rts_access_steer_ctrl);
vxge_os_wmb();
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
0,
&vp_reg->rts_access_steer_data0);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
0,
&vp_reg->rts_access_steer_data1);
vxge_os_wmb();
val64 = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_COMMIT) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_FW_MEMO) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_OFFSET(0);
vxge_hal_pio_mem_write32_lower(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 32),
&vp_reg->rts_access_steer_ctrl);
vxge_os_wmb();
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&vp_reg->rts_access_steer_ctrl);
vxge_os_wmb();
status = vxge_hal_device_register_poll(hldev->header.pdev,
hldev->header.regh0,
&vp_reg->rts_access_steer_ctrl, 0,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE,
WAIT_FACTOR * hldev->header.config.device_poll_millis);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vp_reg->rts_access_steer_ctrl);
if (val64 & VXGE_HAL_RTS_ACCESS_STEER_CTRL_RMACJ_STATUS) {
status = VXGE_HAL_OK;
} else {
status = VXGE_HAL_FAIL;
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_udp_rth_disable - Enable UDP/RTH.
* @vpath_handle: Vpath handle.
*
* Disable udp rth
*
*/
vxge_hal_status_e
vxge_hal_vpath_udp_rth_disable(vxge_hal_vpath_h vpath_handle)
{
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
status = __hal_vpath_udp_rth_set(hldev,
vpath->vp_id,
FALSE);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
status);
return (status);
}
/*
* __hal_vpath_rts_table_get - Get the entries from RTS access tables
* @vpath_handle: Vpath handle.
* @action: Identifies the action to take on the specified entry. The
* interpretation of this field depends on the DATA_STRUCT_SEL field
* DA, VID, ETYPE, PN, RANGE_PN:
* 8'd0 - ADD_ENTRY (Add an entry to the table. This command may be
* rejected by management/administration).
* 8'd1 - DELETE_ENTRY (Add an entry to the table. This command may
* be rejected by management/administration)
* 8'd2 - LIST_FIRST_ENTRY
* 8'd3 - LIST_NEXT_ENTRY
* RTH_GEN_CFG, RTH_IT, RTH_JHASH_CFG, RTH_MASK, RTH_KEY, QOS, DS:
* 8'd0 - READ_ENTRY
* 8'd1 - WRITE_ENTRY
* Note: This field is updated by the H/W during an operation and
* is used to report additional TBD status information back to the
* host.
* @rts_table: Identifies the RTS data structure (i.e. lookup table) to access.
* 0; DA; Destination Address 1; VID; VLAN ID 2; ETYPE; Ethertype
* 3; PN; Layer 4 Port Number 4; Reserved 5; RTH_GEN_CFG; Receive
* Traffic Hashing General Configuration 6; RTH_IT; Receive Traffic
* Hashing Indirection Table 7; RTH_JHASH_CFG; Receive-Traffic
* Hashing Jenkins Hash Configuration 8; RTH_MASK; Receive Traffic
* Hashing Mask 9; RTH_KEY; Receive-Traffic Hashing Key 10; QOS;
* VLAN Quality of Service 11; DS; IP Differentiated Services
* @offset: Applies to RTH_IT, RTH_MASK, RTH_KEY, QOS, DS structures only.
* The interpretation of this field depends on the DATA_STRUCT_SEL
* field:
* RTH_IT - {BUCKET_NUM[0:7]} (Bucket Number)
* RTH_MASK - {5'b0,
* INDEX_8BYTE} (8-byte Index)
* RTH_KEY - {5'b0, INDEX_8BYTE} (8-byte Index)
* QOS - {5'b0, PRI} (Priority)
* DS - {5'b0, CP} (Codepoint)
* @data1: Pointer to the data 1 to be read from the table
* @data2: Pointer to the data 2 to be read from the table
*
* Read from the RTS table
*
*/
vxge_hal_status_e
__hal_vpath_rts_table_get(
vxge_hal_vpath_h vpath_handle,
u32 action,
u32 rts_table,
u32 offset,
u64 *data1,
u64 *data2)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert((vpath_handle != NULL) &&
(data1 != NULL) && (data2 != NULL));
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", action = %d, rts_table = %d, "
"offset = %d, data1 = 0x"VXGE_OS_STXFMT", data2 = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle, action, rts_table, offset, (ptr_t) data1,
(ptr_t) data2);
val64 = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION(action) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL(rts_table) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_OFFSET(offset);
if ((rts_table ==
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_SOLO_IT) ||
(rts_table ==
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_MULTI_IT) ||
(rts_table ==
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_MASK) ||
(rts_table ==
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_KEY)) {
val64 |= VXGE_HAL_RTS_ACCESS_STEER_CTRL_TABLE_SEL;
}
vxge_hal_pio_mem_write32_lower(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 32),
&vpath->vp_reg->rts_access_steer_ctrl);
vxge_os_wmb();
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&vpath->vp_reg->rts_access_steer_ctrl);
vxge_os_wmb();
status = vxge_hal_device_register_poll(
hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rts_access_steer_ctrl, 0,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE,
WAIT_FACTOR * hldev->header.config.device_poll_millis);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
val64 = vxge_os_pio_mem_read64(
hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rts_access_steer_ctrl);
if (!(val64 & VXGE_HAL_RTS_ACCESS_STEER_CTRL_RMACJ_STATUS)) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_FAIL);
return (VXGE_HAL_FAIL);
}
*data1 = vxge_os_pio_mem_read64(
hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rts_access_steer_data0);
if ((rts_table ==
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_DA) ||
(rts_table ==
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_MULTI_IT)) {
*data2 = vxge_os_pio_mem_read64(
hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rts_access_steer_data1);
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* __hal_vpath_rts_table_set - Set the entries of RTS access tables
* @vpath_handle: Vpath handle.
* @action: Identifies the action to take on the specified entry. The
* interpretation of this field depends on DATA_STRUCT_SEL field
* DA, VID, ETYPE, PN, RANGE_PN:
* 8'd0 - ADD_ENTRY (Add an entry to the table. This command may be
* rejected by management/administration).
* 8'd1 - DELETE_ENTRY (Add an entry to the table. This command may
* be rejected by management/administration)
* 8'd2 - LIST_FIRST_ENTRY
* 8'd3 - LIST_NEXT_ENTRY
* RTH_GEN_CFG, RTH_IT, RTH_JHASH_CFG, RTH_MASK, RTH_KEY, QOS, DS:
* 8'd0 - READ_ENTRY
* 8'd1 - WRITE_ENTRY
* Note: This field is updated by the H/W during an operation and
* is used to report additional TBD status information back to the
* host.
* @rts_table: Identifies the RTS data structure (i.e. lookup table) to access.
* 0; DA; Destination Address 1; VID; VLAN ID 2; ETYPE; Ethertype
* 3; PN; Layer 4 Port Number 4; Reserved 5; RTH_GEN_CFG; Receive
* Traffic Hashing General Configuration 6; RTH_IT; Receive Traffic
* Hashing Indirection Table 7; RTH_JHASH_CFG; Receive-Traffic
* Hashing Jenkins Hash Configuration 8; RTH_MASK; Receive Traffic
* Hashing Mask 9; RTH_KEY; Receive-Traffic Hashing Key 10; QOS;
* VLAN Quality of Service 11; DS; IP Differentiated Services
* @offset: Applies to RTH_IT, RTH_MASK, RTH_KEY, QOS, DS structures only.
* The interpretation of this field depends on the DATA_STRUCT_SEL
* field:
* RTH_IT - {BUCKET_NUM[0:7]} (Bucket Number)
* RTH_MASK - {5'b0,
* INDEX_8BYTE} (8-byte Index)
* RTH_KEY - {5'b0, INDEX_8BYTE} (8-byte Index)
* QOS - {5'b0, PRI} (Priority)
* DS - {5'b0, CP} (Codepoint)
* @data1: data 1 to be written to the table
* @data2: data 2 to be written to the table
*
* Read from the RTS table
*
*/
vxge_hal_status_e
__hal_vpath_rts_table_set(
vxge_hal_vpath_h vpath_handle,
u32 action,
u32 rts_table,
u32 offset,
u64 data1,
u64 data2)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", action = %d, rts_table = %d, "
"offset = %d, data1 = 0x"VXGE_OS_LLXFMT", data2 = 0x"VXGE_OS_LLXFMT,
(ptr_t) vpath_handle, action, rts_table, offset, data1, data2);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
data1,
&vpath->vp_reg->rts_access_steer_data0);
vxge_os_wmb();
if ((rts_table ==
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_DA) ||
(rts_table ==
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_MULTI_IT)) {
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
data2,
&vpath->vp_reg->rts_access_steer_data1);
vxge_os_wmb();
}
val64 = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION(action) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL(rts_table) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_OFFSET(offset);
vxge_hal_pio_mem_write32_lower(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 32),
&vpath->vp_reg->rts_access_steer_ctrl);
vxge_os_wmb();
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&vpath->vp_reg->rts_access_steer_ctrl);
vxge_os_wmb();
status = vxge_hal_device_register_poll(
hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rts_access_steer_ctrl, 0,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE,
WAIT_FACTOR * hldev->header.config.device_poll_millis);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
val64 = vxge_os_pio_mem_read64(
hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rts_access_steer_ctrl);
if (val64 & VXGE_HAL_RTS_ACCESS_STEER_CTRL_RMACJ_STATUS) {
status = VXGE_HAL_OK;
} else {
status = VXGE_HAL_FAIL;
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_mac_addr_add - Add the mac address entry for this vpath
* to MAC address table.
* @vpath_handle: Vpath handle.
* @macaddr: MAC address to be added for this vpath into the list
* @macaddr_mask: MAC address mask for macaddr
* @duplicate_mode: Duplicate MAC address add mode. Please see
* vxge_hal_vpath_mac_addr_add_mode_e {}
*
* Adds the given mac address and mac address mask into the list for this
* vpath.
* see also: vxge_hal_vpath_mac_addr_delete, vxge_hal_vpath_mac_addr_get and
* vxge_hal_vpath_mac_addr_get_next
*
*/
vxge_hal_status_e
vxge_hal_vpath_mac_addr_add(
vxge_hal_vpath_h vpath_handle,
macaddr_t macaddr,
macaddr_t macaddr_mask,
vxge_hal_vpath_mac_addr_add_mode_e duplicate_mode)
{
u32 i;
u64 data1 = 0ULL;
u64 data2 = 0ULL;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT", "
"macaddr = %02x-%02x-%02x-%02x-%02x-%02x, "
"macaddr_mask = %02x-%02x-%02x-%02x-%02x-%02x",
(ptr_t) vpath_handle, macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5], macaddr_mask[0],
macaddr_mask[1], macaddr_mask[2], macaddr_mask[3],
macaddr_mask[4], macaddr_mask[5]);
for (i = 0; i < VXGE_HAL_ETH_ALEN; i++) {
data1 <<= 8;
data1 |= (u8) macaddr[i];
}
for (i = 0; i < VXGE_HAL_ETH_ALEN; i++) {
data2 <<= 8;
data2 |= (u8) macaddr_mask[i];
}
switch (duplicate_mode) {
case VXGE_HAL_VPATH_MAC_ADDR_ADD_DUPLICATE:
i = 0;
break;
case VXGE_HAL_VPATH_MAC_ADDR_DISCARD_DUPLICATE:
i = 1;
break;
case VXGE_HAL_VPATH_MAC_ADDR_REPLACE_DUPLICATE:
i = 2;
break;
default:
i = 0;
break;
}
status = __hal_vpath_rts_table_set(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_ADD_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_DA,
0,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_DA_MAC_ADDR(data1),
VXGE_HAL_RTS_ACCESS_STEER_DATA1_DA_MAC_ADDR_MASK(data2) |
VXGE_HAL_RTS_ACCESS_STEER_DATA1_DA_MAC_ADDR_MODE(i));
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
status);
return (status);
}
/*
* __hal_vpath_hw_addr_get - Get the hw address entry for this vpath
* from MAC address table.
* @pdev: PCI device object.
* @regh0: BAR0 mapped memory handle, or simply PCI device @pdev
* (Linux and the rest.)
* @vp_id: Vpath id
* @vpath_reg: Pointer to vpath registers
* @macaddr: First MAC address entry for this vpath in the list
* @macaddr_mask: MAC address mask for macaddr
*
* Returns the first mac address and mac address mask in the list for this
* vpath.
* see also: vxge_hal_vpath_mac_addr_get_next
*
*/
vxge_hal_status_e
__hal_vpath_hw_addr_get(
pci_dev_h pdev,
pci_reg_h regh0,
u32 vp_id,
vxge_hal_vpath_reg_t *vpath_reg,
macaddr_t macaddr,
macaddr_t macaddr_mask)
{
u32 i;
u64 val64;
u64 data1 = 0ULL;
u64 data2 = 0ULL;
u64 action = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_LIST_FIRST_ENTRY;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert((vpath_reg != NULL) && (macaddr != NULL) &&
(macaddr_mask != NULL));
vxge_hal_trace_log_driver("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_driver(
"pdev = 0x"VXGE_OS_STXFMT", regh0 = 0x"VXGE_OS_STXFMT", "
"vp_id = %d, vpath_reg = 0x"VXGE_OS_STXFMT", "
"macaddr = 0x"VXGE_OS_STXFMT", macaddr_mask = 0x"VXGE_OS_STXFMT,
(ptr_t) pdev, (ptr_t) regh0, vp_id, (ptr_t) vpath_reg,
(ptr_t) macaddr, (ptr_t) macaddr_mask);
/* CONSTCOND */
while (TRUE) {
val64 = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION(action) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL(
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_DA) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_OFFSET(0);
vxge_hal_pio_mem_write32_lower(pdev,
regh0,
(u32) bVAL32(val64, 32),
&vpath_reg->rts_access_steer_ctrl);
vxge_os_wmb();
vxge_hal_pio_mem_write32_upper(pdev,
regh0,
(u32) bVAL32(val64, 0),
&vpath_reg->rts_access_steer_ctrl);
vxge_os_wmb();
status = vxge_hal_device_register_poll(pdev, regh0,
&vpath_reg->rts_access_steer_ctrl, 0,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE,
WAIT_FACTOR * VXGE_HAL_DEF_DEVICE_POLL_MILLIS);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
val64 = vxge_os_pio_mem_read64(pdev, regh0,
&vpath_reg->rts_access_steer_ctrl);
if (val64 & VXGE_HAL_RTS_ACCESS_STEER_CTRL_RMACJ_STATUS) {
data1 = vxge_os_pio_mem_read64(pdev, regh0,
&vpath_reg->rts_access_steer_data0);
data2 = vxge_os_pio_mem_read64(pdev, regh0,
&vpath_reg->rts_access_steer_data1);
data1 =
VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_DA_MAC_ADDR(data1);
data2 =
VXGE_HAL_RTS_ACCESS_STEER_DATA1_GET_DA_MAC_ADDR_MASK(data2);
if (VXGE_HAL_IS_UNICAST(data1)) {
for (i = VXGE_HAL_ETH_ALEN; i > 0; i--) {
macaddr[i - 1] = (u8) (data1 & 0xFF);
data1 >>= 8;
}
for (i = VXGE_HAL_ETH_ALEN; i > 0; i--) {
macaddr_mask[i - 1] = (u8) (data2 & 0xFF);
data2 >>= 8;
}
status = VXGE_HAL_OK;
break;
}
action = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_LIST_NEXT_ENTRY;
} else {
status = VXGE_HAL_FAIL;
break;
}
}
vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_mac_addr_get - Get the first mac address entry for this vpath
* from MAC address table.
* @vpath_handle: Vpath handle.
* @macaddr: First MAC address entry for this vpath in the list
* @macaddr_mask: MAC address mask for macaddr
*
* Returns the first mac address and mac address mask in the list for this
* vpath.
* see also: vxge_hal_vpath_mac_addr_get_next
*
*/
vxge_hal_status_e
vxge_hal_vpath_mac_addr_get(
vxge_hal_vpath_h vpath_handle,
macaddr_t macaddr,
macaddr_t macaddr_mask)
{
u32 i;
u64 data1 = 0ULL;
u64 data2 = 0ULL;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
status = __hal_vpath_rts_table_get(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_LIST_FIRST_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_DA,
0,
&data1,
&data2);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
data1 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_DA_MAC_ADDR(data1);
data2 = VXGE_HAL_RTS_ACCESS_STEER_DATA1_GET_DA_MAC_ADDR_MASK(data2);
for (i = VXGE_HAL_ETH_ALEN; i > 0; i--) {
macaddr[i - 1] = (u8) (data1 & 0xFF);
data1 >>= 8;
}
for (i = VXGE_HAL_ETH_ALEN; i > 0; i--) {
macaddr_mask[i - 1] = (u8) (data2 & 0xFF);
data2 >>= 8;
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
status);
return (status);
}
/*
* vxge_hal_vpath_mac_addr_get_next - Get the next mac address entry for vpath
* from MAC address table.
* @vpath_handle: Vpath handle.
* @macaddr: Next MAC address entry for this vpath in the list
* @macaddr_mask: MAC address mask for macaddr
*
* Returns the next mac address and mac address mask in the list for this
* vpath.
* see also: vxge_hal_vpath_mac_addr_get
*
*/
vxge_hal_status_e
vxge_hal_vpath_mac_addr_get_next(
vxge_hal_vpath_h vpath_handle,
macaddr_t macaddr,
macaddr_t macaddr_mask)
{
u32 i;
u64 data1 = 0ULL;
u64 data2 = 0ULL;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
status = __hal_vpath_rts_table_get(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_LIST_NEXT_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_DA,
0,
&data1,
&data2);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
data1 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_DA_MAC_ADDR(data1);
data2 = VXGE_HAL_RTS_ACCESS_STEER_DATA1_GET_DA_MAC_ADDR_MASK(data2);
for (i = VXGE_HAL_ETH_ALEN; i > 0; i--) {
macaddr[i - 1] = (u8) (data1 & 0xFF);
data1 >>= 8;
}
for (i = VXGE_HAL_ETH_ALEN; i > 0; i--) {
macaddr_mask[i - 1] = (u8) (data2 & 0xFF);
data2 >>= 8;
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_mac_addr_delete - Delete the mac address entry for this vpath
* to MAC address table.
* @vpath_handle: Vpath handle.
* @macaddr: MAC address to be added for this vpath into the list
* @macaddr_mask: MAC address mask for macaddr
*
* Delete the given mac address and mac address mask into the list for this
* vpath.
* see also: vxge_hal_vpath_mac_addr_add, vxge_hal_vpath_mac_addr_get and
* vxge_hal_vpath_mac_addr_get_next
*
*/
vxge_hal_status_e
vxge_hal_vpath_mac_addr_delete(
vxge_hal_vpath_h vpath_handle,
macaddr_t macaddr,
macaddr_t macaddr_mask)
{
u32 i;
u64 data1 = 0ULL;
u64 data2 = 0ULL;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT", "
"macaddr = %02x-%02x-%02x-%02x-%02x-%02x, "
"macaddr_mask = %02x-%02x-%02x-%02x-%02x-%02x",
(ptr_t) vpath_handle, macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5], macaddr_mask[0],
macaddr_mask[1], macaddr_mask[2], macaddr_mask[3],
macaddr_mask[4], macaddr_mask[5]);
for (i = 0; i < VXGE_HAL_ETH_ALEN; i++) {
data1 <<= 8;
data1 |= (u8) macaddr[i];
}
for (i = 0; i < VXGE_HAL_ETH_ALEN; i++) {
data2 <<= 8;
data2 |= (u8) macaddr_mask[i];
}
status = __hal_vpath_rts_table_set(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_DELETE_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_DA,
0,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_DA_MAC_ADDR(data1),
VXGE_HAL_RTS_ACCESS_STEER_DATA1_DA_MAC_ADDR_MASK(data2));
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_vid_add - Add the vlan id entry for this vpath
* to vlan id table.
* @vpath_handle: Vpath handle.
* @vid: vlan id to be added for this vpath into the list
*
* Adds the given vlan id into the list for this vpath.
* see also: vxge_hal_vpath_vid_delete, vxge_hal_vpath_vid_get and
* vxge_hal_vpath_vid_get_next
*
*/
vxge_hal_status_e
vxge_hal_vpath_vid_add(
vxge_hal_vpath_h vpath_handle,
u64 vid)
{
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT", vid = %d",
(ptr_t) vpath_handle, (u32) vid);
status = __hal_vpath_rts_table_set(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_ADD_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_VID,
0,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_VLAN_ID(vid),
0);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_vid_get - Get the first vid entry for this vpath
* from vlan id table.
* @vpath_handle: Vpath handle.
* @vid: Buffer to return vlan id
*
* Returns the first vlan id in the list for this vpath.
* see also: vxge_hal_vpath_vid_get_next
*
*/
vxge_hal_status_e
vxge_hal_vpath_vid_get(
vxge_hal_vpath_h vpath_handle,
u64 *vid)
{
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert((vpath_handle != NULL) && (vid != NULL));
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", vid = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle, (ptr_t) vid);
status = __hal_vpath_rts_table_get(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_LIST_FIRST_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_VID,
0,
vid,
NULL);
*vid = VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_VLAN_ID(*vid);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
status);
return (status);
}
/*
* vxge_hal_vpath_vid_get_next - Get the next vid entry for this vpath
* from vlan id table.
* @vpath_handle: Vpath handle.
* @vid: Buffer to return vlan id
*
* Returns the next vlan id in the list for this vpath.
* see also: vxge_hal_vpath_vid_get
*
*/
vxge_hal_status_e
vxge_hal_vpath_vid_get_next(
vxge_hal_vpath_h vpath_handle,
u64 *vid)
{
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert((vpath_handle != NULL) && (vid != NULL));
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", vid = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle, (ptr_t) vid);
status = __hal_vpath_rts_table_get(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_LIST_NEXT_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_VID,
0,
vid,
NULL);
*vid = VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_VLAN_ID(*vid);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_vid_delete - Delete the vlan id entry for this vpath
* to vlan id table.
* @vpath_handle: Vpath handle.
* @vid: vlan id to be added for this vpath into the list
*
* Adds the given vlan id into the list for this vpath.
* see also: vxge_hal_vpath_vid_add, vxge_hal_vpath_vid_get and
* vxge_hal_vpath_vid_get_next
*
*/
vxge_hal_status_e
vxge_hal_vpath_vid_delete(
vxge_hal_vpath_h vpath_handle,
u64 vid)
{
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT", vid = %d",
(ptr_t) vpath_handle, (u32) vid);
status = __hal_vpath_rts_table_set(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_DELETE_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_VID,
0,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_VLAN_ID(vid),
0);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
status);
return (status);
}
/*
* vxge_hal_vpath_etype_add - Add the Ethertype entry for this vpath
* to Ethertype table.
* @vpath_handle: Vpath handle.
* @etype: ethertype to be added for this vpath into the list
*
* Adds the given Ethertype into the list for this vpath.
* see also: vxge_hal_vpath_etype_delete, vxge_hal_vpath_etype_get and
* vxge_hal_vpath_etype_get_next
*
*/
vxge_hal_status_e
vxge_hal_vpath_etype_add(
vxge_hal_vpath_h vpath_handle,
u64 etype)
{
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"
VXGE_OS_STXFMT", etype = %d",
(ptr_t) vpath_handle, (u32) etype);
status = __hal_vpath_rts_table_set(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_ADD_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_ETYPE,
0,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_ETYPE(etype),
0);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_etype_get - Get the first ethertype entry for this vpath
* from Ethertype table.
* @vpath_handle: Vpath handle.
* @etype: Buffer to return Ethertype
*
* Returns the first ethype entry in the list for this vpath.
* see also: vxge_hal_vpath_etype_get_next
*
*/
vxge_hal_status_e
vxge_hal_vpath_etype_get(
vxge_hal_vpath_h vpath_handle,
u64 *etype)
{
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert((vpath_handle != NULL) && (etype != NULL));
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", etype = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle, (ptr_t) etype);
status = __hal_vpath_rts_table_get(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_LIST_FIRST_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_ETYPE,
0,
etype,
NULL);
*etype = VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_ETYPE(*etype);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_etype_get_next - Get the next Ethertype entry for this vpath
* from Ethertype table.
* @vpath_handle: Vpath handle.
* @etype: Buffer to return Ethwrtype
*
* Returns the next Ethwrtype in the list for this vpath.
* see also: vxge_hal_vpath_etype_get
*
*/
vxge_hal_status_e
vxge_hal_vpath_etype_get_next(
vxge_hal_vpath_h vpath_handle,
u64 *etype)
{
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert((vpath_handle != NULL) && (etype != NULL));
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", etype = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle, (ptr_t) etype);
status = __hal_vpath_rts_table_get(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_LIST_NEXT_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_ETYPE,
0,
etype,
NULL);
*etype = VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_ETYPE(*etype);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
status);
return (status);
}
/*
* vxge_hal_vpath_etype_delete - Delete the Ethertype entry for this vpath
* to Ethertype table.
* @vpath_handle: Vpath handle.
* @etype: ethertype to be added for this vpath into the list
*
* Adds the given Ethertype into the list for this vpath.
* see also: vxge_hal_vpath_etype_add, vxge_hal_vpath_etype_get and
* vxge_hal_vpath_etype_get_next
*
*/
vxge_hal_status_e
vxge_hal_vpath_etype_delete(vxge_hal_vpath_h vpath_handle, u64 etype)
{
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"
VXGE_OS_STXFMT", etype = %d",
(ptr_t) vpath_handle, (u32) etype);
status = __hal_vpath_rts_table_set(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_DELETE_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_ETYPE,
0,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_ETYPE(etype),
0);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_port_add - Add the port entry for this vpath
* to port number table.
* @vpath_handle: Vpath handle.
* @port_type: if 0 - Src port or 1 - Dest port
* @protocol: if 0 - TCP or 1 - UDP
* @port: port to be added for this vpath into the list
*
* Adds the given port into the list for this vpath.
* see also: vxge_hal_vpath_port_delete, vxge_hal_vpath_port_get and
* vxge_hal_vpath_port_get_next
*
*/
vxge_hal_status_e
vxge_hal_vpath_port_add(
vxge_hal_vpath_h vpath_handle,
u32 port_type,
u32 protocol,
u32 port)
{
u64 val64;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", port_type = %d, "
"protocol = %d, port = %d", (ptr_t) vpath_handle, port_type,
protocol, port);
val64 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_PN_PORT_NUM(port);
if (port_type)
val64 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_PN_SRC_DEST_SEL;
if (protocol)
val64 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_PN_TCP_UDP_SEL;
status = __hal_vpath_rts_table_set(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_ADD_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_PN,
0,
val64,
0);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
status);
return (status);
}
/*
* vxge_hal_vpath_port_get
* Get the first port number entry for this vpath from port number table.
* @vpath_handle: Vpath handle.
* @port_type: Buffer to return if 0 - Src port or 1 - Dest port
* @protocol: Buffer to return if 0 - TCP or 1 - UDP
* @port: Buffer to return port number
*
* Returns the first port number entry in the list for this vpath.
* see also: vxge_hal_vpath_port_get_next
*
*/
vxge_hal_status_e
vxge_hal_vpath_port_get(
vxge_hal_vpath_h vpath_handle,
u32 *port_type,
u32 *protocol,
u32 *port)
{
u64 val64;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert((vpath_handle != NULL) && (port_type != NULL) &&
(protocol != NULL) && (port != NULL));
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", port_type = 0x"VXGE_OS_STXFMT
", protocol = 0x"VXGE_OS_STXFMT", port = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle, (ptr_t) port_type, (ptr_t) protocol,
(ptr_t) port);
status = __hal_vpath_rts_table_get(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_LIST_FIRST_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_PN,
0,
&val64,
NULL);
*port_type =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_PN_SRC_DEST_SEL(val64);
*protocol =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_PN_TCP_UDP_SEL(val64);
*port = (u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_PN_PORT_NUM(val64);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
status);
return (status);
}
/*
* vxge_hal_vpath_port_get_next
* Get the next port number entry for this vpath from port number table.
* @vpath_handle: Vpath handle.
* @port_type: Buffer to return if 0 - Src port or 1 - Dest port
* @protocol: Buffer to return if 0 - TCP or 1 - UDP
* @port: Buffer to return port number
*
* Returns the next port number entry in the list for this vpath.
* see also: vxge_hal_vpath_port_get
*/
vxge_hal_status_e
vxge_hal_vpath_port_get_next(
vxge_hal_vpath_h vpath_handle,
u32 *port_type,
u32 *protocol,
u32 *port)
{
u64 val64;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert((vpath_handle != NULL) && (port_type != NULL) &&
(protocol != NULL) && (port != NULL));
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", port_type = 0x"VXGE_OS_STXFMT
", protocol = 0x"VXGE_OS_STXFMT", port = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle, (ptr_t) port_type, (ptr_t) protocol,
(ptr_t) port);
status = __hal_vpath_rts_table_get(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_LIST_NEXT_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_PN,
0,
&val64,
NULL);
*port_type =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_PN_SRC_DEST_SEL(val64);
*protocol =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_PN_TCP_UDP_SEL(val64);
*port = (u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_PN_PORT_NUM(val64);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
status);
return (status);
}
/*
* vxge_hal_vpath_port_delete
* Delete the port entry for this vpath to port number table.
* @vpath_handle: Vpath handle.
* @port_type: if 0 - Src port or 1 - Dest port
* @protocol: if 0 - TCP or 1 - UDP
* @port: port to be added for this vpath into the list
*
* Adds the given port into the list for this vpath.
* see also: vxge_hal_vpath_port_add, vxge_hal_vpath_port_get and
* vxge_hal_vpath_port_get_next
*
*/
vxge_hal_status_e
vxge_hal_vpath_port_delete(
vxge_hal_vpath_h vpath_handle,
u32 port_type,
u32 protocol,
u32 port)
{
u64 val64;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", port_type = %d, "
"protocol = %d, port = %d", (ptr_t) vpath_handle, port_type,
protocol, port);
val64 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_PN_PORT_NUM(port);
if (port_type)
val64 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_PN_SRC_DEST_SEL;
if (protocol)
val64 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_PN_TCP_UDP_SEL;
status = __hal_vpath_rts_table_set(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_DELETE_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_PN,
0,
val64,
0);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_rts_rth_set - Set/configure RTS hashing.
* @vpath_handle: Virtual Path handle.
* @algorithm: Algorithm Select
* @hash_type: Hash Type
* @bucket_size: no of least significant bits to be used for hashing.
* @it_switch: Itable switch required
*
* Used to set/configure all RTS hashing related stuff.
*
* See also: vxge_hal_vpath_rts_rth_clr(), vxge_hal_vpath_rts_rth_itable_set().
*/
vxge_hal_status_e
vxge_hal_vpath_rts_rth_set(vxge_hal_vpath_h vpath_handle,
vxge_hal_rth_algoritms_t algorithm,
vxge_hal_rth_hash_types_t *hash_type,
u16 bucket_size,
u16 it_switch)
{
u64 data0, data1;
__hal_device_t *hldev;
__hal_vpath_handle_t *vp;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert(vpath_handle != NULL);
vp = (__hal_vpath_handle_t *) vpath_handle;
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", algorithm = %d, "
"hash_type = 0x"VXGE_OS_STXFMT", bucket_size = %d",
(ptr_t) vpath_handle, algorithm, (ptr_t) hash_type,
bucket_size);
(void) __hal_vpath_rts_table_get(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_READ_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_GEN_CFG,
0,
&data0,
&data1);
if (algorithm == RTH_ALG_NONE) {
data0 &= ~VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_GEN_RTH_EN;
} else {
if (it_switch) {
if (VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_RTH_GEN_ACTIVE_TABLE(
data0))
data0 = 0;
else
data0 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_GEN_ACTIVE_TABLE;
} else {
data0 &= VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_GEN_ACTIVE_TABLE;
}
data0 |= VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_GEN_RTH_EN |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_GEN_BUCKET_SIZE(bucket_size) |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_GEN_ALG_SEL(algorithm);
if (hash_type->hash_type_tcpipv4_en)
data0 |=
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_GEN_RTH_TCP_IPV4_EN;
if (hash_type->hash_type_ipv4_en)
data0 |= VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_GEN_RTH_IPV4_EN;
if (hash_type->hash_type_tcpipv6_en)
data0 |=
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_GEN_RTH_TCP_IPV6_EN;
if (hash_type->hash_type_ipv6_en)
data0 |= VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_GEN_RTH_IPV6_EN;
if (hash_type->hash_type_tcpipv6ex_en)
data0 |=
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_GEN_RTH_TCP_IPV6_EX_EN;
if (hash_type->hash_type_ipv6ex_en)
data0 |= VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_GEN_RTH_IPV6_EX_EN;
}
status = __hal_vpath_rts_table_set(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_WRITE_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_GEN_CFG,
0,
data0,
0);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_rts_rth_get - Read RTS hashing.
* @vpath_handle: Virtual Path handle.
* @algorithm: Buffer to return Algorithm Select
* @hash_type: Buffer to return Hash Type
* @table_select: Buffer to return active Table
* @bucket_size: Buffer to return no of least significant bits used for hashing.
*
* Used to read all RTS hashing related stuff.
*
* See also: vxge_hal_vpath_rts_rth_clr(), vxge_hal_vpath_rts_rth_itable_set(),
* vxge_hal_vpath_rts_rth_set().
*/
vxge_hal_status_e
vxge_hal_vpath_rts_rth_get(vxge_hal_vpath_h vpath_handle,
vxge_hal_rth_algoritms_t *algorithm,
vxge_hal_rth_hash_types_t *hash_type,
u8 *table_select,
u16 *bucket_size)
{
u64 val64;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", algorithm = 0x"VXGE_OS_STXFMT
", hash_type = 0x"VXGE_OS_STXFMT", "
"table_select = 0x"VXGE_OS_STXFMT", "
"bucket_size = 0x"VXGE_OS_STXFMT, (ptr_t) vpath_handle,
(ptr_t) algorithm, (ptr_t) hash_type,
(ptr_t) table_select, (ptr_t) bucket_size);
status = __hal_vpath_rts_table_get(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_READ_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_GEN_CFG,
0,
&val64,
NULL);
*algorithm = (vxge_hal_rth_algoritms_t)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_RTH_GEN_ALG_SEL(val64);
hash_type->hash_type_tcpipv4_en = ((u32)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_RTH_GEN_RTH_TCP_IPV4_EN(val64))
? 1 : 0;
hash_type->hash_type_ipv4_en = ((u32)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_RTH_GEN_RTH_IPV4_EN(val64))
? 1 : 0;
hash_type->hash_type_tcpipv6_en = ((u32)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_RTH_GEN_RTH_TCP_IPV6_EN(val64))
? 1 : 0;
hash_type->hash_type_ipv6_en = ((u32)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_RTH_GEN_RTH_IPV6_EN(val64))
? 1 : 0;
hash_type->hash_type_tcpipv6ex_en = ((u32)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_RTH_GEN_RTH_TCP_IPV6_EX_EN(
val64)) ? 1 : 0;
hash_type->hash_type_ipv6ex_en = ((u32)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_RTH_GEN_RTH_IPV6_EX_EN(val64))
? 1 : 0;
*table_select = ((u32)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_RTH_GEN_ACTIVE_TABLE(val64))
? 1 : 0;
*bucket_size = (u16)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_RTH_GEN_BUCKET_SIZE(val64);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_rts_rth_key_set - Configure 40byte secret for hash calc.
*
* @vpath_handle: Virtual Path ahandle.
* @KeySize: Number of 64-bit words
* @Key: upto 40-byte array of 64-bit values
* This function configures the 40-byte secret which is used for hash
* calculation.
*
* See also: vxge_hal_vpath_rts_rth_clr(), vxge_hal_vpath_rts_rth_set().
*/
vxge_hal_status_e
vxge_hal_vpath_rts_rth_key_set(vxge_hal_vpath_h vpath_handle,
u8 KeySize, u64 *Key)
{
u32 i;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert((vpath_handle != NULL) && (Key != NULL));
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", KeySize = %d"
", Key = 0x"VXGE_OS_STXFMT, (ptr_t) vpath_handle, KeySize,
(ptr_t) Key);
for (i = 0; i < KeySize; i++) {
status = __hal_vpath_rts_table_set(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_WRITE_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_KEY,
i,
vxge_os_htonll(*Key++),
0);
if (status != VXGE_HAL_OK)
break;
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_rts_rth_key_get - Read 40byte secret for hash calc.
*
* @vpath_handle: Virtual Path ahandle.
* @KeySize: Number of 64-bit words
* @Key: Buffer to return the key
* This function reads the 40-byte secret which is used for hash
* calculation.
*
* See also: vxge_hal_vpath_rts_rth_clr(), vxge_hal_vpath_rts_rth_set(),
* vxge_hal_vpath_rts_rth_key_set().
*/
vxge_hal_status_e
vxge_hal_vpath_rts_rth_key_get(vxge_hal_vpath_h vpath_handle,
u8 KeySize, u64 *Key)
{
u32 i;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert((vpath_handle != NULL) && (Key != NULL));
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", KeySize = %d"
", Key = 0x"VXGE_OS_STXFMT, (ptr_t) vpath_handle, KeySize,
(ptr_t) Key);
for (i = 0; i < KeySize; i++) {
status = __hal_vpath_rts_table_get(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_READ_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_KEY,
i,
Key++,
NULL);
if (status != VXGE_HAL_OK)
break;
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_rts_rth_jhash_cfg_set - Configure JHASH algorithm
*
* @vpath_handle: Virtual Path ahandle.
* @golden_ratio: Golden ratio
* @init_value: Initial value
* This function configures JENKIN's HASH algorithm
*
* See also: vxge_hal_vpath_rts_rth_clr(), vxge_hal_vpath_rts_rth_set().
*/
vxge_hal_status_e
vxge_hal_vpath_rts_rth_jhash_cfg_set(vxge_hal_vpath_h vpath_handle,
u32 golden_ratio, u32 init_value)
{
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", golden_ratio = %d"
", init_value = %d", (ptr_t) vpath_handle, golden_ratio,
init_value);
status = __hal_vpath_rts_table_set(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_WRITE_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_JHASH_CFG,
0,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_JHASH_CFG_GOLDEN_RATIO(
golden_ratio) |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_JHASH_CFG_INIT_VALUE(
init_value),
0);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_rts_rth_jhash_cfg_get - Read JHASH algorithm
*
* @vpath_handle: Virtual Path ahandle.
* @golden_ratio: Buffer to return Golden ratio
* @init_value: Buffer to return Initial value
* This function reads JENKIN's HASH algorithm
*
* See also: vxge_hal_vpath_rts_rth_clr(), vxge_hal_vpath_rts_rth_set(),
* vxge_hal_vpath_rts_rth_jhash_cfg_set().
*/
vxge_hal_status_e
vxge_hal_vpath_rts_rth_jhash_cfg_get(vxge_hal_vpath_h vpath_handle,
u32 * golden_ratio, u32 *init_value)
{
u64 val64;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", "
"golden_ratio = 0x"VXGE_OS_STXFMT", init_value = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle, (ptr_t) golden_ratio, (ptr_t) init_value);
status = __hal_vpath_rts_table_get(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_READ_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_JHASH_CFG,
0,
&val64,
NULL);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
*golden_ratio = (u32)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_RTH_JHASH_CFG_GOLDEN_RATIO(
val64);
*init_value = (u32)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_RTH_JHASH_CFG_INIT_VALUE(
val64);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_rts_rth_mask_set - Set/configure JHASH mask.
* @vpath_handle: Virtual Path ahandle.
* @table_size: Size of the mask table
* @hash_mask_ipv6sa: IPv6SA Hash Mask
* @hash_mask_ipv6da: IPv6DA Hash Mask
* @hash_mask_ipv4sa: IPv4SA Hash Mask
* @hash_mask_ipv4da: IPv4DA Hash Mask
* @hash_mask_l4sp: L4SP Hash Mask
* @hash_mask_l4dp: L4DP Hash Mask
*
* Used to set/configure indirection table.
* It enables the required no of entries in the IT.
* It adds entries to the IT.
*
* See also: vxge_hal_vpath_rts_rth_clr(), vxge_hal_vpath_rts_rth_set().
*/
vxge_hal_status_e
vxge_hal_vpath_rts_rth_mask_set(vxge_hal_vpath_h vpath_handle,
u32 table_size,
u32 *hash_mask_ipv6sa,
u32 *hash_mask_ipv6da,
u32 *hash_mask_ipv4sa,
u32 *hash_mask_ipv4da,
u32 *hash_mask_l4sp,
u32 *hash_mask_l4dp)
{
u32 i;
u64 val64;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert((vpath_handle != NULL) && (hash_mask_ipv6sa != NULL) &&
(hash_mask_ipv6da != NULL) && (hash_mask_ipv4sa != NULL) &&
(hash_mask_ipv4da != NULL) && (hash_mask_l4sp != NULL) &&
(hash_mask_l4dp != NULL));
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", "
"table_size = %d, hash_mask_ipv6sa = 0x"VXGE_OS_STXFMT
", hash_mask_ipv6da = 0x"VXGE_OS_STXFMT
", hash_mask_ipv4sa = 0x"VXGE_OS_STXFMT
", hash_mask_ipv4da = 0x"VXGE_OS_STXFMT
", hash_mask_l4sp = 0x"VXGE_OS_STXFMT
", hash_mask_l4dp = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle, table_size, (ptr_t) hash_mask_ipv6sa,
(ptr_t) hash_mask_ipv6da, (ptr_t) hash_mask_ipv4sa,
(ptr_t) hash_mask_ipv4da, (ptr_t) hash_mask_l4sp,
(ptr_t) hash_mask_l4dp);
for (i = 0; i < table_size; i++) {
val64 =
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_MASK_IPV6_SA_MASK(
*hash_mask_ipv6sa++) |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_MASK_IPV6_DA_MASK(
*hash_mask_ipv6da++) |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_MASK_IPV4_SA_MASK(
*hash_mask_ipv4sa++) |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_MASK_IPV4_DA_MASK(
*hash_mask_ipv4da++) |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_MASK_L4SP_MASK(
*hash_mask_l4sp++) |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_MASK_L4DP_MASK(
*hash_mask_l4dp++);
status = __hal_vpath_rts_table_set(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_WRITE_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_MASK,
i,
val64,
0);
if (status != VXGE_HAL_OK)
break;
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_rts_rth_mask_get - Read JHASH mask.
* @vpath_handle: Virtual Path ahandle.
* @table_size: Size of the mask table
* @hash_mask_ipv6sa: Buffer to return IPv6SA Hash Mask
* @hash_mask_ipv6da: Buffer to return IPv6DA Hash Mask
* @hash_mask_ipv4sa: Buffer to return IPv4SA Hash Mask
* @hash_mask_ipv4da: Buffer to return IPv4DA Hash Mask
* @hash_mask_l4sp: Buffer to return L4SP Hash Mask
* @hash_mask_l4dp: Buffer to return L4DP Hash Mask
*
* Used to read rth mask.
*
* See also: vxge_hal_vpath_rts_rth_clr(), vxge_hal_vpath_rts_rth_set(),
* vxge_hal_vpath_rts_rth_mask_set().
*/
vxge_hal_status_e
vxge_hal_vpath_rts_rth_mask_get(vxge_hal_vpath_h vpath_handle,
u32 table_size,
u32 *hash_mask_ipv6sa,
u32 *hash_mask_ipv6da,
u32 *hash_mask_ipv4sa,
u32 *hash_mask_ipv4da,
u32 *hash_mask_l4sp,
u32 *hash_mask_l4dp)
{
u32 i;
u64 val64;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert((vpath_handle != NULL) && (hash_mask_ipv6sa != NULL) &&
(hash_mask_ipv6da != NULL) && (hash_mask_ipv4sa != NULL) &&
(hash_mask_ipv4da != NULL) && (hash_mask_l4sp != NULL) &&
(hash_mask_l4dp != NULL));
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", "
"table_size = %d, hash_mask_ipv6sa = 0x"VXGE_OS_STXFMT
", hash_mask_ipv6da = 0x"VXGE_OS_STXFMT
", hash_mask_ipv4sa = 0x"VXGE_OS_STXFMT
", hash_mask_ipv4da = 0x"VXGE_OS_STXFMT
", hash_mask_l4sp = 0x"VXGE_OS_STXFMT
", hash_mask_l4dp = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle, table_size, (ptr_t) hash_mask_ipv6sa,
(ptr_t) hash_mask_ipv6da, (ptr_t) hash_mask_ipv4sa,
(ptr_t) hash_mask_ipv4da, (ptr_t) hash_mask_l4sp,
(ptr_t) hash_mask_l4dp);
for (i = 0; i < table_size; i++) {
status = __hal_vpath_rts_table_get(vpath_handle,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_READ_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_MASK,
i,
&val64,
NULL);
if (status != VXGE_HAL_OK)
break;
*hash_mask_ipv6sa++ = (u32)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_RTH_MASK_IPV6_SA_MASK(
val64);
*hash_mask_ipv6da++ = (u32)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_MASK_IPV6_DA_MASK(
val64);
*hash_mask_ipv4sa++ = (u32)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_MASK_IPV4_SA_MASK(
val64);
*hash_mask_ipv4da++ = (u32)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_MASK_IPV4_DA_MASK(
val64);
*hash_mask_l4sp++ = (u32)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_MASK_L4SP_MASK(val64);
*hash_mask_l4dp++ = (u32)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_MASK_L4DP_MASK(val64);
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_rts_rth_itable_set - Set/configure indirection table (IT).
* @vpath_handles: Virtual Path handles.
* @vpath_count: Number of vpath handles passed in vpath_handles
* @itable: Pointer to indirection table
* @itable_size: Number of entries in itable
*
* Used to set/configure indirection table.
* It enables the required no of entries in the IT.
* It adds entries to the IT.
*
* See also: vxge_hal_vpath_rts_rth_clr(), vxge_hal_vpath_rts_rth_set().
*/
vxge_hal_status_e
vxge_hal_vpath_rts_rth_itable_set(vxge_hal_vpath_h *vpath_handles,
u32 vpath_count,
u8 *itable,
u32 itable_size)
{
u32 i, j, k, l, items[4];
u64 data0;
u64 data1;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handles[0];
vxge_assert((vpath_handles != NULL) && (itable != NULL));
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", vpath_count = %d, "
"itable = 0x"VXGE_OS_STXFMT", itable_size = %d",
(ptr_t) vpath_handles, vpath_count, (ptr_t) itable, itable_size);
if (hldev->header.config.rth_it_type == VXGE_HAL_RTH_IT_TYPE_SOLO_IT) {
for (j = 0; j < itable_size; j++) {
data1 = 0;
data0 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_SOLO_IT_BUCKET_DATA(
itable[j]);
status = __hal_vpath_rts_table_set(vpath_handles[0],
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_WRITE_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_SOLO_IT,
j,
data0,
data1);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath(
"<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
status);
return (status);
}
}
for (j = 0; j < itable_size; j++) {
data1 = 0;
data0 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_SOLO_IT_ENTRY_EN |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_SOLO_IT_BUCKET_DATA(itable[j]);
status = __hal_vpath_rts_table_set(vpath_handles[itable[j]],
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_WRITE_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_SOLO_IT,
j, data0, data1);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath(
"<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
status);
return (status);
}
}
} else {
for (i = 0; i < vpath_count; i++) {
for (k = 0, j = 0; k < itable_size; k++) {
if (itable[k] != i)
continue;
for (l = j; l < 4; l++)
items[l] = k;
if ((j++ == 3) || (k == (itable_size - 1))) {
data0 =
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_ITEM0_BUCKET_NUM(
items[0]) |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_ITEM0_ENTRY_EN |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_ITEM0_BUCKET_DATA(
itable[items[0]]) |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_ITEM1_BUCKET_NUM(
items[1]) |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_ITEM1_ENTRY_EN |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_ITEM1_BUCKET_DATA(
itable[items[1]]);
data1 =
VXGE_HAL_RTS_ACCESS_STEER_DATA1_RTH_ITEM0_BUCKET_NUM(
items[2]) |
VXGE_HAL_RTS_ACCESS_STEER_DATA1_RTH_ITEM0_ENTRY_EN |
VXGE_HAL_RTS_ACCESS_STEER_DATA1_RTH_ITEM0_BUCKET_DATA(
itable[items[2]]) |
VXGE_HAL_RTS_ACCESS_STEER_DATA1_RTH_ITEM1_BUCKET_NUM(
items[3]) |
VXGE_HAL_RTS_ACCESS_STEER_DATA1_RTH_ITEM1_ENTRY_EN |
VXGE_HAL_RTS_ACCESS_STEER_DATA1_RTH_ITEM1_BUCKET_DATA(
itable[items[3]]);
status =
__hal_vpath_rts_table_set(vpath_handles[i],
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_WRITE_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_MULTI_IT,
0,
data0,
data1);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath(
"<== %s:%s:%d Result: %d",
__FILE__, __func__,
__LINE__, status);
return (status);
}
j = 0;
}
}
}
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_rts_rth_itable_get - Read indirection table(IT).
* @vpath_handles: Virtual Path handles.
* @vpath_count: Number of vpath handles passed in vpath_handles
* @itable: Pointer to the buffer to return indirection table
* @itable_size: pointer to buffer to return Number of entries in itable
*
* Used to read indirection table.
*
* See also: vxge_hal_vpath_rts_rth_clr(), vxge_hal_vpath_rts_rth_set(),
* vxge_hal_vpath_rts_rth_itable_set().
*/
vxge_hal_status_e
vxge_hal_vpath_rts_rth_itable_get(vxge_hal_vpath_h *vpath_handles,
u32 vpath_count,
u8 *itable,
u32 itable_size)
{
u32 i, j;
u64 data0;
u64 data1;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handles[0];
vxge_assert((vpath_handles != NULL) && (itable != NULL));
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", vpath_count = %d, "
"itable = 0x"VXGE_OS_STXFMT", itable_size = %d",
(ptr_t) vpath_handles, vpath_count, (ptr_t) itable, itable_size);
if (hldev->header.config.rth_it_type == VXGE_HAL_RTH_IT_TYPE_SOLO_IT) {
for (i = 0; i < vpath_count; i++) {
for (j = 0; j < itable_size; j++) {
status = __hal_vpath_rts_table_get(vpath_handles[i],
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_READ_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_SOLO_IT,
j,
&data0,
&data1);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath(
"<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
status);
return (status);
}
if ((u8) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_RTH_SOLO_IT_ENTRY_EN(data0)) {
itable[j] = (u8) i;
}
}
}
} else {
for (i = 0; i < vpath_count; i++) {
for (j = 0; j < itable_size; ) {
data0 = 0;
data1 = 0;
if (j < itable_size)
data0 =
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_ITEM0_BUCKET_NUM(j);
if (j + 1 < itable_size)
data0 |= VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_ITEM1_BUCKET_NUM(j + 1);
if (j + 2 < itable_size)
data1 = VXGE_HAL_RTS_ACCESS_STEER_DATA1_RTH_ITEM0_BUCKET_NUM(j + 2);
if (j + 3 < itable_size)
data1 |= VXGE_HAL_RTS_ACCESS_STEER_DATA1_RTH_ITEM1_BUCKET_NUM(j + 3);
status = __hal_vpath_rts_table_get(
vpath_handles[i],
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_READ_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_MULTI_IT,
0, &data0, &data1);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath(
"<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
status);
return (status);
}
if (j < itable_size) {
if ((u8)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_RTH_ITEM0_ENTRY_EN(data0)) {
itable[j] = (u8) i;
}
j++;
}
if (j < itable_size) {
if ((u8)
VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_RTH_ITEM1_ENTRY_EN(data0)) {
itable[j] = (u8) i;
}
j++;
}
if (j < itable_size) {
if ((u8)
VXGE_HAL_RTS_ACCESS_STEER_DATA1_GET_RTH_ITEM0_ENTRY_EN(data1)) {
itable[j] = (u8) i;
}
j++;
}
if (j < itable_size) {
if ((u8)
VXGE_HAL_RTS_ACCESS_STEER_DATA1_GET_RTH_ITEM1_ENTRY_EN(data1)) {
itable[j] = (u8) i;
}
j++;
}
}
}
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_rts_rth_clr - Clear RTS hashing.
* @vpath_handles: Virtual Path handles.
* @vpath_count: Number of vpath handles passed in vpath_handles
*
* This function is used to clear all RTS hashing related stuff.
*
* See also: vxge_hal_vpath_rts_rth_set(), vxge_hal_vpath_rts_rth_itable_set().
*/
vxge_hal_status_e
vxge_hal_vpath_rts_rth_clr(
vxge_hal_vpath_h *vpath_handles,
u32 vpath_count)
{
u64 data0, data1;
u32 i, j;
__hal_device_t *hldev;
__hal_vpath_handle_t *vp;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert(vpath_handles != NULL);
vp = (__hal_vpath_handle_t *) vpath_handles[0];
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handles = 0x"VXGE_OS_STXFMT", vpath_count = %d",
(ptr_t) vpath_handles, vpath_count);
if (hldev->header.config.rth_it_type == VXGE_HAL_RTH_IT_TYPE_SOLO_IT) {
for (j = 0; j < VXGE_HAL_MAX_ITABLE_ENTRIES; j++) {
data0 = 0;
data1 = 0;
status = __hal_vpath_rts_table_set(vpath_handles[0],
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_WRITE_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_SOLO_IT,
j,
data0,
data1);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath(
"<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
status);
return (status);
}
}
} else {
for (i = 0; i < vpath_count; i++) {
for (j = 0; j < VXGE_HAL_MAX_ITABLE_ENTRIES; j += 4) {
data0 =
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_ITEM0_BUCKET_NUM(j) |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_RTH_ITEM1_BUCKET_NUM(j + 1);
data1 =
VXGE_HAL_RTS_ACCESS_STEER_DATA1_RTH_ITEM0_BUCKET_NUM(j + 2) |
VXGE_HAL_RTS_ACCESS_STEER_DATA1_RTH_ITEM1_BUCKET_NUM(j + 3);
status = __hal_vpath_rts_table_set(vpath_handles[i],
VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_WRITE_ENTRY,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_RTH_MULTI_IT,
0,
data0,
data1);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath(
"<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
status);
return (status);
}
}
}
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_promisc_enable - Enable promiscuous mode.
* @vpath_handle: Vpath handle.
*
* Enable promiscuous mode of X3100 operation.
*
* See also: vxge_hal_vpath_promisc_disable().
*/
vxge_hal_status_e
vxge_hal_vpath_promisc_enable(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->ringh == NULL) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_INVALID_HANDLE);
return (VXGE_HAL_ERR_INVALID_HANDLE);
}
if (vpath->promisc_en == VXGE_HAL_VP_PROMISC_ENABLE) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
val64 = vxge_os_pio_mem_read64(
hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rxmac_vcfg0);
val64 |= VXGE_HAL_RXMAC_VCFG0_UCAST_ALL_ADDR_EN |
VXGE_HAL_RXMAC_VCFG0_MCAST_ALL_ADDR_EN |
VXGE_HAL_RXMAC_VCFG0_BCAST_EN |
VXGE_HAL_RXMAC_VCFG0_ALL_VID_EN;
vxge_os_pio_mem_write64(
hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->rxmac_vcfg0);
vpath->promisc_en = VXGE_HAL_VP_PROMISC_ENABLE;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_promisc_disable - Disable promiscuous mode.
* @vpath_handle: Vpath handle.
*
* Disable promiscuous mode of X3100 operation.
*
* See also: vxge_hal_vpath_promisc_enable().
*/
vxge_hal_status_e
vxge_hal_vpath_promisc_disable(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->ringh == NULL) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return (VXGE_HAL_ERR_INVALID_HANDLE);
}
if (vpath->promisc_en == VXGE_HAL_VP_PROMISC_DISABLE) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
val64 = vxge_os_pio_mem_read64(
hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rxmac_vcfg0);
if (vpath->vp_config->rpa_ucast_all_addr_en ==
VXGE_HAL_VPATH_RPA_UCAST_ALL_ADDR_DISABLE) {
val64 &= ~VXGE_HAL_RXMAC_VCFG0_UCAST_ALL_ADDR_EN;
}
if (vpath->vp_config->rpa_mcast_all_addr_en ==
VXGE_HAL_VPATH_RPA_MCAST_ALL_ADDR_DISABLE) {
val64 &= ~VXGE_HAL_RXMAC_VCFG0_MCAST_ALL_ADDR_EN;
}
if (vpath->vp_config->rpa_bcast_en ==
VXGE_HAL_VPATH_RPA_BCAST_DISABLE) {
val64 &= ~VXGE_HAL_RXMAC_VCFG0_BCAST_EN;
}
if (vpath->vp_config->rpa_all_vid_en ==
VXGE_HAL_VPATH_RPA_ALL_VID_DISABLE) {
val64 &= ~VXGE_HAL_RXMAC_VCFG0_ALL_VID_EN;
}
vxge_os_pio_mem_write64(
hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->rxmac_vcfg0);
vpath->promisc_en = VXGE_HAL_VP_PROMISC_DISABLE;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_bcast_enable - Enable broadcast
* @vpath_handle: Vpath handle.
*
* Enable receiving broadcasts.
*/
vxge_hal_status_e
vxge_hal_vpath_bcast_enable(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->ringh == NULL) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_INVALID_HANDLE);
return (VXGE_HAL_ERR_INVALID_HANDLE);
}
if (vpath->vp_config->rpa_bcast_en ==
VXGE_HAL_VPATH_RPA_BCAST_ENABLE) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rxmac_vcfg0);
val64 |= VXGE_HAL_RXMAC_VCFG0_BCAST_EN;
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->rxmac_vcfg0);
vpath->vp_config->rpa_bcast_en = VXGE_HAL_VPATH_RPA_BCAST_ENABLE;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_bcast_disable - Disable broadcast
* @vpath_handle: Vpath handle.
*
* Disable receiving broadcasts.
*/
vxge_hal_status_e
vxge_hal_vpath_bcast_disable(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->ringh == NULL) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return (VXGE_HAL_ERR_INVALID_HANDLE);
}
if (vpath->vp_config->rpa_bcast_en ==
VXGE_HAL_VPATH_RPA_BCAST_DISABLE) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
val64 = vxge_os_pio_mem_read64(
hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rxmac_vcfg0);
val64 &= ~VXGE_HAL_RXMAC_VCFG0_BCAST_EN;
vxge_os_pio_mem_write64(
hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->rxmac_vcfg0);
vpath->vp_config->rpa_bcast_en = VXGE_HAL_VPATH_RPA_BCAST_DISABLE;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_mcast_enable - Enable multicast addresses.
* @vpath_handle: Vpath handle.
*
* Enable X3100 multicast addresses.
* Returns: VXGE_HAL_OK on success.
*
*/
vxge_hal_status_e
vxge_hal_vpath_mcast_enable(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->ringh == NULL) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return (VXGE_HAL_ERR_INVALID_HANDLE);
}
if (vpath->vp_config->rpa_mcast_all_addr_en ==
VXGE_HAL_VPATH_RPA_MCAST_ALL_ADDR_ENABLE) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
val64 = vxge_os_pio_mem_read64(
hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rxmac_vcfg0);
val64 |= VXGE_HAL_RXMAC_VCFG0_MCAST_ALL_ADDR_EN;
vxge_os_pio_mem_write64(
hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->rxmac_vcfg0);
vpath->vp_config->rpa_mcast_all_addr_en =
VXGE_HAL_VPATH_RPA_MCAST_ALL_ADDR_ENABLE;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_mcast_disable - Disable multicast addresses.
* @vpath_handle: Vpath handle.
*
* Disable X3100 multicast addresses.
* Returns: VXGE_HAL_OK - success.
* VXGE_HAL_INF_MEM_STROBE_CMD_EXECUTING - Failed to disable mcast
* feature within the time(timeout).
*
*/
vxge_hal_status_e
vxge_hal_vpath_mcast_disable(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->ringh == NULL) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return (VXGE_HAL_ERR_INVALID_HANDLE);
}
if (vpath->vp_config->rpa_mcast_all_addr_en ==
VXGE_HAL_VPATH_RPA_MCAST_ALL_ADDR_DISABLE) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
val64 = vxge_os_pio_mem_read64(
hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rxmac_vcfg0);
val64 &= ~VXGE_HAL_RXMAC_VCFG0_MCAST_ALL_ADDR_EN;
vxge_os_pio_mem_write64(
hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->rxmac_vcfg0);
vpath->vp_config->rpa_mcast_all_addr_en =
VXGE_HAL_VPATH_RPA_MCAST_ALL_ADDR_DISABLE;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_ucast_enable - Enable unicast addresses.
* @vpath_handle: Vpath handle.
*
* Enable X3100 unicast addresses.
* Returns: VXGE_HAL_OK on success.
*
*/
vxge_hal_status_e
vxge_hal_vpath_ucast_enable(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->ringh == NULL) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return (VXGE_HAL_ERR_INVALID_HANDLE);
}
if (vpath->vp_config->rpa_ucast_all_addr_en ==
VXGE_HAL_VPATH_RPA_UCAST_ALL_ADDR_ENABLE) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
val64 = vxge_os_pio_mem_read64(
hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rxmac_vcfg0);
val64 |= VXGE_HAL_RXMAC_VCFG0_UCAST_ALL_ADDR_EN;
vxge_os_pio_mem_write64(
hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->rxmac_vcfg0);
vpath->vp_config->rpa_ucast_all_addr_en =
VXGE_HAL_VPATH_RPA_UCAST_ALL_ADDR_ENABLE;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_ucast_disable - Disable unicast addresses.
* @vpath_handle: Vpath handle.
*
* Disable X3100 unicast addresses.
* Returns: VXGE_HAL_OK - success.
* VXGE_HAL_INF_MEM_STROBE_CMD_EXECUTING - Failed to disable mcast
* feature within the time(timeout).
*
*/
vxge_hal_status_e
vxge_hal_vpath_ucast_disable(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->ringh == NULL) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return (VXGE_HAL_ERR_INVALID_HANDLE);
}
if (vpath->vp_config->rpa_ucast_all_addr_en ==
VXGE_HAL_VPATH_RPA_UCAST_ALL_ADDR_DISABLE) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
val64 = vxge_os_pio_mem_read64(
hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rxmac_vcfg0);
val64 &= ~VXGE_HAL_RXMAC_VCFG0_UCAST_ALL_ADDR_EN;
vxge_os_pio_mem_write64(
hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->rxmac_vcfg0);
vpath->vp_config->rpa_ucast_all_addr_en =
VXGE_HAL_VPATH_RPA_UCAST_ALL_ADDR_DISABLE;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_all_vid_enable - Enable all Vlan Ids.
* @vpath_handle: Vpath handle.
*
* Enable X3100 vlan ids.
* Returns: VXGE_HAL_OK on success.
*
*/
vxge_hal_status_e
vxge_hal_vpath_all_vid_enable(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->ringh == NULL) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return (VXGE_HAL_ERR_INVALID_HANDLE);
}
if (vpath->vp_config->rpa_all_vid_en ==
VXGE_HAL_VPATH_RPA_ALL_VID_ENABLE) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
val64 = vxge_os_pio_mem_read64(
hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rxmac_vcfg0);
val64 |= VXGE_HAL_RXMAC_VCFG0_ALL_VID_EN;
vxge_os_pio_mem_write64(
hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->rxmac_vcfg0);
vpath->vp_config->rpa_all_vid_en = VXGE_HAL_VPATH_RPA_ALL_VID_ENABLE;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_all_vid_disable - Disable all Vlan Ids.
* @vpath_handle: Vpath handle.
*
* Disable X3100 vlan ids.
* Returns: VXGE_HAL_OK - success.
*
*/
vxge_hal_status_e
vxge_hal_vpath_all_vid_disable(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->ringh == NULL) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return (VXGE_HAL_ERR_INVALID_HANDLE);
}
if (vpath->vp_config->rpa_all_vid_en ==
VXGE_HAL_VPATH_RPA_ALL_VID_DISABLE) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
val64 = vxge_os_pio_mem_read64(
hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rxmac_vcfg0);
val64 &= ~VXGE_HAL_RXMAC_VCFG0_ALL_VID_EN;
vxge_os_pio_mem_write64(
hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->rxmac_vcfg0);
vpath->vp_config->rpa_all_vid_en = VXGE_HAL_VPATH_RPA_ALL_VID_DISABLE;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_strip_vlan_tag_enable - Enable strip vlan tag.
* @vpath_handle: Vpath handle.
*
* Enable X3100 strip vlan tag.
* Returns: VXGE_HAL_OK on success.
*
*/
vxge_hal_status_e
vxge_hal_vpath_strip_vlan_tag_enable(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->ringh == NULL) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return (VXGE_HAL_ERR_INVALID_HANDLE);
}
if (vpath->vp_config->rpa_strip_vlan_tag ==
VXGE_HAL_VPATH_RPA_STRIP_VLAN_TAG_ENABLE) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->xmac_rpa_vcfg);
val64 |= VXGE_HAL_XMAC_RPA_VCFG_STRIP_VLAN_TAG;
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->xmac_rpa_vcfg);
vpath->vp_config->rpa_strip_vlan_tag =
VXGE_HAL_VPATH_RPA_STRIP_VLAN_TAG_ENABLE;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_strip_vlan_tag_disable - Disable strip vlan tag.
* @vpath_handle: Vpath handle.
*
* Disable X3100 strip vlan tag.
* Returns: VXGE_HAL_OK - success.
*
*/
vxge_hal_status_e
vxge_hal_vpath_strip_vlan_tag_disable(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->ringh == NULL) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return (VXGE_HAL_ERR_INVALID_HANDLE);
}
if (vpath->vp_config->rpa_strip_vlan_tag ==
VXGE_HAL_VPATH_RPA_STRIP_VLAN_TAG_DISABLE) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->xmac_rpa_vcfg);
val64 &= ~VXGE_HAL_XMAC_RPA_VCFG_STRIP_VLAN_TAG;
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->xmac_rpa_vcfg);
vpath->vp_config->rpa_strip_vlan_tag =
VXGE_HAL_VPATH_RPA_STRIP_VLAN_TAG_DISABLE;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_tpa_set - Set tpa parameters.
* @vpath_handle: Virtual Path ahandle.
* @params: vxge_hal_vpath_tpa_params {} structure with parameters
*
* The function sets the tpa parametrs for the vpath.
*
* See also: vxge_hal_vpath_tpa_params {}
*/
vxge_hal_status_e
vxge_hal_vpath_tpa_set(vxge_hal_vpath_h vpath_handle,
vxge_hal_vpath_tpa_params *params)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert((vpath_handle != NULL) && (params != NULL));
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", params = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle, (ptr_t) params);
if (vpath->fifoh == NULL) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return (VXGE_HAL_ERR_INVALID_HANDLE);
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->tpa_cfg);
if (params->tpa_ignore_frame_error != VXGE_HAL_DEFAULT_32) {
if (params->tpa_ignore_frame_error)
val64 |= VXGE_HAL_TPA_CFG_IGNORE_FRAME_ERR;
else
val64 &= ~VXGE_HAL_TPA_CFG_IGNORE_FRAME_ERR;
}
if (params->tpa_ipv6_keep_searching != VXGE_HAL_DEFAULT_32) {
if (params->tpa_ipv6_keep_searching)
val64 &= ~VXGE_HAL_TPA_CFG_IPV6_STOP_SEARCHING;
else
val64 |= VXGE_HAL_TPA_CFG_IPV6_STOP_SEARCHING;
}
if (params->tpa_l4_pshdr_present != VXGE_HAL_DEFAULT_32) {
if (params->tpa_l4_pshdr_present)
val64 |= VXGE_HAL_TPA_CFG_L4_PSHDR_PRESENT;
else
val64 &= ~VXGE_HAL_TPA_CFG_L4_PSHDR_PRESENT;
}
if (params->tpa_support_mobile_ipv6_hdrs != VXGE_HAL_DEFAULT_32) {
if (params->tpa_support_mobile_ipv6_hdrs)
val64 |= VXGE_HAL_TPA_CFG_SUPPORT_MOBILE_IPV6_HDRS;
else
val64 &= ~VXGE_HAL_TPA_CFG_SUPPORT_MOBILE_IPV6_HDRS;
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tpa_cfg);
vpath->vp_config->tpa_ignore_frame_error =
params->tpa_ignore_frame_error;
vpath->vp_config->tpa_l4_pshdr_present =
params->tpa_l4_pshdr_present;
vpath->vp_config->tpa_support_mobile_ipv6_hdrs =
params->tpa_support_mobile_ipv6_hdrs;
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->tx_protocol_assist_cfg);
if (params->tpa_lsov2_en != VXGE_HAL_DEFAULT_32) {
if (params->tpa_lsov2_en)
val64 |= VXGE_HAL_TX_PROTOCOL_ASSIST_CFG_LSOV2_EN;
else
val64 &= ~VXGE_HAL_TX_PROTOCOL_ASSIST_CFG_LSOV2_EN;
}
if (params->tpa_ipv6_keep_searching != VXGE_HAL_DEFAULT_32) {
if (params->tpa_ipv6_keep_searching)
val64 |=
VXGE_HAL_TX_PROTOCOL_ASSIST_CFG_IPV6_KEEP_SEARCHING;
else
val64 &=
~VXGE_HAL_TX_PROTOCOL_ASSIST_CFG_IPV6_KEEP_SEARCHING;
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tx_protocol_assist_cfg);
vpath->vp_config->tpa_lsov2_en = params->tpa_lsov2_en;
vpath->vp_config->tpa_ipv6_keep_searching =
params->tpa_ipv6_keep_searching;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_rpa_set - Set rpa parameters.
* @vpath_handle: Virtual Path ahandle.
* @params: vxge_hal_vpath_rpa_params {} structure with parameters
*
* The function sets the rpa parametrs for the vpath.
*
* See also: vxge_hal_vpath_rpa_params {}
*/
vxge_hal_status_e
vxge_hal_vpath_rpa_set(vxge_hal_vpath_h vpath_handle,
vxge_hal_vpath_rpa_params *params)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert((vpath_handle != NULL) && (params != NULL));
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT", params = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle, (ptr_t) params);
if (vpath->ringh == NULL) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return (VXGE_HAL_ERR_INVALID_HANDLE);
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->xmac_rpa_vcfg);
if (params->rpa_ipv4_tcp_incl_ph != VXGE_HAL_DEFAULT_32) {
if (params->rpa_ipv4_tcp_incl_ph)
val64 |= VXGE_HAL_XMAC_RPA_VCFG_IPV4_TCP_INCL_PH;
else
val64 &= ~VXGE_HAL_XMAC_RPA_VCFG_IPV4_TCP_INCL_PH;
}
if (params->rpa_ipv6_tcp_incl_ph != VXGE_HAL_DEFAULT_32) {
if (params->rpa_ipv6_tcp_incl_ph)
val64 |= VXGE_HAL_XMAC_RPA_VCFG_IPV6_TCP_INCL_PH;
else
val64 &= ~VXGE_HAL_XMAC_RPA_VCFG_IPV6_TCP_INCL_PH;
}
if (params->rpa_ipv4_udp_incl_ph != VXGE_HAL_DEFAULT_32) {
if (params->rpa_ipv4_udp_incl_ph)
val64 |= VXGE_HAL_XMAC_RPA_VCFG_IPV4_UDP_INCL_PH;
else
val64 &= ~VXGE_HAL_XMAC_RPA_VCFG_IPV4_UDP_INCL_PH;
}
if (params->rpa_ipv6_udp_incl_ph != VXGE_HAL_DEFAULT_32) {
if (params->rpa_ipv6_udp_incl_ph)
val64 |= VXGE_HAL_XMAC_RPA_VCFG_IPV6_UDP_INCL_PH;
else
val64 &= ~VXGE_HAL_XMAC_RPA_VCFG_IPV6_UDP_INCL_PH;
}
if (params->rpa_l4_incl_cf != VXGE_HAL_DEFAULT_32) {
if (params->rpa_l4_incl_cf)
val64 |= VXGE_HAL_XMAC_RPA_VCFG_L4_INCL_CF;
else
val64 &= ~VXGE_HAL_XMAC_RPA_VCFG_L4_INCL_CF;
}
if (params->rpa_strip_vlan_tag != VXGE_HAL_DEFAULT_32) {
if (params->rpa_strip_vlan_tag)
val64 |= VXGE_HAL_XMAC_RPA_VCFG_STRIP_VLAN_TAG;
else
val64 &= ~VXGE_HAL_XMAC_RPA_VCFG_STRIP_VLAN_TAG;
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->xmac_rpa_vcfg);
vpath->vp_config->rpa_ipv4_tcp_incl_ph = params->rpa_ipv4_tcp_incl_ph;
vpath->vp_config->rpa_ipv6_tcp_incl_ph = params->rpa_ipv6_tcp_incl_ph;
vpath->vp_config->rpa_ipv4_udp_incl_ph = params->rpa_ipv4_udp_incl_ph;
vpath->vp_config->rpa_ipv6_udp_incl_ph = params->rpa_ipv6_udp_incl_ph;
vpath->vp_config->rpa_l4_incl_cf = params->rpa_l4_incl_cf;
vpath->vp_config->rpa_strip_vlan_tag = params->rpa_strip_vlan_tag;
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rxmac_vcfg0);
if (params->rpa_ucast_all_addr_en != VXGE_HAL_DEFAULT_32) {
if (params->rpa_ucast_all_addr_en)
val64 |= VXGE_HAL_RXMAC_VCFG0_UCAST_ALL_ADDR_EN;
else
val64 &= ~VXGE_HAL_RXMAC_VCFG0_UCAST_ALL_ADDR_EN;
}
if (params->rpa_mcast_all_addr_en != VXGE_HAL_DEFAULT_32) {
if (params->rpa_mcast_all_addr_en)
val64 |= VXGE_HAL_RXMAC_VCFG0_MCAST_ALL_ADDR_EN;
else
val64 &= ~VXGE_HAL_RXMAC_VCFG0_MCAST_ALL_ADDR_EN;
}
if (params->rpa_bcast_en != VXGE_HAL_DEFAULT_32) {
if (params->rpa_bcast_en)
val64 |= VXGE_HAL_RXMAC_VCFG0_BCAST_EN;
else
val64 &= ~VXGE_HAL_RXMAC_VCFG0_BCAST_EN;
}
if (params->rpa_all_vid_en != VXGE_HAL_DEFAULT_32) {
if (params->rpa_all_vid_en)
val64 |= VXGE_HAL_RXMAC_VCFG0_ALL_VID_EN;
else
val64 &= ~VXGE_HAL_RXMAC_VCFG0_ALL_VID_EN;
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->rxmac_vcfg0);
vpath->vp_config->rpa_ucast_all_addr_en = params->rpa_ucast_all_addr_en;
vpath->vp_config->rpa_mcast_all_addr_en = params->rpa_mcast_all_addr_en;
vpath->vp_config->rpa_bcast_en = params->rpa_bcast_en;
vpath->vp_config->rpa_all_vid_en = params->rpa_all_vid_en;
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->fau_rpa_vcfg);
if (params->rpa_l4_comp_csum != VXGE_HAL_DEFAULT_32) {
if (params->rpa_l4_comp_csum)
val64 |= VXGE_HAL_FAU_RPA_VCFG_L4_COMP_CSUM;
else
val64 &= ~VXGE_HAL_FAU_RPA_VCFG_L4_COMP_CSUM;
}
if (params->rpa_l3_incl_cf != VXGE_HAL_DEFAULT_32) {
if (params->rpa_l3_incl_cf)
val64 |= VXGE_HAL_FAU_RPA_VCFG_L3_INCL_CF;
else
val64 &= ~VXGE_HAL_FAU_RPA_VCFG_L3_INCL_CF;
}
if (params->rpa_l3_comp_csum != VXGE_HAL_DEFAULT_32) {
if (params->rpa_l3_comp_csum)
val64 |= VXGE_HAL_FAU_RPA_VCFG_L3_COMP_CSUM;
else
val64 &= ~VXGE_HAL_FAU_RPA_VCFG_L3_COMP_CSUM;
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->fau_rpa_vcfg);
vpath->vp_config->rpa_l4_comp_csum = params->rpa_l4_comp_csum;
vpath->vp_config->rpa_l3_incl_cf = params->rpa_l3_incl_cf;
vpath->vp_config->rpa_l3_comp_csum = params->rpa_l3_comp_csum;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* __hal_vpath_intr_enable - Enable vpath interrupts.
* @vpath: Virtual Path.
* @op: One of the vxge_hal_vpath_intr_e enumerated values specifying
* the type(s) of interrupts to enable.
*
* Enable vpath interrupts. The function is to be executed the last in
* vpath initialization sequence.
*
* See also: __hal_vpath_intr_disable()
*/
vxge_hal_status_e
__hal_vpath_intr_enable(__hal_virtualpath_t *vpath)
{
u64 val64;
__hal_device_t *hldev;
vxge_assert(vpath != NULL);
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath);
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_VPATH_NOT_OPEN);
return (VXGE_HAL_ERR_VPATH_NOT_OPEN);
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->kdfcctl_errors_reg);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->general_errors_reg);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->pci_config_errors_reg);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->mrpcim_to_vpath_alarm_reg);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->srpcim_to_vpath_alarm_reg);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->vpath_ppif_int_status);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->srpcim_msg_to_vpath_reg);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->vpath_pcipif_int_status);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->prc_alarm_reg);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->wrdma_alarm_status);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->asic_ntwk_vp_err_reg);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->xgmac_vp_int_status);
vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->vpath_general_int_status);
/* Unmask the individual interrupts. */
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
0,
&vpath->vp_reg->kdfcctl_errors_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
0,
&vpath->vp_reg->general_errors_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->pci_config_errors_mask);
if (hldev->first_vp_id != vpath->vp_id) {
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->mrpcim_to_vpath_alarm_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->srpcim_to_vpath_alarm_mask);
} else {
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
0,
&vpath->vp_reg->mrpcim_to_vpath_alarm_mask);
if (hldev->access_rights &
VXGE_HAL_DEVICE_ACCESS_RIGHT_SRPCIM) {
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
0,
&vpath->vp_reg->srpcim_to_vpath_alarm_mask);
}
}
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
0,
&vpath->vp_reg->vpath_ppif_int_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->srpcim_msg_to_vpath_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
0,
&vpath->vp_reg->vpath_pcipif_int_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(VXGE_HAL_PRC_ALARM_REG_PRC_RING_BUMP, 0),
&vpath->vp_reg->prc_alarm_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
0,
&vpath->vp_reg->wrdma_alarm_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
0,
&vpath->vp_reg->xgmac_vp_int_mask);
if (hldev->first_vp_id != vpath->vp_id) {
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->asic_ntwk_vp_err_mask);
} else {
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0, (u32) bVAL32((
VXGE_HAL_ASIC_NTWK_VP_ERR_REG_REAF_FAULT |
VXGE_HAL_ASIC_NTWK_VP_ERR_REG_REAF_OK), 0),
&vpath->vp_reg->asic_ntwk_vp_err_mask);
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->tim_int_en);
/* val64 |= VXGE_HAL_TIM_SET_INT_EN_VP(1 << (16 - vpath->vp_id)); */
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&hldev->common_reg->tim_set_int_en);
vxge_hal_pio_mem_write32_upper(
hldev->header.pdev,
hldev->header.regh0,
0,
&vpath->vp_reg->vpath_general_int_mask);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_intr_enable - Enable vpath interrupts.
* @vpath_handle: Virtual Path handle.
* @op: One of the vxge_hal_vpath_intr_e enumerated values specifying
* the type(s) of interrupts to enable.
*
* Enable vpath interrupts. The function is to be executed the last in
* vpath initialization sequence.
*
* See also: vxge_hal_vpath_intr_disable()
*/
vxge_hal_status_e
vxge_hal_vpath_intr_enable(vxge_hal_vpath_h vpath_handle)
{
vxge_hal_status_e status;
__hal_device_t *hldev;
__hal_vpath_handle_t *vp;
vxge_assert(vpath_handle != NULL);
vp = (__hal_vpath_handle_t *) vpath_handle;
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
status = __hal_vpath_intr_enable((__hal_virtualpath_t *) vp->vpath);
vxge_hal_vpath_unmask_all(vpath_handle);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vpath_intr_disable - Disable vpath interrupts.
* @vpath: Virtual Path.
* @op: One of the vxge_hal_vpath_intr_e enumerated values specifying
* the type(s) of interrupts to enable.
*
* Disable vpath interrupts. The function is to be executed the last in
* vpath initialization sequence.
*
* See also: __hal_vpath_intr_enable()
*/
vxge_hal_status_e
__hal_vpath_intr_disable(__hal_virtualpath_t *vpath)
{
u64 val64;
__hal_device_t *hldev;
vxge_assert(vpath != NULL);
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath);
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_VPATH_NOT_OPEN);
return (VXGE_HAL_ERR_VPATH_NOT_OPEN);
}
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->vpath_general_int_mask);
val64 = VXGE_HAL_TIM_CLR_INT_EN_VP(1 << (16 - vpath->vp_id));
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&hldev->common_reg->tim_clr_int_en);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->kdfcctl_errors_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->general_errors_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->pci_config_errors_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->mrpcim_to_vpath_alarm_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->srpcim_to_vpath_alarm_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->vpath_ppif_int_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->srpcim_msg_to_vpath_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->vpath_pcipif_int_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->prc_alarm_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->wrdma_alarm_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->asic_ntwk_vp_err_mask);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->xgmac_vp_int_mask);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_intr_disable - Disable vpath interrupts.
* @vpath_handle: Virtual Path handle.
* @op: One of the vxge_hal_vpath_intr_e enumerated values specifying
* the type(s) of interrupts to disable.
*
* Disable vpath interrupts.
*
* See also: vxge_hal_vpath_intr_enable()
*/
vxge_hal_status_e
vxge_hal_vpath_intr_disable(vxge_hal_vpath_h vpath_handle)
{
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
vxge_hal_vpath_mask_all(vpath_handle);
(void) __hal_vpath_intr_disable(vpath);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_mask_all - Mask all vpath interrupts.
* @vpath_handle: Virtual Path handle.
*
* Mask all vpath interrupts.
*
* See also: vxge_hal_vpath_unmask_all()
*/
void
vxge_hal_vpath_mask_all(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_vpath_handle_t *vp;
vxge_assert(vpath_handle != NULL);
vp = (__hal_vpath_handle_t *) vpath_handle;
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
val64 = VXGE_HAL_VPATH_GENERAL_INT_MASK_PIC_INT |
VXGE_HAL_VPATH_GENERAL_INT_MASK_PCI_INT |
VXGE_HAL_VPATH_GENERAL_INT_MASK_WRDMA_INT |
VXGE_HAL_VPATH_GENERAL_INT_MASK_XMAC_INT;
vxge_hal_pio_mem_write32_upper(
hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&vp->vpath->vp_reg->vpath_general_int_mask);
if (vp->vpath->vp_id < 16) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->tim_int_mask0);
val64 |= vBIT(0xf, (vp->vpath->vp_id * 4), 4);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&hldev->common_reg->tim_int_mask0);
} else {
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(VXGE_HAL_TIM_INT_MASK1_TIM_INT_MASK1(0xf), 0),
&hldev->common_reg->tim_int_mask1);
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
}
/*
* vxge_hal_vpath_unmask_all - Unmask all vpath interrupts.
* @vpath_handle: Virtual Path handle.
*
* Unmask all vpath interrupts.
*
* See also: vxge_hal_vpath_mask_all()
*/
void
vxge_hal_vpath_unmask_all(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vp == NULL) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return;
}
vxge_hal_pio_mem_write32_upper(
hldev->header.pdev,
hldev->header.regh0,
0,
&vp->vpath->vp_reg->vpath_general_int_mask);
if (vp->vpath->vp_id < 16) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->tim_int_mask0);
val64 &= ~(vBIT(0xf, (vp->vpath->vp_id * 4), 4));
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&hldev->common_reg->tim_int_mask0);
} else {
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
0,
&hldev->common_reg->tim_int_mask1);
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
}
/*
* __hal_vpath_link_state_test - Test for the link state.
* @vpath: Virtual Path.
*
* Test link state.
* Returns: link state.
*/
vxge_hal_device_link_state_e
__hal_vpath_link_state_test(__hal_virtualpath_t *vpath)
{
__hal_device_t *hldev;
vxge_assert(vpath != NULL);
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_ASIC_NTWK_VP_CTRL_REQ_TEST_NTWK,
&vpath->vp_reg->asic_ntwk_vp_ctrl);
(void) vxge_hal_device_register_poll(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->asic_ntwk_vp_ctrl,
0,
VXGE_HAL_ASIC_NTWK_VP_CTRL_REQ_TEST_NTWK,
hldev->header.config.device_poll_millis);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (hldev->header.link_state);
}
/*
* __hal_vpath_link_state_poll - Poll for the link state.
* @vpath: Virtual Path.
*
* Get link state.
* Returns: link state.
*/
vxge_hal_device_link_state_e
__hal_vpath_link_state_poll(__hal_virtualpath_t *vpath)
{
u64 val64;
__hal_device_t *hldev;
vxge_assert(vpath != NULL);
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath);
if (vpath == NULL) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_LINK_NONE);
return (VXGE_HAL_LINK_NONE);
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vpmgmt_reg->xgmac_gen_status_vpmgmt_clone);
if (val64 & VXGE_HAL_XGMAC_GEN_STATUS_VPMGMT_CLONE_XMACJ_NTWK_OK) {
(void) __hal_device_handle_link_up_ind(vpath->hldev);
if (val64 &
VXGE_HAL_XGMAC_GEN_STATUS_VPMGMT_CLONE_XMACJ_NTWK_DATA_RATE) {
VXGE_HAL_DEVICE_DATA_RATE_SET(vpath->hldev,
VXGE_HAL_DATA_RATE_10G);
} else {
VXGE_HAL_DEVICE_DATA_RATE_SET(vpath->hldev,
VXGE_HAL_DATA_RATE_1G);
}
} else {
(void) __hal_device_handle_link_down_ind(vpath->hldev);
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (vpath->hldev->header.link_state);
}
/*
* __hal_vpath_data_rate_poll - Poll for the data rate.
* @vpath: Virtual Path.
*
* Get data rate.
* Returns: data rate.
*/
vxge_hal_device_data_rate_e
__hal_vpath_data_rate_poll(
__hal_virtualpath_t *vpath)
{
u64 val64;
__hal_device_t *hldev;
vxge_assert(vpath != NULL);
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath);
if (vpath == NULL) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_DATA_RATE_UNKNOWN);
return (VXGE_HAL_DATA_RATE_UNKNOWN);
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vpmgmt_reg->xgmac_gen_status_vpmgmt_clone);
if (val64 &
VXGE_HAL_XGMAC_GEN_STATUS_VPMGMT_CLONE_XMACJ_NTWK_DATA_RATE) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_DATA_RATE_10G);
} else {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_DATA_RATE_1G);
}
}
/*
* __hal_vpath_alarm_process - Process Alarms.
* @vpath: Virtual Path.
* @skip_alarms: Do not clear the alarms
*
* Process vpath alarms.
*
*/
vxge_hal_status_e
__hal_vpath_alarm_process(__hal_virtualpath_t *vpath, u32 skip_alarms)
{
u64 val64;
u64 alarm_status;
u64 pic_status = 0;
u64 pif_status;
u64 wrdma_status;
u64 xgmac_status;
__hal_device_t *hldev;
vxge_hal_status_e status;
vxge_assert(vpath != NULL);
hldev = vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq("vpath = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath);
alarm_status = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->vpath_general_int_status);
vxge_hal_info_log_vpath_irq(
"alarm_status = 0x"VXGE_OS_STXFMT, (ptr_t) alarm_status);
if (vxge_os_unlikely(!alarm_status)) {
status = VXGE_HAL_ERR_WRONG_IRQ;
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
if (alarm_status & VXGE_HAL_VPATH_GENERAL_INT_STATUS_PIC_INT) {
pic_status = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->vpath_ppif_int_status);
vxge_hal_info_log_vpath_irq(
"pic_status = 0x"VXGE_OS_STXFMT, (ptr_t) pic_status);
if (pic_status &
VXGE_HAL_VPATH_PPIF_INT_STATUS_GENERAL_ERRORS_INT) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->general_errors_reg);
vxge_hal_info_log_vpath_irq(
"general_errors_reg = 0x"VXGE_OS_STXFMT,
(ptr_t) val64);
if (val64 & VXGE_HAL_GENERAL_ERRORS_REG_INI_SERR_DET) {
vpath->sw_stats->error_stats.ini_serr_det++;
vxge_hal_info_log_vpath_irq("%s:"
"VXGE_HAL_GENERAL_ERRORS_REG_INI_SERR_DET",
__func__);
__hal_device_handle_error(hldev, vpath->vp_id,
VXGE_HAL_EVENT_SERR);
if (!skip_alarms) {
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_GENERAL_ERRORS_REG_INI_SERR_DET,
&vpath->vp_reg->general_errors_reg);
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d \
Result = 0", __FILE__, __func__, __LINE__);
return (VXGE_HAL_ERR_EVENT_SERR);
}
}
if (pic_status & VXGE_HAL_VPATH_PPIF_INT_STATUS_PCI_CONFIG_ERRORS_INT) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->pci_config_errors_reg);
vxge_hal_info_log_vpath_irq(
"pci_config_errors_reg = 0x"VXGE_OS_STXFMT,
(ptr_t) val64);
if (val64 &
VXGE_HAL_PCI_CONFIG_ERRORS_REG_STATUS_ERR) {
vpath->sw_stats->error_stats.pci_config_status_err++;
vxge_hal_info_log_vpath_irq("%s: \
VXGE_HAL_PCI_CONFIG_ERRORS_REG_STATUS_ERR",
__func__);
}
if (val64 & VXGE_HAL_PCI_CONFIG_ERRORS_REG_UNCOR_ERR) {
vpath->sw_stats->error_stats.pci_config_uncor_err++;
vxge_hal_info_log_vpath_irq("%s: \
VXGE_HAL_PCI_CONFIG_ERRORS_REG_UNCOR_ERR",
__func__);
}
if (val64 & VXGE_HAL_PCI_CONFIG_ERRORS_REG_COR_ERR) {
vpath->sw_stats->error_stats.pci_config_cor_err++;
vxge_hal_info_log_vpath_irq("%s: \
VXGE_HAL_PCI_CONFIG_ERRORS_REG_COR_ERR",
__func__);
}
if (!skip_alarms)
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0, VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->pci_config_errors_reg);
}
if (pic_status &
VXGE_HAL_VPATH_PPIF_INT_STATUS_MRPCIM_TO_VPATH_ALARM_INT) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->mrpcim_to_vpath_alarm_reg);
vxge_hal_info_log_vpath_irq(
"mrpcim_to_vpath_alarm_reg = 0x"VXGE_OS_STXFMT,
(ptr_t) val64);
if (val64 &
VXGE_HAL_MRPCIM_TO_VPATH_ALARM_REG_ALARM) {
vpath->sw_stats->error_stats.mrpcim_to_vpath_alarms++;
hldev->stats.sw_dev_err_stats.mrpcim_alarms++;
vxge_hal_info_log_vpath_irq(
"%s:VXGE_HAL_MRPCIM_TO_VPATH_ALARM_REG_ALARM",
__func__);
__hal_device_handle_error(hldev, vpath->vp_id,
VXGE_HAL_EVENT_MRPCIM_CRITICAL);
if (!skip_alarms)
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_MRPCIM_TO_VPATH_ALARM_REG_ALARM,
&vpath->vp_reg->mrpcim_to_vpath_alarm_reg);
return (VXGE_HAL_ERR_EVENT_MRPCIM_CRITICAL);
}
if (!skip_alarms)
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->mrpcim_to_vpath_alarm_reg);
}
if (pic_status &
VXGE_HAL_VPATH_PPIF_INT_STATUS_SRPCIM_TO_VPATH_ALARM_INT) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->srpcim_to_vpath_alarm_reg);
vxge_hal_info_log_vpath_irq(
"srpcim_to_vpath_alarm_reg = 0x"VXGE_OS_STXFMT,
(ptr_t) val64);
vpath->sw_stats->error_stats.srpcim_to_vpath_alarms++;
hldev->stats.sw_dev_err_stats.srpcim_alarms++;
vxge_hal_info_log_vpath_irq(
"%s:VXGE_HAL_SRPCIM_TO_VPATH_ALARM_REG_GET_ALARM",
__func__);
status = vxge_hal_srpcim_alarm_process(
(vxge_hal_device_h) hldev, skip_alarms);
if (!skip_alarms)
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->srpcim_to_vpath_alarm_reg);
if (status == VXGE_HAL_ERR_EVENT_SRPCIM_CRITICAL)
return (status);
}
}
if (alarm_status & VXGE_HAL_VPATH_GENERAL_INT_STATUS_WRDMA_INT) {
wrdma_status = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->wrdma_alarm_status);
vxge_hal_info_log_vpath_irq(
"wrdma_alarm_status = 0x"VXGE_OS_STXFMT,
(ptr_t) wrdma_status);
if (wrdma_status &
VXGE_HAL_WRDMA_ALARM_STATUS_PRC_ALARM_PRC_INT) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->prc_alarm_reg);
vxge_hal_info_log_vpath_irq(
"prc_alarm_reg = 0x"VXGE_OS_STXFMT, (ptr_t) val64);
if (val64 & VXGE_HAL_PRC_ALARM_REG_PRC_RING_BUMP) {
vpath->sw_stats->error_stats.prc_ring_bumps++;
vxge_hal_info_log_vpath_irq(
"%s:VXGE_HAL_PRC_ALARM_REG_PRC_RING_BUMP",
__func__);
}
if (val64 & VXGE_HAL_PRC_ALARM_REG_PRC_RXDCM_SC_ERR) {
vpath->sw_stats->error_stats.prc_rxdcm_sc_err++;
vxge_hal_info_log_vpath_irq("%s:" \
"VXGE_HAL_PRC_ALARM_REG_PRC_RXDCM_SC_ERR",
__func__);
__hal_device_handle_error(hldev,
vpath->vp_id,
VXGE_HAL_EVENT_CRITICAL);
if (!skip_alarms) {
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_PRC_ALARM_REG_PRC_RXDCM_SC_ERR,
&vpath->vp_reg->prc_alarm_reg);
}
vxge_hal_trace_log_vpath_irq(
"<== %s:%s:%d Result = %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_EVENT_CRITICAL);
return (VXGE_HAL_ERR_EVENT_CRITICAL);
}
if (val64 & VXGE_HAL_PRC_ALARM_REG_PRC_RXDCM_SC_ABORT) {
vpath->sw_stats->error_stats.prc_rxdcm_sc_abort++;
vxge_hal_info_log_vpath_irq("%s: \
VXGE_HAL_PRC_ALARM_REG_PRC_RXDCM_SC_ABORT",
__func__);
__hal_device_handle_error(hldev, vpath->vp_id,
VXGE_HAL_EVENT_CRITICAL);
if (!skip_alarms)
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_PRC_ALARM_REG_PRC_RXDCM_SC_ABORT,
&vpath->vp_reg->prc_alarm_reg);
vxge_hal_trace_log_vpath_irq(
"<== %s:%s:%d Result = %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_EVENT_CRITICAL);
return (VXGE_HAL_ERR_EVENT_CRITICAL);
}
if (val64 & VXGE_HAL_PRC_ALARM_REG_PRC_QUANTA_SIZE_ERR) {
vpath->sw_stats->error_stats.prc_quanta_size_err++;
vxge_hal_info_log_vpath_irq("%s: \
VXGE_HAL_PRC_ALARM_REG_PRC_QUANTA_SIZE_ERR",
__func__);
}
if (!skip_alarms)
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0, VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->prc_alarm_reg);
}
}
if (alarm_status & VXGE_HAL_VPATH_GENERAL_INT_STATUS_PIC_INT) {
if (pic_status &
VXGE_HAL_VPATH_PPIF_INT_STATUS_GENERAL_ERRORS_INT) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->general_errors_reg);
vxge_hal_info_log_vpath_irq(
"general_errors_reg = 0x"VXGE_OS_STXFMT,
(ptr_t) val64);
if (val64 &
VXGE_HAL_GENERAL_ERRORS_REG_DBLGEN_FIFO0_OVRFLOW) {
vpath->sw_stats->error_stats.dblgen_fifo0_overflow++;
vxge_hal_info_log_vpath_irq(
"%s:"
"VXGE_HAL_GENERAL_ERRORS_REG_DBLGEN_FIFO0_OVRFLOW",
__func__);
__hal_device_handle_error(hldev, vpath->vp_id,
VXGE_HAL_EVENT_KDFCCTL);
if (!skip_alarms) {
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_GENERAL_ERRORS_REG_DBLGEN_FIFO0_OVRFLOW,
&vpath->vp_reg->general_errors_reg);
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d \
Result = %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_EVENT_KDFCCTL);
return (VXGE_HAL_ERR_EVENT_KDFCCTL);
}
if (val64 & VXGE_HAL_GENERAL_ERRORS_REG_DBLGEN_FIFO1_OVRFLOW) {
vpath->sw_stats->error_stats.dblgen_fifo1_overflow++;
vxge_hal_info_log_vpath_irq("%s:" \
"VXGE_HAL_GENERAL_ERRORS_REG_DBLGEN_FIFO1_OVRFLOW",
__func__);
}
if (val64 &
VXGE_HAL_GENERAL_ERRORS_REG_DBLGEN_FIFO2_OVRFLOW) {
vpath->sw_stats->error_stats.dblgen_fifo2_overflow++;
vxge_hal_info_log_vpath_irq("%s:" \
"VXGE_HAL_GENERAL_ERRORS_REG_DBLGEN_FIFO2_OVRFLOW",
__func__);
}
if (val64 &
VXGE_HAL_GENERAL_ERRORS_REG_STATSB_PIF_CHAIN_ERR) {
vpath->sw_stats->error_stats.statsb_pif_chain_error++;
vxge_hal_info_log_vpath_irq("%s:" \
"VXGE_HAL_GENERAL_ERRORS_REG_STATSB_PIF_CHAIN_ERR",
__func__);
}
if (val64 &
VXGE_HAL_GENERAL_ERRORS_REG_STATSB_DROP_TIMEOUT) {
vpath->sw_stats->error_stats.statsb_drop_timeout++;
vxge_hal_info_log_vpath_irq("%s:" \
"VXGE_HAL_GENERAL_ERRORS_REG_STATSB_DROP_TIMEOUT",
__func__);
}
if (val64 & VXGE_HAL_GENERAL_ERRORS_REG_TGT_ILLEGAL_ACCESS) {
vpath->sw_stats->error_stats.target_illegal_access++;
vxge_hal_info_log_vpath_irq("%s:" \
"VXGE_HAL_GENERAL_ERRORS_REG_TGT_ILLEGAL_ACCESS",
__func__);
}
if (!skip_alarms)
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->general_errors_reg);
}
if (pic_status &
VXGE_HAL_VPATH_PPIF_INT_STATUS_KDFCCTL_ERRORS_INT) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->kdfcctl_errors_reg);
vxge_hal_info_log_vpath_irq(
"kdfcctl_errors_reg = 0x"VXGE_OS_STXFMT,
(ptr_t) val64);
if (val64 &
VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO0_OVRWR) {
vpath->sw_stats->error_stats.kdfcctl_fifo0_overwrite++;
vxge_hal_info_log_vpath_irq("%s:" \
"VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO0_OVRWR",
__func__);
__hal_device_handle_error(hldev, vpath->vp_id,
VXGE_HAL_EVENT_KDFCCTL);
if (!skip_alarms) {
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO0_OVRWR,
&vpath->vp_reg->kdfcctl_errors_reg);
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d \
Result = %d", __FILE__, __func__, __LINE__,
VXGE_HAL_ERR_EVENT_KDFCCTL);
return (VXGE_HAL_ERR_EVENT_KDFCCTL);
}
if (val64 &
VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO1_OVRWR) {
vpath->sw_stats->error_stats.kdfcctl_fifo1_overwrite++;
vxge_hal_info_log_vpath_irq("%s:" \
"VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO1_OVRWR",
__func__);
}
if (val64 &
VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO2_OVRWR) {
vpath->sw_stats->error_stats.kdfcctl_fifo2_overwrite++;
vxge_hal_info_log_vpath_irq("%s:" \
"VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO2_OVRWR",
__func__);
}
if (val64 &
VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO0_POISON) {
vpath->sw_stats->error_stats.kdfcctl_fifo0_poison++;
vxge_hal_info_log_vpath_irq("%s:" \
"VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO0_POISON",
__func__);
__hal_device_handle_error(hldev, vpath->vp_id,
VXGE_HAL_EVENT_KDFCCTL);
if (!skip_alarms) {
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO0_POISON,
&vpath->vp_reg->kdfcctl_errors_reg);
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d \
Result = %d", __FILE__, __func__, __LINE__,
VXGE_HAL_ERR_EVENT_KDFCCTL);
return (VXGE_HAL_ERR_EVENT_KDFCCTL);
}
if (val64 &
VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO1_POISON) {
vpath->sw_stats->error_stats.kdfcctl_fifo1_poison++;
vxge_hal_info_log_vpath_irq("%s:" \
"VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO1_POISON",
__func__);
}
if (val64 &
VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO2_POISON) {
vpath->sw_stats->error_stats.kdfcctl_fifo2_poison++;
vxge_hal_info_log_vpath_irq("%s:" \
"VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO2_POISON",
__func__);
}
if (val64 &
VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO0_DMA_ERR) {
vpath->sw_stats->error_stats.kdfcctl_fifo0_dma_error++;
vxge_hal_info_log_vpath_irq("%s:" \
"VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO0_DMA_ERR",
__func__);
__hal_device_handle_error(hldev, vpath->vp_id,
VXGE_HAL_EVENT_KDFCCTL);
if (!skip_alarms) {
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO0_DMA_ERR,
&vpath->vp_reg->kdfcctl_errors_reg);
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d \
Result = %d", __FILE__, __func__, __LINE__,
VXGE_HAL_ERR_EVENT_KDFCCTL);
return (VXGE_HAL_ERR_EVENT_KDFCCTL);
}
if (val64 &
VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO1_DMA_ERR) {
vpath->sw_stats->error_stats.kdfcctl_fifo1_dma_error++;
vxge_hal_info_log_vpath_irq("%s:"
"VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO1_DMA_ERR",
__func__);
}
if (val64 &
VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO2_DMA_ERR) {
vpath->sw_stats->error_stats.kdfcctl_fifo2_dma_error++;
vxge_hal_info_log_vpath_irq("%s:" \
"VXGE_HAL_KDFCCTL_ERRORS_REG_KDFCCTL_FIFO2_DMA_ERR",
__func__);
}
if (!skip_alarms) {
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->kdfcctl_errors_reg);
}
}
}
if (alarm_status & VXGE_HAL_VPATH_GENERAL_INT_STATUS_PCI_INT) {
pif_status = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->vpath_pcipif_int_status);
vxge_hal_info_log_vpath_irq(
"vpath_pcipif_int_status = 0x"VXGE_OS_STXFMT,
(ptr_t) pif_status);
if (pif_status &
VXGE_HAL_VPATH_PCIPIF_INT_STATUS_SRPCIM_MSG_TO_VPATH_INT) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->srpcim_msg_to_vpath_reg);
vxge_hal_info_log_vpath_irq(
"srpcim_msg_to_vpath_reg = 0x"VXGE_OS_STXFMT,
(ptr_t) val64);
if (val64 &
VXGE_HAL_SRPCIM_MSG_TO_VPATH_REG_INT) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vpmgmt_reg->srpcim_to_vpath_wmsg);
__hal_ifmsg_wmsg_process(vpath, val64);
vpath->sw_stats->error_stats.srpcim_msg_to_vpath++;
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
0,
&vpath->vpmgmt_reg->srpcim_to_vpath_wmsg);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->srpcim_msg_to_vpath_mask);
vxge_hal_info_log_vpath_irq("%s:"
"VXGE_HAL_SRPCIM_MSG_TO_VPATH_REG_INT",
__func__);
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->srpcim_msg_to_vpath_reg);
}
}
if (alarm_status & VXGE_HAL_VPATH_GENERAL_INT_STATUS_XMAC_INT) {
xgmac_status = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->xgmac_vp_int_status);
vxge_hal_info_log_vpath_irq("xgmac_status = 0x"VXGE_OS_STXFMT,
(ptr_t) xgmac_status);
if (xgmac_status &
VXGE_HAL_XGMAC_VP_INT_STATUS_ASIC_NTWK_VP_ERR_INT) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->asic_ntwk_vp_err_reg);
vxge_hal_info_log_vpath_irq(
"asic_ntwk_vp_err_reg = 0x"VXGE_OS_STXFMT,
(ptr_t) val64);
if (((val64 & VXGE_HAL_ASIC_NTWK_VP_ERR_REG_SUS_FAULT) &&
(!(val64 & VXGE_HAL_ASIC_NTWK_VP_ERR_REG_SUS_OK))) ||
((val64 & VXGE_HAL_ASIC_NTWK_VP_ERR_REG_SUS_FAULT_OCCURRED) &&
(!(val64 & VXGE_HAL_ASIC_NTWK_VP_ERR_REG_SUS_OK_OCCURRED)))) {
vpath->sw_stats->error_stats.network_sustained_fault++;
vxge_hal_info_log_vpath_irq("%s:" \
"VXGE_HAL_ASIC_NTWK_VP_ERR_REG_SUS_FAULT",
__func__);
vxge_os_pio_mem_write64(vpath->hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_ASIC_NTWK_VP_ERR_REG_SUS_FAULT,
&vpath->vp_reg->asic_ntwk_vp_err_mask);
(void) __hal_device_handle_link_down_ind(hldev);
}
if (((val64 & VXGE_HAL_ASIC_NTWK_VP_ERR_REG_SUS_OK) &&
(!(val64 & VXGE_HAL_ASIC_NTWK_VP_ERR_REG_SUS_FAULT))) ||
((val64 & VXGE_HAL_ASIC_NTWK_VP_ERR_REG_SUS_OK_OCCURRED) &&
(!(val64 & VXGE_HAL_ASIC_NTWK_VP_ERR_REG_SUS_FAULT_OCCURRED)))) {
vpath->sw_stats->error_stats.network_sustained_ok++;
vxge_hal_info_log_vpath_irq(
"%s:VXGE_HAL_ASIC_NTWK_VP_ERR_REG_SUS_OK",
__func__);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_ASIC_NTWK_VP_ERR_REG_SUS_OK,
&vpath->vp_reg->asic_ntwk_vp_err_mask);
(void) __hal_device_handle_link_up_ind(hldev);
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_INTR_MASK_ALL,
&vpath->vp_reg->asic_ntwk_vp_err_reg);
return (VXGE_HAL_INF_LINK_UP_DOWN);
}
}
if (alarm_status & ~(
VXGE_HAL_VPATH_GENERAL_INT_STATUS_PIC_INT |
VXGE_HAL_VPATH_GENERAL_INT_STATUS_PCI_INT |
VXGE_HAL_VPATH_GENERAL_INT_STATUS_WRDMA_INT |
VXGE_HAL_VPATH_GENERAL_INT_STATUS_XMAC_INT)) {
vpath->sw_stats->error_stats.unknown_alarms++;
vxge_hal_info_log_vpath_irq(
"%s:%s:%d Unknown Alarm", __FILE__, __func__, __LINE__);
__hal_device_handle_error(hldev, vpath->vp_id,
VXGE_HAL_EVENT_UNKNOWN);
status = VXGE_HAL_ERR_EVENT_UNKNOWN;
} else {
hldev->stats.sw_dev_err_stats.vpath_alarms++;
status = VXGE_HAL_OK;
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (status);
}
/*
* vxge_hal_vpath_begin_irq - Begin IRQ processing.
* @vpath_handle: Virtual Path handle.
* @skip_alarms: Do not clear the alarms
* @reason: "Reason" for the interrupt, the value of vpath's
* general_int_status register.
*
* The function performs two actions, It first checks whether (shared IRQ) the
* interrupt was raised by the device. Next, it masks the device interrupts.
*
* Note:
* vxge_hal_vpath_begin_irq() does not flush MMIO writes through the
* bridge. Therefore, two back-to-back interrupts are potentially possible.
* It is the responsibility of the ULD to make sure that only one
* vxge_hal_vpath_continue_irq() runs at a time.
*
* Returns: 0, if the interrupt is not "ours" (note that in this case the
* vpath remain enabled).
* Otherwise, vxge_hal_vpath_begin_irq() returns 64bit general adapter
* status.
* See also: vxge_hal_vpath_handle_irq()
*/
vxge_hal_status_e
vxge_hal_vpath_begin_irq(vxge_hal_vpath_h vpath_handle,
u32 skip_alarms, u64 *reason)
{
u64 val64;
u64 adapter_status;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_hal_status_e ret_val = VXGE_HAL_OK;
vxge_assert((vpath_handle != NULL) && (reason != NULL));
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq(
"vpath_handle = 0x"VXGE_OS_STXFMT", skip_alarms = %d, "
"reason = 0x"VXGE_OS_STXFMT, (ptr_t) vpath_handle,
skip_alarms, (ptr_t) reason);
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_VPATH_NOT_OPEN);
return (VXGE_HAL_ERR_VPATH_NOT_OPEN);
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->titan_general_int_status);
if (vxge_os_unlikely(!val64)) {
/* not Titan interrupt */
*reason = 0;
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_WRONG_IRQ);
return (VXGE_HAL_ERR_WRONG_IRQ);
}
if (vxge_os_unlikely(val64 == VXGE_HAL_ALL_FOXES)) {
adapter_status = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->adapter_status);
if (adapter_status == VXGE_HAL_ALL_FOXES) {
__hal_device_handle_error(hldev,
vpath->vp_id,
VXGE_HAL_EVENT_SLOT_FREEZE);
*reason = 0;
ret_val = VXGE_HAL_ERR_SLOT_FREEZE;
goto exit;
}
}
if (val64 &
VXGE_HAL_TITAN_GENERAL_INT_STATUS_VPATH_TRAFFIC_INT(
1 << (16 - vpath->vp_id))) {
if (vpath->vp_id < 16) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->tim_int_mask0);
*reason = bVAL4(val64, (vpath->vp_id * 4));
} else {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->tim_int_mask1);
*reason = bVAL4(val64, 0);
}
return (VXGE_HAL_OK);
}
*reason = VXGE_HAL_INTR_ALARM;
if (vxge_os_unlikely(val64 &
VXGE_HAL_TITAN_GENERAL_INT_STATUS_MRPCIM_ALARM_INT)) {
vxge_hal_info_log_vpath_irq(
"%s:VXGE_HAL_TITAN_GENERAL_INT_STATUS_MRPCIM_ALARM_INT",
__func__);
ret_val = VXGE_HAL_ERR_CRITICAL;
goto exit;
}
if (vxge_os_unlikely(val64 &
VXGE_HAL_TITAN_GENERAL_INT_STATUS_SRPCIM_ALARM_INT)) {
vxge_hal_info_log_vpath_irq(
"%s:VXGE_HAL_TITAN_GENERAL_INT_STATUS_SRPCIM_ALARM_INT",
__func__);
ret_val = VXGE_HAL_ERR_CRITICAL;
goto exit;
}
if (vxge_os_unlikely(val64 &
VXGE_HAL_TITAN_GENERAL_INT_STATUS_VPATH_ALARM_INT)) {
vxge_hal_info_log_vpath_irq(
"%s:VXGE_HAL_TITAN_GENERAL_INT_STATUS_VPATH_ALARM_INT",
__func__);
ret_val = __hal_vpath_alarm_process(vpath, skip_alarms);
}
exit:
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (ret_val);
}
/*
* vxge_hal_vpath_continue_irq - Continue handling IRQ: process all
* completed descriptors.
* @vpath_handle: Virtual Path handle.
*
* Process completed descriptors and unmask the vpath interrupts.
*
* The vxge_hal_vpath_continue_irq() calls upper-layer driver (ULD)
* via supplied completion callback.
*
* Note that the vxge_hal_vpath_continue_irq is part of the _fast_ path.
* To optimize the processing, the function does _not_ check for
* errors and alarms.
*
* Returns: VXGE_HAL_OK.
*
* See also: vxge_hal_vpath_handle_irq()
* vxge_hal_ring_rxd_next_completed(),
* vxge_hal_fifo_txdl_next_completed(), vxge_hal_ring_callback_f {},
* vxge_hal_fifo_callback_f {}.
*/
vxge_hal_status_e
vxge_hal_vpath_continue_irq(vxge_hal_vpath_h vpath_handle)
{
u32 got_rx = 1, got_tx = 1;
__hal_device_t *hldev;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
u32 isr_polling_cnt;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
isr_polling_cnt = hldev->header.config.isr_polling_cnt;
do {
if (got_rx && (vp->vpath->ringh != NULL))
(void) vxge_hal_vpath_poll_rx(vpath_handle, &got_rx);
if (got_tx && (vp->vpath->fifoh != NULL))
(void) vxge_hal_vpath_poll_tx(vpath_handle, &got_tx);
if (!got_rx && !got_tx)
break;
} while (isr_polling_cnt--);
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_handle_irq - Handle vpath IRQ.
* @vpath_handle: Virtual Path handle.
* @skip_alarms: Do not clear the alarms
*
* Perform the complete handling of the line interrupt. The function
* performs two calls.
* First it uses vxge_hal_vpath_begin_irq() to check the reason for
* the interrupt and mask the vpath interrupts.
* Second, it calls vxge_hal_vpath_continue_irq() to process all
* completed descriptors and re-enable the interrupts.
*
* Returns: VXGE_HAL_OK - success;
* VXGE_HAL_ERR_WRONG_IRQ - (shared) IRQ produced by other device.
*
* See also: vxge_hal_vpath_begin_irq(), vxge_hal_vpath_continue_irq().
*/
vxge_hal_status_e
vxge_hal_vpath_handle_irq(vxge_hal_vpath_h vpath_handle, u32 skip_alarms)
{
u64 reason;
vxge_hal_status_e status;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_VPATH_NOT_OPEN);
return (VXGE_HAL_ERR_VPATH_NOT_OPEN);
}
vxge_hal_vpath_mask_all(vpath_handle);
status = vxge_hal_vpath_begin_irq(vpath_handle,
skip_alarms, &reason);
if (status != VXGE_HAL_OK) {
vxge_hal_vpath_unmask_all(vpath_handle);
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
if (reason & VXGE_HAL_INTR_ALARM) {
if (skip_alarms) {
/* ULD needs to unmask explicitely */
vxge_hal_trace_log_vpath_irq(
"<== %s:%s:%d Result = %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_CRITICAL);
return (VXGE_HAL_ERR_CRITICAL);
} else {
vxge_hal_vpath_unmask_all(vpath_handle);
vxge_hal_trace_log_vpath_irq(
"<== %s:%s:%d Result = %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
}
if (reason & VXGE_HAL_INTR_RX)
vxge_hal_vpath_clear_rx(vpath_handle);
status = vxge_hal_vpath_continue_irq(vpath_handle);
vxge_hal_vpath_clear_tx(vpath_handle);
vxge_hal_vpath_unmask_all(vpath_handle);
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (status);
}
/*
* vxge_hal_vpath_mask_tx - Mask Tx interrupts.
* @vpath_handle: Virtual Path handle.
*
* Mask Tx device interrupts.
*
* See also: vxge_hal_vpath_unmask_tx(), vxge_hal_vpath_mask_rx(),
* vxge_hal_vpath_clear_tx().
*/
void
vxge_hal_vpath_mask_tx(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->fifoh == NULL) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_INVALID_HANDLE);
return;
}
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_VPATH_NOT_OPEN);
return;
}
if (vpath->vp_id < 16) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->tim_int_mask0);
val64 |= vBIT(VXGE_HAL_INTR_TX, (vpath->vp_id * 4), 4);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&hldev->common_reg->tim_int_mask0);
} else {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->tim_int_mask1);
val64 |= VXGE_HAL_TIM_INT_MASK1_TIM_INT_MASK1(VXGE_HAL_INTR_TX);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&hldev->common_reg->tim_int_mask1);
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
}
/*
* vxge_hal_vpath_clear_tx - Acknowledge (that is, clear) the
* condition that has caused the TX interrupt.
* @vpath_handle: Virtual Path handle.
*
* Acknowledge (that is, clear) the condition that has caused
* the Tx interrupt.
* See also: vxge_hal_vpath_begin_irq(), vxge_hal_vpath_continue_irq(),
* vxge_hal_vpath_clear_rx(), vxge_hal_vpath_mask_tx().
*/
void
vxge_hal_vpath_clear_tx(vxge_hal_vpath_h vpath_handle)
{
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->fifoh == NULL) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_INVALID_HANDLE);
return;
}
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_VPATH_NOT_OPEN);
return;
}
if (vpath->vp_id < 16) {
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
vBIT(VXGE_HAL_INTR_TX, (vpath->vp_id * 4), 4),
&hldev->common_reg->tim_int_status0);
} else {
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0, (u32) bVAL32(
vBIT(VXGE_HAL_INTR_TX, 0, 4),
0),
&hldev->common_reg->tim_int_status1);
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
}
/*
* vxge_hal_vpath_unmask_tx - Unmask Tx interrupts.
* @vpath_handle: Virtual Path handle.
*
* Unmask Tx vpath interrupts.
*
* See also: vxge_hal_vpath_mask_tx(), vxge_hal_vpath_clear_tx().
*/
void
vxge_hal_vpath_unmask_tx(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->fifoh == NULL) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_INVALID_HANDLE);
return;
}
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_VPATH_NOT_AVAILABLE);
return;
}
if (vpath->vp_id < 16) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->tim_int_mask0);
val64 &= ~vBIT(VXGE_HAL_INTR_TX, (vpath->vp_id * 4), 4);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&hldev->common_reg->tim_int_mask0);
} else {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->tim_int_mask1);
val64 &=
~VXGE_HAL_TIM_INT_MASK1_TIM_INT_MASK1(VXGE_HAL_INTR_TX);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&hldev->common_reg->tim_int_mask1);
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
}
/*
* vxge_hal_vpath_mask_rx - Mask Rx interrupts.
* @vpath_handle: Virtual Path handle.
*
* Mask Rx vpath interrupts.
*
* See also: vxge_hal_vpath_unmask_rx(), vxge_hal_vpath_mask_tx(),
* vxge_hal_vpath_clear_rx().
*/
void
vxge_hal_vpath_mask_rx(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->ringh == NULL) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return;
}
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_VPATH_NOT_OPEN);
return;
}
if (vpath->vp_id < 16) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->tim_int_mask0);
val64 |= vBIT(VXGE_HAL_INTR_RX, (vpath->vp_id * 4), 4);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&hldev->common_reg->tim_int_mask0);
} else {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->tim_int_mask1);
val64 |= VXGE_HAL_TIM_INT_MASK1_TIM_INT_MASK1(VXGE_HAL_INTR_RX);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&hldev->common_reg->tim_int_mask1);
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
}
/*
* vxge_hal_vpath_clear_rx - Acknowledge (that is, clear) the
* condition that has caused the RX interrupt.
* @vpath_handle: Virtual Path handle.
*
* Acknowledge (that is, clear) the condition that has caused
* the Rx interrupt.
* See also: vxge_hal_vpath_begin_irq(), vxge_hal_vpath_continue_irq(),
* vxge_hal_vpath_clear_tx(), vxge_hal_vpath_mask_rx().
*/
void
vxge_hal_vpath_clear_rx(vxge_hal_vpath_h vpath_handle)
{
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->ringh == NULL) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return;
}
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_VPATH_NOT_OPEN);
return;
}
if (vpath->vp_id < 16) {
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
vBIT(VXGE_HAL_INTR_RX, (vpath->vp_id * 4), 4),
&hldev->common_reg->tim_int_status0);
} else {
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(vBIT(VXGE_HAL_INTR_RX, 0, 4), 0),
&hldev->common_reg->tim_int_status1);
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
}
/*
* vxge_hal_vpath_unmask_rx - Unmask Rx interrupts.
* @vpath_handle: Virtual Path handle.
*
* Unmask Rx vpath interrupts.
*
* See also: vxge_hal_vpath_mask_rx(), vxge_hal_vpath_clear_rx().
*/
void
vxge_hal_vpath_unmask_rx(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->ringh == NULL) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return;
}
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_VPATH_NOT_OPEN);
return;
}
if (vpath->vp_id < 16) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->tim_int_mask0);
val64 &= ~vBIT(VXGE_HAL_INTR_RX, (vpath->vp_id * 4), 4);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&hldev->common_reg->tim_int_mask0);
} else {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->tim_int_mask1);
val64 &=
~VXGE_HAL_TIM_INT_MASK1_TIM_INT_MASK1(VXGE_HAL_INTR_RX);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&hldev->common_reg->tim_int_mask1);
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
}
/*
* vxge_hal_vpath_mask_tx_rx - Mask Tx and Rx interrupts.
* @vpath_handle: Virtual Path handle.
*
* Mask Tx and Rx vpath interrupts.
*
* See also: vxge_hal_vpath_unmask_tx_rx(), vxge_hal_vpath_clear_tx_rx().
*/
void
vxge_hal_vpath_mask_tx_rx(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_VPATH_NOT_OPEN);
return;
}
if (vpath->vp_id < 16) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->tim_int_mask0);
val64 |= vBIT(VXGE_HAL_INTR_TX, (vpath->vp_id * 4), 4) |
vBIT(VXGE_HAL_INTR_RX, (vpath->vp_id * 4), 4);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&hldev->common_reg->tim_int_mask0);
} else {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->tim_int_mask1);
val64 |=
VXGE_HAL_TIM_INT_MASK1_TIM_INT_MASK1(VXGE_HAL_INTR_TX) |
VXGE_HAL_TIM_INT_MASK1_TIM_INT_MASK1(VXGE_HAL_INTR_RX);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&hldev->common_reg->tim_int_mask1);
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
}
/*
* vxge_hal_vpath_clear_tx_rx - Acknowledge (that is, clear) the
* condition that has caused the Tx and RX interrupt.
* @vpath_handle: Virtual Path handle.
*
* Acknowledge (that is, clear) the condition that has caused
* the Tx and Rx interrupt.
* See also: vxge_hal_vpath_begin_irq(), vxge_hal_vpath_continue_irq(),
* vxge_hal_vpath_clear_tx_rx(), vxge_hal_vpath_mask_tx_rx().
*/
void
vxge_hal_vpath_clear_tx_rx(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_VPATH_NOT_OPEN);
return;
}
val64 = 0;
if (vpath->vp_id < 16) {
if (vpath->fifoh != NULL)
val64 |= vBIT(VXGE_HAL_INTR_TX, (vpath->vp_id * 4), 4);
else
val64 &= ~vBIT(VXGE_HAL_INTR_TX, (vpath->vp_id * 4), 4);
if (vpath->ringh != NULL)
val64 |= vBIT(VXGE_HAL_INTR_RX, (vpath->vp_id * 4), 4);
else
val64 &= ~vBIT(VXGE_HAL_INTR_RX, (vpath->vp_id * 4), 4);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&hldev->common_reg->tim_int_status0);
} else {
if (vpath->fifoh != NULL)
val64 |= vBIT(VXGE_HAL_INTR_TX, 0, 4);
if (vpath->ringh != NULL)
val64 |= vBIT(VXGE_HAL_INTR_RX, 0, 4);
else
val64 &= ~vBIT(VXGE_HAL_INTR_RX, 0, 4);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&hldev->common_reg->tim_int_status1);
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
}
/*
* vxge_hal_vpath_unmask_tx_rx - Unmask Tx and Rx interrupts.
* @vpath_handle: Virtual Path handle.
*
* Unmask Tx and Rx vpath interrupts.
*
* See also: vxge_hal_vpath_mask_tx_rx(), vxge_hal_vpath_clear_tx_rx().
*/
void
vxge_hal_vpath_unmask_tx_rx(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_VPATH_NOT_OPEN);
return;
}
if (vpath->vp_id < 16) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->tim_int_mask0);
if (vpath->fifoh != NULL)
val64 &= ~vBIT(VXGE_HAL_INTR_TX, (vpath->vp_id * 4), 4);
else
val64 |= vBIT(VXGE_HAL_INTR_TX, (vpath->vp_id * 4), 4);
if (vpath->ringh != NULL)
val64 &= ~vBIT(VXGE_HAL_INTR_RX, (vpath->vp_id * 4), 4);
else
val64 |= vBIT(VXGE_HAL_INTR_RX, (vpath->vp_id * 4), 4);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&hldev->common_reg->tim_int_mask0);
} else {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->tim_int_mask1);
if (vpath->fifoh != NULL)
val64 &= ~VXGE_HAL_TIM_INT_MASK1_TIM_INT_MASK1(
VXGE_HAL_INTR_TX);
else
val64 |= VXGE_HAL_TIM_INT_MASK1_TIM_INT_MASK1(
VXGE_HAL_INTR_TX);
if (vpath->ringh != NULL)
val64 &= ~VXGE_HAL_TIM_INT_MASK1_TIM_INT_MASK1(
VXGE_HAL_INTR_RX);
else
val64 |= VXGE_HAL_TIM_INT_MASK1_TIM_INT_MASK1(
VXGE_HAL_INTR_RX);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&hldev->common_reg->tim_int_mask1);
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
}
/*
* vxge_hal_vpath_alarm_process - Process Alarms.
* @vpath: Virtual Path.
* @skip_alarms: Do not clear the alarms
*
* Process vpath alarms.
*
*/
vxge_hal_status_e
vxge_hal_vpath_alarm_process(vxge_hal_vpath_h vpath_handle, u32 skip_alarms)
{
vxge_hal_status_e status;
__hal_device_t *hldev;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
status = __hal_vpath_alarm_process(
vp->vpath,
skip_alarms);
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_msix_mode - Is MSIX enabled?
* @vpath_handle: Virtual Path handle.
*
* Returns 0 if MSI is enabled for the specified device,
* non-zero otherwise.
*/
u32
vxge_hal_vpath_msix_mode(vxge_hal_vpath_h vpath_handle)
{
__hal_device_t *hldev;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (hldev->header.msix_enabled);
}
/*
* vxge_hal_vpath_msix_set
* Associate MSIX vectors with TIM interrupts and alrms
* @vpath_handle: Virtual Path handle.
* @tim_msix_id: MSIX vectors associated with VXGE_HAL_VPATH_MSIX_MAX number of
* interrupts(Can be repeated). If fifo or ring are not enabled
* the MSIX vector for that should be set to 0
* @alarm_msix_id: MSIX vector for alarm.
*
* This API will associate a given MSIX vector numbers with the four TIM
* interrupts and alarm interrupt.
*/
vxge_hal_status_e
vxge_hal_vpath_msix_set(vxge_hal_vpath_h vpath_handle,
int *tim_msix_id,
int alarm_msix_id)
{
u32 i;
u32 j;
u32 rvp_id;
u32 msix_id;
u64 val64;
__hal_device_t *hldev;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vp != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT", "
"tim_msix_id0 = %d, tim_msix_id1 = %d, tim_msix_id2 = %d, "
"tim_msix_id3 = %d, alarm_msix_id = %d", (ptr_t) vpath_handle,
tim_msix_id[0], tim_msix_id[1], tim_msix_id[2], tim_msix_id[3],
alarm_msix_id);
for (i = 0; i < VXGE_HAL_VPATH_MSIX_MAX + 1; i++) {
if (i == VXGE_HAL_VPATH_MSIX_MAX)
msix_id = alarm_msix_id;
else
msix_id = tim_msix_id[i];
rvp_id = msix_id / VXGE_HAL_VPATH_MSIX_MAX;
for (j = 0; j < VXGE_HAL_MAX_VIRTUAL_PATHS; j++) {
if (!(hldev->vpath_assignments & mBIT(j)))
continue;
if (rvp_id-- == 0) {
hldev->msix_map[msix_id].vp_id = j;
hldev->msix_map[msix_id].int_num =
msix_id % VXGE_HAL_VPATH_MSIX_MAX;
break;
}
}
}
val64 = VXGE_HAL_INTERRUPT_CFG0_GROUP0_MSIX_FOR_TXTI(
hldev->msix_map[tim_msix_id[0]].vp_id * VXGE_HAL_VPATH_MSIX_MAX +
hldev->msix_map[tim_msix_id[0]].int_num) |
VXGE_HAL_INTERRUPT_CFG0_GROUP1_MSIX_FOR_TXTI(
hldev->msix_map[tim_msix_id[1]].vp_id * VXGE_HAL_VPATH_MSIX_MAX +
hldev->msix_map[tim_msix_id[1]].int_num) |
VXGE_HAL_INTERRUPT_CFG0_GROUP2_MSIX_FOR_TXTI(
hldev->msix_map[tim_msix_id[2]].vp_id * VXGE_HAL_VPATH_MSIX_MAX +
hldev->msix_map[tim_msix_id[2]].int_num) |
VXGE_HAL_INTERRUPT_CFG0_GROUP3_MSIX_FOR_TXTI(
hldev->msix_map[tim_msix_id[3]].vp_id * VXGE_HAL_VPATH_MSIX_MAX +
hldev->msix_map[tim_msix_id[3]].int_num);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vp->vpath->vp_reg->interrupt_cfg0);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_INTERRUPT_CFG2_ALARM_MAP_TO_MSG(
hldev->msix_map[alarm_msix_id].vp_id * VXGE_HAL_VPATH_MSIX_MAX +
hldev->msix_map[alarm_msix_id].int_num),
&vp->vpath->vp_reg->interrupt_cfg2);
if (hldev->header.config.intr_mode ==
VXGE_HAL_INTR_MODE_MSIX_ONE_SHOT) {
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0, (u32) bVAL32(
VXGE_HAL_ONE_SHOT_VECT0_EN_ONE_SHOT_VECT0_EN, 0),
&vp->vpath->vp_reg->one_shot_vect0_en);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0, (u32) bVAL32(
VXGE_HAL_ONE_SHOT_VECT1_EN_ONE_SHOT_VECT1_EN, 0),
&vp->vpath->vp_reg->one_shot_vect1_en);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0, (u32) bVAL32(
VXGE_HAL_ONE_SHOT_VECT2_EN_ONE_SHOT_VECT2_EN, 0),
&vp->vpath->vp_reg->one_shot_vect2_en);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0, (u32) bVAL32(
VXGE_HAL_ONE_SHOT_VECT3_EN_ONE_SHOT_VECT3_EN, 0),
&vp->vpath->vp_reg->one_shot_vect3_en);
} else if (hldev->header.config.intr_mode ==
VXGE_HAL_INTR_MODE_EMULATED_INTA) {
/* For emulated-INTA we are only using MSI-X 1 to be one shot */
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0, (u32) bVAL32(
VXGE_HAL_ONE_SHOT_VECT1_EN_ONE_SHOT_VECT1_EN, 0),
&vp->vpath->vp_reg->one_shot_vect1_en);
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_msix_mask - Mask MSIX Vector.
* @vpath_handle: Virtual Path handle.
* @msix_id: MSIX ID
*
* The function masks the msix interrupt for the given msix_id
*
* Note:
*
* Returns: 0,
* Otherwise, VXGE_HAL_ERR_WRONG_IRQ if the msix index is out of range
* status.
* See also:
*/
void
vxge_hal_vpath_msix_mask(vxge_hal_vpath_h vpath_handle, int msix_id)
{
__hal_device_t *hldev;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq(
"vpath_handle = 0x"VXGE_OS_STXFMT", msix_id = %d",
(ptr_t) vpath_handle, msix_id);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(mBIT(hldev->msix_map[msix_id].vp_id), 0),
&hldev->common_reg->set_msix_mask_vect[
hldev->msix_map[msix_id].int_num]);
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
}
/*
* vxge_hal_vpath_msix_clear - Clear MSIX Vector.
* @vpath_handle: Virtual Path handle.
* @msix_id: MSI ID
*
* The function clears the msix interrupt for the given msix_id
*
* Note:
*
* Returns: 0,
* Otherwise, VXGE_HAL_ERR_WRONG_IRQ if the msix index is out of range
* status.
* See also:
*/
void
vxge_hal_vpath_msix_clear(vxge_hal_vpath_h vpath_handle, int msix_id)
{
__hal_device_t *hldev;
__hal_vpath_handle_t *vp;
vxge_assert(vpath_handle != NULL);
vp = (__hal_vpath_handle_t *) vpath_handle;
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq(
"vpath_handle = 0x"VXGE_OS_STXFMT", msix_id = %d",
(ptr_t) vpath_handle, msix_id);
if ((hldev->header.config.intr_mode ==
VXGE_HAL_INTR_MODE_MSIX_ONE_SHOT) ||
(hldev->header.config.intr_mode ==
VXGE_HAL_INTR_MODE_EMULATED_INTA)) {
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(mBIT(hldev->msix_map[msix_id].vp_id), 0),
&hldev->common_reg->clr_msix_one_shot_vec[
hldev->msix_map[msix_id].int_num]);
if (hldev->header.config.intr_mode ==
VXGE_HAL_INTR_MODE_EMULATED_INTA) {
/* Adding read to flush the write,
* for HP-ISS platform
*/
vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->titan_general_int_status);
}
} else {
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(mBIT(hldev->msix_map[msix_id].vp_id), 0),
&hldev->common_reg->clear_msix_mask_vect[
hldev->msix_map[msix_id].int_num]);
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
}
/* NEW CODE BEGIN */
vxge_hal_status_e
vxge_hal_vpath_mf_msix_set(vxge_hal_vpath_h vpath_handle,
int *tim_msix_id,
int alarm_msix_id)
{
u64 val64;
__hal_device_t *hldev;
__hal_vpath_handle_t *vp;
vxge_assert(vpath_handle != NULL);
vp = (__hal_vpath_handle_t *) vpath_handle;
hldev = vp->vpath->hldev;
/* Write the internal msi-x vectors numbers */
val64 = VXGE_HAL_INTERRUPT_CFG0_GROUP0_MSIX_FOR_TXTI(tim_msix_id[0]) |
VXGE_HAL_INTERRUPT_CFG0_GROUP1_MSIX_FOR_TXTI(tim_msix_id[1]);
#if defined(VXGE_EMULATED_INTA)
if (hldev->config.intr_mode ==
VXGE_HAL_INTR_MODE_EMULATED_INTA)
val64 |= VXGE_HAL_INTERRUPT_CFG0_GROUP2_MSIX_FOR_TXTI(
(vp->vpath->vp_id * 4) + tim_msix_id[2]);
#endif
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vp->vpath->vp_reg->interrupt_cfg0);
vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vp->vpath->vp_reg->interrupt_cfg0);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_INTERRUPT_CFG2_ALARM_MAP_TO_MSG(
(hldev->first_vp_id * 4) + alarm_msix_id),
&vp->vpath->vp_reg->interrupt_cfg2);
if (
#if defined(VXGE_EMULATED_INTA)
(hldev->header.config.intr_mode ==
VXGE_HAL_INTR_MODE_EMULATED_INTA) ||
#endif
(hldev->header.config.intr_mode ==
VXGE_HAL_INTR_MODE_MSIX_ONE_SHOT)) {
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0, (u32) bVAL32(
VXGE_HAL_ONE_SHOT_VECT1_EN_ONE_SHOT_VECT1_EN, 0),
&vp->vpath->vp_reg->one_shot_vect1_en);
}
if (hldev->header.config.intr_mode ==
VXGE_HAL_INTR_MODE_MSIX_ONE_SHOT) {
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0, (u32) bVAL32(
VXGE_HAL_ONE_SHOT_VECT2_EN_ONE_SHOT_VECT2_EN, 0),
&vp->vpath->vp_reg->one_shot_vect2_en);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0, (u32) bVAL32(
VXGE_HAL_ONE_SHOT_VECT3_EN_ONE_SHOT_VECT3_EN, 0),
&vp->vpath->vp_reg->one_shot_vect3_en);
}
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_mf_msix_mask - Mask MSIX Vector.
* @vp: Virtual Path handle.
* @msix_id: MSIX ID
*
* The function masks the msix interrupt for the given msix_id
*
* Returns: 0,
* Otherwise, VXGE_HW_ERR_WRONG_IRQ if the msix index is out of range
* status.
* See also:
*/
void
vxge_hal_vpath_mf_msix_mask(vxge_hal_vpath_h vpath_handle, int msix_id)
{
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_hal_pio_mem_write32_upper(vp->vpath->hldev->header.pdev,
vp->vpath->hldev->header.regh0, (u32) bVAL32(mBIT(msix_id >> 2), 0),
&vp->vpath->hldev->common_reg->set_msix_mask_vect[msix_id % 4]);
}
/*
* vxge_hal_vpath_mf_msix_clear - Clear MSIX Vector.
* @vp: Virtual Path handle.
* @msix_id: MSI ID
*
* The function clears the msix interrupt for the given msix_id
*
* Returns: 0,
* Otherwise, VXGE_HW_ERR_WRONG_IRQ if the msix index is out of range
* status.
* See also:
*/
void
vxge_hal_vpath_mf_msix_clear(vxge_hal_vpath_h vpath_handle, int msix_id)
{
__hal_device_t *hldev;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
if (
#if defined(VXGE_EMULATED_INTA)
(hldev->header.config.intr_mode ==
VXGE_HAL_INTR_MODE_EMULATED_INTA) ||
#endif
(hldev->header.config.intr_mode ==
VXGE_HAL_INTR_MODE_MSIX_ONE_SHOT)) {
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(mBIT((msix_id >> 2)), 0),
&hldev->common_reg->clr_msix_one_shot_vec[msix_id % 4]);
} else {
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(mBIT((msix_id >> 2)), 0),
&hldev->common_reg->clear_msix_mask_vect[msix_id % 4]);
}
}
/*
* vxge_hal_vpath_mf_msix_unmask - Unmask the MSIX Vector.
* @vp: Virtual Path handle.
* @msix_id: MSI ID
*
* The function unmasks the msix interrupt for the given msix_id
*
* Returns: 0,
* Otherwise, VXGE_HW_ERR_WRONG_IRQ if the msix index is out of range
* status.
* See also:
*/
void
vxge_hal_vpath_mf_msix_unmask(vxge_hal_vpath_h vpath_handle, int msix_id)
{
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_hal_pio_mem_write32_upper(vp->vpath->hldev->header.pdev,
vp->vpath->hldev->header.regh0,
(u32) bVAL32(mBIT(msix_id >> 2), 0),
&vp->vpath->hldev->common_reg->
clear_msix_mask_vect[msix_id % 4]);
}
/* NEW CODE ENDS */
/*
* vxge_hal_vpath_msix_unmask - Unmask the MSIX Vector.
* @vpath_handle: Virtual Path handle.
* @msix_id: MSI ID
*
* The function unmasks the msix interrupt for the given msix_id
*
* Note:
*
* Returns: 0,
* Otherwise, VXGE_HAL_ERR_WRONG_IRQ if the msix index is out of range
* status.
* See also:
*/
void
vxge_hal_vpath_msix_unmask(vxge_hal_vpath_h vpath_handle, int msix_id)
{
__hal_device_t *hldev;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq(
"vpath_handle = 0x"VXGE_OS_STXFMT", msix_id = %d",
(ptr_t) vpath_handle, msix_id);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(mBIT(hldev->msix_map[msix_id].vp_id), 0),
&hldev->common_reg->clear_msix_mask_vect[
hldev->msix_map[msix_id].int_num]);
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
}
/*
* vxge_hal_vpath_msix_mask_all - Mask all MSIX vectors for the vpath.
* @vpath_handle: Virtual Path handle.
*
* The function masks all msix interrupt for the given vpath
*
*/
void
vxge_hal_vpath_msix_mask_all(vxge_hal_vpath_h vpath_handle)
{
__hal_device_t *hldev;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq(
"vpath_handle = 0x"VXGE_OS_STXFMT, (ptr_t) vpath_handle);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(mBIT(vp->vpath->vp_id), 0),
&hldev->common_reg->set_msix_mask_all_vect);
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
}
/*
* vxge_hal_vpath_msix_unmask_all - Unmask all MSIX vectors for the vpath.
* @vpath_handle: Virtual Path handle.
*
* The function unmasks the msix interrupt for the given vpath
*
*/
void
vxge_hal_vpath_msix_unmask_all(vxge_hal_vpath_h vpath_handle)
{
__hal_device_t *hldev;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(mBIT(vp->vpath->vp_id), 0),
&hldev->common_reg->clear_msix_mask_all_vect);
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result = 0",
__FILE__, __func__, __LINE__);
}
/*
* vxge_hal_vpath_poll_rx - Poll Rx Virtual Path for completed
* descriptors and process the same.
* @vpath_handle: Virtual Path ahandle.
* @got_rx: Buffer to return the flag set if receive interrupt is occured
*
* The function polls the Rx for the completed descriptors and calls
* the upper-layer driver (ULD) via supplied completion callback.
*
* Returns: VXGE_HAL_OK, if the polling is completed successful.
* VXGE_HAL_COMPLETIONS_REMAIN: There are still more completed
* descriptors available which are yet to be processed.
*
* See also: vxge_hal_vpath_poll_tx()
*/
vxge_hal_status_e
vxge_hal_vpath_poll_rx(vxge_hal_vpath_h vpath_handle, u32 *got_rx)
{
u8 t_code;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_hal_rxd_h first_rxdh;
void *rxd_priv;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
__hal_ring_t *ring;
vxge_assert((vpath_handle != NULL) && (got_rx != NULL));
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq(
"vpathh = 0x"VXGE_OS_STXFMT", got_rx = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle, (ptr_t) got_rx);
ring = (__hal_ring_t *) vpath->ringh;
if (ring == NULL) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
ring->cmpl_cnt = 0;
ring->channel.poll_bytes = 0;
*got_rx = 0;
if ((status = vxge_hal_ring_rxd_next_completed(vpath_handle,
&first_rxdh, &rxd_priv, &t_code)) == VXGE_HAL_OK) {
if (ring->callback(vpath_handle, first_rxdh, rxd_priv,
t_code, ring->channel.userdata) != VXGE_HAL_OK) {
status = VXGE_HAL_COMPLETIONS_REMAIN;
}
(*got_rx)++;
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_poll_tx - Poll Tx for completed descriptors and process
* the same.
* @vpath_handle: Virtual Path ahandle.
* @got_tx: Buffer to return the flag set if transmit interrupt is occured
*
* The function polls the Tx for the completed descriptors and calls
* the upper-layer driver (ULD) via supplied completion callback.
*
* Returns: VXGE_HAL_OK, if the polling is completed successful.
* VXGE_HAL_COMPLETIONS_REMAIN: There are still more completed
* descriptors available which are yet to be processed.
*
* See also: vxge_hal_vpath_poll_rx().
*/
vxge_hal_status_e
vxge_hal_vpath_poll_tx(vxge_hal_vpath_h vpath_handle, u32 *got_tx)
{
vxge_hal_fifo_tcode_e t_code;
vxge_hal_txdl_h first_txdlh;
void *txdl_priv;
__hal_virtualpath_t *vpath;
__hal_fifo_t *fifo;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert((vpath_handle != NULL) && (got_tx != NULL));
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath_irq("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath_irq(
"vpathh = 0x"VXGE_OS_STXFMT", got_tx = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle, (ptr_t) got_tx);
fifo = (__hal_fifo_t *) vpath->fifoh;
if (fifo == NULL) {
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
fifo->channel.poll_bytes = 0;
*got_tx = 0;
if ((status = vxge_hal_fifo_txdl_next_completed(vpath_handle,
&first_txdlh, &txdl_priv, &t_code)) == VXGE_HAL_OK) {
if (fifo->callback(vpath_handle, first_txdlh, txdl_priv,
t_code, fifo->channel.userdata) != VXGE_HAL_OK) {
status = VXGE_HAL_COMPLETIONS_REMAIN;
}
(*got_tx)++;
}
vxge_hal_trace_log_vpath_irq("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vpath_mgmt_read
* @hldev: HAL device
* @vpath: Virtual path structure
*
* This routine reads the vpath_mgmt registers
*/
vxge_hal_status_e
__hal_vpath_mgmt_read(
__hal_device_t *hldev,
__hal_virtualpath_t *vpath)
{
u32 i, mtu;
u64 val64;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert((hldev != NULL) && (vpath != NULL));
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"hldev = 0x"VXGE_OS_STXFMT", vpath = 0x"VXGE_OS_STXFMT,
(ptr_t) hldev, (ptr_t) vpath);
vpath->sess_grps_available = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vpmgmt_reg->sgrp_own);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vpmgmt_reg->vpath_is_first);
vpath->is_first_vpath =
(u32) VXGE_HAL_VPATH_IS_FIRST_GET_VPATH_IS_FIRST(val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vpmgmt_reg->tim_vpath_assignment);
vpath->bmap_root_assigned =
(u32) VXGE_HAL_TIM_VPATH_ASSIGNMENT_GET_BMAP_ROOT(val64);
mtu = 0;
for (i = 0; i < VXGE_HAL_MAC_MAX_WIRE_PORTS; i++) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vpmgmt_reg->rxmac_cfg0_port_vpmgmt_clone[i]);
if (mtu < (u32)
VXGE_HAL_RXMAC_CFG0_PORT_VPMGMT_CLONE_GET_MAX_PYLD_LEN(
val64)) {
mtu = (u32)
VXGE_HAL_RXMAC_CFG0_PORT_VPMGMT_CLONE_GET_MAX_PYLD_LEN(
val64);
}
}
vpath->max_mtu = mtu + VXGE_HAL_MAC_HEADER_MAX_SIZE;
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vpmgmt_reg->xmac_vsport_choices_vp);
vpath->vsport_choices =
(u32) VXGE_HAL_XMAC_VSPORT_CHOICES_VP_GET_VSPORT_VECTOR(val64);
for (i = 0; i < VXGE_HAL_MAX_VIRTUAL_PATHS; i++) {
if (val64 & mBIT(i))
vpath->vsport_number = i;
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vpmgmt_reg->xgmac_gen_status_vpmgmt_clone);
if (val64 & VXGE_HAL_XGMAC_GEN_STATUS_VPMGMT_CLONE_XMACJ_NTWK_OK) {
VXGE_HAL_DEVICE_LINK_STATE_SET(vpath->hldev, VXGE_HAL_LINK_UP);
} else {
VXGE_HAL_DEVICE_LINK_STATE_SET(vpath->hldev,
VXGE_HAL_LINK_DOWN);
}
if (val64 &
VXGE_HAL_XGMAC_GEN_STATUS_VPMGMT_CLONE_XMACJ_NTWK_DATA_RATE) {
VXGE_HAL_DEVICE_DATA_RATE_SET(vpath->hldev,
VXGE_HAL_DATA_RATE_10G);
} else {
VXGE_HAL_DEVICE_DATA_RATE_SET(vpath->hldev,
VXGE_HAL_DATA_RATE_1G);
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vpath_reset_check - Check if resetting the vpath completed
*
* @vpath: Virtual Path
*
* This routine checks the vpath_rst_in_prog register to see if adapter
* completed the reset process for the vpath
*/
vxge_hal_status_e
__hal_vpath_reset_check(
__hal_virtualpath_t *vpath)
{
__hal_device_t *hldev;
vxge_hal_status_e status;
vxge_assert(vpath != NULL);
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath);
status = vxge_hal_device_register_poll(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->vpath_rst_in_prog,
0,
VXGE_HAL_VPATH_RST_IN_PROG_VPATH_RST_IN_PROG(
1 << (16 - vpath->vp_id)),
WAIT_FACTOR * hldev->header.config.device_poll_millis);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vpath_hw_reset
* @hldev: Handle to the device object
* @vp_id: Virtual Path Id
*
* This routine resets the vpath on the device
*/
vxge_hal_status_e
__hal_vpath_hw_reset(vxge_hal_device_h devh, u32 vp_id)
{
u64 val64;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_device_t *hldev;
vxge_assert(devh != NULL);
hldev = (__hal_device_t *) devh;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("devh = 0x"VXGE_OS_STXFMT", vp_id = %d",
(ptr_t) devh, vp_id);
val64 = VXGE_HAL_CMN_RSTHDLR_CFG0_SW_RESET_VPATH(1 << (16 - vp_id));
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&hldev->common_reg->cmn_rsthdlr_cfg0);
(void) __hal_ifmsg_wmsg_post(hldev,
vp_id,
VXGE_HAL_RTS_ACCESS_STEER_MSG_DEST_BROADCAST,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MSG_TYPE_VPATH_RESET_BEGIN,
0);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vpath_sw_reset
* @hldev: Handle to the device object
* @vp_id: Virtual Path Id
*
* This routine resets the vpath structures
*/
vxge_hal_status_e
__hal_vpath_sw_reset(
vxge_hal_device_h devh,
u32 vp_id)
{
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_device_t *hldev = (__hal_device_t *) devh;
__hal_virtualpath_t *vpath;
vxge_assert(devh != NULL);
vpath = (__hal_virtualpath_t *) &hldev->virtual_paths[vp_id];
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("devh = 0x"VXGE_OS_STXFMT", vp_id = %d",
(ptr_t) devh, vp_id);
if (vpath->ringh) {
status = __hal_ring_reset(vpath->ringh);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
}
if (vpath->fifoh) {
status = __hal_fifo_reset(vpath->fifoh);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_enable
* @vpath_handle: Handle to the vpath object
*
* This routine clears the vpath reset and puts vpath in service
*/
vxge_hal_status_e
vxge_hal_vpath_enable(
vxge_hal_vpath_h vpath_handle)
{
u64 val64;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vxge_assert(vpath_handle != NULL);
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
val64 = VXGE_HAL_CMN_RSTHDLR_CFG1_CLR_VPATH_RESET(
1 << (16 - vpath->vp_id));
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&hldev->common_reg->cmn_rsthdlr_cfg1);
(void) __hal_ifmsg_wmsg_post(hldev,
vpath->vp_id,
VXGE_HAL_RTS_ACCESS_STEER_MSG_DEST_BROADCAST,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MSG_TYPE_VPATH_RESET_END,
0);
VXGE_HAL_RING_POST_DOORBELL(vpath_handle, vpath->ringh);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vpath_prc_configure
* @hldev: Handle to the device object
* @vp_id: Virtual Path Id
*
* This routine configures the prc registers of virtual path
* using the config passed
*/
vxge_hal_status_e
__hal_vpath_prc_configure(
vxge_hal_device_h devh,
u32 vp_id)
{
u64 val64;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_device_t *hldev = (__hal_device_t *) devh;
__hal_virtualpath_t *vpath;
vxge_hal_vp_config_t *vp_config;
vxge_assert(devh != NULL);
vpath = (__hal_virtualpath_t *) &hldev->virtual_paths[vp_id];
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("devh = 0x"VXGE_OS_STXFMT", vp_id = %d",
(ptr_t) devh, vp_id);
vp_config = vpath->vp_config;
if (vp_config->ring.enable == VXGE_HAL_RING_DISABLE) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->prc_cfg1);
if (vp_config->ring.rx_timer_val !=
VXGE_HAL_RING_USE_FLASH_DEFAULT_RX_TIMER_VAL) {
val64 &= ~VXGE_HAL_PRC_CFG1_RX_TIMER_VAL(0x1fffffff);
val64 |= VXGE_HAL_PRC_CFG1_RX_TIMER_VAL(
vp_config->ring.rx_timer_val);
}
val64 |= VXGE_HAL_PRC_CFG1_RTI_TINT_DISABLE;
if (vp_config->ring.greedy_return !=
VXGE_HAL_RING_GREEDY_RETURN_USE_FLASH_DEFAULT) {
if (vp_config->ring.greedy_return)
val64 |= VXGE_HAL_PRC_CFG1_GREEDY_RETURN;
else
val64 &= ~VXGE_HAL_PRC_CFG1_GREEDY_RETURN;
}
if (vp_config->ring.rx_timer_ci !=
VXGE_HAL_RING_RX_TIMER_CI_USE_FLASH_DEFAULT) {
if (vp_config->ring.rx_timer_ci)
val64 |= VXGE_HAL_PRC_CFG1_RX_TIMER_CI;
else
val64 &= ~VXGE_HAL_PRC_CFG1_RX_TIMER_CI;
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->prc_cfg1);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->prc_cfg7);
if (vpath->vp_config->ring.scatter_mode !=
VXGE_HAL_RING_SCATTER_MODE_USE_FLASH_DEFAULT) {
val64 &= ~VXGE_HAL_PRC_CFG7_SCATTER_MODE(0x3);
switch (vpath->vp_config->ring.scatter_mode) {
case VXGE_HAL_RING_SCATTER_MODE_A:
val64 |= VXGE_HAL_PRC_CFG7_SCATTER_MODE(
VXGE_HAL_PRC_CFG7_SCATTER_MODE_A);
break;
case VXGE_HAL_RING_SCATTER_MODE_B:
val64 |= VXGE_HAL_PRC_CFG7_SCATTER_MODE(
VXGE_HAL_PRC_CFG7_SCATTER_MODE_B);
break;
case VXGE_HAL_RING_SCATTER_MODE_C:
val64 |= VXGE_HAL_PRC_CFG7_SCATTER_MODE(
VXGE_HAL_PRC_CFG7_SCATTER_MODE_C);
break;
}
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->prc_cfg7);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->prc_cfg6);
if (vpath->vp_config->ring.post_mode !=
VXGE_HAL_RING_POST_MODE_USE_FLASH_DEFAULT) {
if (vpath->vp_config->ring.post_mode ==
VXGE_HAL_RING_POST_MODE_DOORBELL)
val64 |= VXGE_HAL_PRC_CFG6_DOORBELL_MODE_EN;
else
val64 &= ~VXGE_HAL_PRC_CFG6_DOORBELL_MODE_EN;
} else {
vpath->vp_config->ring.post_mode =
((val64 & VXGE_HAL_PRC_CFG6_DOORBELL_MODE_EN) ?
VXGE_HAL_RING_POST_MODE_DOORBELL :
VXGE_HAL_RING_POST_MODE_LEGACY);
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->prc_cfg6);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_PRC_CFG5_RXD0_ADD(
__hal_ring_first_block_address_get(vpath->ringh) >> 3),
&vpath->vp_reg->prc_cfg5);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->prc_cfg4);
val64 |= VXGE_HAL_PRC_CFG4_IN_SVC;
val64 &= ~VXGE_HAL_PRC_CFG4_RING_MODE(0x3);
if (vp_config->ring.buffer_mode == VXGE_HAL_RING_RXD_BUFFER_MODE_1) {
val64 |= VXGE_HAL_PRC_CFG4_RING_MODE(
VXGE_HAL_PRC_CFG4_RING_MODE_ONE_BUFFER);
} else {
if (vp_config->ring.buffer_mode ==
VXGE_HAL_RING_RXD_BUFFER_MODE_3) {
val64 |= VXGE_HAL_PRC_CFG4_RING_MODE(
VXGE_HAL_PRC_CFG4_RING_MODE_THREE_BUFFER);
} else {
val64 |= VXGE_HAL_PRC_CFG4_RING_MODE(
VXGE_HAL_PRC_CFG4_RING_MODE_FIVE_BUFFER);
}
}
if (vp_config->ring.no_snoop_bits !=
VXGE_HAL_RING_NO_SNOOP_USE_FLASH_DEFAULT) {
val64 &= ~(VXGE_HAL_PRC_CFG4_FRM_NO_SNOOP |
VXGE_HAL_PRC_CFG4_RXD_NO_SNOOP);
if (vp_config->ring.no_snoop_bits ==
VXGE_HAL_RING_NO_SNOOP_RXD) {
val64 |= VXGE_HAL_PRC_CFG4_RXD_NO_SNOOP;
} else {
if (vp_config->ring.no_snoop_bits ==
VXGE_HAL_RING_NO_SNOOP_FRM) {
val64 |= VXGE_HAL_PRC_CFG4_FRM_NO_SNOOP;
} else {
if (vp_config->ring.no_snoop_bits ==
VXGE_HAL_RING_NO_SNOOP_ALL) {
val64 |= VXGE_HAL_PRC_CFG4_FRM_NO_SNOOP;
val64 |= VXGE_HAL_PRC_CFG4_RXD_NO_SNOOP;
}
}
}
}
if (hldev->header.config.rth_en == VXGE_HAL_RTH_DISABLE)
val64 |= VXGE_HAL_PRC_CFG4_RTH_DISABLE;
else
val64 &= ~VXGE_HAL_PRC_CFG4_RTH_DISABLE;
val64 |= VXGE_HAL_PRC_CFG4_SIGNAL_BENIGN_OVFLW;
val64 |= VXGE_HAL_PRC_CFG4_BIMODAL_INTERRUPT;
if (vp_config->ring.backoff_interval_us !=
VXGE_HAL_USE_FLASH_DEFAULT_BACKOFF_INTERVAL_US) {
val64 &= ~VXGE_HAL_PRC_CFG4_BACKOFF_INTERVAL(0xffffff);
val64 |= VXGE_HAL_PRC_CFG4_BACKOFF_INTERVAL(
vp_config->ring.backoff_interval_us * 1000 / 4);
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->prc_cfg4);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vpath_kdfc_configure
* @hldev: Handle to the device object
* @vp_id: Virtual Path Id
*
* This routine configures the kdfc registers of virtual path
* using the config passed
*/
vxge_hal_status_e
__hal_vpath_kdfc_configure(
vxge_hal_device_h devh,
u32 vp_id)
{
u64 val64;
u64 vpath_stride;
u64 fifo_stride;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_device_t *hldev = (__hal_device_t *) devh;
__hal_virtualpath_t *vpath;
vxge_assert(devh != NULL);
vpath = (__hal_virtualpath_t *) &hldev->virtual_paths[vp_id];
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("devh = 0x"VXGE_OS_STXFMT", vp_id = %d",
(ptr_t) devh, vp_id);
status = __hal_kdfc_swapper_set((vxge_hal_device_t *) hldev, vp_id);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
if ((vpath->vp_config->ring.post_mode ==
VXGE_HAL_RING_POST_MODE_DOORBELL) &&
(vxge_hal_device_check_id(devh) == VXGE_HAL_CARD_TITAN_1)) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rxdmem_size);
vpath->rxd_mem_size =
(u32) VXGE_HAL_RXDMEM_SIZE_PRC_RXDMEM_SIZE(val64) * 8;
} else {
vpath->rxd_mem_size = (VXGE_HAL_MAX_RING_LENGTH /
vxge_hal_ring_rxds_per_block_get(
vpath->vp_config->ring.buffer_mode)) *
VXGE_OS_HOST_PAGE_SIZE;
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->kdfc_drbl_triplet_total);
vpath->max_kdfc_db =
(u32) VXGE_HAL_KDFC_DRBL_TRIPLET_TOTAL_GET_KDFC_MAX_SIZE(val64 + 1) / 2;
vpath->max_ofl_db = 0;
if (vpath->vp_config->fifo.enable == VXGE_HAL_FIFO_ENABLE) {
vpath->max_nofl_db = vpath->max_kdfc_db - 1;
vpath->max_msg_db = 0;
if (vpath->max_nofl_db < vpath->vp_config->fifo.fifo_length) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_BADCFG_FIFO_LENGTH);
return (VXGE_HAL_BADCFG_FIFO_LENGTH);
}
} else {
vpath->max_nofl_db = 0;
vpath->max_msg_db = vpath->max_kdfc_db;
}
val64 = 0;
if (vpath->max_nofl_db)
val64 |= VXGE_HAL_KDFC_FIFO_TRPL_PARTITION_LENGTH_0(
(vpath->max_nofl_db * 2) - 1);
if (vpath->max_msg_db)
val64 |= VXGE_HAL_KDFC_FIFO_TRPL_PARTITION_LENGTH_1(
(vpath->max_msg_db * 2) - 1);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->kdfc_fifo_trpl_partition);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_KDFC_FIFO_TRPL_CTRL_TRIPLET_ENABLE,
&vpath->vp_reg->kdfc_fifo_trpl_ctrl);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->kdfc_trpl_fifo_0_ctrl);
if (vpath->max_nofl_db) {
val64 &= ~(VXGE_HAL_KDFC_TRPL_FIFO_0_CTRL_MODE(0x3) |
VXGE_HAL_KDFC_TRPL_FIFO_0_CTRL_SELECT(0xFF));
val64 |= VXGE_HAL_KDFC_TRPL_FIFO_0_CTRL_MODE(
VXGE_HAL_KDFC_TRPL_FIFO_0_CTRL_MODE_NON_OFFLOAD_ONLY) |
#if !defined(VXGE_OS_HOST_BIG_ENDIAN)
VXGE_HAL_KDFC_TRPL_FIFO_0_CTRL_SWAP_EN |
#endif
VXGE_HAL_KDFC_TRPL_FIFO_0_CTRL_SELECT(0);
if (vpath->vp_config->no_snoop !=
VXGE_HAL_VPATH_NO_SNOOP_USE_FLASH_DEFAULT) {
if (vpath->vp_config->no_snoop)
val64 |=
VXGE_HAL_KDFC_TRPL_FIFO_0_CTRL_NO_SNOOP;
else
val64 &=
~VXGE_HAL_KDFC_TRPL_FIFO_0_CTRL_NO_SNOOP;
}
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->kdfc_trpl_fifo_0_ctrl);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->kdfc_trpl_fifo_1_ctrl);
if (vpath->max_msg_db) {
val64 &= ~(VXGE_HAL_KDFC_TRPL_FIFO_1_CTRL_MODE(0x3) |
VXGE_HAL_KDFC_TRPL_FIFO_1_CTRL_SELECT(0xFF));
val64 |= VXGE_HAL_KDFC_TRPL_FIFO_1_CTRL_MODE(
VXGE_HAL_KDFC_TRPL_FIFO_1_CTRL_MODE_MESSAGES_ONLY) |
#if !defined(VXGE_OS_HOST_BIG_ENDIAN)
VXGE_HAL_KDFC_TRPL_FIFO_1_CTRL_SWAP_EN |
#endif
VXGE_HAL_KDFC_TRPL_FIFO_1_CTRL_SELECT(0);
if (vpath->vp_config->no_snoop !=
VXGE_HAL_VPATH_NO_SNOOP_USE_FLASH_DEFAULT) {
if (vpath->vp_config->no_snoop)
val64 |=
VXGE_HAL_KDFC_TRPL_FIFO_1_CTRL_NO_SNOOP;
else
val64 &=
~VXGE_HAL_KDFC_TRPL_FIFO_1_CTRL_NO_SNOOP;
}
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->kdfc_trpl_fifo_1_ctrl);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
(u64) 0,
&vpath->vp_reg->kdfc_trpl_fifo_2_ctrl);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
(u64) 0,
&vpath->vp_reg->kdfc_trpl_fifo_0_wb_address);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
(u64) 0,
&vpath->vp_reg->kdfc_trpl_fifo_1_wb_address);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
(u64) 0,
&vpath->vp_reg->kdfc_trpl_fifo_2_wb_address);
vxge_os_wmb();
vpath_stride = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->toc_reg->toc_kdfc_vpath_stride);
fifo_stride = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->toc_reg->toc_kdfc_fifo_stride);
vpath->nofl_db = (__hal_non_offload_db_wrapper_t *) ((void *)(hldev->kdfc +
(vp_id * VXGE_HAL_TOC_KDFC_VPATH_STRIDE_GET_TOC_KDFC_VPATH_STRIDE(
vpath_stride))));
vpath->msg_db = (__hal_messaging_db_wrapper_t *) ((void *)(hldev->kdfc +
(vp_id * VXGE_HAL_TOC_KDFC_VPATH_STRIDE_GET_TOC_KDFC_VPATH_STRIDE(
vpath_stride)) +
VXGE_HAL_TOC_KDFC_FIFO_STRIDE_GET_TOC_KDFC_FIFO_STRIDE(
fifo_stride)));
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vpath_mac_configure
* @hldev: Handle to the device object
* @vp_id: Virtual Path Id
*
* This routine configures the mac of virtual path using the config passed
*/
vxge_hal_status_e
__hal_vpath_mac_configure(
vxge_hal_device_h devh,
u32 vp_id)
{
u64 val64;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_device_t *hldev = (__hal_device_t *) devh;
__hal_virtualpath_t *vpath;
vxge_hal_vp_config_t *vp_config;
vxge_assert(devh != NULL);
vpath = (__hal_virtualpath_t *) &hldev->virtual_paths[vp_id];
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("devh = 0x"VXGE_OS_STXFMT", vp_id = %d",
(ptr_t) devh, vp_id);
vp_config = vpath->vp_config;
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_XMAC_VSPORT_CHOICE_VSPORT_NUMBER(vpath->vsport_number),
&vpath->vp_reg->xmac_vsport_choice);
if (vp_config->ring.enable == VXGE_HAL_RING_ENABLE) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->xmac_rpa_vcfg);
if (vp_config->rpa_ipv4_tcp_incl_ph !=
VXGE_HAL_VPATH_RPA_IPV4_TCP_INCL_PH_USE_FLASH_DEFAULT) {
if (vp_config->rpa_ipv4_tcp_incl_ph)
val64 |=
VXGE_HAL_XMAC_RPA_VCFG_IPV4_TCP_INCL_PH;
else
val64 &=
~VXGE_HAL_XMAC_RPA_VCFG_IPV4_TCP_INCL_PH;
}
if (vp_config->rpa_ipv6_tcp_incl_ph !=
VXGE_HAL_VPATH_RPA_IPV6_TCP_INCL_PH_USE_FLASH_DEFAULT) {
if (vp_config->rpa_ipv6_tcp_incl_ph)
val64 |=
VXGE_HAL_XMAC_RPA_VCFG_IPV6_TCP_INCL_PH;
else
val64 &=
~VXGE_HAL_XMAC_RPA_VCFG_IPV6_TCP_INCL_PH;
}
if (vp_config->rpa_ipv4_udp_incl_ph !=
VXGE_HAL_VPATH_RPA_IPV4_UDP_INCL_PH_USE_FLASH_DEFAULT) {
if (vp_config->rpa_ipv4_udp_incl_ph)
val64 |=
VXGE_HAL_XMAC_RPA_VCFG_IPV4_UDP_INCL_PH;
else
val64 &=
~VXGE_HAL_XMAC_RPA_VCFG_IPV4_UDP_INCL_PH;
}
if (vp_config->rpa_ipv6_udp_incl_ph !=
VXGE_HAL_VPATH_RPA_IPV6_UDP_INCL_PH_USE_FLASH_DEFAULT) {
if (vp_config->rpa_ipv6_udp_incl_ph)
val64 |=
VXGE_HAL_XMAC_RPA_VCFG_IPV6_UDP_INCL_PH;
else
val64 &=
~VXGE_HAL_XMAC_RPA_VCFG_IPV6_UDP_INCL_PH;
}
if (vp_config->rpa_l4_incl_cf !=
VXGE_HAL_VPATH_RPA_L4_INCL_CF_USE_FLASH_DEFAULT) {
if (vp_config->rpa_l4_incl_cf)
val64 |= VXGE_HAL_XMAC_RPA_VCFG_L4_INCL_CF;
else
val64 &= ~VXGE_HAL_XMAC_RPA_VCFG_L4_INCL_CF;
}
if (vp_config->rpa_strip_vlan_tag !=
VXGE_HAL_VPATH_RPA_STRIP_VLAN_TAG_USE_FLASH_DEFAULT) {
if (vp_config->rpa_strip_vlan_tag)
val64 |= VXGE_HAL_XMAC_RPA_VCFG_STRIP_VLAN_TAG;
else
val64 &= ~VXGE_HAL_XMAC_RPA_VCFG_STRIP_VLAN_TAG;
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->xmac_rpa_vcfg);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rxmac_vcfg0);
if (vp_config->mtu !=
VXGE_HAL_VPATH_USE_FLASH_DEFAULT_INITIAL_MTU) {
val64 &= ~VXGE_HAL_RXMAC_VCFG0_RTS_MAX_FRM_LEN(0x3fff);
if ((vp_config->mtu + VXGE_HAL_MAC_HEADER_MAX_SIZE) <
vpath->max_mtu)
val64 |= VXGE_HAL_RXMAC_VCFG0_RTS_MAX_FRM_LEN(
vp_config->mtu +
VXGE_HAL_MAC_HEADER_MAX_SIZE);
else
val64 |= VXGE_HAL_RXMAC_VCFG0_RTS_MAX_FRM_LEN(
vpath->max_mtu);
}
if (vp_config->rpa_ucast_all_addr_en !=
VXGE_HAL_VPATH_RPA_UCAST_ALL_ADDR_USE_FLASH_DEFAULT) {
if (vp_config->rpa_ucast_all_addr_en)
val64 |= VXGE_HAL_RXMAC_VCFG0_UCAST_ALL_ADDR_EN;
else
val64 &=
~VXGE_HAL_RXMAC_VCFG0_UCAST_ALL_ADDR_EN;
} else {
if (val64 & VXGE_HAL_RXMAC_VCFG0_UCAST_ALL_ADDR_EN) {
vp_config->rpa_ucast_all_addr_en =
VXGE_HAL_VPATH_RPA_UCAST_ALL_ADDR_ENABLE;
} else {
vp_config->rpa_ucast_all_addr_en =
VXGE_HAL_VPATH_RPA_UCAST_ALL_ADDR_DISABLE;
}
}
if (vp_config->rpa_mcast_all_addr_en !=
VXGE_HAL_VPATH_RPA_MCAST_ALL_ADDR_USE_FLASH_DEFAULT) {
if (vp_config->rpa_mcast_all_addr_en)
val64 |= VXGE_HAL_RXMAC_VCFG0_MCAST_ALL_ADDR_EN;
else
val64 &=
~VXGE_HAL_RXMAC_VCFG0_MCAST_ALL_ADDR_EN;
} else {
if (val64 & VXGE_HAL_RXMAC_VCFG0_MCAST_ALL_ADDR_EN) {
vp_config->rpa_mcast_all_addr_en =
VXGE_HAL_VPATH_RPA_MCAST_ALL_ADDR_ENABLE;
} else {
vp_config->rpa_mcast_all_addr_en =
VXGE_HAL_VPATH_RPA_MCAST_ALL_ADDR_DISABLE;
}
}
if (vp_config->rpa_bcast_en !=
VXGE_HAL_VPATH_RPA_BCAST_USE_FLASH_DEFAULT) {
if (vp_config->rpa_bcast_en)
val64 |= VXGE_HAL_RXMAC_VCFG0_BCAST_EN;
else
val64 &= ~VXGE_HAL_RXMAC_VCFG0_BCAST_EN;
} else {
if (val64 & VXGE_HAL_RXMAC_VCFG0_BCAST_EN) {
vp_config->rpa_bcast_en =
VXGE_HAL_VPATH_RPA_BCAST_ENABLE;
} else {
vp_config->rpa_bcast_en =
VXGE_HAL_VPATH_RPA_BCAST_DISABLE;
}
}
if (vp_config->rpa_all_vid_en !=
VXGE_HAL_VPATH_RPA_ALL_VID_USE_FLASH_DEFAULT) {
if (vp_config->rpa_all_vid_en)
val64 |= VXGE_HAL_RXMAC_VCFG0_ALL_VID_EN;
else
val64 &= ~VXGE_HAL_RXMAC_VCFG0_ALL_VID_EN;
} else {
if (val64 & VXGE_HAL_RXMAC_VCFG0_ALL_VID_EN) {
vp_config->rpa_all_vid_en =
VXGE_HAL_VPATH_RPA_ALL_VID_ENABLE;
} else {
vp_config->rpa_all_vid_en =
VXGE_HAL_VPATH_RPA_ALL_VID_DISABLE;
}
}
if (vpath->promisc_en == VXGE_HAL_VP_PROMISC_ENABLE) {
val64 |= VXGE_HAL_RXMAC_VCFG0_UCAST_ALL_ADDR_EN |
VXGE_HAL_RXMAC_VCFG0_MCAST_ALL_ADDR_EN |
VXGE_HAL_RXMAC_VCFG0_BCAST_EN |
VXGE_HAL_RXMAC_VCFG0_ALL_VID_EN;
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->rxmac_vcfg0);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rxmac_vcfg1);
val64 &= ~(VXGE_HAL_RXMAC_VCFG1_RTS_RTH_MULTI_IT_BD_MODE(0x3) |
VXGE_HAL_RXMAC_VCFG1_RTS_RTH_MULTI_IT_EN_MODE);
if (hldev->header.config.rth_it_type ==
VXGE_HAL_RTH_IT_TYPE_MULTI_IT) {
val64 |=
VXGE_HAL_RXMAC_VCFG1_RTS_RTH_MULTI_IT_BD_MODE(0x2) |
VXGE_HAL_RXMAC_VCFG1_RTS_RTH_MULTI_IT_EN_MODE;
}
if (vp_config->vp_queue_l2_flow !=
VXGE_HAL_VPATH_VP_Q_L2_FLOW_USE_FLASH_DEFAULT) {
if (vp_config->vp_queue_l2_flow)
val64 |= VXGE_HAL_RXMAC_VCFG1_CONTRIB_L2_FLOW;
else
val64 &= ~VXGE_HAL_RXMAC_VCFG1_CONTRIB_L2_FLOW;
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->rxmac_vcfg1);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->fau_rpa_vcfg);
if (vp_config->rpa_l4_comp_csum !=
VXGE_HAL_VPATH_RPA_L4_COMP_CSUM_USE_FLASH_DEFAULT) {
if (vp_config->rpa_l4_comp_csum)
val64 |= VXGE_HAL_FAU_RPA_VCFG_L4_COMP_CSUM;
else
val64 &= ~VXGE_HAL_FAU_RPA_VCFG_L4_COMP_CSUM;
}
if (vp_config->rpa_l3_incl_cf !=
VXGE_HAL_VPATH_RPA_L3_INCL_CF_USE_FLASH_DEFAULT) {
if (vp_config->rpa_l3_incl_cf)
val64 |= VXGE_HAL_FAU_RPA_VCFG_L3_INCL_CF;
else
val64 &= ~VXGE_HAL_FAU_RPA_VCFG_L3_INCL_CF;
}
if (vp_config->rpa_l3_comp_csum !=
VXGE_HAL_VPATH_RPA_L3_COMP_CSUM_USE_FLASH_DEFAULT) {
if (vp_config->rpa_l3_comp_csum)
val64 |= VXGE_HAL_FAU_RPA_VCFG_L3_COMP_CSUM;
else
val64 &= ~VXGE_HAL_FAU_RPA_VCFG_L3_COMP_CSUM;
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->fau_rpa_vcfg);
}
if (vp_config->fifo.enable == VXGE_HAL_FIFO_ENABLE) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->tpa_cfg);
if (vp_config->tpa_ignore_frame_error !=
VXGE_HAL_VPATH_TPA_IGNORE_FRAME_ERROR_USE_FLASH_DEFAULT) {
if (vp_config->tpa_ignore_frame_error)
val64 |= VXGE_HAL_TPA_CFG_IGNORE_FRAME_ERR;
else
val64 &= ~VXGE_HAL_TPA_CFG_IGNORE_FRAME_ERR;
}
if (vp_config->tpa_ipv6_keep_searching !=
VXGE_HAL_VPATH_TPA_IPV6_KEEP_SEARCHING_USE_FLASH_DEFAULT) {
if (vp_config->tpa_ipv6_keep_searching)
val64 |= VXGE_HAL_TPA_CFG_IPV6_STOP_SEARCHING;
else
val64 &= ~VXGE_HAL_TPA_CFG_IPV6_STOP_SEARCHING;
}
if (vp_config->tpa_l4_pshdr_present !=
VXGE_HAL_VPATH_TPA_L4_PSHDR_PRESENT_USE_FLASH_DEFAULT) {
if (vp_config->tpa_l4_pshdr_present)
val64 |= VXGE_HAL_TPA_CFG_L4_PSHDR_PRESENT;
else
val64 &= ~VXGE_HAL_TPA_CFG_L4_PSHDR_PRESENT;
}
if (vp_config->tpa_support_mobile_ipv6_hdrs !=
VXGE_HAL_VPATH_TPA_SUPPORT_MOBILE_IPV6_HDRS_DEFAULT) {
if (vp_config->tpa_support_mobile_ipv6_hdrs)
val64 |=
VXGE_HAL_TPA_CFG_SUPPORT_MOBILE_IPV6_HDRS;
else
val64 &=
~VXGE_HAL_TPA_CFG_SUPPORT_MOBILE_IPV6_HDRS;
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tpa_cfg);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->tx_protocol_assist_cfg);
if (vp_config->tpa_lsov2_en !=
VXGE_HAL_VPATH_TPA_LSOV2_EN_USE_FLASH_DEFAULT) {
if (vp_config->tpa_lsov2_en)
val64 |=
VXGE_HAL_TX_PROTOCOL_ASSIST_CFG_LSOV2_EN;
else
val64 &=
~VXGE_HAL_TX_PROTOCOL_ASSIST_CFG_LSOV2_EN;
}
if (vp_config->tpa_ipv6_keep_searching !=
VXGE_HAL_VPATH_TPA_IPV6_KEEP_SEARCHING_USE_FLASH_DEFAULT) {
if (vp_config->tpa_ipv6_keep_searching)
val64 |= VXGE_HAL_TX_PROTOCOL_ASSIST_CFG_IPV6_KEEP_SEARCHING;
else
val64 &= ~VXGE_HAL_TX_PROTOCOL_ASSIST_CFG_IPV6_KEEP_SEARCHING;
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tx_protocol_assist_cfg);
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vpath_tim_configure
* @hldev: Handle to the device object
* @vp_id: Virtual Path Id
*
* This routine configures the tim registers of virtual path
* using the config passed
*/
vxge_hal_status_e
__hal_vpath_tim_configure(
vxge_hal_device_h devh,
u32 vp_id)
{
u64 val64;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_device_t *hldev = (__hal_device_t *) devh;
__hal_virtualpath_t *vpath;
vxge_assert(devh != NULL);
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("devh = 0x"VXGE_OS_STXFMT", vp_id = %d",
(ptr_t) devh, vp_id);
vpath = (__hal_virtualpath_t *) &hldev->virtual_paths[vp_id];
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
(u64) 0,
&vpath->vp_reg->tim_dest_addr);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
(u64) 0,
&vpath->vp_reg->tim_vpath_map);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
(u64) 0,
&vpath->vp_reg->tim_bitmap);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
(u64) 0,
&vpath->vp_reg->tim_remap);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rtdma_rd_optimization_ctrl);
val64 |= VXGE_HAL_RTDMA_RD_OPTIMIZATION_CTRL_FB_ADDR_BDRY_EN;
if (hldev->header.config.intr_mode == VXGE_HAL_INTR_MODE_EMULATED_INTA)
val64 = 0x1000150012000100ULL; /* override for HPISS */
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->rtdma_rd_optimization_ctrl);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->tim_wrkld_clc);
val64 |= VXGE_HAL_TIM_WRKLD_CLC_WRKLD_EVAL_PRD(0x5BE9) |
VXGE_HAL_TIM_WRKLD_CLC_CNT_FRM_BYTE |
VXGE_HAL_TIM_WRKLD_CLC_WRKLD_EVAL_DIV(0x15) |
VXGE_HAL_TIM_WRKLD_CLC_CNT_RX_TX(3);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tim_wrkld_clc);
if (vpath->vp_config->ring.enable == VXGE_HAL_RING_ENABLE) {
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
VXGE_HAL_TIM_RING_ASSN_INT_NUM(vpath->rx_intr_num),
&vpath->vp_reg->tim_ring_assn);
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->tim_pci_cfg);
val64 |= VXGE_HAL_TIM_PCI_CFG_ADD_PAD;
if (vpath->vp_config->no_snoop !=
VXGE_HAL_VPATH_NO_SNOOP_USE_FLASH_DEFAULT) {
if (vpath->vp_config->no_snoop)
val64 |= VXGE_HAL_TIM_PCI_CFG_NO_SNOOP;
else
val64 &= ~VXGE_HAL_TIM_PCI_CFG_NO_SNOOP;
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tim_pci_cfg);
if (vpath->vp_config->fifo.enable == VXGE_HAL_FIFO_ENABLE) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->tim_cfg1_int_num[VXGE_HAL_VPATH_INTR_TX]);
if (vpath->vp_config->tti.btimer_val !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_BTIMER_VAL) {
val64 &=
~VXGE_HAL_TIM_CFG1_INT_NUM_BTIMER_VAL(0x3ffffff);
val64 |= VXGE_HAL_TIM_CFG1_INT_NUM_BTIMER_VAL(
vpath->vp_config->tti.btimer_val);
}
val64 &= ~VXGE_HAL_TIM_CFG1_INT_NUM_BITMP_EN;
if (vpath->vp_config->tti.txfrm_cnt_en !=
VXGE_HAL_TXFRM_CNT_EN_USE_FLASH_DEFAULT) {
if (vpath->vp_config->tti.txfrm_cnt_en)
val64 |=
VXGE_HAL_TIM_CFG1_INT_NUM_TXFRM_CNT_EN;
else
val64 &=
~VXGE_HAL_TIM_CFG1_INT_NUM_TXFRM_CNT_EN;
}
if (vpath->vp_config->tti.txd_cnt_en !=
VXGE_HAL_TXD_CNT_EN_USE_FLASH_DEFAULT) {
if (vpath->vp_config->tti.txd_cnt_en)
val64 |= VXGE_HAL_TIM_CFG1_INT_NUM_TXD_CNT_EN;
else
val64 &= ~VXGE_HAL_TIM_CFG1_INT_NUM_TXD_CNT_EN;
}
if (vpath->vp_config->tti.timer_ac_en !=
VXGE_HAL_TIM_TIMER_AC_USE_FLASH_DEFAULT) {
if (vpath->vp_config->tti.timer_ac_en)
val64 |= VXGE_HAL_TIM_CFG1_INT_NUM_TIMER_AC;
else
val64 &= ~VXGE_HAL_TIM_CFG1_INT_NUM_TIMER_AC;
}
if (vpath->vp_config->tti.timer_ci_en !=
VXGE_HAL_TIM_TIMER_CI_USE_FLASH_DEFAULT) {
if (vpath->vp_config->tti.timer_ci_en)
val64 |= VXGE_HAL_TIM_CFG1_INT_NUM_TIMER_CI;
else
val64 &= ~VXGE_HAL_TIM_CFG1_INT_NUM_TIMER_CI;
}
if (vpath->vp_config->tti.urange_a !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_URANGE_A) {
val64 &= ~VXGE_HAL_TIM_CFG1_INT_NUM_URNG_A(0x3f);
val64 |= VXGE_HAL_TIM_CFG1_INT_NUM_URNG_A(
vpath->vp_config->tti.urange_a);
}
if (vpath->vp_config->tti.urange_b !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_URANGE_B) {
val64 &= ~VXGE_HAL_TIM_CFG1_INT_NUM_URNG_B(0x3f);
val64 |= VXGE_HAL_TIM_CFG1_INT_NUM_URNG_B(
vpath->vp_config->tti.urange_b);
}
if (vpath->vp_config->tti.urange_c !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_URANGE_C) {
val64 &= ~VXGE_HAL_TIM_CFG1_INT_NUM_URNG_C(0x3f);
val64 |= VXGE_HAL_TIM_CFG1_INT_NUM_URNG_C(
vpath->vp_config->tti.urange_c);
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tim_cfg1_int_num[VXGE_HAL_VPATH_INTR_TX]);
vpath->tim_tti_cfg1_saved = val64;
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->tim_cfg2_int_num[VXGE_HAL_VPATH_INTR_TX]);
if (vpath->vp_config->tti.uec_a !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_UEC_A) {
val64 &= ~VXGE_HAL_TIM_CFG2_INT_NUM_UEC_A(0xffff);
val64 |= VXGE_HAL_TIM_CFG2_INT_NUM_UEC_A(
vpath->vp_config->tti.uec_a);
}
if (vpath->vp_config->tti.uec_b !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_UEC_B) {
val64 &= ~VXGE_HAL_TIM_CFG2_INT_NUM_UEC_B(0xffff);
val64 |= VXGE_HAL_TIM_CFG2_INT_NUM_UEC_B(
vpath->vp_config->tti.uec_b);
}
if (vpath->vp_config->tti.uec_c !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_UEC_C) {
val64 &= ~VXGE_HAL_TIM_CFG2_INT_NUM_UEC_C(0xffff);
val64 |= VXGE_HAL_TIM_CFG2_INT_NUM_UEC_C(
vpath->vp_config->tti.uec_c);
}
if (vpath->vp_config->tti.uec_d !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_UEC_D) {
val64 &= ~VXGE_HAL_TIM_CFG2_INT_NUM_UEC_D(0xffff);
val64 |= VXGE_HAL_TIM_CFG2_INT_NUM_UEC_D(
vpath->vp_config->tti.uec_d);
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tim_cfg2_int_num[VXGE_HAL_VPATH_INTR_TX]);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->tim_cfg3_int_num[VXGE_HAL_VPATH_INTR_TX]);
if (vpath->vp_config->tti.timer_ri_en !=
VXGE_HAL_TIM_TIMER_RI_USE_FLASH_DEFAULT) {
if (vpath->vp_config->tti.timer_ri_en)
val64 |= VXGE_HAL_TIM_CFG3_INT_NUM_TIMER_RI;
else
val64 &= ~VXGE_HAL_TIM_CFG3_INT_NUM_TIMER_RI;
}
if (vpath->vp_config->tti.rtimer_event_sf !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_RTIMER_EVENT_SF) {
val64 &=
~VXGE_HAL_TIM_CFG3_INT_NUM_RTIMER_EVENT_SF(0xf);
val64 |= VXGE_HAL_TIM_CFG3_INT_NUM_RTIMER_EVENT_SF(
vpath->vp_config->tti.rtimer_event_sf);
}
if (vpath->vp_config->tti.rtimer_val !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_RTIMER_VAL) {
val64 &= ~VXGE_HAL_TIM_CFG3_INT_NUM_RTIMER_VAL(
0x3ffffff);
val64 |= VXGE_HAL_TIM_CFG3_INT_NUM_RTIMER_VAL(
vpath->vp_config->tti.rtimer_val);
}
if (vpath->vp_config->tti.util_sel !=
VXGE_HAL_TIM_UTIL_SEL_USE_FLASH_DEFAULT) {
val64 &= ~VXGE_HAL_TIM_CFG3_INT_NUM_UTIL_SEL(0x3f);
val64 |= VXGE_HAL_TIM_CFG3_INT_NUM_UTIL_SEL(
vpath->vp_config->tti.util_sel);
}
if (vpath->vp_config->tti.ltimer_val !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_LTIMER_VAL) {
val64 &=
~VXGE_HAL_TIM_CFG3_INT_NUM_LTIMER_VAL(0x3ffffff);
val64 |= VXGE_HAL_TIM_CFG3_INT_NUM_LTIMER_VAL(
vpath->vp_config->tti.ltimer_val);
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tim_cfg3_int_num[VXGE_HAL_VPATH_INTR_TX]);
vpath->tim_tti_cfg3_saved = val64;
}
if (vpath->vp_config->ring.enable == VXGE_HAL_RING_ENABLE) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->tim_cfg1_int_num[VXGE_HAL_VPATH_INTR_RX]);
if (vpath->vp_config->rti.btimer_val !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_BTIMER_VAL) {
val64 &=
~VXGE_HAL_TIM_CFG1_INT_NUM_BTIMER_VAL(0x3ffffff);
val64 |= VXGE_HAL_TIM_CFG1_INT_NUM_BTIMER_VAL(
vpath->vp_config->rti.btimer_val);
}
val64 &= ~VXGE_HAL_TIM_CFG1_INT_NUM_BITMP_EN;
if (vpath->vp_config->rti.txfrm_cnt_en !=
VXGE_HAL_TXFRM_CNT_EN_USE_FLASH_DEFAULT) {
if (vpath->vp_config->rti.txfrm_cnt_en)
val64 |=
VXGE_HAL_TIM_CFG1_INT_NUM_TXFRM_CNT_EN;
else
val64 &=
~VXGE_HAL_TIM_CFG1_INT_NUM_TXFRM_CNT_EN;
}
if (vpath->vp_config->rti.txd_cnt_en !=
VXGE_HAL_TXD_CNT_EN_USE_FLASH_DEFAULT) {
if (vpath->vp_config->rti.txd_cnt_en)
val64 |= VXGE_HAL_TIM_CFG1_INT_NUM_TXD_CNT_EN;
else
val64 &= ~VXGE_HAL_TIM_CFG1_INT_NUM_TXD_CNT_EN;
}
if (vpath->vp_config->rti.timer_ac_en !=
VXGE_HAL_TIM_TIMER_AC_USE_FLASH_DEFAULT) {
if (vpath->vp_config->rti.timer_ac_en)
val64 |= VXGE_HAL_TIM_CFG1_INT_NUM_TIMER_AC;
else
val64 &= ~VXGE_HAL_TIM_CFG1_INT_NUM_TIMER_AC;
}
if (vpath->vp_config->rti.timer_ci_en !=
VXGE_HAL_TIM_TIMER_CI_USE_FLASH_DEFAULT) {
if (vpath->vp_config->rti.timer_ci_en)
val64 |= VXGE_HAL_TIM_CFG1_INT_NUM_TIMER_CI;
else
val64 &= ~VXGE_HAL_TIM_CFG1_INT_NUM_TIMER_CI;
}
if (vpath->vp_config->rti.urange_a !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_URANGE_A) {
val64 &= ~VXGE_HAL_TIM_CFG1_INT_NUM_URNG_A(0x3f);
val64 |= VXGE_HAL_TIM_CFG1_INT_NUM_URNG_A(
vpath->vp_config->rti.urange_a);
}
if (vpath->vp_config->rti.urange_b !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_URANGE_B) {
val64 &= ~VXGE_HAL_TIM_CFG1_INT_NUM_URNG_B(0x3f);
val64 |= VXGE_HAL_TIM_CFG1_INT_NUM_URNG_B(
vpath->vp_config->rti.urange_b);
}
if (vpath->vp_config->rti.urange_c !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_URANGE_C) {
val64 &= ~VXGE_HAL_TIM_CFG1_INT_NUM_URNG_C(0x3f);
val64 |= VXGE_HAL_TIM_CFG1_INT_NUM_URNG_C(
vpath->vp_config->rti.urange_c);
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tim_cfg1_int_num[VXGE_HAL_VPATH_INTR_RX]);
vpath->tim_rti_cfg1_saved = val64;
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->tim_cfg2_int_num[VXGE_HAL_VPATH_INTR_RX]);
if (vpath->vp_config->rti.uec_a !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_UEC_A) {
val64 &= ~VXGE_HAL_TIM_CFG2_INT_NUM_UEC_A(0xffff);
val64 |= VXGE_HAL_TIM_CFG2_INT_NUM_UEC_A(
vpath->vp_config->rti.uec_a);
}
if (vpath->vp_config->rti.uec_b !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_UEC_B) {
val64 &= ~VXGE_HAL_TIM_CFG2_INT_NUM_UEC_B(0xffff);
val64 |= VXGE_HAL_TIM_CFG2_INT_NUM_UEC_B(
vpath->vp_config->rti.uec_b);
}
if (vpath->vp_config->rti.uec_c !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_UEC_C) {
val64 &= ~VXGE_HAL_TIM_CFG2_INT_NUM_UEC_C(0xffff);
val64 |= VXGE_HAL_TIM_CFG2_INT_NUM_UEC_C(
vpath->vp_config->rti.uec_c);
}
if (vpath->vp_config->rti.uec_d !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_UEC_D) {
val64 &= ~VXGE_HAL_TIM_CFG2_INT_NUM_UEC_D(0xffff);
val64 |= VXGE_HAL_TIM_CFG2_INT_NUM_UEC_D(
vpath->vp_config->rti.uec_d);
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tim_cfg2_int_num[VXGE_HAL_VPATH_INTR_RX]);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->tim_cfg3_int_num[VXGE_HAL_VPATH_INTR_RX]);
if (vpath->vp_config->rti.timer_ri_en !=
VXGE_HAL_TIM_TIMER_RI_USE_FLASH_DEFAULT) {
if (vpath->vp_config->rti.timer_ri_en)
val64 |= VXGE_HAL_TIM_CFG3_INT_NUM_TIMER_RI;
else
val64 &= ~VXGE_HAL_TIM_CFG3_INT_NUM_TIMER_RI;
}
if (vpath->vp_config->rti.rtimer_event_sf !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_RTIMER_EVENT_SF) {
val64 &=
~VXGE_HAL_TIM_CFG3_INT_NUM_RTIMER_EVENT_SF(0xf);
val64 |= VXGE_HAL_TIM_CFG3_INT_NUM_RTIMER_EVENT_SF(
vpath->vp_config->rti.rtimer_event_sf);
}
if (vpath->vp_config->rti.rtimer_val !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_RTIMER_VAL) {
val64 &=
~VXGE_HAL_TIM_CFG3_INT_NUM_RTIMER_VAL(0x3ffffff);
val64 |= VXGE_HAL_TIM_CFG3_INT_NUM_RTIMER_VAL(
vpath->vp_config->rti.rtimer_val);
}
if (vpath->vp_config->rti.util_sel !=
VXGE_HAL_TIM_UTIL_SEL_USE_FLASH_DEFAULT) {
val64 &= ~VXGE_HAL_TIM_CFG3_INT_NUM_UTIL_SEL(0x3f);
val64 |= VXGE_HAL_TIM_CFG3_INT_NUM_UTIL_SEL(
vpath->vp_config->rti.util_sel);
}
if (vpath->vp_config->rti.ltimer_val !=
VXGE_HAL_USE_FLASH_DEFAULT_TIM_LTIMER_VAL) {
val64 &=
~VXGE_HAL_TIM_CFG3_INT_NUM_LTIMER_VAL(0x3ffffff);
val64 |= VXGE_HAL_TIM_CFG3_INT_NUM_LTIMER_VAL(
vpath->vp_config->rti.ltimer_val);
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tim_cfg3_int_num[VXGE_HAL_VPATH_INTR_RX]);
vpath->tim_rti_cfg3_saved = val64;
}
val64 = 0;
if (hldev->header.config.intr_mode ==
VXGE_HAL_INTR_MODE_EMULATED_INTA) {
val64 |= VXGE_HAL_TIM_CFG1_INT_NUM_BTIMER_VAL(1) |
VXGE_HAL_TIM_CFG1_INT_NUM_TIMER_CI;
}
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tim_cfg1_int_num[VXGE_HAL_VPATH_INTR_EINTA]);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
(u64) 0,
&vpath->vp_reg->tim_cfg2_int_num[VXGE_HAL_VPATH_INTR_EINTA]);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
(u64) 0,
&vpath->vp_reg->tim_cfg3_int_num[VXGE_HAL_VPATH_INTR_EINTA]);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
(u64) 0,
&vpath->vp_reg->tim_cfg1_int_num[VXGE_HAL_VPATH_INTR_BMAP]);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
(u64) 0,
&vpath->vp_reg->tim_cfg2_int_num[VXGE_HAL_VPATH_INTR_BMAP]);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
(u64) 0,
&vpath->vp_reg->tim_cfg3_int_num[VXGE_HAL_VPATH_INTR_BMAP]);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_is_rxdmem_leak - Check for the rxd memory leak.
* @vpath_handle: Virtual Path handle.
*
* The function checks for the rxd memory leak.
*
*/
u32
vxge_hal_vpath_is_rxdmem_leak(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
u32 new_qw_count, rxd_spat, bRet = 0;
__hal_device_t *hldev;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vp != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vp->vpath->vp_config->ring.enable == VXGE_HAL_RING_DISABLE) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, bRet);
return (bRet);
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vp->vpath->vp_reg->prc_rxd_doorbell);
new_qw_count = (u32) VXGE_HAL_PRC_RXD_DOORBELL_GET_NEW_QW_CNT(val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vp->vpath->vp_reg->prc_cfg6);
rxd_spat = (u32) VXGE_HAL_PRC_CFG6_GET_RXD_SPAT(val64);
bRet = (new_qw_count > (rxd_spat * 3 / 2));
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, bRet);
return (bRet);
}
/*
* vxge_hal_vpath_mtu_check - check MTU value for ranges
* @vpath_handle: Virtal path handle
* @new_mtu: new MTU value to check
*
* Will do sanity check for new MTU value.
*
* Returns: VXGE_HAL_OK - success.
* VXGE_HAL_ERR_INVALID_MTU_SIZE - MTU is invalid.
*
* See also: vxge_hal_vpath_mtu_set()
*/
vxge_hal_status_e
vxge_hal_device_mtu_check(vxge_hal_vpath_h vpath_handle,
unsigned long new_mtu)
{
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_device_t *hldev;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vp == NULL) {
vxge_hal_trace_log_vpath(
"<== %s:%s:%d Result: %d", __FILE__, __func__,
__LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return (VXGE_HAL_ERR_INVALID_HANDLE);
}
new_mtu += VXGE_HAL_MAC_HEADER_MAX_SIZE;
if ((new_mtu < VXGE_HAL_MIN_MTU) || (new_mtu > vp->vpath->max_mtu)) {
status = VXGE_HAL_ERR_INVALID_MTU_SIZE;
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_mtu_set - Set MTU.
* @vpath_handle: Virtal path handle
* @new_mtu: New MTU size to configure.
*
* Set new MTU value. Example, to use jumbo frames:
* vxge_hal_vpath_mtu_set(my_device, 9600);
*
*/
vxge_hal_status_e
vxge_hal_vpath_mtu_set(vxge_hal_vpath_h vpath_handle,
unsigned long new_mtu)
{
u64 val64;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vp == NULL) {
vxge_hal_trace_log_vpath(
"<== %s:%s:%d Result: %d", __FILE__, __func__,
__LINE__, VXGE_HAL_ERR_INVALID_HANDLE);
return (VXGE_HAL_ERR_INVALID_HANDLE);
}
new_mtu += VXGE_HAL_MAC_HEADER_MAX_SIZE;
if ((new_mtu < VXGE_HAL_MIN_MTU) || (new_mtu > vp->vpath->max_mtu)) {
status = VXGE_HAL_ERR_INVALID_MTU_SIZE;
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vp->vpath->vp_reg->rxmac_vcfg0);
val64 &= ~VXGE_HAL_RXMAC_VCFG0_RTS_MAX_FRM_LEN(0x3fff);
val64 |= VXGE_HAL_RXMAC_VCFG0_RTS_MAX_FRM_LEN(new_mtu);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vp->vpath->vp_reg->rxmac_vcfg0);
vp->vpath->vp_config->mtu = new_mtu - VXGE_HAL_MAC_HEADER_MAX_SIZE;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vpath_size_quantum_set
* @hldev: Handle to the device object
* @vp_id: Virtual Path Id
*
* This routine configures the size quantum of virtual path
* using the config passed
*/
vxge_hal_status_e
__hal_vpath_size_quantum_set(
vxge_hal_device_h devh,
u32 vp_id)
{
u64 val64;
__hal_device_t *hldev = (__hal_device_t *) devh;
__hal_virtualpath_t *vpath;
vxge_assert(devh != NULL);
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("devh = 0x"VXGE_OS_STXFMT", vp_id = %d",
(ptr_t) devh, vp_id);
vpath = (__hal_virtualpath_t *) &hldev->virtual_paths[vp_id];
switch (__vxge_os_cacheline_size) {
case 8:
val64 = 0;
break;
case 16:
val64 = 1;
break;
case 32:
val64 = 2;
break;
case 64:
val64 = 3;
break;
default:
case 128:
val64 = 4;
break;
case 256:
val64 = 5;
break;
case 512:
val64 = 6;
break;
}
vxge_os_pio_mem_write64(hldev->header.pdev, hldev->header.regh0,
val64,
&vpath->vp_reg->vpath_general_cfg2);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* __hal_vpath_hw_initialize
* @hldev: Handle to the device object
* @vp_id: Virtual Path Id
*
* This routine initializes the registers of virtual path
* using the config passed
*/
vxge_hal_status_e
__hal_vpath_hw_initialize(
vxge_hal_device_h devh,
u32 vp_id)
{
u64 val64;
u32 mrrs;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_virtualpath_t *vpath;
__hal_device_t *hldev = (__hal_device_t *) devh;
vxge_hal_pci_e_capability_t *pci_e_cap;
vxge_assert(devh != NULL);
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("devh = 0x"VXGE_OS_STXFMT", vp_id = %d",
(ptr_t) devh, vp_id);
vpath = (__hal_virtualpath_t *) &hldev->virtual_paths[vp_id];
if (!(hldev->vpath_assignments & mBIT(vp_id))) {
vxge_hal_trace_log_vpath(
"<== %s:%s:%d Result: %d", __FILE__, __func__,
__LINE__, VXGE_HAL_ERR_VPATH_NOT_AVAILABLE);
return (VXGE_HAL_ERR_VPATH_NOT_AVAILABLE);
}
status = __hal_vpath_swapper_set((vxge_hal_device_t *) hldev, vp_id);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
status = __hal_vpath_size_quantum_set(hldev, vp_id);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
status = __hal_vpath_mac_configure(hldev, vp_id);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
status = __hal_vpath_kdfc_configure(hldev, vp_id);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
status = __hal_vpath_tim_configure(hldev, vp_id);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
vxge_os_pio_mem_write64(hldev->header.pdev, hldev->header.regh0,
VXGE_HAL_USDC_VPATH_SGRP_ASSIGN(
vpath->sess_grps_available),
&vpath->vp_reg->usdc_vpath);
vxge_os_wmb();
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->qcc_pci_cfg);
val64 |= VXGE_HAL_QCC_PCI_CFG_ADD_PAD_CQE_SPACE |
VXGE_HAL_QCC_PCI_CFG_ADD_PAD_WQE |
VXGE_HAL_QCC_PCI_CFG_ADD_PAD_SRQIR |
VXGE_HAL_QCC_PCI_CFG_CTL_STR_CQE_SPACE |
VXGE_HAL_QCC_PCI_CFG_CTL_STR_WQE |
VXGE_HAL_QCC_PCI_CFG_CTL_STR_SRQIR;
if (vpath->vp_config->no_snoop !=
VXGE_HAL_VPATH_NO_SNOOP_USE_FLASH_DEFAULT) {
if (vpath->vp_config->no_snoop) {
val64 |= VXGE_HAL_QCC_PCI_CFG_NO_SNOOP_CQE_SPACE |
VXGE_HAL_QCC_PCI_CFG_NO_SNOOP_WQE |
VXGE_HAL_QCC_PCI_CFG_NO_SNOOP_SRQIR;
} else {
val64 &= ~(VXGE_HAL_QCC_PCI_CFG_NO_SNOOP_CQE_SPACE |
VXGE_HAL_QCC_PCI_CFG_NO_SNOOP_WQE |
VXGE_HAL_QCC_PCI_CFG_NO_SNOOP_SRQIR);
}
}
vxge_os_pio_mem_write64(hldev->header.pdev, hldev->header.regh0,
val64,
&vpath->vp_reg->qcc_pci_cfg);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->h2l_vpath_config);
if (vpath->vp_config->no_snoop !=
VXGE_HAL_VPATH_NO_SNOOP_USE_FLASH_DEFAULT) {
if (vpath->vp_config->no_snoop) {
val64 |= VXGE_HAL_H2L_VPATH_CONFIG_OD_NO_SNOOP;
} else {
val64 &= ~VXGE_HAL_H2L_VPATH_CONFIG_OD_NO_SNOOP;
}
}
vxge_os_pio_mem_write64(hldev->header.pdev, hldev->header.regh0,
val64,
&vpath->vp_reg->h2l_vpath_config);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->ph2l_vp_cfg0);
if (vpath->vp_config->no_snoop !=
VXGE_HAL_VPATH_NO_SNOOP_USE_FLASH_DEFAULT) {
if (vpath->vp_config->no_snoop) {
val64 |= VXGE_HAL_PH2L_VP_CFG0_NOSNOOP_DATA;
} else {
val64 &= ~VXGE_HAL_PH2L_VP_CFG0_NOSNOOP_DATA;
}
}
vxge_os_pio_mem_write64(hldev->header.pdev, hldev->header.regh0,
val64,
&vpath->vp_reg->ph2l_vp_cfg0);
vxge_os_pio_mem_write64(hldev->header.pdev, hldev->header.regh0,
0,
&vpath->vp_reg->gendma_int);
pci_e_cap = (vxge_hal_pci_e_capability_t *)
(((char *)&hldev->pci_config_space_bios) + hldev->pci_e_caps);
mrrs = pci_e_cap->pci_e_devctl >> 12;
val64 = VXGE_HAL_RTDMA_RD_OPTIMIZATION_CTRL_GEN_INT_AFTER_ABORT |
VXGE_HAL_RTDMA_RD_OPTIMIZATION_CTRL_FB_FILL_THRESH(mrrs) |
VXGE_HAL_RTDMA_RD_OPTIMIZATION_CTRL_FB_ADDR_BDRY_EN |
VXGE_HAL_RTDMA_RD_OPTIMIZATION_CTRL_TXD_FILL_THRESH(1);
vxge_os_pio_mem_write64(hldev->header.pdev, hldev->header.regh0,
val64,
&vpath->vp_reg->rtdma_rd_optimization_ctrl);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vp_initialize - Initialize Virtual Path structure
* @hldev: Handle to the device object
* @vp_id: Virtual Path Id
* @config: Configuration for the virtual path
*
* This routine initializes virtual path using the config passed
*/
vxge_hal_status_e
__hal_vp_initialize(vxge_hal_device_h devh,
u32 vp_id,
vxge_hal_vp_config_t *config)
{
__hal_device_t *hldev = (__hal_device_t *) devh;
__hal_virtualpath_t *vpath;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert((hldev != NULL) && (config != NULL));
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"devh = 0x"VXGE_OS_STXFMT", vp_id = %d, config = 0x"VXGE_OS_STXFMT,
(ptr_t) devh, vp_id, (ptr_t) config);
if (!(hldev->vpath_assignments & mBIT(vp_id))) {
vxge_hal_trace_log_vpath(
"<== %s:%s:%d Result: %d", __FILE__, __func__,
__LINE__, VXGE_HAL_ERR_VPATH_NOT_AVAILABLE);
return (VXGE_HAL_ERR_VPATH_NOT_AVAILABLE);
}
vpath = (__hal_virtualpath_t *) &hldev->virtual_paths[vp_id];
vpath->vp_id = vp_id;
vpath->vp_open = VXGE_HAL_VP_OPEN;
vpath->hldev = (__hal_device_t *) devh;
vpath->vp_config = config;
vpath->vp_reg = hldev->vpath_reg[vp_id];
vpath->vpmgmt_reg = hldev->vpmgmt_reg[vp_id];
status = __hal_vpath_hw_reset(devh, vp_id);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath(
"vpath is already in reset %s:%s:%d",
__FILE__, __func__, __LINE__);
}
status = __hal_vpath_reset_check(vpath);
if (status != VXGE_HAL_OK) {
vxge_os_memzero(vpath, sizeof(__hal_virtualpath_t));
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
status = __hal_vpath_mgmt_read(hldev, vpath);
if (status != VXGE_HAL_OK) {
vxge_os_memzero(vpath, sizeof(__hal_virtualpath_t));
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
vpath->tx_intr_num =
(vp_id * VXGE_HAL_MAX_INTR_PER_VP) + VXGE_HAL_VPATH_INTR_TX;
vpath->rx_intr_num =
(vp_id * VXGE_HAL_MAX_INTR_PER_VP) + VXGE_HAL_VPATH_INTR_RX;
vpath->einta_intr_num =
(vp_id * VXGE_HAL_MAX_INTR_PER_VP) + VXGE_HAL_VPATH_INTR_EINTA;
vpath->bmap_intr_num =
(vp_id * VXGE_HAL_MAX_INTR_PER_VP) + VXGE_HAL_VPATH_INTR_BMAP;
#if defined(VXGE_HAL_VP_CBS)
vxge_os_spin_lock_init(&vpath->vpath_handles_lock, hldev->pdev);
#elif defined(VXGE_HAL_VP_CBS_IRQ)
vxge_os_spin_lock_init_irq(&vpath->vpath_handles_lock, hldev->irqh);
#endif
vxge_list_init(&vpath->vpath_handles);
vpath->sw_stats = &hldev->stats.sw_dev_info_stats.vpath_info[vp_id];
vxge_os_memzero(&vpath->sw_stats->obj_counts,
sizeof(vxge_hal_vpath_sw_obj_count_t));
VXGE_HAL_DEVICE_TIM_INT_MASK_SET(vpath->hldev, vpath->vp_id);
status = __hal_vpath_hw_initialize(vpath->hldev, vpath->vp_id);
if (status != VXGE_HAL_OK) {
__hal_vp_terminate(devh, vp_id);
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vp_terminate - Terminate Virtual Path structure
* @hldev: Handle to the device object
* @vp_id: Virtual Path Id
*
* This routine closes all channels it opened and freeup memory
*/
void
__hal_vp_terminate(vxge_hal_device_h devh, u32 vp_id)
{
__hal_virtualpath_t *vpath;
__hal_device_t *hldev = (__hal_device_t *) devh;
vxge_assert(devh != NULL);
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"devh = 0x"VXGE_OS_STXFMT", vp_id = %d", (ptr_t) devh, vp_id);
vpath = (__hal_virtualpath_t *) &hldev->virtual_paths[vp_id];
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_vpath(
"<== %s:%s:%d Result: %d", __FILE__, __func__,
__LINE__, VXGE_HAL_ERR_VPATH_NOT_OPEN);
return;
}
VXGE_HAL_DEVICE_TIM_INT_MASK_RESET(vpath->hldev, vpath->vp_id);
#if defined(VXGE_HAL_VP_CBS)
vxge_os_spin_lock_destroy(
&vpath->vpath_handles_lock, hldev->header.pdev);
#elif defined(VXGE_HAL_VP_CBS_IRQ)
vxge_os_spin_lock_destroy_irq(
&vpath->vpath_handles_lock, hldev->header.pdev);
#endif
vxge_os_memzero(vpath, sizeof(__hal_virtualpath_t));
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: 0",
__FILE__, __func__, __LINE__);
}
/*
* vxge_hal_vpath_obj_count_get - Get the Object usage count for a given
* virtual path
* @vpath_handle: Virtal path handle
* @obj_counts: Buffer to return object counts
*
* This function returns the object counts for virtual path.
*/
vxge_hal_status_e
vxge_hal_vpath_obj_count_get(
vxge_hal_vpath_h vpath_handle,
vxge_hal_vpath_sw_obj_count_t *obj_count)
{
__hal_device_t *hldev;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
if ((vpath_handle == NULL) || (obj_count == NULL))
return (VXGE_HAL_FAIL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT", "
"obj_count = 0x"VXGE_OS_STXFMT, (ptr_t) vpath_handle,
(ptr_t) obj_count);
vxge_os_memcpy(obj_count, &vp->vpath->sw_stats->obj_counts,
sizeof(vxge_hal_vpath_sw_obj_count_t));
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_open - Open a virtual path on a given adapter
* @devh: handle to device object
* @attr: Virtual path attributes
* @cb_fn: Call back to be called to complete an asynchronous function call
* @client_handle: handle to be returned in the callback
* @vpath_handle: Buffer to return a handle to the vpath
*
* This function is used to open access to virtual path of an
* adapter for offload, LRO and SPDM operations. This function returns
* synchronously.
*/
vxge_hal_status_e
vxge_hal_vpath_open(vxge_hal_device_h devh,
vxge_hal_vpath_attr_t *attr,
vxge_hal_vpath_callback_f cb_fn,
vxge_hal_client_h client_handle,
vxge_hal_vpath_h *vpath_handle)
{
__hal_device_t *hldev = (__hal_device_t *) devh;
__hal_virtualpath_t *vpath;
__hal_vpath_handle_t *vp;
vxge_hal_status_e status;
vxge_assert((devh != NULL) && (attr != NULL) && (cb_fn != NULL) &&
(vpath_handle != NULL));
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("devh = 0x"VXGE_OS_STXFMT", "
"attr = 0x"VXGE_OS_STXFMT", cb_fn = 0x"VXGE_OS_STXFMT", "
"client_handle = 0x"VXGE_OS_STXFMT", "
"vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) devh, (ptr_t) attr, (ptr_t) cb_fn,
(ptr_t) client_handle, (ptr_t) vpath_handle);
vpath = (__hal_virtualpath_t *) &hldev->virtual_paths[attr->vp_id];
if (vpath->vp_open == VXGE_HAL_VP_OPEN) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_STATE);
return (VXGE_HAL_ERR_INVALID_STATE);
}
status = __hal_vp_initialize(hldev, attr->vp_id,
&hldev->header.config.vp_config[attr->vp_id]);
if (status != VXGE_HAL_OK) {
vxge_hal_err_log_vpath(
"virtual Paths: __hal_vp_initialize failed == > %s : %d",
__func__, __LINE__);
goto vpath_open_exit1;
}
vp = (__hal_vpath_handle_t *) vxge_os_malloc(hldev->header.pdev,
sizeof(__hal_vpath_handle_t));
if (vp == NULL) {
status = VXGE_HAL_ERR_OUT_OF_MEMORY;
goto vpath_open_exit2;
}
vxge_os_memzero(vp, sizeof(__hal_vpath_handle_t));
vp->vpath = vpath;
vp->cb_fn = cb_fn;
vp->client_handle = client_handle;
if (vp->vpath->vp_config->fifo.enable == VXGE_HAL_FIFO_ENABLE) {
status = __hal_fifo_create(vp, &attr->fifo_attr);
if (status != VXGE_HAL_OK) {
goto vpath_open_exit6;
}
}
if (vp->vpath->vp_config->ring.enable == VXGE_HAL_RING_ENABLE) {
status = __hal_ring_create(vp, &attr->ring_attr);
if (status != VXGE_HAL_OK) {
goto vpath_open_exit7;
}
status = __hal_vpath_prc_configure(devh, attr->vp_id);
if (status != VXGE_HAL_OK) {
goto vpath_open_exit8;
}
}
vp->vpath->stats_block = __hal_blockpool_block_allocate(devh,
VXGE_OS_HOST_PAGE_SIZE);
if (vp->vpath->stats_block == NULL) {
status = VXGE_HAL_ERR_OUT_OF_MEMORY;
goto vpath_open_exit8;
}
vp->vpath->hw_stats =
(vxge_hal_vpath_stats_hw_info_t *) vp->vpath->stats_block->memblock;
vxge_os_memzero(vp->vpath->hw_stats,
sizeof(vxge_hal_vpath_stats_hw_info_t));
hldev->stats.hw_dev_info_stats.vpath_info[attr->vp_id] =
vp->vpath->hw_stats;
vp->vpath->hw_stats_sav =
&hldev->stats.hw_dev_info_stats.vpath_info_sav[attr->vp_id];
vxge_os_memzero(vp->vpath->hw_stats_sav,
sizeof(vxge_hal_vpath_stats_hw_info_t));
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
vp->vpath->stats_block->dma_addr,
&vpath->vp_reg->stats_cfg);
status = vxge_hal_vpath_hw_stats_enable(vp);
if (status != VXGE_HAL_OK) {
goto vpath_open_exit8;
}
vxge_list_insert(&vp->item, &vpath->vpath_handles);
hldev->vpaths_deployed |= mBIT(vpath->vp_id);
*vpath_handle = vp;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
vpath_open_exit8:
if (vpath->ringh != NULL)
__hal_ring_delete(vp);
vpath_open_exit7:
if (vpath->fifoh != NULL)
__hal_fifo_delete(vp);
vpath_open_exit6:
vxge_os_free(hldev->header.pdev, vp,
sizeof(__hal_vpath_handle_t));
vpath_open_exit2:
__hal_vp_terminate(devh, attr->vp_id);
vpath_open_exit1:
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_id - Get virtual path ID
* @vpath_handle: Handle got from previous vpath open
*
* This function returns virtual path id
*/
u32
vxge_hal_vpath_id(
vxge_hal_vpath_h vpath_handle)
{
u32 id;
__hal_device_t *hldev;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
id = ((__hal_vpath_handle_t *) vpath_handle)->vpath->vp_id;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: 0",
__FILE__, __func__, __LINE__);
return (id);
}
/*
* vxge_hal_vpath_close - Close the handle got from previous vpath (vpath) open
* @vpath_handle: Handle got from previous vpath open
*
* This function is used to close access to virtual path opened
* earlier.
*/
vxge_hal_status_e
vxge_hal_vpath_close(
vxge_hal_vpath_h vpath_handle)
{
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
__hal_virtualpath_t *vpath;
__hal_device_t *hldev;
u32 vp_id;
u32 is_empty = TRUE;
vxge_assert(vpath_handle != NULL);
vpath = (__hal_virtualpath_t *) vp->vpath;
hldev = (__hal_device_t *) vpath->hldev;
vp_id = vpath->vp_id;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath(
"vpath_handle = 0x"VXGE_OS_STXFMT, (ptr_t) vpath_handle);
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_VPATH_NOT_OPEN);
return (VXGE_HAL_ERR_VPATH_NOT_OPEN);
}
#if defined(VXGE_HAL_VP_CBS)
vxge_os_spin_lock(&vpath->vpath_handles_lock);
#elif defined(VXGE_HAL_VP_CBS_IRQ)
vxge_os_spin_lock_irq(&vpath->vpath_handles_lock, flags);
#endif
vxge_list_remove(&vp->item);
if (!vxge_list_is_empty(&vpath->vpath_handles)) {
vxge_list_insert(&vp->item, &vpath->vpath_handles);
is_empty = FALSE;
}
#if defined(VXGE_HAL_VP_CBS)
vxge_os_spin_unlock(&vpath->vpath_handles_lock);
#elif defined(VXGE_HAL_VP_CBS_IRQ)
vxge_os_spin_unlock_irq(&vpath->vpath_handles_lock, flags);
#endif
if (!is_empty) {
vxge_hal_err_log_vpath("clients are still attached == > %s : %d",
__func__, __LINE__);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: 1",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_FAIL);
}
vpath->hldev->vpaths_deployed &= ~mBIT(vp_id);
if (vpath->ringh != NULL)
__hal_ring_delete(vpath_handle);
if (vpath->fifoh != NULL)
__hal_fifo_delete(vpath_handle);
if (vpath->stats_block != NULL) {
__hal_blockpool_block_free(hldev, vpath->stats_block);
}
vxge_os_free(hldev->header.pdev,
vpath_handle, sizeof(__hal_vpath_handle_t));
__hal_vp_terminate(hldev, vp_id);
vpath->vp_open = VXGE_HAL_VP_NOT_OPEN;
(void) __hal_ifmsg_wmsg_post(hldev,
vp_id,
VXGE_HAL_RTS_ACCESS_STEER_MSG_DEST_BROADCAST,
VXGE_HAL_RTS_ACCESS_STEER_DATA0_MSG_TYPE_VPATH_RESET_END,
0);
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_reset - Resets vpath
* @vpath_handle: Handle got from previous vpath open
*
* This function is used to request a reset of vpath
*/
vxge_hal_status_e
vxge_hal_vpath_reset(
vxge_hal_vpath_h vpath_handle)
{
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
__hal_device_t *hldev;
vxge_hal_status_e status;
u32 count = 0, total_count = 0;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vp->vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_VPATH_NOT_OPEN);
return (VXGE_HAL_ERR_VPATH_NOT_OPEN);
}
vxge_hw_vpath_set_zero_rx_frm_len(hldev, vp->vpath->vp_id);
vxge_hw_vpath_wait_receive_idle(hldev, vp->vpath->vp_id,
&count, &total_count);
status = __hal_vpath_hw_reset((vxge_hal_device_h) hldev,
vp->vpath->vp_id);
if (status == VXGE_HAL_OK)
vp->vpath->sw_stats->soft_reset_cnt++;
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_reset_poll - Poll for reset complete
* @vpath_handle: Handle got from previous vpath open
*
* This function is used to poll for the vpath reset completion
*/
vxge_hal_status_e
vxge_hal_vpath_reset_poll(
vxge_hal_vpath_h vpath_handle)
{
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
__hal_device_t *hldev;
vxge_hal_status_e status;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_vpath("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_vpath("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
if (vp->vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_VPATH_NOT_OPEN);
return (VXGE_HAL_ERR_VPATH_NOT_OPEN);
}
status = __hal_vpath_reset_check(vp->vpath);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result = %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
status = __hal_vpath_sw_reset((vxge_hal_device_h) hldev,
vp->vpath->vp_id);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
vxge_os_memzero(vp->vpath->sw_stats,
sizeof(vxge_hal_vpath_stats_sw_info_t));
status = __hal_vpath_hw_initialize((vxge_hal_device_h) hldev,
vp->vpath->vp_id);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
if (vp->vpath->ringh != NULL) {
status = __hal_vpath_prc_configure(
(vxge_hal_device_h) hldev,
vp->vpath->vp_id);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
}
vxge_os_memzero(vp->vpath->hw_stats,
sizeof(vxge_hal_vpath_stats_hw_info_t));
vxge_os_memzero(vp->vpath->hw_stats_sav,
sizeof(vxge_hal_vpath_stats_hw_info_t));
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
vp->vpath->stats_block->dma_addr,
&vp->vpath->vp_reg->stats_cfg);
status = vxge_hal_vpath_hw_stats_enable(vp);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
vxge_hal_trace_log_vpath("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_hw_stats_enable - Enable vpath h/wstatistics.
* @vpath_handle: Virtual Path handle.
*
* Enable the DMA vpath statistics. The function is to be called to re-enable
* the adapter to update stats into the host memory
*
* See also: vxge_hal_vpath_hw_stats_disable(), vxge_hal_vpath_hw_stats_get()
*/
vxge_hal_status_e
vxge_hal_vpath_hw_stats_enable(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_stats("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_stats("vpath = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
vpath = vp->vpath;
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_VPATH_NOT_OPEN);
return (VXGE_HAL_ERR_VPATH_NOT_OPEN);
}
vxge_os_memcpy(vpath->hw_stats_sav,
vpath->hw_stats,
sizeof(vxge_hal_vpath_stats_hw_info_t));
if (hldev->header.config.stats_read_method ==
VXGE_HAL_STATS_READ_METHOD_DMA) {
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->stats_cfg0);
val64 |= VXGE_HAL_STATS_CFG0_STATS_ENABLE(
(1 << (16 - vpath->vp_id)));
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&hldev->common_reg->stats_cfg0);
} else {
status = __hal_vpath_hw_stats_get(
vpath,
vpath->hw_stats);
}
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_hw_stats_disable - Disable vpath h/w statistics.
* @vpath_handle: Virtual Path handle.
*
* Enable the DMA vpath statistics. The function is to be called to disable
* the adapter to update stats into the host memory. This function is not
* needed to be called, normally.
*
* See also: vxge_hal_vpath_hw_stats_enable(), vxge_hal_vpath_hw_stats_get()
*/
vxge_hal_status_e
vxge_hal_vpath_hw_stats_disable(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_stats("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_stats(
"vpath = 0x"VXGE_OS_STXFMT, (ptr_t) vpath_handle);
vpath = (__hal_virtualpath_t *)
((__hal_vpath_handle_t *) vpath_handle)->vpath;
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_VPATH_NOT_OPEN);
return (VXGE_HAL_ERR_VPATH_NOT_OPEN);
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->stats_cfg0);
val64 &= ~VXGE_HAL_STATS_CFG0_STATS_ENABLE((1 << (16 - vpath->vp_id)));
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&hldev->common_reg->stats_cfg0);
vxge_hal_trace_log_stats("<== %s:%s:%d Result: 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_hw_stats_get - Get the vpath hw statistics.
* @vpath_handle: Virtual Path handle.
* @hw_stats: Hardware stats
*
* Returns the vpath h/w stats.
*
* See also: vxge_hal_vpath_hw_stats_enable(),
* vxge_hal_vpath_hw_stats_disable()
*/
vxge_hal_status_e
vxge_hal_vpath_hw_stats_get(vxge_hal_vpath_h vpath_handle,
vxge_hal_vpath_stats_hw_info_t *hw_stats)
{
__hal_virtualpath_t *vpath;
__hal_device_t *hldev;
vxge_hal_status_e status;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert((vpath_handle != NULL) && (hw_stats != NULL));
hldev = vp->vpath->hldev;
vxge_hal_trace_log_stats("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_stats(
"vpath = 0x"VXGE_OS_STXFMT", hw_stats = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle, (ptr_t) hw_stats);
vpath = (__hal_virtualpath_t *)
((__hal_vpath_handle_t *) vpath_handle)->vpath;
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_VPATH_NOT_OPEN);
return (VXGE_HAL_ERR_VPATH_NOT_OPEN);
}
status = vxge_hal_device_register_poll(hldev->header.pdev,
hldev->header.regh0,
&hldev->common_reg->stats_cfg0,
0,
VXGE_HAL_STATS_CFG0_STATS_ENABLE((1 << (16 - vpath->vp_id))),
hldev->header.config.device_poll_millis);
if (status == VXGE_HAL_OK) {
vxge_os_memcpy(hw_stats,
vpath->hw_stats,
sizeof(vxge_hal_vpath_stats_hw_info_t));
}
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_sw_stats_get - Get the vpath sw statistics.
* @vpath_handle: Virtual Path handle.
* @sw_stats: Software stats
*
* Returns the vpath s/w stats.
*
* See also: vxge_hal_vpath_hw_stats_get()
*/
vxge_hal_status_e
vxge_hal_vpath_sw_stats_get(vxge_hal_vpath_h vpath_handle,
vxge_hal_vpath_stats_sw_info_t *sw_stats)
{
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert((vpath_handle != NULL) && (sw_stats != NULL));
hldev = vp->vpath->hldev;
vxge_hal_trace_log_stats("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_stats(
"vpath = 0x"VXGE_OS_STXFMT", sw_stats = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle, (ptr_t) sw_stats);
vpath = (__hal_virtualpath_t *)
((__hal_vpath_handle_t *) vpath_handle)->vpath;
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_VPATH_NOT_OPEN);
return (VXGE_HAL_ERR_VPATH_NOT_OPEN);
}
if (hldev->header.traffic_intr_cnt) {
int intrcnt = hldev->header.traffic_intr_cnt;
if (!intrcnt)
intrcnt = 1;
vpath->sw_stats->fifo_stats.common_stats.avg_compl_per_intr_cnt =
vpath->sw_stats->fifo_stats.common_stats.total_compl_cnt / intrcnt;
if (vpath->sw_stats->fifo_stats.common_stats.avg_compl_per_intr_cnt ==
0) {
/* to not confuse user */
vpath->sw_stats->fifo_stats.common_stats.avg_compl_per_intr_cnt = 1;
}
vpath->sw_stats->ring_stats.common_stats.avg_compl_per_intr_cnt =
vpath->sw_stats->ring_stats.common_stats.total_compl_cnt / intrcnt;
if (vpath->sw_stats->ring_stats.common_stats.avg_compl_per_intr_cnt ==
0) {
/* to not confuse user */
vpath->sw_stats->ring_stats.common_stats.avg_compl_per_intr_cnt = 1;
}
}
if (vpath->sw_stats->fifo_stats.total_posts) {
vpath->sw_stats->fifo_stats.avg_buffers_per_post =
vpath->sw_stats->fifo_stats.total_buffers /
vpath->sw_stats->fifo_stats.total_posts;
vpath->sw_stats->fifo_stats.avg_post_size =
(u32) (vpath->hw_stats->tx_stats.tx_ttl_eth_octets /
vpath->sw_stats->fifo_stats.total_posts);
}
if (vpath->sw_stats->fifo_stats.total_buffers) {
vpath->sw_stats->fifo_stats.avg_buffer_size =
(u32) (vpath->hw_stats->tx_stats.tx_ttl_eth_octets /
vpath->sw_stats->fifo_stats.total_buffers);
}
vxge_os_memcpy(sw_stats,
vpath->sw_stats,
sizeof(vxge_hal_vpath_stats_sw_info_t));
vxge_hal_trace_log_stats("<== %s:%s:%d Result: 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* __hal_vpath_stats_access - Get the statistics from the given location
* and offset and perform an operation
* @vpath: Virtual path.
* @operation: Operation to be performed
* @location: Location (one of vpath id, aggregate or port)
* @offset: Offset with in the location
* @stat: Pointer to a buffer to return the value
*
* Get the statistics from the given location and offset.
*
*/
vxge_hal_status_e
__hal_vpath_stats_access(
__hal_virtualpath_t *vpath,
u32 operation,
u32 offset,
u64 *stat)
{
u64 val64;
__hal_device_t *hldev;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert(vpath != NULL);
hldev = vpath->hldev;
vxge_hal_trace_log_stats("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_stats("vpath = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath);
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_VPATH_NOT_OPEN);
return (VXGE_HAL_ERR_VPATH_NOT_OPEN);
}
val64 = VXGE_HAL_XMAC_STATS_ACCESS_CMD_OP(operation) |
VXGE_HAL_XMAC_STATS_ACCESS_CMD_STROBE |
VXGE_HAL_XMAC_STATS_ACCESS_CMD_OFFSET_SEL(offset);
vxge_hal_pio_mem_write32_lower(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 32),
&vpath->vp_reg->xmac_stats_access_cmd);
vxge_os_wmb();
vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
hldev->header.regh0,
(u32) bVAL32(val64, 0),
&vpath->vp_reg->xmac_stats_access_cmd);
vxge_os_wmb();
status = vxge_hal_device_register_poll(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->xmac_stats_access_cmd,
0,
VXGE_HAL_XMAC_STATS_ACCESS_CMD_STROBE,
hldev->header.config.device_poll_millis);
if ((status == VXGE_HAL_OK) && (operation == VXGE_HAL_STATS_OP_READ)) {
*stat = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->xmac_stats_access_data);
} else {
*stat = 0;
}
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_stats_access
* Get statistics from given location and offset to perform an operation
* @vpath_handle: Virtual path handle.
* @operation: Operation to be performed
* @offset: Offset with in the location
* @stat: Pointer to a buffer to return the value
*
* Get the statistics from the given location and offset.
*
*/
vxge_hal_status_e
vxge_hal_vpath_stats_access(
vxge_hal_vpath_h vpath_handle,
u32 operation,
u32 offset,
u64 *stat)
{
__hal_device_t *hldev;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_hal_status_e status;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_stats("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_stats(
"vpath_handle = 0x"VXGE_OS_STXFMT, (ptr_t) vpath_handle);
status = __hal_vpath_stats_access(vp->vpath,
operation,
offset,
stat);
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vpath_xmac_tx_stats_get - Get the TX Statistics of a vpath
* @vpath: vpath
* @vpath_tx_stats: Buffer to return TX Statistics of vpath.
*
* Get the TX Statistics of a vpath
*
*/
vxge_hal_status_e
__hal_vpath_xmac_tx_stats_get(__hal_virtualpath_t *vpath,
vxge_hal_xmac_vpath_tx_stats_t *vpath_tx_stats)
{
u64 val64;
__hal_device_t *hldev;
vxge_hal_status_e status;
vxge_assert(vpath != NULL);
hldev = vpath->hldev;
vxge_hal_trace_log_stats("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_stats("vpath = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath);
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__,
__LINE__, VXGE_HAL_ERR_VPATH_NOT_OPEN);
return (VXGE_HAL_ERR_VPATH_NOT_OPEN);
}
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_TX_TTL_ETH_FRMS_OFFSET);
vpath_tx_stats->tx_ttl_eth_frms =
VXGE_HAL_STATS_GET_VPATH_TX_TTL_ETH_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_TX_TTL_ETH_OCTETS_OFFSET);
vpath_tx_stats->tx_ttl_eth_octets =
VXGE_HAL_STATS_GET_VPATH_TX_TTL_ETH_OCTETS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_TX_DATA_OCTETS_OFFSET);
vpath_tx_stats->tx_data_octets =
VXGE_HAL_STATS_GET_VPATH_TX_DATA_OCTETS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_TX_MCAST_FRMS_OFFSET);
vpath_tx_stats->tx_mcast_frms =
VXGE_HAL_STATS_GET_VPATH_TX_MCAST_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_TX_BCAST_FRMS_OFFSET);
vpath_tx_stats->tx_bcast_frms =
VXGE_HAL_STATS_GET_VPATH_TX_BCAST_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_TX_UCAST_FRMS_OFFSET);
vpath_tx_stats->tx_ucast_frms =
VXGE_HAL_STATS_GET_VPATH_TX_UCAST_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_TX_TAGGED_FRMS_OFFSET);
vpath_tx_stats->tx_tagged_frms =
VXGE_HAL_STATS_GET_VPATH_TX_TAGGED_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(VXGE_HAL_STATS_VPATH_TX_VLD_IP_OFFSET);
vpath_tx_stats->tx_vld_ip =
VXGE_HAL_STATS_GET_VPATH_TX_VLD_IP(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_TX_VLD_IP_OCTETS_OFFSET);
vpath_tx_stats->tx_vld_ip_octets =
VXGE_HAL_STATS_GET_VPATH_TX_VLD_IP_OCTETS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(VXGE_HAL_STATS_VPATH_TX_ICMP_OFFSET);
vpath_tx_stats->tx_icmp =
VXGE_HAL_STATS_GET_VPATH_TX_ICMP(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(VXGE_HAL_STATS_VPATH_TX_TCP_OFFSET);
vpath_tx_stats->tx_tcp =
VXGE_HAL_STATS_GET_VPATH_TX_TCP(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_TX_RST_TCP_OFFSET);
vpath_tx_stats->tx_rst_tcp =
VXGE_HAL_STATS_GET_VPATH_TX_RST_TCP(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_TX_UDP_OFFSET);
vpath_tx_stats->tx_udp =
VXGE_HAL_STATS_GET_VPATH_TX_UDP(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_TX_LOST_IP_OFFSET);
vpath_tx_stats->tx_lost_ip =
(u32) VXGE_HAL_STATS_GET_VPATH_TX_LOST_IP(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_TX_UNKNOWN_PROTOCOL_OFFSET);
vpath_tx_stats->tx_unknown_protocol =
(u32) VXGE_HAL_STATS_GET_VPATH_TX_UNKNOWN_PROTOCOL(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_TX_PARSE_ERROR_OFFSET);
vpath_tx_stats->tx_parse_error =
(u32) VXGE_HAL_STATS_GET_VPATH_TX_PARSE_ERROR(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_TX_TCP_OFFLOAD_OFFSET);
vpath_tx_stats->tx_tcp_offload =
VXGE_HAL_STATS_GET_VPATH_TX_TCP_OFFLOAD(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_TX_RETX_TCP_OFFLOAD_OFFSET);
vpath_tx_stats->tx_retx_tcp_offload =
VXGE_HAL_STATS_GET_VPATH_TX_RETX_TCP_OFFLOAD(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_TX_LOST_IP_OFFLOAD_OFFSET);
vpath_tx_stats->tx_lost_ip_offload =
VXGE_HAL_STATS_GET_VPATH_TX_LOST_IP_OFFLOAD(val64);
vxge_hal_trace_log_stats("<== %s:%s:%d Result: 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* __hal_vpath_xmac_rx_stats_get - Get the RX Statistics of a vpath
* @vpath: vpath
* @vpath_rx_stats: Buffer to return RX Statistics of vpath.
*
* Get the RX Statistics of a vpath
*
*/
vxge_hal_status_e
__hal_vpath_xmac_rx_stats_get(__hal_virtualpath_t *vpath,
vxge_hal_xmac_vpath_rx_stats_t *vpath_rx_stats)
{
u64 val64;
__hal_device_t *hldev;
vxge_hal_status_e status;
vxge_assert(vpath != NULL);
hldev = vpath->hldev;
vxge_hal_trace_log_stats("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_stats("vpath = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath);
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__,
VXGE_HAL_ERR_VPATH_NOT_OPEN);
return (VXGE_HAL_ERR_VPATH_NOT_OPEN);
}
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_TTL_ETH_FRMS_OFFSET);
vpath_rx_stats->rx_ttl_eth_frms =
VXGE_HAL_STATS_GET_VPATH_RX_TTL_ETH_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(VXGE_HAL_STATS_VPATH_RX_VLD_FRMS_OFFSET);
vpath_rx_stats->rx_vld_frms =
VXGE_HAL_STATS_GET_VPATH_RX_VLD_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_OFFLOAD_FRMS_OFFSET);
vpath_rx_stats->rx_offload_frms =
VXGE_HAL_STATS_GET_VPATH_RX_OFFLOAD_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_TTL_ETH_OCTETS_OFFSET);
vpath_rx_stats->rx_ttl_eth_octets =
VXGE_HAL_STATS_GET_VPATH_RX_TTL_ETH_OCTETS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_DATA_OCTETS_OFFSET);
vpath_rx_stats->rx_data_octets =
VXGE_HAL_STATS_GET_VPATH_RX_DATA_OCTETS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_OFFLOAD_OCTETS_OFFSET);
vpath_rx_stats->rx_offload_octets =
VXGE_HAL_STATS_GET_VPATH_RX_OFFLOAD_OCTETS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_VLD_MCAST_FRMS_OFFSET);
vpath_rx_stats->rx_vld_mcast_frms =
VXGE_HAL_STATS_GET_VPATH_RX_VLD_MCAST_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_VLD_BCAST_FRMS_OFFSET);
vpath_rx_stats->rx_vld_bcast_frms =
VXGE_HAL_STATS_GET_VPATH_RX_VLD_BCAST_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_ACC_UCAST_FRMS_OFFSET);
vpath_rx_stats->rx_accepted_ucast_frms =
VXGE_HAL_STATS_GET_VPATH_RX_ACC_UCAST_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_ACC_NUCAST_FRMS_OFFSET);
vpath_rx_stats->rx_accepted_nucast_frms =
VXGE_HAL_STATS_GET_VPATH_RX_ACC_NUCAST_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_TAGGED_FRMS_OFFSET);
vpath_rx_stats->rx_tagged_frms =
VXGE_HAL_STATS_GET_VPATH_RX_TAGGED_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_LONG_FRMS_OFFSET);
vpath_rx_stats->rx_long_frms =
VXGE_HAL_STATS_GET_VPATH_RX_LONG_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_USIZED_FRMS_OFFSET);
vpath_rx_stats->rx_usized_frms =
VXGE_HAL_STATS_GET_VPATH_RX_USIZED_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_OSIZED_FRMS_OFFSET);
vpath_rx_stats->rx_osized_frms =
VXGE_HAL_STATS_GET_VPATH_RX_OSIZED_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_FRAG_FRMS_OFFSET);
vpath_rx_stats->rx_frag_frms =
VXGE_HAL_STATS_GET_VPATH_RX_FRAG_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_JABBER_FRMS_OFFSET);
vpath_rx_stats->rx_jabber_frms =
VXGE_HAL_STATS_GET_VPATH_RX_JABBER_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_TTL_64_FRMS_OFFSET);
vpath_rx_stats->rx_ttl_64_frms =
VXGE_HAL_STATS_GET_VPATH_RX_TTL_64_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_TTL_65_127_FRMS_OFFSET);
vpath_rx_stats->rx_ttl_65_127_frms =
VXGE_HAL_STATS_GET_VPATH_RX_TTL_65_127_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_TTL_128_255_FRMS_OFFSET);
vpath_rx_stats->rx_ttl_128_255_frms =
VXGE_HAL_STATS_GET_VPATH_RX_TTL_128_255_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_TTL_256_511_FRMS_OFFSET);
vpath_rx_stats->rx_ttl_256_511_frms =
VXGE_HAL_STATS_GET_VPATH_RX_TTL_256_511_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_TTL_512_1023_FRMS_OFFSET);
vpath_rx_stats->rx_ttl_512_1023_frms =
VXGE_HAL_STATS_GET_VPATH_RX_TTL_512_1023_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_TTL_1024_1518_FRMS_OFFSET);
vpath_rx_stats->rx_ttl_1024_1518_frms =
VXGE_HAL_STATS_GET_VPATH_RX_TTL_1024_1518_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_TTL_1519_4095_FRMS_OFFSET);
vpath_rx_stats->rx_ttl_1519_4095_frms =
VXGE_HAL_STATS_GET_VPATH_RX_TTL_1519_4095_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_TTL_4096_8191_FRMS_OFFSET);
vpath_rx_stats->rx_ttl_4096_8191_frms =
VXGE_HAL_STATS_GET_VPATH_RX_TTL_4096_8191_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_TTL_8192_MAX_FRMS_OFFSET);
vpath_rx_stats->rx_ttl_8192_max_frms =
VXGE_HAL_STATS_GET_VPATH_RX_TTL_8192_MAX_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_TTL_GT_MAX_FRMS_OFFSET);
vpath_rx_stats->rx_ttl_gt_max_frms =
VXGE_HAL_STATS_GET_VPATH_RX_TTL_GT_MAX_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(VXGE_HAL_STATS_VPATH_RX_IP_OFFSET);
vpath_rx_stats->rx_ip =
VXGE_HAL_STATS_GET_VPATH_RX_IP(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(VXGE_HAL_STATS_VPATH_RX_ACC_IP_OFFSET);
vpath_rx_stats->rx_accepted_ip =
VXGE_HAL_STATS_GET_VPATH_RX_ACC_IP(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(VXGE_HAL_STATS_VPATH_RX_IP_OCTETS_OFFSET);
vpath_rx_stats->rx_ip_octets =
VXGE_HAL_STATS_GET_VPATH_RX_IP_OCTETS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(VXGE_HAL_STATS_VPATH_RX_ERR_IP_OFFSET);
vpath_rx_stats->rx_err_ip =
VXGE_HAL_STATS_GET_VPATH_RX_ERR_IP(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(VXGE_HAL_STATS_VPATH_RX_ICMP_OFFSET);
vpath_rx_stats->rx_icmp =
VXGE_HAL_STATS_GET_VPATH_RX_ICMP(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(VXGE_HAL_STATS_VPATH_RX_TCP_OFFSET);
vpath_rx_stats->rx_tcp =
VXGE_HAL_STATS_GET_VPATH_RX_TCP(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(VXGE_HAL_STATS_VPATH_RX_UDP_OFFSET);
vpath_rx_stats->rx_udp =
VXGE_HAL_STATS_GET_VPATH_RX_UDP(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(VXGE_HAL_STATS_VPATH_RX_ERR_TCP_OFFSET);
vpath_rx_stats->rx_err_tcp =
VXGE_HAL_STATS_GET_VPATH_RX_ERR_TCP(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_LOST_FRMS_OFFSET);
vpath_rx_stats->rx_lost_frms =
VXGE_HAL_STATS_GET_VPATH_RX_LOST_FRMS(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(VXGE_HAL_STATS_VPATH_RX_LOST_IP_OFFSET);
vpath_rx_stats->rx_lost_ip =
VXGE_HAL_STATS_GET_VPATH_RX_LOST_IP(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_LOST_IP_OFFLOAD_OFFSET);
vpath_rx_stats->rx_lost_ip_offload =
VXGE_HAL_STATS_GET_VPATH_RX_LOST_IP_OFFLOAD(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_QUEUE_FULL_DISCARD_OFFSET);
vpath_rx_stats->rx_queue_full_discard =
(u16) VXGE_HAL_STATS_GET_VPATH_RX_QUEUE_FULL_DISCARD(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_RED_DISCARD_OFFSET);
vpath_rx_stats->rx_red_discard =
(u16) VXGE_HAL_STATS_GET_VPATH_RX_RED_DISCARD(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_SLEEP_DISCARD_OFFSET);
vpath_rx_stats->rx_sleep_discard =
(u16) VXGE_HAL_STATS_GET_VPATH_RX_SLEEP_DISCARD(val64);
vpath_rx_stats->rx_various_discard =
vpath_rx_stats->rx_queue_full_discard;
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_RX_MPA_OK_FRMS_OFFSET);
vpath_rx_stats->rx_mpa_ok_frms =
VXGE_HAL_STATS_GET_VPATH_RX_MPA_OK_FRMS(val64);
vxge_hal_trace_log_stats("<== %s:%s:%d Result: 0",
__FILE__, __func__, __LINE__);
return (VXGE_HAL_OK);
}
/*
* vxge_hal_vpath_xmac_tx_stats_get - Get the TX Statistics of a vpath
* @vpath_handle: vpath handle.
* @vpath_tx_stats: Buffer to return TX Statistics of vpath.
*
* Get the TX Statistics of a vpath
*
*/
vxge_hal_status_e
vxge_hal_vpath_xmac_tx_stats_get(vxge_hal_vpath_h vpath_handle,
vxge_hal_xmac_vpath_tx_stats_t *vpath_tx_stats)
{
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
__hal_device_t *hldev;
vxge_hal_status_e status;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_stats("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_stats("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
status = __hal_vpath_xmac_tx_stats_get(vp->vpath, vpath_tx_stats);
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_xmac_rx_stats_get - Get the RX Statistics of a vpath
* @vpath_handle: vpath handle.
* @vpath_rx_stats: Buffer to return RX Statistics of vpath.
*
* Get the RX Statistics of a vpath
*
*/
vxge_hal_status_e
vxge_hal_vpath_xmac_rx_stats_get(vxge_hal_vpath_h vpath_handle,
vxge_hal_xmac_vpath_rx_stats_t *vpath_rx_stats)
{
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
__hal_device_t *hldev;
vxge_hal_status_e status;
vxge_assert(vpath_handle != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_stats("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_stats("vpath_handle = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
status = __hal_vpath_xmac_rx_stats_get(vp->vpath, vpath_rx_stats);
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* __hal_vpath_hw_stats_get - Get the vpath hw statistics.
* @vpath: Virtual Path.
* @hw_stats: Hardware stats
*
* Returns the vpath h/w stats.
*
* See also: vxge_hal_vpath_hw_stats_enable(),
* vxge_hal_vpath_hw_stats_disable()
*/
vxge_hal_status_e
__hal_vpath_hw_stats_get(__hal_virtualpath_t *vpath,
vxge_hal_vpath_stats_hw_info_t *hw_stats)
{
u64 val64;
__hal_device_t *hldev;
vxge_hal_status_e status;
vxge_assert((vpath != NULL) && (hw_stats != NULL));
hldev = vpath->hldev;
vxge_hal_trace_log_stats("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_stats(
"vpath = 0x"VXGE_OS_STXFMT", hw_stats = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath, (ptr_t) hw_stats);
if (vpath->vp_open == VXGE_HAL_VP_NOT_OPEN) {
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, VXGE_HAL_ERR_VPATH_NOT_OPEN);
return (VXGE_HAL_ERR_VPATH_NOT_OPEN);
}
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->vpath_debug_stats0);
hw_stats->ini_num_mwr_sent =
(u32) VXGE_HAL_VPATH_DEBUG_STATS0_GET_INI_NUM_MWR_SENT(val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->vpath_debug_stats1);
hw_stats->ini_num_mrd_sent =
(u32) VXGE_HAL_VPATH_DEBUG_STATS1_GET_INI_NUM_MRD_SENT(val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->vpath_debug_stats2);
hw_stats->ini_num_cpl_rcvd =
(u32) VXGE_HAL_VPATH_DEBUG_STATS2_GET_INI_NUM_CPL_RCVD(val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->vpath_debug_stats3);
hw_stats->ini_num_mwr_byte_sent =
VXGE_HAL_VPATH_DEBUG_STATS3_GET_INI_NUM_MWR_BYTE_SENT(val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->vpath_debug_stats4);
hw_stats->ini_num_cpl_byte_rcvd =
VXGE_HAL_VPATH_DEBUG_STATS4_GET_INI_NUM_CPL_BYTE_RCVD(val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->vpath_debug_stats5);
hw_stats->wrcrdtarb_xoff =
(u32) VXGE_HAL_VPATH_DEBUG_STATS5_GET_WRCRDTARB_XOFF(val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->vpath_debug_stats6);
hw_stats->rdcrdtarb_xoff =
(u32) VXGE_HAL_VPATH_DEBUG_STATS6_GET_RDCRDTARB_XOFF(val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->vpath_genstats_count01);
hw_stats->vpath_genstats_count0 =
(u32) VXGE_HAL_VPATH_GENSTATS_COUNT01_GET_PPIF_VPATH_GENSTATS_COUNT0(
val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->vpath_genstats_count01);
hw_stats->vpath_genstats_count1 =
(u32) VXGE_HAL_VPATH_GENSTATS_COUNT01_GET_PPIF_VPATH_GENSTATS_COUNT1(
val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->vpath_genstats_count23);
hw_stats->vpath_genstats_count2 =
(u32) VXGE_HAL_VPATH_GENSTATS_COUNT23_GET_PPIF_VPATH_GENSTATS_COUNT2(
val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->vpath_genstats_count01);
hw_stats->vpath_genstats_count3 =
(u32) VXGE_HAL_VPATH_GENSTATS_COUNT23_GET_PPIF_VPATH_GENSTATS_COUNT3(
val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->vpath_genstats_count4);
hw_stats->vpath_genstats_count4 =
(u32) VXGE_HAL_VPATH_GENSTATS_COUNT4_GET_PPIF_VPATH_GENSTATS_COUNT4(
val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->vpath_genstats_count5);
hw_stats->vpath_genstats_count5 = (u32)
VXGE_HAL_VPATH_GENSTATS_COUNT5_GET_PPIF_VPATH_GENSTATS_COUNT5(
val64);
status = __hal_vpath_xmac_tx_stats_get(vpath, &hw_stats->tx_stats);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
status = __hal_vpath_xmac_rx_stats_get(vpath, &hw_stats->rx_stats);
if (status != VXGE_HAL_OK) {
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_PROG_EVENT_VNUM0_OFFSET);
hw_stats->prog_event_vnum0 =
(u32) VXGE_HAL_STATS_GET_VPATH_PROG_EVENT_VNUM0(val64);
hw_stats->prog_event_vnum1 =
(u32) VXGE_HAL_STATS_GET_VPATH_PROG_EVENT_VNUM1(val64);
VXGE_HAL_VPATH_STATS_PIO_READ(
VXGE_HAL_STATS_VPATH_PROG_EVENT_VNUM2_OFFSET);
hw_stats->prog_event_vnum2 =
(u32) VXGE_HAL_STATS_GET_VPATH_PROG_EVENT_VNUM2(val64);
hw_stats->prog_event_vnum3 =
(u32) VXGE_HAL_STATS_GET_VPATH_PROG_EVENT_VNUM3(val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rx_multi_cast_stats);
hw_stats->rx_multi_cast_frame_discard =
(u16) VXGE_HAL_RX_MULTI_CAST_STATS_GET_FRAME_DISCARD(val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rx_frm_transferred);
hw_stats->rx_frm_transferred =
(u32) VXGE_HAL_RX_FRM_TRANSFERRED_GET_RX_FRM_TRANSFERRED(val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->rxd_returned);
hw_stats->rxd_returned =
(u16) VXGE_HAL_RXD_RETURNED_GET_RXD_RETURNED(val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->dbg_stats_rx_mpa);
hw_stats->rx_mpa_len_fail_frms =
(u16) VXGE_HAL_DBG_STATS_GET_RX_MPA_LEN_FAIL_FRMS(val64);
hw_stats->rx_mpa_mrk_fail_frms =
(u16) VXGE_HAL_DBG_STATS_GET_RX_MPA_MRK_FAIL_FRMS(val64);
hw_stats->rx_mpa_crc_fail_frms =
(u16) VXGE_HAL_DBG_STATS_GET_RX_MPA_CRC_FAIL_FRMS(val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->dbg_stats_rx_fau);
hw_stats->rx_permitted_frms =
(u16) VXGE_HAL_DBG_STATS_GET_RX_FAU_RX_PERMITTED_FRMS(val64);
hw_stats->rx_vp_reset_discarded_frms = (u16)
VXGE_HAL_DBG_STATS_GET_RX_FAU_RX_VP_RESET_DISCARDED_FRMS(val64);
hw_stats->rx_wol_frms =
(u16) VXGE_HAL_DBG_STATS_GET_RX_FAU_RX_WOL_FRMS(val64);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->tx_vp_reset_discarded_frms);
hw_stats->tx_vp_reset_discarded_frms = (u16)
VXGE_HAL_TX_VP_RESET_DISCARDED_FRMS_GET_TX_VP_RESET_DISCARDED_FRMS(
val64);
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_vpath_stats_clear - Clear all the statistics of vpath
* @vpath_handle: Virtual path handle.
*
* Clear the statistics of the given vpath.
*
*/
vxge_hal_status_e
vxge_hal_vpath_stats_clear(vxge_hal_vpath_h vpath_handle)
{
u64 stat;
vxge_hal_status_e status;
__hal_device_t *hldev;
__hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle;
vxge_assert(vp != NULL);
hldev = vp->vpath->hldev;
vxge_hal_trace_log_stats("==> %s:%s:%d",
__FILE__, __func__, __LINE__);
vxge_hal_trace_log_stats("vpath = 0x"VXGE_OS_STXFMT,
(ptr_t) vpath_handle);
vxge_os_memcpy(vp->vpath->hw_stats_sav,
vp->vpath->hw_stats,
sizeof(vxge_hal_vpath_stats_hw_info_t));
vxge_os_memzero(vp->vpath->hw_stats,
sizeof(vxge_hal_vpath_stats_hw_info_t));
vxge_os_memzero(vp->vpath->sw_stats,
sizeof(vxge_hal_vpath_stats_sw_info_t));
status = vxge_hal_vpath_stats_access(
vpath_handle,
VXGE_HAL_STATS_OP_CLEAR_ALL_VPATH_STATS,
0,
&stat);
vxge_hal_trace_log_stats("<== %s:%s:%d Result: %d",
__FILE__, __func__, __LINE__, status);
return (status);
}
/*
* vxge_hal_set_fw_api - Setup FW api
* @devh: Device Handle.
*
*/
vxge_hal_status_e
vxge_hal_set_fw_api(vxge_hal_device_h devh,
u64 vp_id, u32 action, u32 offset,
u64 data0, u64 data1)
{
vxge_hal_status_e status = VXGE_HAL_OK;
u64 val64;
u32 fw_memo = VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_FW_MEMO;
vxge_hal_vpath_reg_t *vp_reg;
__hal_device_t *hldev = (__hal_device_t *) devh;
vxge_assert(hldev != NULL);
/* Assumption: Privileged vpath is zero */
vp_reg = hldev->vpath_reg[vp_id];
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0, data0,
&vp_reg->rts_access_steer_data0);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0, data1,
&vp_reg->rts_access_steer_data1);
vxge_os_wmb();
val64 = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION(action) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL(fw_memo) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_OFFSET(offset) |
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE;
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0, val64,
&vp_reg->rts_access_steer_ctrl);
vxge_os_wmb();
status =
vxge_hal_device_register_poll(
hldev->header.pdev, hldev->header.regh0,
&vp_reg->rts_access_steer_ctrl, 0,
VXGE_HAL_RTS_ACCESS_STEER_CTRL_STROBE,
WAIT_FACTOR * hldev->header.config.device_poll_millis);
if (status != VXGE_HAL_OK)
return (VXGE_HAL_FAIL);
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vp_reg->rts_access_steer_ctrl);
if (val64 & VXGE_HAL_RTS_ACCESS_STEER_CTRL_RMACJ_STATUS)
status = VXGE_HAL_OK;
else
status = VXGE_HAL_FAIL;
return (status);
}
/*
* vxge_hal_get_active_config - Get active configuration
* @devh: Device Handle.
*
*/
vxge_hal_status_e
vxge_hal_get_active_config(vxge_hal_device_h devh,
vxge_hal_xmac_nwif_actconfig req_config,
u64 *cur_config)
{
u32 action;
u64 data0 = 0x0, data1 = 0x0;
u32 cmd = VXGE_HAL_XMAC_NWIF_Cmd_Get_Active_Config;
vxge_hal_vpath_reg_t *vp_reg;
__hal_device_t *hldev = (__hal_device_t *) devh;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_assert(hldev != NULL);
/* Assumption: Privileged vpath is zero */
vp_reg = hldev->vpath_reg[0];
/* get port mode */
data0 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_SET_NWIF_CMD(cmd) | req_config;
action = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_PORT_CTRL;
status = vxge_hal_set_fw_api(devh, 0, action, 0x0, data0, data1);
if (status == VXGE_HAL_OK) {
*cur_config = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vp_reg->rts_access_steer_data1);
}
return (status);
}
/*
* vxge_hal_set_port_mode - Set dual port mode
* override the default dual port mode
* @devh: Device Handle.
*
*/
vxge_hal_status_e
vxge_hal_set_port_mode(vxge_hal_device_h devh,
vxge_hal_xmac_nwif_dp_mode port_mode)
{
u32 action;
u64 data0 = 0x0, data1 = 0x0;
u32 cmd = VXGE_HAL_XMAC_NWIF_Cmd_SetMode;
vxge_hal_status_e status = VXGE_HAL_OK;
if ((port_mode < VXGE_HAL_DP_NP_MODE_DEFAULT) ||
(port_mode > VXGE_HAL_DP_NP_MODE_DISABLE_PORT_MGMT)) {
vxge_os_printf("Invalid port mode : %d\n", port_mode);
return (VXGE_HAL_ERR_INVALID_DP_MODE);
}
data0 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_SET_NWIF_CMD(cmd);
data1 = port_mode;
action = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_PORT_CTRL;
status = vxge_hal_set_fw_api(devh, 0, action, 0x0, data0, data1);
return (status);
}
/*
* vxge_hal_set_port_mode - Set dual port mode
* change behavior on failure *
* @devh: Device Handle.
*/
vxge_hal_status_e
vxge_hal_set_behavior_on_failure(vxge_hal_device_h devh,
vxge_hal_xmac_nwif_behavior_on_failure behave_on_failure)
{
u32 action;
u64 data0 = 0x0, data1 = 0x0;
u32 cmd = VXGE_HAL_XMAC_NWIF_Cmd_CfgSetBehaviourOnFailure;
vxge_hal_status_e status = VXGE_HAL_OK;
if ((behave_on_failure < VXGE_HAL_XMAC_NWIF_OnFailure_NoMove) ||
(behave_on_failure >
VXGE_HAL_XMAC_NWIF_OnFailure_OtherPortBackOnRestore)) {
vxge_os_printf("Invalid setting for failure behavior : %d\n",
behave_on_failure);
return (VXGE_HAL_FAIL);
}
data0 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_SET_NWIF_CMD(cmd);
data1 = behave_on_failure;
action = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_PORT_CTRL;
status = vxge_hal_set_fw_api(devh, 0, action, 0x0, data0, data1);
return (status);
}
vxge_hal_status_e
vxge_hal_set_l2switch_mode(vxge_hal_device_h devh,
enum vxge_hal_xmac_nwif_l2_switch_status l2_switch)
{
u32 action;
u64 data0 = 0x0, data1 = 0x0;
u32 cmd = VXGE_HAL_XMAC_NWIF_Cmd_CfgDualPort_L2SwitchEnable;
vxge_hal_status_e status = VXGE_HAL_OK;
if ((l2_switch < VXGE_HAL_XMAC_NWIF_L2_SWITCH_DISABLE) ||
(l2_switch > VXGE_HAL_XMAC_NWIF_L2_SWITCH_ENABLE)) {
vxge_os_printf("Invalid setting for failure behavior : %d\n",
l2_switch);
return (VXGE_HAL_ERR_INVALID_L2_SWITCH_STATE);
}
data0 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_SET_NWIF_CMD(cmd);
data1 = l2_switch;
action = VXGE_HAL_RTS_ACCESS_FW_MEMO_ACTION_PRIV_NWIF;
status = vxge_hal_set_fw_api(devh, 0, action, 0x0, data0, data1);
return (status);
}
/* Get function mode */
vxge_hal_status_e
vxge_hal_func_mode_get(vxge_hal_device_h devh, u32 *func_mode)
{
int vp_id;
u32 action;
u64 val64;
vxge_hal_status_e status = VXGE_HAL_OK;
vxge_hal_vpath_reg_t *vp_reg;
__hal_device_t *hldev = (__hal_device_t *) devh;
vxge_assert(hldev != NULL);
/* get the first vpath number assigned to this function */
vp_id = hldev->first_vp_id;
vp_reg = hldev->vpath_reg[vp_id];
action = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_GET_FUNC_MODE;
status = vxge_hal_set_fw_api(devh, vp_id, action, 0x0, 0x0, 0x0);
if (status == VXGE_HAL_OK) {
val64 = vxge_os_pio_mem_read64(
hldev->header.pdev, hldev->header.regh0,
&vp_reg->rts_access_steer_data0);
*func_mode =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_FUNC_MODE(val64);
}
return (status);
}
vxge_hal_status_e
vxge_hal_func_mode_count(vxge_hal_device_h devh, u32 func_mode, u32 *num_funcs)
{
int vp_id;
u32 action;
u64 val64, data0;
vxge_hal_vpath_reg_t *vp_reg;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_device_t *hldev = (__hal_device_t *) devh;
vp_id = hldev->first_vp_id;
vp_reg = hldev->vpath_reg[0];
data0 = func_mode;
action = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_GET_FUNC_COUNT;
status = vxge_hal_set_fw_api(devh, vp_id, action, 0x0, data0, 0x0);
if (status == VXGE_HAL_OK) {
val64 = vxge_os_pio_mem_read64(
hldev->header.pdev, hldev->header.regh0,
&vp_reg->rts_access_steer_data0);
*num_funcs = (u32) VXGE_HAL_RTS_ACCESS_STEER_DATA0_GET_NUM_FUNC(val64);
}
return (status);
}
vxge_hal_status_e
vxge_hal_config_vpath_map(vxge_hal_device_h devh, u64 port_map)
{
u32 action;
u64 data0 = 0x0, data1 = 0x0;
u32 cmd = VXGE_HAL_XMAC_NWIF_Cmd_CfgDualPort_VPathVector;
vxge_hal_status_e status = VXGE_HAL_OK;
action = VXGE_HAL_RTS_ACCESS_FW_MEMO_ACTION_PRIV_NWIF;
data0 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_SET_NWIF_CMD(cmd);
data1 = port_map;
status = vxge_hal_set_fw_api(devh, 0, action, 0x0, data0, data1);
return (status);
}
vxge_hal_status_e
vxge_hal_get_vpath_mask(vxge_hal_device_h devh,
u32 vf_id, u32 * num_vp, u64 * data1)
{
u32 action, vhn = 0;
u64 data0 = 0x0;
vxge_hal_vpath_reg_t *vp_reg;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_device_t *hldev = (__hal_device_t *) devh;
vp_reg = hldev->vpath_reg[0];
data0 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_VFID(vf_id) |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_VHN(vhn);
action = VXGE_HAL_PRIV_VPATH_ACTION;
status = vxge_hal_set_fw_api(devh, 0, action, 0x0, data0, 0x0);
if (status == VXGE_HAL_OK) {
data0 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vp_reg->rts_access_steer_data0);
*num_vp = (u32) ((data0 >> 16) & 0xFF);
*data1 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vp_reg->rts_access_steer_data1);
}
return (status);
}
vxge_hal_status_e
vxge_hal_get_vpath_list(vxge_hal_device_h devh, u32 vf_id,
u64 *vpath_list, u32 *vpath_count)
{
u32 i, j = 0;
u64 pos, vpath_mask;
vxge_hal_status_e status = VXGE_HAL_OK;
*vpath_count = 0;
status = vxge_hal_get_vpath_mask(devh, vf_id, vpath_count, &vpath_mask);
if (status == VXGE_HAL_OK) {
for (i = VXGE_HAL_VPATH_BMAP_END;
i >= VXGE_HAL_VPATH_BMAP_START; i--) {
if (bVAL1(vpath_mask, i)) {
pos = VXGE_HAL_VPATH_BMAP_END - i;
vpath_list[j] = pos;
j++;
}
}
}
return (status);
}
vxge_hal_status_e
vxge_hal_rx_bw_priority_set(vxge_hal_device_h devh, u64 vp_id)
{
u64 data0 = 0x0, data1 = 0x0;
u32 action, bandwidth, priority, set = 0;
vxge_hal_vpath_reg_t *vp_reg;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_device_t *hldev = (__hal_device_t *) devh;
vp_reg = hldev->vpath_reg[0];
action = VXGE_HAL_BW_CONTROL;
bandwidth =
((vxge_hal_device_t *) (devh))->config.vp_config[vp_id].bandwidth;
priority =
((vxge_hal_device_t *) (devh))->config.vp_config[vp_id].priority;
/*
* Get bandwidth and priority settings
* and perform read-modify-write operation
*/
data0 = 1;
data0 |= vp_id << 32;
status = vxge_hal_set_fw_api(devh, 0, action, 0x0, data0, data1);
if (status != VXGE_HAL_OK)
goto _exit;
data1 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vp_reg->rts_access_steer_data1);
/* Set */
data0 = 0;
data0 |= vp_id << 32;
/* Rx Bandwidth */
if (bandwidth != VXGE_HAL_VPATH_BW_LIMIT_DEFAULT) {
set = 1;
data1 &= ~VXGE_HAL_RTS_ACCESS_STEER_DATA1_SET_RX_MAX_BW(0xff);
bandwidth = (bandwidth * 256) / 10000;
data1 |=
VXGE_HAL_RTS_ACCESS_STEER_DATA1_SET_RX_MAX_BW(bandwidth);
data1 |= VXGE_HAL_RTS_ACCESS_STEER_DATA1_SET_VPATH_OR_FUNC(1);
}
/* Priority */
if (priority != VXGE_HAL_VPATH_PRIORITY_DEFAULT) {
set = 1;
data1 &= ~VXGE_HAL_RTS_ACCESS_STEER_DATA1_SET_RX_PRIORITY(0x7);
data1 |=
VXGE_HAL_RTS_ACCESS_STEER_DATA1_SET_RX_PRIORITY(priority);
}
if (set == 1)
status = vxge_hal_set_fw_api(devh, 0, action,
0x0, data0, data1);
_exit:
return (status);
}
vxge_hal_status_e
vxge_hal_tx_bw_priority_set(vxge_hal_device_h devh, u64 vp_id)
{
u64 data0 = 0x0, data1 = 0x0;
u32 action, bandwidth, priority, set = 0;
vxge_hal_vpath_reg_t *vp_reg;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_device_t *hldev = (__hal_device_t *) devh;
vp_reg = hldev->vpath_reg[0];
action = VXGE_HAL_BW_CONTROL;
bandwidth =
((vxge_hal_device_t *) (devh))->config.vp_config[vp_id].bandwidth;
priority =
((vxge_hal_device_t *) (devh))->config.vp_config[vp_id].priority;
/*
* Get bandwidth and priority settings and
* perform a read-modify-write operation
*/
data0 = 1;
data0 |= vp_id << 32;
status = vxge_hal_set_fw_api(devh, 0, action, 0x0, data0, data1);
if (status != VXGE_HAL_OK)
goto _exit;
data1 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vp_reg->rts_access_steer_data1);
/* Set */
data0 = 0;
data0 |= vp_id << 32;
/* Tx Bandwidth */
if (bandwidth != VXGE_HAL_VPATH_BW_LIMIT_DEFAULT) {
set = 1;
data1 &= ~VXGE_HAL_RTS_ACCESS_STEER_DATA1_SET_TX_MAX_BW(0xff);
bandwidth = (bandwidth * 256) / 10000;
data1 |=
VXGE_HAL_RTS_ACCESS_STEER_DATA1_SET_TX_MAX_BW(bandwidth);
}
/* Priority */
if (priority != VXGE_HAL_VPATH_PRIORITY_DEFAULT) {
set = 1;
data1 &= ~VXGE_HAL_RTS_ACCESS_STEER_DATA1_SET_TX_PRIORITY(0x7);
data1 |=
VXGE_HAL_RTS_ACCESS_STEER_DATA1_SET_TX_PRIORITY(priority);
}
if (set == 1)
status = vxge_hal_set_fw_api(devh, 0, action,
0x0, data0, data1);
_exit:
return (status);
}
vxge_hal_status_e
vxge_hal_bw_priority_get(vxge_hal_device_h devh, u64 vp_id,
u32 *bandwidth, u32 *priority)
{
u32 action;
u64 data0 = 0x0, data1 = 0x0;
vxge_hal_vpath_reg_t *vp_reg;
vxge_hal_status_e status = VXGE_HAL_OK;
__hal_device_t *hldev = (__hal_device_t *) devh;
vp_reg = hldev->vpath_reg[0];
action = VXGE_HAL_BW_CONTROL;
/* Get rx bandwidth and rx priority settings */
data0 = 1;
data0 |= vp_id << 32;
status = vxge_hal_set_fw_api(devh, 0, action, 0x0, data0, data1);
if (status != VXGE_HAL_OK)
return (status);
data1 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vp_reg->rts_access_steer_data1);
*priority = (u32) VXGE_HAL_RTS_ACCESS_STEER_DATA1_GET_RX_PRIORITY(data1);
/*
* Bandwidth setting is stored in increments of approx. 39 Mb/s
* so revert it back to get the b/w value
*/
*bandwidth = (u32) VXGE_HAL_RTS_ACCESS_STEER_DATA1_GET_RX_MAX_BW(data1);
*bandwidth = ((*bandwidth) * 10000) / 256;
return (status);
}
vxge_hal_status_e
vxge_hal_vf_rx_bw_get(vxge_hal_device_h devh, u64 func_id,
u32 *bandwidth, u32 *priority)
{
u32 action;
u64 data0 = 0x0, data1 = 0x0;
__hal_device_t *hldev = (__hal_device_t *) devh;
vxge_hal_vpath_reg_t *vp_reg;
vxge_hal_status_e status = VXGE_HAL_OK;
vp_reg = hldev->vpath_reg[func_id];
action = VXGE_HAL_RTS_ACCESS_FW_MEMO_ACTION_NON_PRIV_BANDWIDTH_CTRL;
/* Get rx bandwidth and rx priority settings */
data0 = 3;
data0 |= func_id << 32;
status = vxge_hal_set_fw_api(devh, func_id, action, 0x0, data0, data1);
if (status != VXGE_HAL_OK)
return (status);
data1 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vp_reg->rts_access_steer_data1);
*priority =
(u32) VXGE_HAL_RTS_ACCESS_STEER_DATA1_GET_RX_PRIORITY(data1);
/*
* Bandwidth setting is stored in increments of approx. 39 Mb/s
* so revert it back to get the b/w value
*/
*bandwidth = (u32) VXGE_HAL_RTS_ACCESS_STEER_DATA1_GET_RX_MAX_BW(data1);
*bandwidth = ((*bandwidth) * 10000) / 256;
return (status);
}
void
vxge_hal_vpath_dynamic_tti_rtimer_set(vxge_hal_vpath_h vpath_handle,
u32 timer_val)
{
u64 val64, timer;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
val64 = vpath->tim_tti_cfg3_saved;
timer = (timer_val * 1000) / 272;
val64 &= ~VXGE_HAL_TIM_CFG3_INT_NUM_RTIMER_VAL(0x3ffffff);
if (timer)
val64 |= VXGE_HAL_TIM_CFG3_INT_NUM_RTIMER_VAL(timer) |
VXGE_HAL_TIM_CFG3_INT_NUM_RTIMER_EVENT_SF(5);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tim_cfg3_int_num[VXGE_HAL_VPATH_INTR_TX]);
/*
* tti_cfg3_saved is not updated again because it is
* initialized at one place only - init time.
*/
}
void
vxge_hal_vpath_dynamic_rti_rtimer_set(vxge_hal_vpath_h vpath_handle,
u32 timer_val)
{
u64 val64, timer;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
val64 = vpath->tim_rti_cfg3_saved;
timer = (timer_val * 1000) / 272;
val64 &= ~VXGE_HAL_TIM_CFG3_INT_NUM_RTIMER_VAL(0x3ffffff);
if (timer)
val64 |= VXGE_HAL_TIM_CFG3_INT_NUM_RTIMER_VAL(timer) |
VXGE_HAL_TIM_CFG3_INT_NUM_RTIMER_EVENT_SF(4);
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tim_cfg3_int_num[VXGE_HAL_VPATH_INTR_RX]);
/*
* rti_cfg3_saved is not updated again because it is
* initialized at one place only - init time.
*/
}
void
vxge_hal_vpath_tti_ci_set(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
if (vpath->vp_config->fifo.enable == VXGE_HAL_FIFO_ENABLE) {
if (vpath->vp_config->tti.timer_ci_en != VXGE_HAL_TIM_TIMER_CI_ENABLE) {
vpath->vp_config->tti.timer_ci_en = VXGE_HAL_TIM_TIMER_CI_ENABLE;
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->tim_cfg1_int_num[VXGE_HAL_VPATH_INTR_TX]);
val64 |= VXGE_HAL_TIM_CFG1_INT_NUM_TIMER_CI;
vpath->tim_rti_cfg1_saved = val64;
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tim_cfg1_int_num[VXGE_HAL_VPATH_INTR_TX]);
}
}
}
void
vxge_hal_vpath_tti_ci_reset(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
if (vpath->vp_config->fifo.enable == VXGE_HAL_FIFO_ENABLE) {
if (vpath->vp_config->tti.timer_ci_en != VXGE_HAL_TIM_TIMER_CI_DISABLE) {
vpath->vp_config->tti.timer_ci_en = VXGE_HAL_TIM_TIMER_CI_DISABLE;
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->tim_cfg1_int_num[VXGE_HAL_VPATH_INTR_TX]);
val64 &= ~VXGE_HAL_TIM_CFG1_INT_NUM_TIMER_CI;
vpath->tim_rti_cfg1_saved = val64;
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tim_cfg1_int_num[VXGE_HAL_VPATH_INTR_TX]);
}
}
}
void
vxge_hal_vpath_rti_ci_set(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
if (vpath->vp_config->ring.enable == VXGE_HAL_RING_ENABLE) {
if (vpath->vp_config->rti.timer_ci_en != VXGE_HAL_TIM_TIMER_CI_ENABLE) {
vpath->vp_config->rti.timer_ci_en = VXGE_HAL_TIM_TIMER_CI_ENABLE;
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->tim_cfg1_int_num[VXGE_HAL_VPATH_INTR_RX]);
val64 |= VXGE_HAL_TIM_CFG1_INT_NUM_TIMER_CI;
vpath->tim_rti_cfg1_saved = val64;
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tim_cfg1_int_num[VXGE_HAL_VPATH_INTR_RX]);
}
}
}
void
vxge_hal_vpath_rti_ci_reset(vxge_hal_vpath_h vpath_handle)
{
u64 val64;
__hal_device_t *hldev;
__hal_virtualpath_t *vpath;
vpath = ((__hal_vpath_handle_t *) vpath_handle)->vpath;
hldev = vpath->hldev;
if (vpath->vp_config->ring.enable == VXGE_HAL_RING_ENABLE) {
if (vpath->vp_config->rti.timer_ci_en != VXGE_HAL_TIM_TIMER_CI_DISABLE) {
vpath->vp_config->rti.timer_ci_en = VXGE_HAL_TIM_TIMER_CI_DISABLE;
val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
hldev->header.regh0,
&vpath->vp_reg->tim_cfg1_int_num[VXGE_HAL_VPATH_INTR_RX]);
val64 &= ~VXGE_HAL_TIM_CFG1_INT_NUM_TIMER_CI;
vpath->tim_rti_cfg1_saved = val64;
vxge_os_pio_mem_write64(hldev->header.pdev,
hldev->header.regh0,
val64,
&vpath->vp_reg->tim_cfg1_int_num[VXGE_HAL_VPATH_INTR_RX]);
}
}
}
vxge_hal_status_e
vxge_hal_send_message(vxge_hal_device_h devh, u64 vp_id, u8 msg_type,
u8 msg_dst, u32 msg_data, u64 *msg_sent_to_vpaths)
{
u32 action;
u64 data0 = 0x0, data1 = 0x0;
u32 attempts = VXGE_HAL_MSG_SEND_RETRY;
vxge_hal_status_e status = VXGE_HAL_OK;
data0 = VXGE_HAL_RTS_ACCESS_STEER_DATA0_SEND_MSG_TYPE(msg_type) |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_SEND_MSG_DEST(msg_dst) |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_SEND_MSG_SRC(vp_id) |
VXGE_HAL_RTS_ACCESS_STEER_DATA0_SEND_MSG_DATA(msg_data);
action = VXGE_HAL_RTS_ACCESS_STEER_CTRL_ACTION_SEND_MSG;
do {
status = vxge_hal_set_fw_api(devh, vp_id, action, 0x0,
data0, data1);
if (status != VXGE_HAL_OK) {
attempts--;
if (attempts == 0)
return (status);
}
} while (status != VXGE_HAL_OK);
if (msg_sent_to_vpaths != NULL) {
/* The API returns a vector of VPATHs the message
* was sent to in the event the destination is a
* broadcast message or being sent to the privileged VPATH
*/
*msg_sent_to_vpaths = data0 & VXGE_HAL_MSG_SEND_TO_VPATH_MASK;
}
return (status);
}