/* Function Name: * rtl8367b_setAsicPHYReg * Description: * Set PHY registers * Input: * phyNo - Physical port number (0~7) * phyAddr - PHY address (0~31) * phyData - Writing data * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_PHY_REG_ID - invalid PHY address * RT_ERR_PHY_ID - invalid PHY no * RT_ERR_BUSYWAIT_TIMEOUT - PHY access busy * Note: * None */ ret_t rtl8367b_setAsicPHYReg(rtk_uint32 phyNo, rtk_uint32 phyAddr, rtk_uint32 phyData ) { ret_t retVal; rtk_uint32 regData; rtk_uint32 busyFlag, checkCounter; #ifdef RTK_X86_CLE #else if(phyNo > RTL8367B_PHY_INTERNALNOMAX) return RT_ERR_PHY_ID; #endif if(phyAddr > RTL8367B_PHY_REGNOMAX) return RT_ERR_PHY_REG_ID; /*Check internal phy access busy or not*/ /*retVal = rtl8367b_getAsicRegBit(RTL8367B_REG_INDRECT_ACCESS_STATUS, RTL8367B_INDRECT_ACCESS_STATUS_OFFSET,&busyFlag);*/ retVal = rtl8367b_getAsicReg(RTL8367B_REG_INDRECT_ACCESS_STATUS,&busyFlag); if(retVal != RT_ERR_OK) return retVal; if(busyFlag) return RT_ERR_BUSYWAIT_TIMEOUT; /*prepare access data*/ retVal = rtl8367b_setAsicReg(RTL8367B_REG_INDRECT_ACCESS_WRITE_DATA, phyData); if(retVal != RT_ERR_OK) return retVal; /*prepare access address*/ regData = RTL8367B_PHY_BASE | (phyNo << RTL8367B_PHY_OFFSET) | phyAddr; retVal = rtl8367b_setAsicReg(RTL8367B_REG_INDRECT_ACCESS_ADDRESS, regData); if(retVal != RT_ERR_OK) return retVal; /*Set WRITE Command*/ retVal = rtl8367b_setAsicReg(RTL8367B_REG_INDRECT_ACCESS_CTRL, RTL8367B_CMD_MASK | RTL8367B_RW_MASK); checkCounter = 5; while(checkCounter) { retVal = rtl8367b_getAsicReg(RTL8367B_REG_INDRECT_ACCESS_STATUS,&busyFlag); if((retVal != RT_ERR_OK) || busyFlag) { checkCounter --; if(0 == checkCounter) return RT_ERR_BUSYWAIT_TIMEOUT; } else { checkCounter = 0; } } return retVal; }
/* Function Name: * rtl8367b_setAsicMIBsResetLoggingCounter * Description: * MIB logging counter type * Input: * index - logging counter index (0~31) * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_OUT_OF_RANGE - input parameter out of range * Note: * None */ ret_t rtl8367b_setAsicMIBsResetLoggingCounter(rtk_uint32 index) { ret_t retVal; if(index > RTL8367B_MIB_MAX_LOG_CNT_IDX) return RT_ERR_OUT_OF_RANGE; if(index < 16) retVal = rtl8367b_setAsicReg(RTL8367B_REG_MIB_CTRL1, 1<<index); else retVal = rtl8367b_setAsicReg(RTL8367B_REG_MIB_CTRL2, 1<<(index-16)); return retVal; }
/* Function Name: * rtl8367b_setAsicPortForceLinkExt * Description: * Set external interface force linking configuration * Input: * id - external interface id (0~2) * portAbility - port ability configuration * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_OUT_OF_RANGE - input parameter out of range * Note: * None */ ret_t rtl8367b_setAsicPortForceLinkExt(rtk_uint32 id, rtl8367b_port_ability_t *pPortAbility) { rtk_uint32 reg_data; /* Invalid input parameter */ if(id >= RTL8367B_EXTNO) return RT_ERR_OUT_OF_RANGE; reg_data = (rtk_uint32)(*(rtk_uint16 *)pPortAbility); if(0 == id || 1 == id) return rtl8367b_setAsicReg(RTL8367B_REG_DIGITAL_INTERFACE0_FORCE + id, reg_data); else return rtl8367b_setAsicReg(RTL8367B_REG_DIGITAL_INTERFACE2_FORCE, reg_data); }
/* Function Name: * rtl8367b_setAsicRldpTxPortmask * Description: * Set portmask that send/forward RLDP frame * Input: * portmask - 0~0xFF * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_PORT_MASK - Invalid portmask * Note: * None */ ret_t rtl8367b_setAsicRldpTxPortmask(rtk_uint32 portmask) { if(portmask > RTL8367B_PORTMASK) return RT_ERR_PORT_MASK; return rtl8367b_setAsicReg(RTL8367B_RLDP_TX_PMSK_REG, portmask); }
/* Function Name: * rtl8367b_setAsicCputagPortmask * Description: * Set ports that can parse CPU tag * Input: * portmask - port mask * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_PORT_MASK - Invalid portmask * Note: * None */ ret_t rtl8367b_setAsicCputagPortmask(rtk_uint32 portmask) { if(portmask > RTL8367B_PORTMASK) return RT_ERR_PORT_MASK; return rtl8367b_setAsicReg(RTL8367B_CPU_PORT_MASK_REG, portmask); }
/* Function Name: * rtl8367b_setAsicMacAddress * Description: * Set switch MAC address * Input: * mac - switch mac * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * Note: * None */ ret_t rtl8367b_setAsicMacAddress(ether_addr_t mac) { ret_t retVal; rtk_uint32 regData; rtk_uint8 *accessPtr; rtk_uint32 i; accessPtr = (rtk_uint8*)&mac; regData = *accessPtr; accessPtr ++; regData = (regData << 8) | *accessPtr; accessPtr ++; for(i = 0; i <=2; i++) { retVal = rtl8367b_setAsicReg(RTL8367B_REG_SWITCH_MAC2 - i, regData); if(retVal != RT_ERR_OK) return retVal; regData = *accessPtr; accessPtr ++; regData = (regData << 8) | *accessPtr; accessPtr ++; } return retVal; }
/* Function Name: * rtl8367b_setAsicVlanProtocolBasedGroupData * Description: * Set protocol and port based group database * Input: * index - Index to VLAN member configuration * pPbCfg - Protocol and port based group database entry * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_INPUT - Invalid input parameter * RT_ERR_VLAN_PROTO_AND_PORT - Invalid protocol base group database index * Note: * None */ ret_t rtl8367b_setAsicVlanProtocolBasedGroupData(rtk_uint32 index, rtl8367b_protocolgdatacfg *pPbCfg) { rtk_uint32 frameType; rtk_uint32 etherType; ret_t retVal; /* Error Checking */ if(index > RTL8367B_PROTOVLAN_GIDX_MAX) return RT_ERR_VLAN_PROTO_AND_PORT; if(pPbCfg->frameType >= PPVLAN_FRAME_TYPE_END ) return RT_ERR_INPUT; frameType = pPbCfg->frameType; etherType = pPbCfg->etherType; /* Frame type */ retVal = rtl8367b_setAsicRegBits(RTL8367BG_VLAN_PPB_FRAMETYPE_REG(index), RTL8367BG_VLAN_PPB_FRAMETYPE_MASK, frameType); if(retVal != RT_ERR_OK) return retVal; /* Ether type */ retVal = rtl8367b_setAsicReg(RTL8367B_VLAN_PPB_ETHERTYPR_REG(index), etherType); if(retVal != RT_ERR_OK) return retVal; return RT_ERR_OK; }
/* Function Name: * rtl8367b_setAsicPortBcastFloodingPortmask * Description: * Set Bcast flooding portmask * Input: * portmask - portmask(0~0xFF) * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_PORT_MASK - Invalid portmask * Note: * None */ ret_t rtl8367b_setAsicPortBcastFloodingPortmask(rtk_uint32 portmask) { if(portmask > RTL8367B_PORTMASK) return RT_ERR_PORT_MASK; return rtl8367b_setAsicReg(RTL8367B_BCAST_FLOADING_PMSK_REG, portmask); }
/* Function Name: * rtl8367b_setAsicMaxLengthAltTxRx * Description: * Set per-port Max receiving/transmit packet length in different speed * Input: * maxLength - 0: 1522 bytes 1:1536 bytes 2:1552 bytes 3:16000bytes * pmskGiga - enable port mask in 100Mpbs * pmask100M - enable port mask in Giga * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * Note: * None */ ret_t rtl8367b_setAsicMaxLengthAltTxRx(rtk_uint32 maxLength, rtk_uint32 pmskGiga, rtk_uint32 pmask100M) { ret_t retVal; retVal = rtl8367b_setAsicReg(RTL8367B_REG_MAX_LENGTH_CFG, ((pmskGiga << RTL8367B_MAX_LENGTH_GIGA_OFFSET) & RTL8367B_MAX_LENGTH_GIGA_MASK) | (pmask100M & RTL8367B_MAX_LENGTH_10_100M_MASK)); if(retVal != RT_ERR_OK) return retVal; return rtl8367b_setAsicRegBits(RTL8367B_REG_MAX_LEN_RX_TX, RTL8367B_MAX_LEN_RX_TX_MASK, maxLength); }
/* Function Name: * rtl8367b_setAsicPortBasedFid * Description: * Set port based FID * Input: * port - Physical port number (0~7) * fid - Port based fid * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_L2_FID - Invalid FID * RT_ERR_PORT_ID - Invalid port number * Note: * None */ ret_t rtl8367b_setAsicPortBasedFid(rtk_uint32 port, rtk_uint32 fid) { if(port > RTL8367B_PORTIDMAX) return RT_ERR_PORT_ID; if(fid > RTL8367B_FIDMAX) return RT_ERR_L2_FID; return rtl8367b_setAsicReg(RTL8367B_PORT_PBFID_REG(port),fid); }
/* Function Name: * rtl8367b_setAsicLutLearnLimitNo * Description: * Set per-Port auto learning limit number * Input: * port - Physical port number (0~7) * number - ASIC auto learning entries limit number * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_PORT_ID - Invalid port number * RT_ERR_LIMITED_L2ENTRY_NUM - Invalid auto learning limit number * Note: * None */ ret_t rtl8367b_setAsicLutLearnLimitNo(rtk_uint32 port, rtk_uint32 number) { if(port > RTL8367B_PORTIDMAX) return RT_ERR_PORT_ID; if(number > RTL8367B_LUT_LEARNLIMITMAX) return RT_ERR_LIMITED_L2ENTRY_NUM; return rtl8367b_setAsicReg(RTL8367B_LUT_PORT_LEARN_LIMITNO_REG(port), number); }
int rtl8367_switch_init_post(void) { rtk_api_ret_t retVal; rtk_portmask_t portmask; rtk_port_mac_ability_t mac_cfg; printf(" Reset and init RTL8367 external switch..."); /* soft reset switch */ rtl8367b_setAsicReg(RTL8367B_REG_CHIP_RESET, 1); /* wait 1s for switch ready */ mdelay(1000); /* main switch init */ retVal = rtk_switch_init(); if (retVal != RT_ERR_OK) { printf("FAILED! (code: %d)\n", retVal); return retVal; } /* create default ports isolation */ partition_bridge_default(); /* configure ExtIf to RGMII, fixed gigabit mode w/o autoneg */ mac_cfg.forcemode = MAC_FORCE; mac_cfg.speed = SPD_1000M; mac_cfg.duplex = FULL_DUPLEX; mac_cfg.link = PORT_LINKUP; mac_cfg.nway = DISABLED; mac_cfg.rxpause = ENABLED; mac_cfg.txpause = ENABLED; rtk_port_macForceLinkExt_set(EXT_PORT_1, MODE_EXT_RGMII, &mac_cfg); /* disable iNIC_mii port link */ mac_cfg.link = PORT_LINKDOWN; rtk_port_macForceLinkExt_set(EXT_PORT_2, MODE_EXT_RGMII, &mac_cfg); /* configure ExtIf RGMII delays */ rtk_port_rgmiiDelayExt_set(EXT_PORT_1, RTL8367_RGMII_DELAY_TX, RTL8367_RGMII_DELAY_RX); rtk_port_rgmiiDelayExt_set(EXT_PORT_2, RTL8367_RGMII_DELAY_TX, RTL8367_RGMII_DELAY_RX); /* configure PHY leds */ portmask.bits[0] = 0x1F; rtk_led_enable_set(LED_GROUP_0, portmask); rtk_led_enable_set(LED_GROUP_1, portmask); rtk_led_operation_set(LED_OP_PARALLEL); rtk_led_groupConfig_set(LED_GROUP_0, LED_CONFIG_SPD10010ACT); // group 0 - green LED rtk_led_groupConfig_set(LED_GROUP_1, LED_CONFIG_SPD1000ACT); // group 1 - yellow LED printf("SUCCESS!\n"); return RT_ERR_OK; }
/* Function Name: * rtl8367b_setAsicPHYReg * Description: * Set PHY registers * Input: * phyNo - Physical port number (0~4) * phyAddr - PHY address (0~31) * phyData - Writing data * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_PHY_REG_ID - invalid PHY address * RT_ERR_PHY_ID - invalid PHY no * RT_ERR_BUSYWAIT_TIMEOUT - PHY access busy * Note: * None */ ret_t rtl8367b_setAsicPHYReg( rtk_uint32 phyNo, rtk_uint32 phyAddr, rtk_uint32 value) { rtk_uint32 regAddr; if(phyNo > RTL8367B_PHY_INTERNALNOMAX) return RT_ERR_PORT_ID; if(phyAddr > RTL8367B_PHY_REGNOMAX) return RT_ERR_PHY_REG_ID; regAddr = 0x2000 + (phyNo << 5) + phyAddr; return rtl8367b_setAsicReg(regAddr, value); }
/* Function Name: * rtl8367b_setAsicIGMPQueryInterval * Description: * Set Query Interval of IGMP/MLD * Input: * interval - Query Interval * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_OUT_OF_RANGE - input parameter is out of range * Note: * None */ ret_t rtl8367b_setAsicIGMPQueryInterval(rtk_uint32 interval) { ret_t retVal; if(interval > RTL8367B_MAX_QUERY_INT) return RT_ERR_OUT_OF_RANGE; /* Query Interval */ retVal = rtl8367b_setAsicReg(RTL8367B_REG_IGMP_MLD_CFG2, interval); if(retVal != RT_ERR_OK) return retVal; return RT_ERR_OK; }
/* Function Name: * rtl8367b_setAsicRldpCheckingStatePara * Description: * Set retry count and retry period of checking state * Input: * retryCount - 0~0xFF (times) * retryPeriod - 0~0xFFFF (ms) * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_OUT_OF_RANGE - input parameter out of range * Note: * None */ ret_t rtl8367b_setAsicRldpCheckingStatePara(rtk_uint32 retryCount, rtk_uint32 retryPeriod) { ret_t retVal; if(retryCount > 0xFF) return RT_ERR_OUT_OF_RANGE; if(retryPeriod > RTL8367B_REGDATAMAX) return RT_ERR_OUT_OF_RANGE; retVal = rtl8367b_setAsicRegBits(RTL8367B_RLDP_RETRY_COUNT_REG, RTL8367B_RLDP_RETRY_COUNT_CHKSTATE_MASK, retryCount); if(retVal != RT_ERR_OK) return retVal; return rtl8367b_setAsicReg(RTL8367B_RLDP_RETRY_PERIOD_CHKSTATE_REG, retryPeriod); }
/* Function Name: * rtl8367b_getAsicIGMPGroup * Description: * Get IGMP group * Input: * idx - Group index (0~255) * valid - valid bit * grp - IGMP group * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_OUT_OF_RANGE - Group index is out of range * Note: * None */ ret_t rtl8367b_getAsicIGMPGroup(rtk_uint32 idx, rtk_uint32 *valid, rtl8367b_igmpgroup *grp) { ret_t retVal; rtk_uint32 regAddr, regData; rtk_uint16* tableAddr; rtk_uint32 i; if(idx > RTL8367B_IGMP_MAX_GOUP) return RT_ERR_OUT_OF_RANGE; /* Write ACS_ADR register for data bits */ regAddr = RTL8367B_TABLE_ACCESS_ADDR_REG; regData = idx; retVal = rtl8367b_setAsicReg(regAddr, regData); if(retVal != RT_ERR_OK) return retVal; /* Write ACS_CMD register */ regAddr = RTL8367B_TABLE_ACCESS_CTRL_REG; regData = RTL8367B_TABLE_ACCESS_REG_DATA(TB_OP_READ, TB_TARGET_IGMP_GROUP); retVal = rtl8367b_setAsicRegBits(regAddr, RTL8367B_TABLE_TYPE_MASK | RTL8367B_COMMAND_TYPE_MASK, regData); if(retVal != RT_ERR_OK) return retVal; /* Read Data Bits */ regAddr = RTL8367B_TABLE_ACCESS_RDDATA_BASE; tableAddr = (rtk_uint16*)grp; for(i=0;i<RTL8367B_IGMP_GRP_BLEN;i++) { retVal = rtl8367b_getAsicReg(regAddr, ®Data); if(retVal != RT_ERR_OK) return retVal; *tableAddr = regData; regAddr ++; tableAddr ++; } /* Valid bit */ retVal = rtl8367b_getAsicReg(RTL8367B_IGMP_GROUP_USAGE_REG(idx), ®Data); if(retVal != RT_ERR_OK) return retVal; *valid = ((regData & (0x0001 << (idx %16))) != 0) ? 1 : 0; return RT_ERR_OK; }
/* Function Name: * rtl8367b_setAsicVlanMemberConfig * Description: * Set 32 VLAN member configurations * Input: * index - VLAN member configuration index (0~31) * pVlanCg - VLAN member configuration * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_INPUT - Invalid input parameter * RT_ERR_L2_FID - Invalid FID * RT_ERR_PORT_MASK - Invalid portmask * RT_ERR_FILTER_METER_ID - Invalid meter * RT_ERR_QOS_INT_PRIORITY - Invalid priority * RT_ERR_VLAN_ENTRY_NOT_FOUND - Invalid VLAN member configuration index * Note: * None */ ret_t rtl8367b_setAsicVlanMemberConfig(rtk_uint32 index, rtl8367b_vlanconfiguser *pVlanCg) { ret_t retVal; rtk_uint32 regAddr; rtk_uint32 regData; rtk_uint16 *tableAddr; rtk_uint32 page_idx; rtl8367b_vlanconfigsmi smi_vlancfg; /* Error Checking */ if(index > RTL8367B_CVIDXMAX) return RT_ERR_VLAN_ENTRY_NOT_FOUND; if(pVlanCg->evid > RTL8367B_EVIDMAX) return RT_ERR_INPUT; if(pVlanCg->mbr > RTL8367B_PORTMASK) return RT_ERR_PORT_MASK; if(pVlanCg->fid_msti > RTL8367B_FIDMAX) return RT_ERR_L2_FID; if(pVlanCg->meteridx > RTL8367B_METERMAX) return RT_ERR_FILTER_METER_ID; if(pVlanCg->vbpri > RTL8367B_PRIMAX) return RT_ERR_QOS_INT_PRIORITY; memset(&smi_vlancfg, 0x00, sizeof(rtl8367b_vlanconfigsmi)); _rtl8367b_VlanMCStUser2Smi(pVlanCg, &smi_vlancfg); tableAddr = (rtk_uint16*)&smi_vlancfg; for(page_idx = 0; page_idx < 4; page_idx++) /* 4 pages per VLAN Member Config */ { regAddr = RTL8367B_VLAN_MEMBER_CONFIGURATION_BASE + (index * 4) + page_idx; regData = *tableAddr; retVal = rtl8367b_setAsicReg(regAddr, regData); if(retVal != RT_ERR_OK) return retVal; tableAddr++; } return RT_ERR_OK; }
/* Function Name: * rtl8367b_setAsicPortForceLink * Description: * Set port force linking configuration * Input: * port - Physical port number (0~7) * pPortAbility - port ability configuration * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_PORT_ID - Invalid port number * Note: * None */ ret_t rtl8367b_setAsicPortForceLink(rtk_uint32 port, rtl8367b_port_ability_t *pPortAbility) { rtk_uint32 regData; rtk_uint16 *accessPtr; rtl8367b_port_ability_t ability; /* Invalid input parameter */ if(port >= RTL8367B_PORTNO) return RT_ERR_PORT_ID; memset(&ability, 0x00, sizeof(rtl8367b_port_ability_t)); memcpy(&ability, pPortAbility, sizeof(rtl8367b_port_ability_t)); accessPtr = (rtk_uint16*)&ability; regData = *accessPtr; return rtl8367b_setAsicReg(RTL8367B_REG_MAC0_FORCE_SELECT+port, regData); }
/* Function Name: * rtl8367b_setAsicRldpMagicNum * Description: * Set Random seed of RLDP * Input: * seed - MAC * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * Note: * None */ ret_t rtl8367b_setAsicRldpMagicNum(ether_addr_t seed) { ret_t retVal; rtk_uint32 regData; rtk_uint16 *accessPtr; rtk_uint32 i; accessPtr = (rtk_uint16*)&seed; for (i = 0; i < 3; i++) { regData = *accessPtr; retVal = rtl8367b_setAsicReg(RTL8367B_RLDP_MAGIC_NUM_REG_BASE + i, regData); if(retVal != RT_ERR_OK) return retVal; accessPtr++; } return retVal; }
/* Function Name: * rtl8367b_setAsicPortIngressBandwidth * Description: * Set per-port total ingress bandwidth * Input: * port - Physical port number (0~7) * bandwidth - The total ingress bandwidth (unit: 8Kbps), 0x1FFFF:disable * preifg - Include preamble and IFG, 0:Exclude, 1:Include * enableFC - Action when input rate exceeds. 0: Drop 1: Flow Control * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_PORT_ID - Invalid port number * RT_ERR_OUT_OF_RANGE - input parameter out of range * Note: * None */ ret_t rtl8367b_setAsicPortIngressBandwidth(rtk_uint32 port, rtk_uint32 bandwidth, rtk_uint32 preifg, rtk_uint32 enableFC) { ret_t retVal; rtk_uint32 regData; rtk_uint32 regAddr; /* Invalid input parameter */ if(port >= RTL8367B_PORTNO) return RT_ERR_PORT_ID; if(bandwidth > RTL8367B_QOS_GRANULARTY_MAX) return RT_ERR_OUT_OF_RANGE; regAddr = RTL8367B_INGRESSBW_PORT_RATE_LSB_REG(port); regData = bandwidth & RTL8367B_QOS_GRANULARTY_LSB_MASK; retVal = rtl8367b_setAsicReg(regAddr, regData); if(retVal != RT_ERR_OK) return retVal; regAddr += 1; regData = (bandwidth & RTL8367B_QOS_GRANULARTY_MSB_MASK) >> RTL8367B_QOS_GRANULARTY_MSB_OFFSET; retVal = rtl8367b_setAsicRegBit(regAddr, 0, regData); if(retVal != RT_ERR_OK) return retVal; regAddr = RTL8367B_PORT_MISC_CFG_REG(port); retVal = rtl8367b_setAsicRegBit(regAddr, RTL8367B_PORT0_MISC_CFG_INGRESSBW_IFG_OFFSET, preifg); if(retVal != RT_ERR_OK) return retVal; regAddr = RTL8367B_PORT_MISC_CFG_REG(port); retVal = rtl8367b_setAsicRegBit(regAddr, RTL8367B_PORT0_MISC_CFG_INGRESSBW_FLOWCTRL_OFFSET, enableFC); if(retVal != RT_ERR_OK) return retVal; return RT_ERR_OK; }
/* Function Name: * rtl8367b_setAsicPortExtMode * Description: * Set external interface mode configuration * Input: * id - external interface id (0~2) * mode - external interface mode * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_OUT_OF_RANGE - input parameter out of range * Note: * None */ ret_t rtl8367b_setAsicPortExtMode(rtk_uint32 id, rtk_uint32 mode) { ret_t retVal; if(id >= RTL8367B_EXTNO) return RT_ERR_OUT_OF_RANGE; if(mode >= EXT_END) return RT_ERR_OUT_OF_RANGE; if(mode == EXT_GMII) { if( (retVal = rtl8367b_setAsicRegBit(RTL8367B_REG_EXT0_RGMXF, RTL8367B_EXT0_RGTX_INV_OFFSET, 1)) != RT_ERR_OK) return retVal; if( (retVal = rtl8367b_setAsicRegBit(RTL8367B_REG_EXT1_RGMXF, RTL8367B_EXT1_RGTX_INV_OFFSET, 1)) != RT_ERR_OK) return retVal; if( (retVal = rtl8367b_setAsicRegBits(RTL8367B_REG_EXT_TXC_DLY, RTL8367B_EXT1_GMII_TX_DELAY_MASK, 5)) != RT_ERR_OK) return retVal; if( (retVal = rtl8367b_setAsicRegBits(RTL8367B_REG_EXT_TXC_DLY, RTL8367B_EXT0_GMII_TX_DELAY_MASK, 6)) != RT_ERR_OK) return retVal; } if( (mode == EXT_TMII_MAC) || (mode == EXT_TMII_PHY) ) { if( (retVal = rtl8367b_setAsicReg(RTL8367B_REG_BYPASS_LINE_RATE, 0x0007)) != RT_ERR_OK) return retVal; } if(0 == id || 1 == id) return rtl8367b_setAsicRegBits(RTL8367B_REG_DIGITAL_INTERFACE_SELECT, RTL8367B_SELECT_GMII_0_MASK << (id * RTL8367B_SELECT_GMII_1_OFFSET), mode); else return rtl8367b_setAsicRegBits(RTL8367B_REG_DIGITAL_INTERFACE_SELECT_1, RTL8367B_SELECT_RGMII_2_MASK, mode); }
/* Function Name: * rtl8367b_setAsicRldpLoopedPortmask * Description: * Clear looped portmask * Input: * portmask - 0~0xFF * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * Note: * None */ ret_t rtl8367b_setAsicRldpLoopedPortmask(rtk_uint32 portmask) { return rtl8367b_setAsicReg(RTL8367B_RLDP_LOOP_PMSK_REG, portmask); }
/* Function Name: * rtl8367b_setAsicSvlanUplinkPortMask * Description: * Set uplink ports mask * Input: * portMask - Uplink port mask setting * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * Note: * None */ ret_t rtl8367b_setAsicSvlanUplinkPortMask(rtk_uint32 portMask) { return rtl8367b_setAsicReg(RTL8367B_REG_SVLAN_UPLINK_PORTMASK, portMask); }
/* Function Name: * rtl8367b_setAsicSvlanTpid * Description: * Set accepted S-VLAN ether type. The default ether type of S-VLAN is 0x88a8 * Input: * protocolType - Ether type of S-tag frame parsing in uplink ports * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * Note: * Ether type of S-tag in 802.1ad is 0x88a8 and there are existed ether type 0x9100 and 0x9200 * for Q-in-Q SLAN design. User can set mathced ether type as service provider supported protocol */ ret_t rtl8367b_setAsicSvlanTpid(rtk_uint32 protocolType) { return rtl8367b_setAsicReg(RTL8367B_REG_VS_TPID, protocolType); }
/* Function Name: * rtl8367b_getAsicVlan4kEntry * Description: * Get VID mapped entry to 4K VLAN table * Input: * pVlan4kEntry - 4K VLAN configuration * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_VLAN_VID - Invalid VID parameter (0~4095) * RT_ERR_BUSYWAIT_TIMEOUT - LUT is busy at retrieving * Note: * None */ ret_t rtl8367b_getAsicVlan4kEntry(rtl8367b_user_vlan4kentry *pVlan4kEntry ) { #if defined(DISABLE_VLAN_SHADOW) rtl8367b_vlan4kentrysmi vlan_4k_entry; rtk_uint32 page_idx; rtk_uint16 *tableAddr; ret_t retVal; rtk_uint32 regData; if(pVlan4kEntry->vid > RTL8367B_VIDMAX) return RT_ERR_VLAN_VID; /* Write Address (VLAN_ID) */ regData = pVlan4kEntry->vid; retVal = rtl8367b_setAsicReg(RTL8367B_TABLE_ACCESS_ADDR_REG, regData); if(retVal != RT_ERR_OK) return retVal; /* Read Command */ retVal = rtl8367b_setAsicRegBits(RTL8367B_TABLE_ACCESS_CTRL_REG, RTL8367B_TABLE_TYPE_MASK | RTL8367B_COMMAND_TYPE_MASK, RTL8367B_TABLE_ACCESS_REG_DATA(TB_OP_READ,TB_TARGET_CVLAN)); if(retVal != RT_ERR_OK) return retVal; /* Check ASIC Command */ retVal = rtl8367b_getAsicRegBit(RTL8367B_TABLE_ACCESS_STATUS_REG, RTL8367B_TABLE_LUT_ADDR_BUSY_FLAG_OFFSET,®Data); if(retVal != RT_ERR_OK) return RT_ERR_BUSYWAIT_TIMEOUT; /* Read VLAN data from register */ tableAddr = (rtk_uint16 *)&vlan_4k_entry; for(page_idx = 0; page_idx < (sizeof(rtl8367b_vlan4kentrysmi) / 2); page_idx++) { retVal = rtl8367b_getAsicReg(RTL8367B_TABLE_ACCESS_RDDATA_BASE + page_idx, ®Data); if(retVal != RT_ERR_OK) return retVal; *tableAddr = regData; tableAddr++; } _rtl8367b_Vlan4kStSmi2User(&vlan_4k_entry, pVlan4kEntry); #else rtk_uint16 vid; if(pVlan4kEntry->vid > RTL8367B_VIDMAX) return RT_ERR_VLAN_VID; vid = pVlan4kEntry->vid; memcpy(pVlan4kEntry, &user_4kvlan[pVlan4kEntry->vid], sizeof(rtl8367b_user_vlan4kentry)); pVlan4kEntry->vid = vid; #endif #if defined(CONFIG_RTL8367B_ASICDRV_TEST) _rtl8367b_Vlan4kStSmi2User(&Rtl8370sVirtualVlanTable[pVlan4kEntry->vid], pVlan4kEntry); #endif return RT_ERR_OK; }
/* Function Name: * rtl8367b_setAsicVlan4kEntry * Description: * Set VID mapped entry to 4K VLAN table * Input: * pVlan4kEntry - 4K VLAN configuration * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * RT_ERR_INPUT - Invalid input parameter * RT_ERR_L2_FID - Invalid FID * RT_ERR_VLAN_VID - Invalid VID parameter (0~4095) * RT_ERR_PORT_MASK - Invalid portmask * RT_ERR_FILTER_METER_ID - Invalid meter * RT_ERR_QOS_INT_PRIORITY - Invalid priority * Note: * None */ ret_t rtl8367b_setAsicVlan4kEntry(rtl8367b_user_vlan4kentry *pVlan4kEntry ) { rtl8367b_vlan4kentrysmi vlan_4k_entry; rtk_uint32 page_idx; rtk_uint16 *tableAddr; ret_t retVal; rtk_uint32 regData; if(pVlan4kEntry->vid > RTL8367B_VIDMAX) return RT_ERR_VLAN_VID; if(pVlan4kEntry->mbr > RTL8367B_PORTMASK) return RT_ERR_PORT_MASK; if(pVlan4kEntry->untag > RTL8367B_PORTMASK) return RT_ERR_PORT_MASK; if(pVlan4kEntry->fid_msti > RTL8367B_FIDMAX) return RT_ERR_L2_FID; if(pVlan4kEntry->meteridx > RTL8367B_METERMAX) return RT_ERR_FILTER_METER_ID; if(pVlan4kEntry->vbpri > RTL8367B_PRIMAX) return RT_ERR_QOS_INT_PRIORITY; memset(&vlan_4k_entry, 0x00, sizeof(rtl8367b_vlan4kentrysmi)); _rtl8367b_Vlan4kStUser2Smi(pVlan4kEntry, &vlan_4k_entry); /* Prepare Data */ tableAddr = (rtk_uint16 *)&vlan_4k_entry; for(page_idx = 0; page_idx < (sizeof(rtl8367b_vlan4kentrysmi) / 2); page_idx++) { regData = *tableAddr; retVal = rtl8367b_setAsicReg(RTL8367B_TABLE_ACCESS_WRDATA_BASE + page_idx, regData); if(retVal != RT_ERR_OK) return retVal; tableAddr++; } /* Write Address (VLAN_ID) */ regData = pVlan4kEntry->vid; retVal = rtl8367b_setAsicReg(RTL8367B_TABLE_ACCESS_ADDR_REG, regData); if(retVal != RT_ERR_OK) return retVal; /* Write Command */ retVal = rtl8367b_setAsicRegBits(RTL8367B_TABLE_ACCESS_CTRL_REG, RTL8367B_TABLE_TYPE_MASK | RTL8367B_COMMAND_TYPE_MASK,RTL8367B_TABLE_ACCESS_REG_DATA(TB_OP_WRITE,TB_TARGET_CVLAN)); if(retVal != RT_ERR_OK) return retVal; #if defined(CONFIG_RTL8367B_ASICDRV_TEST) memcpy(&Rtl8370sVirtualVlanTable[pVlan4kEntry->vid], &vlan_4k_entry, sizeof(rtl8367b_vlan4kentrysmi)); #endif #if !defined(DISABLE_VLAN_SHADOW) memcpy(&user_4kvlan[pVlan4kEntry->vid], pVlan4kEntry, sizeof(rtl8367b_user_vlan4kentry)); #endif return RT_ERR_OK; }
/* Function Name: * rtl8367b_setAsicEeepGigaTxRateTh * Description: * Set EEEP detect Tx rate threshold for sleeping in GIGA mode * Input: * threshold - Threshold of Rx rate for falling sleep * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * Note: * None */ ret_t rtl8367b_setAsicEeepGigaTxRateTh(rtk_uint32 threshold) { return rtl8367b_setAsicReg(RTL8367B_REG_EEEP_TX_RATE_GIGA, threshold); }
/* Function Name: * rtl8367b_setAsicEeep100mTxRateTh * Description: * Set EEEP detect Tx rate threshold for sleeping in 100Mpbs mode * Input: * threshold - Threshold of Rx rate for falling sleep * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * Note: * None */ ret_t rtl8367b_setAsicEeep100mTxRateTh(rtk_uint32 threshold) { return rtl8367b_setAsicReg(RTL8367B_REG_EEEP_TX_RATE_100M, threshold); }
/* Function Name: * rtl8367b_setAsicRldpLeaveLoopedPortmask * Description: * Clear leaved looped portmask * Input: * portmask - 0~0xFF * Output: * None * Return: * RT_ERR_OK - Success * RT_ERR_SMI - SMI access error * Note: * None */ ret_t rtl8367b_setAsicRldpLeaveLoopedPortmask(rtk_uint32 portmask) { return rtl8367b_setAsicReg(RTL8367B_REG_RLDP_RELEASED_INDICATOR, portmask); }