d580860e12
Features: Jumbo frames (up to 9600), LRO (Large Receive Offload), TSO (TCP segmentation offload), RTH (Receive Traffic Hash). Submitted by: Sriram Rapuru at Exar MFC after: 2 weeks
12144 lines
326 KiB
C
12144 lines
326 KiB
C
/*-
|
|
* 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);
|
|
}
|