u8 curbssid[ETH_ALEN];
        u8 bssidmask[ETH_ALEN];
        struct ath_regulatory regulatory;
-       struct ath_ops *ops;
+       const struct ath_ops *ops;
 };
 
 struct sk_buff *ath_rxbuf_alloc(struct ath_common *common,
 
  */
 
 /* Attach/Detach Functions */
-extern struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc);
+extern int ath5k_hw_attach(struct ath5k_softc *sc);
 extern void ath5k_hw_detach(struct ath5k_hw *ah);
 
 /* LED functions */
 
  * -ENODEV if the device is not supported or prints an error msg if something
  * else went wrong.
  */
-struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc)
+int ath5k_hw_attach(struct ath5k_softc *sc)
 {
-       struct ath5k_hw *ah;
+       struct ath5k_hw *ah = sc->ah;
        struct ath_common *common;
        struct pci_dev *pdev = sc->pdev;
        struct ath5k_eeprom_info *ee;
        int ret;
        u32 srev;
 
-       /*If we passed the test malloc a ath5k_hw struct*/
-       ah = kzalloc(sizeof(struct ath5k_hw), GFP_KERNEL);
-       if (ah == NULL) {
-               ret = -ENOMEM;
-               ATH5K_ERR(sc, "out of memory\n");
-               goto err;
-       }
-
-       ah->ah_sc = sc;
-       ah->ah_sc->ah = ah;
-       ah->ah_iobase = sc->iobase;
-       common = ath5k_hw_common(ah);
-
        /*
         * HW information
         */
        /* turn on HW LEDs */
        ath5k_hw_set_ledstate(ah, AR5K_LED_INIT);
 
-       return ah;
+       return 0;
 err_free:
        kfree(ah);
-err:
-       return ERR_PTR(ret);
+       return ret;
 }
 
 /**
        ath5k_eeprom_detach(ah);
 
        /* assume interrupts are down */
-       kfree(ah);
 }
 
                goto err_free;
        }
 
-       /* Initialize device */
-       sc->ah = ath5k_hw_attach(sc);
-       if (IS_ERR(sc->ah)) {
-               ret = PTR_ERR(sc->ah);
+       /*If we passed the test malloc a ath5k_hw struct*/
+       sc->ah = kzalloc(sizeof(struct ath5k_hw), GFP_KERNEL);
+       if (!sc->ah) {
+               ret = -ENOMEM;
+               ATH5K_ERR(sc, "out of memory\n");
                goto err_irq;
        }
 
+       sc->ah->ah_sc = sc;
+       sc->ah->ah_iobase = sc->iobase;
        common = ath5k_hw_common(sc->ah);
        common->cachelsz = csz << 2; /* convert to bytes */
 
+       /* Initialize device */
+       ret = ath5k_hw_attach(sc);
+       if (ret) {
+               goto err_free_ah;
+       }
+
        /* set up multi-rate retry capabilities */
        if (sc->ah->ah_version == AR5K_AR5212) {
                hw->max_rates = 4;
        ath5k_hw_detach(sc->ah);
 err_irq:
        free_irq(pdev->irq, sc);
+err_free_ah:
+       kfree(sc->ah);
 err_free:
        ieee80211_free_hw(hw);
 err_map:
        ath5k_debug_finish_device(sc);
        ath5k_detach(pdev, hw);
        ath5k_hw_detach(sc->ah);
+       kfree(sc->ah);
        free_irq(pdev->irq, sc);
        pci_iounmap(pdev, sc->iobase);
        pci_release_region(pdev, 0);