@@ -1607,59 +1607,45 @@ static int mvpp2_prs_vlan_init(struct platform_device *pdev, struct mvpp2 *priv)
16071607static int mvpp2_prs_pppoe_init (struct mvpp2 * priv )
16081608{
16091609 struct mvpp2_prs_entry pe ;
1610- int tid ;
1611-
1612- /* IPv4 over PPPoE with options */
1613- tid = mvpp2_prs_tcam_first_free (priv , MVPP2_PE_FIRST_FREE_TID ,
1614- MVPP2_PE_LAST_FREE_TID );
1615- if (tid < 0 )
1616- return tid ;
1617-
1618- memset (& pe , 0 , sizeof (pe ));
1619- mvpp2_prs_tcam_lu_set (& pe , MVPP2_PRS_LU_PPPOE );
1620- pe .index = tid ;
1621-
1622- mvpp2_prs_match_etype (& pe , 0 , PPP_IP );
1623-
1624- mvpp2_prs_sram_next_lu_set (& pe , MVPP2_PRS_LU_IP4 );
1625- mvpp2_prs_sram_ri_update (& pe , MVPP2_PRS_RI_L3_IP4_OPT ,
1626- MVPP2_PRS_RI_L3_PROTO_MASK );
1627- /* goto ipv4 dest-address (skip eth_type + IP-header-size - 4) */
1628- mvpp2_prs_sram_shift_set (& pe , MVPP2_ETH_TYPE_LEN +
1629- sizeof (struct iphdr ) - 4 ,
1630- MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD );
1631- /* Set L3 offset */
1632- mvpp2_prs_sram_offset_set (& pe , MVPP2_PRS_SRAM_UDF_TYPE_L3 ,
1633- MVPP2_ETH_TYPE_LEN ,
1634- MVPP2_PRS_SRAM_OP_SEL_UDF_ADD );
1635-
1636- /* Update shadow table and hw entry */
1637- mvpp2_prs_shadow_set (priv , pe .index , MVPP2_PRS_LU_PPPOE );
1638- mvpp2_prs_hw_write (priv , & pe );
1610+ int tid , ihl ;
16391611
1640- /* IPv4 over PPPoE without options */
1641- tid = mvpp2_prs_tcam_first_free (priv , MVPP2_PE_FIRST_FREE_TID ,
1642- MVPP2_PE_LAST_FREE_TID );
1643- if (tid < 0 )
1644- return tid ;
1612+ /* IPv4 over PPPoE with header length >= 5 */
1613+ for (ihl = MVPP2_PRS_IPV4_IHL_MIN ; ihl <= MVPP2_PRS_IPV4_IHL_MAX ; ihl ++ ) {
1614+ tid = mvpp2_prs_tcam_first_free (priv , MVPP2_PE_FIRST_FREE_TID ,
1615+ MVPP2_PE_LAST_FREE_TID );
1616+ if (tid < 0 )
1617+ return tid ;
16451618
1646- pe .index = tid ;
1619+ memset (& pe , 0 , sizeof (pe ));
1620+ mvpp2_prs_tcam_lu_set (& pe , MVPP2_PRS_LU_PPPOE );
1621+ pe .index = tid ;
16471622
1648- mvpp2_prs_tcam_data_byte_set (& pe , MVPP2_ETH_TYPE_LEN ,
1649- MVPP2_PRS_IPV4_HEAD |
1650- MVPP2_PRS_IPV4_IHL_MIN ,
1651- MVPP2_PRS_IPV4_HEAD_MASK |
1652- MVPP2_PRS_IPV4_IHL_MASK );
1623+ mvpp2_prs_match_etype (& pe , 0 , PPP_IP );
1624+ mvpp2_prs_tcam_data_byte_set ( & pe , MVPP2_ETH_TYPE_LEN ,
1625+ MVPP2_PRS_IPV4_HEAD | ihl ,
1626+ MVPP2_PRS_IPV4_HEAD_MASK |
1627+ MVPP2_PRS_IPV4_IHL_MASK );
16531628
1654- /* Clear ri before updating */
1655- pe .sram [MVPP2_PRS_SRAM_RI_WORD ] = 0x0 ;
1656- pe .sram [MVPP2_PRS_SRAM_RI_CTRL_WORD ] = 0x0 ;
1657- mvpp2_prs_sram_ri_update (& pe , MVPP2_PRS_RI_L3_IP4 ,
1658- MVPP2_PRS_RI_L3_PROTO_MASK );
1629+ mvpp2_prs_sram_next_lu_set (& pe , MVPP2_PRS_LU_IP4 );
1630+ mvpp2_prs_sram_ri_update (& pe , MVPP2_PRS_RI_L3_IP4 ,
1631+ MVPP2_PRS_RI_L3_PROTO_MASK );
1632+ /* goto ipv4 dst-address (skip eth_type + IP-header-size - 4) */
1633+ mvpp2_prs_sram_shift_set (& pe , MVPP2_ETH_TYPE_LEN +
1634+ sizeof (struct iphdr ) - 4 ,
1635+ MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD );
1636+ /* Set L3 offset */
1637+ mvpp2_prs_sram_offset_set (& pe , MVPP2_PRS_SRAM_UDF_TYPE_L3 ,
1638+ MVPP2_ETH_TYPE_LEN ,
1639+ MVPP2_PRS_SRAM_OP_SEL_UDF_ADD );
1640+ /* Set L4 offset */
1641+ mvpp2_prs_sram_offset_set (& pe , MVPP2_PRS_SRAM_UDF_TYPE_L4 ,
1642+ MVPP2_ETH_TYPE_LEN + (ihl * 4 ),
1643+ MVPP2_PRS_SRAM_OP_SEL_UDF_ADD );
16591644
1660- /* Update shadow table and hw entry */
1661- mvpp2_prs_shadow_set (priv , pe .index , MVPP2_PRS_LU_PPPOE );
1662- mvpp2_prs_hw_write (priv , & pe );
1645+ /* Update shadow table and hw entry */
1646+ mvpp2_prs_shadow_set (priv , pe .index , MVPP2_PRS_LU_PPPOE );
1647+ mvpp2_prs_hw_write (priv , & pe );
1648+ }
16631649
16641650 /* IPv6 over PPPoE */
16651651 tid = mvpp2_prs_tcam_first_free (priv , MVPP2_PE_FIRST_FREE_TID ,
0 commit comments