]> Pileus Git - ~andy/linux/blobdiff - drivers/net/wireless/ath/ath9k/pci.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/hskinnemoen/avr32-2.6
[~andy/linux] / drivers / net / wireless / ath / ath9k / pci.c
index 903dd8ad9d430820a67668754d20c4abd48bbf41..5321f735e5a01592a59869343c2dae16de127210 100644 (file)
@@ -31,8 +31,9 @@ static struct pci_device_id ath_pci_id_table[] __devinitdata = {
 };
 
 /* return bus cachesize in 4B word units */
-static void ath_pci_read_cachesize(struct ath_softc *sc, int *csz)
+static void ath_pci_read_cachesize(struct ath_common *common, int *csz)
 {
+       struct ath_softc *sc = (struct ath_softc *) common->priv;
        u8 u8tmp;
 
        pci_read_config_byte(to_pci_dev(sc->dev), PCI_CACHE_LINE_SIZE, &u8tmp);
@@ -48,8 +49,9 @@ static void ath_pci_read_cachesize(struct ath_softc *sc, int *csz)
                *csz = DEFAULT_CACHELINE >> 2;   /* Use the default size */
 }
 
-static void ath_pci_cleanup(struct ath_softc *sc)
+static void ath_pci_cleanup(struct ath_common *common)
 {
+       struct ath_softc *sc = (struct ath_softc *) common->priv;
        struct pci_dev *pdev = to_pci_dev(sc->dev);
 
        pci_iounmap(pdev, sc->mem);
@@ -57,9 +59,11 @@ static void ath_pci_cleanup(struct ath_softc *sc)
        pci_release_region(pdev, 0);
 }
 
-static bool ath_pci_eeprom_read(struct ath_hw *ah, u32 off, u16 *data)
+static bool ath_pci_eeprom_read(struct ath_common *common, u32 off, u16 *data)
 {
-       (void)REG_READ(ah, AR5416_EEPROM_OFFSET + (off << AR5416_EEPROM_S));
+       struct ath_hw *ah = (struct ath_hw *) common->ah;
+
+       common->ops->read(ah, AR5416_EEPROM_OFFSET + (off << AR5416_EEPROM_S));
 
        if (!ath9k_hw_wait(ah,
                           AR_EEPROM_STATUS_DATA,
@@ -69,16 +73,34 @@ static bool ath_pci_eeprom_read(struct ath_hw *ah, u32 off, u16 *data)
                return false;
        }
 
-       *data = MS(REG_READ(ah, AR_EEPROM_STATUS_DATA),
+       *data = MS(common->ops->read(ah, AR_EEPROM_STATUS_DATA),
                   AR_EEPROM_STATUS_DATA_VAL);
 
        return true;
 }
 
-static struct ath_bus_ops ath_pci_bus_ops = {
+/*
+ * Bluetooth coexistance requires disabling ASPM.
+ */
+static void ath_pci_bt_coex_prep(struct ath_common *common)
+{
+       struct ath_softc *sc = (struct ath_softc *) common->priv;
+       struct pci_dev *pdev = to_pci_dev(sc->dev);
+       u8 aspm;
+
+       if (!pdev->is_pcie)
+               return;
+
+       pci_read_config_byte(pdev, ATH_PCIE_CAP_LINK_CTRL, &aspm);
+       aspm &= ~(ATH_PCIE_CAP_LINK_L0S | ATH_PCIE_CAP_LINK_L1);
+       pci_write_config_byte(pdev, ATH_PCIE_CAP_LINK_CTRL, aspm);
+}
+
+const static struct ath_bus_ops ath_pci_bus_ops = {
        .read_cachesize = ath_pci_read_cachesize,
        .cleanup = ath_pci_cleanup,
        .eeprom_read = ath_pci_eeprom_read,
+       .bt_coex_prep = ath_pci_bt_coex_prep,
 };
 
 static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
@@ -92,6 +114,7 @@ static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        u32 val;
        int ret = 0;
        struct ath_hw *ah;
+       char hw_name[64];
 
        if (pci_enable_device(pdev))
                return -EIO;
@@ -177,10 +200,9 @@ static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        sc->hw = hw;
        sc->dev = &pdev->dev;
        sc->mem = mem;
-       sc->bus_ops = &ath_pci_bus_ops;
 
        pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &subsysid);
-       ret = ath_init_device(id->device, sc, subsysid);
+       ret = ath_init_device(id->device, sc, subsysid, &ath_pci_bus_ops);
        if (ret) {
                dev_err(&pdev->dev, "failed to initialize device\n");
                goto bad3;
@@ -197,14 +219,11 @@ static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        sc->irq = pdev->irq;
 
        ah = sc->sc_ah;
+       ath9k_hw_name(ah, hw_name, sizeof(hw_name));
        printk(KERN_INFO
-              "%s: Atheros AR%s MAC/BB Rev:%x "
-              "AR%s RF Rev:%x: mem=0x%lx, irq=%d\n",
+              "%s: %s mem=0x%lx, irq=%d\n",
               wiphy_name(hw->wiphy),
-              ath_mac_bb_name(ah->hw_version.macVersion),
-              ah->hw_version.macRev,
-              ath_rf_name((ah->hw_version.analog5GhzRev & AR_RADIO_SREV_MAJOR)),
-              ah->hw_version.phyRev,
+              hw_name,
               (unsigned long)mem, pdev->irq);
 
        return 0;