blob: a9f599dbca25b0bded3b399026998059110630bd [file] [log] [blame] [edit]
/* SPDX-License-Identifier: GPL-2.0-or-later */
#ifndef __MXL862XX_API_H
#define __MXL862XX_API_H
#include <linux/if_ether.h>
/**
* struct mdio_relay_data - relayed access to the switch internal MDIO bus
* @data: data to be read or written
* @phy: PHY index
* @mmd: MMD device
* @reg: register index
*/
struct mdio_relay_data {
__le16 data;
u8 phy;
u8 mmd;
__le16 reg;
} __packed;
/**
* struct mxl862xx_register_mod - Register access parameter to directly
* modify internal registers
* @addr: Register address offset for modification
* @data: Value to write to the register address
* @mask: Mask of bits to be modified (1 to modify, 0 to ignore)
*
* Used for direct register modification operations.
*/
struct mxl862xx_register_mod {
__le16 addr;
__le16 data;
__le16 mask;
} __packed;
/**
* enum mxl862xx_mac_clear_type - MAC table clear type
* @MXL862XX_MAC_CLEAR_PHY_PORT: clear dynamic entries based on port_id
* @MXL862XX_MAC_CLEAR_DYNAMIC: clear all dynamic entries
*/
enum mxl862xx_mac_clear_type {
MXL862XX_MAC_CLEAR_PHY_PORT = 0,
MXL862XX_MAC_CLEAR_DYNAMIC,
};
/**
* struct mxl862xx_mac_table_clear - MAC table clear
* @type: see &enum mxl862xx_mac_clear_type
* @port_id: physical port id
*/
struct mxl862xx_mac_table_clear {
u8 type;
u8 port_id;
} __packed;
/**
* enum mxl862xx_age_timer - Aging Timer Value.
* @MXL862XX_AGETIMER_1_SEC: 1 second aging time
* @MXL862XX_AGETIMER_10_SEC: 10 seconds aging time
* @MXL862XX_AGETIMER_300_SEC: 300 seconds aging time
* @MXL862XX_AGETIMER_1_HOUR: 1 hour aging time
* @MXL862XX_AGETIMER_1_DAY: 24 hours aging time
* @MXL862XX_AGETIMER_CUSTOM: Custom aging time in seconds
*/
enum mxl862xx_age_timer {
MXL862XX_AGETIMER_1_SEC = 1,
MXL862XX_AGETIMER_10_SEC,
MXL862XX_AGETIMER_300_SEC,
MXL862XX_AGETIMER_1_HOUR,
MXL862XX_AGETIMER_1_DAY,
MXL862XX_AGETIMER_CUSTOM,
};
/**
* struct mxl862xx_bridge_alloc - Bridge Allocation
* @bridge_id: If the bridge allocation is successful, a valid ID will be
* returned in this field. Otherwise, INVALID_HANDLE is
* returned. For bridge free, this field should contain a
* valid ID returned by the bridge allocation. ID 0 is not
* used for historic reasons.
*
* Used by MXL862XX_BRIDGE_ALLOC and MXL862XX_BRIDGE_FREE.
*/
struct mxl862xx_bridge_alloc {
__le16 bridge_id;
};
/**
* enum mxl862xx_bridge_config_mask - Bridge configuration mask
* @MXL862XX_BRIDGE_CONFIG_MASK_MAC_LEARNING_LIMIT:
* Mask for mac_learning_limit_enable and mac_learning_limit.
* @MXL862XX_BRIDGE_CONFIG_MASK_MAC_LEARNED_COUNT:
* Mask for mac_learning_count
* @MXL862XX_BRIDGE_CONFIG_MASK_MAC_DISCARD_COUNT:
* Mask for learning_discard_event
* @MXL862XX_BRIDGE_CONFIG_MASK_SUB_METER:
* Mask for sub_metering_enable and traffic_sub_meter_id
* @MXL862XX_BRIDGE_CONFIG_MASK_FORWARDING_MODE:
* Mask for forward_broadcast, forward_unknown_multicast_ip,
* forward_unknown_multicast_non_ip and forward_unknown_unicast.
* @MXL862XX_BRIDGE_CONFIG_MASK_ALL: Enable all
* @MXL862XX_BRIDGE_CONFIG_MASK_FORCE: Bypass any check for debug purpose
*/
enum mxl862xx_bridge_config_mask {
MXL862XX_BRIDGE_CONFIG_MASK_MAC_LEARNING_LIMIT = BIT(0),
MXL862XX_BRIDGE_CONFIG_MASK_MAC_LEARNED_COUNT = BIT(1),
MXL862XX_BRIDGE_CONFIG_MASK_MAC_DISCARD_COUNT = BIT(2),
MXL862XX_BRIDGE_CONFIG_MASK_SUB_METER = BIT(3),
MXL862XX_BRIDGE_CONFIG_MASK_FORWARDING_MODE = BIT(4),
MXL862XX_BRIDGE_CONFIG_MASK_ALL = 0x7FFFFFFF,
MXL862XX_BRIDGE_CONFIG_MASK_FORCE = BIT(31)
};
/**
* enum mxl862xx_bridge_port_egress_meter - Meters for egress traffic type
* @MXL862XX_BRIDGE_PORT_EGRESS_METER_BROADCAST:
* Index of broadcast traffic meter
* @MXL862XX_BRIDGE_PORT_EGRESS_METER_MULTICAST:
* Index of known multicast traffic meter
* @MXL862XX_BRIDGE_PORT_EGRESS_METER_UNKNOWN_MC_IP:
* Index of unknown multicast IP traffic meter
* @MXL862XX_BRIDGE_PORT_EGRESS_METER_UNKNOWN_MC_NON_IP:
* Index of unknown multicast non-IP traffic meter
* @MXL862XX_BRIDGE_PORT_EGRESS_METER_UNKNOWN_UC:
* Index of unknown unicast traffic meter
* @MXL862XX_BRIDGE_PORT_EGRESS_METER_OTHERS:
* Index of traffic meter for other types
* @MXL862XX_BRIDGE_PORT_EGRESS_METER_MAX: Number of index
*/
enum mxl862xx_bridge_port_egress_meter {
MXL862XX_BRIDGE_PORT_EGRESS_METER_BROADCAST = 0,
MXL862XX_BRIDGE_PORT_EGRESS_METER_MULTICAST,
MXL862XX_BRIDGE_PORT_EGRESS_METER_UNKNOWN_MC_IP,
MXL862XX_BRIDGE_PORT_EGRESS_METER_UNKNOWN_MC_NON_IP,
MXL862XX_BRIDGE_PORT_EGRESS_METER_UNKNOWN_UC,
MXL862XX_BRIDGE_PORT_EGRESS_METER_OTHERS,
MXL862XX_BRIDGE_PORT_EGRESS_METER_MAX,
};
/**
* enum mxl862xx_bridge_forward_mode - Bridge forwarding type of packet
* @MXL862XX_BRIDGE_FORWARD_FLOOD: Packet is flooded to port members of
* ingress bridge port
* @MXL862XX_BRIDGE_FORWARD_DISCARD: Packet is discarded
*/
enum mxl862xx_bridge_forward_mode {
MXL862XX_BRIDGE_FORWARD_FLOOD = 0,
MXL862XX_BRIDGE_FORWARD_DISCARD,
};
/**
* struct mxl862xx_bridge_config - Bridge Configuration
* @bridge_id: Bridge ID (FID)
* @mask: See &enum mxl862xx_bridge_config_mask
* @mac_learning_limit_enable: Enable MAC learning limitation
* @mac_learning_limit: Max number of MAC addresses that can be learned in
* this bridge (all bridge ports)
* @mac_learning_count: Number of MAC addresses learned from this bridge
* @learning_discard_event: Number of learning discard events due to
* hardware resource not available
* @sub_metering_enable: Traffic metering on type of traffic (such as
* broadcast, multicast, unknown unicast, etc) applies
* @traffic_sub_meter_id: Meter for bridge process with specific type (such
* as broadcast, multicast, unknown unicast, etc)
* @forward_broadcast: Forwarding mode of broadcast traffic. See
* &enum mxl862xx_bridge_forward_mode
* @forward_unknown_multicast_ip: Forwarding mode of unknown multicast IP
* traffic.
* See &enum mxl862xx_bridge_forward_mode
* @forward_unknown_multicast_non_ip: Forwarding mode of unknown multicast
* non-IP traffic.
* See &enum mxl862xx_bridge_forward_mode
* @forward_unknown_unicast: Forwarding mode of unknown unicast traffic. See
* &enum mxl862xx_bridge_forward_mode
*/
struct mxl862xx_bridge_config {
__le16 bridge_id;
__le32 mask; /* enum mxl862xx_bridge_config_mask */
u8 mac_learning_limit_enable;
__le16 mac_learning_limit;
__le16 mac_learning_count;
__le32 learning_discard_event;
u8 sub_metering_enable[MXL862XX_BRIDGE_PORT_EGRESS_METER_MAX];
__le16 traffic_sub_meter_id[MXL862XX_BRIDGE_PORT_EGRESS_METER_MAX];
__le32 forward_broadcast; /* enum mxl862xx_bridge_forward_mode */
__le32 forward_unknown_multicast_ip; /* enum mxl862xx_bridge_forward_mode */
__le32 forward_unknown_multicast_non_ip; /* enum mxl862xx_bridge_forward_mode */
__le32 forward_unknown_unicast; /* enum mxl862xx_bridge_forward_mode */
} __packed;
/**
* struct mxl862xx_bridge_port_alloc - Bridge Port Allocation
* @bridge_port_id: If the bridge port allocation is successful, a valid ID
* will be returned in this field. Otherwise, INVALID_HANDLE
* is returned. For bridge port free, this field should
* contain a valid ID returned by the bridge port allocation.
*
* Used by MXL862XX_BRIDGE_PORT_ALLOC and MXL862XX_BRIDGE_PORT_FREE.
*/
struct mxl862xx_bridge_port_alloc {
__le16 bridge_port_id;
};
/**
* enum mxl862xx_bridge_port_config_mask - Bridge Port configuration mask
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_BRIDGE_ID:
* Mask for bridge_id
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_INGRESS_VLAN:
* Mask for ingress_extended_vlan_enable,
* ingress_extended_vlan_block_id and ingress_extended_vlan_block_size
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_EGRESS_VLAN:
* Mask for egress_extended_vlan_enable, egress_extended_vlan_block_id
* and egress_extended_vlan_block_size
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_INGRESS_MARKING:
* Mask for ingress_marking_mode
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_EGRESS_REMARKING:
* Mask for egress_remarking_mode
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_INGRESS_METER:
* Mask for ingress_metering_enable and ingress_traffic_meter_id
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_EGRESS_SUB_METER:
* Mask for egress_sub_metering_enable and egress_traffic_sub_meter_id
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_EGRESS_CTP_MAPPING:
* Mask for dest_logical_port_id, pmapper_enable, dest_sub_if_id_group,
* pmapper_mapping_mode, pmapper_id_valid and pmapper
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_BRIDGE_PORT_MAP:
* Mask for bridge_port_map
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_MC_DEST_IP_LOOKUP:
* Mask for mc_dest_ip_lookup_disable
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_MC_SRC_IP_LOOKUP:
* Mask for mc_src_ip_lookup_enable
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_MC_DEST_MAC_LOOKUP:
* Mask for dest_mac_lookup_disable
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_MC_SRC_MAC_LEARNING:
* Mask for src_mac_learning_disable
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_MAC_SPOOFING:
* Mask for mac_spoofing_detect_enable
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_PORT_LOCK:
* Mask for port_lock_enable
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_MAC_LEARNING_LIMIT:
* Mask for mac_learning_limit_enable and mac_learning_limit
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_MAC_LEARNED_COUNT:
* Mask for mac_learning_count
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_INGRESS_VLAN_FILTER:
* Mask for ingress_vlan_filter_enable, ingress_vlan_filter_block_id
* and ingress_vlan_filter_block_size
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_EGRESS_VLAN_FILTER1:
* Mask for bypass_egress_vlan_filter1, egress_vlan_filter1enable,
* egress_vlan_filter1block_id and egress_vlan_filter1block_size
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_EGRESS_VLAN_FILTER2:
* Mask for egress_vlan_filter2enable, egress_vlan_filter2block_id and
* egress_vlan_filter2block_size
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_VLAN_BASED_MAC_LEARNING:
* Mask for vlan_tag_selection, vlan_src_mac_priority_enable,
* vlan_src_mac_dei_enable, vlan_src_mac_vid_enable,
* vlan_dst_mac_priority_enable, vlan_dst_mac_dei_enable and
* vlan_dst_mac_vid_enable
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_VLAN_BASED_MULTICAST_LOOKUP:
* Mask for vlan_multicast_priority_enable,
* vlan_multicast_dei_enable and vlan_multicast_vid_enable
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_LOOP_VIOLATION_COUNTER:
* Mask for loop_violation_count
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_ALL: Enable all
* @MXL862XX_BRIDGE_PORT_CONFIG_MASK_FORCE: Bypass any check for debug purpose
*/
enum mxl862xx_bridge_port_config_mask {
MXL862XX_BRIDGE_PORT_CONFIG_MASK_BRIDGE_ID = BIT(0),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_INGRESS_VLAN = BIT(1),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_EGRESS_VLAN = BIT(2),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_INGRESS_MARKING = BIT(3),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_EGRESS_REMARKING = BIT(4),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_INGRESS_METER = BIT(5),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_EGRESS_SUB_METER = BIT(6),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_EGRESS_CTP_MAPPING = BIT(7),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_BRIDGE_PORT_MAP = BIT(8),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_MC_DEST_IP_LOOKUP = BIT(9),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_MC_SRC_IP_LOOKUP = BIT(10),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_MC_DEST_MAC_LOOKUP = BIT(11),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_MC_SRC_MAC_LEARNING = BIT(12),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_MAC_SPOOFING = BIT(13),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_PORT_LOCK = BIT(14),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_MAC_LEARNING_LIMIT = BIT(15),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_MAC_LEARNED_COUNT = BIT(16),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_INGRESS_VLAN_FILTER = BIT(17),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_EGRESS_VLAN_FILTER1 = BIT(18),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_EGRESS_VLAN_FILTER2 = BIT(19),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_VLAN_BASED_MAC_LEARNING = BIT(20),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_VLAN_BASED_MULTICAST_LOOKUP = BIT(21),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_LOOP_VIOLATION_COUNTER = BIT(22),
MXL862XX_BRIDGE_PORT_CONFIG_MASK_ALL = 0x7FFFFFFF,
MXL862XX_BRIDGE_PORT_CONFIG_MASK_FORCE = BIT(31)
};
/**
* enum mxl862xx_color_marking_mode - Color Marking Mode
* @MXL862XX_MARKING_ALL_GREEN: mark packets (except critical) to green
* @MXL862XX_MARKING_INTERNAL_MARKING: do not change color and priority
* @MXL862XX_MARKING_DEI: DEI mark mode
* @MXL862XX_MARKING_PCP_8P0D: PCP 8P0D mark mode
* @MXL862XX_MARKING_PCP_7P1D: PCP 7P1D mark mode
* @MXL862XX_MARKING_PCP_6P2D: PCP 6P2D mark mode
* @MXL862XX_MARKING_PCP_5P3D: PCP 5P3D mark mode
* @MXL862XX_MARKING_DSCP_AF: DSCP AF class
*/
enum mxl862xx_color_marking_mode {
MXL862XX_MARKING_ALL_GREEN = 0,
MXL862XX_MARKING_INTERNAL_MARKING,
MXL862XX_MARKING_DEI,
MXL862XX_MARKING_PCP_8P0D,
MXL862XX_MARKING_PCP_7P1D,
MXL862XX_MARKING_PCP_6P2D,
MXL862XX_MARKING_PCP_5P3D,
MXL862XX_MARKING_DSCP_AF,
};
/**
* enum mxl862xx_color_remarking_mode - Color Remarking Mode
* @MXL862XX_REMARKING_NONE: values from last process stage
* @MXL862XX_REMARKING_DEI: DEI mark mode
* @MXL862XX_REMARKING_PCP_8P0D: PCP 8P0D mark mode
* @MXL862XX_REMARKING_PCP_7P1D: PCP 7P1D mark mode
* @MXL862XX_REMARKING_PCP_6P2D: PCP 6P2D mark mode
* @MXL862XX_REMARKING_PCP_5P3D: PCP 5P3D mark mode
* @MXL862XX_REMARKING_DSCP_AF: DSCP AF class
*/
enum mxl862xx_color_remarking_mode {
MXL862XX_REMARKING_NONE = 0,
MXL862XX_REMARKING_DEI = 2,
MXL862XX_REMARKING_PCP_8P0D,
MXL862XX_REMARKING_PCP_7P1D,
MXL862XX_REMARKING_PCP_6P2D,
MXL862XX_REMARKING_PCP_5P3D,
MXL862XX_REMARKING_DSCP_AF,
};
/**
* enum mxl862xx_pmapper_mapping_mode - P-mapper Mapping Mode
* @MXL862XX_PMAPPER_MAPPING_PCP: Use PCP for VLAN tagged packets to derive
* sub interface ID group
* @MXL862XX_PMAPPER_MAPPING_LAG: Use LAG Index for Pmapper access
* regardless of IP and VLAN packet
* @MXL862XX_PMAPPER_MAPPING_DSCP: Use DSCP for VLAN tagged IP packets to
* derive sub interface ID group
*/
enum mxl862xx_pmapper_mapping_mode {
MXL862XX_PMAPPER_MAPPING_PCP = 0,
MXL862XX_PMAPPER_MAPPING_LAG,
MXL862XX_PMAPPER_MAPPING_DSCP,
};
/**
* struct mxl862xx_pmapper - P-mapper Configuration
* @pmapper_id: Index of P-mapper (0-31)
* @dest_sub_if_id_group: Sub interface ID group. Entry 0 is for non-IP and
* non-VLAN tagged packets.
* Entries 1-8 are PCP mapping entries for VLAN tagged
* packets.
* Entries 9-72 are DSCP or LAG mapping entries.
*
* Used by CTP port config and bridge port config. In case of LAG, it is
* user's responsibility to provide the mapped entries in given P-mapper
* table. In other modes the entries are auto mapped from input packet.
*/
struct mxl862xx_pmapper {
__le16 pmapper_id;
u8 dest_sub_if_id_group[73];
} __packed;
/**
* struct mxl862xx_bridge_port_config - Bridge Port Configuration
* @bridge_port_id: Bridge Port ID allocated by bridge port allocation
* @mask: See &enum mxl862xx_bridge_port_config_mask
* @bridge_id: Bridge ID (FID) to which this bridge port is associated
* @ingress_extended_vlan_enable: Enable extended VLAN processing for
* ingress traffic
* @ingress_extended_vlan_block_id: Extended VLAN block allocated for
* ingress traffic
* @ingress_extended_vlan_block_size: Extended VLAN block size for ingress
* traffic
* @egress_extended_vlan_enable: Enable extended VLAN processing for egress
* traffic
* @egress_extended_vlan_block_id: Extended VLAN block allocated for egress
* traffic
* @egress_extended_vlan_block_size: Extended VLAN block size for egress
* traffic
* @ingress_marking_mode: Ingress color marking mode. See
* &enum mxl862xx_color_marking_mode
* @egress_remarking_mode: Color remarking for egress traffic. See
* &enum mxl862xx_color_remarking_mode
* @ingress_metering_enable: Traffic metering on ingress traffic applies
* @ingress_traffic_meter_id: Meter for ingress Bridge Port process
* @egress_sub_metering_enable: Traffic metering on various types of egress
* traffic
* @egress_traffic_sub_meter_id: Meter for egress Bridge Port process with
* specific type
* @dest_logical_port_id: Destination logical port
* @pmapper_enable: Enable P-mapper
* @dest_sub_if_id_group: Destination sub interface ID group when
* pmapper_enable is false
* @pmapper_mapping_mode: P-mapper mapping mode. See
* &enum mxl862xx_pmapper_mapping_mode
* @pmapper_id_valid: When true, P-mapper is re-used; when false,
* allocation is handled by API
* @pmapper: P-mapper configuration used when pmapper_enable is true
* @bridge_port_map: Port map defining broadcast domain. Each bit
* represents one bridge port. Bridge port ID is
* index * 16 + bit offset.
* @mc_dest_ip_lookup_disable: Disable multicast IP destination table
* lookup
* @mc_src_ip_lookup_enable: Enable multicast IP source table lookup
* @dest_mac_lookup_disable: Disable destination MAC lookup; packet treated
* as unknown
* @src_mac_learning_disable: Disable source MAC address learning
* @mac_spoofing_detect_enable: Enable MAC spoofing detection
* @port_lock_enable: Enable port locking
* @mac_learning_limit_enable: Enable MAC learning limitation
* @mac_learning_limit: Maximum number of MAC addresses that can be learned
* from this bridge port
* @loop_violation_count: Number of loop violation events from this bridge
* port
* @mac_learning_count: Number of MAC addresses learned from this bridge
* port
* @ingress_vlan_filter_enable: Enable ingress VLAN filter
* @ingress_vlan_filter_block_id: VLAN filter block of ingress traffic
* @ingress_vlan_filter_block_size: VLAN filter block size for ingress
* traffic
* @bypass_egress_vlan_filter1: For ingress traffic, bypass VLAN filter 1
* at egress bridge port processing
* @egress_vlan_filter1enable: Enable egress VLAN filter 1
* @egress_vlan_filter1block_id: VLAN filter block 1 of egress traffic
* @egress_vlan_filter1block_size: VLAN filter block 1 size
* @egress_vlan_filter2enable: Enable egress VLAN filter 2
* @egress_vlan_filter2block_id: VLAN filter block 2 of egress traffic
* @egress_vlan_filter2block_size: VLAN filter block 2 size
* @vlan_tag_selection: VLAN tag selection for MAC address/multicast
* learning, lookup and filtering.
* 0 - Intermediate outer VLAN tag is used.
* 1 - Original outer VLAN tag is used.
* @vlan_src_mac_priority_enable: Enable VLAN Priority field for source MAC
* learning and filtering
* @vlan_src_mac_dei_enable: Enable VLAN DEI/CFI field for source MAC
* learning and filtering
* @vlan_src_mac_vid_enable: Enable VLAN ID field for source MAC learning
* and filtering
* @vlan_dst_mac_priority_enable: Enable VLAN Priority field for destination
* MAC lookup and filtering
* @vlan_dst_mac_dei_enable: Enable VLAN CFI/DEI field for destination MAC
* lookup and filtering
* @vlan_dst_mac_vid_enable: Enable VLAN ID field for destination MAC lookup
* and filtering
* @vlan_multicast_priority_enable: Enable VLAN Priority field for IP
* multicast lookup
* @vlan_multicast_dei_enable: Enable VLAN CFI/DEI field for IP multicast
* lookup
* @vlan_multicast_vid_enable: Enable VLAN ID field for IP multicast lookup
*/
struct mxl862xx_bridge_port_config {
__le16 bridge_port_id;
__le32 mask; /* enum mxl862xx_bridge_port_config_mask */
__le16 bridge_id;
u8 ingress_extended_vlan_enable;
__le16 ingress_extended_vlan_block_id;
__le16 ingress_extended_vlan_block_size;
u8 egress_extended_vlan_enable;
__le16 egress_extended_vlan_block_id;
__le16 egress_extended_vlan_block_size;
__le32 ingress_marking_mode; /* enum mxl862xx_color_marking_mode */
__le32 egress_remarking_mode; /* enum mxl862xx_color_remarking_mode */
u8 ingress_metering_enable;
__le16 ingress_traffic_meter_id;
u8 egress_sub_metering_enable[MXL862XX_BRIDGE_PORT_EGRESS_METER_MAX];
__le16 egress_traffic_sub_meter_id[MXL862XX_BRIDGE_PORT_EGRESS_METER_MAX];
u8 dest_logical_port_id;
u8 pmapper_enable;
__le16 dest_sub_if_id_group;
__le32 pmapper_mapping_mode; /* enum mxl862xx_pmapper_mapping_mode */
u8 pmapper_id_valid;
struct mxl862xx_pmapper pmapper;
__le16 bridge_port_map[8];
u8 mc_dest_ip_lookup_disable;
u8 mc_src_ip_lookup_enable;
u8 dest_mac_lookup_disable;
u8 src_mac_learning_disable;
u8 mac_spoofing_detect_enable;
u8 port_lock_enable;
u8 mac_learning_limit_enable;
__le16 mac_learning_limit;
__le16 loop_violation_count;
__le16 mac_learning_count;
u8 ingress_vlan_filter_enable;
__le16 ingress_vlan_filter_block_id;
__le16 ingress_vlan_filter_block_size;
u8 bypass_egress_vlan_filter1;
u8 egress_vlan_filter1enable;
__le16 egress_vlan_filter1block_id;
__le16 egress_vlan_filter1block_size;
u8 egress_vlan_filter2enable;
__le16 egress_vlan_filter2block_id;
__le16 egress_vlan_filter2block_size;
u8 vlan_tag_selection;
u8 vlan_src_mac_priority_enable;
u8 vlan_src_mac_dei_enable;
u8 vlan_src_mac_vid_enable;
u8 vlan_dst_mac_priority_enable;
u8 vlan_dst_mac_dei_enable;
u8 vlan_dst_mac_vid_enable;
u8 vlan_multicast_priority_enable;
u8 vlan_multicast_dei_enable;
u8 vlan_multicast_vid_enable;
} __packed;
/**
* struct mxl862xx_cfg - Global Switch configuration Attributes
* @mac_table_age_timer: See &enum mxl862xx_age_timer
* @age_timer: Custom MAC table aging timer in seconds
* @max_packet_len: Maximum Ethernet packet length
* @learning_limit_action: Automatic MAC address table learning limitation
* consecutive action
* @mac_locking_action: Accept or discard MAC port locking violation
* packets
* @mac_spoofing_action: Accept or discard MAC spoofing and port MAC locking
* violation packets
* @pause_mac_mode_src: Pause frame MAC source address mode
* @pause_mac_src: Pause frame MAC source address
*/
struct mxl862xx_cfg {
__le32 mac_table_age_timer; /* enum mxl862xx_age_timer */
__le32 age_timer;
__le16 max_packet_len;
u8 learning_limit_action;
u8 mac_locking_action;
u8 mac_spoofing_action;
u8 pause_mac_mode_src;
u8 pause_mac_src[ETH_ALEN];
} __packed;
/**
* enum mxl862xx_ss_sp_tag_mask - Special tag valid field indicator bits
* @MXL862XX_SS_SP_TAG_MASK_RX: valid RX special tag mode
* @MXL862XX_SS_SP_TAG_MASK_TX: valid TX special tag mode
* @MXL862XX_SS_SP_TAG_MASK_RX_PEN: valid RX special tag info over preamble
* @MXL862XX_SS_SP_TAG_MASK_TX_PEN: valid TX special tag info over preamble
*/
enum mxl862xx_ss_sp_tag_mask {
MXL862XX_SS_SP_TAG_MASK_RX = BIT(0),
MXL862XX_SS_SP_TAG_MASK_TX = BIT(1),
MXL862XX_SS_SP_TAG_MASK_RX_PEN = BIT(2),
MXL862XX_SS_SP_TAG_MASK_TX_PEN = BIT(3),
};
/**
* enum mxl862xx_ss_sp_tag_rx - RX special tag mode
* @MXL862XX_SS_SP_TAG_RX_NO_TAG_NO_INSERT: packet does NOT have special
* tag and special tag is NOT inserted
* @MXL862XX_SS_SP_TAG_RX_NO_TAG_INSERT: packet does NOT have special tag
* and special tag is inserted
* @MXL862XX_SS_SP_TAG_RX_TAG_NO_INSERT: packet has special tag and special
* tag is NOT inserted
*/
enum mxl862xx_ss_sp_tag_rx {
MXL862XX_SS_SP_TAG_RX_NO_TAG_NO_INSERT = 0,
MXL862XX_SS_SP_TAG_RX_NO_TAG_INSERT = 1,
MXL862XX_SS_SP_TAG_RX_TAG_NO_INSERT = 2,
};
/**
* enum mxl862xx_ss_sp_tag_tx - TX special tag mode
* @MXL862XX_SS_SP_TAG_TX_NO_TAG_NO_REMOVE: packet does NOT have special
* tag and special tag is NOT removed
* @MXL862XX_SS_SP_TAG_TX_TAG_REPLACE: packet has special tag and special
* tag is replaced
* @MXL862XX_SS_SP_TAG_TX_TAG_NO_REMOVE: packet has special tag and special
* tag is NOT removed
* @MXL862XX_SS_SP_TAG_TX_TAG_REMOVE: packet has special tag and special
* tag is removed
*/
enum mxl862xx_ss_sp_tag_tx {
MXL862XX_SS_SP_TAG_TX_NO_TAG_NO_REMOVE = 0,
MXL862XX_SS_SP_TAG_TX_TAG_REPLACE = 1,
MXL862XX_SS_SP_TAG_TX_TAG_NO_REMOVE = 2,
MXL862XX_SS_SP_TAG_TX_TAG_REMOVE = 3,
};
/**
* enum mxl862xx_ss_sp_tag_rx_pen - RX special tag info over preamble
* @MXL862XX_SS_SP_TAG_RX_PEN_ALL_0: special tag info inserted from byte 2
* to 7 are all 0
* @MXL862XX_SS_SP_TAG_RX_PEN_BYTE_5_IS_16: special tag byte 5 is 16, other
* bytes from 2 to 7 are 0
* @MXL862XX_SS_SP_TAG_RX_PEN_BYTE_5_FROM_PREAMBLE: special tag byte 5 is
* from preamble field, others
* are 0
* @MXL862XX_SS_SP_TAG_RX_PEN_BYTE_2_TO_7_FROM_PREAMBLE: special tag byte 2
* to 7 are from preamble
* field
*/
enum mxl862xx_ss_sp_tag_rx_pen {
MXL862XX_SS_SP_TAG_RX_PEN_ALL_0 = 0,
MXL862XX_SS_SP_TAG_RX_PEN_BYTE_5_IS_16 = 1,
MXL862XX_SS_SP_TAG_RX_PEN_BYTE_5_FROM_PREAMBLE = 2,
MXL862XX_SS_SP_TAG_RX_PEN_BYTE_2_TO_7_FROM_PREAMBLE = 3,
};
/**
* struct mxl862xx_ss_sp_tag - Special tag port settings
* @pid: port ID (1~16)
* @mask: See &enum mxl862xx_ss_sp_tag_mask
* @rx: See &enum mxl862xx_ss_sp_tag_rx
* @tx: See &enum mxl862xx_ss_sp_tag_tx
* @rx_pen: See &enum mxl862xx_ss_sp_tag_rx_pen
* @tx_pen: TX special tag info over preamble
* 0 - disabled
* 1 - enabled
*/
struct mxl862xx_ss_sp_tag {
u8 pid;
u8 mask; /* enum mxl862xx_ss_sp_tag_mask */
u8 rx; /* enum mxl862xx_ss_sp_tag_rx */
u8 tx; /* enum mxl862xx_ss_sp_tag_tx */
u8 rx_pen; /* enum mxl862xx_ss_sp_tag_rx_pen */
u8 tx_pen; /* boolean */
} __packed;
/**
* enum mxl862xx_logical_port_mode - Logical port mode
* @MXL862XX_LOGICAL_PORT_8BIT_WLAN: WLAN with 8-bit station ID
* @MXL862XX_LOGICAL_PORT_9BIT_WLAN: WLAN with 9-bit station ID
* @MXL862XX_LOGICAL_PORT_ETHERNET: Ethernet port
* @MXL862XX_LOGICAL_PORT_OTHER: Others
*/
enum mxl862xx_logical_port_mode {
MXL862XX_LOGICAL_PORT_8BIT_WLAN = 0,
MXL862XX_LOGICAL_PORT_9BIT_WLAN,
MXL862XX_LOGICAL_PORT_ETHERNET,
MXL862XX_LOGICAL_PORT_OTHER = 0xFF,
};
/**
* struct mxl862xx_ctp_port_assignment - CTP Port Assignment/association
* with logical port
* @logical_port_id: Logical Port Id. The valid range is hardware dependent
* @first_ctp_port_id: First CTP (Connectivity Termination Port) ID mapped
* to above logical port ID
* @number_of_ctp_port: Total number of CTP Ports mapped above logical port
* ID
* @mode: Logical port mode to define sub interface ID format. See
* &enum mxl862xx_logical_port_mode
* @bridge_port_id: Bridge Port ID (not FID). For allocation, each CTP
* allocated is mapped to the Bridge Port given by this field.
* The Bridge Port will be configured to use first CTP as
* egress CTP.
*/
struct mxl862xx_ctp_port_assignment {
u8 logical_port_id;
__le16 first_ctp_port_id;
__le16 number_of_ctp_port;
__le32 mode; /* enum mxl862xx_logical_port_mode */
__le16 bridge_port_id;
} __packed;
/**
* struct mxl862xx_sys_fw_image_version - Firmware version information
* @iv_major: firmware major version
* @iv_minor: firmware minor version
* @iv_revision: firmware revision
* @iv_build_num: firmware build number
*/
struct mxl862xx_sys_fw_image_version {
u8 iv_major;
u8 iv_minor;
__le16 iv_revision;
__le32 iv_build_num;
} __packed;
#endif /* __MXL862XX_API_H */