bool ingress, struct netlink_ext_ack *extack)
 {
        struct ksz_device *dev = ds->priv;
+       u8 data;
+       int p;
+
+       /* Limit to one sniffer port
+        * Check if any of the port is already set for sniffing
+        * If yes, instruct the user to remove the previous entry & exit
+        */
+       for (p = 0; p < dev->port_cnt; p++) {
+               /* Skip the current sniffing port */
+               if (p == mirror->to_local_port)
+                       continue;
+
+               ksz_pread8(dev, p, P_MIRROR_CTRL, &data);
+
+               if (data & PORT_MIRROR_SNIFFER) {
+                       NL_SET_ERR_MSG_MOD(extack,
+                                          "Sniffer port is already configured, delete existing rules & retry");
+                       return -EBUSY;
+               }
+       }
 
        if (ingress)
                ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_RX, true);
        else
                ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_TX, true);
 
-       ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_SNIFFER, false);
-
        /* configure mirror port */
        ksz_port_cfg(dev, mirror->to_local_port, P_MIRROR_CTRL,
                     PORT_MIRROR_SNIFFER, true);
                                    struct dsa_mall_mirror_tc_entry *mirror)
 {
        struct ksz_device *dev = ds->priv;
+       bool in_use = false;
        u8 data;
+       int p;
 
        if (mirror->ingress)
                ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_RX, false);
        else
                ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_TX, false);
 
-       ksz_pread8(dev, port, P_MIRROR_CTRL, &data);
 
-       if (!(data & (PORT_MIRROR_RX | PORT_MIRROR_TX)))
+       /* Check if any of the port is still referring to sniffer port */
+       for (p = 0; p < dev->port_cnt; p++) {
+               ksz_pread8(dev, p, P_MIRROR_CTRL, &data);
+
+               if ((data & (PORT_MIRROR_RX | PORT_MIRROR_TX))) {
+                       in_use = true;
+                       break;
+               }
+       }
+
+       /* delete sniffing if there are no other mirroring rules */
+       if (!in_use)
                ksz_port_cfg(dev, mirror->to_local_port, P_MIRROR_CTRL,
                             PORT_MIRROR_SNIFFER, false);
 }