]> err.no Git - linux-2.6/blobdiff - net/mac80211/ieee80211.c
ocfs2: Unlock mutex in local alloc failure case
[linux-2.6] / net / mac80211 / ieee80211.c
index e91698308f31bfb4ba5ae7e0dcf791930c230929..ff2172ffd8611758ba00efa2abc349892ca11015 100644 (file)
@@ -442,7 +442,7 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_txrx_data *tx)
        if (!tx->u.tx.rate)
                return TXRX_DROP;
        if (tx->u.tx.mode->mode == MODE_IEEE80211G &&
-           tx->local->cts_protect_erp_frames && tx->fragmented &&
+           tx->sdata->use_protection && tx->fragmented &&
            extra.nonerp) {
                tx->u.tx.last_frag_rate = tx->u.tx.rate;
                tx->u.tx.probe_last_frag = extra.probe ? 1 : 0;
@@ -868,8 +868,7 @@ ieee80211_tx_h_misc(struct ieee80211_txrx_data *tx)
         * for the frame. */
        if (mode->mode == MODE_IEEE80211G &&
            (tx->u.tx.rate->flags & IEEE80211_RATE_ERP) &&
-           tx->u.tx.unicast &&
-           tx->local->cts_protect_erp_frames &&
+           tx->u.tx.unicast && tx->sdata->use_protection &&
            !(control->flags & IEEE80211_TXCTL_USE_RTS_CTS))
                control->flags |= IEEE80211_TXCTL_USE_CTS_PROTECT;
 
@@ -1651,6 +1650,7 @@ static int ieee80211_master_start_xmit(struct sk_buff *skb,
        if (skb_headroom(skb) < headroom) {
                if (pskb_expand_head(skb, headroom, 0, GFP_ATOMIC)) {
                        dev_kfree_skb(skb);
+                       dev_put(odev);
                        return 0;
                }
        }
@@ -2605,8 +2605,7 @@ static void ieee80211_start_hard_monitor(struct ieee80211_local *local)
        struct ieee80211_if_init_conf conf;
 
        if (local->open_count && local->open_count == local->monitors &&
-           !(local->hw.flags & IEEE80211_HW_MONITOR_DURING_OPER) &&
-           local->ops->add_interface) {
+           !(local->hw.flags & IEEE80211_HW_MONITOR_DURING_OPER)) {
                conf.if_id = -1;
                conf.type = IEEE80211_IF_TYPE_MNTR;
                conf.mac_addr = NULL;
@@ -2649,21 +2648,14 @@ static int ieee80211_open(struct net_device *dev)
        }
        ieee80211_start_soft_monitor(local);
 
-       if (local->ops->add_interface) {
-               conf.if_id = dev->ifindex;
-               conf.type = sdata->type;
-               conf.mac_addr = dev->dev_addr;
-               res = local->ops->add_interface(local_to_hw(local), &conf);
-               if (res) {
-                       if (sdata->type == IEEE80211_IF_TYPE_MNTR)
-                               ieee80211_start_hard_monitor(local);
-                       return res;
-               }
-       } else {
-               if (sdata->type != IEEE80211_IF_TYPE_STA)
-                       return -EOPNOTSUPP;
-               if (local->open_count > 0)
-                       return -ENOBUFS;
+       conf.if_id = dev->ifindex;
+       conf.type = sdata->type;
+       conf.mac_addr = dev->dev_addr;
+       res = local->ops->add_interface(local_to_hw(local), &conf);
+       if (res) {
+               if (sdata->type == IEEE80211_IF_TYPE_MNTR)
+                       ieee80211_start_hard_monitor(local);
+               return res;
        }
 
        if (local->open_count == 0) {
@@ -4686,7 +4678,6 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb,
                        memset(skb->cb, 0, sizeof(skb->cb));
                        netif_rx(skb);
                        skb = skb2;
-                       break;
                }
        }
  out:
@@ -4896,6 +4887,9 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
                         ((sizeof(struct ieee80211_local) +
                           NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST);
 
+       BUG_ON(!ops->tx);
+       BUG_ON(!ops->config);
+       BUG_ON(!ops->add_interface);
        local->ops = ops;
 
        /* for now, mdev needs sub_if_data :/ */
@@ -4924,8 +4918,6 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
        local->short_retry_limit = 7;
        local->long_retry_limit = 4;
        local->hw.conf.radio_enabled = 1;
-       local->rate_ctrl_num_up = RATE_CONTROL_NUM_UP;
-       local->rate_ctrl_num_down = RATE_CONTROL_NUM_DOWN;
 
        local->enabled_modes = (unsigned int) -1;
 
@@ -4994,8 +4986,8 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
         * and we need some headroom for passing the frame to monitor
         * interfaces, but never both at the same time.
         */
-       local->tx_headroom = max(local->hw.extra_tx_headroom,
-                                sizeof(struct ieee80211_tx_status_rtap_hdr));
+       local->tx_headroom = max_t(unsigned int , local->hw.extra_tx_headroom,
+                                  sizeof(struct ieee80211_tx_status_rtap_hdr));
 
        debugfs_hw_add(local);
 
@@ -5103,7 +5095,7 @@ int ieee80211_register_hwmode(struct ieee80211_hw *hw,
        }
 
        if (!(hw->flags & IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED))
-               ieee80211_init_client(local->mdev);
+               ieee80211_set_default_regdomain(mode);
 
        return 0;
 }
@@ -5254,6 +5246,7 @@ static int __init ieee80211_init(void)
        }
 
        ieee80211_debugfs_netdev_init();
+       ieee80211_regdomain_init();
 
        return 0;
 }
@@ -5266,7 +5259,7 @@ static void __exit ieee80211_exit(void)
 }
 
 
-module_init(ieee80211_init);
+subsys_initcall(ieee80211_init);
 module_exit(ieee80211_exit);
 
 MODULE_DESCRIPTION("IEEE 802.11 subsystem");