mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-21 09:24:37 +07:00
Merge branch 'dsa-mtu'
Andrew Lunn says: ==================== Adjust MTU of DSA master interface DSA makes use of additional headers to direct a frame in/out of a specific port of the switch. When the slave interfaces uses an MTU of 1500, the master interface can be asked to handle frames with an MTU of 1504, or 1508 bytes. Some Ethernet interfaces won't transmit/receive frames which are bigger than their MTU. Automate the increasing of the MTU on the master interface, by adding to each tagging driver how much overhead they need, and then calling dev_set_mtu() of the master interface to increase its MTU as needed. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
d6a4b570d3
@ -113,6 +113,7 @@ struct dsa_device_ops {
|
||||
struct packet_type *pt);
|
||||
int (*flow_dissect)(const struct sk_buff *skb, __be16 *proto,
|
||||
int *offset);
|
||||
unsigned int overhead;
|
||||
};
|
||||
|
||||
struct dsa_switch_tree {
|
||||
|
@ -158,8 +158,24 @@ static void dsa_master_ethtool_teardown(struct net_device *dev)
|
||||
cpu_dp->orig_ethtool_ops = NULL;
|
||||
}
|
||||
|
||||
void dsa_master_set_mtu(struct net_device *dev, struct dsa_port *cpu_dp)
|
||||
{
|
||||
unsigned int mtu = ETH_DATA_LEN + cpu_dp->tag_ops->overhead;
|
||||
int err;
|
||||
|
||||
rtnl_lock();
|
||||
if (mtu <= dev->max_mtu) {
|
||||
err = dev_set_mtu(dev, mtu);
|
||||
if (err)
|
||||
netdev_dbg(dev, "Unable to set MTU to include for DSA overheads\n");
|
||||
}
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
int dsa_master_setup(struct net_device *dev, struct dsa_port *cpu_dp)
|
||||
{
|
||||
dsa_master_set_mtu(dev, cpu_dp);
|
||||
|
||||
/* If we use a tagging format that doesn't have an ethertype
|
||||
* field, make sure that all packets from this point on get
|
||||
* sent to the tag format's receive function.
|
||||
|
@ -174,6 +174,7 @@ static struct sk_buff *brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
const struct dsa_device_ops brcm_netdev_ops = {
|
||||
.xmit = brcm_tag_xmit,
|
||||
.rcv = brcm_tag_rcv,
|
||||
.overhead = BRCM_TAG_LEN,
|
||||
};
|
||||
#endif
|
||||
|
||||
@ -196,5 +197,6 @@ static struct sk_buff *brcm_tag_rcv_prepend(struct sk_buff *skb,
|
||||
const struct dsa_device_ops brcm_prepend_netdev_ops = {
|
||||
.xmit = brcm_tag_xmit_prepend,
|
||||
.rcv = brcm_tag_rcv_prepend,
|
||||
.overhead = BRCM_TAG_LEN,
|
||||
};
|
||||
#endif
|
||||
|
@ -149,4 +149,5 @@ static struct sk_buff *dsa_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
const struct dsa_device_ops dsa_netdev_ops = {
|
||||
.xmit = dsa_xmit,
|
||||
.rcv = dsa_rcv,
|
||||
.overhead = DSA_HLEN,
|
||||
};
|
||||
|
@ -168,4 +168,5 @@ static struct sk_buff *edsa_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
const struct dsa_device_ops edsa_netdev_ops = {
|
||||
.xmit = edsa_xmit,
|
||||
.rcv = edsa_rcv,
|
||||
.overhead = EDSA_HLEN,
|
||||
};
|
||||
|
@ -106,4 +106,5 @@ static struct sk_buff *gswip_tag_rcv(struct sk_buff *skb,
|
||||
const struct dsa_device_ops gswip_netdev_ops = {
|
||||
.xmit = gswip_tag_xmit,
|
||||
.rcv = gswip_tag_rcv,
|
||||
.overhead = GSWIP_RX_HEADER_LEN,
|
||||
};
|
||||
|
@ -99,4 +99,5 @@ static struct sk_buff *ksz_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
const struct dsa_device_ops ksz_netdev_ops = {
|
||||
.xmit = ksz_xmit,
|
||||
.rcv = ksz_rcv,
|
||||
.overhead = KSZ_INGRESS_TAG_LEN,
|
||||
};
|
||||
|
@ -140,4 +140,5 @@ static struct sk_buff *lan9303_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
const struct dsa_device_ops lan9303_netdev_ops = {
|
||||
.xmit = lan9303_xmit,
|
||||
.rcv = lan9303_rcv,
|
||||
.overhead = LAN9303_TAG_LEN,
|
||||
};
|
||||
|
@ -109,4 +109,5 @@ const struct dsa_device_ops mtk_netdev_ops = {
|
||||
.xmit = mtk_tag_xmit,
|
||||
.rcv = mtk_tag_rcv,
|
||||
.flow_dissect = mtk_tag_flow_dissect,
|
||||
.overhead = MTK_HDR_LEN,
|
||||
};
|
||||
|
@ -101,4 +101,5 @@ static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
const struct dsa_device_ops qca_netdev_ops = {
|
||||
.xmit = qca_tag_xmit,
|
||||
.rcv = qca_tag_rcv,
|
||||
.overhead = QCA_HDR_LEN,
|
||||
};
|
||||
|
@ -84,4 +84,5 @@ static struct sk_buff *trailer_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
const struct dsa_device_ops trailer_netdev_ops = {
|
||||
.xmit = trailer_xmit,
|
||||
.rcv = trailer_rcv,
|
||||
.overhead = 4,
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user