diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.c b/drivers/net/wireless/ath/ath6kl/cfg80211.c index c827ced7755f2459b15325929ee7177cca8953ef..b6b3112e57ef1d479eb2c2bfc56697aaa914644b 100644 --- a/drivers/net/wireless/ath/ath6kl/cfg80211.c +++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c @@ -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; } diff --git a/drivers/net/wireless/ath/ath6kl/core.h b/drivers/net/wireless/ath/ath6kl/core.h index f1b3c47f2c7e3967e2baaade1a632fbcee6edc36..0c1dee07653d412f52b8fed4a608b534793eeb71 100644 --- a/drivers/net/wireless/ath/ath6kl/core.h +++ b/drivers/net/wireless/ath/ath6kl/core.h @@ -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 */ diff --git a/drivers/net/wireless/ath/ath6kl/init.c b/drivers/net/wireless/ath/ath6kl/init.c index 8adfc4259f382a0d8f5dfeb7f07c0ff43221fa3c..f21224c2807f200ca3eadfae67809727df7ae511 100644 --- a/drivers/net/wireless/ath/ath6kl/init.c +++ b/drivers/net/wireless/ath/ath6kl/init.c @@ -1499,7 +1499,7 @@ static int ath6kl_init(struct ath6kl *ar) 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);