@@ -487,7 +487,7 @@ static int enetc_refill_rx_ring(struct enetc_bdr *rx_ring, const int buff_cnt)
487487 return j ;
488488}
489489
490- #ifdef CONFIG_FSL_ENETC_HW_TIMESTAMPING
490+ #ifdef CONFIG_FSL_ENETC_PTP_CLOCK
491491static void enetc_get_rx_tstamp (struct net_device * ndev ,
492492 union enetc_rx_bd * rxbd ,
493493 struct sk_buff * skb )
@@ -501,7 +501,8 @@ static void enetc_get_rx_tstamp(struct net_device *ndev,
501501 if (le16_to_cpu (rxbd -> r .flags ) & ENETC_RXBD_FLAG_TSTMP ) {
502502 lo = enetc_rd (hw , ENETC_SICTR0 );
503503 hi = enetc_rd (hw , ENETC_SICTR1 );
504- tstamp_lo = le32_to_cpu (rxbd -> r .tstamp );
504+ rxbd = enetc_rxbd_ext (rxbd );
505+ tstamp_lo = le32_to_cpu (rxbd -> ext .tstamp );
505506 if (lo <= tstamp_lo )
506507 hi -= 1 ;
507508
@@ -515,7 +516,7 @@ static void enetc_get_rx_tstamp(struct net_device *ndev,
515516static void enetc_get_offloads (struct enetc_bdr * rx_ring ,
516517 union enetc_rx_bd * rxbd , struct sk_buff * skb )
517518{
518- #ifdef CONFIG_FSL_ENETC_HW_TIMESTAMPING
519+ #ifdef CONFIG_FSL_ENETC_PTP_CLOCK
519520 struct enetc_ndev_priv * priv = netdev_priv (rx_ring -> ndev );
520521#endif
521522 /* TODO: hashing */
@@ -532,7 +533,7 @@ static void enetc_get_offloads(struct enetc_bdr *rx_ring,
532533 if (le16_to_cpu (rxbd -> r .flags ) & ENETC_RXBD_FLAG_VLAN )
533534 __vlan_hwaccel_put_tag (skb , htons (ETH_P_8021Q ),
534535 le16_to_cpu (rxbd -> r .vlan_opt ));
535- #ifdef CONFIG_FSL_ENETC_HW_TIMESTAMPING
536+ #ifdef CONFIG_FSL_ENETC_PTP_CLOCK
536537 if (priv -> active_offloads & ENETC_F_RX_TSTAMP )
537538 enetc_get_rx_tstamp (rx_ring -> ndev , rxbd , skb );
538539#endif
@@ -838,15 +839,19 @@ static void enetc_free_tx_resources(struct enetc_ndev_priv *priv)
838839 enetc_free_txbdr (priv -> tx_ring [i ]);
839840}
840841
841- static int enetc_alloc_rxbdr (struct enetc_bdr * rxr )
842+ static int enetc_alloc_rxbdr (struct enetc_bdr * rxr , bool extended )
842843{
844+ size_t size = sizeof (union enetc_rx_bd );
843845 int err ;
844846
845847 rxr -> rx_swbd = vzalloc (rxr -> bd_count * sizeof (struct enetc_rx_swbd ));
846848 if (!rxr -> rx_swbd )
847849 return - ENOMEM ;
848850
849- err = enetc_dma_alloc_bdr (rxr , sizeof (union enetc_rx_bd ));
851+ if (extended )
852+ size *= 2 ;
853+
854+ err = enetc_dma_alloc_bdr (rxr , size );
850855 if (err ) {
851856 vfree (rxr -> rx_swbd );
852857 return err ;
@@ -855,6 +860,7 @@ static int enetc_alloc_rxbdr(struct enetc_bdr *rxr)
855860 rxr -> next_to_clean = 0 ;
856861 rxr -> next_to_use = 0 ;
857862 rxr -> next_to_alloc = 0 ;
863+ rxr -> ext_en = extended ;
858864
859865 return 0 ;
860866}
@@ -874,10 +880,11 @@ static void enetc_free_rxbdr(struct enetc_bdr *rxr)
874880
875881static int enetc_alloc_rx_resources (struct enetc_ndev_priv * priv )
876882{
883+ bool extended = !!(priv -> active_offloads & ENETC_F_RX_TSTAMP );
877884 int i , err ;
878885
879886 for (i = 0 ; i < priv -> num_rx_rings ; i ++ ) {
880- err = enetc_alloc_rxbdr (priv -> rx_ring [i ]);
887+ err = enetc_alloc_rxbdr (priv -> rx_ring [i ], extended );
881888
882889 if (err )
883890 goto fail ;
@@ -1167,9 +1174,10 @@ static void enetc_setup_rxbdr(struct enetc_hw *hw, struct enetc_bdr *rx_ring)
11671174 enetc_rxbdr_wr (hw , idx , ENETC_RBICIR0 , ENETC_RBICIR0_ICEN | 0x1 );
11681175
11691176 rbmr = ENETC_RBMR_EN ;
1170- #ifdef CONFIG_FSL_ENETC_HW_TIMESTAMPING
1171- rbmr |= ENETC_RBMR_BDS ;
1172- #endif
1177+
1178+ if (rx_ring -> ext_en )
1179+ rbmr |= ENETC_RBMR_BDS ;
1180+
11731181 if (rx_ring -> ndev -> features & NETIF_F_HW_VLAN_CTAG_RX )
11741182 rbmr |= ENETC_RBMR_VTE ;
11751183
@@ -1570,11 +1578,12 @@ int enetc_set_features(struct net_device *ndev,
15701578 return 0 ;
15711579}
15721580
1573- #ifdef CONFIG_FSL_ENETC_HW_TIMESTAMPING
1581+ #ifdef CONFIG_FSL_ENETC_PTP_CLOCK
15741582static int enetc_hwtstamp_set (struct net_device * ndev , struct ifreq * ifr )
15751583{
15761584 struct enetc_ndev_priv * priv = netdev_priv (ndev );
15771585 struct hwtstamp_config config ;
1586+ int ao ;
15781587
15791588 if (copy_from_user (& config , ifr -> ifr_data , sizeof (config )))
15801589 return - EFAULT ;
@@ -1590,6 +1599,7 @@ static int enetc_hwtstamp_set(struct net_device *ndev, struct ifreq *ifr)
15901599 return - ERANGE ;
15911600 }
15921601
1602+ ao = priv -> active_offloads ;
15931603 switch (config .rx_filter ) {
15941604 case HWTSTAMP_FILTER_NONE :
15951605 priv -> active_offloads &= ~ENETC_F_RX_TSTAMP ;
@@ -1599,6 +1609,11 @@ static int enetc_hwtstamp_set(struct net_device *ndev, struct ifreq *ifr)
15991609 config .rx_filter = HWTSTAMP_FILTER_ALL ;
16001610 }
16011611
1612+ if (netif_running (ndev ) && ao != priv -> active_offloads ) {
1613+ enetc_close (ndev );
1614+ enetc_open (ndev );
1615+ }
1616+
16021617 return copy_to_user (ifr -> ifr_data , & config , sizeof (config )) ?
16031618 - EFAULT : 0 ;
16041619}
@@ -1625,7 +1640,7 @@ static int enetc_hwtstamp_get(struct net_device *ndev, struct ifreq *ifr)
16251640
16261641int enetc_ioctl (struct net_device * ndev , struct ifreq * rq , int cmd )
16271642{
1628- #ifdef CONFIG_FSL_ENETC_HW_TIMESTAMPING
1643+ #ifdef CONFIG_FSL_ENETC_PTP_CLOCK
16291644 if (cmd == SIOCSHWTSTAMP )
16301645 return enetc_hwtstamp_set (ndev , rq );
16311646 if (cmd == SIOCGHWTSTAMP )
0 commit comments