*/
        int     (*suspend)(struct dsa_switch *ds);
        int     (*resume)(struct dsa_switch *ds);
+
+       /*
+        * Port enable/disable
+        */
+       int     (*port_enable)(struct dsa_switch *ds, int port,
+                              struct phy_device *phy);
+       void    (*port_disable)(struct dsa_switch *ds, int port,
+                               struct phy_device *phy);
 };
 
 void register_switch_driver(struct dsa_switch_driver *type);
 
 {
        struct dsa_slave_priv *p = netdev_priv(dev);
        struct net_device *master = p->parent->dst->master_netdev;
+       struct dsa_switch *ds = p->parent;
        int err;
 
        if (!(master->flags & IFF_UP))
                        goto clear_allmulti;
        }
 
+       if (ds->drv->port_enable) {
+               err = ds->drv->port_enable(ds, p->port, p->phy);
+               if (err)
+                       goto clear_promisc;
+       }
+
        if (p->phy)
                phy_start(p->phy);
 
        return 0;
 
+clear_promisc:
+       if (dev->flags & IFF_PROMISC)
+               dev_set_promiscuity(master, 0);
 clear_allmulti:
        if (dev->flags & IFF_ALLMULTI)
                dev_set_allmulti(master, -1);
 {
        struct dsa_slave_priv *p = netdev_priv(dev);
        struct net_device *master = p->parent->dst->master_netdev;
+       struct dsa_switch *ds = p->parent;
 
        if (p->phy)
                phy_stop(p->phy);
        if (!ether_addr_equal(dev->dev_addr, master->dev_addr))
                dev_uc_del(master, dev->dev_addr);
 
+       if (ds->drv->port_disable)
+               ds->drv->port_disable(ds, p->port, p->phy);
+
        return 0;
 }