]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/wireless/hostap/hostap_hw.c
[HOSTAP]: set netdev type before registering AP interface
[linux-2.6-omap-h63xx.git] / drivers / net / wireless / hostap / hostap_hw.c
index c19e68636a1c89a2edf6dc5472a0386003bb0e0f..c592641e914e695d99aa1e408acae2501ca03496 100644 (file)
@@ -3,8 +3,8 @@
  * Intersil Prism2/2.5/3.
  *
  * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
- * <jkmaline@cc.hut.fi>
- * Copyright (c) 2002-2005, Jouni Malinen <jkmaline@cc.hut.fi>
+ * <j@w1.fi>
+ * Copyright (c) 2002-2005, Jouni Malinen <j@w1.fi>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -347,14 +347,12 @@ static int hfa384x_cmd(struct net_device *dev, u16 cmd, u16 param0,
        if (signal_pending(current))
                return -EINTR;
 
-       entry = (struct hostap_cmd_queue *)
-               kmalloc(sizeof(*entry), GFP_ATOMIC);
+       entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
        if (entry == NULL) {
                printk(KERN_DEBUG "%s: hfa384x_cmd - kmalloc failed\n",
                       dev->name);
                return -ENOMEM;
        }
-       memset(entry, 0, sizeof(*entry));
        atomic_set(&entry->usecnt, 1);
        entry->type = CMD_SLEEP;
        entry->cmd = cmd;
@@ -517,14 +515,12 @@ static int hfa384x_cmd_callback(struct net_device *dev, u16 cmd, u16 param0,
                return -1;
        }
 
-       entry = (struct hostap_cmd_queue *)
-               kmalloc(sizeof(*entry), GFP_ATOMIC);
+       entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
        if (entry == NULL) {
                printk(KERN_DEBUG "%s: hfa384x_cmd_callback - kmalloc "
                       "failed\n", dev->name);
                return -ENOMEM;
        }
-       memset(entry, 0, sizeof(*entry));
        atomic_set(&entry->usecnt, 1);
        entry->type = CMD_CALLBACK;
        entry->cmd = cmd;
@@ -829,7 +825,7 @@ static int hfa384x_get_rid(struct net_device *dev, u16 rid, void *buf, int len,
            local->hw_downloading)
                return -ENODEV;
 
-       res = down_interruptible(&local->rid_bap_sem);
+       res = mutex_lock_interruptible(&local->rid_bap_mtx);
        if (res)
                return res;
 
@@ -838,7 +834,7 @@ static int hfa384x_get_rid(struct net_device *dev, u16 rid, void *buf, int len,
                printk(KERN_DEBUG "%s: hfa384x_get_rid: CMDCODE_ACCESS failed "
                       "(res=%d, rid=%04x, len=%d)\n",
                       dev->name, res, rid, len);
-               up(&local->rid_bap_sem);
+               mutex_unlock(&local->rid_bap_mtx);
                return res;
        }
 
@@ -865,7 +861,7 @@ static int hfa384x_get_rid(struct net_device *dev, u16 rid, void *buf, int len,
                res = hfa384x_from_bap(dev, BAP0, buf, len);
 
        spin_unlock_bh(&local->baplock);
-       up(&local->rid_bap_sem);
+       mutex_unlock(&local->rid_bap_mtx);
 
        if (res) {
                if (res != -ENODATA)
@@ -906,7 +902,7 @@ static int hfa384x_set_rid(struct net_device *dev, u16 rid, void *buf, int len)
        /* RID len in words and +1 for rec.rid */
        rec.len = cpu_to_le16(len / 2 + len % 2 + 1);
 
-       res = down_interruptible(&local->rid_bap_sem);
+       res = mutex_lock_interruptible(&local->rid_bap_mtx);
        if (res)
                return res;
 
@@ -921,12 +917,12 @@ static int hfa384x_set_rid(struct net_device *dev, u16 rid, void *buf, int len)
        if (res) {
                printk(KERN_DEBUG "%s: hfa384x_set_rid (rid=%04x, len=%d) - "
                       "failed - res=%d\n", dev->name, rid, len, res);
-               up(&local->rid_bap_sem);
+               mutex_unlock(&local->rid_bap_mtx);
                return res;
        }
 
        res = hfa384x_cmd(dev, HFA384X_CMDCODE_ACCESS_WRITE, rid, NULL, NULL);
-       up(&local->rid_bap_sem);
+       mutex_unlock(&local->rid_bap_mtx);
 
        if (res) {
                printk(KERN_DEBUG "%s: hfa384x_set_rid: CMDCODE_ACCESS_WRITE "
@@ -1842,13 +1838,14 @@ static int prism2_tx_80211(struct sk_buff *skb, struct net_device *dev)
 
        /* skb->data starts with txdesc->frame_control */
        hdr_len = 24;
-       memcpy(&txdesc.frame_control, skb->data, hdr_len);
+       skb_copy_from_linear_data(skb, &txdesc.frame_control, hdr_len);
        fc = le16_to_cpu(txdesc.frame_control);
        if (WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA &&
            (fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS) &&
            skb->len >= 30) {
                /* Addr4 */
-               memcpy(txdesc.addr4, skb->data + hdr_len, ETH_ALEN);
+               skb_copy_from_linear_data_offset(skb, hdr_len, txdesc.addr4,
+                                                ETH_ALEN);
                hdr_len += ETH_ALEN;
        }
 
@@ -2221,7 +2218,7 @@ static void hostap_tx_callback(local_info_t *local,
                memcpy(skb_put(skb, len), payload, len);
 
        skb->dev = local->dev;
-       skb->mac.raw = skb->data;
+       skb_reset_mac_header(skb);
 
        cb->func(skb, ok, cb->data);
 }
@@ -2256,7 +2253,7 @@ static int hostap_tx_compl_read(local_info_t *local, int error,
        if (txdesc->sw_support) {
                len = le16_to_cpu(txdesc->data_len);
                if (len < PRISM2_DATA_MAXLEN) {
-                       *payload = (char *) kmalloc(len, GFP_ATOMIC);
+                       *payload = kmalloc(len, GFP_ATOMIC);
                        if (*payload == NULL ||
                            hfa384x_from_bap(dev, BAP0, *payload, len)) {
                                PDEBUG(DEBUG_EXTRA, "%s: could not read TX "
@@ -2338,6 +2335,10 @@ static void prism2_txexc(local_info_t *local)
        int show_dump, res;
        char *payload = NULL;
        struct hfa384x_tx_frame txdesc;
+       DECLARE_MAC_BUF(mac);
+       DECLARE_MAC_BUF(mac2);
+       DECLARE_MAC_BUF(mac3);
+       DECLARE_MAC_BUF(mac4);
 
        show_dump = local->frame_dump & PRISM2_DUMP_TXEXC_HDR;
        local->stats.tx_errors++;
@@ -2403,10 +2404,9 @@ static void prism2_txexc(local_info_t *local)
               WLAN_FC_GET_STYPE(fc) >> 4,
               fc & IEEE80211_FCTL_TODS ? " ToDS" : "",
               fc & IEEE80211_FCTL_FROMDS ? " FromDS" : "");
-       PDEBUG(DEBUG_EXTRA, "   A1=" MACSTR " A2=" MACSTR " A3="
-              MACSTR " A4=" MACSTR "\n",
-              MAC2STR(txdesc.addr1), MAC2STR(txdesc.addr2),
-              MAC2STR(txdesc.addr3), MAC2STR(txdesc.addr4));
+       PDEBUG(DEBUG_EXTRA, "   A1=%s A2=%s A3=%s A4=%s\n",
+              print_mac(mac, txdesc.addr1), print_mac(mac2, txdesc.addr2),
+              print_mac(mac3, txdesc.addr3), print_mac(mac4, txdesc.addr4));
 }
 
 
@@ -3016,14 +3016,12 @@ static int prism2_set_tim(struct net_device *dev, int aid, int set)
        iface = netdev_priv(dev);
        local = iface->local;
 
-       new_entry = (struct set_tim_data *)
-               kmalloc(sizeof(*new_entry), GFP_ATOMIC);
+       new_entry = kzalloc(sizeof(*new_entry), GFP_ATOMIC);
        if (new_entry == NULL) {
                printk(KERN_DEBUG "%s: prism2_set_tim: kmalloc failed\n",
                       local->dev->name);
                return -ENOMEM;
        }
-       memset(new_entry, 0, sizeof(*new_entry));
        new_entry->aid = aid;
        new_entry->set = set;
 
@@ -3176,7 +3174,7 @@ prism2_init_local_data(struct prism2_helper_functions *funcs, int card_idx,
        spin_lock_init(&local->cmdlock);
        spin_lock_init(&local->baplock);
        spin_lock_init(&local->lock);
-       init_MUTEX(&local->rid_bap_sem);
+       mutex_init(&local->rid_bap_mtx);
 
        if (card_idx < 0 || card_idx >= MAX_PARM_DEVICES)
                card_idx = 0;
@@ -3259,12 +3257,11 @@ while (0)
 
        INIT_LIST_HEAD(&local->bss_list);
 
-       hostap_setup_dev(dev, local, 1);
-       local->saved_eth_header_parse = dev->hard_header_parse;
+       hostap_setup_dev(dev, local, HOSTAP_INTERFACE_MASTER);
 
        dev->hard_start_xmit = hostap_master_start_xmit;
        dev->type = ARPHRD_IEEE80211;
-       dev->hard_header_parse = hostap_80211_header_parse;
+       dev->header_ops = &hostap_80211_ops;
 
        rtnl_lock();
        ret = dev_alloc_name(dev, "wifi%d");
@@ -3429,7 +3426,7 @@ static void prism2_suspend(struct net_device *dev)
        struct local_info *local;
        union iwreq_data wrqu;
 
-       iface = dev->priv;
+       iface = netdev_priv(dev);
        local = iface->local;
 
        /* Send disconnect event, e.g., to trigger reassociation after resume