| #include <Copyright.h> |
| |
| /******************************************************************************** |
| * gtPortLed.c |
| * |
| * DESCRIPTION: |
| * API definitions for LED Control |
| * |
| * DEPENDENCIES: |
| * |
| * FILE REVISION NUMBER: |
| * $Revision: $ |
| *******************************************************************************/ |
| |
| #include <msApi.h> |
| #include <gtSem.h> |
| #include <gtHwCntl.h> |
| #include <gtDrvSwRegs.h> |
| |
| |
| static GT_STATUS convertLED2APP |
| ( |
| IN GT_QD_DEV *dev, |
| IN GT_LPORT port, |
| IN GT_LED_CFG cfg, |
| IN GT_U32 value, |
| OUT GT_U32 *data |
| ); |
| |
| |
| static GT_STATUS convertAPP2LED |
| ( |
| IN GT_QD_DEV *dev, |
| IN GT_LPORT port, |
| IN GT_LED_CFG cfg, |
| IN GT_U32 value, |
| OUT GT_U32 *data |
| ); |
| |
| |
| /******************************************************************************* |
| * gprtSetLED |
| * |
| * DESCRIPTION: |
| * This API allows to configure 4 LED sections, Pulse stretch, Blink rate, |
| * and special controls. |
| * |
| * INPUTS: |
| * port - the logical port number |
| * cfg - GT_LED_CFG value |
| * value - value to be configured |
| * |
| * 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 gprtSetLED |
| ( |
| IN GT_QD_DEV *dev, |
| IN GT_LPORT port, |
| IN GT_LED_CFG cfg, |
| IN GT_U32 value |
| ) |
| { |
| GT_STATUS retVal; /* Functions return value. */ |
| GT_U16 data; |
| GT_U32 ptr, conv, mask; |
| GT_U8 hwPort; /* the physical port number */ |
| |
| DBG_INFO(("gprtSetLED Called.\n")); |
| |
| hwPort = GT_LPORT_2_PORT(port); |
| if (hwPort >= 5) |
| return GT_BAD_PARAM; |
| |
| /* Check if Switch supports this feature. */ |
| if (!IS_IN_DEV_GROUP(dev,DEV_LED_CFG)) |
| { |
| DBG_INFO(("GT_NOT_SUPPORTED\n")); |
| return GT_NOT_SUPPORTED; |
| } |
| |
| switch (cfg) |
| { |
| case GT_LED_CFG_LED0: |
| ptr = 0; |
| mask = 0xF; |
| break; |
| case GT_LED_CFG_LED1: |
| ptr = 0; |
| mask = 0xF0; |
| break; |
| case GT_LED_CFG_LED2: |
| ptr = 1; |
| mask = 0xF; |
| break; |
| case GT_LED_CFG_LED3: |
| ptr = 1; |
| mask = 0xF0; |
| break; |
| case GT_LED_CFG_PULSE_STRETCH: |
| ptr = 6; |
| mask = 0x70; |
| break; |
| case GT_LED_CFG_BLINK_RATE: |
| ptr = 6; |
| mask = 0x7; |
| break; |
| case GT_LED_CFG_SPECIAL_CONTROL: |
| ptr = 7; |
| mask = (1 << dev->maxPorts) - 1; |
| break; |
| default: |
| return GT_BAD_PARAM; |
| } |
| |
| retVal = convertAPP2LED(dev,port,cfg,value,&conv); |
| if (retVal != GT_OK) |
| { |
| return retVal; |
| } |
| |
| gtSemTake(dev,dev->tblRegsSem,OS_WAIT_FOREVER); |
| |
| /* Wait until the Table is ready. */ |
| do |
| { |
| retVal = hwGetPortRegField(dev,hwPort,QD_REG_LED_CONTROL,15,1,&data); |
| if(retVal != GT_OK) |
| { |
| gtSemGive(dev,dev->tblRegsSem); |
| return retVal; |
| } |
| |
| } while(data == 1); |
| |
| /* read the current data */ |
| data = (GT_U16)(ptr << 12); |
| |
| retVal = hwWritePortReg(dev, hwPort, QD_REG_LED_CONTROL, data); |
| if(retVal != GT_OK) |
| { |
| DBG_INFO(("Failed.\n")); |
| gtSemGive(dev,dev->tblRegsSem); |
| return retVal; |
| } |
| |
| retVal = hwGetPortRegField(dev, hwPort, QD_REG_LED_CONTROL,0,11,&data); |
| if(retVal != GT_OK) |
| { |
| gtSemGive(dev,dev->tblRegsSem); |
| return retVal; |
| } |
| |
| /* overwrite the data */ |
| data = (GT_U16)((1 << 15) | (ptr << 12) | (conv | (data & ~mask))); |
| |
| retVal = hwWritePortReg(dev, hwPort, QD_REG_LED_CONTROL, data); |
| if(retVal != GT_OK) |
| { |
| DBG_INFO(("Failed.\n")); |
| gtSemGive(dev,dev->tblRegsSem); |
| return retVal; |
| } |
| |
| gtSemGive(dev,dev->tblRegsSem); |
| |
| return GT_OK; |
| } |
| |
| |
| /******************************************************************************* |
| * gprtGetLED |
| * |
| * DESCRIPTION: |
| * This API allows to retrieve 4 LED sections, Pulse stretch, Blink rate, |
| * and special controls. |
| * |
| * INPUTS: |
| * port - the logical port number |
| * cfg - GT_LED_CFG value |
| * |
| * OUTPUTS: |
| * value - value to be configured |
| * |
| * RETURNS: |
| * GT_OK - on success |
| * GT_FAIL - on error |
| * GT_NOT_SUPPORTED - if current device does not support this feature. |
| * |
| * COMMENTS: |
| * None |
| * |
| *******************************************************************************/ |
| GT_STATUS gprtGetLED |
| ( |
| IN GT_QD_DEV *dev, |
| IN GT_LPORT port, |
| IN GT_LED_CFG cfg, |
| OUT GT_U32 *value |
| ) |
| { |
| GT_STATUS retVal; /* Functions return value. */ |
| GT_U16 data; |
| GT_U32 ptr; |
| GT_U8 hwPort; /* the physical port number */ |
| |
| DBG_INFO(("gprtGetLED Called.\n")); |
| |
| hwPort = GT_LPORT_2_PORT(port); |
| if (hwPort >= 5) |
| return GT_BAD_PARAM; |
| |
| /* Check if Switch supports this feature. */ |
| if (!IS_IN_DEV_GROUP(dev,DEV_LED_CFG)) |
| { |
| DBG_INFO(("GT_NOT_SUPPORTED\n")); |
| return GT_NOT_SUPPORTED; |
| } |
| |
| switch (cfg) |
| { |
| case GT_LED_CFG_LED0: |
| ptr = 0; |
| break; |
| case GT_LED_CFG_LED1: |
| ptr = 0; |
| break; |
| case GT_LED_CFG_LED2: |
| ptr = 1; |
| break; |
| case GT_LED_CFG_LED3: |
| ptr = 1; |
| break; |
| case GT_LED_CFG_PULSE_STRETCH: |
| ptr = 6; |
| break; |
| case GT_LED_CFG_BLINK_RATE: |
| ptr = 6; |
| break; |
| case GT_LED_CFG_SPECIAL_CONTROL: |
| ptr = 7; |
| break; |
| default: |
| return GT_BAD_PARAM; |
| } |
| |
| gtSemTake(dev,dev->tblRegsSem,OS_WAIT_FOREVER); |
| |
| /* Wait until the Table is ready. */ |
| do |
| { |
| retVal = hwGetPortRegField(dev,hwPort,QD_REG_LED_CONTROL,15,1,&data); |
| if(retVal != GT_OK) |
| { |
| gtSemGive(dev,dev->tblRegsSem); |
| return retVal; |
| } |
| |
| } while(data == 1); |
| |
| /* read the current data */ |
| data = (GT_U16)(ptr << 12); |
| |
| retVal = hwWritePortReg(dev, hwPort, QD_REG_LED_CONTROL, data); |
| if(retVal != GT_OK) |
| { |
| DBG_INFO(("Failed.\n")); |
| gtSemGive(dev,dev->tblRegsSem); |
| return retVal; |
| } |
| |
| retVal = hwGetPortRegField(dev, hwPort, QD_REG_LED_CONTROL,0,11,&data); |
| if(retVal != GT_OK) |
| { |
| gtSemGive(dev,dev->tblRegsSem); |
| return retVal; |
| } |
| |
| retVal = convertLED2APP(dev,port,cfg,data,value); |
| if (retVal != GT_OK) |
| { |
| return retVal; |
| } |
| |
| |
| gtSemGive(dev,dev->tblRegsSem); |
| |
| return GT_OK; |
| } |
| |
| |
| static GT_STATUS convertAPP2LED |
| ( |
| IN GT_QD_DEV *dev, |
| IN GT_LPORT port, |
| IN GT_LED_CFG cfg, |
| IN GT_U32 value, |
| OUT GT_U32 *data |
| ) |
| { |
| GT_STATUS retVal = GT_OK; |
| |
| switch (cfg) |
| { |
| case GT_LED_CFG_LED0: |
| switch (value) |
| { |
| case GT_LED_LINK_ACT: |
| *data = 3; |
| break; |
| case GT_LED_LINK: |
| *data = 8; |
| break; |
| case GT_LED_10_LINK_ACT: |
| *data = 10; |
| break; |
| case GT_LED_10_LINK: |
| *data = 9; |
| break; |
| case GT_LED_1000_LINK_ACT: |
| *data = 2; |
| break; |
| case GT_LED_100_1000_LINK_ACT: |
| *data = 1; |
| break; |
| case GT_LED_100_1000_LINK: |
| *data = 11; |
| break; |
| case GT_LED_SPECIAL: |
| *data = 7; |
| break; |
| case GT_LED_DUPLEX_COL: |
| *data = 6; |
| break; |
| case GT_LED_PTP_ACT: |
| *data = 0; |
| break; |
| case GT_LED_FORCE_BLINK: |
| *data = 13; |
| break; |
| case GT_LED_FORCE_OFF: |
| *data = 14; |
| break; |
| case GT_LED_FORCE_ON: |
| *data = 15; |
| break; |
| default: |
| retVal = GT_BAD_PARAM; |
| break; |
| } |
| break; |
| |
| case GT_LED_CFG_LED1: |
| switch (value) |
| { |
| case GT_LED_LINK_ACT_SPEED: |
| *data = 0; |
| break; |
| case GT_LED_100_LINK_ACT: |
| *data = 10; |
| break; |
| case GT_LED_100_LINK: |
| *data = 9; |
| break; |
| case GT_LED_1000_LINK: |
| *data = 3; |
| break; |
| case GT_LED_10_100_LINK_ACT: |
| *data = 1; |
| break; |
| case GT_LED_10_100_LINK: |
| *data = 11; |
| break; |
| case GT_LED_SPECIAL: |
| *data = 6; |
| break; |
| case GT_LED_DUPLEX_COL: |
| *data = 7; |
| break; |
| case GT_LED_ACTIVITY: |
| *data = 8; |
| break; |
| case GT_LED_PTP_ACT: |
| *data = 12; |
| break; |
| case GT_LED_FORCE_BLINK: |
| *data = 13; |
| break; |
| case GT_LED_FORCE_OFF: |
| *data = 14; |
| break; |
| case GT_LED_FORCE_ON: |
| *data = 15; |
| break; |
| default: |
| retVal = GT_BAD_PARAM; |
| break; |
| } |
| *data <<= 4; |
| break; |
| |
| case GT_LED_CFG_LED2: |
| switch (value) |
| { |
| case GT_LED_10_LINK_ACT: |
| *data = 6; |
| break; |
| case GT_LED_100_LINK: |
| *data = 8; |
| break; |
| case GT_LED_1000_LINK_ACT: |
| *data = 10; |
| break; |
| case GT_LED_1000_LINK: |
| *data = 9; |
| break; |
| case GT_LED_10_1000_LINK_ACT: |
| *data = 1; |
| break; |
| case GT_LED_10_1000_LINK: |
| *data = 11; |
| break; |
| case GT_LED_100_1000_LINK_ACT: |
| *data = 7; |
| break; |
| case GT_LED_100_1000_LINK: |
| *data = 3; |
| break; |
| case GT_LED_SPECIAL: |
| *data = 2; |
| break; |
| case GT_LED_DUPLEX_COL: |
| *data = 0; |
| break; |
| case GT_LED_PTP_ACT: |
| *data = 12; |
| break; |
| case GT_LED_FORCE_BLINK: |
| *data = 13; |
| break; |
| case GT_LED_FORCE_OFF: |
| *data = 14; |
| break; |
| case GT_LED_FORCE_ON: |
| *data = 15; |
| break; |
| default: |
| retVal = GT_BAD_PARAM; |
| break; |
| } |
| break; |
| |
| case GT_LED_CFG_LED3: |
| switch (value) |
| { |
| case GT_LED_LINK_ACT: |
| *data = 10; |
| break; |
| case GT_LED_LINK: |
| *data = 9; |
| break; |
| case GT_LED_10_LINK: |
| *data = 8; |
| break; |
| case GT_LED_100_LINK_ACT: |
| *data = 6; |
| break; |
| case GT_LED_10_1000_LINK_ACT: |
| *data = 7; |
| break; |
| case GT_LED_SPECIAL: |
| *data = 0; |
| break; |
| case GT_LED_DUPLEX_COL: |
| *data = 1; |
| break; |
| case GT_LED_ACTIVITY: |
| *data = 11; |
| break; |
| case GT_LED_PTP_ACT: |
| *data = 12; |
| break; |
| case GT_LED_FORCE_BLINK: |
| *data = 13; |
| break; |
| case GT_LED_FORCE_OFF: |
| *data = 14; |
| break; |
| case GT_LED_FORCE_ON: |
| *data = 15; |
| break; |
| default: |
| retVal = GT_BAD_PARAM; |
| break; |
| } |
| *data <<= 4; |
| break; |
| |
| case GT_LED_CFG_PULSE_STRETCH: |
| if (value > 0x4) |
| retVal = GT_BAD_PARAM; |
| *data = value << 4; |
| break; |
| case GT_LED_CFG_BLINK_RATE: |
| if (value > 0x5) |
| retVal = GT_BAD_PARAM; |
| *data = value; |
| break; |
| |
| case GT_LED_CFG_SPECIAL_CONTROL: |
| if (value >= (GT_U32)(1 << dev->maxPorts)) |
| retVal = GT_BAD_PARAM; |
| *data = value; |
| break; |
| |
| default: |
| retVal = GT_BAD_PARAM; |
| break; |
| } |
| |
| return retVal; |
| |
| } |
| |
| |
| static GT_STATUS convertLED2APP |
| ( |
| IN GT_QD_DEV *dev, |
| IN GT_LPORT port, |
| IN GT_LED_CFG cfg, |
| IN GT_U32 value, |
| OUT GT_U32 *data |
| ) |
| { |
| GT_STATUS retVal = GT_OK; |
| |
| switch (cfg) |
| { |
| case GT_LED_CFG_LED0: |
| value &= 0xF; |
| switch (value) |
| { |
| case 0: |
| *data = GT_LED_PTP_ACT; |
| break; |
| case 1: |
| *data = GT_LED_100_1000_LINK_ACT; |
| break; |
| case 2: |
| *data = GT_LED_1000_LINK_ACT; |
| break; |
| case 3: |
| *data = GT_LED_LINK_ACT; |
| break; |
| case 4: |
| *data = GT_LED_RESERVE; |
| break; |
| case 5: |
| *data = GT_LED_RESERVE; |
| break; |
| case 6: |
| *data = GT_LED_DUPLEX_COL; |
| break; |
| case 7: |
| *data = GT_LED_SPECIAL; |
| break; |
| case 8: |
| *data = GT_LED_LINK; |
| break; |
| case 9: |
| *data = GT_LED_10_LINK; |
| break; |
| case 10: |
| *data = GT_LED_10_LINK_ACT; |
| break; |
| case 11: |
| *data = GT_LED_100_1000_LINK; |
| break; |
| case 12: |
| *data = GT_LED_PTP_ACT; |
| break; |
| case 13: |
| *data = GT_LED_FORCE_BLINK; |
| break; |
| case 14: |
| *data = GT_LED_FORCE_OFF; |
| break; |
| case 15: |
| *data = GT_LED_FORCE_ON; |
| break; |
| default: |
| retVal = GT_FAIL; |
| break; |
| } |
| break; |
| |
| case GT_LED_CFG_LED1: |
| value >>= 4; |
| value &= 0xF; |
| switch (value) |
| { |
| case 0: |
| *data = GT_LED_LINK_ACT_SPEED; |
| break; |
| case 1: |
| *data = GT_LED_10_100_LINK_ACT; |
| break; |
| case 2: |
| *data = GT_LED_10_100_LINK_ACT; |
| break; |
| case 3: |
| *data = GT_LED_1000_LINK; |
| break; |
| case 4: |
| *data = GT_LED_RESERVE; |
| break; |
| case 5: |
| *data = GT_LED_RESERVE; |
| break; |
| case 6: |
| *data = GT_LED_SPECIAL; |
| break; |
| case 7: |
| *data = GT_LED_DUPLEX_COL; |
| break; |
| case 8: |
| *data = GT_LED_ACTIVITY; |
| break; |
| case 9: |
| *data = GT_LED_100_LINK; |
| break; |
| case 10: |
| *data = GT_LED_100_LINK_ACT; |
| break; |
| case 11: |
| *data = GT_LED_10_100_LINK; |
| break; |
| case 12: |
| *data = GT_LED_PTP_ACT; |
| break; |
| case 13: |
| *data = GT_LED_FORCE_BLINK; |
| break; |
| case 14: |
| *data = GT_LED_FORCE_OFF; |
| break; |
| case 15: |
| *data = GT_LED_FORCE_ON; |
| break; |
| default: |
| retVal = GT_FAIL; |
| break; |
| } |
| break; |
| |
| case GT_LED_CFG_LED2: |
| value &= 0xF; |
| switch (value) |
| { |
| case 0: |
| *data = GT_LED_DUPLEX_COL; |
| break; |
| case 1: |
| *data = GT_LED_10_1000_LINK_ACT; |
| break; |
| case 2: |
| *data = GT_LED_SPECIAL; |
| break; |
| case 3: |
| *data = GT_LED_100_1000_LINK; |
| break; |
| case 4: |
| *data = GT_LED_RESERVE; |
| break; |
| case 5: |
| *data = GT_LED_RESERVE; |
| break; |
| case 6: |
| *data = GT_LED_10_LINK_ACT; |
| break; |
| case 7: |
| *data = GT_LED_100_1000_LINK_ACT; |
| break; |
| case 8: |
| *data = GT_LED_100_LINK; |
| break; |
| case 9: |
| *data = GT_LED_1000_LINK; |
| break; |
| case 10: |
| *data = GT_LED_1000_LINK_ACT; |
| break; |
| case 11: |
| *data = GT_LED_10_1000_LINK; |
| break; |
| case 12: |
| *data = GT_LED_PTP_ACT; |
| break; |
| case 13: |
| *data = GT_LED_FORCE_BLINK; |
| break; |
| case 14: |
| *data = GT_LED_FORCE_OFF; |
| break; |
| case 15: |
| *data = GT_LED_FORCE_ON; |
| break; |
| default: |
| retVal = GT_FAIL; |
| break; |
| } |
| break; |
| |
| case GT_LED_CFG_LED3: |
| value >>= 4; |
| value &= 0xF; |
| switch (value) |
| { |
| case 0: |
| *data = GT_LED_SPECIAL; |
| break; |
| case 1: |
| *data = GT_LED_DUPLEX_COL; |
| break; |
| case 2: |
| *data = GT_LED_DUPLEX_COL; |
| break; |
| case 3: |
| *data = GT_LED_SPECIAL; |
| break; |
| case 4: |
| *data = GT_LED_RESERVE; |
| break; |
| case 5: |
| *data = GT_LED_RESERVE; |
| break; |
| case 6: |
| *data = GT_LED_100_LINK_ACT; |
| break; |
| case 7: |
| *data = GT_LED_10_1000_LINK_ACT; |
| break; |
| case 8: |
| *data = GT_LED_10_LINK; |
| break; |
| case 9: |
| *data = GT_LED_LINK; |
| break; |
| case 10: |
| *data = GT_LED_LINK_ACT; |
| break; |
| case 11: |
| *data = GT_LED_ACTIVITY; |
| break; |
| case 12: |
| *data = GT_LED_PTP_ACT; |
| break; |
| case 13: |
| *data = GT_LED_FORCE_BLINK; |
| break; |
| case 14: |
| *data = GT_LED_FORCE_OFF; |
| break; |
| case 15: |
| *data = GT_LED_FORCE_ON; |
| break; |
| default: |
| retVal = GT_FAIL; |
| break; |
| } |
| break; |
| |
| case GT_LED_CFG_PULSE_STRETCH: |
| *data = (value >> 4) & 0x7; |
| break; |
| |
| case GT_LED_CFG_BLINK_RATE: |
| *data = value & 0x7; |
| break; |
| |
| case GT_LED_CFG_SPECIAL_CONTROL: |
| *data = value & ((1 << dev->maxPorts) - 1); |
| break; |
| |
| default: |
| retVal = GT_BAD_PARAM; |
| break; |
| } |
| |
| return retVal; |
| |
| } |