ath10k: embed ar_pci inside ar
authorMichal Kazior <michal.kazior@tieto.com>
Thu, 7 Aug 2014 09:03:27 +0000 (11:03 +0200)
committerKalle Valo <kvalo@qca.qualcomm.com>
Tue, 12 Aug 2014 07:53:42 +0000 (10:53 +0300)
Use the common convention of embedding private
structures inside parent structures. This
reduces allocations and simplifies pci probing
code.

Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/core.c
drivers/net/wireless/ath/ath10k/core.h
drivers/net/wireless/ath/ath10k/mac.c
drivers/net/wireless/ath/ath10k/mac.h
drivers/net/wireless/ath/ath10k/pci.c
drivers/net/wireless/ath/ath10k/pci.h

index c090913d10d1978368d22093226e0e281a99b8a7..7f95bd05e3436290e6f0e602af0c2439bd11f0a0 100644 (file)
@@ -1059,12 +1059,12 @@ void ath10k_core_unregister(struct ath10k *ar)
 }
 EXPORT_SYMBOL(ath10k_core_unregister);
 
-struct ath10k *ath10k_core_create(void *hif_priv, struct device *dev,
+struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,
                                  const struct ath10k_hif_ops *hif_ops)
 {
        struct ath10k *ar;
 
-       ar = ath10k_mac_create();
+       ar = ath10k_mac_create(priv_size);
        if (!ar)
                return NULL;
 
@@ -1074,7 +1074,6 @@ struct ath10k *ath10k_core_create(void *hif_priv, struct device *dev,
        ar->p2p = !!ath10k_p2p;
        ar->dev = dev;
 
-       ar->hif.priv = hif_priv;
        ar->hif.ops = hif_ops;
 
        init_completion(&ar->scan.started);
index 95c611db43b8616fe7235c94d9b484959c3a2109..cca6060dbf30cfb11b8bf1153565837173615d39 100644 (file)
@@ -398,7 +398,6 @@ struct ath10k {
        bool p2p;
 
        struct {
-               void *priv;
                const struct ath10k_hif_ops *ops;
        } hif;
 
@@ -532,9 +531,12 @@ struct ath10k {
                enum ath10k_spectral_mode mode;
                struct ath10k_spec_scan config;
        } spectral;
+
+       /* must be last */
+       u8 drv_priv[0] __aligned(sizeof(void *));
 };
 
-struct ath10k *ath10k_core_create(void *hif_priv, struct device *dev,
+struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,
                                  const struct ath10k_hif_ops *hif_ops);
 void ath10k_core_destroy(struct ath10k *ar);
 
index 3bf7ddeb3271c2da2206292c49e6c9360c849106..a5ec7c2502b5a8009dbe029a667919e3721d657a 100644 (file)
@@ -4564,12 +4564,12 @@ static struct ieee80211_rate ath10k_rates[] = {
 #define ath10k_g_rates (ath10k_rates + 0)
 #define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
 
-struct ath10k *ath10k_mac_create(void)
+struct ath10k *ath10k_mac_create(size_t priv_size)
 {
        struct ieee80211_hw *hw;
        struct ath10k *ar;
 
-       hw = ieee80211_alloc_hw(sizeof(struct ath10k), &ath10k_ops);
+       hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
        if (!hw)
                return NULL;
 
index e64fce70e9eb80b6b8a8555dcec9ff10fc0364ef..6c80eeada3e28863bb1fe22e753251b64f73608d 100644 (file)
@@ -26,7 +26,7 @@ struct ath10k_generic_iter {
        int ret;
 };
 
-struct ath10k *ath10k_mac_create(void);
+struct ath10k *ath10k_mac_create(size_t priv_size);
 void ath10k_mac_destroy(struct ath10k *ar);
 int ath10k_mac_register(struct ath10k *ar);
 void ath10k_mac_unregister(struct ath10k *ar);
index 2d340cc522e318aafd9ec7520de3a8fda7ed9a58..a2003b66a8bcfe31c7781dacdc21908203f5a3f2 100644 (file)
@@ -2621,10 +2621,14 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
 
        ath10k_dbg(ATH10K_DBG_PCI, "pci probe\n");
 
-       ar_pci = kzalloc(sizeof(*ar_pci), GFP_KERNEL);
-       if (ar_pci == NULL)
+       ar = ath10k_core_create(sizeof(*ar_pci), &pdev->dev,
+                               &ath10k_pci_hif_ops);
+       if (!ar) {
+               ath10k_err("failed to allocate core\n");
                return -ENOMEM;
+       }
 
+       ar_pci = ath10k_pci_priv(ar);
        ar_pci->pdev = pdev;
        ar_pci->dev = &pdev->dev;
 
@@ -2635,7 +2639,7 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
        default:
                ret = -ENODEV;
                ath10k_err("Unknown device ID: %d\n", pci_dev->device);
-               goto err_ar_pci;
+               goto err_core_destroy;
        }
 
        if (ath10k_pci_target_ps)
@@ -2643,13 +2647,6 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
 
        ath10k_pci_dump_features(ar_pci);
 
-       ar = ath10k_core_create(ar_pci, ar_pci->dev, &ath10k_pci_hif_ops);
-       if (!ar) {
-               ath10k_err("failed to create driver core\n");
-               ret = -EINVAL;
-               goto err_ar_pci;
-       }
-
        ar_pci->ar = ar;
        atomic_set(&ar_pci->keep_awake_count, 0);
 
@@ -2658,7 +2655,7 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
        ret = pci_enable_device(pdev);
        if (ret) {
                ath10k_err("failed to enable PCI device: %d\n", ret);
-               goto err_ar;
+               goto err_core_destroy;
        }
 
        /* Request MMIO resources */
@@ -2742,11 +2739,8 @@ err_region:
        pci_release_region(pdev, BAR_NUM);
 err_device:
        pci_disable_device(pdev);
-err_ar:
+err_core_destroy:
        ath10k_core_destroy(ar);
-err_ar_pci:
-       /* call HIF PCI free here */
-       kfree(ar_pci);
 
        return ret;
 }
@@ -2775,7 +2769,6 @@ static void ath10k_pci_remove(struct pci_dev *pdev)
        pci_disable_device(pdev);
 
        ath10k_core_destroy(ar);
-       kfree(ar_pci);
 }
 
 MODULE_DEVICE_TABLE(pci, ath10k_pci_id_table);
index 940129209990337a1a99f79599014abc48b6b605..531c98aa4a86b56a6183fac02a9f185d78aac667 100644 (file)
@@ -202,7 +202,7 @@ struct ath10k_pci {
 
 static inline struct ath10k_pci *ath10k_pci_priv(struct ath10k *ar)
 {
-       return ar->hif.priv;
+       return (struct ath10k_pci *)ar->drv_priv;
 }
 
 static inline u32 ath10k_pci_reg_read32(struct ath10k *ar, u32 addr)