spinlock_t config25_lock;
        spinlock_t mac_ocp_lock;
 
+       spinlock_t cfg9346_usage_lock;
+       int cfg9346_usage_count;
+
        unsigned supports_gmii:1;
        unsigned aspm_manageable:1;
        dma_addr_t counters_phys_addr;
 
 static void rtl_lock_config_regs(struct rtl8169_private *tp)
 {
-       RTL_W8(tp, Cfg9346, Cfg9346_Lock);
+       unsigned long flags;
+
+       spin_lock_irqsave(&tp->cfg9346_usage_lock, flags);
+       if (!--tp->cfg9346_usage_count)
+               RTL_W8(tp, Cfg9346, Cfg9346_Lock);
+       spin_unlock_irqrestore(&tp->cfg9346_usage_lock, flags);
 }
 
 static void rtl_unlock_config_regs(struct rtl8169_private *tp)
 {
-       RTL_W8(tp, Cfg9346, Cfg9346_Unlock);
+       unsigned long flags;
+
+       spin_lock_irqsave(&tp->cfg9346_usage_lock, flags);
+       if (!tp->cfg9346_usage_count++)
+               RTL_W8(tp, Cfg9346, Cfg9346_Unlock);
+       spin_unlock_irqrestore(&tp->cfg9346_usage_lock, flags);
 }
 
 static void rtl_pci_commit(struct rtl8169_private *tp)
        tp->eee_adv = -1;
        tp->ocp_base = OCP_STD_PHY_BASE;
 
+       spin_lock_init(&tp->cfg9346_usage_lock);
        spin_lock_init(&tp->config25_lock);
        spin_lock_init(&tp->mac_ocp_lock);