net: wangxun: Implement the ndo change mtu interface
authorMengyuan Lou <mengyuanlou@net-swift.com>
Wed, 15 Mar 2023 07:43:04 +0000 (15:43 +0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 17 Mar 2023 07:52:41 +0000 (07:52 +0000)
Add ngbe and txgbe ndo_change_mtu support.

Signed-off-by: Mengyuan Lou <mengyuanlou@net-swift.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/wangxun/libwx/wx_hw.c
drivers/net/ethernet/wangxun/libwx/wx_hw.h
drivers/net/ethernet/wangxun/libwx/wx_type.h
drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
drivers/net/ethernet/wangxun/ngbe/ngbe_type.h
drivers/net/ethernet/wangxun/txgbe/txgbe_main.c
drivers/net/ethernet/wangxun/txgbe/txgbe_type.h

index 7db57f934a91ed58945f3e9da4d59827322a48f7..ca409b4054d0609f97ec15da5de1c8c4aecd2bbb 100644 (file)
@@ -4,6 +4,7 @@
 #include <linux/etherdevice.h>
 #include <linux/netdevice.h>
 #include <linux/if_ether.h>
+#include <linux/if_vlan.h>
 #include <linux/iopoll.h>
 #include <linux/pci.h>
 
@@ -1261,7 +1262,7 @@ static void wx_set_rx_buffer_len(struct wx *wx)
        struct net_device *netdev = wx->netdev;
        u32 mhadd, max_frame;
 
-       max_frame = netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
+       max_frame = netdev->mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
        /* adjust max frame to be at least the size of a standard frame */
        if (max_frame < (ETH_FRAME_LEN + ETH_FCS_LEN))
                max_frame = (ETH_FRAME_LEN + ETH_FCS_LEN);
@@ -1271,6 +1272,24 @@ static void wx_set_rx_buffer_len(struct wx *wx)
                wr32(wx, WX_PSR_MAX_SZ, max_frame);
 }
 
+/**
+ * wx_change_mtu - Change the Maximum Transfer Unit
+ * @netdev: network interface device structure
+ * @new_mtu: new value for maximum frame size
+ *
+ * Returns 0 on success, negative on failure
+ **/
+int wx_change_mtu(struct net_device *netdev, int new_mtu)
+{
+       struct wx *wx = netdev_priv(netdev);
+
+       netdev->mtu = new_mtu;
+       wx_set_rx_buffer_len(wx);
+
+       return 0;
+}
+EXPORT_SYMBOL(wx_change_mtu);
+
 /* Disable the specified rx queue */
 void wx_disable_rx_queue(struct wx *wx, struct wx_ring *ring)
 {
index 44dfd6ea442a935caf0efa6d7c18bbc97c2706ca..c173c56f0ab5d2f28aa14fb2db7fe1e039c714c1 100644 (file)
@@ -23,6 +23,7 @@ void wx_flush_sw_mac_table(struct wx *wx);
 int wx_set_mac(struct net_device *netdev, void *p);
 void wx_disable_rx(struct wx *wx);
 void wx_set_rx_mode(struct net_device *netdev);
+int wx_change_mtu(struct net_device *netdev, int new_mtu);
 void wx_disable_rx_queue(struct wx *wx, struct wx_ring *ring);
 void wx_configure(struct wx *wx);
 int wx_disable_pcie_master(struct wx *wx);
index 77d8d7f1707e9678e04869109a728388f221b620..2b9efd13c500ddb9506f4dc1fa7861000b57dd2b 100644 (file)
 #define WX_MAX_RXD                   8192
 #define WX_MAX_TXD                   8192
 
+#define WX_MAX_JUMBO_FRAME_SIZE      9432 /* max payload 9414 */
+
 /* Supported Rx Buffer Sizes */
 #define WX_RXBUFFER_256      256    /* Used for skb receive header */
 #define WX_RXBUFFER_2K       2048
index 0e4163e1106f14582aa5658a2f84f728d1881dc7..1a004aa2adcb4bcef01ea1ac53ab785a5a0d65b2 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/etherdevice.h>
 #include <net/ip.h>
 #include <linux/phy.h>
+#include <linux/if_vlan.h>
 
 #include "../libwx/wx_type.h"
 #include "../libwx/wx_hw.h"
@@ -469,6 +470,7 @@ static void ngbe_shutdown(struct pci_dev *pdev)
 static const struct net_device_ops ngbe_netdev_ops = {
        .ndo_open               = ngbe_open,
        .ndo_stop               = ngbe_close,
+       .ndo_change_mtu         = wx_change_mtu,
        .ndo_start_xmit         = wx_xmit_frame,
        .ndo_set_rx_mode        = wx_set_rx_mode,
        .ndo_validate_addr      = eth_validate_addr,
@@ -560,7 +562,8 @@ static int ngbe_probe(struct pci_dev *pdev,
        netdev->priv_flags |= IFF_SUPP_NOFCS;
 
        netdev->min_mtu = ETH_MIN_MTU;
-       netdev->max_mtu = NGBE_MAX_JUMBO_FRAME_SIZE - (ETH_HLEN + ETH_FCS_LEN);
+       netdev->max_mtu = WX_MAX_JUMBO_FRAME_SIZE -
+                         (ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN);
 
        wx->bd_number = func_nums;
        /* setup the private structure */
index a2351349785ea2f5fb976a9537ffc67c43a3bdb1..373d5af628cd5245a0e09770b78213738a983d88 100644 (file)
@@ -137,7 +137,6 @@ enum NGBE_MSCA_CMD_value {
 #define NGBE_RX_PB_SIZE                                42
 #define NGBE_MC_TBL_SIZE                       128
 #define NGBE_TDB_PB_SZ                         (20 * 1024) /* 160KB Packet Buffer */
-#define NGBE_MAX_JUMBO_FRAME_SIZE              9432 /* max payload 9414 */
 
 /* TX/RX descriptor defines */
 #define NGBE_DEFAULT_TXD                       512 /* default ring size */
index 859feaafd350052be495aec929387f578ad9c71c..843a88bc416fe5da8a91457e6ae0c4dda0d23b8f 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/string.h>
 #include <linux/etherdevice.h>
 #include <net/ip.h>
+#include <linux/if_vlan.h>
 
 #include "../libwx/wx_type.h"
 #include "../libwx/wx_lib.h"
@@ -486,6 +487,7 @@ static void txgbe_shutdown(struct pci_dev *pdev)
 static const struct net_device_ops txgbe_netdev_ops = {
        .ndo_open               = txgbe_open,
        .ndo_stop               = txgbe_close,
+       .ndo_change_mtu         = wx_change_mtu,
        .ndo_start_xmit         = wx_xmit_frame,
        .ndo_set_rx_mode        = wx_set_rx_mode,
        .ndo_validate_addr      = eth_validate_addr,
@@ -603,7 +605,8 @@ static int txgbe_probe(struct pci_dev *pdev,
        netdev->priv_flags |= IFF_SUPP_NOFCS;
 
        netdev->min_mtu = ETH_MIN_MTU;
-       netdev->max_mtu = TXGBE_MAX_JUMBO_FRAME_SIZE - (ETH_HLEN + ETH_FCS_LEN);
+       netdev->max_mtu = WX_MAX_JUMBO_FRAME_SIZE -
+                         (ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN);
 
        /* make sure the EEPROM is good */
        err = txgbe_validate_eeprom_checksum(wx, NULL);
index 563ea51deca6b43dc7e708b313289db6733ce7bb..63a1c733718d3f735a795a862cf9c321ad2cea47 100644 (file)
@@ -79,7 +79,6 @@
 #define TXGBE_SP_MC_TBL_SIZE    128
 #define TXGBE_SP_RX_PB_SIZE     512
 #define TXGBE_SP_TDB_PB_SZ      (160 * 1024) /* 160KB Packet Buffer */
-#define TXGBE_MAX_JUMBO_FRAME_SIZE      9432 /* max payload 9414 */
 
 /* TX/RX descriptor defines */
 #define TXGBE_DEFAULT_TXD               512