@ -228,9 +228,9 @@ static void ath6kl_set_key_mgmt(struct ath6kl_vif *vif, u32 key_mgmt)
}
}
static bool ath6kl_cfg80211_ready ( struct ath6kl * ar )
static bool ath6kl_cfg80211_ready ( struct ath6kl_vif * vif )
{
struct ath6kl_vif * vif = ar - > vif ;
struct ath6kl * ar = vif - > ar ;
if ( ! test_bit ( WMI_READY , & ar - > flag ) ) {
ath6kl_err ( " wmi is not ready \n " ) ;
@ -302,7 +302,7 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
vif - > sme_state = SME_CONNECTING ;
if ( ! ath6kl_cfg80211_ready ( ar ) )
if ( ! ath6kl_cfg80211_ready ( vif ) )
return - EIO ;
if ( test_bit ( DESTROY_IN_PROGRESS , & ar - > flag ) ) {
@ -614,7 +614,7 @@ static int ath6kl_cfg80211_disconnect(struct wiphy *wiphy,
ath6kl_dbg ( ATH6KL_DBG_WLAN_CFG , " %s: reason=%u \n " , __func__ ,
reason_code ) ;
if ( ! ath6kl_cfg80211_ready ( ar ) )
if ( ! ath6kl_cfg80211_ready ( vif ) )
return - EIO ;
if ( test_bit ( DESTROY_IN_PROGRESS , & ar - > flag ) ) {
@ -713,7 +713,7 @@ static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
int ret = 0 ;
u32 force_fg_scan = 0 ;
if ( ! ath6kl_cfg80211_ready ( ar ) )
if ( ! ath6kl_cfg80211_ready ( vif ) )
return - EIO ;
if ( ! ar - > usr_bss_filter ) {
@ -831,7 +831,7 @@ static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
u8 key_type ;
int status = 0 ;
if ( ! ath6kl_cfg80211_ready ( ar ) )
if ( ! ath6kl_cfg80211_ready ( vif ) )
return - EIO ;
if ( params - > cipher = = CCKM_KRK_CIPHER_SUITE ) {
@ -953,7 +953,7 @@ static int ath6kl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
ath6kl_dbg ( ATH6KL_DBG_WLAN_CFG , " %s: index %d \n " , __func__ , key_index ) ;
if ( ! ath6kl_cfg80211_ready ( ar ) )
if ( ! ath6kl_cfg80211_ready ( vif ) )
return - EIO ;
if ( key_index < WMI_MIN_KEY_INDEX | | key_index > WMI_MAX_KEY_INDEX ) {
@ -980,14 +980,13 @@ static int ath6kl_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
void ( * callback ) ( void * cookie ,
struct key_params * ) )
{
struct ath6kl * ar = ( struct ath6kl * ) ath6kl_priv ( ndev ) ;
struct ath6kl_vif * vif = netdev_priv ( ndev ) ;
struct ath6kl_key * key = NULL ;
struct key_params params ;
ath6kl_dbg ( ATH6KL_DBG_WLAN_CFG , " %s: index %d \n " , __func__ , key_index ) ;
if ( ! ath6kl_cfg80211_ready ( ar ) )
if ( ! ath6kl_cfg80211_ready ( vif ) )
return - EIO ;
if ( key_index < WMI_MIN_KEY_INDEX | | key_index > WMI_MAX_KEY_INDEX ) {
@ -1024,7 +1023,7 @@ static int ath6kl_cfg80211_set_default_key(struct wiphy *wiphy,
ath6kl_dbg ( ATH6KL_DBG_WLAN_CFG , " %s: index %d \n " , __func__ , key_index ) ;
if ( ! ath6kl_cfg80211_ready ( ar ) )
if ( ! ath6kl_cfg80211_ready ( vif ) )
return - EIO ;
if ( key_index < WMI_MIN_KEY_INDEX | | key_index > WMI_MAX_KEY_INDEX ) {
@ -1080,12 +1079,17 @@ void ath6kl_cfg80211_tkip_micerr_event(struct ath6kl_vif *vif, u8 keyid,
static int ath6kl_cfg80211_set_wiphy_params ( struct wiphy * wiphy , u32 changed )
{
struct ath6kl * ar = ( struct ath6kl * ) wiphy_priv ( wiphy ) ;
struct ath6kl_vif * vif ;
int ret ;
ath6kl_dbg ( ATH6KL_DBG_WLAN_CFG , " %s: changed 0x%x \n " , __func__ ,
changed ) ;
if ( ! ath6kl_cfg80211_ready ( ar ) )
vif = ath6kl_vif_first ( ar ) ;
if ( ! vif )
return - EIO ;
if ( ! ath6kl_cfg80211_ready ( vif ) )
return - EIO ;
if ( changed & WIPHY_PARAM_RTS_THRESHOLD ) {
@ -1108,12 +1112,17 @@ static int ath6kl_cfg80211_set_txpower(struct wiphy *wiphy,
int dbm )
{
struct ath6kl * ar = ( struct ath6kl * ) wiphy_priv ( wiphy ) ;
struct ath6kl_vif * vif ;
u8 ath6kl_dbm ;
ath6kl_dbg ( ATH6KL_DBG_WLAN_CFG , " %s: type 0x%x, dbm %d \n " , __func__ ,
type , dbm ) ;
if ( ! ath6kl_cfg80211_ready ( ar ) )
vif = ath6kl_vif_first ( ar ) ;
if ( ! vif )
return - EIO ;
if ( ! ath6kl_cfg80211_ready ( vif ) )
return - EIO ;
switch ( type ) {
@ -1128,7 +1137,7 @@ static int ath6kl_cfg80211_set_txpower(struct wiphy *wiphy,
return - EOPNOTSUPP ;
}
ath6kl_wmi_set_tx_pwr_cmd ( ar - > wmi , ath6kl_dbm ) ;
ath6kl_wmi_set_tx_pwr_cmd ( ar - > wmi , vif - > fw_vif_idx , ath6kl_dbm ) ;
return 0 ;
}
@ -1136,15 +1145,19 @@ static int ath6kl_cfg80211_set_txpower(struct wiphy *wiphy,
static int ath6kl_cfg80211_get_txpower ( struct wiphy * wiphy , int * dbm )
{
struct ath6kl * ar = ( struct ath6kl * ) wiphy_priv ( wiphy ) ;
struct ath6kl_vif * vif = ar - > vif ;
struct ath6kl_vif * vif ;
vif = ath6kl_vif_first ( ar ) ;
if ( ! vif )
return - EIO ;
if ( ! ath6kl_cfg80211_ready ( ar ) )
if ( ! ath6kl_cfg80211_ready ( vif ) )
return - EIO ;
if ( test_bit ( CONNECTED , & vif - > flags ) ) {
ar - > tx_pwr = 0 ;
if ( ath6kl_wmi_get_tx_pwr_cmd ( ar - > wmi ) ! = 0 ) {
if ( ath6kl_wmi_get_tx_pwr_cmd ( ar - > wmi , vif - > fw_vif_idx ) ! = 0 ) {
ath6kl_err ( " ath6kl_wmi_get_tx_pwr_cmd failed \n " ) ;
return - EIO ;
}
@ -1173,7 +1186,7 @@ static int ath6kl_cfg80211_set_power_mgmt(struct wiphy *wiphy,
ath6kl_dbg ( ATH6KL_DBG_WLAN_CFG , " %s: pmgmt %d, timeout %d \n " ,
__func__ , pmgmt , timeout ) ;
if ( ! ath6kl_cfg80211_ready ( ar ) )
if ( ! ath6kl_cfg80211_ready ( vif ) )
return - EIO ;
if ( pmgmt ) {
@ -1204,7 +1217,7 @@ static int ath6kl_cfg80211_change_iface(struct wiphy *wiphy,
ath6kl_dbg ( ATH6KL_DBG_WLAN_CFG , " %s: type %u \n " , __func__ , type ) ;
if ( ! ath6kl_cfg80211_ready ( ar ) )
if ( ! ath6kl_cfg80211_ready ( vif ) )
return - EIO ;
switch ( type ) {
@ -1241,7 +1254,7 @@ static int ath6kl_cfg80211_join_ibss(struct wiphy *wiphy,
struct ath6kl_vif * vif = netdev_priv ( dev ) ;
int status ;
if ( ! ath6kl_cfg80211_ready ( ar ) )
if ( ! ath6kl_cfg80211_ready ( vif ) )
return - EIO ;
vif - > ssid_len = ibss_param - > ssid_len ;
@ -1306,10 +1319,9 @@ static int ath6kl_cfg80211_join_ibss(struct wiphy *wiphy,
static int ath6kl_cfg80211_leave_ibss ( struct wiphy * wiphy ,
struct net_device * dev )
{
struct ath6kl * ar = ( struct ath6kl * ) ath6kl_priv ( dev ) ;
struct ath6kl_vif * vif = netdev_priv ( dev ) ;
if ( ! ath6kl_cfg80211_ready ( ar ) )
if ( ! ath6kl_cfg80211_ready ( vif ) )
return - EIO ;
ath6kl_disconnect ( vif ) ;
@ -1539,10 +1551,9 @@ static int ath6kl_set_channel(struct wiphy *wiphy, struct net_device *dev,
struct ieee80211_channel * chan ,
enum nl80211_channel_type channel_type )
{
struct ath6kl * ar = ath6kl_priv ( dev ) ;
struct ath6kl_vif * vif = netdev_priv ( dev ) ;
if ( ! ath6kl_cfg80211_ready ( ar ) )
if ( ! ath6kl_cfg80211_ready ( vif ) )
return - EIO ;
ath6kl_dbg ( ATH6KL_DBG_WLAN_CFG , " %s: center_freq=%u hw_value=%u \n " ,
@ -1609,7 +1620,7 @@ static int ath6kl_ap_beacon(struct wiphy *wiphy, struct net_device *dev,
ath6kl_dbg ( ATH6KL_DBG_WLAN_CFG , " %s: add=%d \n " , __func__ , add ) ;
if ( ! ath6kl_cfg80211_ready ( ar ) )
if ( ! ath6kl_cfg80211_ready ( vif ) )
return - EIO ;
if ( vif - > next_mode ! = AP_NETWORK )
@ -1991,11 +2002,13 @@ struct ath6kl *ath6kl_core_alloc(struct device *dev)
spin_lock_init ( & ar - > lock ) ;
spin_lock_init ( & ar - > mcastpsq_lock ) ;
spin_lock_init ( & ar - > list_lock ) ;
init_waitqueue_head ( & ar - > event_wq ) ;
sema_init ( & ar - > sem , 1 ) ;
INIT_LIST_HEAD ( & ar - > amsdu_rx_buffer_queue ) ;
INIT_LIST_HEAD ( & ar - > vif_list ) ;
clear_bit ( WMI_ENABLED , & ar - > flag ) ;
clear_bit ( SKIP_SCAN , & ar - > flag ) ;
@ -2110,7 +2123,6 @@ struct net_device *ath6kl_interface_add(struct ath6kl *ar, char *name,
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 ;
@ -2134,6 +2146,10 @@ struct net_device *ath6kl_interface_add(struct ath6kl *ar, char *name,
ar - > wlan_pwr_state = WLAN_POWER_STATE_ON ;
set_bit ( NETDEV_REGISTERED , & vif - > flags ) ;
spin_lock ( & ar - > list_lock ) ;
list_add_tail ( & vif - > list , & ar - > vif_list ) ;
spin_unlock ( & ar - > list_lock ) ;
return ndev ;
err :