@@ -2230,17 +2230,9 @@ jme_change_mtu(struct net_device *netdev, int new_mtu)
22302230 jme_restart_rx_engine (jme );
22312231 }
22322232
2233- if (new_mtu > 1900 ) {
2234- netdev -> features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
2235- NETIF_F_TSO | NETIF_F_TSO6 );
2236- } else {
2237- if (test_bit (JME_FLAG_TXCSUM , & jme -> flags ))
2238- netdev -> features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM ;
2239- if (test_bit (JME_FLAG_TSO , & jme -> flags ))
2240- netdev -> features |= NETIF_F_TSO | NETIF_F_TSO6 ;
2241- }
2242-
22432233 netdev -> mtu = new_mtu ;
2234+ netdev_update_features (netdev );
2235+
22442236 jme_reset_link (jme );
22452237
22462238 return 0 ;
@@ -2640,19 +2632,20 @@ jme_set_msglevel(struct net_device *netdev, u32 value)
26402632}
26412633
26422634static u32
2643- jme_get_rx_csum (struct net_device * netdev )
2635+ jme_fix_features (struct net_device * netdev , u32 features )
26442636{
2645- struct jme_adapter * jme = netdev_priv (netdev );
2646- return jme -> reg_rxmcs & RXMCS_CHECKSUM ;
2637+ if (netdev -> mtu > 1900 )
2638+ features &= ~(NETIF_F_ALL_TSO | NETIF_F_ALL_CSUM );
2639+ return features ;
26472640}
26482641
26492642static int
2650- jme_set_rx_csum (struct net_device * netdev , u32 on )
2643+ jme_set_features (struct net_device * netdev , u32 features )
26512644{
26522645 struct jme_adapter * jme = netdev_priv (netdev );
26532646
26542647 spin_lock_bh (& jme -> rxmcs_lock );
2655- if (on )
2648+ if (features & NETIF_F_RXCSUM )
26562649 jme -> reg_rxmcs |= RXMCS_CHECKSUM ;
26572650 else
26582651 jme -> reg_rxmcs &= ~RXMCS_CHECKSUM ;
@@ -2662,42 +2655,6 @@ jme_set_rx_csum(struct net_device *netdev, u32 on)
26622655 return 0 ;
26632656}
26642657
2665- static int
2666- jme_set_tx_csum (struct net_device * netdev , u32 on )
2667- {
2668- struct jme_adapter * jme = netdev_priv (netdev );
2669-
2670- if (on ) {
2671- set_bit (JME_FLAG_TXCSUM , & jme -> flags );
2672- if (netdev -> mtu <= 1900 )
2673- netdev -> features |=
2674- NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM ;
2675- } else {
2676- clear_bit (JME_FLAG_TXCSUM , & jme -> flags );
2677- netdev -> features &=
2678- ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM );
2679- }
2680-
2681- return 0 ;
2682- }
2683-
2684- static int
2685- jme_set_tso (struct net_device * netdev , u32 on )
2686- {
2687- struct jme_adapter * jme = netdev_priv (netdev );
2688-
2689- if (on ) {
2690- set_bit (JME_FLAG_TSO , & jme -> flags );
2691- if (netdev -> mtu <= 1900 )
2692- netdev -> features |= NETIF_F_TSO | NETIF_F_TSO6 ;
2693- } else {
2694- clear_bit (JME_FLAG_TSO , & jme -> flags );
2695- netdev -> features &= ~(NETIF_F_TSO | NETIF_F_TSO6 );
2696- }
2697-
2698- return 0 ;
2699- }
2700-
27012658static int
27022659jme_nway_reset (struct net_device * netdev )
27032660{
@@ -2839,11 +2796,6 @@ static const struct ethtool_ops jme_ethtool_ops = {
28392796 .get_link = jme_get_link ,
28402797 .get_msglevel = jme_get_msglevel ,
28412798 .set_msglevel = jme_set_msglevel ,
2842- .get_rx_csum = jme_get_rx_csum ,
2843- .set_rx_csum = jme_set_rx_csum ,
2844- .set_tx_csum = jme_set_tx_csum ,
2845- .set_tso = jme_set_tso ,
2846- .set_sg = ethtool_op_set_sg ,
28472799 .nway_reset = jme_nway_reset ,
28482800 .get_eeprom_len = jme_get_eeprom_len ,
28492801 .get_eeprom = jme_get_eeprom ,
@@ -2903,6 +2855,8 @@ static const struct net_device_ops jme_netdev_ops = {
29032855 .ndo_change_mtu = jme_change_mtu ,
29042856 .ndo_tx_timeout = jme_tx_timeout ,
29052857 .ndo_vlan_rx_register = jme_vlan_rx_register ,
2858+ .ndo_fix_features = jme_fix_features ,
2859+ .ndo_set_features = jme_set_features ,
29062860};
29072861
29082862static int __devinit
@@ -2957,6 +2911,12 @@ jme_init_one(struct pci_dev *pdev,
29572911 netdev -> netdev_ops = & jme_netdev_ops ;
29582912 netdev -> ethtool_ops = & jme_ethtool_ops ;
29592913 netdev -> watchdog_timeo = TX_TIMEOUT ;
2914+ netdev -> hw_features = NETIF_F_IP_CSUM |
2915+ NETIF_F_IPV6_CSUM |
2916+ NETIF_F_SG |
2917+ NETIF_F_TSO |
2918+ NETIF_F_TSO6 |
2919+ NETIF_F_RXCSUM ;
29602920 netdev -> features = NETIF_F_IP_CSUM |
29612921 NETIF_F_IPV6_CSUM |
29622922 NETIF_F_SG |
@@ -3040,8 +3000,9 @@ jme_init_one(struct pci_dev *pdev,
30403000 jme -> reg_txpfc = 0 ;
30413001 jme -> reg_pmcs = PMCS_MFEN ;
30423002 jme -> reg_gpreg1 = GPREG1_DEFAULT ;
3043- set_bit (JME_FLAG_TXCSUM , & jme -> flags );
3044- set_bit (JME_FLAG_TSO , & jme -> flags );
3003+
3004+ if (jme -> reg_rxmcs & RXMCS_CHECKSUM )
3005+ netdev -> features |= NETIF_F_RXCSUM ;
30453006
30463007 /*
30473008 * Get Max Read Req Size from PCI Config Space
0 commit comments