/* 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_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; }