aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/libertas/cmd.c
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2008-09-10 12:49:00 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-09-15 16:48:20 -0400
commit39fcf7a315e098430e878a5c0c4d39561c93ebf6 (patch)
treee616eb6085e4c99c8920edbd6ebbec65627b7445 /drivers/net/wireless/libertas/cmd.c
parent500c064d3a5f9c8aa604ef63a1346ab70eed443a (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.c180
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
483static 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 */
492int 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 } 528out:
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 */
542int 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( 577out:
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: