ath6kl: Define an initial vif structure and use it
authorVasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com>
Tue, 25 Oct 2011 14:04:00 +0000 (19:34 +0530)
committerKalle Valo <kvalo@qca.qualcomm.com>
Fri, 11 Nov 2011 10:58:46 +0000 (12:58 +0200)
vif specific information need to be moved from struct ath6kl.

Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath6kl/cfg80211.c
drivers/net/wireless/ath/ath6kl/core.h
drivers/net/wireless/ath/ath6kl/init.c

index c827ced7755f2459b15325929ee7177cca8953ef..b6b3112e57ef1d479eb2c2bfc56697aaa914644b 100644 (file)
@@ -2015,51 +2015,58 @@ int ath6kl_register_ieee80211_hw(struct ath6kl *ar)
        return 0;
 }
 
-static int ath6kl_init_if_data(struct ath6kl *ar, struct net_device *ndev)
+static int ath6kl_init_if_data(struct ath6kl_vif *vif)
 {
-       ar->aggr_cntxt = aggr_init(ndev);
+       struct ath6kl *ar = vif->ar;
+
+       ar->aggr_cntxt = aggr_init(vif->ndev);
        if (!ar->aggr_cntxt) {
                ath6kl_err("failed to initialize aggr\n");
                return -ENOMEM;
        }
 
        setup_timer(&ar->disconnect_timer, disconnect_timer_handler,
-                   (unsigned long) ndev);
+                   (unsigned long) vif->ndev);
 
        return 0;
 }
 
-void ath6kl_deinit_if_data(struct ath6kl *ar, struct net_device *ndev)
+void ath6kl_deinit_if_data(struct ath6kl_vif *vif)
 {
+       struct ath6kl *ar = vif->ar;
+
        aggr_module_destroy(ar->aggr_cntxt);
 
        ar->aggr_cntxt = NULL;
 
        if (test_bit(NETDEV_REGISTERED, &ar->flag)) {
-               unregister_netdev(ndev);
+               unregister_netdev(vif->ndev);
                clear_bit(NETDEV_REGISTERED, &ar->flag);
        }
 
-       free_netdev(ndev);
+       free_netdev(vif->ndev);
 }
 
 struct net_device *ath6kl_interface_add(struct ath6kl *ar, char *name,
                                        enum nl80211_iftype type)
 {
        struct net_device *ndev;
-       struct wireless_dev *wdev;
+       struct ath6kl_vif *vif;
 
-       ndev = alloc_netdev(sizeof(*wdev), "wlan%d", ether_setup);
+       ndev = alloc_netdev(sizeof(*vif), "wlan%d", ether_setup);
        if (!ndev)
                return NULL;
 
-       wdev = netdev_priv(ndev);
-       ndev->ieee80211_ptr = wdev;
-       wdev->wiphy = ar->wiphy;
-       SET_NETDEV_DEV(ndev, wiphy_dev(wdev->wiphy));
-       wdev->netdev = ndev;
-       wdev->iftype = type;
-       ar->wdev = wdev;
+       vif = netdev_priv(ndev);
+       ndev->ieee80211_ptr = &vif->wdev;
+       vif->wdev.wiphy = ar->wiphy;
+       vif->ar = ar;
+       ar->vif = vif;
+       vif->ndev = ndev;
+       SET_NETDEV_DEV(ndev, wiphy_dev(vif->wdev.wiphy));
+       vif->wdev.netdev = ndev;
+       vif->wdev.iftype = type;
+       ar->wdev = &vif->wdev;
        ar->net_dev = ndev;
 
        init_netdev(ndev);
@@ -2067,7 +2074,7 @@ struct net_device *ath6kl_interface_add(struct ath6kl *ar, char *name,
        ath6kl_init_control_info(ar);
 
        /* TODO: Pass interface specific pointer instead of ar */
-       if (ath6kl_init_if_data(ar, ndev))
+       if (ath6kl_init_if_data(vif))
                goto err;
 
        if (register_netdev(ndev))
@@ -2081,7 +2088,7 @@ struct net_device *ath6kl_interface_add(struct ath6kl *ar, char *name,
        return ndev;
 
 err:
-       ath6kl_deinit_if_data(ar, ndev);
+       ath6kl_deinit_if_data(vif);
 
        return NULL;
 }
index f1b3c47f2c7e3967e2baaade1a632fbcee6edc36..0c1dee07653d412f52b8fed4a608b534793eeb71 100644 (file)
@@ -380,6 +380,12 @@ struct ath6kl_req_key {
        u8 key_len;
 };
 
+struct ath6kl_vif {
+       struct wireless_dev wdev;
+       struct net_device *ndev;
+       struct ath6kl *ar;
+};
+
 /* Flag info */
 #define WMI_ENABLED    0
 #define WMI_READY      1
@@ -410,6 +416,7 @@ struct ath6kl {
        int total_tx_data_pend;
        struct htc_target *htc_target;
        void *hif_priv;
+       struct ath6kl_vif *vif;
        spinlock_t lock;
        struct semaphore sem;
        int ssid_len;
@@ -543,7 +550,7 @@ struct ath6kl {
 
 static inline void *ath6kl_priv(struct net_device *dev)
 {
-       return wdev_priv(dev->ieee80211_ptr);
+       return ((struct ath6kl_vif *) netdev_priv(dev))->ar;
 }
 
 static inline void ath6kl_deposit_credit_to_ep(struct htc_credit_state_info
@@ -643,6 +650,6 @@ void ath6kl_wakeup_event(void *dev);
 void ath6kl_target_failure(struct ath6kl *ar);
 
 void ath6kl_init_control_info(struct ath6kl *ar);
-void ath6kl_deinit_if_data(struct ath6kl *ar, struct net_device *ndev);
+void ath6kl_deinit_if_data(struct ath6kl_vif *vif);
 void ath6kl_core_free(struct ath6kl *ar);
 #endif /* CORE_H */
index 8adfc4259f382a0d8f5dfeb7f07c0ff43221fa3c..f21224c2807f200ca3eadfae67809727df7ae511 100644 (file)
@@ -1499,7 +1499,7 @@ err_rxbuf_cleanup:
 err_cleanup_scatter:
        ath6kl_hif_cleanup_scatter(ar);
 err_if_deinit:
-       ath6kl_deinit_if_data(ar, ndev);
+       ath6kl_deinit_if_data(netdev_priv(ndev));
        wiphy_unregister(ar->wiphy);
 err_debug_init:
        ath6kl_debug_cleanup(ar);
@@ -1632,7 +1632,7 @@ void ath6kl_destroy(struct net_device *dev, unsigned int unregister)
 
        ath6kl_debug_cleanup(ar);
 
-       ath6kl_deinit_if_data(ar, dev);
+       ath6kl_deinit_if_data(netdev_priv(dev));
 
        kfree(ar->fw_board);
        kfree(ar->fw_otp);