diff options
author | Dan Williams <dcbw@redhat.com> | 2008-09-10 12:49:00 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-09-15 16:48:20 -0400 |
commit | 39fcf7a315e098430e878a5c0c4d39561c93ebf6 (patch) | |
tree | e616eb6085e4c99c8920edbd6ebbec65627b7445 /drivers/net/wireless/libertas/cmd.c | |
parent | 500c064d3a5f9c8aa604ef63a1346ab70eed443a (diff) |
libertas: convert SNMP_MIB to a direct command
And support setting both long and short retries independently.
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/libertas/cmd.c')
-rw-r--r-- | drivers/net/wireless/libertas/cmd.c | 180 |
1 files changed, 77 insertions, 103 deletions
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c index b57625a38021..aee19fa844e4 100644 --- a/drivers/net/wireless/libertas/cmd.c +++ b/drivers/net/wireless/libertas/cmd.c | |||
@@ -480,124 +480,103 @@ int lbs_cmd_802_11_key_material(struct lbs_private *priv, uint16_t cmd_action, | |||
480 | return ret; | 480 | return ret; |
481 | } | 481 | } |
482 | 482 | ||
483 | static int lbs_cmd_802_11_snmp_mib(struct lbs_private *priv, | 483 | /** |
484 | struct cmd_ds_command *cmd, | 484 | * @brief Set an SNMP MIB value |
485 | int cmd_action, | 485 | * |
486 | int cmd_oid, void *pdata_buf) | 486 | * @param priv A pointer to struct lbs_private structure |
487 | * @param oid The OID to set in the firmware | ||
488 | * @param val Value to set the OID to | ||
489 | * | ||
490 | * @return 0 on success, error on failure | ||
491 | */ | ||
492 | int lbs_set_snmp_mib(struct lbs_private *priv, u32 oid, u16 val) | ||
487 | { | 493 | { |
488 | struct cmd_ds_802_11_snmp_mib *pSNMPMIB = &cmd->params.smib; | 494 | struct cmd_ds_802_11_snmp_mib cmd; |
489 | u8 ucTemp; | 495 | int ret; |
490 | 496 | ||
491 | lbs_deb_enter(LBS_DEB_CMD); | 497 | lbs_deb_enter(LBS_DEB_CMD); |
492 | 498 | ||
493 | lbs_deb_cmd("SNMP_CMD: cmd_oid = 0x%x\n", cmd_oid); | 499 | memset(&cmd, 0, sizeof (cmd)); |
494 | 500 | cmd.hdr.size = cpu_to_le16(sizeof(cmd)); | |
495 | cmd->command = cpu_to_le16(CMD_802_11_SNMP_MIB); | 501 | cmd.action = cpu_to_le16(CMD_ACT_SET); |
496 | cmd->size = cpu_to_le16(sizeof(*pSNMPMIB) + S_DS_GEN); | 502 | cmd.oid = cpu_to_le16((u16) oid); |
497 | |||
498 | switch (cmd_oid) { | ||
499 | case OID_802_11_INFRASTRUCTURE_MODE: | ||
500 | { | ||
501 | u8 mode = (u8) (size_t) pdata_buf; | ||
502 | pSNMPMIB->querytype = cpu_to_le16(CMD_ACT_SET); | ||
503 | pSNMPMIB->oid = cpu_to_le16((u16) DESIRED_BSSTYPE_I); | ||
504 | pSNMPMIB->bufsize = cpu_to_le16(sizeof(u8)); | ||
505 | if (mode == IW_MODE_ADHOC) { | ||
506 | ucTemp = SNMP_MIB_VALUE_ADHOC; | ||
507 | } else { | ||
508 | /* Infra and Auto modes */ | ||
509 | ucTemp = SNMP_MIB_VALUE_INFRA; | ||
510 | } | ||
511 | |||
512 | memmove(pSNMPMIB->value, &ucTemp, sizeof(u8)); | ||
513 | 503 | ||
504 | switch (oid) { | ||
505 | case SNMP_MIB_OID_BSS_TYPE: | ||
506 | cmd.bufsize = cpu_to_le16(sizeof(u8)); | ||
507 | cmd.value[0] = (val == IW_MODE_ADHOC) ? 2 : 1; | ||
508 | break; | ||
509 | case SNMP_MIB_OID_11D_ENABLE: | ||
510 | case SNMP_MIB_OID_FRAG_THRESHOLD: | ||
511 | case SNMP_MIB_OID_RTS_THRESHOLD: | ||
512 | case SNMP_MIB_OID_SHORT_RETRY_LIMIT: | ||
513 | case SNMP_MIB_OID_LONG_RETRY_LIMIT: | ||
514 | cmd.bufsize = cpu_to_le16(sizeof(u16)); | ||
515 | *((__le16 *)(&cmd.value)) = cpu_to_le16(val); | ||
514 | break; | 516 | break; |
517 | default: | ||
518 | lbs_deb_cmd("SNMP_CMD: (set) unhandled OID 0x%x\n", oid); | ||
519 | ret = -EINVAL; | ||
520 | goto out; | ||
515 | } | 521 | } |
516 | 522 | ||
517 | case OID_802_11D_ENABLE: | 523 | lbs_deb_cmd("SNMP_CMD: (set) oid 0x%x, oid size 0x%x, value 0x%x\n", |
518 | { | 524 | le16_to_cpu(cmd.oid), le16_to_cpu(cmd.bufsize), val); |
519 | u32 ulTemp; | ||
520 | |||
521 | pSNMPMIB->oid = cpu_to_le16((u16) DOT11D_I); | ||
522 | |||
523 | if (cmd_action == CMD_ACT_SET) { | ||
524 | pSNMPMIB->querytype = cpu_to_le16(CMD_ACT_SET); | ||
525 | pSNMPMIB->bufsize = cpu_to_le16(sizeof(u16)); | ||
526 | ulTemp = *(u32 *)pdata_buf; | ||
527 | *((__le16 *)(pSNMPMIB->value)) = | ||
528 | cpu_to_le16((u16) ulTemp); | ||
529 | } | ||
530 | break; | ||
531 | } | ||
532 | |||
533 | case OID_802_11_FRAGMENTATION_THRESHOLD: | ||
534 | { | ||
535 | u32 ulTemp; | ||
536 | |||
537 | pSNMPMIB->oid = cpu_to_le16((u16) FRAGTHRESH_I); | ||
538 | 525 | ||
539 | if (cmd_action == CMD_ACT_GET) { | 526 | ret = lbs_cmd_with_response(priv, CMD_802_11_SNMP_MIB, &cmd); |
540 | pSNMPMIB->querytype = cpu_to_le16(CMD_ACT_GET); | ||
541 | } else if (cmd_action == CMD_ACT_SET) { | ||
542 | pSNMPMIB->querytype = cpu_to_le16(CMD_ACT_SET); | ||
543 | pSNMPMIB->bufsize = cpu_to_le16(sizeof(u16)); | ||
544 | ulTemp = *((u32 *) pdata_buf); | ||
545 | *((__le16 *)(pSNMPMIB->value)) = | ||
546 | cpu_to_le16((u16) ulTemp); | ||
547 | 527 | ||
548 | } | 528 | out: |
549 | 529 | lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret); | |
550 | break; | 530 | return ret; |
551 | } | 531 | } |
552 | 532 | ||
553 | case OID_802_11_RTS_THRESHOLD: | 533 | /** |
554 | { | 534 | * @brief Get an SNMP MIB value |
535 | * | ||
536 | * @param priv A pointer to struct lbs_private structure | ||
537 | * @param oid The OID to retrieve from the firmware | ||
538 | * @param out_val Location for the returned value | ||
539 | * | ||
540 | * @return 0 on success, error on failure | ||
541 | */ | ||
542 | int lbs_get_snmp_mib(struct lbs_private *priv, u32 oid, u16 *out_val) | ||
543 | { | ||
544 | struct cmd_ds_802_11_snmp_mib cmd; | ||
545 | int ret; | ||
555 | 546 | ||
556 | u32 ulTemp; | 547 | lbs_deb_enter(LBS_DEB_CMD); |
557 | pSNMPMIB->oid = cpu_to_le16(RTSTHRESH_I); | ||
558 | 548 | ||
559 | if (cmd_action == CMD_ACT_GET) { | 549 | memset(&cmd, 0, sizeof (cmd)); |
560 | pSNMPMIB->querytype = cpu_to_le16(CMD_ACT_GET); | 550 | cmd.hdr.size = cpu_to_le16(sizeof(cmd)); |
561 | } else if (cmd_action == CMD_ACT_SET) { | 551 | cmd.action = cpu_to_le16(CMD_ACT_GET); |
562 | pSNMPMIB->querytype = cpu_to_le16(CMD_ACT_SET); | 552 | cmd.oid = cpu_to_le16(oid); |
563 | pSNMPMIB->bufsize = cpu_to_le16(sizeof(u16)); | ||
564 | ulTemp = *((u32 *)pdata_buf); | ||
565 | *(__le16 *)(pSNMPMIB->value) = | ||
566 | cpu_to_le16((u16) ulTemp); | ||
567 | 553 | ||
568 | } | 554 | ret = lbs_cmd_with_response(priv, CMD_802_11_SNMP_MIB, &cmd); |
569 | break; | 555 | if (ret) |
570 | } | 556 | goto out; |
571 | case OID_802_11_TX_RETRYCOUNT: | ||
572 | pSNMPMIB->oid = cpu_to_le16((u16) SHORT_RETRYLIM_I); | ||
573 | |||
574 | if (cmd_action == CMD_ACT_GET) { | ||
575 | pSNMPMIB->querytype = cpu_to_le16(CMD_ACT_GET); | ||
576 | } else if (cmd_action == CMD_ACT_SET) { | ||
577 | pSNMPMIB->querytype = cpu_to_le16(CMD_ACT_SET); | ||
578 | pSNMPMIB->bufsize = cpu_to_le16(sizeof(u16)); | ||
579 | *((__le16 *)(pSNMPMIB->value)) = | ||
580 | cpu_to_le16((u16) priv->txretrycount); | ||
581 | } | ||
582 | 557 | ||
558 | switch (le16_to_cpu(cmd.bufsize)) { | ||
559 | case sizeof(u8): | ||
560 | if (oid == SNMP_MIB_OID_BSS_TYPE) { | ||
561 | if (cmd.value[0] == 2) | ||
562 | *out_val = IW_MODE_ADHOC; | ||
563 | else | ||
564 | *out_val = IW_MODE_INFRA; | ||
565 | } else | ||
566 | *out_val = cmd.value[0]; | ||
567 | break; | ||
568 | case sizeof(u16): | ||
569 | *out_val = le16_to_cpu(*((__le16 *)(&cmd.value))); | ||
583 | break; | 570 | break; |
584 | default: | 571 | default: |
572 | lbs_deb_cmd("SNMP_CMD: (get) unhandled OID 0x%x size %d\n", | ||
573 | oid, le16_to_cpu(cmd.bufsize)); | ||
585 | break; | 574 | break; |
586 | } | 575 | } |
587 | 576 | ||
588 | lbs_deb_cmd( | 577 | out: |
589 | "SNMP_CMD: command=0x%x, size=0x%x, seqnum=0x%x, result=0x%x\n", | 578 | lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret); |
590 | le16_to_cpu(cmd->command), le16_to_cpu(cmd->size), | 579 | return ret; |
591 | le16_to_cpu(cmd->seqnum), le16_to_cpu(cmd->result)); | ||
592 | |||
593 | lbs_deb_cmd( | ||
594 | "SNMP_CMD: action 0x%x, oid 0x%x, oidsize 0x%x, value 0x%x\n", | ||
595 | le16_to_cpu(pSNMPMIB->querytype), le16_to_cpu(pSNMPMIB->oid), | ||
596 | le16_to_cpu(pSNMPMIB->bufsize), | ||
597 | le16_to_cpu(*(__le16 *) pSNMPMIB->value)); | ||
598 | |||
599 | lbs_deb_leave(LBS_DEB_CMD); | ||
600 | return 0; | ||
601 | } | 580 | } |
602 | 581 | ||
603 | /** | 582 | /** |
@@ -1409,11 +1388,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv, | |||
1409 | ret = lbs_cmd_80211_authenticate(priv, cmdptr, pdata_buf); | 1388 | ret = lbs_cmd_80211_authenticate(priv, cmdptr, pdata_buf); |
1410 | break; | 1389 | break; |
1411 | 1390 | ||
1412 | case CMD_802_11_SNMP_MIB: | ||
1413 | ret = lbs_cmd_802_11_snmp_mib(priv, cmdptr, | ||
1414 | cmd_action, cmd_oid, pdata_buf); | ||
1415 | break; | ||
1416 | |||
1417 | case CMD_MAC_REG_ACCESS: | 1391 | case CMD_MAC_REG_ACCESS: |
1418 | case CMD_BBP_REG_ACCESS: | 1392 | case CMD_BBP_REG_ACCESS: |
1419 | case CMD_RF_REG_ACCESS: | 1393 | case CMD_RF_REG_ACCESS: |