orinoco: address checkpatch typedef warning
[safe/jmp/linux-2.6] / drivers / net / wireless / orinoco.c
index 306697a..3d5570d 100644 (file)
@@ -279,7 +279,8 @@ static int orinoco_bss_data_allocate(struct orinoco_private *priv)
                return 0;
 
        priv->bss_data =
-           kzalloc(ORINOCO_MAX_BSS_COUNT * sizeof(bss_element), GFP_KERNEL);
+           kzalloc(ORINOCO_MAX_BSS_COUNT * sizeof(struct bss_element),
+                   GFP_KERNEL);
        if (!priv->bss_data) {
                printk(KERN_WARNING "Out of memory allocating beacons");
                return -ENOMEM;
@@ -722,7 +723,7 @@ static int orinoco_xmit(struct sk_buff *skb, struct net_device *dev)
        u16 txfid = priv->txfid;
        struct ethhdr *eh;
        int data_off;
-       struct hermes_tx_descriptor desc;
+       int tx_control;
        unsigned long flags;
 
        if (! netif_running(dev)) {
@@ -756,21 +757,48 @@ static int orinoco_xmit(struct sk_buff *skb, struct net_device *dev)
 
        eh = (struct ethhdr *)skb->data;
 
-       memset(&desc, 0, sizeof(desc));
-       desc.tx_control = cpu_to_le16(HERMES_TXCTRL_TX_OK | HERMES_TXCTRL_TX_EX);
-       err = hermes_bap_pwrite(hw, USER_BAP, &desc, sizeof(desc), txfid, 0);
-       if (err) {
-               if (net_ratelimit())
-                       printk(KERN_ERR "%s: Error %d writing Tx descriptor "
-                              "to BAP\n", dev->name, err);
-               goto busy;
-       }
+       tx_control = HERMES_TXCTRL_TX_OK | HERMES_TXCTRL_TX_EX;
 
-       /* Clear the 802.11 header and data length fields - some
-        * firmwares (e.g. Lucent/Agere 8.xx) appear to get confused
-        * if this isn't done. */
-       hermes_clear_words(hw, HERMES_DATA0,
-                          HERMES_802_3_OFFSET - HERMES_802_11_OFFSET);
+       if (priv->has_alt_txcntl) {
+               /* WPA enabled firmwares have tx_cntl at the end of
+                * the 802.11 header.  So write zeroed descriptor and
+                * 802.11 header at the same time
+                */
+               char desc[HERMES_802_3_OFFSET];
+               __le16 *txcntl = (__le16 *) &desc[HERMES_TXCNTL2_OFFSET];
+
+               memset(&desc, 0, sizeof(desc));
+
+               *txcntl = cpu_to_le16(tx_control);
+               err = hermes_bap_pwrite(hw, USER_BAP, &desc, sizeof(desc),
+                                       txfid, 0);
+               if (err) {
+                       if (net_ratelimit())
+                               printk(KERN_ERR "%s: Error %d writing Tx "
+                                      "descriptor to BAP\n", dev->name, err);
+                       goto busy;
+               }
+       } else {
+               struct hermes_tx_descriptor desc;
+
+               memset(&desc, 0, sizeof(desc));
+
+               desc.tx_control = cpu_to_le16(tx_control);
+               err = hermes_bap_pwrite(hw, USER_BAP, &desc, sizeof(desc),
+                                       txfid, 0);
+               if (err) {
+                       if (net_ratelimit())
+                               printk(KERN_ERR "%s: Error %d writing Tx "
+                                      "descriptor to BAP\n", dev->name, err);
+                       goto busy;
+               }
+
+               /* Clear the 802.11 header and data length fields - some
+                * firmwares (e.g. Lucent/Agere 8.xx) appear to get confused
+                * if this isn't done. */
+               hermes_clear_words(hw, HERMES_DATA0,
+                                  HERMES_802_3_OFFSET - HERMES_802_11_OFFSET);
+       }
 
        /* Encapsulate Ethernet-II frames */
        if (ntohs(eh->h_proto) > ETH_DATA_LEN) { /* Ethernet-II frame */
@@ -1386,8 +1414,8 @@ static void orinoco_send_wevents(struct work_struct *work)
 static inline void orinoco_clear_scan_results(struct orinoco_private *priv,
                                              unsigned long scan_age)
 {
-       bss_element *bss;
-       bss_element *tmp_bss;
+       struct bss_element *bss;
+       struct bss_element *tmp_bss;
 
        /* Blow away current list of scan results */
        list_for_each_entry_safe(bss, tmp_bss, &priv->bss_list, list) {
@@ -1462,7 +1490,7 @@ static int orinoco_process_scan_results(struct net_device *dev,
        /* Read the entries one by one */
        for (; offset + atom_len <= len; offset += atom_len) {
                int found = 0;
-               bss_element *bss = NULL;
+               struct bss_element *bss = NULL;
 
                /* Get next atom */
                atom = (union hermes_scan_info *) (buf + offset);
@@ -1484,7 +1512,7 @@ static int orinoco_process_scan_results(struct net_device *dev,
                /* Grab a bss off the free list */
                if (!found && !list_empty(&priv->bss_free_list)) {
                        bss = list_entry(priv->bss_free_list.next,
-                                        bss_element, list);
+                                        struct bss_element, list);
                        list_del(priv->bss_free_list.next);
 
                        list_add_tail(&bss->list, &priv->bss_list);
@@ -2528,6 +2556,7 @@ static int determine_firmware(struct net_device *dev)
        priv->has_ibss = 1;
        priv->has_wep = 0;
        priv->has_big_wep = 0;
+       priv->has_alt_txcntl = 0;
        priv->do_fw_download = 0;
 
        /* Determine capabilities from the firmware version */
@@ -2550,6 +2579,7 @@ static int determine_firmware(struct net_device *dev)
                priv->has_hostscan = (firmver >= 0x8000a);
                priv->do_fw_download = 1;
                priv->broken_monitor = (firmver >= 0x80000);
+               priv->has_alt_txcntl = (firmver >= 0x90000); /* All 9.x ? */
 
                /* Tested with Agere firmware :
                 *      1.16 ; 4.08 ; 4.52 ; 6.04 ; 6.16 ; 7.28 => Jean II
@@ -4518,7 +4548,7 @@ static int orinoco_ioctl_getscan(struct net_device *dev,
                                 char *extra)
 {
        struct orinoco_private *priv = netdev_priv(dev);
-       bss_element *bss;
+       struct bss_element *bss;
        int err = 0;
        unsigned long flags;
        char *current_ev = extra;