@@ -1539,8 +1539,8 @@ static int mvpp2_prs_vlan_init(struct platform_device *pdev, struct mvpp2 *priv)
1539
1539
if (!priv -> prs_double_vlans )
1540
1540
return - ENOMEM ;
1541
1541
1542
- /* Double VLAN: 0x8100, 0x88A8 */
1543
- err = mvpp2_prs_double_vlan_add (priv , ETH_P_8021Q , ETH_P_8021AD ,
1542
+ /* Double VLAN: 0x88A8, 0x8100 */
1543
+ err = mvpp2_prs_double_vlan_add (priv , ETH_P_8021AD , ETH_P_8021Q ,
1544
1544
MVPP2_PRS_PORT_MASK );
1545
1545
if (err )
1546
1546
return err ;
@@ -1607,59 +1607,45 @@ static int mvpp2_prs_vlan_init(struct platform_device *pdev, struct mvpp2 *priv)
1607
1607
static int mvpp2_prs_pppoe_init (struct mvpp2 * priv )
1608
1608
{
1609
1609
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 ;
1639
1611
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 ;
1645
1618
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 ;
1647
1622
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 );
1653
1628
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 );
1659
1644
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
+ }
1663
1649
1664
1650
/* IPv6 over PPPoE */
1665
1651
tid = mvpp2_prs_tcam_first_free (priv , MVPP2_PE_FIRST_FREE_TID ,
0 commit comments