diff options
author | Dan Williams <dcbw@redhat.com> | 2007-12-11 15:50:59 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 18:06:49 -0500 |
commit | 8e3c91bb70372da692a5fefae9f698c94bb1e641 (patch) | |
tree | c8befebaafa59facde125257c626c3440a22f785 /drivers/net/wireless/libertas/cmd.c | |
parent | 79a9a37c1eb13bd645ec423c0c30b70838e7bf93 (diff) |
libertas: convert DATA_RATE to a direct command
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
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 | 93 |
1 files changed, 73 insertions, 20 deletions
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c index 9d621fe7f08a..eff78792fc6f 100644 --- a/drivers/net/wireless/libertas/cmd.c +++ b/drivers/net/wireless/libertas/cmd.c | |||
@@ -706,30 +706,86 @@ static int lbs_cmd_802_11_rate_adapt_rateset(struct lbs_private *priv, | |||
706 | return 0; | 706 | return 0; |
707 | } | 707 | } |
708 | 708 | ||
709 | static int lbs_cmd_802_11_data_rate(struct lbs_private *priv, | 709 | /** |
710 | struct cmd_ds_command *cmd, | 710 | * @brief Get the current data rate |
711 | u16 cmd_action) | 711 | * |
712 | * @param priv A pointer to struct lbs_private structure | ||
713 | * | ||
714 | * @return The data rate on success, error on failure | ||
715 | */ | ||
716 | int lbs_get_data_rate(struct lbs_private *priv) | ||
712 | { | 717 | { |
713 | struct cmd_ds_802_11_data_rate *pdatarate = &cmd->params.drate; | 718 | struct cmd_ds_802_11_data_rate cmd; |
719 | int ret = -1; | ||
714 | 720 | ||
715 | lbs_deb_enter(LBS_DEB_CMD); | 721 | lbs_deb_enter(LBS_DEB_CMD); |
716 | 722 | ||
717 | cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_data_rate) + | 723 | memset(&cmd, 0, sizeof(cmd)); |
718 | S_DS_GEN); | 724 | cmd.hdr.size = cpu_to_le16(sizeof(cmd)); |
719 | cmd->command = cpu_to_le16(CMD_802_11_DATA_RATE); | 725 | cmd.action = cpu_to_le16(CMD_ACT_GET_TX_RATE); |
720 | memset(pdatarate, 0, sizeof(struct cmd_ds_802_11_data_rate)); | 726 | |
721 | pdatarate->action = cpu_to_le16(cmd_action); | 727 | ret = lbs_cmd_with_response(priv, CMD_802_11_DATA_RATE, cmd); |
722 | 728 | if (ret) | |
723 | if (cmd_action == CMD_ACT_SET_TX_FIX_RATE) { | 729 | goto out; |
724 | pdatarate->rates[0] = lbs_data_rate_to_fw_index(priv->cur_rate); | 730 | |
725 | lbs_deb_cmd("DATA_RATE: set fixed 0x%02X\n", | 731 | lbs_deb_hex(LBS_DEB_CMD, "DATA_RATE_RESP", (u8 *) &cmd, sizeof (cmd)); |
726 | priv->cur_rate); | 732 | |
727 | } else if (cmd_action == CMD_ACT_SET_TX_AUTO) { | 733 | ret = (int) lbs_fw_index_to_data_rate(cmd.rates[0]); |
734 | lbs_deb_cmd("DATA_RATE: current rate 0x%02x\n", ret); | ||
735 | |||
736 | out: | ||
737 | lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret); | ||
738 | return ret; | ||
739 | } | ||
740 | |||
741 | /** | ||
742 | * @brief Set the data rate | ||
743 | * | ||
744 | * @param priv A pointer to struct lbs_private structure | ||
745 | * @param rate The desired data rate, or 0 to clear a locked rate | ||
746 | * | ||
747 | * @return 0 on success, error on failure | ||
748 | */ | ||
749 | int lbs_set_data_rate(struct lbs_private *priv, u8 rate) | ||
750 | { | ||
751 | struct cmd_ds_802_11_data_rate cmd; | ||
752 | int ret = 0; | ||
753 | |||
754 | lbs_deb_enter(LBS_DEB_CMD); | ||
755 | |||
756 | memset(&cmd, 0, sizeof(cmd)); | ||
757 | cmd.hdr.size = cpu_to_le16(sizeof(cmd)); | ||
758 | |||
759 | if (rate > 0) { | ||
760 | cmd.action = cpu_to_le16(CMD_ACT_SET_TX_FIX_RATE); | ||
761 | cmd.rates[0] = lbs_data_rate_to_fw_index(rate); | ||
762 | if (cmd.rates[0] == 0) { | ||
763 | lbs_deb_cmd("DATA_RATE: invalid requested rate of" | ||
764 | " 0x%02X\n", rate); | ||
765 | ret = 0; | ||
766 | goto out; | ||
767 | } | ||
768 | lbs_deb_cmd("DATA_RATE: set fixed 0x%02X\n", cmd.rates[0]); | ||
769 | } else { | ||
770 | cmd.action = cpu_to_le16(CMD_ACT_SET_TX_AUTO); | ||
728 | lbs_deb_cmd("DATA_RATE: setting auto\n"); | 771 | lbs_deb_cmd("DATA_RATE: setting auto\n"); |
729 | } | 772 | } |
730 | 773 | ||
731 | lbs_deb_leave(LBS_DEB_CMD); | 774 | ret = lbs_cmd_with_response(priv, CMD_802_11_DATA_RATE, cmd); |
732 | return 0; | 775 | if (ret) |
776 | goto out; | ||
777 | |||
778 | lbs_deb_hex(LBS_DEB_CMD, "DATA_RATE_RESP", (u8 *) &cmd, sizeof (cmd)); | ||
779 | |||
780 | /* FIXME: get actual rates FW can do if this command actually returns | ||
781 | * all data rates supported. | ||
782 | */ | ||
783 | priv->cur_rate = lbs_fw_index_to_data_rate(cmd.rates[0]); | ||
784 | lbs_deb_cmd("DATA_RATE: current rate is 0x%02x\n", priv->cur_rate); | ||
785 | |||
786 | out: | ||
787 | lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret); | ||
788 | return ret; | ||
733 | } | 789 | } |
734 | 790 | ||
735 | static int lbs_cmd_mac_multicast_adr(struct lbs_private *priv, | 791 | static int lbs_cmd_mac_multicast_adr(struct lbs_private *priv, |
@@ -1348,9 +1404,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv, | |||
1348 | ret = lbs_cmd_802_11_radio_control(priv, cmdptr, cmd_action); | 1404 | ret = lbs_cmd_802_11_radio_control(priv, cmdptr, cmd_action); |
1349 | break; | 1405 | break; |
1350 | 1406 | ||
1351 | case CMD_802_11_DATA_RATE: | ||
1352 | ret = lbs_cmd_802_11_data_rate(priv, cmdptr, cmd_action); | ||
1353 | break; | ||
1354 | case CMD_802_11_RATE_ADAPT_RATESET: | 1407 | case CMD_802_11_RATE_ADAPT_RATESET: |
1355 | ret = lbs_cmd_802_11_rate_adapt_rateset(priv, | 1408 | ret = lbs_cmd_802_11_rate_adapt_rateset(priv, |
1356 | cmdptr, cmd_action); | 1409 | cmdptr, cmd_action); |