blob: 64a886f8fb486a7a2bf9e622f0fa27a82dd594a3 [file] [log] [blame]
#include <Copyright.h>
/********************************************************************************
* gtBrgVlan.c
*
* DESCRIPTION:
* API definitions to handle port-based vlan configuration.
*
* DEPENDENCIES:
*
* FILE REVISION NUMBER:
* $Revision: 5 $
*******************************************************************************/
#include <msApi.h>
#include <gtHwCntl.h>
#include <gtDrvSwRegs.h>
/*******************************************************************************
* gprtSetEgressMode
*
* DESCRIPTION:
* This routine set the egress mode.
*
* INPUTS:
* port - the logical port number.
* mode - the egress mode.
*
* OUTPUTS:
* None.
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
*
* COMMENTS:
*
*
* GalTis:
*
*******************************************************************************/
GT_STATUS gprtSetEgressMode
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
IN GT_EGRESS_MODE mode
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U16 data; /* Data to be set into the */
/* register. */
GT_U8 phyPort; /* Physical port. */
DBG_INFO(("gprtSetEgressMode Called.\n"));
phyPort = GT_LPORT_2_PORT(port);
/* check if device supports this feature */
if((retVal = IS_VALID_API_CALL(dev,phyPort, DEV_TAGGING)) != GT_OK )
return retVal;
switch (mode)
{
case (GT_UNMODIFY_EGRESS):
data = 0;
break;
case (GT_TAGGED_EGRESS):
data = 2;
break;
case (GT_UNTAGGED_EGRESS):
data = 1;
break;
case (GT_ADD_TAG):
if(!IS_IN_DEV_GROUP(dev,DEV_EGRESS_DOUBLE_TAGGING))
{
DBG_INFO(("GT_NOT_SUPPORTED\n"));
return GT_NOT_SUPPORTED;
}
data = 3;
break;
default:
DBG_INFO(("Failed.\n"));
return GT_FAIL;
}
retVal = hwSetPortRegField(dev,phyPort,QD_REG_PORT_CONTROL,12,2,data);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
DBG_INFO(("OK.\n"));
return GT_OK;
}
/*******************************************************************************
* gprtGetEgressMode
*
* DESCRIPTION:
* This routine get the egress mode.
*
* INPUTS:
* port - the logical port number.
*
* OUTPUTS:
* mode - the egress mode.
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
* GT_BAD_PARAM - on bad parameters
*
* COMMENTS:
* None.
*
* GalTis:
*
*******************************************************************************/
GT_STATUS gprtGetEgressMode
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
OUT GT_EGRESS_MODE *mode
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U16 data; /* The register's read data. */
GT_U8 phyPort; /* Physical port. */
if(mode == NULL)
return GT_BAD_PARAM;
DBG_INFO(("gprtGetEgressMode Called.\n"));
phyPort = GT_LPORT_2_PORT(port);
retVal = hwGetPortRegField(dev,phyPort,QD_REG_PORT_CONTROL,12,2,&data);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
switch (data)
{
case (0):
*mode = GT_UNMODIFY_EGRESS;
break;
case (2):
*mode = GT_TAGGED_EGRESS;
break;
case (1):
*mode = GT_UNTAGGED_EGRESS;
break;
case (3):
*mode = GT_ADD_TAG;
break;
}
DBG_INFO(("OK.\n"));
return GT_OK;
}
/*******************************************************************************
* gprtSetVlanTunnel
*
* DESCRIPTION:
* This routine sets the vlan tunnel mode.
*
* INPUTS:
* port - the logical port number.
* mode - the vlan tunnel mode.
*
* OUTPUTS:
* None.
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
*
* COMMENTS:
*
*
* GalTis:
*
*******************************************************************************/
GT_STATUS gprtSetVlanTunnel
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
IN GT_BOOL mode
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U16 data; /* Data to be set into the */
/* register. */
GT_U8 phyPort; /* Physical port. */
DBG_INFO(("gprtSetVlanTunnel Called.\n"));
phyPort = GT_LPORT_2_PORT(port);
BOOL_2_BIT(mode,data);
retVal = hwSetPortRegField(dev,phyPort,QD_REG_PORT_CONTROL,7,1,data);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
DBG_INFO(("OK.\n"));
return GT_OK;
}
/*******************************************************************************
* gprtGetVlanTunnel
*
* DESCRIPTION:
* This routine get the vlan tunnel mode.
*
* INPUTS:
* port - the logical port number.
*
* OUTPUTS:
* mode - the vlan tunnel mode..
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
* GT_BAD_PARAM - on bad parameters
*
* COMMENTS:
*
*
* GalTis:
*
*******************************************************************************/
GT_STATUS gprtGetVlanTunnel
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
OUT GT_BOOL *mode
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U16 data; /* The register's read data. */
GT_U8 phyPort; /* Physical port. */
DBG_INFO(("gprtGetVlanTunnel Called.\n"));
if(mode == NULL)
{
DBG_INFO(("Failed.\n"));
return GT_BAD_PARAM;
}
phyPort = GT_LPORT_2_PORT(port);
retVal = hwGetPortRegField(dev,phyPort,QD_REG_PORT_CONTROL,7,1,&data);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
BIT_2_BOOL(data,*mode);
DBG_INFO(("OK.\n"));
return GT_OK;
}
/*******************************************************************************
* gvlnSetPortVlanPorts
*
* DESCRIPTION:
* This routine sets the port VLAN group port membership list.
*
* INPUTS:
* port - logical port number to set.
* memPorts - array of logical ports in the same vlan.
* memPortsLen - number of members in memPorts array
*
* OUTPUTS:
* None.
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
* GT_BAD_PARAM - on bad parameters
*
* COMMENTS:
*
* GalTis:
*
*******************************************************************************/
GT_STATUS gvlnSetPortVlanPorts
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
IN GT_LPORT memPorts[],
IN GT_U8 memPortsLen
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U16 data; /* Data to be set into the */
/* register. */
GT_U8 phyPort; /* Physical port. */
GT_U8 i;
DBG_INFO(("gvlnSetPortVlanPorts Called.\n"));
if(memPorts == NULL)
{
DBG_INFO(("Failed.\n"));
return GT_BAD_PARAM;
}
phyPort = GT_LPORT_2_PORT(port);
data = 0;
if(memPortsLen > dev->numOfPorts)
{
DBG_INFO(("Failed (PortsLen Too Big).\n"));
return GT_BAD_PARAM;
}
for(i = 0; i < memPortsLen; i++)
data |= (1 << GT_LPORT_2_PORT(memPorts[i]));
/* numOfPorts = 3 for fullsail, = 10 for octane, = 7 for others */
retVal = hwSetPortRegField(dev,phyPort,QD_REG_PORT_VLAN_MAP,0,dev->maxPorts,data);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
DBG_INFO(("OK.\n"));
return GT_OK;
}
/*******************************************************************************
* gvlnGetPortVlanPorts
*
* DESCRIPTION:
* This routine gets the port VLAN group port membership list.
*
* INPUTS:
* port - logical port number to set.
*
* OUTPUTS:
* memPorts - array of logical ports in the same vlan.
* memPortsLen - number of members in memPorts array
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
* GT_BAD_PARAM - on bad parameters
*
* COMMENTS:
*
* GalTis:
*
*******************************************************************************/
GT_STATUS gvlnGetPortVlanPorts
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
OUT GT_LPORT memPorts[],
OUT GT_U8 *memPortsLen
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U16 data; /* The register's read data. */
GT_U8 phyPort; /* Physical port. */
GT_U8 i;
DBG_INFO(("gvlnGetPortVlanPorts Called.\n"));
if((memPorts == NULL) || (memPortsLen == NULL))
{
DBG_INFO(("Failed.\n"));
return GT_BAD_PARAM;
}
phyPort = GT_LPORT_2_PORT(port);
/* memPortsLen = 3 for fullsail, =7 for others */
retVal = hwGetPortRegField(dev,phyPort,QD_REG_PORT_VLAN_MAP,0,dev->maxPorts,&data);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
i = 0;
for(phyPort = 0; phyPort < dev->maxPorts; phyPort++)
{
if(!GT_IS_PORT_SET(dev->validPortVec, phyPort))
continue;
if(((1 << phyPort) & data) != 0)
{
memPorts[i] = GT_PORT_2_LPORT(phyPort);
i++;
}
}
*memPortsLen = i;
DBG_INFO(("OK.\n"));
return GT_OK;
}
/*******************************************************************************
* gvlnSetPortUserPriLsb
*
* DESCRIPTION:
* This routine Set the user priority (VPT) LSB bit, to be added to the
* user priority on the egress.
*
* INPUTS:
* port - logical port number to set.
* userPriLsb - GT_TRUE for 1, GT_FALSE for 0.
*
* OUTPUTS:
* None.
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
* GT_BAD_PARAM - on bad parameters
*
* COMMENTS:
*
* GalTis:
*
*******************************************************************************/
GT_STATUS gvlnSetPortUserPriLsb
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
IN GT_BOOL userPriLsb
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U16 data; /* Data to be set into the */
/* register. */
GT_U8 phyPort; /* Physical port. */
DBG_INFO(("gvlnSetPortUserPriLsb Called.\n"));
/* Gigabit Switch does not support this status. */
if (IS_IN_DEV_GROUP(dev,DEV_GIGABIT_SWITCH|DEV_ENHANCED_FE_SWITCH))
{
DBG_INFO(("GT_NOT_SUPPORTED\n"));
return GT_NOT_SUPPORTED;
}
phyPort = GT_LPORT_2_PORT(port);
BOOL_2_BIT(userPriLsb,data);
retVal = hwSetPortRegField(dev,phyPort,QD_REG_PVID,13,1,data);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
DBG_INFO(("OK.\n"));
return GT_OK;
}
/*******************************************************************************
* gvlnGetPortUserPriLsb
*
* DESCRIPTION:
* This routine gets the user priority (VPT) LSB bit.
*
* INPUTS:
* port - logical port number to set.
*
* OUTPUTS:
* userPriLsb - GT_TRUE for 1, GT_FALSE for 0.
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
* GT_BAD_PARAM - on bad parameters
*
* COMMENTS:
*
* GalTis:
*
*******************************************************************************/
GT_STATUS gvlnGetPortUserPriLsb
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
OUT GT_BOOL *userPriLsb
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U16 data; /* The register's read data. */
GT_U8 phyPort; /* Physical port. */
DBG_INFO(("gvlnGetPortUserPriLsb Called.\n"));
/* Gigabit Switch does not support this status. */
if (IS_IN_DEV_GROUP(dev,DEV_GIGABIT_SWITCH|DEV_ENHANCED_FE_SWITCH))
{
DBG_INFO(("GT_NOT_SUPPORTED\n"));
return GT_NOT_SUPPORTED;
}
if(userPriLsb == NULL)
{
DBG_INFO(("Failed.\n"));
return GT_BAD_PARAM;
}
phyPort = GT_LPORT_2_PORT(port);
retVal = hwGetPortRegField(dev,phyPort,QD_REG_PVID,13,1,&data);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
BIT_2_BOOL(data,*userPriLsb);
DBG_INFO(("OK.\n"));
return GT_OK;
}
/*******************************************************************************
* gvlnSetPortVid
*
* DESCRIPTION:
* This routine Set the port default vlan id.
*
* INPUTS:
* port - logical port number to set.
* vid - the port vlan id.
*
* OUTPUTS:
* None.
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
* GT_BAD_PARAM - on bad parameters
*
* COMMENTS:
*
* GalTis:
*
*******************************************************************************/
GT_STATUS gvlnSetPortVid
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
IN GT_U16 vid
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U8 phyPort; /* Physical port. */
DBG_INFO(("gvlnSetPortVid Called.\n"));
phyPort = GT_LPORT_2_PORT(port);
retVal = hwSetPortRegField(dev,phyPort,QD_REG_PVID,0,12, vid);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
DBG_INFO(("OK.\n"));
return GT_OK;
}
/*******************************************************************************
* gvlnGetPortVid
*
* DESCRIPTION:
* This routine Get the port default vlan id.
*
* INPUTS:
* port - logical port number to set.
*
* OUTPUTS:
* vid - the port vlan id.
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
* GT_BAD_PARAM - on bad parameters
*
* COMMENTS:
*
* GalTis:
*
*******************************************************************************/
GT_STATUS gvlnGetPortVid
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
OUT GT_U16 *vid
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U16 data; /* The register's read data. */
GT_U8 phyPort; /* Physical port. */
DBG_INFO(("gvlnGetPortVid Called.\n"));
if(vid == NULL)
{
DBG_INFO(("Failed.\n"));
return GT_BAD_PARAM;
}
phyPort = GT_LPORT_2_PORT(port);
retVal = hwGetPortRegField(dev,phyPort,QD_REG_PVID,0,12, &data);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
*vid = data;
DBG_INFO(("OK.\n"));
return GT_OK;
}
/*******************************************************************************
* gvlnSetPortVlanDBNum
*
* DESCRIPTION:
* This routine sets the port's default VLAN database number (DBNum or
* FID, Forwarding Information Database).
*
* INPUTS:
* port - logical port number to set.
* DBNum - database number for this port (or FID)
*
* OUTPUTS:
* None.
*
* RETURNS:IN GT_INGRESS_MODE mode
* GT_OK - on success
* GT_FAIL - on error
* GT_BAD_PARAM - on bad parameters
*
* COMMENTS:
*
* GalTis:
*
*******************************************************************************/
GT_STATUS gvlnSetPortVlanDBNum
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
IN GT_U32 DBNum
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U8 phyPort; /* Physical port. */
DBG_INFO(("gvlnSetPortVlanDBNum Called.\n"));
phyPort = GT_LPORT_2_PORT(port);
if(IS_IN_DEV_GROUP(dev,DEV_DBNUM_4096))
{
if(DBNum > 4095)
{
return GT_BAD_PARAM;
}
retVal = hwSetPortRegField(dev,phyPort,QD_REG_PORT_CONTROL1,0,8,(GT_U16)((DBNum & 0xFF0) >> 4));
retVal = hwSetPortRegField(dev,phyPort,QD_REG_PORT_VLAN_MAP,12,4,(GT_U16)(DBNum & 0x000F));
}
else if(IS_IN_DEV_GROUP(dev,DEV_DBNUM_256))
{
if(DBNum > 255)
{
return GT_BAD_PARAM;
}
retVal = hwSetPortRegField(dev,phyPort,QD_REG_PORT_CONTROL1,0,4,(GT_U16)((DBNum & 0xF0) >> 4));
retVal = hwSetPortRegField(dev,phyPort,QD_REG_PORT_VLAN_MAP,12,4,(GT_U16)(DBNum & 0x0F));
}
else if(IS_IN_DEV_GROUP(dev,DEV_DBNUM_64))
{
if(DBNum > 63)
{
return GT_BAD_PARAM;
}
retVal = hwSetPortRegField(dev,phyPort,QD_REG_PORT_VLAN_MAP,6,2,(GT_U16)((DBNum & 0x30) >> 4));
retVal = hwSetPortRegField(dev,phyPort,QD_REG_PORT_VLAN_MAP,12,4,(GT_U16)(DBNum & 0x0F));
}
else
{
if(DBNum > 15)
{
return GT_BAD_PARAM;
}
retVal = hwSetPortRegField(dev,phyPort,QD_REG_PORT_VLAN_MAP,12,4,(GT_U16)(DBNum & 0x0F));
}
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
DBG_INFO(("OK.\n"));
return GT_OK;
}
/*******************************************************************************
* gvlnGetPortVlanDBNum
*
* DESCRIPTION:
* This routine gets the port's default VLAN database number (DBNum or
* FID, Forwarding Information Database).
*
* INPUTS:
* port - logical port number to get.
*
* OUTPUTS:
* DBNum - database number for this port (or FID)
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
* GT_BAD_PARAM - on bad parameters
*
* GalTis:
*
*******************************************************************************/
GT_STATUS gvlnGetPortVlanDBNum
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
OUT GT_U32 *DBNum
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U16 data,dataH; /* The register's read data. */
GT_U8 phyPort; /* Physical port. */
DBG_INFO(("gvlnGetPortVlanDBNum Called.\n"));
if(DBNum == NULL)
{
DBG_INFO(("Failed.\n"));
return GT_BAD_PARAM;
}
phyPort = GT_LPORT_2_PORT(port);
if(IS_IN_DEV_GROUP(dev,DEV_DBNUM_4096))
{
retVal = hwGetPortRegField(dev,phyPort,QD_REG_PORT_CONTROL1,0,8, &dataH);
retVal = hwGetPortRegField(dev,phyPort,QD_REG_PORT_VLAN_MAP,12,4, &data);
}
else if(IS_IN_DEV_GROUP(dev,DEV_DBNUM_256))
{
retVal = hwGetPortRegField(dev,phyPort,QD_REG_PORT_CONTROL1,0,4, &dataH);
retVal = hwGetPortRegField(dev,phyPort,QD_REG_PORT_VLAN_MAP,12,4, &data);
}
else if(IS_IN_DEV_GROUP(dev,DEV_DBNUM_64))
{
retVal = hwGetPortRegField(dev,phyPort,QD_REG_PORT_VLAN_MAP,6,2, &dataH);
retVal = hwGetPortRegField(dev,phyPort,QD_REG_PORT_VLAN_MAP,12,4, &data);
}
else
{
dataH = 0;
retVal = hwGetPortRegField(dev,phyPort,QD_REG_PORT_VLAN_MAP,12,4, &data);
}
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
*DBNum = (GT_U32)(data | (dataH << 4));
DBG_INFO(("OK.\n"));
return GT_OK;
}
/********************************************************************
* gvlnSetPortVlanDot1qMode
*
* DESCRIPTION:
* This routine sets the IEEE 802.1q mode for this port (11:10)
*
* INPUTS:
* port - logical port number to set.
* mode - 802.1q mode for this port
*
* OUTPUTS:
* None.
*
* RETURNS:IN GT_INGRESS_MODE mode
* GT_OK - on success
* GT_FAIL - on error
* GT_BAD_PARAM - on bad parameters
*
* COMMENTS:
*
* GalTis:
*
*******************************************************************************/
GT_STATUS gvlnSetPortVlanDot1qMode
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
IN GT_DOT1Q_MODE mode
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U8 phyPort; /* Physical port. */
DBG_INFO(("gvlnSetPortVlanDot1qMode Called.\n"));
phyPort = GT_LPORT_2_PORT(port);
/* check if device supports this feature */
if((retVal = IS_VALID_API_CALL(dev,phyPort, DEV_802_1Q)) != GT_OK )
return retVal;
if (IS_IN_DEV_GROUP(dev,DEV_GIGABIT_SWITCH|DEV_ENHANCED_FE_SWITCH))
{
retVal = hwSetPortRegField(dev,phyPort,QD_REG_PORT_CONTROL2,10,2,(GT_U16)mode );
}
else
{
retVal = hwSetPortRegField(dev,phyPort,QD_REG_PORT_VLAN_MAP,10,2,(GT_U16)mode );
}
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
DBG_INFO(("OK.\n"));
return GT_OK;
}
/*******************************************************************************
* gvlnGetPortVlanDot1qMode
*
* DESCRIPTION:
* This routine gets the IEEE 802.1q mode for this (bit 11:10).
*
* INPUTS:
* port - logical port number to get.
*
* OUTPUTS:
* mode - 802.1q mode for this port
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
* GT_BAD_PARAM - on bad parameters
*
* GalTis:
*
*******************************************************************************/
GT_STATUS gvlnGetPortVlanDot1qMode
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
OUT GT_DOT1Q_MODE *mode
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U16 data; /* The register's read data. */
GT_U8 phyPort; /* Physical port. */
DBG_INFO(("gvlnGetPortVlanDot1qMode Called.\n"));
phyPort = GT_LPORT_2_PORT(port);
/* check if device supports this feature */
if((retVal = IS_VALID_API_CALL(dev,phyPort, DEV_802_1Q)) != GT_OK )
return retVal;
if(mode == NULL)
{
DBG_INFO(("Failed.\n"));
return GT_BAD_PARAM;
}
if (IS_IN_DEV_GROUP(dev,DEV_GIGABIT_SWITCH|DEV_ENHANCED_FE_SWITCH))
{
retVal = hwGetPortRegField(dev,phyPort,QD_REG_PORT_CONTROL2,10,2, &data);
}
else
{
retVal = hwGetPortRegField(dev,phyPort,QD_REG_PORT_VLAN_MAP,10,2, &data);
}
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
*mode = data;
DBG_INFO(("OK.\n"));
return GT_OK;
}
/********************************************************************
* gvlnSetPortVlanForceDefaultVID
*
* DESCRIPTION:
* This routine sets the mode for forcing to use default VID
*
* INPUTS:
* port - logical port number to set.
* mode - GT_TRUE, force to use default VID
* GT_FAULSE, otherwise
*
* OUTPUTS:
* None.
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
* GT_BAD_PARAM - on bad parameters
*
* COMMENTS:
*
* GalTis:
*
*******************************************************************************/
GT_STATUS gvlnSetPortVlanForceDefaultVID
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
IN GT_BOOL mode
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U8 phyPort; /* Physical port. */
GT_U16 data; /* Data to be set into the */
DBG_INFO(("gvlnSetPortForceDefaultVID Called.\n"));
phyPort = GT_LPORT_2_PORT(port);
/* check if device supports this feature */
if((retVal = IS_VALID_API_CALL(dev,phyPort, DEV_802_1Q)) != GT_OK )
return retVal;
BOOL_2_BIT(mode,data);
retVal = hwSetPortRegField(dev,phyPort,QD_REG_PVID,12,1,data );
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
DBG_INFO(("OK.\n"));
return GT_OK;
}
/*******************************************************************************
* gvlnGetPortVlanForceDefaultVID
*
* DESCRIPTION:
* This routine gets the port mode for ForceDefaultVID (bit 12).
*
* INPUTS:
* port - logical port number to get.
*
* OUTPUTS:
* mode - ForceDefaultVID mode for this port
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
* GT_BAD_PARAM - on bad parameters
*
* COMMENTS:
*
* GalTis:
*
*******************************************************************************/
GT_STATUS gvlnGetPortVlanForceDefaultVID
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
OUT GT_BOOL *mode
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U16 data; /* The register's read data. */
GT_U8 phyPort; /* Physical port. */
DBG_INFO(("gvlnGetPortVlanDot1qMode Called.\n"));
phyPort = GT_LPORT_2_PORT(port);
/* check if device supports this feature */
if((retVal = IS_VALID_API_CALL(dev,phyPort, DEV_802_1Q)) != GT_OK )
return retVal;
if(mode == NULL)
{
DBG_INFO(("Failed.\n"));
return GT_BAD_PARAM;
}
retVal = hwGetPortRegField(dev,phyPort,QD_REG_PVID,12,1, &data);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
BIT_2_BOOL(data,*mode);
DBG_INFO(("OK.\n"));
return GT_OK;
}
/********************************************************************
* gvlnSetForceMap
*
* DESCRIPTION:
* This routine enables/disables Force Map feature.
* When Force Map feature is enabled, all received frames will be
* considered MGMT and they are mapped to the port or ports defined
* in the VLAN Table overriding the mapping from the address database.
*
* INPUTS:
* port - logical port number to set.
* mode - GT_TRUE, to enable force map feature
* GT_FAULSE, otherwise
*
* OUTPUTS:
* None.
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
* GT_NOT_SUPPORTED - if current device does not support this feature.
*
* COMMENTS:
*
*******************************************************************************/
GT_STATUS gvlnSetForceMap
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
IN GT_BOOL mode
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U8 phyPort; /* Physical port. */
GT_U16 data; /* Data to be set into the reg */
DBG_INFO(("gvlnSetForceMap Called.\n"));
phyPort = GT_LPORT_2_PORT(port);
/* check if device supports this feature */
if (!IS_IN_DEV_GROUP(dev,DEV_FORCE_MAP))
{
return GT_NOT_SUPPORTED;
}
BOOL_2_BIT(mode,data);
retVal = hwSetPortRegField(dev,phyPort, QD_REG_PORT_VLAN_MAP, 8, 1, data);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
DBG_INFO(("OK.\n"));
return GT_OK;
}
/********************************************************************
* gvlnGetForceMap
*
* DESCRIPTION:
* This routine checks if Force Map feature is enabled.
* When Force Map feature is enabled, all received frames will be
* considered MGMT and they are mapped to the port or ports defined
* in the VLAN Table overriding the mapping from the address database.
*
* INPUTS:
* port - logical port number to set.
*
* OUTPUTS:
* mode - GT_TRUE, to enable force map feature
* GT_FAULSE, otherwise
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
* GT_NOT_SUPPORTED - if current device does not support this feature.
*
* COMMENTS:
*
*******************************************************************************/
GT_STATUS gvlnGetForceMap
(
IN GT_QD_DEV *dev,
IN GT_LPORT port,
OUT GT_BOOL *mode
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U8 phyPort; /* Physical port. */
GT_U16 data; /* Data to be set into the reg */
DBG_INFO(("gvlnGetForceMap Called.\n"));
phyPort = GT_LPORT_2_PORT(port);
/* check if device supports this feature */
if (!IS_IN_DEV_GROUP(dev,DEV_FORCE_MAP))
{
return GT_NOT_SUPPORTED;
}
retVal = hwGetPortRegField(dev,phyPort, QD_REG_PORT_VLAN_MAP, 8, 1, &data);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
BIT_2_BOOL(data, *mode);
DBG_INFO(("OK.\n"));
return GT_OK;
}
/*******************************************************************************
* gvlnSetNoEgrPolicy
*
* DESCRIPTION:
* No Egress Policy. When this bit is set to a one Egress 802.1Q Secure and
* Check discards are not performed. This mode allowsa non-802.1Q enabled
* port to send a frame to an 802.1Q enabled port that is configured in the
* Secure or Check 802.1Q mode. In this situation the frames will egress
* even if the VID assigned to the frame is not found in the VTU.
*
* INPUTS:
* mode - no egress policy mode
*
* OUTPUTS:
* None.
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
* GT_NOT_SUPPORTED - if current device does not support this feature.
*
* COMMENTS:
* None.
*
*******************************************************************************/
GT_STATUS gvlnSetNoEgrPolicy
(
IN GT_QD_DEV *dev,
IN GT_BOOL mode
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U16 data; /* Data to be set into the */
DBG_INFO(("gvlnSetNoEgrPolicy Called.\n"));
/* Check if Switch supports this status. */
if (!IS_IN_DEV_GROUP(dev,DEV_NO_EGRESS_POLICY))
{
DBG_INFO(("GT_NOT_SUPPORTED\n"));
return GT_NOT_SUPPORTED;
}
BOOL_2_BIT(mode,data);
/* Set related register */
retVal = hwSetGlobal2RegField(dev,QD_REG_SDET_POLARITY,13,1,data);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
DBG_INFO(("OK.\n"));
return GT_OK;
}
/*******************************************************************************
* gvlnGetNoEgrPolicy
*
* DESCRIPTION:
* No Egress Policy. When this bit is set to a one Egress 802.1Q Secure and
* Check discards are not performed. This mode allowsa non-802.1Q enabled
* port to send a frame to an 802.1Q enabled port that is configured in the
* Secure or Check 802.1Q mode. In this situation the frames will egress
* even if the VID assigned to the frame is not found in the VTU.
*
* INPUTS:
* None.
*
* OUTPUTS:
* mode - no egress policy mode
*
* RETURNS:
* GT_OK - on success
* GT_FAIL - on error
* GT_NOT_SUPPORTED - if current device does not support this feature.
*
* COMMENTS:
* None.
*
*******************************************************************************/
GT_STATUS gvlnGetNoEgrPolicy
(
IN GT_QD_DEV *dev,
OUT GT_BOOL *mode
)
{
GT_STATUS retVal; /* Functions return value. */
GT_U16 data; /* The register's read data. */
DBG_INFO(("gvlnGetNoEgrPolicy Called.\n"));
/* Check if Switch supports this status. */
if (!IS_IN_DEV_GROUP(dev,DEV_NO_EGRESS_POLICY))
{
DBG_INFO(("GT_NOT_SUPPORTED\n"));
return GT_NOT_SUPPORTED;
}
/* Get related register */
retVal = hwGetGlobal2RegField(dev,QD_REG_SDET_POLARITY,13,1,&data);
if(retVal != GT_OK)
{
DBG_INFO(("Failed.\n"));
return retVal;
}
BIT_2_BOOL(data,*mode);
DBG_INFO(("OK.\n"));
return GT_OK;
}