diff options
Diffstat (limited to 'drivers/net/wireless/orinoco/hw.c')
-rw-r--r-- | drivers/net/wireless/orinoco/hw.c | 102 |
1 files changed, 68 insertions, 34 deletions
diff --git a/drivers/net/wireless/orinoco/hw.c b/drivers/net/wireless/orinoco/hw.c index e6369242e49c..6fbd78850123 100644 --- a/drivers/net/wireless/orinoco/hw.c +++ b/drivers/net/wireless/orinoco/hw.c | |||
@@ -177,9 +177,9 @@ int determine_fw_capabilities(struct orinoco_private *priv, | |||
177 | /* 3Com MAC : 00:50:DA:* */ | 177 | /* 3Com MAC : 00:50:DA:* */ |
178 | memset(tmp, 0, sizeof(tmp)); | 178 | memset(tmp, 0, sizeof(tmp)); |
179 | /* Get the Symbol firmware version */ | 179 | /* Get the Symbol firmware version */ |
180 | err = hermes_read_ltv(hw, USER_BAP, | 180 | err = hw->ops->read_ltv(hw, USER_BAP, |
181 | HERMES_RID_SECONDARYVERSION_SYMBOL, | 181 | HERMES_RID_SECONDARYVERSION_SYMBOL, |
182 | SYMBOL_MAX_VER_LEN, NULL, &tmp); | 182 | SYMBOL_MAX_VER_LEN, NULL, &tmp); |
183 | if (err) { | 183 | if (err) { |
184 | dev_warn(dev, "Error %d reading Symbol firmware info. " | 184 | dev_warn(dev, "Error %d reading Symbol firmware info. " |
185 | "Wildly guessing capabilities...\n", err); | 185 | "Wildly guessing capabilities...\n", err); |
@@ -262,6 +262,13 @@ int determine_fw_capabilities(struct orinoco_private *priv, | |||
262 | if (fw_name) | 262 | if (fw_name) |
263 | dev_info(dev, "Firmware determined as %s\n", fw_name); | 263 | dev_info(dev, "Firmware determined as %s\n", fw_name); |
264 | 264 | ||
265 | #ifndef CONFIG_HERMES_PRISM | ||
266 | if (priv->firmware_type == FIRMWARE_TYPE_INTERSIL) { | ||
267 | dev_err(dev, "Support for Prism chipset is not enabled\n"); | ||
268 | return -ENODEV; | ||
269 | } | ||
270 | #endif | ||
271 | |||
265 | return 0; | 272 | return 0; |
266 | } | 273 | } |
267 | 274 | ||
@@ -279,8 +286,8 @@ int orinoco_hw_read_card_settings(struct orinoco_private *priv, u8 *dev_addr) | |||
279 | u16 reclen; | 286 | u16 reclen; |
280 | 287 | ||
281 | /* Get the MAC address */ | 288 | /* Get the MAC address */ |
282 | err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CNFOWNMACADDR, | 289 | err = hw->ops->read_ltv(hw, USER_BAP, HERMES_RID_CNFOWNMACADDR, |
283 | ETH_ALEN, NULL, dev_addr); | 290 | ETH_ALEN, NULL, dev_addr); |
284 | if (err) { | 291 | if (err) { |
285 | dev_warn(dev, "Failed to read MAC address!\n"); | 292 | dev_warn(dev, "Failed to read MAC address!\n"); |
286 | goto out; | 293 | goto out; |
@@ -289,8 +296,8 @@ int orinoco_hw_read_card_settings(struct orinoco_private *priv, u8 *dev_addr) | |||
289 | dev_dbg(dev, "MAC address %pM\n", dev_addr); | 296 | dev_dbg(dev, "MAC address %pM\n", dev_addr); |
290 | 297 | ||
291 | /* Get the station name */ | 298 | /* Get the station name */ |
292 | err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CNFOWNNAME, | 299 | err = hw->ops->read_ltv(hw, USER_BAP, HERMES_RID_CNFOWNNAME, |
293 | sizeof(nickbuf), &reclen, &nickbuf); | 300 | sizeof(nickbuf), &reclen, &nickbuf); |
294 | if (err) { | 301 | if (err) { |
295 | dev_err(dev, "failed to read station name\n"); | 302 | dev_err(dev, "failed to read station name\n"); |
296 | goto out; | 303 | goto out; |
@@ -367,6 +374,32 @@ int orinoco_hw_read_card_settings(struct orinoco_private *priv, u8 *dev_addr) | |||
367 | err = hermes_read_wordrec(hw, USER_BAP, | 374 | err = hermes_read_wordrec(hw, USER_BAP, |
368 | HERMES_RID_CNFPREAMBLE_SYMBOL, | 375 | HERMES_RID_CNFPREAMBLE_SYMBOL, |
369 | &priv->preamble); | 376 | &priv->preamble); |
377 | if (err) { | ||
378 | dev_err(dev, "Failed to read preamble setup\n"); | ||
379 | goto out; | ||
380 | } | ||
381 | } | ||
382 | |||
383 | /* Retry settings */ | ||
384 | err = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_SHORTRETRYLIMIT, | ||
385 | &priv->short_retry_limit); | ||
386 | if (err) { | ||
387 | dev_err(dev, "Failed to read short retry limit\n"); | ||
388 | goto out; | ||
389 | } | ||
390 | |||
391 | err = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_LONGRETRYLIMIT, | ||
392 | &priv->long_retry_limit); | ||
393 | if (err) { | ||
394 | dev_err(dev, "Failed to read long retry limit\n"); | ||
395 | goto out; | ||
396 | } | ||
397 | |||
398 | err = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_MAXTRANSMITLIFETIME, | ||
399 | &priv->retry_lifetime); | ||
400 | if (err) { | ||
401 | dev_err(dev, "Failed to read max retry lifetime\n"); | ||
402 | goto out; | ||
370 | } | 403 | } |
371 | 404 | ||
372 | out: | 405 | out: |
@@ -380,11 +413,11 @@ int orinoco_hw_allocate_fid(struct orinoco_private *priv) | |||
380 | struct hermes *hw = &priv->hw; | 413 | struct hermes *hw = &priv->hw; |
381 | int err; | 414 | int err; |
382 | 415 | ||
383 | err = hermes_allocate(hw, priv->nicbuf_size, &priv->txfid); | 416 | err = hw->ops->allocate(hw, priv->nicbuf_size, &priv->txfid); |
384 | if (err == -EIO && priv->nicbuf_size > TX_NICBUF_SIZE_BUG) { | 417 | if (err == -EIO && priv->nicbuf_size > TX_NICBUF_SIZE_BUG) { |
385 | /* Try workaround for old Symbol firmware bug */ | 418 | /* Try workaround for old Symbol firmware bug */ |
386 | priv->nicbuf_size = TX_NICBUF_SIZE_BUG; | 419 | priv->nicbuf_size = TX_NICBUF_SIZE_BUG; |
387 | err = hermes_allocate(hw, priv->nicbuf_size, &priv->txfid); | 420 | err = hw->ops->allocate(hw, priv->nicbuf_size, &priv->txfid); |
388 | 421 | ||
389 | dev_warn(dev, "Firmware ALLOC bug detected " | 422 | dev_warn(dev, "Firmware ALLOC bug detected " |
390 | "(old Symbol firmware?). Work around %s\n", | 423 | "(old Symbol firmware?). Work around %s\n", |
@@ -430,8 +463,9 @@ int orinoco_hw_program_rids(struct orinoco_private *priv) | |||
430 | struct hermes_idstring idbuf; | 463 | struct hermes_idstring idbuf; |
431 | 464 | ||
432 | /* Set the MAC address */ | 465 | /* Set the MAC address */ |
433 | err = hermes_write_ltv(hw, USER_BAP, HERMES_RID_CNFOWNMACADDR, | 466 | err = hw->ops->write_ltv(hw, USER_BAP, HERMES_RID_CNFOWNMACADDR, |
434 | HERMES_BYTES_TO_RECLEN(ETH_ALEN), dev->dev_addr); | 467 | HERMES_BYTES_TO_RECLEN(ETH_ALEN), |
468 | dev->dev_addr); | ||
435 | if (err) { | 469 | if (err) { |
436 | printk(KERN_ERR "%s: Error %d setting MAC address\n", | 470 | printk(KERN_ERR "%s: Error %d setting MAC address\n", |
437 | dev->name, err); | 471 | dev->name, err); |
@@ -494,7 +528,7 @@ int orinoco_hw_program_rids(struct orinoco_private *priv) | |||
494 | idbuf.len = cpu_to_le16(strlen(priv->desired_essid)); | 528 | idbuf.len = cpu_to_le16(strlen(priv->desired_essid)); |
495 | memcpy(&idbuf.val, priv->desired_essid, sizeof(idbuf.val)); | 529 | memcpy(&idbuf.val, priv->desired_essid, sizeof(idbuf.val)); |
496 | /* WinXP wants partner to configure OWNSSID even in IBSS mode. (jimc) */ | 530 | /* WinXP wants partner to configure OWNSSID even in IBSS mode. (jimc) */ |
497 | err = hermes_write_ltv(hw, USER_BAP, HERMES_RID_CNFOWNSSID, | 531 | err = hw->ops->write_ltv(hw, USER_BAP, HERMES_RID_CNFOWNSSID, |
498 | HERMES_BYTES_TO_RECLEN(strlen(priv->desired_essid)+2), | 532 | HERMES_BYTES_TO_RECLEN(strlen(priv->desired_essid)+2), |
499 | &idbuf); | 533 | &idbuf); |
500 | if (err) { | 534 | if (err) { |
@@ -502,7 +536,7 @@ int orinoco_hw_program_rids(struct orinoco_private *priv) | |||
502 | dev->name, err); | 536 | dev->name, err); |
503 | return err; | 537 | return err; |
504 | } | 538 | } |
505 | err = hermes_write_ltv(hw, USER_BAP, HERMES_RID_CNFDESIREDSSID, | 539 | err = hw->ops->write_ltv(hw, USER_BAP, HERMES_RID_CNFDESIREDSSID, |
506 | HERMES_BYTES_TO_RECLEN(strlen(priv->desired_essid)+2), | 540 | HERMES_BYTES_TO_RECLEN(strlen(priv->desired_essid)+2), |
507 | &idbuf); | 541 | &idbuf); |
508 | if (err) { | 542 | if (err) { |
@@ -514,9 +548,9 @@ int orinoco_hw_program_rids(struct orinoco_private *priv) | |||
514 | /* Set the station name */ | 548 | /* Set the station name */ |
515 | idbuf.len = cpu_to_le16(strlen(priv->nick)); | 549 | idbuf.len = cpu_to_le16(strlen(priv->nick)); |
516 | memcpy(&idbuf.val, priv->nick, sizeof(idbuf.val)); | 550 | memcpy(&idbuf.val, priv->nick, sizeof(idbuf.val)); |
517 | err = hermes_write_ltv(hw, USER_BAP, HERMES_RID_CNFOWNNAME, | 551 | err = hw->ops->write_ltv(hw, USER_BAP, HERMES_RID_CNFOWNNAME, |
518 | HERMES_BYTES_TO_RECLEN(strlen(priv->nick)+2), | 552 | HERMES_BYTES_TO_RECLEN(strlen(priv->nick)+2), |
519 | &idbuf); | 553 | &idbuf); |
520 | if (err) { | 554 | if (err) { |
521 | printk(KERN_ERR "%s: Error %d setting nickname\n", | 555 | printk(KERN_ERR "%s: Error %d setting nickname\n", |
522 | dev->name, err); | 556 | dev->name, err); |
@@ -631,12 +665,12 @@ int orinoco_hw_program_rids(struct orinoco_private *priv) | |||
631 | if (priv->iw_mode == NL80211_IFTYPE_MONITOR) { | 665 | if (priv->iw_mode == NL80211_IFTYPE_MONITOR) { |
632 | /* Enable monitor mode */ | 666 | /* Enable monitor mode */ |
633 | dev->type = ARPHRD_IEEE80211; | 667 | dev->type = ARPHRD_IEEE80211; |
634 | err = hermes_docmd_wait(hw, HERMES_CMD_TEST | | 668 | err = hw->ops->cmd_wait(hw, HERMES_CMD_TEST | |
635 | HERMES_TEST_MONITOR, 0, NULL); | 669 | HERMES_TEST_MONITOR, 0, NULL); |
636 | } else { | 670 | } else { |
637 | /* Disable monitor mode */ | 671 | /* Disable monitor mode */ |
638 | dev->type = ARPHRD_ETHER; | 672 | dev->type = ARPHRD_ETHER; |
639 | err = hermes_docmd_wait(hw, HERMES_CMD_TEST | | 673 | err = hw->ops->cmd_wait(hw, HERMES_CMD_TEST | |
640 | HERMES_TEST_STOP, 0, NULL); | 674 | HERMES_TEST_STOP, 0, NULL); |
641 | } | 675 | } |
642 | if (err) | 676 | if (err) |
@@ -662,8 +696,8 @@ int orinoco_hw_get_tkip_iv(struct orinoco_private *priv, int key, u8 *tsc) | |||
662 | if ((key < 0) || (key >= 4)) | 696 | if ((key < 0) || (key >= 4)) |
663 | return -EINVAL; | 697 | return -EINVAL; |
664 | 698 | ||
665 | err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CURRENT_TKIP_IV, | 699 | err = hw->ops->read_ltv(hw, USER_BAP, HERMES_RID_CURRENT_TKIP_IV, |
666 | sizeof(tsc_arr), NULL, &tsc_arr); | 700 | sizeof(tsc_arr), NULL, &tsc_arr); |
667 | if (!err) | 701 | if (!err) |
668 | memcpy(tsc, &tsc_arr[key][0], sizeof(tsc_arr[0])); | 702 | memcpy(tsc, &tsc_arr[key][0], sizeof(tsc_arr[0])); |
669 | 703 | ||
@@ -842,7 +876,7 @@ int __orinoco_hw_setup_wepkeys(struct orinoco_private *priv) | |||
842 | memcpy(key, priv->keys[i].key, | 876 | memcpy(key, priv->keys[i].key, |
843 | priv->keys[i].key_len); | 877 | priv->keys[i].key_len); |
844 | 878 | ||
845 | err = hermes_write_ltv(hw, USER_BAP, | 879 | err = hw->ops->write_ltv(hw, USER_BAP, |
846 | HERMES_RID_CNFDEFAULTKEY0 + i, | 880 | HERMES_RID_CNFDEFAULTKEY0 + i, |
847 | HERMES_BYTES_TO_RECLEN(keylen), | 881 | HERMES_BYTES_TO_RECLEN(keylen), |
848 | key); | 882 | key); |
@@ -1049,17 +1083,17 @@ int __orinoco_hw_set_multicast_list(struct orinoco_private *priv, | |||
1049 | * group address if either we want to multicast, or if we were | 1083 | * group address if either we want to multicast, or if we were |
1050 | * multicasting and want to stop */ | 1084 | * multicasting and want to stop */ |
1051 | if (!promisc && (mc_count || priv->mc_count)) { | 1085 | if (!promisc && (mc_count || priv->mc_count)) { |
1052 | struct dev_mc_list *p; | 1086 | struct netdev_hw_addr *ha; |
1053 | struct hermes_multicast mclist; | 1087 | struct hermes_multicast mclist; |
1054 | int i = 0; | 1088 | int i = 0; |
1055 | 1089 | ||
1056 | netdev_for_each_mc_addr(p, dev) { | 1090 | netdev_for_each_mc_addr(ha, dev) { |
1057 | if (i == mc_count) | 1091 | if (i == mc_count) |
1058 | break; | 1092 | break; |
1059 | memcpy(mclist.addr[i++], p->dmi_addr, ETH_ALEN); | 1093 | memcpy(mclist.addr[i++], ha->addr, ETH_ALEN); |
1060 | } | 1094 | } |
1061 | 1095 | ||
1062 | err = hermes_write_ltv(hw, USER_BAP, | 1096 | err = hw->ops->write_ltv(hw, USER_BAP, |
1063 | HERMES_RID_CNFGROUPADDRESSES, | 1097 | HERMES_RID_CNFGROUPADDRESSES, |
1064 | HERMES_BYTES_TO_RECLEN(mc_count * ETH_ALEN), | 1098 | HERMES_BYTES_TO_RECLEN(mc_count * ETH_ALEN), |
1065 | &mclist); | 1099 | &mclist); |
@@ -1101,15 +1135,15 @@ int orinoco_hw_get_essid(struct orinoco_private *priv, int *active, | |||
1101 | rid = (priv->port_type == 3) ? HERMES_RID_CNFOWNSSID : | 1135 | rid = (priv->port_type == 3) ? HERMES_RID_CNFOWNSSID : |
1102 | HERMES_RID_CNFDESIREDSSID; | 1136 | HERMES_RID_CNFDESIREDSSID; |
1103 | 1137 | ||
1104 | err = hermes_read_ltv(hw, USER_BAP, rid, sizeof(essidbuf), | 1138 | err = hw->ops->read_ltv(hw, USER_BAP, rid, sizeof(essidbuf), |
1105 | NULL, &essidbuf); | 1139 | NULL, &essidbuf); |
1106 | if (err) | 1140 | if (err) |
1107 | goto fail_unlock; | 1141 | goto fail_unlock; |
1108 | } else { | 1142 | } else { |
1109 | *active = 0; | 1143 | *active = 0; |
1110 | 1144 | ||
1111 | err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CURRENTSSID, | 1145 | err = hw->ops->read_ltv(hw, USER_BAP, HERMES_RID_CURRENTSSID, |
1112 | sizeof(essidbuf), NULL, &essidbuf); | 1146 | sizeof(essidbuf), NULL, &essidbuf); |
1113 | if (err) | 1147 | if (err) |
1114 | goto fail_unlock; | 1148 | goto fail_unlock; |
1115 | } | 1149 | } |
@@ -1180,8 +1214,8 @@ int orinoco_hw_get_bitratelist(struct orinoco_private *priv, | |||
1180 | if (orinoco_lock(priv, &flags) != 0) | 1214 | if (orinoco_lock(priv, &flags) != 0) |
1181 | return -EBUSY; | 1215 | return -EBUSY; |
1182 | 1216 | ||
1183 | err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_SUPPORTEDDATARATES, | 1217 | err = hw->ops->read_ltv(hw, USER_BAP, HERMES_RID_SUPPORTEDDATARATES, |
1184 | sizeof(list), NULL, &list); | 1218 | sizeof(list), NULL, &list); |
1185 | orinoco_unlock(priv, &flags); | 1219 | orinoco_unlock(priv, &flags); |
1186 | 1220 | ||
1187 | if (err) | 1221 | if (err) |
@@ -1248,7 +1282,7 @@ int orinoco_hw_trigger_scan(struct orinoco_private *priv, | |||
1248 | idbuf.len = cpu_to_le16(len); | 1282 | idbuf.len = cpu_to_le16(len); |
1249 | memcpy(idbuf.val, ssid->ssid, len); | 1283 | memcpy(idbuf.val, ssid->ssid, len); |
1250 | 1284 | ||
1251 | err = hermes_write_ltv(hw, USER_BAP, | 1285 | err = hw->ops->write_ltv(hw, USER_BAP, |
1252 | HERMES_RID_CNFSCANSSID_AGERE, | 1286 | HERMES_RID_CNFSCANSSID_AGERE, |
1253 | HERMES_BYTES_TO_RECLEN(len + 2), | 1287 | HERMES_BYTES_TO_RECLEN(len + 2), |
1254 | &idbuf); | 1288 | &idbuf); |
@@ -1312,8 +1346,8 @@ int orinoco_hw_get_current_bssid(struct orinoco_private *priv, | |||
1312 | hermes_t *hw = &priv->hw; | 1346 | hermes_t *hw = &priv->hw; |
1313 | int err; | 1347 | int err; |
1314 | 1348 | ||
1315 | err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CURRENTBSSID, | 1349 | err = hw->ops->read_ltv(hw, USER_BAP, HERMES_RID_CURRENTBSSID, |
1316 | ETH_ALEN, NULL, addr); | 1350 | ETH_ALEN, NULL, addr); |
1317 | 1351 | ||
1318 | return err; | 1352 | return err; |
1319 | } | 1353 | } |