pcicore_write32(pc, BCMA_CORE_PCI_PCIEIND_DATA, data);
 }
 
-static void bcma_pcie_mdio_set_phy(struct bcma_drv_pci *pc, u8 phy)
+static void bcma_pcie_mdio_set_phy(struct bcma_drv_pci *pc, u16 phy)
 {
        u32 v;
        int i;
        }
 }
 
-static u16 bcma_pcie_mdio_read(struct bcma_drv_pci *pc, u8 device, u8 address)
+static u16 bcma_pcie_mdio_read(struct bcma_drv_pci *pc, u16 device, u8 address)
 {
        int max_retries = 10;
        u16 ret = 0;
        return ret;
 }
 
-static void bcma_pcie_mdio_write(struct bcma_drv_pci *pc, u8 device,
+static void bcma_pcie_mdio_write(struct bcma_drv_pci *pc, u16 device,
                                u8 address, u16 data)
 {
        int max_retries = 10;
        pcicore_write32(pc, BCMA_CORE_PCI_MDIO_CONTROL, 0);
 }
 
+static u16 bcma_pcie_mdio_writeread(struct bcma_drv_pci *pc, u16 device,
+                                   u8 address, u16 data)
+{
+       bcma_pcie_mdio_write(pc, device, address, data);
+       return bcma_pcie_mdio_read(pc, device, address);
+}
+
 /**************************************************
  * Workarounds.
  **************************************************/
        }
 }
 
+static void bcma_core_pci_power_save(struct bcma_drv_pci *pc, bool up)
+{
+       u16 data;
+
+       if (pc->core->id.rev >= 15 && pc->core->id.rev <= 20) {
+               data = up ? 0x74 : 0x7C;
+               bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
+                                        BCMA_CORE_PCI_MDIO_BLK1_MGMT1, 0x7F64);
+               bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
+                                        BCMA_CORE_PCI_MDIO_BLK1_MGMT3, data);
+       } else if (pc->core->id.rev >= 21 && pc->core->id.rev <= 22) {
+               data = up ? 0x75 : 0x7D;
+               bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
+                                        BCMA_CORE_PCI_MDIO_BLK1_MGMT1, 0x7E65);
+               bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
+                                        BCMA_CORE_PCI_MDIO_BLK1_MGMT3, data);
+       }
+}
+
 /**************************************************
  * Init.
  **************************************************/
 
        pc = &bus->drv_pci[0];
 
+       bcma_core_pci_power_save(pc, true);
+
        bcma_core_pci_extend_L1timer(pc, true);
 }
 EXPORT_SYMBOL_GPL(bcma_core_pci_up);
        pc = &bus->drv_pci[0];
 
        bcma_core_pci_extend_L1timer(pc, false);
+
+       bcma_core_pci_power_save(pc, false);
 }
 EXPORT_SYMBOL_GPL(bcma_core_pci_down);
 
 
 #define BCMA_CORE_PCI_CFG_DEVCTRL              0xd8
 
+#define BCMA_CORE_PCI_
+
+/* MDIO devices (SERDES modules) */
+#define BCMA_CORE_PCI_MDIO_IEEE0               0x000
+#define BCMA_CORE_PCI_MDIO_IEEE1               0x001
+#define BCMA_CORE_PCI_MDIO_BLK0                        0x800
+#define BCMA_CORE_PCI_MDIO_BLK1                        0x801
+#define  BCMA_CORE_PCI_MDIO_BLK1_MGMT0         0x16
+#define  BCMA_CORE_PCI_MDIO_BLK1_MGMT1         0x17
+#define  BCMA_CORE_PCI_MDIO_BLK1_MGMT2         0x18
+#define  BCMA_CORE_PCI_MDIO_BLK1_MGMT3         0x19
+#define  BCMA_CORE_PCI_MDIO_BLK1_MGMT4         0x1A
+#define BCMA_CORE_PCI_MDIO_BLK2                        0x802
+#define BCMA_CORE_PCI_MDIO_BLK3                        0x803
+#define BCMA_CORE_PCI_MDIO_BLK4                        0x804
+#define BCMA_CORE_PCI_MDIO_TXPLL               0x808   /* TXPLL register block idx */
+#define BCMA_CORE_PCI_MDIO_TXCTRL0             0x820
+#define BCMA_CORE_PCI_MDIO_SERDESID            0x831
+#define BCMA_CORE_PCI_MDIO_RXCTRL0             0x840
+
 /* PCIE Root Capability Register bits (Host mode only) */
 #define BCMA_CORE_PCI_RC_CRS_VISIBILITY                0x0001