struct orinoco_rx_data *rx_data, *temp;
        struct orinoco_scan_data *sd, *sdtemp;
 
-       wiphy_unregister(wiphy);
-
        /* If the tasklet is scheduled when we call tasklet_kill it
         * will run one final time. However the tasklet will only
         * drain priv->rx_list if the hw is still available. */
 
 
        orinoco_cs_release(link);
 
+       wiphy_unregister(priv_to_wiphy(priv));
        free_orinocodev(priv);
 }                              /* orinoco_cs_detach */
 
 
        err = orinoco_if_add(priv, 0, 0, NULL);
        if (err) {
                printk(KERN_ERR PFX "orinoco_if_add() failed\n");
-               goto fail;
+               goto fail_wiphy;
        }
 
        pci_set_drvdata(pdev, priv);
 
        return 0;
 
+ fail_wiphy:
+       wiphy_unregister(priv_to_wiphy(priv));
  fail:
        free_irq(pdev->irq, priv);
 
        iowrite16(0, card->bridge_io + 10);
 
        orinoco_if_del(priv);
+       wiphy_unregister(priv_to_wiphy(priv));
        free_irq(pdev->irq, priv);
        free_orinocodev(priv);
        pci_iounmap(pdev, priv->hw.iobase);
 
        err = orinoco_if_add(priv, 0, 0, NULL);
        if (err) {
                printk(KERN_ERR PFX "orinoco_if_add() failed\n");
-               goto fail;
+               goto fail_wiphy;
        }
 
        pci_set_drvdata(pdev, priv);
 
        return 0;
 
+ fail_wiphy:
+       wiphy_unregister(priv_to_wiphy(priv));
  fail:
        free_irq(pdev->irq, priv);
 
        struct orinoco_private *priv = pci_get_drvdata(pdev);
 
        orinoco_if_del(priv);
+       wiphy_unregister(priv_to_wiphy(priv));
        free_irq(pdev->irq, priv);
        free_orinocodev(priv);
        pci_iounmap(pdev, priv->hw.iobase);
 
        err = orinoco_if_add(priv, 0, 0, NULL);
        if (err) {
                printk(KERN_ERR PFX "orinoco_if_add() failed\n");
-               goto fail;
+               goto fail_wiphy;
        }
 
        pci_set_drvdata(pdev, priv);
 
        return 0;
 
+ fail_wiphy:
+       wiphy_unregister(priv_to_wiphy(priv));
  fail:
        free_irq(pdev->irq, priv);
 
        struct orinoco_pci_card *card = priv->card;
 
        orinoco_if_del(priv);
+       wiphy_unregister(priv_to_wiphy(priv));
        free_irq(pdev->irq, priv);
        free_orinocodev(priv);
        pci_iounmap(pdev, priv->hw.iobase);
 
        if (upriv->dev) {
                struct orinoco_private *priv = ndev_priv(upriv->dev);
                orinoco_if_del(priv);
+               wiphy_unregister(priv_to_wiphy(upriv));
                free_orinocodev(priv);
        }
 }
        if (orinoco_if_add(priv, 0, 0, &ezusb_netdev_ops) != 0) {
                upriv->dev = NULL;
                err("%s: orinoco_if_add() failed", __func__);
+               wiphy_unregister(priv_to_wiphy(priv));
                goto error;
        }
        upriv->dev = priv->ndev;