- patches.arch/x86_mce_intel_decode_physical_address.patch:
[linux-flexiantxendom0-3.2.10.git] / drivers / net / wireless / orinoco / hw.c
index e636924..6fbd788 100644 (file)
@@ -177,9 +177,9 @@ int determine_fw_capabilities(struct orinoco_private *priv,
                /* 3Com MAC : 00:50:DA:* */
                memset(tmp, 0, sizeof(tmp));
                /* Get the Symbol firmware version */
-               err = hermes_read_ltv(hw, USER_BAP,
-                                     HERMES_RID_SECONDARYVERSION_SYMBOL,
-                                     SYMBOL_MAX_VER_LEN, NULL, &tmp);
+               err = hw->ops->read_ltv(hw, USER_BAP,
+                                       HERMES_RID_SECONDARYVERSION_SYMBOL,
+                                       SYMBOL_MAX_VER_LEN, NULL, &tmp);
                if (err) {
                        dev_warn(dev, "Error %d reading Symbol firmware info. "
                                 "Wildly guessing capabilities...\n", err);
@@ -262,6 +262,13 @@ int determine_fw_capabilities(struct orinoco_private *priv,
        if (fw_name)
                dev_info(dev, "Firmware determined as %s\n", fw_name);
 
+#ifndef CONFIG_HERMES_PRISM
+       if (priv->firmware_type == FIRMWARE_TYPE_INTERSIL) {
+               dev_err(dev, "Support for Prism chipset is not enabled\n");
+               return -ENODEV;
+       }
+#endif
+
        return 0;
 }
 
@@ -279,8 +286,8 @@ int orinoco_hw_read_card_settings(struct orinoco_private *priv, u8 *dev_addr)
        u16 reclen;
 
        /* Get the MAC address */
-       err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CNFOWNMACADDR,
-                             ETH_ALEN, NULL, dev_addr);
+       err = hw->ops->read_ltv(hw, USER_BAP, HERMES_RID_CNFOWNMACADDR,
+                               ETH_ALEN, NULL, dev_addr);
        if (err) {
                dev_warn(dev, "Failed to read MAC address!\n");
                goto out;
@@ -289,8 +296,8 @@ int orinoco_hw_read_card_settings(struct orinoco_private *priv, u8 *dev_addr)
        dev_dbg(dev, "MAC address %pM\n", dev_addr);
 
        /* Get the station name */
-       err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CNFOWNNAME,
-                             sizeof(nickbuf), &reclen, &nickbuf);
+       err = hw->ops->read_ltv(hw, USER_BAP, HERMES_RID_CNFOWNNAME,
+                               sizeof(nickbuf), &reclen, &nickbuf);
        if (err) {
                dev_err(dev, "failed to read station name\n");
                goto out;
@@ -367,6 +374,32 @@ int orinoco_hw_read_card_settings(struct orinoco_private *priv, u8 *dev_addr)
                err = hermes_read_wordrec(hw, USER_BAP,
                                          HERMES_RID_CNFPREAMBLE_SYMBOL,
                                          &priv->preamble);
+               if (err) {
+                       dev_err(dev, "Failed to read preamble setup\n");
+                       goto out;
+               }
+       }
+
+       /* Retry settings */
+       err = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_SHORTRETRYLIMIT,
+                                 &priv->short_retry_limit);
+       if (err) {
+               dev_err(dev, "Failed to read short retry limit\n");
+               goto out;
+       }
+
+       err = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_LONGRETRYLIMIT,
+                                 &priv->long_retry_limit);
+       if (err) {
+               dev_err(dev, "Failed to read long retry limit\n");
+               goto out;
+       }
+
+       err = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_MAXTRANSMITLIFETIME,
+                                 &priv->retry_lifetime);
+       if (err) {
+               dev_err(dev, "Failed to read max retry lifetime\n");
+               goto out;
        }
 
 out:
@@ -380,11 +413,11 @@ int orinoco_hw_allocate_fid(struct orinoco_private *priv)
        struct hermes *hw = &priv->hw;
        int err;
 
-       err = hermes_allocate(hw, priv->nicbuf_size, &priv->txfid);
+       err = hw->ops->allocate(hw, priv->nicbuf_size, &priv->txfid);
        if (err == -EIO && priv->nicbuf_size > TX_NICBUF_SIZE_BUG) {
                /* Try workaround for old Symbol firmware bug */
                priv->nicbuf_size = TX_NICBUF_SIZE_BUG;
-               err = hermes_allocate(hw, priv->nicbuf_size, &priv->txfid);
+               err = hw->ops->allocate(hw, priv->nicbuf_size, &priv->txfid);
 
                dev_warn(dev, "Firmware ALLOC bug detected "
                         "(old Symbol firmware?). Work around %s\n",
@@ -430,8 +463,9 @@ int orinoco_hw_program_rids(struct orinoco_private *priv)
        struct hermes_idstring idbuf;
 
        /* Set the MAC address */
-       err = hermes_write_ltv(hw, USER_BAP, HERMES_RID_CNFOWNMACADDR,
-                              HERMES_BYTES_TO_RECLEN(ETH_ALEN), dev->dev_addr);
+       err = hw->ops->write_ltv(hw, USER_BAP, HERMES_RID_CNFOWNMACADDR,
+                                HERMES_BYTES_TO_RECLEN(ETH_ALEN),
+                                dev->dev_addr);
        if (err) {
                printk(KERN_ERR "%s: Error %d setting MAC address\n",
                       dev->name, err);
@@ -494,7 +528,7 @@ int orinoco_hw_program_rids(struct orinoco_private *priv)
        idbuf.len = cpu_to_le16(strlen(priv->desired_essid));
        memcpy(&idbuf.val, priv->desired_essid, sizeof(idbuf.val));
        /* WinXP wants partner to configure OWNSSID even in IBSS mode. (jimc) */
-       err = hermes_write_ltv(hw, USER_BAP, HERMES_RID_CNFOWNSSID,
+       err = hw->ops->write_ltv(hw, USER_BAP, HERMES_RID_CNFOWNSSID,
                        HERMES_BYTES_TO_RECLEN(strlen(priv->desired_essid)+2),
                        &idbuf);
        if (err) {
@@ -502,7 +536,7 @@ int orinoco_hw_program_rids(struct orinoco_private *priv)
                       dev->name, err);
                return err;
        }
-       err = hermes_write_ltv(hw, USER_BAP, HERMES_RID_CNFDESIREDSSID,
+       err = hw->ops->write_ltv(hw, USER_BAP, HERMES_RID_CNFDESIREDSSID,
                        HERMES_BYTES_TO_RECLEN(strlen(priv->desired_essid)+2),
                        &idbuf);
        if (err) {
@@ -514,9 +548,9 @@ int orinoco_hw_program_rids(struct orinoco_private *priv)
        /* Set the station name */
        idbuf.len = cpu_to_le16(strlen(priv->nick));
        memcpy(&idbuf.val, priv->nick, sizeof(idbuf.val));
-       err = hermes_write_ltv(hw, USER_BAP, HERMES_RID_CNFOWNNAME,
-                              HERMES_BYTES_TO_RECLEN(strlen(priv->nick)+2),
-                              &idbuf);
+       err = hw->ops->write_ltv(hw, USER_BAP, HERMES_RID_CNFOWNNAME,
+                                HERMES_BYTES_TO_RECLEN(strlen(priv->nick)+2),
+                                &idbuf);
        if (err) {
                printk(KERN_ERR "%s: Error %d setting nickname\n",
                       dev->name, err);
@@ -631,12 +665,12 @@ int orinoco_hw_program_rids(struct orinoco_private *priv)
        if (priv->iw_mode == NL80211_IFTYPE_MONITOR) {
                /* Enable monitor mode */
                dev->type = ARPHRD_IEEE80211;
-               err = hermes_docmd_wait(hw, HERMES_CMD_TEST |
+               err = hw->ops->cmd_wait(hw, HERMES_CMD_TEST |
                                            HERMES_TEST_MONITOR, 0, NULL);
        } else {
                /* Disable monitor mode */
                dev->type = ARPHRD_ETHER;
-               err = hermes_docmd_wait(hw, HERMES_CMD_TEST |
+               err = hw->ops->cmd_wait(hw, HERMES_CMD_TEST |
                                            HERMES_TEST_STOP, 0, NULL);
        }
        if (err)
@@ -662,8 +696,8 @@ int orinoco_hw_get_tkip_iv(struct orinoco_private *priv, int key, u8 *tsc)
        if ((key < 0) || (key >= 4))
                return -EINVAL;
 
-       err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CURRENT_TKIP_IV,
-                             sizeof(tsc_arr), NULL, &tsc_arr);
+       err = hw->ops->read_ltv(hw, USER_BAP, HERMES_RID_CURRENT_TKIP_IV,
+                               sizeof(tsc_arr), NULL, &tsc_arr);
        if (!err)
                memcpy(tsc, &tsc_arr[key][0], sizeof(tsc_arr[0]));
 
@@ -842,7 +876,7 @@ int __orinoco_hw_setup_wepkeys(struct orinoco_private *priv)
                                memcpy(key, priv->keys[i].key,
                                       priv->keys[i].key_len);
 
-                               err = hermes_write_ltv(hw, USER_BAP,
+                               err = hw->ops->write_ltv(hw, USER_BAP,
                                                HERMES_RID_CNFDEFAULTKEY0 + i,
                                                HERMES_BYTES_TO_RECLEN(keylen),
                                                key);
@@ -1049,17 +1083,17 @@ int __orinoco_hw_set_multicast_list(struct orinoco_private *priv,
         * group address if either we want to multicast, or if we were
         * multicasting and want to stop */
        if (!promisc && (mc_count || priv->mc_count)) {
-               struct dev_mc_list *p;
+               struct netdev_hw_addr *ha;
                struct hermes_multicast mclist;
                int i = 0;
 
-               netdev_for_each_mc_addr(p, dev) {
+               netdev_for_each_mc_addr(ha, dev) {
                        if (i == mc_count)
                                break;
-                       memcpy(mclist.addr[i++], p->dmi_addr, ETH_ALEN);
+                       memcpy(mclist.addr[i++], ha->addr, ETH_ALEN);
                }
 
-               err = hermes_write_ltv(hw, USER_BAP,
+               err = hw->ops->write_ltv(hw, USER_BAP,
                                   HERMES_RID_CNFGROUPADDRESSES,
                                   HERMES_BYTES_TO_RECLEN(mc_count * ETH_ALEN),
                                   &mclist);
@@ -1101,15 +1135,15 @@ int orinoco_hw_get_essid(struct orinoco_private *priv, int *active,
                rid = (priv->port_type == 3) ? HERMES_RID_CNFOWNSSID :
                        HERMES_RID_CNFDESIREDSSID;
 
-               err = hermes_read_ltv(hw, USER_BAP, rid, sizeof(essidbuf),
-                                     NULL, &essidbuf);
+               err = hw->ops->read_ltv(hw, USER_BAP, rid, sizeof(essidbuf),
+                                       NULL, &essidbuf);
                if (err)
                        goto fail_unlock;
        } else {
                *active = 0;
 
-               err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CURRENTSSID,
-                                     sizeof(essidbuf), NULL, &essidbuf);
+               err = hw->ops->read_ltv(hw, USER_BAP, HERMES_RID_CURRENTSSID,
+                                       sizeof(essidbuf), NULL, &essidbuf);
                if (err)
                        goto fail_unlock;
        }
@@ -1180,8 +1214,8 @@ int orinoco_hw_get_bitratelist(struct orinoco_private *priv,
        if (orinoco_lock(priv, &flags) != 0)
                return -EBUSY;
 
-       err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_SUPPORTEDDATARATES,
-                             sizeof(list), NULL, &list);
+       err = hw->ops->read_ltv(hw, USER_BAP, HERMES_RID_SUPPORTEDDATARATES,
+                               sizeof(list), NULL, &list);
        orinoco_unlock(priv, &flags);
 
        if (err)
@@ -1248,7 +1282,7 @@ int orinoco_hw_trigger_scan(struct orinoco_private *priv,
                                idbuf.len = cpu_to_le16(len);
                                memcpy(idbuf.val, ssid->ssid, len);
 
-                               err = hermes_write_ltv(hw, USER_BAP,
+                               err = hw->ops->write_ltv(hw, USER_BAP,
                                               HERMES_RID_CNFSCANSSID_AGERE,
                                               HERMES_BYTES_TO_RECLEN(len + 2),
                                               &idbuf);
@@ -1312,8 +1346,8 @@ int orinoco_hw_get_current_bssid(struct orinoco_private *priv,
        hermes_t *hw = &priv->hw;
        int err;
 
-       err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CURRENTBSSID,
-                             ETH_ALEN, NULL, addr);
+       err = hw->ops->read_ltv(hw, USER_BAP, HERMES_RID_CURRENTBSSID,
+                               ETH_ALEN, NULL, addr);
 
        return err;
 }