/** * cvm_oct_common_change_mtu - change the link MTU * @dev: Device to change * @new_mtu: The new MTU * * Returns Zero on success */ static int cvm_oct_common_change_mtu(struct net_device *dev, int new_mtu) { struct octeon_ethernet *priv = netdev_priv(dev); int interface = INTERFACE(priv->port); int index = INDEX(priv->port); #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) int vlan_bytes = 4; #else int vlan_bytes = 0; #endif /* * Limit the MTU to make sure the ethernet packets are between * 64 bytes and 65535 bytes. */ if ((new_mtu + 14 + 4 + vlan_bytes < 64) || (new_mtu + 14 + 4 + vlan_bytes > 65392)) { pr_err("MTU must be between %d and %d.\n", 64 - 14 - 4 - vlan_bytes, 65392 - 14 - 4 - vlan_bytes); return -EINVAL; } dev->mtu = new_mtu; if ((interface < 2) && (cvmx_helper_interface_get_mode(interface) != CVMX_HELPER_INTERFACE_MODE_SPI)) { /* Add ethernet header and FCS, and VLAN if configured. */ int max_packet = new_mtu + 14 + 4 + vlan_bytes; if (OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN58XX)) { /* Signal errors on packets larger than the MTU */ cvmx_write_csr(CVMX_GMXX_RXX_FRM_MAX(index, interface), max_packet); } else { /* * Set the hardware to truncate packets larger * than the MTU and smaller the 64 bytes. */ union cvmx_pip_frm_len_chkx frm_len_chk; frm_len_chk.u64 = 0; frm_len_chk.s.minlen = 64; frm_len_chk.s.maxlen = max_packet; cvmx_write_csr(CVMX_PIP_FRM_LEN_CHKX(interface), frm_len_chk.u64); } /* * Set the hardware to truncate packets larger than * the MTU. The jabber register must be set to a * multiple of 8 bytes, so round up. */ cvmx_write_csr(CVMX_GMXX_RXX_JABBER(index, interface), (max_packet + 7) & ~7u); } return 0; }
/** * cvm_oct_common_change_mtu - change the link MTU * @dev: Device to change * @new_mtu: The new MTU * * Returns Zero on success */ static int cvm_oct_common_change_mtu(struct net_device *dev, int new_mtu) { struct octeon_ethernet *priv = netdev_priv(dev); int interface = INTERFACE(priv->port); #if IS_ENABLED(CONFIG_VLAN_8021Q) int vlan_bytes = VLAN_HLEN; #else int vlan_bytes = 0; #endif int mtu_overhead = ETH_HLEN + ETH_FCS_LEN + vlan_bytes; dev->mtu = new_mtu; if ((interface < 2) && (cvmx_helper_interface_get_mode(interface) != CVMX_HELPER_INTERFACE_MODE_SPI)) { int index = INDEX(priv->port); /* Add ethernet header and FCS, and VLAN if configured. */ int max_packet = new_mtu + mtu_overhead; if (OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN58XX)) { /* Signal errors on packets larger than the MTU */ cvmx_write_csr(CVMX_GMXX_RXX_FRM_MAX(index, interface), max_packet); } else { /* * Set the hardware to truncate packets larger * than the MTU and smaller the 64 bytes. */ union cvmx_pip_frm_len_chkx frm_len_chk; frm_len_chk.u64 = 0; frm_len_chk.s.minlen = VLAN_ETH_ZLEN; frm_len_chk.s.maxlen = max_packet; cvmx_write_csr(CVMX_PIP_FRM_LEN_CHKX(interface), frm_len_chk.u64); } /* * Set the hardware to truncate packets larger than * the MTU. The jabber register must be set to a * multiple of 8 bytes, so round up. */ cvmx_write_csr(CVMX_GMXX_RXX_JABBER(index, interface), (max_packet + 7) & ~7u); } return 0; }
/** * Change the link MTU. Unimplemented * * @param dev Device to change * @param new_mtu The new MTU * @return Zero on success */ int cvm_oct_common_change_mtu(struct ifnet *ifp, int new_mtu) { cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc; int interface = INTERFACE(priv->port); int index = INDEX(priv->port); int vlan_bytes = 4; /* Limit the MTU to make sure the ethernet packets are between 64 bytes and 65535 bytes */ if ((new_mtu + 14 + 4 + vlan_bytes < 64) || (new_mtu + 14 + 4 + vlan_bytes > 65392)) { printf("MTU must be between %d and %d.\n", 64-14-4-vlan_bytes, 65392-14-4-vlan_bytes); return -EINVAL; } ifp->if_mtu = new_mtu; if ((interface < 2) && (cvmx_helper_interface_get_mode(interface) != CVMX_HELPER_INTERFACE_MODE_SPI)) { int max_packet = new_mtu + 14 + 4 + vlan_bytes; /* Add ethernet header and FCS, and VLAN if configured. */ if (OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN58XX)) { /* Signal errors on packets larger than the MTU */ cvmx_write_csr(CVMX_GMXX_RXX_FRM_MAX(index, interface), max_packet); } else { /* Set the hardware to truncate packets larger than the MTU and smaller the 64 bytes */ cvmx_pip_frm_len_chkx_t frm_len_chk; frm_len_chk.u64 = 0; frm_len_chk.s.minlen = 64; frm_len_chk.s.maxlen = max_packet; cvmx_write_csr(CVMX_PIP_FRM_LEN_CHKX(interface), frm_len_chk.u64); } /* Set the hardware to truncate packets larger than the MTU. The jabber register must be set to a multiple of 8 bytes, so round up */ cvmx_write_csr(CVMX_GMXX_RXX_JABBER(index, interface), (max_packet + 7) & ~7u); } return 0; }