blob: b450fe40a77e828a219dea3bbcff99ebfd0349b6 [file] [log] [blame]
/*
* Copyright (c) 2012, 2017, The Linux Foundation. All rights reserved.
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all copies.
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "sw_config.h"
#include "aos_head.h"
#include "sw_error.h"
#include "shared_func.h"
#include "fal_type.h"
#include "hsl.h"
#include "hsl_dev.h"
#include "hsl_port_prop.h"
#include "hsl_phy.h"
typedef struct
{
a_uint32_t phy_id[SW_MAX_NR_PORT];
fal_pbmp_t dev_portmap;
fal_pbmp_t property[HSL_PP_BUTT];
} port_info_t;
static port_info_t *p_port_info[SW_MAX_NR_DEV] = { 0 };
a_bool_t
hsl_port_prop_check(a_uint32_t dev_id, fal_port_t port_id,
hsl_port_prop_t p_type)
{
fal_pbmp_t pbitmap;
if (dev_id >= SW_MAX_NR_DEV)
return A_FALSE;
if (HSL_PP_BUTT <= p_type)
{
return A_FALSE;
}
pbitmap = p_port_info[dev_id]->property[p_type];
return SW_IS_PBMP_MEMBER(pbitmap, port_id);
}
a_bool_t
hsl_mports_prop_check(a_uint32_t dev_id, fal_pbmp_t port_bitmap,
hsl_port_prop_t p_type)
{
fal_pbmp_t pbitmap;
if (dev_id >= SW_MAX_NR_DEV)
return A_FALSE;
if (HSL_PP_BUTT <= p_type)
{
return A_FALSE;
}
pbitmap = p_port_info[dev_id]->property[p_type];
return (SW_IS_PBMP_INCLUDE(pbitmap, port_bitmap));
}
a_bool_t
hsl_port_validity_check(a_uint32_t dev_id, fal_port_t port_id)
{
fal_pbmp_t pbitmap;
if (dev_id >= SW_MAX_NR_DEV)
return A_FALSE;
pbitmap = p_port_info[dev_id]->dev_portmap;
return SW_IS_PBMP_MEMBER(pbitmap, port_id);
}
a_bool_t
hsl_mports_validity_check(a_uint32_t dev_id, fal_pbmp_t port_bitmap)
{
fal_pbmp_t pbitmap;
if (dev_id >= SW_MAX_NR_DEV)
return A_FALSE;
pbitmap = p_port_info[dev_id]->dev_portmap;
return (SW_IS_PBMP_INCLUDE(pbitmap, port_bitmap));
}
sw_error_t
hsl_port_prop_set(a_uint32_t dev_id, fal_port_t port_id, hsl_port_prop_t p_type)
{
HSL_DEV_ID_CHECK(dev_id);
if (A_FALSE == hsl_port_validity_check(dev_id, port_id))
{
return SW_OUT_OF_RANGE;
}
if (HSL_PP_BUTT <= p_type)
{
return SW_BAD_PARAM;
}
SW_PBMP_ADD_PORT(p_port_info[dev_id]->property[p_type], port_id);
return SW_OK;
}
sw_error_t
hsl_port_prop_clr(a_uint32_t dev_id, fal_port_t port_id, hsl_port_prop_t p_type)
{
HSL_DEV_ID_CHECK(dev_id);;
if (A_FALSE == hsl_port_validity_check(dev_id, port_id))
{
return SW_OUT_OF_RANGE;
}
if (HSL_PP_BUTT <= p_type)
{
return SW_BAD_PARAM;
}
SW_PBMP_DEL_PORT(p_port_info[dev_id]->property[p_type], port_id);
return SW_OK;
}
sw_error_t
hsl_port_prop_get_phyid(a_uint32_t dev_id, fal_port_t port_id,
a_uint32_t * phy_id)
{
HSL_DEV_ID_CHECK(dev_id);
HSL_PORT_ID_CHECK(port_id);
if (A_FALSE == hsl_port_validity_check(dev_id, port_id))
{
return SW_BAD_PARAM;
}
*phy_id = qca_ssdk_port_to_phy_addr(dev_id, port_id);
return SW_OK;
}
sw_error_t
hsl_port_prop_set_phyid(a_uint32_t dev_id, fal_port_t port_id, a_uint32_t phy_id)
{
HSL_DEV_ID_CHECK(dev_id);
HSL_PORT_ID_CHECK(port_id);
if (A_FALSE == hsl_port_validity_check(dev_id, port_id))
{
return SW_BAD_PARAM;
}
p_port_info[dev_id]->phy_id[port_id] = phy_id;
return SW_OK;
}
sw_error_t
hsl_port_prop_portmap_set(a_uint32_t dev_id, fal_port_t port_id)
{
HSL_DEV_ID_CHECK(dev_id);
if (port_id > SW_MAX_NR_PORT)
return SW_OUT_OF_RANGE;
SW_PBMP_ADD_PORT(p_port_info[dev_id]->dev_portmap, port_id);
return SW_OK;
}
sw_error_t
hsl_port_prop_init_by_dev(a_uint32_t dev_id)
{
port_info_t *p_mem;
HSL_DEV_ID_CHECK(dev_id);
p_mem = aos_mem_alloc(sizeof (port_info_t));
if (p_mem == NULL)
return SW_OUT_OF_MEM;
aos_mem_zero(p_mem, sizeof (port_info_t));
p_port_info[dev_id] = p_mem;
return SW_OK;
}
sw_error_t
hsl_port_prop_cleanup_by_dev(a_uint32_t dev_id)
{
HSL_DEV_ID_CHECK(dev_id);
if (p_port_info[dev_id] != NULL)
aos_mem_free((void *)p_port_info[dev_id]);
p_port_info[dev_id] = NULL;
return SW_OK;
}
sw_error_t
hsl_port_prop_init(a_uint32_t dev_id)
{
if (dev_id >= SW_MAX_NR_DEV)
return SW_BAD_VALUE;
p_port_info[dev_id] = NULL;
return SW_OK;
}