]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/net/wireless/wl12xx/wl1271_cmd.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[mv-sheeva.git] / drivers / net / wireless / wl12xx / wl1271_cmd.c
index c3385b3d246cf988d3efb5d882a5d1c0e877ffd5..e7832f3318eba7e38629e3f43adce326c6a6f411 100644 (file)
 #include <linux/crc7.h>
 #include <linux/spi/spi.h>
 #include <linux/etherdevice.h>
+#include <linux/slab.h>
 
 #include "wl1271.h"
 #include "wl1271_reg.h"
 #include "wl1271_spi.h"
+#include "wl1271_io.h"
 #include "wl1271_acx.h"
 #include "wl12xx_80211.h"
 #include "wl1271_cmd.h"
@@ -57,13 +59,13 @@ int wl1271_cmd_send(struct wl1271 *wl, u16 id, void *buf, size_t len,
 
        WARN_ON(len % 4 != 0);
 
-       wl1271_spi_write(wl, wl->cmd_box_addr, buf, len, false);
+       wl1271_write(wl, wl->cmd_box_addr, buf, len, false);
 
-       wl1271_spi_write32(wl, ACX_REG_INTERRUPT_TRIG, INTR_TRIG_CMD);
+       wl1271_write32(wl, ACX_REG_INTERRUPT_TRIG, INTR_TRIG_CMD);
 
        timeout = jiffies + msecs_to_jiffies(WL1271_COMMAND_TIMEOUT);
 
-       intr = wl1271_spi_read32(wl, ACX_REG_INTERRUPT_NO_CLEAR);
+       intr = wl1271_read32(wl, ACX_REG_INTERRUPT_NO_CLEAR);
        while (!(intr & WL1271_ACX_INTR_CMD_COMPLETE)) {
                if (time_after(jiffies, timeout)) {
                        wl1271_error("command complete timeout");
@@ -73,13 +75,13 @@ int wl1271_cmd_send(struct wl1271 *wl, u16 id, void *buf, size_t len,
 
                msleep(1);
 
-               intr = wl1271_spi_read32(wl, ACX_REG_INTERRUPT_NO_CLEAR);
+               intr = wl1271_read32(wl, ACX_REG_INTERRUPT_NO_CLEAR);
        }
 
        /* read back the status code of the command */
        if (res_len == 0)
                res_len = sizeof(struct wl1271_cmd_header);
-       wl1271_spi_read(wl, wl->cmd_box_addr, cmd, res_len, false);
+       wl1271_read(wl, wl->cmd_box_addr, cmd, res_len, false);
 
        status = le16_to_cpu(cmd->status);
        if (status != CMD_STATUS_SUCCESS) {
@@ -87,8 +89,8 @@ int wl1271_cmd_send(struct wl1271 *wl, u16 id, void *buf, size_t len,
                ret = -EIO;
        }
 
-       wl1271_spi_write32(wl, ACX_REG_INTERRUPT_ACK,
-                          WL1271_ACX_INTR_CMD_COMPLETE);
+       wl1271_write32(wl, ACX_REG_INTERRUPT_ACK,
+                      WL1271_ACX_INTR_CMD_COMPLETE);
 
 out:
        return ret;
@@ -191,23 +193,19 @@ static int wl1271_cmd_cal(struct wl1271 *wl)
 int wl1271_cmd_general_parms(struct wl1271 *wl)
 {
        struct wl1271_general_parms_cmd *gen_parms;
-       struct conf_general_parms *g = &wl->conf.init.genparam;
        int ret;
 
+       if (!wl->nvs)
+               return -ENODEV;
+
        gen_parms = kzalloc(sizeof(*gen_parms), GFP_KERNEL);
        if (!gen_parms)
                return -ENOMEM;
 
        gen_parms->test.id = TEST_CMD_INI_FILE_GENERAL_PARAM;
 
-       gen_parms->ref_clk = g->ref_clk;
-       gen_parms->settling_time = g->settling_time;
-       gen_parms->clk_valid_on_wakeup = g->clk_valid_on_wakeup;
-       gen_parms->dc2dcmode = g->dc2dcmode;
-       gen_parms->single_dual_band = g->single_dual_band;
-       gen_parms->tx_bip_fem_autodetect = g->tx_bip_fem_autodetect;
-       gen_parms->tx_bip_fem_manufacturer = g->tx_bip_fem_manufacturer;
-       gen_parms->settings = g->settings;
+       memcpy(gen_parms->params, wl->nvs->general_params,
+              WL1271_NVS_GENERAL_PARAMS_SIZE);
 
        ret = wl1271_cmd_test(wl, gen_parms, sizeof(*gen_parms), 0);
        if (ret < 0)
@@ -220,8 +218,11 @@ int wl1271_cmd_general_parms(struct wl1271 *wl)
 int wl1271_cmd_radio_parms(struct wl1271 *wl)
 {
        struct wl1271_radio_parms_cmd *radio_parms;
-       struct conf_radio_parms *r = &wl->conf.init.radioparam;
-       int i, ret;
+       struct conf_radio_parms *rparam = &wl->conf.init.radioparam;
+       int ret;
+
+       if (!wl->nvs)
+               return -ENODEV;
 
        radio_parms = kzalloc(sizeof(*radio_parms), GFP_KERNEL);
        if (!radio_parms)
@@ -229,60 +230,13 @@ int wl1271_cmd_radio_parms(struct wl1271 *wl)
 
        radio_parms->test.id = TEST_CMD_INI_FILE_RADIO_PARAM;
 
-       /* Static radio parameters */
-       radio_parms->rx_trace_loss = r->rx_trace_loss;
-       radio_parms->tx_trace_loss = r->tx_trace_loss;
-       memcpy(radio_parms->rx_rssi_and_proc_compens,
-              r->rx_rssi_and_proc_compens,
-              CONF_RSSI_AND_PROCESS_COMPENSATION_SIZE);
-
-       memcpy(radio_parms->rx_trace_loss_5, r->rx_trace_loss_5,
-              CONF_NUMBER_OF_SUB_BANDS_5);
-       memcpy(radio_parms->tx_trace_loss_5, r->tx_trace_loss_5,
-              CONF_NUMBER_OF_SUB_BANDS_5);
-       memcpy(radio_parms->rx_rssi_and_proc_compens_5,
-              r->rx_rssi_and_proc_compens_5,
-              CONF_RSSI_AND_PROCESS_COMPENSATION_SIZE);
-
-       /* Dynamic radio parameters */
-       radio_parms->tx_ref_pd_voltage = cpu_to_le16(r->tx_ref_pd_voltage);
-       radio_parms->tx_ref_power = r->tx_ref_power;
-       radio_parms->tx_offset_db = r->tx_offset_db;
-
-       memcpy(radio_parms->tx_rate_limits_normal, r->tx_rate_limits_normal,
-              CONF_NUMBER_OF_RATE_GROUPS);
-       memcpy(radio_parms->tx_rate_limits_degraded, r->tx_rate_limits_degraded,
-              CONF_NUMBER_OF_RATE_GROUPS);
-
-       memcpy(radio_parms->tx_channel_limits_11b, r->tx_channel_limits_11b,
-              CONF_NUMBER_OF_CHANNELS_2_4);
-       memcpy(radio_parms->tx_channel_limits_ofdm, r->tx_channel_limits_ofdm,
-              CONF_NUMBER_OF_CHANNELS_2_4);
-       memcpy(radio_parms->tx_pdv_rate_offsets, r->tx_pdv_rate_offsets,
-              CONF_NUMBER_OF_RATE_GROUPS);
-       memcpy(radio_parms->tx_ibias, r->tx_ibias, CONF_NUMBER_OF_RATE_GROUPS);
-
-       radio_parms->rx_fem_insertion_loss = r->rx_fem_insertion_loss;
-
-       for (i = 0; i < CONF_NUMBER_OF_SUB_BANDS_5; i++)
-               radio_parms->tx_ref_pd_voltage_5[i] =
-                       cpu_to_le16(r->tx_ref_pd_voltage_5[i]);
-       memcpy(radio_parms->tx_ref_power_5, r->tx_ref_power_5,
-              CONF_NUMBER_OF_SUB_BANDS_5);
-       memcpy(radio_parms->tx_offset_db_5, r->tx_offset_db_5,
-              CONF_NUMBER_OF_SUB_BANDS_5);
-       memcpy(radio_parms->tx_rate_limits_normal_5,
-              r->tx_rate_limits_normal_5, CONF_NUMBER_OF_RATE_GROUPS);
-       memcpy(radio_parms->tx_rate_limits_degraded_5,
-              r->tx_rate_limits_degraded_5, CONF_NUMBER_OF_RATE_GROUPS);
-       memcpy(radio_parms->tx_channel_limits_ofdm_5,
-              r->tx_channel_limits_ofdm_5, CONF_NUMBER_OF_CHANNELS_5);
-       memcpy(radio_parms->tx_pdv_rate_offsets_5, r->tx_pdv_rate_offsets_5,
-              CONF_NUMBER_OF_RATE_GROUPS);
-       memcpy(radio_parms->tx_ibias_5, r->tx_ibias_5,
-              CONF_NUMBER_OF_RATE_GROUPS);
-       memcpy(radio_parms->rx_fem_insertion_loss_5,
-              r->rx_fem_insertion_loss_5, CONF_NUMBER_OF_SUB_BANDS_5);
+       memcpy(radio_parms->stat_radio_params, wl->nvs->stat_radio_params,
+              WL1271_NVS_STAT_RADIO_PARAMS_SIZE);
+       memcpy(radio_parms->dyn_radio_params,
+              wl->nvs->dyn_radio_params[rparam->fem],
+              WL1271_NVS_DYN_RADIO_PARAMS_SIZE);
+
+       /* FIXME: current NVS is missing 5GHz parameters */
 
        wl1271_dump(DEBUG_CMD, "TEST_CMD_INI_FILE_RADIO_PARAM: ",
                    radio_parms, sizeof(*radio_parms));
@@ -311,19 +265,6 @@ int wl1271_cmd_join(struct wl1271 *wl)
                        do_cal = false;
        }
 
-       /* FIXME: This is a workaround, because with the current stack, we
-        * cannot know when we have disassociated.  So, if we have already
-        * joined, we disconnect before joining again. */
-       if (wl->joined) {
-               ret = wl1271_cmd_disconnect(wl);
-               if (ret < 0) {
-                       wl1271_error("failed to disconnect before rejoining");
-                       goto out;
-               }
-
-               wl->joined = false;
-       }
-
        join = kzalloc(sizeof(*join), GFP_KERNEL);
        if (!join) {
                ret = -ENOMEM;
@@ -388,8 +329,6 @@ int wl1271_cmd_join(struct wl1271 *wl)
                goto out_free;
        }
 
-       wl->joined = true;
-
        /*
         * ugly hack: we should wait for JOIN_EVENT_COMPLETE_ID but to
         * simplify locking we just sleep instead, for now
@@ -487,7 +426,7 @@ int wl1271_cmd_configure(struct wl1271 *wl, u16 id, void *buf, size_t len)
        return 0;
 }
 
-int wl1271_cmd_data_path(struct wl1271 *wl, u8 channel, bool enable)
+int wl1271_cmd_data_path(struct wl1271 *wl, bool enable)
 {
        struct cmd_enabledisable_path *cmd;
        int ret;
@@ -501,7 +440,8 @@ int wl1271_cmd_data_path(struct wl1271 *wl, u8 channel, bool enable)
                goto out;
        }
 
-       cmd->channel = channel;
+       /* the channel here is only used for calibration, so hardcoded to 1 */
+       cmd->channel = 1;
 
        if (enable) {
                cmd_rx = CMD_ENABLE_RX;
@@ -514,29 +454,29 @@ int wl1271_cmd_data_path(struct wl1271 *wl, u8 channel, bool enable)
        ret = wl1271_cmd_send(wl, cmd_rx, cmd, sizeof(*cmd), 0);
        if (ret < 0) {
                wl1271_error("rx %s cmd for channel %d failed",
-                            enable ? "start" : "stop", channel);
+                            enable ? "start" : "stop", cmd->channel);
                goto out;
        }
 
        wl1271_debug(DEBUG_BOOT, "rx %s cmd channel %d",
-                    enable ? "start" : "stop", channel);
+                    enable ? "start" : "stop", cmd->channel);
 
        ret = wl1271_cmd_send(wl, cmd_tx, cmd, sizeof(*cmd), 0);
        if (ret < 0) {
                wl1271_error("tx %s cmd for channel %d failed",
-                            enable ? "start" : "stop", channel);
+                            enable ? "start" : "stop", cmd->channel);
                return ret;
        }
 
        wl1271_debug(DEBUG_BOOT, "tx %s cmd channel %d",
-                    enable ? "start" : "stop", channel);
+                    enable ? "start" : "stop", cmd->channel);
 
 out:
        kfree(cmd);
        return ret;
 }
 
-int wl1271_cmd_ps_mode(struct wl1271 *wl, u8 ps_mode)
+int wl1271_cmd_ps_mode(struct wl1271 *wl, u8 ps_mode, bool send)
 {
        struct wl1271_cmd_ps_params *ps_params = NULL;
        int ret = 0;
@@ -557,7 +497,7 @@ int wl1271_cmd_ps_mode(struct wl1271 *wl, u8 ps_mode)
        }
 
        ps_params->ps_mode = ps_mode;
-       ps_params->send_null_data = 1;
+       ps_params->send_null_data = send;
        ps_params->retries = 5;
        ps_params->hang_over_period = 128;
        ps_params->null_data_rate = cpu_to_le32(1); /* 1 Mbps */
@@ -636,7 +576,7 @@ int wl1271_cmd_scan(struct wl1271 *wl, u8 *ssid, size_t len,
        channels = wl->hw->wiphy->bands[ieee_band]->channels;
        n_ch = wl->hw->wiphy->bands[ieee_band]->n_channels;
 
-       if (wl->scanning)
+       if (test_bit(WL1271_FLAG_SCANNING, &wl->flags))
                return -EINVAL;
 
        params = kzalloc(sizeof(*params), GFP_KERNEL);
@@ -711,7 +651,7 @@ int wl1271_cmd_scan(struct wl1271 *wl, u8 *ssid, size_t len,
 
        wl1271_dump(DEBUG_SCAN, "SCAN: ", params, sizeof(*params));
 
-       wl->scanning = true;
+       set_bit(WL1271_FLAG_SCANNING, &wl->flags);
        if (wl1271_11a_enabled()) {
                wl->scan.state = band;
                if (band == WL1271_SCAN_BAND_DUAL) {
@@ -729,7 +669,7 @@ int wl1271_cmd_scan(struct wl1271 *wl, u8 *ssid, size_t len,
        ret = wl1271_cmd_send(wl, CMD_SCAN, params, sizeof(*params), 0);
        if (ret < 0) {
                wl1271_error("SCAN failed");
-               wl->scanning = false;
+               clear_bit(WL1271_FLAG_SCANNING, &wl->flags);
                goto out;
        }
 
@@ -1003,7 +943,7 @@ int wl1271_cmd_set_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type,
        ret = wl1271_cmd_send(wl, CMD_SET_KEYS, cmd, sizeof(*cmd), 0);
        if (ret < 0) {
                wl1271_warning("could not set keys");
-               goto out;
+       goto out;
        }
 
 out: