priv = hw->priv;
        priv->bus = bus;
        priv->shrd = &priv->_shrd;
+       bus->shrd = priv->shrd;
        priv->shrd->bus = bus;
        priv->shrd->priv = priv;
-       bus_set_drv_data(priv->bus, priv->shrd);
 
        priv->shrd->trans = trans_ops->alloc(priv->shrd);
        if (priv->shrd->trans == NULL) {
 
        iwl_trans_free(trans(priv));
 
-       bus_set_drv_data(priv->bus, NULL);
-
        iwl_uninit_drv(priv);
 
        dev_kfree_skb(priv->beacon_skb);
 
  * struct iwl_bus_ops - bus specific operations
  * @get_pm_support: must returns true if the bus can go to sleep
  * @apm_config: will be called during the config of the APM
- * @set_drv_data: set the shared data pointer to the bus layer
  * @get_hw_id: prints the hw_id in the provided buffer
  * @write8: write a byte to register at offset ofs
  * @write32: write a dword to register at offset ofs
 struct iwl_bus_ops {
        bool (*get_pm_support)(struct iwl_bus *bus);
        void (*apm_config)(struct iwl_bus *bus);
-       void (*set_drv_data)(struct iwl_bus *bus, struct iwl_shared *shrd);
        void (*get_hw_id)(struct iwl_bus *bus, char buf[], int buf_len);
        void (*write8)(struct iwl_bus *bus, u32 ofs, u8 val);
        void (*write32)(struct iwl_bus *bus, u32 ofs, u32 val);
  * @dev - pointer to struct device * that represents the device
  * @ops - pointer to iwl_bus_ops
  * @shrd - pointer to iwl_shared which holds shared data from the upper layer
+ *     NB: for the time being this needs to be set by the upper layer since
+ *     it allocates the shared data
  * @irq - the irq number for the device
  * @reg_lock - protect hw register access
  */
        bus->ops->apm_config(bus);
 }
 
-static inline void bus_set_drv_data(struct iwl_bus *bus,
-                               struct iwl_shared *shrd)
-{
-       bus->ops->set_drv_data(bus, shrd);
-}
-
 static inline void bus_get_hw_id(struct iwl_bus *bus, char buf[], int buf_len)
 {
        bus->ops->get_hw_id(bus, buf, buf_len);
 
        }
 }
 
-static void iwl_pci_set_drv_data(struct iwl_bus *bus, struct iwl_shared *shrd)
-{
-       bus->shrd = shrd;
-       pci_set_drvdata(IWL_BUS_GET_PCI_DEV(bus), shrd);
-}
-
 static void iwl_pci_get_hw_id(struct iwl_bus *bus, char buf[],
                              int buf_len)
 {
 static const struct iwl_bus_ops bus_ops_pci = {
        .get_pm_support = iwl_pci_is_pm_supported,
        .apm_config = iwl_pci_apm_config,
-       .set_drv_data = iwl_pci_set_drv_data,
        .get_hw_id = iwl_pci_get_hw_id,
        .write8 = iwl_pci_write8,
        .write32 = iwl_pci_write32,
        pci_bus = IWL_BUS_GET_PCI_BUS(bus);
        pci_bus->pci_dev = pdev;
 
+       pci_set_drvdata(pdev, bus);
+
        /* W/A - seems to solve weird behavior. We need to remove this if we
         * don't want to stay in L1 all the time. This wastes a lot of power */
        pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
 
 static void __devexit iwl_pci_remove(struct pci_dev *pdev)
 {
-       struct iwl_shared *shrd = pci_get_drvdata(pdev);
-       struct iwl_bus *bus = shrd->bus;
+       struct iwl_bus *bus = pci_get_drvdata(pdev);
        struct iwl_pci_bus *pci_bus = IWL_BUS_GET_PCI_BUS(bus);
+       struct iwl_shared *shrd = bus->shrd;
 
        iwl_remove(shrd->priv);
 
 static int iwl_pci_suspend(struct device *device)
 {
        struct pci_dev *pdev = to_pci_dev(device);
-       struct iwl_shared *shrd = pci_get_drvdata(pdev);
+       struct iwl_bus *bus = pci_get_drvdata(pdev);
+       struct iwl_shared *shrd = bus->shrd;
 
        /* Before you put code here, think about WoWLAN. You cannot check here
         * whether WoWLAN is enabled or not, and your code will run even if
 static int iwl_pci_resume(struct device *device)
 {
        struct pci_dev *pdev = to_pci_dev(device);
-       struct iwl_shared *shrd = pci_get_drvdata(pdev);
+       struct iwl_bus *bus = pci_get_drvdata(pdev);
+       struct iwl_shared *shrd = bus->shrd;
 
        /* Before you put code here, think about WoWLAN. You cannot check here
         * whether WoWLAN is enabled or not, and your code will run even if