#include <linux/bcm47xx_nvram.h>
 #include <linux/phy.h>
 #include <linux/phy_fixed.h>
+#include <net/dsa.h>
 #include "bgmac.h"
 
 static bool bgmac_wait_value(struct bgmac *bgmac, u16 reg, u32 mask,
        dma_desc->ctl1 = cpu_to_le32(ctl1);
 }
 
+#define ENET_BRCM_TAG_LEN      4
+
 static netdev_tx_t bgmac_dma_tx_add(struct bgmac *bgmac,
                                    struct bgmac_dma_ring *ring,
                                    struct sk_buff *skb)
        u32 flags;
        int i;
 
+       /* The Ethernet switch we are interfaced with needs packets to be at
+        * least 64 bytes (including FCS) otherwise they will be discarded when
+        * they enter the switch port logic. When Broadcom tags are enabled, we
+        * need to make sure that packets are at least 68 bytes
+        * (including FCS and tag) because the length verification is done after
+        * the Broadcom tag is stripped off the ingress packet.
+        */
+       if (netdev_uses_dsa(net_dev)) {
+               if (skb_put_padto(skb, ETH_ZLEN + ENET_BRCM_TAG_LEN))
+                       goto err_stats;
+       }
+
        if (skb->len > BGMAC_DESC_CTL1_LEN) {
                netdev_err(bgmac->net_dev, "Too long skb (%d)\n", skb->len);
                goto err_drop;
 
 err_drop:
        dev_kfree_skb(skb);
+err_stats:
        net_dev->stats.tx_dropped++;
        net_dev->stats.tx_errors++;
        return NETDEV_TX_OK;