blob: 1bb923ab364be854245267e56e182134795fae45 [file] [log] [blame]
/*
* Copyright (c) 2012,2018, 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.
*/
/*qca808x_start*/
#ifndef _HSL_H
#define _HSL_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include "ssdk_init.h"
typedef sw_error_t
(*hsl_acl_rule_copy) (a_uint32_t dev_id, a_uint32_t src_addr,
a_uint32_t dest_addr, a_uint32_t size);
typedef sw_error_t
(*hsl_acl_rule_invalid) (a_uint32_t dev_id, a_uint32_t addr,
a_uint32_t size);
typedef sw_error_t
(*hsl_acl_addr_update) (a_uint32_t dev_id, a_uint32_t old_addr,
a_uint32_t new_addr, a_uint32_t info);
typedef struct
{
hsl_acl_rule_copy acl_rule_copy;
hsl_acl_rule_invalid acl_rule_invalid;
hsl_acl_addr_update acl_addr_update;
} hsl_acl_func_t;
/*qca808x_end*/
#if 1
extern sw_error_t reduce_hsl_reg_entry_get(a_uint32_t dev,a_uint32_t reg,a_uint8_t* value,a_uint8_t val_len);
#define HSL_REG_ENTRY_GET(rv, dev, reg, index, value, val_len) \
rv = reduce_hsl_reg_entry_get(dev,reg##_OFFSET + ((a_uint32_t)index) * reg##_E_OFFSET,value,val_len);
extern sw_error_t reduce_hsl_reg_entry_set(a_uint32_t dev,a_uint32_t reg,a_uint8_t* value,a_uint8_t val_len);
#define HSL_REG_ENTRY_SET(rv, dev, reg, index, value, val_len) \
rv = reduce_hsl_reg_entry_set(dev,reg##_OFFSET + ((a_uint32_t)index) * reg##_E_OFFSET,value,val_len);
extern sw_error_t reduce_hsl_reg_field_get(a_uint32_t dev,a_uint32_t reg,a_uint32_t reg_offset,
a_uint32_t reg_offset_len,a_uint8_t* value,a_uint8_t val_len);
#define HSL_REG_FIELD_GET(rv, dev, reg, index, field, value, val_len) \
rv = reduce_hsl_reg_field_get(dev,reg##_OFFSET + ((a_uint32_t)index) * reg##_E_OFFSET,\
reg##_##field##_BOFFSET, \
reg##_##field##_BLEN,value,val_len);
extern sw_error_t reduce_hsl_reg_field_set(a_uint32_t dev,a_uint32_t reg,a_uint32_t reg_offset,
a_uint32_t reg_offset_len,a_uint8_t* value,a_uint8_t val_len);
#define HSL_REG_FIELD_SET(rv, dev, reg, index, field, value, val_len) \
rv = reduce_hsl_reg_field_set(dev,reg##_OFFSET + ((a_uint32_t)index) * reg##_E_OFFSET,\
reg##_##field##_BOFFSET, \
reg##_##field##_BLEN,value,val_len);
extern sw_error_t reduce_hsl_reg_entry_gen_get(a_uint32_t dev,a_uint32_t addr,a_uint8_t* value,a_uint8_t val_len);
#define HSL_REG_ENTRY_GEN_GET(rv, dev, addr, reg_len, value, val_len) \
rv = reduce_hsl_reg_entry_gen_get(dev,addr,(a_uint8_t*)value,val_len);
extern sw_error_t reduce_hsl_reg_entry_gen_set(a_uint32_t dev,a_uint32_t addr,a_uint8_t* value,a_uint8_t val_len);
#define HSL_REG_ENTRY_GEN_SET(rv, dev, addr, reg_len, value, val_len) \
rv = reduce_hsl_reg_entry_gen_set(dev,addr,(a_uint8_t*)value,val_len);
extern sw_error_t reduce_hsl_reg_field_gen_get(a_uint32_t dev,a_uint32_t reg_addr,
a_uint32_t bitoffset, a_uint32_t field_len, a_uint8_t* value,a_uint8_t val_len);
#define HSL_REG_FIELD_GEN_GET(rv, dev, regaddr, bitlength, bitoffset, value, val_len) \
rv = reduce_hsl_reg_field_gen_get(dev, regaddr, bitoffset, bitlength, (a_uint8_t*)value, val_len);
extern sw_error_t reduce_hsl_reg_field_gen_set(a_uint32_t dev,a_uint32_t regaddr,a_uint32_t bitoffset,
a_uint32_t bitlength,a_uint8_t* value,a_uint8_t val_len);
#define HSL_REG_FIELD_GEN_SET(rv, dev, regaddr, bitlength, bitoffset, value, val_len) \
rv = reduce_hsl_reg_field_gen_set(dev,regaddr,bitoffset,bitlength, (a_uint8_t*)value,val_len);
/*qca808x_start*/
extern sw_error_t reduce_hsl_phy_get(a_uint32_t dev,a_uint32_t phy_addr,a_uint32_t reg,a_uint16_t* value);
#define HSL_PHY_GET(rv, dev, phy_addr, reg, value) \
rv = reduce_hsl_phy_get(dev,phy_addr,reg,value);
extern sw_error_t reduce_hsl_phy_set(a_uint32_t dev,a_uint32_t phy_addr,a_uint32_t reg,a_uint16_t value);
#define HSL_PHY_SET(rv, dev, phy_addr, reg, value) \
rv = reduce_hsl_phy_set(dev,phy_addr,reg,value);
extern sw_error_t hsl_phy_i2c_get(a_uint32_t dev,a_uint32_t phy_addr,a_uint32_t reg,a_uint16_t* value);
#define HSL_PHY_I2C_GET(rv, dev, phy_addr, reg, value) \
rv = hsl_phy_i2c_get(dev,phy_addr,reg,value);
extern sw_error_t hsl_phy_i2c_set(a_uint32_t dev,a_uint32_t phy_addr,a_uint32_t reg,a_uint16_t value);
#define HSL_PHY_I2C_SET(rv, dev, phy_addr, reg, value) \
rv = hsl_phy_i2c_set(dev,phy_addr,reg,value);
/*qca808x_end*/
#else
#define HSL_REG_ENTRY_GET(rv, dev, reg, index, value, val_len) \
do { \
hsl_api_t *p_api = hsl_api_ptr_get(dev); \
if (p_api) { \
rv = p_api->reg_get(dev, reg##_OFFSET + ((a_uint32_t)index) * reg##_E_OFFSET,\
(a_uint8_t*)value, (a_uint8_t)val_len); \
} else { \
rv = SW_NOT_INITIALIZED; \
} \
} while (0);
#define HSL_REG_ENTRY_SET(rv, dev, reg, index, value, val_len) \
do { \
hsl_api_t *p_api = hsl_api_ptr_get(dev); \
if (p_api) { \
rv = p_api->reg_set (dev, reg##_OFFSET + ((a_uint32_t)index) * reg##_E_OFFSET,\
(a_uint8_t*)value, (a_uint8_t)val_len); \
} else { \
rv = SW_NOT_INITIALIZED; \
} \
} while (0);
#define HSL_REG_FIELD_GET(rv, dev, reg, index, field, value, val_len) \
do { \
hsl_api_t *p_api = hsl_api_ptr_get(dev); \
if (p_api) { \
rv = p_api->reg_field_get(dev, reg##_OFFSET + ((a_uint32_t)index) * reg##_E_OFFSET,\
reg##_##field##_BOFFSET, \
reg##_##field##_BLEN, (a_uint8_t*)value, val_len);\
} else { \
rv = SW_NOT_INITIALIZED; \
} \
} while (0);
#define HSL_REG_FIELD_SET(rv, dev, reg, index, field, value, val_len) \
do { \
hsl_api_t *p_api = hsl_api_ptr_get(dev); \
if (p_api){ \
rv = p_api->reg_field_set(dev, reg##_OFFSET + ((a_uint32_t)index) * reg##_E_OFFSET,\
reg##_##field##_BOFFSET, \
reg##_##field##_BLEN, (a_uint8_t*)value, val_len);\
} else { \
rv = SW_NOT_INITIALIZED; \
} \
} while (0);
#define HSL_REG_ENTRY_GEN_GET(rv, dev, addr, reg_len, value, val_len) \
do { \
hsl_api_t *p_api = hsl_api_ptr_get(dev); \
if (p_api) { \
rv = p_api->reg_get(dev, addr, (a_uint8_t*)value, val_len);\
} else { \
rv = SW_NOT_INITIALIZED; \
} \
} while (0);
#define HSL_REG_ENTRY_GEN_SET(rv, dev, addr, reg_len, value, val_len) \
do { \
hsl_api_t *p_api = hsl_api_ptr_get(dev); \
if (p_api) { \
rv = p_api->reg_set(dev, addr, (a_uint8_t*)value, val_len); \
} else { \
rv = SW_NOT_INITIALIZED; \
} \
} while (0);
#define HSL_REG_FIELD_GEN_GET(rv, dev, regaddr, bitlength, bitoffset, value, val_len) \
do { \
hsl_api_t *p_api = hsl_api_ptr_get(dev); \
if (p_api) { \
rv = p_api->reg_field_get(dev, regaddr, bitoffset, bitlength, \
(a_uint8_t *) value, val_len);\
} else { \
rv = SW_NOT_INITIALIZED; \
} \
} while (0);
#define HSL_REG_FIELD_GEN_SET(rv, dev, regaddr, bitlength, bitoffset, value, val_len) \
do { \
hsl_api_t *p_api = hsl_api_ptr_get(dev); \
if (p_api) {\
rv = p_api->reg_field_set(dev, regaddr, bitoffset, bitlength, \
(a_uint8_t *) value, val_len);\
} else { \
rv = SW_NOT_INITIALIZED; \
} \
} while (0);
#define HSL_PHY_GET(rv, dev, phy_addr, reg, value) \
do { \
hsl_api_t *p_api = hsl_api_ptr_get(dev); \
if (p_api) { \
rv = p_api->phy_get(dev, phy_addr, reg, value); \
} else { \
rv = SW_NOT_INITIALIZED; \
} \
} while (0);
#define HSL_PHY_SET(rv, dev, phy_addr, reg, value) \
do { \
hsl_api_t *p_api = hsl_api_ptr_get(dev); \
if (p_api) { \
rv = p_api->phy_set(dev, phy_addr, reg, value); \
} else { \
rv = SW_NOT_INITIALIZED; \
} \
} while (0);
#endif
/*qca808x_start*/
#if (defined(API_LOCK) \
&& (defined(HSL_STANDALONG) || (defined(KERNEL_MODULE) && defined(USER_MODE))))
extern aos_lock_t sw_hsl_api_lock;
#define HSL_API_LOCK aos_lock(&sw_hsl_api_lock)
#define HSL_API_UNLOCK aos_unlock(&sw_hsl_api_lock)
#else
#define HSL_API_LOCK
#define HSL_API_UNLOCK
#endif
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _HSL_H */
/*qca808x_end*/