summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-07-20 15:42:38 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2013-07-20 15:42:38 -0700
commitf6a0d9d585699d4ab634cfd26fa9ce9c7cb864a1 (patch)
tree31a9a5f572f97c869b17396be694208f30db1619
parent36231d255b8df9cb4698e9a3902c16067d5c1398 (diff)
parent78077256bc08348d587e318957ceb41fe4d4afae (diff)
downloadlinux-sh-f6a0d9d585699d4ab634cfd26fa9ce9c7cb864a1.tar.gz
Merge tag 'staging-3.11-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging
Pull staging tree fixes from Greg KH: "Here are a few iio driver fixes for 3.11-rc2. They are still spread across drivers/iio and drivers/staging/iio so they are coming in through this tree. I've also removed the drivers/staging/csr/ driver as the developers who originally sent it to me have moved on to other companies, and CSR still will not send us the specs for the device, making the driver pretty much obsolete and impossible to fix up. Deleting it now prevents people from sending in lots of tiny codingsyle fixes that will never go anywhere. It also helps to offset the large lustre filesystem merge that happened in 3.11-rc1 in the overall 3.11.0 diffstat. :)" * tag 'staging-3.11-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: staging: csr: remove driver iio: lps331ap: Fix wrong in_pressure_scale output value iio staging: fix lis3l02dq, read error handling staging:iio:ad7291: add missing .driver_module to struct iio_info iio: ti_am335x_adc: add missing .driver_module to struct iio_info iio: mxs-lradc: Remove useless check in read_raw iio: mxs-lradc: Fix misuse of iio->trig iio: inkern: fix iio_convert_raw_to_processed_unlocked iio: Fix iio_channel_has_info iio:trigger: device_unregister->device_del to avoid double free iio: dac: ad7303: fix error return code in ad7303_probe()
-rw-r--r--drivers/iio/adc/ti_am335x_adc.c1
-rw-r--r--drivers/iio/dac/ad7303.c4
-rw-r--r--drivers/iio/industrialio-trigger.c2
-rw-r--r--drivers/iio/inkern.c2
-rw-r--r--drivers/iio/pressure/st_pressure_core.c6
-rw-r--r--drivers/staging/Kconfig2
-rw-r--r--drivers/staging/Makefile1
-rw-r--r--drivers/staging/csr/Kconfig9
-rw-r--r--drivers/staging/csr/LICENSE.txt39
-rw-r--r--drivers/staging/csr/Makefile73
-rw-r--r--drivers/staging/csr/bh.c404
-rw-r--r--drivers/staging/csr/csr_framework_ext.c40
-rw-r--r--drivers/staging/csr/csr_framework_ext.h35
-rw-r--r--drivers/staging/csr/csr_framework_ext_types.h30
-rw-r--r--drivers/staging/csr/csr_log.h223
-rw-r--r--drivers/staging/csr/csr_log_configure.h39
-rw-r--r--drivers/staging/csr/csr_log_text.h124
-rw-r--r--drivers/staging/csr/csr_macro.h39
-rw-r--r--drivers/staging/csr/csr_msg_transport.h17
-rw-r--r--drivers/staging/csr/csr_msgconv.c291
-rw-r--r--drivers/staging/csr/csr_msgconv.h78
-rw-r--r--drivers/staging/csr/csr_prim_defs.h55
-rw-r--r--drivers/staging/csr/csr_result.h17
-rw-r--r--drivers/staging/csr/csr_sched.h85
-rw-r--r--drivers/staging/csr/csr_sdio.h723
-rw-r--r--drivers/staging/csr/csr_serialize_primitive_types.c100
-rw-r--r--drivers/staging/csr/csr_time.c33
-rw-r--r--drivers/staging/csr/csr_time.h76
-rw-r--r--drivers/staging/csr/csr_util.c15
-rw-r--r--drivers/staging/csr/csr_wifi_common.h101
-rw-r--r--drivers/staging/csr/csr_wifi_fsm.h240
-rw-r--r--drivers/staging/csr/csr_wifi_fsm_event.h42
-rw-r--r--drivers/staging/csr/csr_wifi_fsm_types.h430
-rw-r--r--drivers/staging/csr/csr_wifi_hip_card.h114
-rw-r--r--drivers/staging/csr/csr_wifi_hip_card_sdio.c4001
-rw-r--r--drivers/staging/csr/csr_wifi_hip_card_sdio.h694
-rw-r--r--drivers/staging/csr/csr_wifi_hip_card_sdio_intr.c2595
-rw-r--r--drivers/staging/csr/csr_wifi_hip_card_sdio_mem.c1713
-rw-r--r--drivers/staging/csr/csr_wifi_hip_chiphelper.c793
-rw-r--r--drivers/staging/csr/csr_wifi_hip_chiphelper.h407
-rw-r--r--drivers/staging/csr/csr_wifi_hip_chiphelper_private.h200
-rw-r--r--drivers/staging/csr/csr_wifi_hip_conversions.h73
-rw-r--r--drivers/staging/csr/csr_wifi_hip_download.c819
-rw-r--r--drivers/staging/csr/csr_wifi_hip_dump.c837
-rw-r--r--drivers/staging/csr/csr_wifi_hip_packing.c4804
-rw-r--r--drivers/staging/csr/csr_wifi_hip_send.c415
-rw-r--r--drivers/staging/csr/csr_wifi_hip_signals.c1313
-rw-r--r--drivers/staging/csr/csr_wifi_hip_signals.h128
-rw-r--r--drivers/staging/csr/csr_wifi_hip_sigs.h1417
-rw-r--r--drivers/staging/csr/csr_wifi_hip_ta_sampling.c541
-rw-r--r--drivers/staging/csr/csr_wifi_hip_ta_sampling.h66
-rw-r--r--drivers/staging/csr/csr_wifi_hip_udi.c173
-rw-r--r--drivers/staging/csr/csr_wifi_hip_unifi.h871
-rw-r--r--drivers/staging/csr/csr_wifi_hip_unifi_signal_names.c41
-rw-r--r--drivers/staging/csr/csr_wifi_hip_unifi_udi.h52
-rw-r--r--drivers/staging/csr/csr_wifi_hip_unifihw.h59
-rw-r--r--drivers/staging/csr/csr_wifi_hip_unifiversion.h30
-rw-r--r--drivers/staging/csr/csr_wifi_hip_xbv.c1076
-rw-r--r--drivers/staging/csr/csr_wifi_hip_xbv.h119
-rw-r--r--drivers/staging/csr/csr_wifi_hostio_prim.h18
-rw-r--r--drivers/staging/csr/csr_wifi_lib.h103
-rw-r--r--drivers/staging/csr/csr_wifi_msgconv.h49
-rw-r--r--drivers/staging/csr/csr_wifi_nme_ap_converter_init.c90
-rw-r--r--drivers/staging/csr/csr_wifi_nme_ap_converter_init.h41
-rw-r--r--drivers/staging/csr/csr_wifi_nme_ap_free_downstream_contents.c84
-rw-r--r--drivers/staging/csr/csr_wifi_nme_ap_free_upstream_contents.c39
-rw-r--r--drivers/staging/csr/csr_wifi_nme_ap_lib.h495
-rw-r--r--drivers/staging/csr/csr_wifi_nme_ap_prim.h494
-rw-r--r--drivers/staging/csr/csr_wifi_nme_ap_sef.c30
-rw-r--r--drivers/staging/csr/csr_wifi_nme_ap_sef.h21
-rw-r--r--drivers/staging/csr/csr_wifi_nme_ap_serialize.c909
-rw-r--r--drivers/staging/csr/csr_wifi_nme_ap_serialize.h94
-rw-r--r--drivers/staging/csr/csr_wifi_nme_converter_init.h38
-rw-r--r--drivers/staging/csr/csr_wifi_nme_lib.h991
-rw-r--r--drivers/staging/csr/csr_wifi_nme_prim.h1657
-rw-r--r--drivers/staging/csr/csr_wifi_nme_serialize.h166
-rw-r--r--drivers/staging/csr/csr_wifi_nme_task.h27
-rw-r--r--drivers/staging/csr/csr_wifi_private_common.h81
-rw-r--r--drivers/staging/csr/csr_wifi_result.h27
-rw-r--r--drivers/staging/csr/csr_wifi_router_converter_init.c82
-rw-r--r--drivers/staging/csr/csr_wifi_router_converter_init.h34
-rw-r--r--drivers/staging/csr/csr_wifi_router_ctrl_converter_init.c134
-rw-r--r--drivers/staging/csr/csr_wifi_router_ctrl_converter_init.h34
-rw-r--r--drivers/staging/csr/csr_wifi_router_ctrl_free_downstream_contents.c108
-rw-r--r--drivers/staging/csr/csr_wifi_router_ctrl_free_upstream_contents.c87
-rw-r--r--drivers/staging/csr/csr_wifi_router_ctrl_lib.h2082
-rw-r--r--drivers/staging/csr/csr_wifi_router_ctrl_prim.h2113
-rw-r--r--drivers/staging/csr/csr_wifi_router_ctrl_sef.c46
-rw-r--r--drivers/staging/csr/csr_wifi_router_ctrl_sef.h51
-rw-r--r--drivers/staging/csr/csr_wifi_router_ctrl_serialize.c2591
-rw-r--r--drivers/staging/csr/csr_wifi_router_ctrl_serialize.h333
-rw-r--r--drivers/staging/csr/csr_wifi_router_free_downstream_contents.c53
-rw-r--r--drivers/staging/csr/csr_wifi_router_free_upstream_contents.c47
-rw-r--r--drivers/staging/csr/csr_wifi_router_lib.h417
-rw-r--r--drivers/staging/csr/csr_wifi_router_prim.h421
-rw-r--r--drivers/staging/csr/csr_wifi_router_sef.c19
-rw-r--r--drivers/staging/csr/csr_wifi_router_sef.h25
-rw-r--r--drivers/staging/csr/csr_wifi_router_serialize.c418
-rw-r--r--drivers/staging/csr/csr_wifi_router_serialize.h67
-rw-r--r--drivers/staging/csr/csr_wifi_router_task.h25
-rw-r--r--drivers/staging/csr/csr_wifi_router_transport.c199
-rw-r--r--drivers/staging/csr/csr_wifi_serialize_primitive_types.c256
-rw-r--r--drivers/staging/csr/csr_wifi_sme_ap_lib.h774
-rw-r--r--drivers/staging/csr/csr_wifi_sme_ap_prim.h1030
-rw-r--r--drivers/staging/csr/csr_wifi_sme_converter_init.c201
-rw-r--r--drivers/staging/csr/csr_wifi_sme_converter_init.h34
-rw-r--r--drivers/staging/csr/csr_wifi_sme_free_downstream_contents.c187
-rw-r--r--drivers/staging/csr/csr_wifi_sme_free_upstream_contents.c275
-rw-r--r--drivers/staging/csr/csr_wifi_sme_lib.h4303
-rw-r--r--drivers/staging/csr/csr_wifi_sme_prim.h6510
-rw-r--r--drivers/staging/csr/csr_wifi_sme_sef.c85
-rw-r--r--drivers/staging/csr/csr_wifi_sme_sef.h142
-rw-r--r--drivers/staging/csr/csr_wifi_sme_serialize.c5809
-rw-r--r--drivers/staging/csr/csr_wifi_sme_serialize.h666
-rw-r--r--drivers/staging/csr/csr_wifi_sme_task.h25
-rw-r--r--drivers/staging/csr/csr_wifi_vif_utils.h27
-rw-r--r--drivers/staging/csr/data_tx.c54
-rw-r--r--drivers/staging/csr/drv.c2193
-rw-r--r--drivers/staging/csr/firmware.c396
-rw-r--r--drivers/staging/csr/inet.c104
-rw-r--r--drivers/staging/csr/init_hw.c108
-rw-r--r--drivers/staging/csr/io.c1098
-rw-r--r--drivers/staging/csr/mlme.c433
-rw-r--r--drivers/staging/csr/monitor.c384
-rw-r--r--drivers/staging/csr/netdev.c3307
-rw-r--r--drivers/staging/csr/os.c477
-rw-r--r--drivers/staging/csr/putest.c685
-rw-r--r--drivers/staging/csr/sdio_events.c134
-rw-r--r--drivers/staging/csr/sdio_mmc.c1288
-rw-r--r--drivers/staging/csr/sdio_stubs.c82
-rw-r--r--drivers/staging/csr/sme_blocking.c1466
-rw-r--r--drivers/staging/csr/sme_mgt.c1012
-rw-r--r--drivers/staging/csr/sme_native.c566
-rw-r--r--drivers/staging/csr/sme_sys.c3260
-rw-r--r--drivers/staging/csr/sme_userspace.c315
-rw-r--r--drivers/staging/csr/sme_userspace.h38
-rw-r--r--drivers/staging/csr/sme_wext.c3327
-rw-r--r--drivers/staging/csr/ul_int.c528
-rw-r--r--drivers/staging/csr/unifi_clients.h129
-rw-r--r--drivers/staging/csr/unifi_config.h34
-rw-r--r--drivers/staging/csr/unifi_dbg.c110
-rw-r--r--drivers/staging/csr/unifi_event.c692
-rw-r--r--drivers/staging/csr/unifi_native.h257
-rw-r--r--drivers/staging/csr/unifi_os.h122
-rw-r--r--drivers/staging/csr/unifi_pdu_processing.c3729
-rw-r--r--drivers/staging/csr/unifi_priv.h1136
-rw-r--r--drivers/staging/csr/unifi_sme.c1225
-rw-r--r--drivers/staging/csr/unifi_sme.h245
-rw-r--r--drivers/staging/csr/unifi_wext.h108
-rw-r--r--drivers/staging/csr/unifiio.h398
-rw-r--r--drivers/staging/csr/wext_events.c283
-rw-r--r--drivers/staging/iio/accel/lis3l02dq_core.c2
-rw-r--r--drivers/staging/iio/adc/ad7291.c1
-rw-r--r--drivers/staging/iio/adc/mxs-lradc.c18
-rw-r--r--include/linux/iio/iio.h4
155 files changed, 22 insertions, 91617 deletions
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 4427e8e46a7f..0ad208a69c29 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -183,6 +183,7 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
static const struct iio_info tiadc_info = {
.read_raw = &tiadc_read_raw,
+ .driver_module = THIS_MODULE,
};
static int tiadc_probe(struct platform_device *pdev)
diff --git a/drivers/iio/dac/ad7303.c b/drivers/iio/dac/ad7303.c
index 85aeef60dc5f..d546f50f9258 100644
--- a/drivers/iio/dac/ad7303.c
+++ b/drivers/iio/dac/ad7303.c
@@ -235,8 +235,10 @@ static int ad7303_probe(struct spi_device *spi)
if (ext_ref) {
st->vref_reg = regulator_get(&spi->dev, "REF");
- if (IS_ERR(st->vref_reg))
+ if (IS_ERR(st->vref_reg)) {
+ ret = PTR_ERR(st->vref_reg);
goto err_disable_vdd_reg;
+ }
ret = regulator_enable(st->vref_reg);
if (ret)
diff --git a/drivers/iio/industrialio-trigger.c b/drivers/iio/industrialio-trigger.c
index 4d6c7d84e155..ea8a4146620d 100644
--- a/drivers/iio/industrialio-trigger.c
+++ b/drivers/iio/industrialio-trigger.c
@@ -104,7 +104,7 @@ void iio_trigger_unregister(struct iio_trigger *trig_info)
ida_simple_remove(&iio_trigger_ida, trig_info->id);
/* Possible issue in here */
- device_unregister(&trig_info->dev);
+ device_del(&trig_info->dev);
}
EXPORT_SYMBOL(iio_trigger_unregister);
diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c
index 98ddc323add0..0cf5f8e06cfc 100644
--- a/drivers/iio/inkern.c
+++ b/drivers/iio/inkern.c
@@ -451,7 +451,7 @@ static int iio_convert_raw_to_processed_unlocked(struct iio_channel *chan,
int ret;
ret = iio_channel_read(chan, &offset, NULL, IIO_CHAN_INFO_OFFSET);
- if (ret == 0)
+ if (ret >= 0)
raw64 += offset;
scale_type = iio_channel_read(chan, &scale_val, &scale_val2,
diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
index 9c343b40665e..3ffbc56917b4 100644
--- a/drivers/iio/pressure/st_pressure_core.c
+++ b/drivers/iio/pressure/st_pressure_core.c
@@ -28,7 +28,9 @@
#include <linux/iio/common/st_sensors.h>
#include "st_pressure.h"
-#define ST_PRESS_MBAR_TO_KPASCAL(x) (x * 10)
+#define ST_PRESS_LSB_PER_MBAR 4096UL
+#define ST_PRESS_KPASCAL_NANO_SCALE (100000000UL / \
+ ST_PRESS_LSB_PER_MBAR)
#define ST_PRESS_NUMBER_DATA_CHANNELS 1
/* DEFAULT VALUE FOR SENSORS */
@@ -51,8 +53,8 @@
#define ST_PRESS_1_FS_ADDR 0x23
#define ST_PRESS_1_FS_MASK 0x30
#define ST_PRESS_1_FS_AVL_1260_VAL 0x00
-#define ST_PRESS_1_FS_AVL_1260_GAIN ST_PRESS_MBAR_TO_KPASCAL(244141)
#define ST_PRESS_1_FS_AVL_TEMP_GAIN 2083000
+#define ST_PRESS_1_FS_AVL_1260_GAIN ST_PRESS_KPASCAL_NANO_SCALE
#define ST_PRESS_1_BDU_ADDR 0x20
#define ST_PRESS_1_BDU_MASK 0x04
#define ST_PRESS_1_DRDY_IRQ_ADDR 0x22
diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig
index 3227ebeae3f1..57d8b3444600 100644
--- a/drivers/staging/Kconfig
+++ b/drivers/staging/Kconfig
@@ -118,8 +118,6 @@ source "drivers/staging/ozwpan/Kconfig"
source "drivers/staging/gdm72xx/Kconfig"
-source "drivers/staging/csr/Kconfig"
-
source "drivers/staging/silicom/Kconfig"
source "drivers/staging/ced1401/Kconfig"
diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile
index 4d79ebe2de06..429321f15105 100644
--- a/drivers/staging/Makefile
+++ b/drivers/staging/Makefile
@@ -52,7 +52,6 @@ obj-$(CONFIG_MFD_NVEC) += nvec/
obj-$(CONFIG_ANDROID) += android/
obj-$(CONFIG_USB_WPAN_HCD) += ozwpan/
obj-$(CONFIG_WIMAX_GDM72XX) += gdm72xx/
-obj-$(CONFIG_CSR_WIFI) += csr/
obj-$(CONFIG_NET_VENDOR_SILICOM) += silicom/
obj-$(CONFIG_CED1401) += ced1401/
obj-$(CONFIG_DRM_IMX) += imx-drm/
diff --git a/drivers/staging/csr/Kconfig b/drivers/staging/csr/Kconfig
deleted file mode 100644
index ad2a1096e920..000000000000
--- a/drivers/staging/csr/Kconfig
+++ /dev/null
@@ -1,9 +0,0 @@
-config CSR_WIFI
- tristate "CSR wireless driver"
- depends on MMC && CFG80211_WEXT && INET
- select WIRELESS_EXT
- select WEXT_PRIV
- help
- Driver for the CSR wireless SDIO device.
-
- If unsure, select N.
diff --git a/drivers/staging/csr/LICENSE.txt b/drivers/staging/csr/LICENSE.txt
deleted file mode 100644
index 364853e5fedc..000000000000
--- a/drivers/staging/csr/LICENSE.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-Except as contained in this notice, the names of above-listed
-copyright holders and the names of any contributors shall not be used
-in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
-CONTRIBUTORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
-OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-Alternatively, this software may be distributed under the terms of the
-GNU General Public License ("GPL") version 2 as published
-by the Free Software Foundation.
-
-As a special exception, if other files instantiate templates or use
-macros or inline functions from this file, or you compile this file
-and link it with other works to produce a work based on this file,
-this file does not by itself cause the resulting work to be covered by
-the GNU General Public License. However the source code for this file
-must still be made available in accordance with section (3) of the GNU
-General Public License.
-
-This exception does not invalidate any other reasons why a work based
-on this file might be covered by the GNU General Public License.
diff --git a/drivers/staging/csr/Makefile b/drivers/staging/csr/Makefile
deleted file mode 100644
index dbd135a8b177..000000000000
--- a/drivers/staging/csr/Makefile
+++ /dev/null
@@ -1,73 +0,0 @@
-ccflags-y := -DCSR_SME_USERSPACE -DCSR_SUPPORT_SME -DREMOTE_SYS_SAP -DCSR_WIFI_SECURITY_WAPI_ENABLE -DENABLE_SHUTDOWN -DUNIFI_DEBUG
-ccflags-y += -DSDIO_EXPORTS_STRUCT_DEVICE -DCSR_WIFI_SUPPORT_MMC_DRIVER -DCSR_WIFI_SINGLE_FUNCTION -DCSR_WIFI_SPLIT_PATCH
-ccflags-y += -DCSR_SUPPORT_WEXT -DREMOTE_SYS_SAP -DREMOTE_MGT_SAP -DCSR_WIFI_SECURITY_WAPI_ENABLE -DCSR_WIFI_SECURITY_WAPI_QOSCTRL_MIC_WORKAROUND -DENABLE_SHUTDOWN -DCSR_WIFI_NME_ENABLE -DCSR_WIFI_AP_ENABLE -DCSR_SUPPORT_WEXT_AP -DCSR_WIFI_REQUEUE_PACKET_TO_HAL
-
-obj-$(CONFIG_CSR_WIFI) += csr_wifi.o
-obj-$(CONFIG_CSR_WIFI) += csr_helper.o
-
-csr_wifi-y := bh.o \
- data_tx.o \
- drv.o \
- firmware.o \
- inet.o \
- init_hw.o \
- io.o \
- monitor.o \
- netdev.o \
- os.o \
- putest.o \
- sdio_events.o \
- sdio_mmc.o \
- sdio_stubs.o \
- sme_blocking.o \
- ul_int.o \
- unifi_dbg.o \
- unifi_event.o \
- unifi_pdu_processing.o \
- unifi_sme.o \
- csr_wifi_hip_card_sdio.o \
- csr_wifi_hip_card_sdio_intr.o \
- csr_wifi_hip_card_sdio_mem.o \
- csr_wifi_hip_chiphelper.o \
- csr_wifi_hip_download.o \
- csr_wifi_hip_dump.o \
- csr_wifi_hip_packing.o \
- csr_wifi_hip_send.o \
- csr_wifi_hip_signals.o \
- csr_wifi_hip_ta_sampling.o \
- csr_wifi_hip_udi.o \
- csr_wifi_hip_unifi_signal_names.o \
- csr_wifi_hip_xbv.o \
- csr_wifi_nme_ap_converter_init.o \
- csr_wifi_nme_ap_free_downstream_contents.o \
- csr_wifi_nme_ap_free_upstream_contents.o \
- csr_wifi_nme_ap_serialize.o \
- csr_wifi_nme_ap_sef.o \
- csr_wifi_router_ctrl_sef.o \
- csr_wifi_router_sef.o \
- csr_wifi_router_transport.o \
- csr_wifi_sme_sef.o \
- csr_wifi_sme_converter_init.o \
- csr_wifi_sme_free_downstream_contents.o \
- csr_wifi_sme_free_upstream_contents.o \
- csr_wifi_sme_serialize.o \
- csr_wifi_router_ctrl_converter_init.o \
- csr_wifi_router_ctrl_free_downstream_contents.o \
- csr_wifi_router_ctrl_free_upstream_contents.o \
- csr_wifi_router_ctrl_serialize.o \
- csr_wifi_router_converter_init.o \
- csr_wifi_router_free_downstream_contents.o \
- csr_wifi_router_free_upstream_contents.o \
- csr_wifi_router_serialize.o \
- sme_mgt.o \
- sme_sys.o \
- sme_userspace.o \
- sme_wext.o \
- wext_events.o
-
-csr_helper-y := csr_time.o \
- csr_util.o \
- csr_framework_ext.o \
- csr_wifi_serialize_primitive_types.o \
- csr_serialize_primitive_types.o \
- csr_msgconv.o
diff --git a/drivers/staging/csr/bh.c b/drivers/staging/csr/bh.c
deleted file mode 100644
index d795852ccb1c..000000000000
--- a/drivers/staging/csr/bh.c
+++ /dev/null
@@ -1,404 +0,0 @@
-/*
- * ---------------------------------------------------------------------------
- * FILE: bh.c
- *
- * PURPOSE:
- * Provides an implementation for the driver bottom-half.
- * It is part of the porting exercise in Linux.
- *
- * Copyright (C) 2005-2009 by Cambridge Silicon Radio Ltd.
- *
- * Refer to LICENSE.txt included with this source code for details on
- * the license terms.
- *
- * ---------------------------------------------------------------------------
- */
-#include "csr_wifi_hip_unifi.h"
-#include "unifi_priv.h"
-#include <linux/sched/rt.h>
-
-/*
- * ---------------------------------------------------------------------------
- * uf_start_thread
- *
- * Helper function to start a new thread.
- *
- * Arguments:
- * priv Pointer to OS driver structure for the device.
- * thread Pointer to the thread object
- * func The thread function
- *
- * Returns:
- * 0 on success or else a Linux error code.
- * ---------------------------------------------------------------------------
- */
-int uf_start_thread(unifi_priv_t *priv,
- struct uf_thread *thread, int (*func)(void *))
-{
- if (thread->thread_task != NULL) {
- unifi_error(priv, "%s thread already started\n", thread->name);
- return 0;
- }
-
- /* Start the kernel thread that handles all h/w accesses. */
- thread->thread_task = kthread_run(func, priv, "%s", thread->name);
- if (IS_ERR(thread->thread_task))
- return PTR_ERR(thread->thread_task);
-
- /* Module parameter overides the thread priority */
- if (bh_priority != -1) {
- if (bh_priority >= 0 && bh_priority <= MAX_RT_PRIO) {
- struct sched_param param;
- priv->bh_thread.prio = bh_priority;
- unifi_trace(priv, UDBG1,
- "%s thread (RT) priority = %d\n",
- thread->name, bh_priority);
- param.sched_priority = bh_priority;
- sched_setscheduler(thread->thread_task,
- SCHED_FIFO, &param);
- } else if (bh_priority > MAX_RT_PRIO &&
- bh_priority <= MAX_PRIO) {
- priv->bh_thread.prio = bh_priority;
- unifi_trace(priv, UDBG1, "%s thread priority = %d\n",
- thread->name,
- PRIO_TO_NICE(bh_priority));
- set_user_nice(thread->thread_task,
- PRIO_TO_NICE(bh_priority));
- } else {
- priv->bh_thread.prio = DEFAULT_PRIO;
- unifi_warning(priv,
- "%s thread unsupported (%d) priority\n",
- thread->name, bh_priority);
- }
- } else
- priv->bh_thread.prio = DEFAULT_PRIO;
- unifi_trace(priv, UDBG2, "Started %s thread\n", thread->name);
-
- return 0;
-} /* uf_start_thread() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * uf_stop_thread
- *
- * Helper function to stop a thread.
- *
- * Arguments:
- * priv Pointer to OS driver structure for the device.
- * thread Pointer to the thread object
- *
- * Returns:
- *
- * ---------------------------------------------------------------------------
- */
-void uf_stop_thread(unifi_priv_t *priv, struct uf_thread *thread)
-{
- if (!thread->thread_task) {
- unifi_notice(priv, "%s thread is already stopped\n",
- thread->name);
- return;
- }
-
- unifi_trace(priv, UDBG2, "Stopping %s thread\n", thread->name);
-
- kthread_stop(thread->thread_task);
- thread->thread_task = NULL;
-
-} /* uf_stop_thread() */
-
-
-
-/*
- * ---------------------------------------------------------------------------
- * uf_wait_for_thread_to_stop
- *
- * Helper function to wait until a thread is stopped.
- *
- * Arguments:
- * priv Pointer to OS driver structure for the device.
- *
- * Returns:
- *
- * ---------------------------------------------------------------------------
- */
-void
-uf_wait_for_thread_to_stop(unifi_priv_t *priv, struct uf_thread *thread)
-{
- /*
- * kthread_stop() cannot handle the thread exiting while
- * kthread_should_stop() is false, so sleep until kthread_stop()
- * wakes us up
- */
- unifi_trace(priv, UDBG2, "%s waiting for the stop signal.\n",
- thread->name);
- set_current_state(TASK_INTERRUPTIBLE);
- if (!kthread_should_stop()) {
- unifi_trace(priv, UDBG2, "%s schedule....\n", thread->name);
- schedule();
- }
-
- thread->thread_task = NULL;
- unifi_trace(priv, UDBG2, "%s exiting....\n", thread->name);
-} /* uf_wait_for_thread_to_stop() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * handle_bh_error
- *
- * This function reports an error returned from the HIP core bottom-half.
- * Normally, implemented during the porting exercise, passing the error
- * to the SME using unifi_sys_wifi_off_ind().
- * The SME will try to reset the device and go through
- * the initialisation of the UniFi.
- *
- * Arguments:
- * priv Pointer to OS driver structure for the device.
- *
- * Returns:
- * None.
- * ---------------------------------------------------------------------------
- */
-static void
-handle_bh_error(unifi_priv_t *priv)
-{
- netInterface_priv_t *interfacePriv;
- u8 conf_param = CONFIG_IND_ERROR;
- u8 interfaceTag;
-
-
- /* Block unifi_run_bh() until the error has been handled. */
- priv->bh_thread.block_thread = 1;
-
- /* Consider UniFi to be uninitialised */
- priv->init_progress = UNIFI_INIT_NONE;
-
- /* Stop the network traffic */
- for (interfaceTag = 0;
- interfaceTag < CSR_WIFI_NUM_INTERFACES; interfaceTag++) {
- interfacePriv = priv->interfacePriv[interfaceTag];
- if (interfacePriv->netdev_registered)
- netif_carrier_off(priv->netdev[interfaceTag]);
- }
-
-#ifdef CSR_NATIVE_LINUX
- /* Force any client waiting on an mlme_wait_for_reply() to abort. */
- uf_abort_mlme(priv);
-
- /* Cancel any pending workqueue tasks */
- flush_workqueue(priv->unifi_workqueue);
-
-#endif /* CSR_NATIVE_LINUX */
-
- unifi_error(priv,
- "handle_bh_error: fatal error is reported to the SME.\n");
- /* Notify the clients (SME or unifi_manager) for the error. */
- ul_log_config_ind(priv, &conf_param, sizeof(u8));
-
-} /* handle_bh_error() */
-
-
-
-/*
- * ---------------------------------------------------------------------------
- * bh_thread_function
- *
- * All hardware access happens in this thread.
- * This means there is no need for locks on the hardware and we don't need
- * to worry about reentrancy with the SDIO library.
- * Provides and example implementation on how to call unifi_bh(), which
- * is part of the HIP core API.
- *
- * It processes the events generated by unifi_run_bh() to serialise calls
- * to unifi_bh(). It also demonstrates how the timeout parameter passed in
- * and returned from unifi_bh() needs to be handled.
- *
- * Arguments:
- * arg Pointer to OS driver structure for the device.
- *
- * Returns:
- * None.
- *
- * Notes:
- * When the bottom half of the driver needs to process signals, events,
- * or simply the host status (i.e sleep mode), it invokes unifi_run_bh().
- * Since we need all SDIO transaction to be in a single thread, the
- * unifi_run_bh() will wake up this thread to process it.
- *
- * ---------------------------------------------------------------------------
- */
-static int bh_thread_function(void *arg)
-{
- unifi_priv_t *priv = (unifi_priv_t *)arg;
- CsrResult csrResult;
- long ret;
- u32 timeout, t;
- struct uf_thread *this_thread;
-
- unifi_trace(priv, UDBG2, "bh_thread_function starting\n");
-
- this_thread = &priv->bh_thread;
-
- t = timeout = 0;
- while (!kthread_should_stop()) {
- /*
- * wait until an error occurs,
- * or we need to process something.
- */
- unifi_trace(priv, UDBG3, "bh_thread goes to sleep.\n");
-
- if (timeout > 0) {
- /* Convert t in ms to jiffies */
- t = msecs_to_jiffies(timeout);
- ret = wait_event_interruptible_timeout(
- this_thread->wakeup_q,
- (this_thread->wakeup_flag && !this_thread->block_thread) ||
- kthread_should_stop(),
- t);
- timeout = (ret > 0) ? jiffies_to_msecs(ret) : 0;
- } else {
- ret = wait_event_interruptible(this_thread->wakeup_q,
- (this_thread->wakeup_flag && !this_thread->block_thread) ||
- kthread_should_stop());
- }
-
- if (kthread_should_stop()) {
- unifi_trace(priv, UDBG2,
- "bh_thread: signalled to exit\n");
- break;
- }
-
- if (ret < 0) {
- unifi_notice(priv,
- "bh_thread: wait_event returned %d, thread will exit\n",
- ret);
- uf_wait_for_thread_to_stop(priv, this_thread);
- break;
- }
-
- this_thread->wakeup_flag = 0;
-
- unifi_trace(priv, UDBG3, "bh_thread calls unifi_bh().\n");
-
- CsrSdioClaim(priv->sdio);
- csrResult = unifi_bh(priv->card, &timeout);
- if (csrResult != CSR_RESULT_SUCCESS) {
- if (csrResult == CSR_WIFI_HIP_RESULT_NO_DEVICE) {
- CsrSdioRelease(priv->sdio);
- uf_wait_for_thread_to_stop(priv, this_thread);
- break;
- }
- /* Errors must be delivered to the error task */
- handle_bh_error(priv);
- }
- CsrSdioRelease(priv->sdio);
- }
-
- /*
- * I would normally try to call csr_sdio_remove_irq() here to make sure
- * that we do not get any interrupts while this thread is not running.
- * However, the MMC/SDIO driver tries to kill its' interrupt thread.
- * The kernel threads implementation does not allow to kill threads
- * from a signalled to stop thread.
- * So, instead call csr_sdio_linux_remove_irq() always after calling
- * uf_stop_thread() to kill this thread.
- */
-
- unifi_trace(priv, UDBG2, "bh_thread exiting....\n");
- return 0;
-} /* bh_thread_function() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * uf_init_bh
- *
- * Helper function to start the bottom half of the driver.
- * All we need to do here is start the I/O bh thread.
- *
- * Arguments:
- * priv Pointer to OS driver structure for the device.
- *
- * Returns:
- * 0 on success or else a Linux error code.
- * ---------------------------------------------------------------------------
- */
-int
-uf_init_bh(unifi_priv_t *priv)
-{
- int r;
-
- /* Enable mlme interface. */
- priv->io_aborted = 0;
-
-
- /* Start the BH thread */
- r = uf_start_thread(priv, &priv->bh_thread, bh_thread_function);
- if (r) {
- unifi_error(priv,
- "uf_init_bh: failed to start the BH thread.\n");
- return r;
- }
-
- /* Allow interrupts */
- r = csr_sdio_linux_install_irq(priv->sdio);
- if (r) {
- unifi_error(priv,
- "uf_init_bh: failed to install the IRQ.\n");
-
- uf_stop_thread(priv, &priv->bh_thread);
- }
-
- return r;
-} /* uf_init_bh() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_run_bh
- *
- * Part of the HIP core lib API, implemented in the porting exercise.
- * The bottom half of the driver calls this function when
- * it wants to process anything that requires access to unifi.
- * We need to call unifi_bh() which in this implementation is done
- * by waking up the I/O thread.
- *
- * Arguments:
- * ospriv Pointer to OS driver structure for the device.
- *
- * Returns:
- * 0 on success or else a Linux error code.
- *
- * Notes:
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_run_bh(void *ospriv)
-{
- unifi_priv_t *priv = ospriv;
-
- /*
- * If an error has occurred, we discard silently all messages from the bh
- * until the error has been processed and the unifi has been
- * reinitialised.
- */
- if (priv->bh_thread.block_thread == 1) {
- unifi_trace(priv, UDBG3, "unifi_run_bh: discard message.\n");
- /*
- * Do not try to acknowledge a pending interrupt here.
- * This function is called by unifi_send_signal()
- * which in turn can be running in an atomic or 'disabled irq'
- * level if a signal is sent from a workqueue task
- * (i.e multicass addresses set). We can not hold the SDIO lock
- * because it might sleep.
- */
- return CSR_RESULT_FAILURE;
- }
-
- priv->bh_thread.wakeup_flag = 1;
- /* wake up I/O thread */
- wake_up_interruptible(&priv->bh_thread.wakeup_q);
-
- return CSR_RESULT_SUCCESS;
-} /* unifi_run_bh() */
-
diff --git a/drivers/staging/csr/csr_framework_ext.c b/drivers/staging/csr/csr_framework_ext.c
deleted file mode 100644
index 98122bce1427..000000000000
--- a/drivers/staging/csr/csr_framework_ext.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2010
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#include <linux/kernel.h>
-#include <linux/kthread.h>
-#include <linux/module.h>
-#include <linux/freezer.h>
-#include <linux/semaphore.h>
-#include <linux/slab.h>
-#include <linux/bitops.h>
-
-#include "csr_framework_ext.h"
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrThreadSleep
- *
- * DESCRIPTION
- * Sleep for a given period.
- *
- * RETURNS
- * void
- *
- *----------------------------------------------------------------------------*/
-void CsrThreadSleep(u16 sleepTimeInMs)
-{
- unsigned long t;
-
- /* Convert t in ms to jiffies and round up */
- t = ((sleepTimeInMs * HZ) + 999) / 1000;
- schedule_timeout_uninterruptible(t);
-}
-EXPORT_SYMBOL_GPL(CsrThreadSleep);
diff --git a/drivers/staging/csr/csr_framework_ext.h b/drivers/staging/csr/csr_framework_ext.h
deleted file mode 100644
index 6d26ac6173b0..000000000000
--- a/drivers/staging/csr/csr_framework_ext.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef CSR_FRAMEWORK_EXT_H__
-#define CSR_FRAMEWORK_EXT_H__
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2010
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#include "csr_result.h"
-#include "csr_framework_ext_types.h"
-
-/* Result codes */
-#define CSR_FE_RESULT_NO_MORE_EVENTS ((CsrResult) 0x0001)
-#define CSR_FE_RESULT_INVALID_POINTER ((CsrResult) 0x0002)
-#define CSR_FE_RESULT_INVALID_HANDLE ((CsrResult) 0x0003)
-#define CSR_FE_RESULT_NO_MORE_MUTEXES ((CsrResult) 0x0004)
-#define CSR_FE_RESULT_TIMEOUT ((CsrResult) 0x0005)
-#define CSR_FE_RESULT_NO_MORE_THREADS ((CsrResult) 0x0006)
-
-/* Thread priorities */
-#define CSR_THREAD_PRIORITY_HIGHEST ((u16) 0)
-#define CSR_THREAD_PRIORITY_HIGH ((u16) 1)
-#define CSR_THREAD_PRIORITY_NORMAL ((u16) 2)
-#define CSR_THREAD_PRIORITY_LOW ((u16) 3)
-#define CSR_THREAD_PRIORITY_LOWEST ((u16) 4)
-
-#define CSR_EVENT_WAIT_INFINITE ((u16) 0xFFFF)
-
-void CsrThreadSleep(u16 sleepTimeInMs);
-
-#endif
diff --git a/drivers/staging/csr/csr_framework_ext_types.h b/drivers/staging/csr/csr_framework_ext_types.h
deleted file mode 100644
index 575598cf69b2..000000000000
--- a/drivers/staging/csr/csr_framework_ext_types.h
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifndef CSR_FRAMEWORK_EXT_TYPES_H__
-#define CSR_FRAMEWORK_EXT_TYPES_H__
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2010
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#ifdef __KERNEL__
-#include <linux/kthread.h>
-#include <linux/semaphore.h>
-#else
-#include <pthread.h>
-#endif
-
-#ifdef __KERNEL__
-
-typedef struct semaphore CsrMutexHandle;
-
-#else /* __KERNEL __ */
-
-typedef pthread_mutex_t CsrMutexHandle;
-
-#endif /* __KERNEL__ */
-
-#endif
diff --git a/drivers/staging/csr/csr_log.h b/drivers/staging/csr/csr_log.h
deleted file mode 100644
index 982941043ddc..000000000000
--- a/drivers/staging/csr/csr_log.h
+++ /dev/null
@@ -1,223 +0,0 @@
-#ifndef CSR_LOG_H__
-#define CSR_LOG_H__
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2010
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#include "csr_sched.h"
-#include "csr_prim_defs.h"
-#include "csr_msgconv.h"
-
-/*
- * Log filtering
- */
-
-/*----------------------------------------------------*/
-/* Filtering on environment specific log levels */
-/*----------------------------------------------------*/
-typedef u32 CsrLogLevelEnvironment;
-#define CSR_LOG_LEVEL_ENVIRONMENT_OFF ((CsrLogLevelEnvironment) 0x00000000) /* No environment data/events are logged */
-#define CSR_LOG_LEVEL_ENVIRONMENT_BCI_ACL ((CsrLogLevelEnvironment) 0x00000001) /* BlueCore Channel Interface HCI Acl data are logged */
-#define CSR_LOG_LEVEL_ENVIRONMENT_BCI_HCI ((CsrLogLevelEnvironment) 0x00000002) /* BlueCore Channel Interface HCI Cmd/Evt data are logged */
-#define CSR_LOG_LEVEL_ENVIRONMENT_BCI_SCO ((CsrLogLevelEnvironment) 0x00000004) /* BlueCore Channel Interface HCI Sco data are logged */
-#define CSR_LOG_LEVEL_ENVIRONMENT_BCI_VENDOR ((CsrLogLevelEnvironment) 0x00000008) /* BlueCore Channel Interface HCI Vendor specific data are logged (This includes BCCMD, HQ, VM etc) */
-#define CSR_LOG_LEVEL_ENVIRONMENT_TRANSPORTS ((CsrLogLevelEnvironment) 0x00000010) /* Transport protocol data is logged (This includes transport protocols like BCSP, H4 etc.) */
-#define CSR_LOG_LEVEL_ENVIRONMENT_BGINT_REG ((CsrLogLevelEnvironment) 0x00000020) /* Background Interrupt registration events are logged */
-#define CSR_LOG_LEVEL_ENVIRONMENT_BGINT_UNREG ((CsrLogLevelEnvironment) 0x00000040) /* Background Interrupt unregistration events are logged */
-#define CSR_LOG_LEVEL_ENVIRONMENT_BGINT_SET ((CsrLogLevelEnvironment) 0x00000080) /* Background Interrupt set events are logged */
-#define CSR_LOG_LEVEL_ENVIRONMENT_BGINT_START ((CsrLogLevelEnvironment) 0x00000100) /* Background Interrupt start events are logged */
-#define CSR_LOG_LEVEL_ENVIRONMENT_BGINT_DONE ((CsrLogLevelEnvironment) 0x00000200) /* Background Interrupt done events are logged */
-#define CSR_LOG_LEVEL_ENVIRONMENT_PROTO ((CsrLogLevelEnvironment) 0x00000400) /* Transport protocol events are logged */
-#define CSR_LOG_LEVEL_ENVIRONMENT_PROTO_LOC ((CsrLogLevelEnvironment) 0x00000800) /* The Location where the transport protocol event occurred are logged NB: This is a supplement to CSR_LOG_LEVEL_ENVIRONMENT_PROTO, it has no effect without it */
-/* The bit masks between here are reserved for future usage */
-#define CSR_LOG_LEVEL_ENVIRONMENT_ALL ((CsrLogLevelEnvironment) 0xFFFFFFFF) /* All possible environment data/events are logged WARNING: By using this define the application also accepts future possible environment data/events in the logs */
-
-/*----------------------------------------------------*/
-/* Filtering on task specific log levels */
-/*----------------------------------------------------*/
-typedef u32 CsrLogLevelTask;
-#define CSR_LOG_LEVEL_TASK_OFF ((CsrLogLevelTask) 0x00000000) /* No events are logged for this task */
-#define CSR_LOG_LEVEL_TASK_TEXT ((CsrLogLevelTask) 0x00000001) /* Text strings printed by a task are logged NB: This bit does not affect the CSR_LOG_TEXT_LEVEL interface. This has to be configured separately */
-#define CSR_LOG_LEVEL_TASK_TEXT_LOC ((CsrLogLevelTask) 0x00000002) /* The locaction where the text string call occurred are logged. NB: This is a supplement to CSR_LOG_LEVEL_TASK_TEXT, it has no effect without it */
-#define CSR_LOG_LEVEL_TASK_STATE ((CsrLogLevelTask) 0x00000004) /* FSM state transitions in a task are logged */
-#define CSR_LOG_LEVEL_TASK_STATE_NAME ((CsrLogLevelTask) 0x00000008) /* The name of each state in a FSM state transition are logged. NB: This is a supplement to CSR_LOG_LEVEL_TASK_STATE, it has no effect without it */
-#define CSR_LOG_LEVEL_TASK_STATE_LOC ((CsrLogLevelTask) 0x00000010) /* The location where the FSM state transition occurred are logged. NB: This is a supplement to CSR_LOG_LEVEL_TASK_STATE, it has no effect without it */
-#define CSR_LOG_LEVEL_TASK_TASK_SWITCH ((CsrLogLevelTask) 0x00000020) /* Activation and deactiation of a task are logged */
-#define CSR_LOG_LEVEL_TASK_MESSAGE_PUT ((CsrLogLevelTask) 0x00000080) /* Message put operations are logged */
-#define CSR_LOG_LEVEL_TASK_MESSAGE_PUT_LOC ((CsrLogLevelTask) 0x00000100) /* The location where a message was sent are logged. NB: This is a supplement to CSR_LOG_LEVEL_TASK_MESSAGE_PUT, it has no effect without it */
-#define CSR_LOG_LEVEL_TASK_MESSAGE_GET ((CsrLogLevelTask) 0x00000200) /* Message get operations are logged */
-#define CSR_LOG_LEVEL_TASK_MESSAGE_QUEUE_PUSH ((CsrLogLevelTask) 0x00000400) /* Message push operations are logged */
-#define CSR_LOG_LEVEL_TASK_MESSAGE_QUEUE_POP ((CsrLogLevelTask) 0x00000800) /* Message pop operations are logged */
-#define CSR_LOG_LEVEL_TASK_PRIM_ONLY_TYPE ((CsrLogLevelTask) 0x00001000) /* Only the type of primitives in messages are logged. By default the entire primitive is serialized and logged */
-#define CSR_LOG_LEVEL_TASK_PRIM_APPLY_LIMIT ((CsrLogLevelTask) 0x00002000) /* An upper limit (defined by CSR_LOG_PRIM_SIZE_UPPER_LIMIT) is applied to how much of a primitive in a message are logged. NB: This limit is only applied if CSR_LOG_LEVEL_TASK_PRIM_ONLY_TYPE is _not_ defined */
-#define CSR_LOG_LEVEL_TASK_TIMER_IN ((CsrLogLevelTask) 0x00004000) /* TimedEventIn events are logged */
-#define CSR_LOG_LEVEL_TASK_TIMER_IN_LOC ((CsrLogLevelTask) 0x00008000) /* The location where a timer was started are logged. NB: This is a supplement to CSR_LOG_LEVEL_TASK_TIMER_IN, it has no effect without it */
-#define CSR_LOG_LEVEL_TASK_TIMER_CANCEL ((CsrLogLevelTask) 0x00010000) /* TimedEventCancel events are logged */
-#define CSR_LOG_LEVEL_TASK_TIMER_CANCEL_LOC ((CsrLogLevelTask) 0x00020000) /* The location where a timer was cancelled are logged. NB: This is a supplement to CSR_LOG_LEVEL_TASK_TIMER_CANCEL, it has no effect without it */
-#define CSR_LOG_LEVEL_TASK_TIMER_FIRE ((CsrLogLevelTask) 0x00040000) /* TimedEventFire events are logged */
-#define CSR_LOG_LEVEL_TASK_TIMER_DONE ((CsrLogLevelTask) 0x00080000) /* TimedEventDone events are logged */
-/* The bit masks between here are reserved for future usage */
-#define CSR_LOG_LEVEL_TASK_ALL ((CsrLogLevelTask) 0xFFFFFFFF & ~(CSR_LOG_LEVEL_TASK_PRIM_ONLY_TYPE | CSR_LOG_LEVEL_TASK_PRIM_APPLY_LIMIT)) /* All info possible to log for a task are logged. WARNING: By using this define the application also accepts future possible task data/events in the logs */
-
-u8 CsrLogEnvironmentIsFiltered(CsrLogLevelEnvironment level);
-CsrLogLevelTask CsrLogTaskFilterGet(CsrSchedQid taskId);
-u8 CsrLogTaskIsFiltered(CsrSchedQid taskId, CsrLogLevelTask level);
-
-/*
- * Logging stuff
- */
-#define CSR_LOG_STRINGIFY_REAL(a) (#a)
-#define CSR_LOG_STRINGIFY(a) CSR_LOG_STRINGIFY_REAL(a)
-
-typedef struct {
- u16 primitiveType;
- const char *primitiveName;
- CsrMsgConvMsgEntry *messageConv; /* Private - do not use */
-} CsrLogPrimitiveInformation;
-
-typedef struct {
- const char *techVer;
- u32 primitiveInfoCount;
- CsrLogPrimitiveInformation *primitiveInfo;
-} CsrLogTechInformation;
-
-/*---------------------------------*/
-/* Tech logging */
-/*---------------------------------*/
-typedef u8 bitmask8_t;
-typedef u16 bitmask16_t;
-typedef u32 bitmask32_t;
-
-#ifdef CSR_LOG_ENABLE
-#ifdef CSR_LOG_INCLUDE_FILE_NAME_AND_LINE_NUMBER
-/* DEPRECATED - replaced by csr_log_text.h */
-#define CSR_LOG_TEXT(text) \
- do { \
- if (!CsrLogTaskIsFiltered(CsrSchedTaskQueueGet(), CSR_LOG_LEVEL_TASK_TEXT)) { \
- CsrLogTaskText(text, __LINE__, __FILE__); \
- } \
- } while (0)
-#else
-/* DEPRECATED - replaced by csr_log_text.h */
-#define CSR_LOG_TEXT(text) \
- do { \
- if (!CsrLogTaskIsFiltered(CsrSchedTaskQueueGet(), CSR_LOG_LEVEL_TASK_TEXT)) { \
- CsrLogTaskText(text, 0, NULL); \
- } \
- } while (0)
-#endif
-#else
-#define CSR_LOG_TEXT(text)
-#endif
-
-/* DEPRECATED - replaced by csr_log_text.h */
-void CsrLogTaskText(const char *text,
- u32 line,
- const char *file);
-
-#define CSR_LOG_STATE_TRANSITION_MASK_FSM_NAME (0x001)
-#define CSR_LOG_STATE_TRANSITION_MASK_NEXT_STATE (0x002)
-#define CSR_LOG_STATE_TRANSITION_MASK_NEXT_STATE_STR (0x004)
-#define CSR_LOG_STATE_TRANSITION_MASK_PREV_STATE (0x008)
-#define CSR_LOG_STATE_TRANSITION_MASK_PREV_STATE_STR (0x010)
-#define CSR_LOG_STATE_TRANSITION_MASK_EVENT (0x020)
-#define CSR_LOG_STATE_TRANSITION_MASK_EVENT_STR (0x040)
-
-/* DEPRECATED - replaced by csr_log_text.h */
-void CsrLogStateTransition(bitmask16_t mask,
- u32 identifier,
- const char *fsm_name,
- u32 prev_state,
- const char *prev_state_str,
- u32 in_event,
- const char *in_event_str,
- u32 next_state,
- const char *next_state_str,
- u32 line,
- const char *file);
-
-/*---------------------------------*/
-/* BSP logging */
-/*---------------------------------*/
-void CsrLogSchedInit(u8 thread_id);
-void CsrLogSchedDeinit(u8 thread_id);
-
-void CsrLogSchedStart(u8 thread_id);
-void CsrLogSchedStop(u8 thread_id);
-
-void CsrLogInitTask(u8 thread_id, CsrSchedQid tskid, const char *tskName);
-void CsrLogDeinitTask(u16 task_id);
-
-void CsrLogActivate(CsrSchedQid tskid);
-void CsrLogDeactivate(CsrSchedQid tskid);
-
-#define SYNERGY_SERIALIZER_TYPE_DUMP (0x000)
-#define SYNERGY_SERIALIZER_TYPE_SER (0x001)
-
-void CsrLogMessagePut(u32 line,
- const char *file,
- CsrSchedQid src_task_id,
- CsrSchedQid dst_taskid,
- CsrSchedMsgId msg_id,
- u16 prim_type,
- const void *msg);
-
-void CsrLogMessageGet(CsrSchedQid src_task_id,
- CsrSchedQid dst_taskid,
- u8 get_res,
- CsrSchedMsgId msg_id,
- u16 prim_type,
- const void *msg);
-
-void CsrLogTimedEventIn(u32 line,
- const char *file,
- CsrSchedQid task_id,
- CsrSchedTid tid,
- u32 requested_delay,
- u16 fniarg,
- const void *fnvarg);
-
-void CsrLogTimedEventFire(CsrSchedQid task_id,
- CsrSchedTid tid);
-
-void CsrLogTimedEventDone(CsrSchedQid task_id,
- CsrSchedTid tid);
-
-void CsrLogTimedEventCancel(u32 line,
- const char *file,
- CsrSchedQid task_id,
- CsrSchedTid tid,
- u8 cancel_res);
-
-void CsrLogBgintRegister(u8 thread_id,
- CsrSchedBgint irq,
- const char *callback,
- const void *ptr);
-void CsrLogBgintUnregister(CsrSchedBgint irq);
-void CsrLogBgintSet(CsrSchedBgint irq);
-void CsrLogBgintServiceStart(CsrSchedBgint irq);
-void CsrLogBgintServiceDone(CsrSchedBgint irq);
-
-void CsrLogExceptionStateEvent(u16 prim_type,
- CsrPrim msg_type,
- u16 state,
- u32 line,
- const char *file);
-void CsrLogExceptionGeneral(u16 prim_type,
- u16 state,
- const char *text,
- u32 line,
- const char *file);
-void CsrLogExceptionWarning(u16 prim_type,
- u16 state,
- const char *text,
- u32 line,
- const char *file);
-
-#endif
diff --git a/drivers/staging/csr/csr_log_configure.h b/drivers/staging/csr/csr_log_configure.h
deleted file mode 100644
index 283647cf9702..000000000000
--- a/drivers/staging/csr/csr_log_configure.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef CSR_LOG_CONFIGURE_H__
-#define CSR_LOG_CONFIGURE_H__
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2010
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
- *****************************************************************************/
-
-#include "csr_log.h"
-
-/*--------------------------------------------*/
-/* Filtering on log text warning levels */
-/*--------------------------------------------*/
-typedef u32 CsrLogLevelText;
-#define CSR_LOG_LEVEL_TEXT_OFF ((CsrLogLevelText) 0x0000)
-
-#define CSR_LOG_LEVEL_TEXT_CRITICAL ((CsrLogLevelText) 0x0001)
-#define CSR_LOG_LEVEL_TEXT_ERROR ((CsrLogLevelText) 0x0002)
-#define CSR_LOG_LEVEL_TEXT_WARNING ((CsrLogLevelText) 0x0004)
-#define CSR_LOG_LEVEL_TEXT_INFO ((CsrLogLevelText) 0x0008)
-#define CSR_LOG_LEVEL_TEXT_DEBUG ((CsrLogLevelText) 0x0010)
-
-#define CSR_LOG_LEVEL_TEXT_ALL ((CsrLogLevelText) 0xFFFF)
-
-/* The log text interface is used by both scheduler tasks and components outside the scheduler context.
- * Therefore a CsrLogTextTaskId is introduced. It is effectively considered as two u16's. The lower
- * 16 bits corresponds one2one with the scheduler queueId's (CsrSchedQid) and as such these bits can not be used
- * by components outside scheduler tasks. The upper 16 bits are allocated for use of components outside the
- * scheduler like drivers etc. Components in this range is defined independently by each technology. To avoid
- * clashes the technologies are only allowed to assign values within the same restrictive range as allies to
- * primitive identifiers. eg. for the framework components outside the scheduler is only allowed to assign
- * taskId's in the range 0x0600xxxx to 0x06FFxxxx. And so on for other technologies. */
-typedef u32 CsrLogTextTaskId;
-
-#endif
diff --git a/drivers/staging/csr/csr_log_text.h b/drivers/staging/csr/csr_log_text.h
deleted file mode 100644
index cfcf64aa6225..000000000000
--- a/drivers/staging/csr/csr_log_text.h
+++ /dev/null
@@ -1,124 +0,0 @@
-#ifndef CSR_LOG_TEXT_H__
-#define CSR_LOG_TEXT_H__
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2010
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#include "csr_log_configure.h"
-
-typedef struct CsrLogSubOrigin
-{
- u16 subOriginNumber; /* Id of the given SubOrigin */
- const char *subOriginName; /* Prefix Text for this SubOrigin */
-} CsrLogSubOrigin;
-
-/* Register a task which is going to use the CSR_LOG_TEXT_XXX interface */
-#ifdef CSR_LOG_ENABLE
-void CsrLogTextRegister(CsrLogTextTaskId taskId, const char *taskName, u16 subOriginsLength, const CsrLogSubOrigin *subOrigins);
-#else
-#define CsrLogTextRegister(taskId, taskName, subOriginsLength, subOrigins)
-#endif
-
-/* CRITICAL: Conditions that are threatening to the integrity/stability of the
- system as a whole. */
-#if defined(CSR_LOG_ENABLE) && !defined(CSR_LOG_LEVEL_TEXT_CRITICAL_DISABLE)
-void CsrLogTextCritical(CsrLogTextTaskId taskId, u16 subOrigin, const char *formatString, ...);
-void CsrLogTextBufferCritical(CsrLogTextTaskId taskId, u16 subOrigin, size_t bufferLength, const void *buffer, const char *formatString, ...);
-#define CSR_LOG_TEXT_CRITICAL(taskId_subOrigin_formatString_varargs) CsrLogTextCritical taskId_subOrigin_formatString_varargs
-#define CSR_LOG_TEXT_CONDITIONAL_CRITICAL(condition, logtextargs) {if (condition) {CSR_LOG_TEXT_CRITICAL(logtextargs);}}
-#define CSR_LOG_TEXT_BUFFER_CRITICAL(taskId_subOrigin_length_buffer_formatString_varargs) CsrLogTextBufferCritical taskId_subOrigin_length_buffer_formatString_varargs
-#define CSR_LOG_TEXT_BUFFER_CONDITIONAL_CRITICAL(condition, logtextbufferargs) {if (condition) {CSR_LOG_TEXT_BUFFER_CRITICAL(logtextbufferargs);}}
-#else
-#define CSR_LOG_TEXT_CRITICAL(taskId_subOrigin_formatString_varargs)
-#define CSR_LOG_TEXT_CONDITIONAL_CRITICAL(condition, logtextargs)
-#define CSR_LOG_TEXT_BUFFER_CRITICAL(taskId_subOrigin_length_buffer_formatString_varargs)
-#define CSR_LOG_TEXT_BUFFER_CONDITIONAL_CRITICAL(condition, logtextbufferargs)
-#endif
-
-/* ERROR: Malfunction of a component rendering it unable to operate correctly,
- causing lack of functionality but not loss of system integrity/stability. */
-#if defined(CSR_LOG_ENABLE) && !defined(CSR_LOG_LEVEL_TEXT_ERROR_DISABLE)
-void CsrLogTextError(CsrLogTextTaskId taskId, u16 subOrigin, const char *formatString, ...);
-void CsrLogTextBufferError(CsrLogTextTaskId taskId, u16 subOrigin, size_t bufferLength, const void *buffer, const char *formatString, ...);
-#define CSR_LOG_TEXT_ERROR(taskId_subOrigin_formatString_varargs) CsrLogTextError taskId_subOrigin_formatString_varargs
-#define CSR_LOG_TEXT_CONDITIONAL_ERROR(condition, logtextargs) {if (condition) {CSR_LOG_TEXT_ERROR(logtextargs);}}
-#define CSR_LOG_TEXT_BUFFER_ERROR(taskId_subOrigin_length_buffer_formatString_varargs) CsrLogTextBufferError taskId_subOrigin_length_buffer_formatString_varargs
-#define CSR_LOG_TEXT_BUFFER_CONDITIONAL_ERROR(condition, logtextbufferargs) {if (condition) {CSR_LOG_TEXT_BUFFER_ERROR(logtextbufferargs);}}
-#else
-#define CSR_LOG_TEXT_ERROR(taskId_subOrigin_formatString_varargs)
-#define CSR_LOG_TEXT_CONDITIONAL_ERROR(condition, logtextargs)
-#define CSR_LOG_TEXT_BUFFER_ERROR(taskId_subOrigin_length_buffer_formatString_varargs)
-#define CSR_LOG_TEXT_BUFFER_CONDITIONAL_ERROR(condition, logtextbufferargs)
-#endif
-
-/* WARNING: Conditions that are unexpected and indicative of possible problems
- or violations of specifications, where the result of such deviations does not
- lead to malfunction of the component. */
-#if defined(CSR_LOG_ENABLE) && !defined(CSR_LOG_LEVEL_TEXT_WARNING_DISABLE)
-void CsrLogTextWarning(CsrLogTextTaskId taskId, u16 subOrigin, const char *formatString, ...);
-void CsrLogTextBufferWarning(CsrLogTextTaskId taskId, u16 subOrigin, size_t bufferLength, const void *buffer, const char *formatString, ...);
-#define CSR_LOG_TEXT_WARNING(taskId_subOrigin_formatString_varargs) CsrLogTextWarning taskId_subOrigin_formatString_varargs
-#define CSR_LOG_TEXT_CONDITIONAL_WARNING(condition, logtextargs) {if (condition) {CSR_LOG_TEXT_WARNING(logtextargs);}}
-#define CSR_LOG_TEXT_BUFFER_WARNING(taskId_subOrigin_length_buffer_formatString_varargs) CsrLogTextBufferWarning taskId_subOrigin_length_buffer_formatString_varargs
-#define CSR_LOG_TEXT_BUFFER_CONDITIONAL_WARNING(condition, logtextbufferargs) {if (condition) {CSR_LOG_TEXT_BUFFER_WARNING(logtextbufferargs);}}
-#else
-#define CSR_LOG_TEXT_WARNING(taskId_subOrigin_formatString_varargs)
-#define CSR_LOG_TEXT_CONDITIONAL_WARNING(condition, logtextargs)
-#define CSR_LOG_TEXT_BUFFER_WARNING(taskId_subOrigin_length_buffer_formatString_varargs)
-#define CSR_LOG_TEXT_BUFFER_CONDITIONAL_WARNING(condition, logtextbufferargs)
-#endif
-
-/* INFO: Important events that may aid in determining the conditions under which
- the more severe conditions are encountered. */
-#if defined(CSR_LOG_ENABLE) && !defined(CSR_LOG_LEVEL_TEXT_INFO_DISABLE)
-void CsrLogTextInfo(CsrLogTextTaskId taskId, u16 subOrigin, const char *formatString, ...);
-void CsrLogTextBufferInfo(CsrLogTextTaskId taskId, u16 subOrigin, size_t bufferLength, const void *buffer, const char *formatString, ...);
-#define CSR_LOG_TEXT_INFO(taskId_subOrigin_formatString_varargs) CsrLogTextInfo taskId_subOrigin_formatString_varargs
-#define CSR_LOG_TEXT_CONDITIONAL_INFO(condition, logtextargs) {if (condition) {CSR_LOG_TEXT_INFO(logtextargs);}}
-#define CSR_LOG_TEXT_BUFFER_INFO(taskId_subOrigin_length_buffer_formatString_varargs) CsrLogTextBufferInfo taskId_subOrigin_length_buffer_formatString_varargs
-#define CSR_LOG_TEXT_BUFFER_CONDITIONAL_INFO(condition, logtextbufferargs) {if (condition) {CSR_LOG_TEXT_BUFFER_INFO(logtextbufferargs);}}
-#else
-#define CSR_LOG_TEXT_INFO(taskId_subOrigin_formatString_varargs)
-#define CSR_LOG_TEXT_CONDITIONAL_INFO(condition, logtextargs)
-#define CSR_LOG_TEXT_BUFFER_INFO(taskId_subOrigin_length_buffer_formatString_varargs)
-#define CSR_LOG_TEXT_BUFFER_CONDITIONAL_INFO(condition, logtextbufferargs)
-#endif
-
-/* DEBUG: Similar to INFO, but dedicated to events that occur more frequently. */
-#if defined(CSR_LOG_ENABLE) && !defined(CSR_LOG_LEVEL_TEXT_DEBUG_DISABLE)
-void CsrLogTextDebug(CsrLogTextTaskId taskId, u16 subOrigin, const char *formatString, ...);
-void CsrLogTextBufferDebug(CsrLogTextTaskId taskId, u16 subOrigin, size_t bufferLength, const void *buffer, const char *formatString, ...);
-#define CSR_LOG_TEXT_DEBUG(taskId_subOrigin_formatString_varargs) CsrLogTextDebug taskId_subOrigin_formatString_varargs
-#define CSR_LOG_TEXT_CONDITIONAL_DEBUG(condition, logtextargs) {if (condition) {CSR_LOG_TEXT_DEBUG(logtextargs);}}
-#define CSR_LOG_TEXT_BUFFER_DEBUG(taskId_subOrigin_length_buffer_formatString_varargs) CsrLogTextBufferDebug taskId_subOrigin_length_buffer_formatString_varargs
-#define CSR_LOG_TEXT_BUFFER_CONDITIONAL_DEBUG(condition, logtextbufferargs) {if (condition) {CSR_LOG_TEXT_BUFFER_DEBUG(logtextbufferargs);}}
-#else
-#define CSR_LOG_TEXT_DEBUG(taskId_subOrigin_formatString_varargs)
-#define CSR_LOG_TEXT_CONDITIONAL_DEBUG(condition, logtextargs)
-#define CSR_LOG_TEXT_BUFFER_DEBUG(taskId_subOrigin_length_buffer_formatString_varargs)
-#define CSR_LOG_TEXT_BUFFER_CONDITIONAL_DEBUG(condition, logtextbufferargs)
-#endif
-
-/* CSR_LOG_TEXT_ASSERT (CRITICAL) */
-#ifdef CSR_LOG_ENABLE
-#define CSR_LOG_TEXT_ASSERT(origin, suborigin, condition) \
- {if (!(condition)) {CSR_LOG_TEXT_CRITICAL((origin, suborigin, "Assertion \"%s\" failed at %s:%u", #condition, __FILE__, __LINE__));}}
-#else
-#define CSR_LOG_TEXT_ASSERT(origin, suborigin, condition)
-#endif
-
-/* CSR_LOG_TEXT_UNHANDLED_PRIM (CRITICAL) */
-#ifdef CSR_LOG_ENABLE
-#define CSR_LOG_TEXT_UNHANDLED_PRIMITIVE(origin, suborigin, primClass, primType) \
- CSR_LOG_TEXT_CRITICAL((origin, suborigin, "Unhandled primitive 0x%04X:0x%04X at %s:%u", primClass, primType, __FILE__, __LINE__))
-#else
-#define CSR_LOG_TEXT_UNHANDLED_PRIMITIVE(origin, suborigin, primClass, primType)
-#endif
-
-#endif
diff --git a/drivers/staging/csr/csr_macro.h b/drivers/staging/csr/csr_macro.h
deleted file mode 100644
index c47f1d91b6fa..000000000000
--- a/drivers/staging/csr/csr_macro.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef CSR_MACRO_H__
-#define CSR_MACRO_H__
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2010
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#include <linux/types.h>
-
-#define FALSE (0)
-#define TRUE (1)
-
-/*------------------------------------------------------------------*/
-/* Endian conversion */
-/*------------------------------------------------------------------*/
-#define CSR_GET_UINT16_FROM_LITTLE_ENDIAN(ptr) (((u16) ((u8 *) (ptr))[0]) | ((u16) ((u8 *) (ptr))[1]) << 8)
-#define CSR_GET_UINT32_FROM_LITTLE_ENDIAN(ptr) (((u32) ((u8 *) (ptr))[0]) | ((u32) ((u8 *) (ptr))[1]) << 8 | \
- ((u32) ((u8 *) (ptr))[2]) << 16 | ((u32) ((u8 *) (ptr))[3]) << 24)
-#define CSR_COPY_UINT16_TO_LITTLE_ENDIAN(uint, ptr) ((u8 *) (ptr))[0] = ((u8) ((uint) & 0x00FF)); \
- ((u8 *) (ptr))[1] = ((u8) ((uint) >> 8))
-#define CSR_COPY_UINT32_TO_LITTLE_ENDIAN(uint, ptr) ((u8 *) (ptr))[0] = ((u8) ((uint) & 0x000000FF)); \
- ((u8 *) (ptr))[1] = ((u8) (((uint) >> 8) & 0x000000FF)); \
- ((u8 *) (ptr))[2] = ((u8) (((uint) >> 16) & 0x000000FF)); \
- ((u8 *) (ptr))[3] = ((u8) (((uint) >> 24) & 0x000000FF))
-
-/*------------------------------------------------------------------*/
-/* Misc */
-/*------------------------------------------------------------------*/
-/* Use this macro on unused local variables that cannot be removed (such as
- unused function parameters). This will quell warnings from certain compilers
- and static code analysis tools like Lint and Valgrind. */
-#define CSR_UNUSED(x) ((void) (x))
-
-#endif
diff --git a/drivers/staging/csr/csr_msg_transport.h b/drivers/staging/csr/csr_msg_transport.h
deleted file mode 100644
index 8d88e7836567..000000000000
--- a/drivers/staging/csr/csr_msg_transport.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef CSR_MSG_TRANSPORT_H__
-#define CSR_MSG_TRANSPORT_H__
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2010
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#ifndef CsrMsgTransport
-#define CsrMsgTransport CsrSchedMessagePut
-#endif
-
-#endif /* CSR_MSG_TRANSPORT */
diff --git a/drivers/staging/csr/csr_msgconv.c b/drivers/staging/csr/csr_msgconv.c
deleted file mode 100644
index db5e845e60f5..000000000000
--- a/drivers/staging/csr/csr_msgconv.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2010
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/slab.h>
-#include "csr_sched.h"
-#include "csr_msgconv.h"
-#include "csr_macro.h"
-
-static CsrMsgConvEntry *converter;
-
-CsrMsgConvPrimEntry *CsrMsgConvFind(u16 primType)
-{
- CsrMsgConvPrimEntry *ptr = NULL;
-
- if (converter)
- {
- ptr = converter->profile_converters;
- while (ptr)
- {
- if (ptr->primType == primType)
- {
- break;
- }
- else
- {
- ptr = ptr->next;
- }
- }
- }
-
- return ptr;
-}
-
-static const CsrMsgConvMsgEntry *find_msg_converter(CsrMsgConvPrimEntry *ptr, u16 msgType)
-{
- const CsrMsgConvMsgEntry *cv = ptr->conv;
- if (ptr->lookupFunc)
- {
- return (const CsrMsgConvMsgEntry *) ptr->lookupFunc((CsrMsgConvMsgEntry *) cv, msgType);
- }
-
- while (cv)
- {
- if (cv->serFunc == NULL)
- {
- /* We've reached the end of the chain */
- cv = NULL;
- break;
- }
-
- if (cv->msgType == msgType)
- {
- break;
- }
- else
- {
- cv++;
- }
- }
-
- return cv;
-}
-
-static void *deserialize_data(u16 primType,
- size_t length,
- u8 *data)
-{
- CsrMsgConvPrimEntry *ptr;
- u8 *ret;
-
- ptr = CsrMsgConvFind(primType);
-
- if (ptr)
- {
- const CsrMsgConvMsgEntry *cv;
- u16 msgId = 0;
- size_t offset = 0;
- CsrUint16Des(&msgId, data, &offset);
-
- cv = find_msg_converter(ptr, msgId);
- if (cv)
- {
- ret = cv->deserFunc(data, length);
- }
- else
- {
- ret = NULL;
- }
- }
- else
- {
- ret = NULL;
- }
-
- return ret;
-}
-
-static size_t sizeof_message(u16 primType, void *msg)
-{
- CsrMsgConvPrimEntry *ptr = CsrMsgConvFind(primType);
- size_t ret;
-
- if (ptr)
- {
- const CsrMsgConvMsgEntry *cv;
- u16 msgId = *(u16 *) msg;
-
- cv = find_msg_converter(ptr, msgId);
- if (cv)
- {
- ret = cv->sizeofFunc(msg);
- }
- else
- {
- ret = 0;
- }
- }
- else
- {
- ret = 0;
- }
-
- return ret;
-}
-
-static u8 free_message(u16 primType, u8 *data)
-{
- CsrMsgConvPrimEntry *ptr;
- u8 ret;
-
- ptr = CsrMsgConvFind(primType);
-
- if (ptr)
- {
- const CsrMsgConvMsgEntry *cv;
- u16 msgId = *(u16 *) data;
-
- cv = find_msg_converter(ptr, msgId);
- if (cv)
- {
- cv->freeFunc(data);
- ret = TRUE;
- }
- else
- {
- ret = FALSE;
- }
- }
- else
- {
- ret = FALSE;
- }
-
- return ret;
-}
-
-static u8 *serialize_message(u16 primType,
- void *msg,
- size_t *length,
- u8 *buffer)
-{
- CsrMsgConvPrimEntry *ptr;
- u8 *ret;
-
- ptr = CsrMsgConvFind(primType);
-
- *length = 0;
-
- if (ptr)
- {
- const CsrMsgConvMsgEntry *cv;
-
- cv = find_msg_converter(ptr, *(u16 *) msg);
- if (cv)
- {
- ret = cv->serFunc(buffer, length, msg);
- }
- else
- {
- ret = NULL;
- }
- }
- else
- {
- ret = NULL;
- }
-
- return ret;
-}
-
-size_t CsrMsgConvSizeof(u16 primType, void *msg)
-{
- return sizeof_message(primType, msg);
-}
-
-u8 *CsrMsgConvSerialize(u8 *buffer, size_t maxBufferOffset, size_t *offset, u16 primType, void *msg)
-{
- if (converter)
- {
- size_t serializedLength;
- u8 *bufSerialized;
- u8 *bufOffset = &buffer[*offset];
- bufSerialized = converter->serialize_message(primType, msg, &serializedLength, bufOffset);
- *offset += serializedLength;
- return bufSerialized;
- }
- else
- {
- return NULL;
- }
-}
-
-/* Insert profile converter at head of converter list. */
-void CsrMsgConvInsert(u16 primType, const CsrMsgConvMsgEntry *ce)
-{
- CsrMsgConvPrimEntry *pc;
- pc = CsrMsgConvFind(primType);
-
- if (pc)
- {
- /* Already registered. Do nothing */
- }
- else
- {
- pc = kmalloc(sizeof(*pc), GFP_KERNEL);
- pc->primType = primType;
- pc->conv = ce;
- pc->lookupFunc = NULL;
- pc->next = converter->profile_converters;
- converter->profile_converters = pc;
- }
-}
-EXPORT_SYMBOL_GPL(CsrMsgConvInsert);
-
-CsrMsgConvMsgEntry *CsrMsgConvFindEntry(u16 primType, u16 msgType)
-{
- CsrMsgConvPrimEntry *ptr = CsrMsgConvFind(primType);
- if (ptr)
- {
- return (CsrMsgConvMsgEntry *) find_msg_converter(ptr, msgType);
- }
- return NULL;
-}
-EXPORT_SYMBOL_GPL(CsrMsgConvFindEntry);
-
-CsrMsgConvMsgEntry *CsrMsgConvFindEntryByMsg(u16 primType, const void *msg)
-{
- CsrMsgConvPrimEntry *ptr = CsrMsgConvFind(primType);
- if (ptr && msg)
- {
- u16 msgType = *((u16 *) msg);
- return (CsrMsgConvMsgEntry *) find_msg_converter(ptr, msgType);
- }
- return NULL;
-}
-
-void CsrMsgConvCustomLookupRegister(u16 primType, CsrMsgCustomLookupFunc *lookupFunc)
-{
- CsrMsgConvPrimEntry *ptr = CsrMsgConvFind(primType);
- if (ptr)
- {
- ptr->lookupFunc = lookupFunc;
- }
-}
-EXPORT_SYMBOL_GPL(CsrMsgConvCustomLookupRegister);
-
-CsrMsgConvEntry *CsrMsgConvInit(void)
-{
- if (!converter)
- {
- converter = kmalloc(sizeof(CsrMsgConvEntry), GFP_KERNEL);
-
- converter->profile_converters = NULL;
- converter->free_message = free_message;
- converter->sizeof_message = sizeof_message;
- converter->serialize_message = serialize_message;
- converter->deserialize_data = deserialize_data;
- }
-
- return converter;
-}
-EXPORT_SYMBOL_GPL(CsrMsgConvInit);
diff --git a/drivers/staging/csr/csr_msgconv.h b/drivers/staging/csr/csr_msgconv.h
deleted file mode 100644
index 7e4dd388ae37..000000000000
--- a/drivers/staging/csr/csr_msgconv.h
+++ /dev/null
@@ -1,78 +0,0 @@
-#ifndef CSR_MSGCONV_H__
-#define CSR_MSGCONV_H__
-
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2010
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#include <linux/types.h>
-#include "csr_prim_defs.h"
-#include "csr_sched.h"
-
-typedef size_t (CsrMsgSizeofFunc)(void *msg);
-typedef u8 *(CsrMsgSerializeFunc)(u8 *buffer, size_t *length, void *msg);
-typedef void (CsrMsgFreeFunc)(void *msg);
-typedef void *(CsrMsgDeserializeFunc)(u8 *buffer, size_t length);
-
-/* Converter entry for one message type */
-typedef struct CsrMsgConvMsgEntry
-{
- u16 msgType;
- CsrMsgSizeofFunc *sizeofFunc;
- CsrMsgSerializeFunc *serFunc;
- CsrMsgDeserializeFunc *deserFunc;
- CsrMsgFreeFunc *freeFunc;
-} CsrMsgConvMsgEntry;
-
-/* Optional lookup function */
-typedef CsrMsgConvMsgEntry *(CsrMsgCustomLookupFunc)(CsrMsgConvMsgEntry *ce, u16 msgType);
-
-/* All converter entries for one specific primitive */
-typedef struct CsrMsgConvPrimEntry
-{
- u16 primType;
- const CsrMsgConvMsgEntry *conv;
- CsrMsgCustomLookupFunc *lookupFunc;
- struct CsrMsgConvPrimEntry *next;
-} CsrMsgConvPrimEntry;
-
-typedef struct
-{
- CsrMsgConvPrimEntry *profile_converters;
- void *(*deserialize_data)(u16 primType, size_t length, u8 * data);
- u8 (*free_message)(u16 primType, u8 *data);
- size_t (*sizeof_message)(u16 primType, void *msg);
- u8 *(*serialize_message)(u16 primType, void *msg,
- size_t * length,
- u8 * buffer);
-} CsrMsgConvEntry;
-
-size_t CsrMsgConvSizeof(u16 primType, void *msg);
-u8 *CsrMsgConvSerialize(u8 *buffer, size_t maxBufferOffset, size_t *offset, u16 primType, void *msg);
-void CsrMsgConvCustomLookupRegister(u16 primType, CsrMsgCustomLookupFunc *lookupFunc);
-void CsrMsgConvInsert(u16 primType, const CsrMsgConvMsgEntry *ce);
-CsrMsgConvPrimEntry *CsrMsgConvFind(u16 primType);
-CsrMsgConvMsgEntry *CsrMsgConvFindEntry(u16 primType, u16 msgType);
-CsrMsgConvMsgEntry *CsrMsgConvFindEntryByMsg(u16 primType, const void *msg);
-CsrMsgConvEntry *CsrMsgConvInit(void);
-
-/* Prototypes for primitive type serializers */
-void CsrUint8Ser(u8 *buffer, size_t *offset, u8 value);
-void CsrUint16Ser(u8 *buffer, size_t *offset, u16 value);
-void CsrUint32Ser(u8 *buffer, size_t *offset, u32 value);
-void CsrMemCpySer(u8 *buffer, size_t *offset, const void *value, size_t length);
-void CsrCharStringSer(u8 *buffer, size_t *offset, const char *value);
-
-void CsrUint8Des(u8 *value, u8 *buffer, size_t *offset);
-void CsrUint16Des(u16 *value, u8 *buffer, size_t *offset);
-void CsrUint32Des(u32 *value, u8 *buffer, size_t *offset);
-void CsrMemCpyDes(void *value, u8 *buffer, size_t *offset, size_t length);
-void CsrCharStringDes(char **value, u8 *buffer, size_t *offset);
-
-#endif
diff --git a/drivers/staging/csr/csr_prim_defs.h b/drivers/staging/csr/csr_prim_defs.h
deleted file mode 100644
index 81a1eaac30d9..000000000000
--- a/drivers/staging/csr/csr_prim_defs.h
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef CSR_PRIM_DEFS_H__
-#define CSR_PRIM_DEFS_H__
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2010
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-/************************************************************************************
- * Segmentation of primitives in upstream and downstream segment
- ************************************************************************************/
-typedef u16 CsrPrim;
-#define CSR_PRIM_UPSTREAM ((CsrPrim) (0x8000))
-
-/************************************************************************************
- * Primitive definitions for Synergy framework
- ************************************************************************************/
-#define CSR_SYNERGY_EVENT_CLASS_BASE ((u16) (0x0600))
-
-#define CSR_HCI_PRIM ((u16) (0x0000 | CSR_SYNERGY_EVENT_CLASS_BASE))
-#define CSR_BCCMD_PRIM ((u16) (0x0001 | CSR_SYNERGY_EVENT_CLASS_BASE))
-#define CSR_HQ_PRIM ((u16) (0x0002 | CSR_SYNERGY_EVENT_CLASS_BASE))
-#define CSR_VM_PRIM ((u16) (0x0003 | CSR_SYNERGY_EVENT_CLASS_BASE))
-#define CSR_TM_BLUECORE_PRIM ((u16) (0x0004 | CSR_SYNERGY_EVENT_CLASS_BASE))
-#define CSR_FP_PRIM ((u16) (0x0005 | CSR_SYNERGY_EVENT_CLASS_BASE))
-#define CSR_IP_SOCKET_PRIM ((u16) (0x0006 | CSR_SYNERGY_EVENT_CLASS_BASE))
-#define CSR_IP_ETHER_PRIM ((u16) (0x0007 | CSR_SYNERGY_EVENT_CLASS_BASE))
-#define CSR_IP_IFCONFIG_PRIM ((u16) (0x0008 | CSR_SYNERGY_EVENT_CLASS_BASE))
-#define CSR_IP_INTERNAL_PRIM ((u16) (0x0009 | CSR_SYNERGY_EVENT_CLASS_BASE))
-#define CSR_FSAL_PRIM ((u16) (0x000A | CSR_SYNERGY_EVENT_CLASS_BASE))
-#define CSR_DATA_STORE_PRIM ((u16) (0x000B | CSR_SYNERGY_EVENT_CLASS_BASE))
-#define CSR_AM_PRIM ((u16) (0x000C | CSR_SYNERGY_EVENT_CLASS_BASE))
-#define CSR_TLS_PRIM ((u16) (0x000D | CSR_SYNERGY_EVENT_CLASS_BASE))
-#define CSR_DHCP_SERVER_PRIM ((u16) (0x000E | CSR_SYNERGY_EVENT_CLASS_BASE))
-#define CSR_TFTP_PRIM ((u16) (0x000F | CSR_SYNERGY_EVENT_CLASS_BASE))
-#define CSR_DSPM_PRIM ((u16) (0x0010 | CSR_SYNERGY_EVENT_CLASS_BASE))
-#define CSR_TLS_INTERNAL_PRIM ((u16) (0x0011 | CSR_SYNERGY_EVENT_CLASS_BASE))
-
-#define NUMBER_OF_CSR_FW_EVENTS (CSR_DSPM_PRIM - CSR_SYNERGY_EVENT_CLASS_BASE + 1)
-
-#define CSR_SYNERGY_EVENT_CLASS_MISC_BASE ((u16) (0x06A0))
-
-#define CSR_UI_PRIM ((u16) (0x0000 | CSR_SYNERGY_EVENT_CLASS_MISC_BASE))
-#define CSR_APP_PRIM ((u16) (0x0001 | CSR_SYNERGY_EVENT_CLASS_MISC_BASE))
-#define CSR_SDIO_PROBE_PRIM ((u16) (0x0002 | CSR_SYNERGY_EVENT_CLASS_MISC_BASE))
-
-#define NUMBER_OF_CSR_FW_MISC_EVENTS (CSR_SDIO_PROBE_PRIM - CSR_SYNERGY_EVENT_CLASS_MISC_BASE + 1)
-
-#define CSR_ENV_PRIM ((u16) (0x00FF | CSR_SYNERGY_EVENT_CLASS_MISC_BASE))
-
-#endif /* CSR_PRIM_DEFS_H__ */
diff --git a/drivers/staging/csr/csr_result.h b/drivers/staging/csr/csr_result.h
deleted file mode 100644
index cbb607d943c7..000000000000
--- a/drivers/staging/csr/csr_result.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef CSR_RESULT_H__
-#define CSR_RESULT_H__
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2010
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-typedef u16 CsrResult;
-#define CSR_RESULT_SUCCESS ((CsrResult) 0x0000)
-#define CSR_RESULT_FAILURE ((CsrResult) 0xFFFF)
-
-#endif
diff --git a/drivers/staging/csr/csr_sched.h b/drivers/staging/csr/csr_sched.h
deleted file mode 100644
index c7d672c59f5b..000000000000
--- a/drivers/staging/csr/csr_sched.h
+++ /dev/null
@@ -1,85 +0,0 @@
-#ifndef CSR_SCHED_H__
-#define CSR_SCHED_H__
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2010
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-#include <linux/types.h>
-#include "csr_time.h"
-
-/* An identifier issued by the scheduler. */
-typedef u32 CsrSchedIdentifier;
-
-/* A task identifier */
-typedef u16 CsrSchedTaskId;
-
-/* A queue identifier */
-typedef u16 CsrSchedQid;
-
-/* A message identifier */
-typedef CsrSchedIdentifier CsrSchedMsgId;
-
-/* A timer event identifier */
-typedef CsrSchedIdentifier CsrSchedTid;
-#define CSR_SCHED_TID_INVALID ((CsrSchedTid) 0)
-
-/* Time constants. */
-#define CSR_SCHED_TIME_MAX (0xFFFFFFFF)
-#define CSR_SCHED_MILLISECOND (1000)
-#define CSR_SCHED_SECOND (1000 * CSR_SCHED_MILLISECOND)
-#define CSR_SCHED_MINUTE (60 * CSR_SCHED_SECOND)
-
-/* Queue and primitive that identifies the environment */
-#define CSR_SCHED_TASK_ID 0xFFFF
-#define CSR_SCHED_PRIM (CSR_SCHED_TASK_ID)
-#define CSR_SCHED_EXCLUDED_MODULE_QUEUE 0xFFFF
-
-/*
- * Background interrupt definitions
- */
-typedef u16 CsrSchedBgint;
-#define CSR_SCHED_BGINT_INVALID ((CsrSchedBgint) 0xFFFF)
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSchedMessagePut
- *
- * DESCRIPTION
- * Sends a message consisting of the integer "mi" and the void * pointer
- * "mv" to the message queue "q".
- *
- * "mi" and "mv" are neither inspected nor changed by the scheduler - the
- * task that owns "q" is expected to make sense of the values. "mv" may
- * be null.
- *
- * NOTE
- * If "mv" is not null then it will typically be a chunk of kmalloc()ed
- * memory, though there is no need for it to be so. Tasks should normally
- * obey the convention that when a message built with kmalloc()ed memory
- * is given to CsrSchedMessagePut() then ownership of the memory is ceded to the
- * scheduler - and eventually to the recipient task. I.e., the receiver of
- * the message will be expected to kfree() the message storage.
- *
- * RETURNS
- * void.
- *
- *----------------------------------------------------------------------------*/
-#if defined(CSR_LOG_ENABLE) && defined(CSR_LOG_INCLUDE_FILE_NAME_AND_LINE_NUMBER)
-void CsrSchedMessagePutStringLog(CsrSchedQid q,
- u16 mi,
- void *mv,
- u32 line,
- const char *file);
-#define CsrSchedMessagePut(q, mi, mv) CsrSchedMessagePutStringLog((q), (mi), (mv), __LINE__, __FILE__)
-#else
-void CsrSchedMessagePut(CsrSchedQid q,
- u16 mi,
- void *mv);
-#endif
-
-#endif
diff --git a/drivers/staging/csr/csr_sdio.h b/drivers/staging/csr/csr_sdio.h
deleted file mode 100644
index 0971d135abf6..000000000000
--- a/drivers/staging/csr/csr_sdio.h
+++ /dev/null
@@ -1,723 +0,0 @@
-#ifndef CSR_SDIO_H__
-#define CSR_SDIO_H__
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2010
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#include "csr_result.h"
-
-/* Result Codes */
-#define CSR_SDIO_RESULT_INVALID_VALUE ((CsrResult) 1) /* Invalid argument value */
-#define CSR_SDIO_RESULT_NO_DEVICE ((CsrResult) 2) /* The specified device is no longer present */
-#define CSR_SDIO_RESULT_CRC_ERROR ((CsrResult) 3) /* The transmitted/received data or command response contained a CRC error */
-#define CSR_SDIO_RESULT_TIMEOUT ((CsrResult) 4) /* No command response or data received from device, or function enable/disable did not succeed within timeout period */
-#define CSR_SDIO_RESULT_NOT_RESET ((CsrResult) 5) /* The device was not reset */
-
-/* Features (for use in features member of CsrSdioFunction) */
-#define CSR_SDIO_FEATURE_BYTE_MODE 0x00000001 /* Transfer sizes do not have to be a multiple of block size */
-#define CSR_SDIO_FEATURE_DMA_CAPABLE_MEM_REQUIRED 0x00000002 /* Bulk operations require DMA friendly memory */
-
-/* CsrSdioFunctionId wildcards (for use in CsrSdioFunctionId members) */
-#define CSR_SDIO_ANY_MANF_ID 0xFFFF
-#define CSR_SDIO_ANY_CARD_ID 0xFFFF
-#define CSR_SDIO_ANY_SDIO_FUNCTION 0xFF
-#define CSR_SDIO_ANY_SDIO_INTERFACE 0xFF
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioFunctionId
- *
- * DESCRIPTION
- * This structure describes one or more functions of a device, based on
- * four qualitative measures. The CsrSdioFunctionId wildcard defines can be
- * used for making the CsrSdioFunctionId match more than one function.
- *
- * MEMBERS
- * manfId - Vendor ID (or CSR_SDIO_ANY_MANF_ID).
- * cardId - Device ID (or CSR_SDIO_ANY_CARD_ID).
- * sdioFunction - SDIO Function number (or CSR_SDIO_ANY_SDIO_FUNCTION).
- * sdioInterface - SDIO Standard Interface Code (or CSR_SDIO_ANY_SDIO_INTERFACE)
- *
- *----------------------------------------------------------------------------*/
-typedef struct
-{
- u16 manfId; /* Vendor ID to match or CSR_SDIO_ANY_MANF_ID */
- u16 cardId; /* Device ID to match or CSR_SDIO_ANY_CARD_ID */
- u8 sdioFunction; /* SDIO Function number to match or CSR_SDIO_ANY_SDIO_FUNCTION */
- u8 sdioInterface; /* SDIO Standard Interface Code to match or CSR_SDIO_ANY_SDIO_INTERFACE */
-} CsrSdioFunctionId;
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioFunction
- *
- * DESCRIPTION
- * This structure represents a single function on a device.
- *
- * MEMBERS
- * sdioId - A CsrSdioFunctionId describing this particular function. The
- * subfield shall not contain any CsrSdioFunctionId wildcards. The
- * subfields shall describe the specific single function
- * represented by this structure.
- * blockSize - Actual configured block size, or 0 if unconfigured.
- * features - Bit mask with any of CSR_SDIO_FEATURE_* set.
- * device - Handle of device containing the function. If two functions have
- * the same device handle, they reside on the same device.
- * driverData - For use by the Function Driver. The SDIO Driver shall not
- * attempt to dereference the pointer.
- * priv - For use by the SDIO Driver. The Function Driver shall not attempt
- * to dereference the pointer.
- *
- *
- *----------------------------------------------------------------------------*/
-typedef struct
-{
- CsrSdioFunctionId sdioId;
- u16 blockSize; /* Actual configured block size, or 0 if unconfigured */
- u32 features; /* Bit mask with any of CSR_SDIO_FEATURE_* set */
- void *device; /* Handle of device containing the function */
- void *driverData; /* For use by the Function Driver */
- void *priv; /* For use by the SDIO Driver */
-} CsrSdioFunction;
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioInsertedCallback, CsrSdioRemovedCallback
- *
- * DESCRIPTION
- * CsrSdioInsertedCallback is called when a function becomes available to
- * a registered Function Driver that supports the function.
- * CsrSdioRemovedCallback is called when a function is no longer available
- * to a Function Driver, either because the device has been removed, or the
- * Function Driver has been unregistered.
- *
- * NOTE: These functions are implemented by the Function Driver, and are
- * passed as function pointers in the CsrSdioFunctionDriver struct.
- *
- * PARAMETERS
- * function - Pointer to struct representing the function.
- *
- *----------------------------------------------------------------------------*/
-typedef void (*CsrSdioInsertedCallback)(CsrSdioFunction *function);
-typedef void (*CsrSdioRemovedCallback)(CsrSdioFunction *function);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioInterruptDsrCallback, CsrSdioInterruptCallback
- *
- * DESCRIPTION
- * CsrSdioInterruptCallback is called when an interrupt occurs on the
- * the device associated with the specified function.
- *
- * NOTE: These functions are implemented by the Function Driver, and are
- * passed as function pointers in the CsrSdioFunctionDriver struct.
- *
- * PARAMETERS
- * function - Pointer to struct representing the function.
- *
- * RETURNS (only CsrSdioInterruptCallback)
- * A pointer to a CsrSdioInterruptDsrCallback function.
- *
- *----------------------------------------------------------------------------*/
-typedef void (*CsrSdioInterruptDsrCallback)(CsrSdioFunction *function);
-typedef CsrSdioInterruptDsrCallback (*CsrSdioInterruptCallback)(CsrSdioFunction *function);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioSuspendCallback, CsrSdioResumeCallback
- *
- * DESCRIPTION
- * CsrSdioSuspendCallback is called when the system is preparing to go
- * into a suspended state. CsrSdioResumeCallback is called when the system
- * has entered an active state again.
- *
- * NOTE: These functions are implemented by the Function Driver, and are
- * passed as function pointers in the CsrSdioFunctionDriver struct.
- *
- * PARAMETERS
- * function - Pointer to struct representing the function.
- *
- *----------------------------------------------------------------------------*/
-typedef void (*CsrSdioSuspendCallback)(CsrSdioFunction *function);
-typedef void (*CsrSdioResumeCallback)(CsrSdioFunction *function);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioAsyncCallback, CsrSdioAsyncDsrCallback
- *
- * DESCRIPTION
- * CsrSdioAsyncCallback is called when an asynchronous operation completes.
- *
- * NOTE: These functions are implemented by the Function Driver, and are
- * passed as function pointers in the function calls that initiate
- * the operation.
- *
- * PARAMETERS
- * function - Pointer to struct representing the function.
- * result - The result of the operation that completed. See the description
- * of the initiating function for possible result values.
- *
- * RETURNS (only CsrSdioAsyncCallback)
- * A pointer to a CsrSdioAsyncDsrCallback function.
- *
- *----------------------------------------------------------------------------*/
-typedef void (*CsrSdioAsyncDsrCallback)(CsrSdioFunction *function, CsrResult result);
-typedef CsrSdioAsyncDsrCallback (*CsrSdioAsyncCallback)(CsrSdioFunction *function, CsrResult result);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioFunctionDriver
- *
- * DESCRIPTION
- * Structure representing a Function Driver.
- *
- * MEMBERS
- * inserted - Callback, see description of CsrSdioInsertedCallback.
- * removed - Callback, see description of CsrSdioRemovedCallback.
- * intr - Callback, see description of CsrSdioInterruptCallback.
- * suspend - Callback, see description of CsrSdioSuspendCallback.
- * resume - Callback, see description of CsrSdioResumeCallback.
- * ids - Array of CsrSdioFunctionId describing one or more functions that
- * are supported by the Function Driver.
- * idsCount - Length of the ids array.
- * priv - For use by the SDIO Driver. The Function Driver may initialise
- * it to NULL, but shall otherwise not access the pointer or attempt
- * to dereference it.
- *
- *----------------------------------------------------------------------------*/
-typedef struct
-{
- CsrSdioInsertedCallback inserted;
- CsrSdioRemovedCallback removed;
- CsrSdioInterruptCallback intr;
- CsrSdioSuspendCallback suspend;
- CsrSdioResumeCallback resume;
- CsrSdioFunctionId *ids;
- u8 idsCount;
- void *priv; /* For use by the SDIO Driver */
-} CsrSdioFunctionDriver;
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioFunctionDriverRegister
- *
- * DESCRIPTION
- * Register a Function Driver.
- *
- * PARAMETERS
- * functionDriver - Pointer to struct describing the Function Driver.
- *
- * RETURNS
- * CSR_RESULT_SUCCESS - The Function Driver was successfully
- * registered.
- * CSR_RESULT_FAILURE - Unable to register the function driver,
- * because of an unspecified/unknown error. The
- * Function Driver has not been registered.
- * CSR_SDIO_RESULT_INVALID_VALUE - The specified Function Driver pointer
- * does not point at a valid Function
- * Driver structure, or some of the members
- * contain invalid entries.
- *
- *----------------------------------------------------------------------------*/
-CsrResult CsrSdioFunctionDriverRegister(CsrSdioFunctionDriver *functionDriver);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioFunctionDriverUnregister
- *
- * DESCRIPTION
- * Unregister a previously registered Function Driver.
- *
- * PARAMETERS
- * functionDriver - pointer to struct describing the Function Driver.
- *
- *----------------------------------------------------------------------------*/
-void CsrSdioFunctionDriverUnregister(CsrSdioFunctionDriver *functionDriver);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioFunctionEnable, CsrSdioFunctionDisable
- *
- * DESCRIPTION
- * Enable/disable the specified function by setting/clearing the
- * corresponding bit in the I/O Enable register in function 0, and then
- * periodically reading the related bit in the I/O Ready register until it
- * is set/clear, limited by an implementation defined timeout.
- *
- * PARAMETERS
- * function - Pointer to struct representing the function.
- *
- * RETURNS
- * CSR_RESULT_SUCCESS - The specified function was enabled/disabled.
- * CSR_RESULT_FAILURE - Unspecified/unknown error.
- * CSR_SDIO_RESULT_NO_DEVICE - The device does not exist anymore.
- * CSR_SDIO_RESULT_CRC_ERROR - A CRC error occurred. The state of the
- * related bit in the I/O Enable register is
- * undefined.
- * CSR_SDIO_RESULT_TIMEOUT - No response from the device, or the related
- * bit in the I/O ready register was not
- * set/cleared within the timeout period.
- *
- * NOTE: If the SDIO R5 response is available, and either of the
- * FUNCTION_NUMBER or OUT_OF_RANGE bits are set,
- * CSR_SDIO_RESULT_INVALID_VALUE shall be returned. If the ERROR bit
- * is set (but none of FUNCTION_NUMBER or OUT_OF_RANGE),
- * CSR_RESULT_FAILURE shall be returned. The ILLEGAL_COMMAND and
- * COM_CRC_ERROR bits shall be ignored.
- *
- * If the CSPI response is available, and any of the
- * FUNCTION_DISABLED or CLOCK_DISABLED bits are set,
- * CSR_SDIO_RESULT_INVALID_VALUE will be returned.
- *
- *----------------------------------------------------------------------------*/
-CsrResult CsrSdioFunctionEnable(CsrSdioFunction *function);
-CsrResult CsrSdioFunctionDisable(CsrSdioFunction *function);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioInterruptEnable, CsrSdioInterruptDisable
- *
- * DESCRIPTION
- * Enable/disable the interrupt for the specified function by
- * setting/clearing the corresponding bit in the INT Enable register in
- * function 0.
- *
- * PARAMETERS
- * function - Pointer to struct representing the function.
- *
- * RETURNS
- * CSR_RESULT_SUCCESS - The specified function was enabled/disabled.
- * CSR_RESULT_FAILURE - Unspecified/unknown error.
- * CSR_SDIO_RESULT_NO_DEVICE - The device does not exist anymore.
- * CSR_SDIO_RESULT_CRC_ERROR - A CRC error occurred. The state of the
- * related bit in the INT Enable register is
- * unchanged.
- * CSR_SDIO_RESULT_INVALID_VALUE - The specified function cannot be
- * enabled/disabled, because it either
- * does not exist or it is not possible to
- * individually enable/disable functions.
- * CSR_SDIO_RESULT_TIMEOUT - No response from the device.
- *
- * NOTE: If the SDIO R5 response is available, and either of the
- * FUNCTION_NUMBER or OUT_OF_RANGE bits are set,
- * CSR_SDIO_RESULT_INVALID_VALUE shall be returned. If the ERROR bit
- * is set (but none of FUNCTION_NUMBER or OUT_OF_RANGE),
- * CSR_RESULT_FAILURE shall be returned. The ILLEGAL_COMMAND and
- * COM_CRC_ERROR bits shall be ignored.
- *
- * If the CSPI response is available, and any of the
- * FUNCTION_DISABLED or CLOCK_DISABLED bits are set,
- * CSR_SDIO_RESULT_INVALID_VALUE will be returned.
- *
- *----------------------------------------------------------------------------*/
-CsrResult CsrSdioInterruptEnable(CsrSdioFunction *function);
-CsrResult CsrSdioInterruptDisable(CsrSdioFunction *function);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioInterruptAcknowledge
- *
- * DESCRIPTION
- * Acknowledge that a signalled interrupt has been handled. Shall only
- * be called once, and exactly once for each signalled interrupt to the
- * corresponding function.
- *
- * PARAMETERS
- * function - Pointer to struct representing the function to which the
- * event was signalled.
- *
- *----------------------------------------------------------------------------*/
-void CsrSdioInterruptAcknowledge(CsrSdioFunction *function);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioInsertedAcknowledge, CsrSdioRemovedAcknowledge
- *
- * DESCRIPTION
- * Acknowledge that a signalled inserted/removed event has been handled.
- * Shall only be called once, and exactly once for each signalled event to
- * the corresponding function.
- *
- * PARAMETERS
- * function - Pointer to struct representing the function to which the
- * inserted was signalled.
- * result (CsrSdioInsertedAcknowledge only)
- * CSR_RESULT_SUCCESS - The Function Driver has accepted the
- * function, and the function is attached to
- * the Function Driver until the
- * CsrSdioRemovedCallback is called and
- * acknowledged.
- * CSR_RESULT_FAILURE - Unable to accept the function. The
- * function is not attached to the Function
- * Driver, and it may be passed to another
- * Function Driver which supports the
- * function.
- *
- *----------------------------------------------------------------------------*/
-void CsrSdioInsertedAcknowledge(CsrSdioFunction *function, CsrResult result);
-void CsrSdioRemovedAcknowledge(CsrSdioFunction *function);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioSuspendAcknowledge, CsrSdioResumeAcknowledge
- *
- * DESCRIPTION
- * Acknowledge that a signalled suspend event has been handled. Shall only
- * be called once, and exactly once for each signalled event to the
- * corresponding function.
- *
- * PARAMETERS
- * function - Pointer to struct representing the function to which the
- * event was signalled.
- * result
- * CSR_RESULT_SUCCESS - Successfully suspended/resumed.
- * CSR_RESULT_FAILURE - Unspecified/unknown error.
- *
- *----------------------------------------------------------------------------*/
-void CsrSdioSuspendAcknowledge(CsrSdioFunction *function, CsrResult result);
-void CsrSdioResumeAcknowledge(CsrSdioFunction *function, CsrResult result);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioBlockSizeSet
- *
- * DESCRIPTION
- * Set the block size to use for the function. The actual configured block
- * size shall be the minimum of:
- * 1) Maximum block size supported by the function.
- * 2) Maximum block size supported by the host controller.
- * 3) The block size specified by the blockSize argument.
- *
- * When this function returns, the actual configured block size is
- * available in the blockSize member of the function struct.
- *
- * PARAMETERS
- * function - Pointer to struct representing the function.
- * blockSize - Block size to use for the function. Valid range is 1 to
- * 2048.
- *
- * RETURNS
- * CSR_RESULT_SUCCESS - The block size register on the chip
- * was updated.
- * CSR_RESULT_FAILURE - Unspecified/unknown error.
- * CSR_SDIO_RESULT_INVALID_VALUE - One or more arguments were invalid.
- * CSR_SDIO_RESULT_NO_DEVICE - The device does not exist anymore.
- * CSR_SDIO_RESULT_CRC_ERROR - A CRC error occurred. The configured block
- * size is undefined.
- * CSR_SDIO_RESULT_TIMEOUT - No response from the device.
- *
- * NOTE: If the SDIO R5 response is available, and the FUNCTION_NUMBER
- * bits is set, CSR_SDIO_RESULT_INVALID_VALUE shall be returned.
- * If the ERROR bit is set (but not FUNCTION_NUMBER),
- * CSR_RESULT_FAILURE shall be returned. The ILLEGAL_COMMAND and
- * COM_CRC_ERROR bits shall be ignored.
- *
- * If the CSPI response is available, and any of the
- * FUNCTION_DISABLED or CLOCK_DISABLED bits are set,
- * CSR_SDIO_RESULT_INVALID_VALUE will be returned.
- *
- * NOTE: Setting the block size requires two individual operations. The
- * implementation shall ignore the OUT_OF_RANGE bit of the SDIO R5
- * response for the first operation, as the partially configured
- * block size may be out of range, even if the final block size
- * (after the second operation) is in the valid range.
- *
- *----------------------------------------------------------------------------*/
-CsrResult CsrSdioBlockSizeSet(CsrSdioFunction *function, u16 blockSize);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioMaxBusClockFrequencySet
- *
- * DESCRIPTION
- * Set the maximum clock frequency to use for the device associated with
- * the specified function. The actual configured clock frequency for the
- * device shall be the minimum of:
- * 1) Maximum clock frequency supported by the device.
- * 2) Maximum clock frequency supported by the host controller.
- * 3) Maximum clock frequency specified for any function on the same
- * device.
- *
- * If the clock frequency exceeds 25MHz, it is the responsibility of the
- * SDIO driver to enable high speed mode on the device, using the standard
- * defined procedure, before increasing the frequency beyond the limit.
- *
- * Note that the clock frequency configured affects all functions on the
- * same device.
- *
- * PARAMETERS
- * function - Pointer to struct representing the function.
- * maxFrequency - The maximum clock frequency for the function in Hertz.
- *
- * RETURNS
- * CSR_RESULT_SUCCESS - The maximum clock frequency was successfully
- * set for the function.
- * CSR_RESULT_FAILURE - Unspecified/unknown error.
- * CSR_SDIO_RESULT_INVALID_VALUE - One or more arguments were invalid.
- * CSR_SDIO_RESULT_NO_DEVICE - The device does not exist anymore.
- *
- * NOTE: If the SDIO R5 response is available, and the FUNCTION_NUMBER
- * bits is set, CSR_SDIO_RESULT_INVALID_VALUE shall be returned.
- * If the ERROR bit is set (but not FUNCTION_NUMBER),
- * CSR_RESULT_FAILURE shall be returned. The ILLEGAL_COMMAND and
- * COM_CRC_ERROR bits shall be ignored.
- *
- * If the CSPI response is available, and any of the
- * FUNCTION_DISABLED or CLOCK_DISABLED bits are set,
- * CSR_SDIO_RESULT_INVALID_VALUE will be returned.
- *
- *
- *----------------------------------------------------------------------------*/
-CsrResult CsrSdioMaxBusClockFrequencySet(CsrSdioFunction *function, u32 maxFrequency);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioRead8, CsrSdioWrite8, CsrSdioRead8Async, CsrSdioWrite8Async
- *
- * DESCRIPTION
- * Read/write an 8bit value from/to the specified register address.
- *
- * PARAMETERS
- * function - Pointer to struct representing the function.
- * address - Register address within the function.
- * data - The data to read/write.
- * callback - The function to call on operation completion.
- *
- * RETURNS
- * CSR_RESULT_SUCCESS - The data was successfully read/written.
- * CSR_RESULT_FAILURE - Unspecified/unknown error.
- * CSR_SDIO_RESULT_INVALID_VALUE - One or more arguments were invalid.
- * CSR_SDIO_RESULT_NO_DEVICE - The device does not exist anymore.
- * CSR_SDIO_RESULT_CRC_ERROR - A CRC error occurred. No data read/written.
- * CSR_SDIO_RESULT_TIMEOUT - No response from the device.
- *
- * NOTE: If the SDIO R5 response is available, and either of the
- * FUNCTION_NUMBER or OUT_OF_RANGE bits are set,
- * CSR_SDIO_RESULT_INVALID_VALUE shall be returned. If the ERROR bit
- * is set (but none of FUNCTION_NUMBER or OUT_OF_RANGE),
- * CSR_RESULT_FAILURE shall be returned. The ILLEGAL_COMMAND and
- * COM_CRC_ERROR bits shall be ignored.
- *
- * If the CSPI response is available, and any of the
- * FUNCTION_DISABLED or CLOCK_DISABLED bits are set,
- * CSR_SDIO_RESULT_INVALID_VALUE will be returned.
- *
- * NOTE: The CsrSdioRead8Async and CsrSdioWrite8Async functions return
- * immediately, and the supplied callback function is called when the
- * operation is complete. The result value is given as an argument to
- * the callback function.
- *
- *----------------------------------------------------------------------------*/
-CsrResult CsrSdioRead8(CsrSdioFunction *function, u32 address, u8 *data);
-CsrResult CsrSdioWrite8(CsrSdioFunction *function, u32 address, u8 data);
-void CsrSdioRead8Async(CsrSdioFunction *function, u32 address, u8 *data, CsrSdioAsyncCallback callback);
-void CsrSdioWrite8Async(CsrSdioFunction *function, u32 address, u8 data, CsrSdioAsyncCallback callback);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioRead16, CsrSdioWrite16, CsrSdioRead16Async, CsrSdioWrite16Async
- *
- * DESCRIPTION
- * Read/write a 16bit value from/to the specified register address.
- *
- * PARAMETERS
- * function - Pointer to struct representing the function.
- * address - Register address within the function.
- * data - The data to read/write.
- * callback - The function to call on operation completion.
- *
- * RETURNS
- * CSR_RESULT_SUCCESS - The data was successfully read/written.
- * CSR_RESULT_FAILURE - Unspecified/unknown error.
- * CSR_SDIO_RESULT_INVALID_VALUE - One or more arguments were invalid.
- * CSR_SDIO_RESULT_NO_DEVICE - The device does not exist anymore.
- * CSR_SDIO_RESULT_CRC_ERROR - A CRC error occurred. Data may have been
- * partially read/written.
- * CSR_SDIO_RESULT_TIMEOUT - No response from the device.
- *
- * NOTE: If the SDIO R5 response is available, and either of the
- * FUNCTION_NUMBER or OUT_OF_RANGE bits are set,
- * CSR_SDIO_RESULT_INVALID_VALUE shall be returned. If the ERROR bit
- * is set (but none of FUNCTION_NUMBER or OUT_OF_RANGE),
- * CSR_RESULT_FAILURE shall be returned. The ILLEGAL_COMMAND and
- * COM_CRC_ERROR bits shall be ignored.
- *
- * If the CSPI response is available, and any of the
- * FUNCTION_DISABLED or CLOCK_DISABLED bits are set,
- * CSR_SDIO_RESULT_INVALID_VALUE will be returned.
- *
- * NOTE: The CsrSdioRead16Async and CsrSdioWrite16Async functions return
- * immediately, and the supplied callback function is called when the
- * operation is complete. The result value is given as an argument to
- * the callback function.
- *
- *----------------------------------------------------------------------------*/
-CsrResult CsrSdioRead16(CsrSdioFunction *function, u32 address, u16 *data);
-CsrResult CsrSdioWrite16(CsrSdioFunction *function, u32 address, u16 data);
-void CsrSdioRead16Async(CsrSdioFunction *function, u32 address, u16 *data, CsrSdioAsyncCallback callback);
-void CsrSdioWrite16Async(CsrSdioFunction *function, u32 address, u16 data, CsrSdioAsyncCallback callback);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioF0Read8, CsrSdioF0Write8, CsrSdioF0Read8Async,
- * CsrSdioF0Write8Async
- *
- * DESCRIPTION
- * Read/write an 8bit value from/to the specified register address in
- * function 0.
- *
- * PARAMETERS
- * function - Pointer to struct representing the function.
- * address - Register address within the function.
- * data - The data to read/write.
- * callback - The function to call on operation completion.
- *
- * RETURNS
- * CSR_RESULT_SUCCESS - The data was successfully read/written.
- * CSR_RESULT_FAILURE - Unspecified/unknown error.
- * CSR_SDIO_RESULT_INVALID_VALUE - One or more arguments were invalid.
- * CSR_SDIO_RESULT_NO_DEVICE - The device does not exist anymore.
- * CSR_SDIO_RESULT_CRC_ERROR - A CRC error occurred. No data read/written.
- * CSR_SDIO_RESULT_TIMEOUT - No response from the device.
- *
- * NOTE: If the SDIO R5 response is available, and either of the
- * FUNCTION_NUMBER or OUT_OF_RANGE bits are set,
- * CSR_SDIO_RESULT_INVALID_VALUE shall be returned. If the ERROR bit
- * is set (but none of FUNCTION_NUMBER or OUT_OF_RANGE),
- * CSR_RESULT_FAILURE shall be returned. The ILLEGAL_COMMAND and
- * COM_CRC_ERROR bits shall be ignored.
- *
- * If the CSPI response is available, and any of the
- * FUNCTION_DISABLED or CLOCK_DISABLED bits are set,
- * CSR_SDIO_RESULT_INVALID_VALUE will be returned.
- *
- * NOTE: The CsrSdioF0Read8Async and CsrSdioF0Write8Async functions return
- * immediately, and the supplied callback function is called when the
- * operation is complete. The result value is given as an argument to
- * the callback function.
- *
- *----------------------------------------------------------------------------*/
-CsrResult CsrSdioF0Read8(CsrSdioFunction *function, u32 address, u8 *data);
-CsrResult CsrSdioF0Write8(CsrSdioFunction *function, u32 address, u8 data);
-void CsrSdioF0Read8Async(CsrSdioFunction *function, u32 address, u8 *data, CsrSdioAsyncCallback callback);
-void CsrSdioF0Write8Async(CsrSdioFunction *function, u32 address, u8 data, CsrSdioAsyncCallback callback);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioRead, CsrSdioWrite, CsrSdioReadAsync, CsrSdioWriteAsync
- *
- * DESCRIPTION
- * Read/write a specified number of bytes from/to the specified register
- * address.
- *
- * PARAMETERS
- * function - Pointer to struct representing the function.
- * address - Register address within the function.
- * data - The data to read/write.
- * length - Number of byte to read/write.
- * callback - The function to call on operation completion.
- *
- * RETURNS
- * CSR_RESULT_SUCCESS - The data was successfully read/written.
- * CSR_RESULT_FAILURE - Unspecified/unknown error.
- * CSR_SDIO_RESULT_INVALID_VALUE - One or more arguments were invalid.
- * CSR_SDIO_RESULT_NO_DEVICE - The device does not exist anymore.
- * CSR_SDIO_RESULT_CRC_ERROR - A CRC error occurred. Data may have been
- * partially read/written.
- * CSR_SDIO_RESULT_TIMEOUT - No response from the device.
- *
- * NOTE: If the SDIO R5 response is available, and either of the
- * FUNCTION_NUMBER or OUT_OF_RANGE bits are set,
- * CSR_SDIO_RESULT_INVALID_VALUE shall be returned. If the ERROR bit
- * is set (but none of FUNCTION_NUMBER or OUT_OF_RANGE),
- * CSR_RESULT_FAILURE shall be returned. The ILLEGAL_COMMAND and
- * COM_CRC_ERROR bits shall be ignored.
- *
- * If the CSPI response is available, and any of the
- * FUNCTION_DISABLED or CLOCK_DISABLED bits are set,
- * CSR_SDIO_RESULT_INVALID_VALUE will be returned.
- *
- * NOTE: The CsrSdioF0Read8Async and CsrSdioF0Write8Async functions return
- * immediately, and the supplied callback function is called when the
- * operation is complete. The result value is given as an argument to
- * the callback function.
- *
- *----------------------------------------------------------------------------*/
-CsrResult CsrSdioRead(CsrSdioFunction *function, u32 address, void *data, u32 length);
-CsrResult CsrSdioWrite(CsrSdioFunction *function, u32 address, const void *data, u32 length);
-void CsrSdioReadAsync(CsrSdioFunction *function, u32 address, void *data, u32 length, CsrSdioAsyncCallback callback);
-void CsrSdioWriteAsync(CsrSdioFunction *function, u32 address, const void *data, u32 length, CsrSdioAsyncCallback callback);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioPowerOn, CsrSdioPowerOff
- *
- * DESCRIPTION
- * Power on/off the device.
- *
- * PARAMETERS
- * function - Pointer to struct representing the function that resides on
- * the device to power on/off.
- *
- * RETURNS (only CsrSdioPowerOn)
- * CSR_RESULT_SUCCESS - Power was successfully reapplied and the device
- * has been reinitialised.
- * CSR_RESULT_FAILURE - Unspecified/unknown error.
- * CSR_SDIO_RESULT_NO_DEVICE - The device does not exist anymore.
- * CSR_SDIO_RESULT_CRC_ERROR - A CRC error occurred during reinitialisation.
- * CSR_SDIO_RESULT_TIMEOUT - No response from the device during
- * reinitialisation.
- * CSR_SDIO_RESULT_NOT_RESET - The power was not removed by the
- * CsrSdioPowerOff call. The state of the
- * device is unchanged.
- *
- *----------------------------------------------------------------------------*/
-CsrResult CsrSdioPowerOn(CsrSdioFunction *function);
-void CsrSdioPowerOff(CsrSdioFunction *function);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioHardReset
- *
- * DESCRIPTION
- * Perform a hardware reset of the device.
- *
- * PARAMETERS
- * function - Pointer to struct representing the function that resides on
- * the device to hard reset.
- *
- * RETURNS
- * CSR_RESULT_SUCCESS - Reset was successfully performed and the device
- * has been reinitialised.
- * CSR_RESULT_FAILURE - Unspecified/unknown error.
- * CSR_SDIO_RESULT_NO_DEVICE - The device does not exist anymore.
- * CSR_SDIO_RESULT_CRC_ERROR - A CRC error occurred during reinitialisation.
- * CSR_SDIO_RESULT_TIMEOUT - No response from the device during
- * reinitialisation.
- * CSR_SDIO_RESULT_NOT_RESET - The reset was not applied because it is not
- * supported. The state of the device is
- * unchanged.
- *
- *----------------------------------------------------------------------------*/
-CsrResult CsrSdioHardReset(CsrSdioFunction *function);
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrSdioFunctionActive, CsrSdioFunctionIdle
- *
- * DESCRIPTION
- *
- * PARAMETERS
- * function - Pointer to struct representing the function.
- *
- *----------------------------------------------------------------------------*/
-void CsrSdioFunctionActive(CsrSdioFunction *function);
-void CsrSdioFunctionIdle(CsrSdioFunction *function);
-
-#endif
diff --git a/drivers/staging/csr/csr_serialize_primitive_types.c b/drivers/staging/csr/csr_serialize_primitive_types.c
deleted file mode 100644
index 9713b9afef64..000000000000
--- a/drivers/staging/csr/csr_serialize_primitive_types.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2010
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#include <linux/module.h>
-#include <linux/slab.h>
-#include "csr_prim_defs.h"
-#include "csr_msgconv.h"
-#include "csr_macro.h"
-
-void CsrUint8Des(u8 *value, u8 *buffer, size_t *offset)
-{
- *value = buffer[*offset];
- *offset += sizeof(*value);
-}
-EXPORT_SYMBOL_GPL(CsrUint8Des);
-
-void CsrUint16Des(u16 *value, u8 *buffer, size_t *offset)
-{
- *value = (buffer[*offset + 0] << 0) |
- (buffer[*offset + 1] << 8);
- *offset += sizeof(*value);
-}
-EXPORT_SYMBOL_GPL(CsrUint16Des);
-
-void CsrUint32Des(u32 *value, u8 *buffer, size_t *offset)
-{
- *value = (buffer[*offset + 0] << 0) |
- (buffer[*offset + 1] << 8) |
- (buffer[*offset + 2] << 16) |
- (buffer[*offset + 3] << 24);
- *offset += sizeof(*value);
-}
-EXPORT_SYMBOL_GPL(CsrUint32Des);
-
-void CsrMemCpyDes(void *value, u8 *buffer, size_t *offset, size_t length)
-{
- memcpy(value, &buffer[*offset], length);
- *offset += length;
-}
-EXPORT_SYMBOL_GPL(CsrMemCpyDes);
-
-void CsrCharStringDes(char **value, u8 *buffer, size_t *offset)
-{
- *value = kstrdup((char *) &buffer[*offset], GFP_KERNEL);
- *offset += strlen(*value) + 1;
-}
-EXPORT_SYMBOL_GPL(CsrCharStringDes);
-
-void CsrUint8Ser(u8 *buffer, size_t *offset, u8 value)
-{
- buffer[*offset] = value;
- *offset += sizeof(value);
-}
-EXPORT_SYMBOL_GPL(CsrUint8Ser);
-
-void CsrUint16Ser(u8 *buffer, size_t *offset, u16 value)
-{
- buffer[*offset + 0] = (u8) ((value >> 0) & 0xFF);
- buffer[*offset + 1] = (u8) ((value >> 8) & 0xFF);
- *offset += sizeof(value);
-}
-EXPORT_SYMBOL_GPL(CsrUint16Ser);
-
-void CsrUint32Ser(u8 *buffer, size_t *offset, u32 value)
-{
- buffer[*offset + 0] = (u8) ((value >> 0) & 0xFF);
- buffer[*offset + 1] = (u8) ((value >> 8) & 0xFF);
- buffer[*offset + 2] = (u8) ((value >> 16) & 0xFF);
- buffer[*offset + 3] = (u8) ((value >> 24) & 0xFF);
- *offset += sizeof(value);
-}
-EXPORT_SYMBOL_GPL(CsrUint32Ser);
-
-void CsrMemCpySer(u8 *buffer, size_t *offset, const void *value, size_t length)
-{
- memcpy(&buffer[*offset], value, length);
- *offset += length;
-}
-EXPORT_SYMBOL_GPL(CsrMemCpySer);
-
-void CsrCharStringSer(u8 *buffer, size_t *offset, const char *value)
-{
- if (value)
- {
- strcpy(((char *) &buffer[*offset]), value);
- *offset += strlen(value) + 1;
- }
- else
- {
- CsrUint8Ser(buffer, offset, 0);
- }
-}
-EXPORT_SYMBOL_GPL(CsrCharStringSer);
diff --git a/drivers/staging/csr/csr_time.c b/drivers/staging/csr/csr_time.c
deleted file mode 100644
index 01179e46f47d..000000000000
--- a/drivers/staging/csr/csr_time.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2010
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#include <linux/kernel.h>
-#include <linux/time.h>
-#include <linux/module.h>
-
-#include "csr_time.h"
-
-u32 CsrTimeGet(u32 *high)
-{
- struct timespec ts;
- u64 time;
- u32 low;
-
- ts = current_kernel_time();
- time = (u64) ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
-
- if (high != NULL)
- *high = (u32) ((time >> 32) & 0xFFFFFFFF);
-
- low = (u32) (time & 0xFFFFFFFF);
-
- return low;
-}
-EXPORT_SYMBOL_GPL(CsrTimeGet);
diff --git a/drivers/staging/csr/csr_time.h b/drivers/staging/csr/csr_time.h
deleted file mode 100644
index fc29e8e5e478..000000000000
--- a/drivers/staging/csr/csr_time.h
+++ /dev/null
@@ -1,76 +0,0 @@
-#ifndef CSR_TIME_H__
-#define CSR_TIME_H__
-/*****************************************************************************
-
-(c) Cambridge Silicon Radio Limited 2010
-All rights reserved and confidential information of CSR
-
-Refer to LICENSE.txt included with this source for details
-on the license terms.
-
-*****************************************************************************/
-
-#include <linux/types.h>
-
-/*******************************************************************************
-
-NAME
- CsrTimeGet
-
-DESCRIPTION
- Returns the current system time in a low and a high part. The low part
- is expressed in microseconds. The high part is incremented when the low
- part wraps to provide an extended range.
-
- The caller may provide a NULL pointer as the high parameter.
- In this case the function just returns the low part and ignores the
- high parameter.
-
- Although the time is expressed in microseconds the actual resolution is
- platform dependent and can be less. It is recommended that the
- resolution is at least 10 milliseconds.
-
-PARAMETERS
- high - Pointer to variable that will receive the high part of the
- current system time. Passing NULL is valid.
-
-RETURNS
- Low part of current system time in microseconds.
-
-*******************************************************************************/
-u32 CsrTimeGet(u32 *high);
-
-
-/*------------------------------------------------------------------*/
-/* CsrTime Macros */
-/*------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrTimeAdd
- *
- * DESCRIPTION
- * Add two time values. Adding the numbers can overflow the range of a
- * CsrTime, so the user must be cautious.
- *
- * RETURNS
- * CsrTime - the sum of "t1" and "t2".
- *
- *----------------------------------------------------------------------------*/
-#define CsrTimeAdd(t1, t2) ((t1) + (t2))
-
-/*----------------------------------------------------------------------------*
- * NAME
- * CsrTimeSub
- *
- * DESCRIPTION
- * Subtract two time values. Subtracting the numbers can provoke an
- * underflow, so the user must be cautious.
- *
- * RETURNS
- * CsrTime - "t1" - "t2".
- *
- *----------------------------------------------------------------------------*/
-#define CsrTimeSub(t1, t2) ((s32) (t1) - (s32) (t2))
-
-#endif
diff --git a/drivers/staging/csr/csr_util.c b/drivers/staging/csr/csr_util.c
deleted file mode 100644
index c3aa9d509e5c..000000000000
--- a/drivers/staging/csr/csr_util.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2010
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#include <linux/module.h>
-
-MODULE_DESCRIPTION("CSR Operating System Kernel Abstraction");
-MODULE_AUTHOR("Cambridge Silicon Radio Ltd.");
-MODULE_LICENSE("GPL and additional rights");
diff --git a/drivers/staging/csr/csr_wifi_common.h b/drivers/staging/csr/csr_wifi_common.h
deleted file mode 100644
index efc43a525a3d..000000000000
--- a/drivers/staging/csr/csr_wifi_common.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2011
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#ifndef CSR_WIFI_COMMON_H__
-#define CSR_WIFI_COMMON_H__
-
-#include <linux/types.h>
-#include "csr_result.h"
-
-/* MAC address */
-typedef struct
-{
- u8 a[6];
-} CsrWifiMacAddress;
-
-/* IPv4 address */
-typedef struct
-{
- u8 a[4];
-} CsrWifiIp4Address;
-
-/* IPv6 address */
-typedef struct
-{
- u8 a[16];
-} CsrWifiIp6Address;
-
-typedef struct
-{
- u8 ssid[32];
- u8 length;
-} CsrWifiSsid;
-
-/*******************************************************************************
-
- DESCRIPTION
- Result values used on the Wifi Interfaces
-
- VALUES
- CSR_RESULT_SUCCESS
- - The request/procedure succeeded
- CSR_RESULT_FAILURE
- - The request/procedure did not succeed because of an error
- CSR_WIFI_RESULT_NOT_FOUND
- - The request did not succeed because some resource was not
- found.
- CSR_WIFI_RESULT_TIMED_OUT
- - The request/procedure did not succeed because of a time out
- CSR_WIFI_RESULT_CANCELLED
- - The request was canceled due to another conflicting
- request that was issued before this one was completed
- CSR_WIFI_RESULT_INVALID_PARAMETER
- - The request/procedure did not succeed because it had an
- invalid parameter
- CSR_WIFI_RESULT_NO_ROOM
- - The request did not succeed due to a lack of resources,
- e.g. out of memory problem.
- CSR_WIFI_RESULT_UNSUPPORTED
- - The request/procedure did not succeed because the feature
- is not supported yet
- CSR_WIFI_RESULT_UNAVAILABLE
- - The request cannot be processed at this time
- CSR_WIFI_RESULT_WIFI_OFF
- - The requested action is not available because Wi-Fi is
- currently off
- CSR_WIFI_RESULT_SECURITY_ERROR
- - The request/procedure did not succeed because of a security
- error
- CSR_WIFI_RESULT_MIB_SET_FAILURE
- - MIB Set Failure: either the MIB OID to be written to does
- not exist or the MIB Value is invalid.
- CSR_WIFI_RESULT_INVALID_INTERFACE_TAG
- - The supplied Interface Tag is not valid.
- CSR_WIFI_RESULT_P2P_NOA_CONFIG_CONFLICT
- - The new NOA configuration conflicts with the existing NOA configuration
- hence not accepted"
-*******************************************************************************/
-#define CSR_WIFI_RESULT_NOT_FOUND ((CsrResult) 0x0001)
-#define CSR_WIFI_RESULT_TIMED_OUT ((CsrResult) 0x0002)
-#define CSR_WIFI_RESULT_CANCELLED ((CsrResult) 0x0003)
-#define CSR_WIFI_RESULT_INVALID_PARAMETER ((CsrResult) 0x0004)
-#define CSR_WIFI_RESULT_NO_ROOM ((CsrResult) 0x0005)
-#define CSR_WIFI_RESULT_UNSUPPORTED ((CsrResult) 0x0006)
-#define CSR_WIFI_RESULT_UNAVAILABLE ((CsrResult) 0x0007)
-#define CSR_WIFI_RESULT_WIFI_OFF ((CsrResult) 0x0008)
-#define CSR_WIFI_RESULT_SECURITY_ERROR ((CsrResult) 0x0009)
-#define CSR_WIFI_RESULT_MIB_SET_FAILURE ((CsrResult) 0x000A)
-#define CSR_WIFI_RESULT_INVALID_INTERFACE_TAG ((CsrResult) 0x000B)
-#define CSR_WIFI_RESULT_P2P_NOA_CONFIG_CONFLICT ((CsrResult) 0x000C)
-
-#define CSR_WIFI_VERSION "5.1.0.0"
-
-#endif
-
diff --git a/drivers/staging/csr/csr_wifi_fsm.h b/drivers/staging/csr/csr_wifi_fsm.h
deleted file mode 100644
index fc5c5aa6a3c4..000000000000
--- a/drivers/staging/csr/csr_wifi_fsm.h
+++ /dev/null
@@ -1,240 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2011
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#ifndef CSR_WIFI_FSM_H
-#define CSR_WIFI_FSM_H
-
-#include "csr_prim_defs.h"
-#include "csr_log_text.h"
-#include "csr_wifi_fsm_event.h"
-
-/* including this file for CsrWifiInterfaceMode*/
-#include "csr_wifi_common.h"
-
-#define CSR_WIFI_FSM_ENV (0xFFFF)
-
-/**
- * @brief
- * Toplevel FSM context data
- *
- * @par Description
- * Holds ALL FSM static and dynamic data for a FSM
- */
-typedef struct CsrWifiFsmContext CsrWifiFsmContext;
-
-/**
- * @brief
- * FSM External Wakeup CallbackFunction Pointer
- *
- * @par Description
- * Defines the external wakeup function for the FSM
- * to call when an external event is injected into the systen
- *
- * @param[in] context : External context
- *
- * @return
- * void
- */
-typedef void (*CsrWifiFsmExternalWakupCallbackPtr)(void *context);
-
-/**
- * @brief
- * Initialises a top level FSM context
- *
- * @par Description
- * Initialises the FSM Context to an initial state and allocates
- * space for "maxProcesses" number of instances
- *
- * @param[in] osaContext : OSA context
- * @param[in] applicationContext : Internal fsm application context
- * @param[in] externalContext : External context
- * @param[in] maxProcesses : Max processes to allocate room for
- *
- * @return
- * CsrWifiFsmContext* fsm context
- */
-extern CsrWifiFsmContext* CsrWifiFsmInit(void *applicationContext, void *externalContext, u16 maxProcesses, CsrLogTextTaskId loggingTaskId);
-
-/**
- * @brief
- * Resets the FSM's back to first conditions
- *
- * @par Description
- * This function is used to free any dynamic resources allocated for the
- * given context by CsrWifiFsmInit().
- * The FSM's reset function is called to cleanup any fsm specific memory
- * The reset function does NOT need to free the fsm data pointer as
- * CsrWifiFsmShutdown() will do it.
- * the FSM's init function is call again to reinitialise the FSM context.
- * CsrWifiFsmReset() should NEVER be called when CsrWifiFsmExecute() is running.
- *
- * @param[in] context : FSM context
- *
- * @return
- * void
- */
-extern void CsrWifiFsmReset(CsrWifiFsmContext *context);
-
-/**
- * @brief
- * Frees resources allocated by CsrWifiFsmInit
- *
- * @par Description
- * This function is used to free any dynamic resources allocated for the
- * given context by CsrWifiFsmInit(), prior to complete termination of
- * the program.
- * The FSM's reset function is called to cleanup any fsm specific memory.
- * The reset function does NOT need to free the fsm data pointer as
- * CsrWifiFsmShutdown() will do it.
- * CsrWifiFsmShutdown() should NEVER be called when CsrWifiFsmExecute() is running.
- *
- * @param[in] context : FSM context
- *
- * @return
- * void
- */
-extern void CsrWifiFsmShutdown(CsrWifiFsmContext *context);
-
-/**
- * @brief
- * Executes the fsm context
- *
- * @par Description
- * Executes the FSM context and runs until ALL events in the context are processed.
- * When no more events are left to process then CsrWifiFsmExecute() returns to a time
- * specifying when to next call the CsrWifiFsmExecute()
- * Scheduling, threading, blocking and external event notification are outside
- * the scope of the FSM and CsrWifiFsmExecute().
- *
- * @param[in] context : FSM context
- *
- * @return
- * u32 Time in ms until next timeout or 0xFFFFFFFF for no timer set
- */
-extern u32 CsrWifiFsmExecute(CsrWifiFsmContext *context);
-
-/**
- * @brief
- * Adds an event to the FSM context's external event queue for processing
- *
- * @par Description
- * Adds an event to the contexts external queue
- * This is thread safe and adds an event to the fsm's external event queue.
- *
- * @param[in] context : FSM context
- * @param[in] event : event to add to the event queue
- * @param[in] source : source of the event (this can be a synergy task queue or an fsm instance id)
- * @param[in] destination : destination of the event (This can be a fsm instance id or CSR_WIFI_FSM_ENV)
- * @param[in] id : event id
- *
- * @return
- * void
- */
-extern void CsrWifiFsmSendEventExternal(CsrWifiFsmContext *context, CsrWifiFsmEvent *event, u16 source, u16 destination, CsrPrim primtype, u16 id);
-
-/**
- * @brief
- * Adds an Alien event to the FSM context's external event queue for processing
- *
- * @par Description
- * Adds an event to the contexts external queue
- * This is thread safe and adds an event to the fsm's external event queue.
- *
- * @param[in] context : FSM context
- * @param[in] event : event to add to the event queue
- * @param[in] source : source of the event (this can be a synergy task queue or an fsm instance id)
- * @param[in] destination : destination of the event (This can be a fsm instance id or CSR_WIFI_FSM_ENV)
- * @param[in] id : event id
- */
-#define CsrWifiFsmSendAlienEventExternal(_context, _alienEvent, _source, _destination, _primtype, _id) \
- { \
- CsrWifiFsmAlienEvent *_evt = kmalloc(sizeof(CsrWifiFsmAlienEvent), GFP_KERNEL); \
- _evt->alienEvent = _alienEvent; \
- CsrWifiFsmSendEventExternal(_context, (CsrWifiFsmEvent *)_evt, _source, _destination, _primtype, _id); \
- }
-
-
-/**
- * @brief
- * Current time of day in ms
- *
- * @param[in] context : FSM context
- *
- * @return
- * u32 32 bit ms tick
- */
-extern u32 CsrWifiFsmGetTimeOfDayMs(CsrWifiFsmContext *context);
-
-/**
- * @brief
- * Gets the time until the next FSM timer expiry
- *
- * @par Description
- * Returns the next timeout time or 0 if no timers are set.
- *
- * @param[in] context : FSM context
- *
- * @return
- * u32 Time in ms until next timeout or 0xFFFFFFFF for no timer set
- */
-extern u32 CsrWifiFsmGetNextTimeout(CsrWifiFsmContext *context);
-
-/**
- * @brief
- * Fast forwards the fsm timers by ms Milliseconds
- *
- * @param[in] context : FSM context
- * @param[in] ms : Milliseconds to fast forward by
- *
- * @return
- * void
- */
-extern void CsrWifiFsmFastForward(CsrWifiFsmContext *context, u16 ms);
-
-/**
- * @brief
- * shift the current time of day by ms amount
- *
- * @par Description
- * useful to speed up tests where time needs to pass
- *
- * @param[in] context : FSM context
- * @param[in] ms : ms to adjust time by
- *
- * @return
- * void
- */
-extern void CsrWifiFsmTestAdvanceTime(CsrWifiFsmContext *context, u32 ms);
-
-/**
- * @brief
- * Check if the fsm has events to process
- *
- * @param[in] context : FSM context
- *
- * @return
- * u8 returns TRUE if there are events for the FSM to process
- */
-extern u8 CsrWifiFsmHasEvents(CsrWifiFsmContext *context);
-
-/**
- * @brief
- * function that installs the contexts wakeup function
- *
- * @param[in] context : FSM context
- * @param[in] callback : Callback function pointer
- *
- * @return
- * void
- */
-extern void CsrWifiFsmInstallWakeupCallback(CsrWifiFsmContext *context, CsrWifiFsmExternalWakupCallbackPtr callback);
-
-#endif /* CSR_WIFI_FSM_H */
-
diff --git a/drivers/staging/csr/csr_wifi_fsm_event.h b/drivers/staging/csr/csr_wifi_fsm_event.h
deleted file mode 100644
index 0690ca955ef5..000000000000
--- a/drivers/staging/csr/csr_wifi_fsm_event.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2011
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#ifndef CSR_WIFI_FSM_EVENT_H
-#define CSR_WIFI_FSM_EVENT_H
-
-#include "csr_prim_defs.h"
-#include "csr_sched.h"
-
-/**
- * @brief
- * FSM event header.
- *
- * @par Description
- * All events MUST have this struct as the FIRST member.
- * The next member is used internally for linked lists
- */
-typedef struct CsrWifiFsmEvent
-{
- CsrPrim type;
- u16 primtype;
- CsrSchedQid destination;
- CsrSchedQid source;
-
- /* Private pointer to allow an optimal Event list */
- /* NOTE: Ignore this pointer.
- * Do not waste code initializing OR freeing it.
- * The pointer is used internally in the CsrWifiFsm code
- * to avoid a second malloc when queuing events.
- */
- struct CsrWifiFsmEvent *next;
-} CsrWifiFsmEvent;
-
-#endif /* CSR_WIFI_FSM_EVENT_H */
-
diff --git a/drivers/staging/csr/csr_wifi_fsm_types.h b/drivers/staging/csr/csr_wifi_fsm_types.h
deleted file mode 100644
index d21c60a81fcf..000000000000
--- a/drivers/staging/csr/csr_wifi_fsm_types.h
+++ /dev/null
@@ -1,430 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2011
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#ifndef CSR_WIFI_FSM_TYPES_H
-#define CSR_WIFI_FSM_TYPES_H
-
-#include <linux/types.h>
-#include "csr_macro.h"
-#include "csr_sched.h"
-
-#ifdef CSR_WIFI_FSM_MUTEX_ENABLE
-#include "csr_framework_ext.h"
-#endif
-
-#include "csr_wifi_fsm.h"
-
-#define CSR_WIFI_FSM_MAX_TRANSITION_HISTORY 10
-
-/**
- * @brief
- * FSM event list header.
- *
- * @par Description
- * Singly linked list of events.
- */
-typedef struct CsrWifiFsmEventList
-{
- CsrWifiFsmEvent *first;
- CsrWifiFsmEvent *last;
-} CsrWifiFsmEventList;
-
-
-/**
- * @brief
- * FSM timer id.
- *
- * @par Description
- * Composite Id made up of the type, dest and a unique id so
- * CsrWifiFsmRemoveTimer knows where to look when removing the timer
- */
-typedef struct CsrWifiFsmTimerId
-{
- CsrPrim type;
- u16 primtype;
- CsrSchedQid destination;
- u16 uniqueid;
-} CsrWifiFsmTimerId;
-
-/**
- * @brief
- * FSM timer header.
- *
- * @par Description
- * All timer MUST have this struct as the FIRST member.
- * The first members of the structure MUST remain compatable
- * with the CsrWifiFsmEvent so that timers are just specialised events
- */
-typedef struct CsrWifiFsmTimer
-{
- CsrPrim type;
- u16 primtype;
- CsrSchedQid destination;
- CsrSchedQid source;
-
- /* Private pointer to allow an optimal Event list */
- struct CsrWifiFsmTimer *next;
-
- CsrWifiFsmTimerId timerid;
- u32 timeoutTimeMs;
-} CsrWifiFsmTimer;
-
-
-/**
- * @brief
- * Fsm Alien Event
- *
- * @par Description
- * Allows the wrapping of alien events that do not use CsrWifiFsmEvent
- * as the first member of the Event struct
- */
-typedef struct
-{
- CsrWifiFsmEvent event;
- void *alienEvent;
-} CsrWifiFsmAlienEvent;
-
-
-/**
- * @brief
- * FSM timer list header.
- *
- * @par Description
- * Singly linked list of timers.
- */
-typedef struct CsrWifiFsmTimerList
-{
- CsrWifiFsmTimer *first;
- CsrWifiFsmTimer *last;
- u16 nexttimerid;
-} CsrWifiFsmTimerList;
-
-/**
- * @brief
- * Process Entry Function Pointer
- *
- * @par Description
- * Defines the entry function for a processes.
- * Called at process initialisation.
- *
- * @param[in] context : FSM context
- *
- * @return
- * void
- */
-typedef void (*CsrWifiFsmProcEntryFnPtr)(CsrWifiFsmContext *context);
-
-/**
- * @brief
- * Process Transition Function Pointer
- *
- * @par Description
- * Defines a transition function for a processes.
- * Called when an event causes a transition on a process
- *
- * @param[in] CsrWifiFsmContext* : FSM context
- * @param[in] void* : FSM data (can be NULL)
- * @param[in] const CsrWifiFsmEvent* : event to process
- *
- * @return
- * void
- */
-typedef void (*CsrWifiFsmTransitionFnPtr)(CsrWifiFsmContext *context, void *fsmData, const CsrWifiFsmEvent *event);
-
-/**
- * @brief
- * Process reset/shutdown Function Pointer
- *
- * @par Description
- * Defines the reset/shutdown function for a processes.
- * Called to reset or shutdown an fsm.
- *
- * @param[in] context : FSM context
- *
- * @return
- * void
- */
-typedef void (*CsrWifiFsmProcResetFnPtr)(CsrWifiFsmContext *context);
-
-/**
- * @brief
- * FSM Default Destination CallbackFunction Pointer
- *
- * @par Description
- * Defines the default destination function for the FSM
- * to call when an event does not have a valid destination.
- * This
- *
- * @param[in] context : External context
- *
- * @return
- * u16 a valid destination OR CSR_WIFI_FSM_ENV
- */
-typedef u16 (*CsrWifiFsmDestLookupCallbackPtr)(void *context, const CsrWifiFsmEvent *event);
-
-
-#ifdef CSR_WIFI_FSM_DUMP_ENABLE
-/**
- * @brief
- * Trace Dump Function Pointer
- *
- * @par Description
- * Called when we want to trace the FSM
- *
- * @param[in] context : FSM context
- * @param[in] id : fsm id
- *
- * @return
- * void
- */
-typedef void (*CsrWifiFsmDumpFnPtr)(CsrWifiFsmContext *context, void *fsmData);
-#endif
-
-/**
- * @brief
- * Event ID to transition function entry
- *
- * @par Description
- * Event ID to Transition Entry in a state table.
- */
-typedef struct
-{
- u32 eventid;
- CsrWifiFsmTransitionFnPtr transition;
-#ifdef CSR_LOG_ENABLE
- const char *transitionName;
-#endif
-} CsrWifiFsmEventEntry;
-
-/**
- * @brief
- * Single State's Transition Table
- *
- * @par Description
- * Stores Data for a single State's event to
- * transition functions mapping
- */
-typedef struct
-{
- const u8 numEntries;
- const u8 saveAll;
- const CsrWifiFsmEventEntry *eventEntryArray; /* array of transition function pointers for state */
-#ifdef CSR_LOG_ENABLE
- u16 stateNumber;
- const char *stateName;
-#endif
-} CsrWifiFsmTableEntry;
-
-/**
- * @brief
- * Process State Transtion table
- *
- * @par Description
- * Stores Data for a processes State to transition table
- */
-typedef struct
-{
- u16 numStates; /* number of states */
- const CsrWifiFsmTableEntry *aStateEventMatrix; /* state event matrix */
-} CsrWifiFsmTransitionFunctionTable;
-
-/**
- * @brief
- * Const Process definition
- *
- * @par Description
- * Constant process specification.
- * This is ALL the non dynamic data that defines
- * a process.
- */
-typedef struct
-{
- const char *processName;
- const u32 processId;
- const CsrWifiFsmTransitionFunctionTable transitionTable;
- const CsrWifiFsmTableEntry unhandledTransitions;
- const CsrWifiFsmTableEntry ignoreFunctions;
- const CsrWifiFsmProcEntryFnPtr entryFn;
- const CsrWifiFsmProcResetFnPtr resetFn;
-#ifdef CSR_WIFI_FSM_DUMP_ENABLE
- const CsrWifiFsmDumpFnPtr dumpFn; /* Called to dump fsm specific trace if not NULL */
-#endif
-} CsrWifiFsmProcessStateMachine;
-
-#ifdef CSR_WIFI_FSM_DUMP_ENABLE
-/**
- * @brief
- * Storage for state transition info
- */
-typedef struct
-{
- u16 transitionNumber;
- CsrWifiFsmEvent event;
- u16 fromState;
- u16 toState;
- CsrWifiFsmTransitionFnPtr transitionFn;
- u16 transitionCount; /* number consecutive of times this transition was seen */
-#ifdef CSR_LOG_ENABLE
- const char *transitionName;
-#endif
-} CsrWifiFsmTransitionRecord;
-
-/**
- * @brief
- * Storage for the last state X transitions
- */
-typedef struct
-{
- u16 numTransitions;
- CsrWifiFsmTransitionRecord records[CSR_WIFI_FSM_MAX_TRANSITION_HISTORY];
-} CsrWifiFsmTransitionRecords;
-#endif
-
-/**
- * @brief
- * Dynamic Process data
- *
- * @par Description
- * Dynamic process data that is used to keep track of the
- * state and data for a process instance
- */
-typedef struct
-{
- const CsrWifiFsmProcessStateMachine *fsmInfo; /* state machine info that is constant regardless of context */
- u16 instanceId; /* Runtime process id */
- u16 state; /* Current state */
- void *params; /* Instance user data */
- CsrWifiFsmEventList savedEventQueue; /* The saved event queue */
- struct CsrWifiFsmInstanceEntry *subFsm; /* Sub Fsm instance data */
- struct CsrWifiFsmInstanceEntry *subFsmCaller; /* The Fsm instance that created the SubFsm and should be used for callbacks*/
-#ifdef CSR_WIFI_FSM_DUMP_ENABLE
- CsrWifiFsmTransitionRecords transitionRecords; /* Last X transitions in the FSM */
-#endif
-} CsrWifiFsmInstanceEntry;
-
-/**
- * @brief
- * OnCreate Callback Function Pointer
- *
- * @par Description
- * Called when an fsm is created.
- *
- * @param[in] extContext : External context
- * @param[in] instance : FSM instance
- *
- * @return
- * void
- */
-typedef void (*CsrWifiFsmOnCreateFnPtr)(void *extContext, const CsrWifiFsmInstanceEntry *instance);
-
-/**
- * @brief
- * OnTransition Callback Function Pointer
- *
- * @par Description
- * Called when an event is processed by a fsm
- *
- * @param[in] extContext : External context
- * @param[in] eventEntryArray : Entry data
- * @param[in] event : Event
- *
- * @return
- * void
- */
-typedef void (*CsrWifiFsmOnTransitionFnPtr)(void *extContext, const CsrWifiFsmEventEntry *eventEntryArray, const CsrWifiFsmEvent *event);
-
-/**
- * @brief
- * OnStateChange Callback Function Pointer
- *
- * @par Description
- * Called when CsrWifiFsmNextState is called
- *
- * @param[in] extContext : External context
- *
- * @return
- * void
- */
-typedef void (*CsrWifiFsmOnStateChangeFnPtr)(void *extContext, u16 nextstate);
-
-/**
- * @brief
- * OnIgnore,OnError or OnInvalid Callback Function Pointer
- *
- * @par Description
- * Called when an event is processed by a fsm
- *
- * @param[in] extContext : External context
- * @param[in] event : Event
- *
- * @return
- * void
- */
-typedef void (*CsrWifiFsmOnEventFnPtr)(void *extContext, const CsrWifiFsmEvent *event);
-
-/**
- * @brief
- * Toplevel FSM context data
- *
- * @par Description
- * Holds ALL FSM static and dynamic data for a FSM
- */
-struct CsrWifiFsmContext
-{
- CsrWifiFsmEventList eventQueue; /* The internal event queue */
- CsrWifiFsmEventList externalEventQueue; /* The external event queue */
-#ifdef CSR_WIFI_FSM_MUTEX_ENABLE
- CsrMutexHandle externalEventQueueLock; /* The external event queue mutex */
-#endif
- u32 timeOffset; /* Amount to adjust the TimeOfDayMs by */
- CsrWifiFsmTimerList timerQueue; /* The internal timer queue */
- u8 useTempSaveList; /* Should the temp save list be used */
- CsrWifiFsmEventList tempSaveList; /* The temp save event queue */
- CsrWifiFsmEvent *eventForwardedOrSaved; /* The event that was forwarded or Saved */
- u16 maxProcesses; /* Size of instanceArray */
- u16 numProcesses; /* Current number allocated in instanceArray */
- CsrWifiFsmInstanceEntry *instanceArray; /* Array of processes for this component */
- CsrWifiFsmInstanceEntry *ownerInstance; /* The Process that owns currentInstance (SubFsm support) */
- CsrWifiFsmInstanceEntry *currentInstance; /* Current Process that is executing */
- CsrWifiFsmExternalWakupCallbackPtr externalEventFn; /* External event Callback */
- CsrWifiFsmOnEventFnPtr appIgnoreCallback; /* Application Ignore event Callback */
- CsrWifiFsmDestLookupCallbackPtr appEvtDstCallback; /* Application Lookup event Destination Function*/
-
- void *applicationContext; /* Internal fsm application context */
- void *externalContext; /* External context (set by the user of the fsm)*/
- CsrLogTextTaskId loggingTaskId; /* Task Id to use in any logging output */
-
-#ifndef CSR_WIFI_FSM_SCHEDULER_DISABLED
- CsrSchedTid schedTimerId; /* Scheduler TimerId for use in Scheduler Tasks */
- u32 schedTimerNexttimeoutMs; /* Next timeout time for the current timer */
-#endif
-
-#ifdef CSR_WIFI_FSM_MUTEX_ENABLE
-#ifdef CSR_WIFI_FSM_TRANSITION_LOCK
- CsrMutexHandle transitionLock; /* Lock when calling transition functions */
-#endif
-#endif
-
-#ifdef CSR_LOG_ENABLE
- CsrWifiFsmOnCreateFnPtr onCreate; /* Debug Transition Callback */
- CsrWifiFsmOnTransitionFnPtr onTransition; /* Debug Transition Callback */
- CsrWifiFsmOnTransitionFnPtr onUnhandedCallback; /* Unhanded event Callback */
- CsrWifiFsmOnStateChangeFnPtr onStateChange; /* Debug State Change Callback */
- CsrWifiFsmOnEventFnPtr onIgnoreCallback; /* Ignore event Callback */
- CsrWifiFsmOnEventFnPtr onSaveCallback; /* Save event Callback */
- CsrWifiFsmOnEventFnPtr onErrorCallback; /* Error event Callback */
- CsrWifiFsmOnEventFnPtr onInvalidCallback; /* Invalid event Callback */
-#endif
-#ifdef CSR_WIFI_FSM_DUMP_ENABLE
- u16 masterTransitionNumber; /* Increments on every transition */
-#endif
-};
-
-#endif /* CSR_WIFI_FSM_TYPES_H */
diff --git a/drivers/staging/csr/csr_wifi_hip_card.h b/drivers/staging/csr/csr_wifi_hip_card.h
deleted file mode 100644
index bd47f606e0de..000000000000
--- a/drivers/staging/csr/csr_wifi_hip_card.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2012
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-/*
- ******************************************************************************
- * FILE : csr_wifi_hip_card.h
- *
- * PURPOSE : Defines abstract interface for hardware specific functions.
- * Note, this is a different file from one of the same name in the
- * Windows driver.
- *
- *****************************************************************************
- */
-#ifndef __CARD_H__
-#define __CARD_H__
-
-#include "csr_wifi_hip_card_sdio.h"
-#include "csr_wifi_hip_signals.h"
-#include "csr_wifi_hip_unifi_udi.h"
-
-
-/*****************************************************************************
- * CardEnableInt -
- */
-CsrResult CardEnableInt(card_t *card);
-
-/*****************************************************************************
- * CardGenInt -
- */
-CsrResult CardGenInt(card_t *card);
-
-/*****************************************************************************
- * CardPendingInt -
- */
-CsrResult CardPendingInt(card_t *card, u8 *pintr);
-
-/*****************************************************************************
- * CardDisableInt -
- */
-CsrResult CardDisableInt(card_t *card);
-
-/*****************************************************************************
- * CardClearInt -
- */
-CsrResult CardClearInt(card_t *card);
-
-/*****************************************************************************
- * CardDisable -
- */
-void CardDisable(card_t *card);
-
-/*****************************************************************************
- * CardIntEnabled -
- */
-CsrResult CardIntEnabled(card_t *card, u8 *enabled);
-
-/*****************************************************************************
- * CardGetDataSlotSize
- */
-u16 CardGetDataSlotSize(card_t *card);
-
-/*****************************************************************************
- * CardWriteBulkData -
- */
-CsrResult CardWriteBulkData(card_t *card, card_signal_t *csptr, unifi_TrafficQueue queue);
-
-
-/*****************************************************************************
- * CardClearFromHostDataSlot -
- */
-void CardClearFromHostDataSlot(card_t *card, const s16 aSlotNum);
-
-#ifdef CSR_WIFI_REQUEUE_PACKET_TO_HAL
-/*****************************************************************************
- * CardClearFromHostDataSlotWithoutFreeingBulkData - Clear the data stot
- * without freeing the bulk data
- */
-
-void CardClearFromHostDataSlotWithoutFreeingBulkData(card_t *card, const s16 aSlotNum);
-#endif
-
-/*****************************************************************************
- * CardGetFreeFromHostDataSlots -
- */
-u16 CardGetFreeFromHostDataSlots(card_t *card);
-
-u16 CardAreAllFromHostDataSlotsEmpty(card_t *card);
-
-CsrResult card_start_processor(card_t *card, enum unifi_dbg_processors_select which);
-
-CsrResult card_wait_for_firmware_to_start(card_t *card, u32 *paddr);
-
-CsrResult unifi_dl_firmware(card_t *card, void *arg);
-CsrResult unifi_dl_patch(card_t *card, void *arg, u32 boot_ctrl);
-CsrResult unifi_do_loader_op(card_t *card, u32 op_addr, u8 opcode);
-void* unifi_dl_fw_read_start(card_t *card, s8 is_fw);
-
-CsrResult unifi_coredump_handle_request(card_t *card);
-
-CsrResult ConvertCsrSdioToCsrHipResult(card_t *card, CsrResult csrResult);
-#ifdef CSR_WIFI_HIP_DEBUG_OFFLINE
-void unifi_debug_log_to_buf(const char *fmt, ...);
-void unifi_debug_string_to_buf(const char *str);
-void unifi_debug_hex_to_buf(const char *buff, u16 length);
-#endif
-
-#endif /* __CARD_H__ */
diff --git a/drivers/staging/csr/csr_wifi_hip_card_sdio.c b/drivers/staging/csr/csr_wifi_hip_card_sdio.c
deleted file mode 100644
index d5425325894c..000000000000
--- a/drivers/staging/csr/csr_wifi_hip_card_sdio.c
+++ /dev/null
@@ -1,4001 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2012
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-/*
- * ---------------------------------------------------------------------------
- * FILE: csr_wifi_hip_card_sdio.c
- *
- * PURPOSE: Implementation of the Card API for SDIO.
- *
- * NOTES:
- * CardInit() is called from the SDIO probe callback when a card is
- * inserted. This performs the basic SDIO initialisation, enabling i/o
- * etc.
- *
- * ---------------------------------------------------------------------------
- */
-#include <linux/slab.h>
-#include "csr_wifi_hip_unifi.h"
-#include "csr_wifi_hip_conversions.h"
-#include "csr_wifi_hip_unifiversion.h"
-#include "csr_wifi_hip_card.h"
-#include "csr_wifi_hip_card_sdio.h"
-#include "csr_wifi_hip_chiphelper.h"
-
-
-/* Time to wait between attempts to read MAILBOX0 */
-#define MAILBOX1_TIMEOUT 10 /* in millisecs */
-#define MAILBOX1_ATTEMPTS 200 /* 2 seconds */
-
-#define MAILBOX2_TIMEOUT 5 /* in millisecs */
-#define MAILBOX2_ATTEMPTS 10 /* 50ms */
-
-#define RESET_SETTLE_DELAY 25 /* in millisecs */
-
-static CsrResult card_init_slots(card_t *card);
-static CsrResult card_hw_init(card_t *card);
-static CsrResult firmware_present_in_flash(card_t *card);
-static void bootstrap_chip_hw(card_t *card);
-static CsrResult unifi_reset_hardware(card_t *card);
-static CsrResult unifi_hip_init(card_t *card);
-static CsrResult card_access_panic(card_t *card);
-static CsrResult unifi_read_chip_version(card_t *card);
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_alloc_card
- *
- * Allocate and initialise the card context structure.
- *
- * Arguments:
- * sdio Pointer to SDIO context pointer to pass to low
- * level i/o functions.
- * ospriv Pointer to O/S private struct to pass when calling
- * callbacks to the higher level system.
- *
- * Returns:
- * Pointer to card struct, which represents the driver context or
- * NULL if the allocation failed.
- * ---------------------------------------------------------------------------
- */
-card_t* unifi_alloc_card(CsrSdioFunction *sdio, void *ospriv)
-{
- card_t *card;
- u32 i;
-
-
- card = kzalloc(sizeof(card_t), GFP_KERNEL);
- if (card == NULL)
- {
- return NULL;
- }
-
- card->sdio_if = sdio;
- card->ospriv = ospriv;
-
- card->unifi_interrupt_seq = 1;
-
- /* Make these invalid. */
- card->proc_select = (u32)(-1);
- card->dmem_page = (u32)(-1);
- card->pmem_page = (u32)(-1);
-
- card->bh_reason_host = 0;
- card->bh_reason_unifi = 0;
-
- for (i = 0; i < sizeof(card->tx_q_paused_flag) / sizeof(card->tx_q_paused_flag[0]); i++)
- {
- card->tx_q_paused_flag[i] = 0;
- }
- card->memory_resources_allocated = 0;
-
- card->low_power_mode = UNIFI_LOW_POWER_DISABLED;
- card->periodic_wake_mode = UNIFI_PERIODIC_WAKE_HOST_DISABLED;
-
- card->host_state = UNIFI_HOST_STATE_AWAKE;
- card->intmode = CSR_WIFI_INTMODE_DEFAULT;
-
- /*
- * Memory resources for buffers are allocated when the chip is initialised
- * because we need configuration information from the firmware.
- */
-
- /*
- * Initialise wait queues and lists
- */
- card->fh_command_queue.q_body = card->fh_command_q_body;
- card->fh_command_queue.q_length = UNIFI_SOFT_COMMAND_Q_LENGTH;
-
- for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
- {
- card->fh_traffic_queue[i].q_body = card->fh_traffic_q_body[i];
- card->fh_traffic_queue[i].q_length = UNIFI_SOFT_TRAFFIC_Q_LENGTH;
- }
-
-
- /* Initialise mini-coredump pointers in case no coredump buffers
- * are requested by the OS layer.
- */
- card->request_coredump_on_reset = 0;
- card->dump_next_write = NULL;
- card->dump_cur_read = NULL;
- card->dump_buf = NULL;
-
-#ifdef UNIFI_DEBUG
- /* Determine offset of LSB in pointer for later alignment sanity check.
- * Synergy integer types have specific widths, which cause compiler
- * warnings when casting pointer types, e.g. on 64-bit systems.
- */
- {
- u32 val = 0x01234567;
-
- if (*((u8 *)&val) == 0x01)
- {
- card->lsb = sizeof(void *) - 1; /* BE */
- }
- else
- {
- card->lsb = 0; /* LE */
- }
- }
-#endif
- return card;
-} /* unifi_alloc_card() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_init_card
- *
- * Reset the hardware and perform HIP initialization
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * CsrResult code
- * CSR_RESULT_SUCCESS if successful
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_init_card(card_t *card, s32 led_mask)
-{
- CsrResult r;
-
-
- if (card == NULL)
- {
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- r = unifi_init(card);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- r = unifi_hip_init(card);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to start host protocol.\n");
- return r;
- }
-
- return CSR_RESULT_SUCCESS;
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_init
- *
- * Init the hardware.
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * CsrResult code
- * CSR_RESULT_SUCCESS if successful
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_init(card_t *card)
-{
- CsrResult r;
- CsrResult csrResult;
-
- if (card == NULL)
- {
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- /*
- * Disable the SDIO interrupts while initialising UniFi.
- * Re-enable them when f/w is running.
- */
- csrResult = CsrSdioInterruptDisable(card->sdio_if);
- if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
- {
- return CSR_WIFI_HIP_RESULT_NO_DEVICE;
- }
-
- /*
- * UniFi's PLL may start with a slow clock (~ 1 MHz) so initially
- * set the SDIO bus clock to a similar value or SDIO accesses may
- * fail.
- */
- csrResult = CsrSdioMaxBusClockFrequencySet(card->sdio_if, UNIFI_SDIO_CLOCK_SAFE_HZ);
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- r = ConvertCsrSdioToCsrHipResult(card, csrResult);
- return r;
- }
- card->sdio_clock_speed = UNIFI_SDIO_CLOCK_SAFE_HZ;
-
- /*
- * Reset UniFi. Note, this only resets the WLAN function part of the chip,
- * the SDIO interface is not reset.
- */
- unifi_trace(card->ospriv, UDBG1, "Resetting UniFi\n");
- r = unifi_reset_hardware(card);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to reset UniFi\n");
- return r;
- }
-
- /* Reset the power save mode, to be active until the MLME-reset is complete */
- r = unifi_configure_low_power_mode(card,
- UNIFI_LOW_POWER_DISABLED, UNIFI_PERIODIC_WAKE_HOST_DISABLED);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to set power save mode\n");
- return r;
- }
-
- /*
- * Set initial value of page registers.
- * The page registers will be maintained by unifi_read...() and
- * unifi_write...().
- */
- card->proc_select = (u32)(-1);
- card->dmem_page = (u32)(-1);
- card->pmem_page = (u32)(-1);
- r = unifi_write_direct16(card, ChipHelper_HOST_WINDOW3_PAGE(card->helper) * 2, 0);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to write SHARED_DMEM_PAGE\n");
- return r;
- }
- r = unifi_write_direct16(card, ChipHelper_HOST_WINDOW2_PAGE(card->helper) * 2, 0);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to write PROG_MEM2_PAGE\n");
- return r;
- }
-
- /*
- * If the driver has reset UniFi due to previous SDIO failure, this may
- * have been due to a chip watchdog reset. In this case, the driver may
- * have requested a mini-coredump which needs to be captured now the
- * SDIO interface is alive.
- */
- (void)unifi_coredump_handle_request(card);
-
- /*
- * Probe to see if the UniFi has ROM/flash to boot from. CSR6xxx should do.
- */
- r = firmware_present_in_flash(card);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r == CSR_WIFI_HIP_RESULT_NOT_FOUND)
- {
- unifi_error(card->ospriv, "No firmware found\n");
- }
- else if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Probe for Flash failed\n");
- }
-
- return r;
-} /* unifi_init() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_download
- *
- * Load the firmware.
- *
- * Arguments:
- * card Pointer to card struct
- * led_mask Loader LED mask
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success
- * CsrResult error code on failure.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_download(card_t *card, s32 led_mask)
-{
- CsrResult r;
- void *dlpriv;
-
- if (card == NULL)
- {
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- /* Set the loader led mask */
- card->loader_led_mask = led_mask;
-
- /* Get the firmware file information */
- unifi_trace(card->ospriv, UDBG1, "downloading firmware...\n");
-
- dlpriv = unifi_dl_fw_read_start(card, UNIFI_FW_STA);
- if (dlpriv == NULL)
- {
- return CSR_WIFI_HIP_RESULT_NOT_FOUND;
- }
-
- /* Download the firmware. */
- r = unifi_dl_firmware(card, dlpriv);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to download firmware\n");
- return r;
- }
-
- /* Free the firmware file information. */
- unifi_fw_read_stop(card->ospriv, dlpriv);
-
- return CSR_RESULT_SUCCESS;
-} /* unifi_download() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_hip_init
- *
- * This function performs the f/w initialisation sequence as described
- * in the Unifi Host Interface Protocol Specification.
- * It allocates memory for host-side slot data and signal queues.
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success or else a CSR error code
- *
- * Notes:
- * The firmware must have been downloaded.
- * ---------------------------------------------------------------------------
- */
-static CsrResult unifi_hip_init(card_t *card)
-{
- CsrResult r;
- CsrResult csrResult;
-
- r = card_hw_init(card);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to establish communication with UniFi\n");
- return r;
- }
-#ifdef CSR_PRE_ALLOC_NET_DATA
- /* if there is any preallocated netdata left from the prev session free it now */
- prealloc_netdata_free(card);
-#endif
- /*
- * Allocate memory for host-side slot data and signal queues.
- * We need the config info read from the firmware to know how much
- * memory to allocate.
- */
- r = card_init_slots(card);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Init slots failed: %d\n", r);
- return r;
- }
-
- unifi_trace(card->ospriv, UDBG2, "Sending first UniFi interrupt\n");
-
- r = unifi_set_host_state(card, UNIFI_HOST_STATE_AWAKE);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- /* Enable the SDIO interrupts now that the f/w is running. */
- csrResult = CsrSdioInterruptEnable(card->sdio_if);
- if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
- {
- return CSR_WIFI_HIP_RESULT_NO_DEVICE;
- }
-
- /* Signal the UniFi to start handling messages */
- r = CardGenInt(card);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- return CSR_RESULT_SUCCESS;
-} /* unifi_hip_init() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * _build_sdio_config_data
- *
- * Unpack the SDIO configuration information from a buffer read from
- * UniFi into a host structure.
- * The data is byte-swapped for a big-endian host if necessary by the
- * UNPACK... macros.
- *
- * Arguments:
- * card Pointer to card struct
- * cfg_data Destination structure to unpack into.
- * cfg_data_buf Source buffer to read from. This should be the raw
- * data read from UniFi.
- *
- * Returns:
- * None.
- * ---------------------------------------------------------------------------
- */
-static void _build_sdio_config_data(sdio_config_data_t *cfg_data,
- const u8 *cfg_data_buf)
-{
- s16 offset = 0;
-
- cfg_data->version = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
- offset += SIZEOF_UINT16;
-
- cfg_data->sdio_ctrl_offset = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
- offset += SIZEOF_UINT16;
-
- cfg_data->fromhost_sigbuf_handle = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
- offset += SIZEOF_UINT16;
-
- cfg_data->tohost_sigbuf_handle = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
- offset += SIZEOF_UINT16;
-
- cfg_data->num_fromhost_sig_frags = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
- offset += SIZEOF_UINT16;
-
- cfg_data->num_tohost_sig_frags = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
- offset += SIZEOF_UINT16;
-
- cfg_data->num_fromhost_data_slots = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
- offset += SIZEOF_UINT16;
-
- cfg_data->num_tohost_data_slots = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
- offset += SIZEOF_UINT16;
-
- cfg_data->data_slot_size = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
- offset += SIZEOF_UINT16;
-
- cfg_data->initialised = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
- offset += SIZEOF_UINT16;
-
- cfg_data->overlay_size = CSR_GET_UINT32_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
- offset += SIZEOF_UINT32;
-
- cfg_data->data_slot_round = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
- offset += SIZEOF_UINT16;
-
- cfg_data->sig_frag_size = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
- offset += SIZEOF_UINT16;
-
- cfg_data->tohost_signal_padding = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
-} /* _build_sdio_config_data() */
-
-
-/*
- * - Function ----------------------------------------------------------------
- * card_hw_init()
- *
- * Perform the initialisation procedure described in the UniFi Host
- * Interface Protocol document (section 3.3.8) and read the run-time
- * configuration information from the UniFi. This is stuff like number
- * of bulk data slots etc.
- *
- * The card enumeration and SD initialisation has already been done by
- * the SDIO library, see card_sdio_init().
- *
- * The initialisation is done when firmware is ready, i.e. this may need
- * to be called after a f/w download operation.
- *
- * The initialisation procedure goes like this:
- * - Wait for UniFi to start-up by polling SHARED_MAILBOX1
- * - Find the symbol table and look up SLT_SDIO_SLOT_CONFIG
- * - Read the config structure
- * - Check the "SDIO initialised" flag, if not zero do a h/w reset and
- * start again
- * - Decide the number of bulk data slots to allocate, allocate them and
- * set "SDIO initialised" flag (and generate an interrupt) to say so.
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * CSR_RESULT_SUCEESS on success,
- * a CSR error code on failure
- *
- * Notes:
- * All data in the f/w is stored in a little endian format, without any
- * padding bytes. Every read from this memory has to be transformed in
- * host (cpu specific) format, before it is stored in driver's parameters
- * or/and structures. Athough unifi_card_read16() and unifi_read32() do perform
- * the conversion internally, unifi_readn() does not.
- * ---------------------------------------------------------------------------
- */
-static CsrResult card_hw_init(card_t *card)
-{
- u32 slut_address;
- u16 initialised;
- u16 finger_print;
- symbol_t slut;
- sdio_config_data_t *cfg_data;
- u8 cfg_data_buf[SDIO_CONFIG_DATA_SIZE];
- CsrResult r;
- void *dlpriv;
- s16 major, minor;
- s16 search_4slut_again;
- CsrResult csrResult;
-
- /*
- * The device revision from the TPLMID_MANF and TPLMID_CARD fields
- * of the CIS are available as
- * card->sdio_if->pDevice->ManfID
- * card->sdio_if->pDevice->AppID
- */
-
- /*
- * Run in a loop so we can patch.
- */
- do
- {
- /* Reset these each time around the loop. */
- search_4slut_again = 0;
- cfg_data = NULL;
-
- r = card_wait_for_firmware_to_start(card, &slut_address);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Firmware hasn't started\n");
- return r;
- }
- unifi_trace(card->ospriv, UDBG4, "SLUT addr 0x%lX\n", slut_address);
-
- /*
- * Firmware has started, but doesn't know full clock configuration yet
- * as some of the information may be in the MIB. Therefore we set an
- * initial SDIO clock speed, faster than UNIFI_SDIO_CLOCK_SAFE_HZ, for
- * the patch download and subsequent firmware initialisation, and
- * full speed UNIFI_SDIO_CLOCK_MAX_HZ will be set once the f/w tells us
- * that it is ready.
- */
- csrResult = CsrSdioMaxBusClockFrequencySet(card->sdio_if, UNIFI_SDIO_CLOCK_INIT_HZ);
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- r = ConvertCsrSdioToCsrHipResult(card, csrResult);
- return r;
- }
- card->sdio_clock_speed = UNIFI_SDIO_CLOCK_INIT_HZ;
-
- /*
- * Check the SLUT fingerprint.
- * The slut_address is a generic pointer so we must use unifi_card_read16().
- */
- unifi_trace(card->ospriv, UDBG4, "Looking for SLUT finger print\n");
- finger_print = 0;
- r = unifi_card_read16(card, slut_address, &finger_print);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read SLUT finger print\n");
- return r;
- }
-
- if (finger_print != SLUT_FINGERPRINT)
- {
- unifi_error(card->ospriv, "Failed to find Symbol lookup table fingerprint\n");
- return CSR_RESULT_FAILURE;
- }
-
- /* Symbol table starts imedately after the fingerprint */
- slut_address += 2;
-
- /* Search the table until either the end marker is found, or the
- * loading of patch firmware invalidates the current table.
- */
- while (!search_4slut_again)
- {
- u16 s;
- u32 l;
-
- r = unifi_card_read16(card, slut_address, &s);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
- slut_address += 2;
-
- if (s == CSR_SLT_END)
- {
- unifi_trace(card->ospriv, UDBG3, " found CSR_SLT_END\n");
- break;
- }
-
- r = unifi_read32(card, slut_address, &l);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
- slut_address += 4;
-
- slut.id = s;
- slut.obj = l;
-
- unifi_trace(card->ospriv, UDBG3, " found SLUT id %02d.%08lx\n", slut.id, slut.obj);
- switch (slut.id)
- {
- case CSR_SLT_SDIO_SLOT_CONFIG:
- cfg_data = &card->config_data;
- /*
- * unifi_card_readn reads n bytes from the card, where data is stored
- * in a little endian format, without any padding bytes. So, we
- * can not just pass the cfg_data pointer or use the
- * sizeof(sdio_config_data_t) since the structure in the host can
- * be big endian formatted or have padding bytes for alignment.
- * We use a char buffer to read the data from the card.
- */
- r = unifi_card_readn(card, slut.obj, cfg_data_buf, SDIO_CONFIG_DATA_SIZE);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read config data\n");
- return r;
- }
- /* .. and then we copy the data to the host structure */
- _build_sdio_config_data(cfg_data, cfg_data_buf);
-
- /* Make sure the from host data slots are what we expect
- we reserve 2 for commands and there should be at least
- 1 left for each access category */
- if ((cfg_data->num_fromhost_data_slots < UNIFI_RESERVED_COMMAND_SLOTS)
- || (cfg_data->num_fromhost_data_slots - UNIFI_RESERVED_COMMAND_SLOTS) / UNIFI_NO_OF_TX_QS == 0)
- {
- unifi_error(card->ospriv, "From host data slots %d\n", cfg_data->num_fromhost_data_slots);
- unifi_error(card->ospriv, "need to be (queues * x + 2) (UNIFI_RESERVED_COMMAND_SLOTS for commands)\n");
- return CSR_RESULT_FAILURE;
- }
-
- /* Configure SDIO to-block-size padding */
- if (card->sdio_io_block_pad)
- {
- /*
- * Firmware limits the maximum padding size via data_slot_round.
- * Therefore when padding to whole block sizes, the block size
- * must be configured correctly by adjusting CSR_WIFI_HIP_SDIO_BLOCK_SIZE.
- */
- if (cfg_data->data_slot_round < card->sdio_io_block_size)
- {
- unifi_error(card->ospriv,
- "Configuration error: Block size of %d exceeds f/w data_slot_round of %d\n",
- card->sdio_io_block_size, cfg_data->data_slot_round);
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- /*
- * To force the To-Host signals to be rounded up to the SDIO block
- * size, we need to write the To-Host Signal Padding Fragments
- * field of the SDIO configuration in UniFi.
- */
- if ((card->sdio_io_block_size % cfg_data->sig_frag_size) != 0)
- {
- unifi_error(card->ospriv, "Configuration error: Can not pad to-host signals.\n");
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
- cfg_data->tohost_signal_padding = (u16) (card->sdio_io_block_size / cfg_data->sig_frag_size);
- unifi_info(card->ospriv, "SDIO block size %d requires %d padding chunks\n",
- card->sdio_io_block_size, cfg_data->tohost_signal_padding);
- r = unifi_card_write16(card, slut.obj + SDIO_TO_HOST_SIG_PADDING_OFFSET, cfg_data->tohost_signal_padding);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to write To-Host Signal Padding Fragments\n");
- return r;
- }
- }
-
- /* Reconstruct the Generic Pointer address of the
- * SDIO Control Data Struct.
- */
- card->sdio_ctrl_addr = cfg_data->sdio_ctrl_offset | (UNIFI_SH_DMEM << 24);
- card->init_flag_addr = slut.obj + SDIO_INIT_FLAG_OFFSET;
- break;
-
- case CSR_SLT_BUILD_ID_NUMBER:
- {
- u32 n;
- r = unifi_read32(card, slut.obj, &n);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read build id\n");
- return r;
- }
- card->build_id = n;
- }
- break;
-
- case CSR_SLT_BUILD_ID_STRING:
- r = unifi_readnz(card, slut.obj, card->build_id_string,
- sizeof(card->build_id_string));
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read build string\n");
- return r;
- }
- break;
-
- case CSR_SLT_PERSISTENT_STORE_DB:
- break;
-
- case CSR_SLT_BOOT_LOADER_CONTROL:
-
- /* This command copies most of the station firmware
- * image from ROM into program RAM. It also clears
- * out the zerod data and sets up the initialised
- * data. */
- r = unifi_do_loader_op(card, slut.obj + 6, UNIFI_BOOT_LOADER_LOAD_STA);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to write loader load image command\n");
- return r;
- }
-
- dlpriv = unifi_dl_fw_read_start(card, UNIFI_FW_STA);
-
- /* dlpriv might be NULL, we still need to do the do_loader_op step. */
- if (dlpriv != NULL)
- {
- /* Download the firmware. */
- r = unifi_dl_patch(card, dlpriv, slut.obj);
-
- /* Free the firmware file information. */
- unifi_fw_read_stop(card->ospriv, dlpriv);
-
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to patch firmware\n");
- return r;
- }
- }
-
- /* This command starts the firmware image that we want (the
- * station by default) with any patches required applied. */
- r = unifi_do_loader_op(card, slut.obj + 6, UNIFI_BOOT_LOADER_RESTART);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to write loader restart command\n");
- return r;
- }
-
- /* The now running patch f/w defines a new SLUT data structure -
- * the current one is no longer valid. We must drop out of the
- * processing loop and enumerate the new SLUT (which may appear
- * at a different offset).
- */
- search_4slut_again = 1;
- break;
-
- case CSR_SLT_PANIC_DATA_PHY:
- card->panic_data_phy_addr = slut.obj;
- break;
-
- case CSR_SLT_PANIC_DATA_MAC:
- card->panic_data_mac_addr = slut.obj;
- break;
-
- default:
- /* do nothing */
- break;
- }
- } /* while */
- } while (search_4slut_again);
-
- /* Did we find the Config Data ? */
- if (cfg_data == NULL)
- {
- unifi_error(card->ospriv, "Failed to find SDIO_SLOT_CONFIG Symbol\n");
- return CSR_RESULT_FAILURE;
- }
-
- /*
- * Has ths card already been initialised?
- * If so, return an error so we do a h/w reset and start again.
- */
- r = unifi_card_read16(card, card->init_flag_addr, &initialised);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read init flag at %08lx\n",
- card->init_flag_addr);
- return r;
- }
- if (initialised != 0)
- {
- return CSR_RESULT_FAILURE;
- }
-
-
- /*
- * Now check the UniFi firmware version
- */
- major = (cfg_data->version >> 8) & 0xFF;
- minor = cfg_data->version & 0xFF;
- unifi_info(card->ospriv, "UniFi f/w protocol version %d.%d (driver %d.%d)\n",
- major, minor,
- UNIFI_HIP_MAJOR_VERSION, UNIFI_HIP_MINOR_VERSION);
-
- unifi_info(card->ospriv, "Firmware build %u: %s\n",
- card->build_id, card->build_id_string);
-
- if (major != UNIFI_HIP_MAJOR_VERSION)
- {
- unifi_error(card->ospriv, "UniFi f/w protocol major version (%d) is different from driver (v%d.%d)\n",
- major, UNIFI_HIP_MAJOR_VERSION, UNIFI_HIP_MINOR_VERSION);
-#ifndef CSR_WIFI_DISABLE_HIP_VERSION_CHECK
- return CSR_RESULT_FAILURE;
-#endif
- }
- if (minor < UNIFI_HIP_MINOR_VERSION)
- {
- unifi_error(card->ospriv, "UniFi f/w protocol version (v%d.%d) is older than minimum required by driver (v%d.%d).\n",
- major, minor,
- UNIFI_HIP_MAJOR_VERSION, UNIFI_HIP_MINOR_VERSION);
-#ifndef CSR_WIFI_DISABLE_HIP_VERSION_CHECK
- return CSR_RESULT_FAILURE;
-#endif
- }
-
- /* Read panic codes from a previous firmware panic. If the firmware has
- * not panicked since power was applied (e.g. power-off hard reset)
- * the stored panic codes will not be updated.
- */
- unifi_read_panic(card);
-
- return CSR_RESULT_SUCCESS;
-} /* card_hw_init() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * card_wait_for_unifi_to_reset
- *
- * Waits for a reset to complete by polling the WLAN function enable
- * bit (which is cleared on reset).
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, CSR error code on failure.
- * ---------------------------------------------------------------------------
- */
-static CsrResult card_wait_for_unifi_to_reset(card_t *card)
-{
- s16 i;
- CsrResult r;
- u8 io_enable;
- CsrResult csrResult;
-
- r = CSR_RESULT_SUCCESS;
- for (i = 0; i < MAILBOX2_ATTEMPTS; i++)
- {
- unifi_trace(card->ospriv, UDBG1, "waiting for reset to complete, attempt %d\n", i);
- if (card->chip_id > SDIO_CARD_ID_UNIFI_2)
- {
- /* It's quite likely that this read will timeout for the
- * first few tries - especially if we have reset via
- * DBG_RESET.
- */
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- unifi_debug_log_to_buf("m0@%02X=", SDIO_IO_READY);
-#endif
- csrResult = CsrSdioF0Read8(card->sdio_if, SDIO_IO_READY, &io_enable);
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- unifi_debug_log_to_buf("error=%X\n", csrResult);
- }
- else
- {
- unifi_debug_log_to_buf("%X\n", io_enable);
- }
-#endif
- if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
- {
- return CSR_WIFI_HIP_RESULT_NO_DEVICE;
- }
- r = CSR_RESULT_SUCCESS;
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- r = ConvertCsrSdioToCsrHipResult(card, csrResult);
- }
- }
- else
- {
- r = sdio_read_f0(card, SDIO_IO_ENABLE, &io_enable);
- }
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r == CSR_RESULT_SUCCESS)
- {
- u16 mbox2;
- s16 enabled = io_enable & (1 << card->function);
-
- if (!enabled)
- {
- unifi_trace(card->ospriv, UDBG1,
- "Reset complete (function %d is disabled) in ~ %u msecs\n",
- card->function, i * MAILBOX2_TIMEOUT);
-
- /* Enable WLAN function and verify MAILBOX2 is zero'd */
- csrResult = CsrSdioFunctionEnable(card->sdio_if);
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- r = ConvertCsrSdioToCsrHipResult(card, csrResult);
- unifi_error(card->ospriv, "CsrSdioFunctionEnable failed %d\n", r);
- break;
- }
- }
-
- r = unifi_read_direct16(card, ChipHelper_SDIO_HIP_HANDSHAKE(card->helper) * 2, &mbox2);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "read HIP_HANDSHAKE failed %d\n", r);
- break;
- }
- if (mbox2 != 0)
- {
- unifi_error(card->ospriv, "MAILBOX2 non-zero after reset (mbox2 = %04x)\n", mbox2);
- r = CSR_RESULT_FAILURE;
- }
- break;
- }
- else
- {
- if (card->chip_id > SDIO_CARD_ID_UNIFI_2)
- {
- /* We ignore read failures for the first few reads,
- * they are probably benign. */
- if (i > MAILBOX2_ATTEMPTS / 4)
- {
- unifi_trace(card->ospriv, UDBG1, "Failed to read CCCR IO Ready register while polling for reset\n");
- }
- }
- else
- {
- unifi_trace(card->ospriv, UDBG1, "Failed to read CCCR IO Enable register while polling for reset\n");
- }
- }
- CsrThreadSleep(MAILBOX2_TIMEOUT);
- }
-
- if (r == CSR_RESULT_SUCCESS && i == MAILBOX2_ATTEMPTS)
- {
- unifi_trace(card->ospriv, UDBG1, "Timeout waiting for UniFi to complete reset\n");
- r = CSR_RESULT_FAILURE;
- }
-
- return r;
-} /* card_wait_for_unifi_to_reset() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * card_wait_for_unifi_to_disable
- *
- * Waits for the function to become disabled by polling the
- * IO_READY bit.
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, CSR error code on failure.
- *
- * Notes: This function can only be used with
- * card->chip_id > SDIO_CARD_ID_UNIFI_2
- * ---------------------------------------------------------------------------
- */
-static CsrResult card_wait_for_unifi_to_disable(card_t *card)
-{
- s16 i;
- CsrResult r;
- u8 io_enable;
- CsrResult csrResult;
-
- if (card->chip_id <= SDIO_CARD_ID_UNIFI_2)
- {
- unifi_error(card->ospriv,
- "Function reset method not supported for chip_id=%d\n",
- card->chip_id);
- return CSR_RESULT_FAILURE;
- }
-
- r = CSR_RESULT_SUCCESS;
- for (i = 0; i < MAILBOX2_ATTEMPTS; i++)
- {
- unifi_trace(card->ospriv, UDBG1, "waiting for disable to complete, attempt %d\n", i);
-
- /*
- * It's quite likely that this read will timeout for the
- * first few tries - especially if we have reset via
- * DBG_RESET.
- */
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- unifi_debug_log_to_buf("r0@%02X=", SDIO_IO_READY);
-#endif
- csrResult = CsrSdioF0Read8(card->sdio_if, SDIO_IO_READY, &io_enable);
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- unifi_debug_log_to_buf("error=%X\n", csrResult);
- }
- else
- {
- unifi_debug_log_to_buf("%X\n", io_enable);
- }
-#endif
- if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
- {
- return CSR_WIFI_HIP_RESULT_NO_DEVICE;
- }
- if (csrResult == CSR_RESULT_SUCCESS)
- {
- s16 enabled = io_enable & (1 << card->function);
- r = CSR_RESULT_SUCCESS;
- if (!enabled)
- {
- unifi_trace(card->ospriv, UDBG1,
- "Disable complete (function %d is disabled) in ~ %u msecs\n",
- card->function, i * MAILBOX2_TIMEOUT);
-
- break;
- }
- }
- else
- {
- /*
- * We ignore read failures for the first few reads,
- * they are probably benign.
- */
- r = ConvertCsrSdioToCsrHipResult(card, csrResult);
- if (i > (MAILBOX2_ATTEMPTS / 4))
- {
- unifi_trace(card->ospriv, UDBG1,
- "Failed to read CCCR IO Ready register while polling for disable\n");
- }
- }
- CsrThreadSleep(MAILBOX2_TIMEOUT);
- }
-
- if ((r == CSR_RESULT_SUCCESS) && (i == MAILBOX2_ATTEMPTS))
- {
- unifi_trace(card->ospriv, UDBG1, "Timeout waiting for UniFi to complete disable\n");
- r = CSR_RESULT_FAILURE;
- }
-
- return r;
-} /* card_wait_for_unifi_to_reset() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * card_wait_for_firmware_to_start
- *
- * Polls the MAILBOX1 register for a non-zero value.
- * Then reads MAILBOX0 and forms the two values into a 32-bit address
- * which is returned to the caller.
- *
- * Arguments:
- * card Pointer to card struct
- * paddr Pointer to receive the UniFi address formed
- * by concatenating MAILBOX1 and MAILBOX0.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, CSR error code on failure.
- * ---------------------------------------------------------------------------
- */
-CsrResult card_wait_for_firmware_to_start(card_t *card, u32 *paddr)
-{
- s32 i;
- u16 mbox0, mbox1;
- CsrResult r;
-
- /*
- * Wait for UniFi to initialise its data structures by polling
- * the SHARED_MAILBOX1 register.
- * Experience shows this is typically 120ms.
- */
- CsrThreadSleep(MAILBOX1_TIMEOUT);
-
- mbox1 = 0;
- unifi_trace(card->ospriv, UDBG1, "waiting for MAILBOX1 to be non-zero...\n");
- for (i = 0; i < MAILBOX1_ATTEMPTS; i++)
- {
- r = unifi_read_direct16(card, ChipHelper_MAILBOX1(card->helper) * 2, &mbox1);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- /* These reads can fail if UniFi isn't up yet, so try again */
- unifi_warning(card->ospriv, "Failed to read UniFi Mailbox1 register\n");
- }
-
- if ((r == CSR_RESULT_SUCCESS) && (mbox1 != 0))
- {
- unifi_trace(card->ospriv, UDBG1, "MAILBOX1 ready (0x%04X) in %u millisecs\n",
- mbox1, i * MAILBOX1_TIMEOUT);
-
- /* Read the MAILBOX1 again in case we caught the value as it
- * changed. */
- r = unifi_read_direct16(card, ChipHelper_MAILBOX1(card->helper) * 2, &mbox1);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read UniFi Mailbox1 register for second time\n");
- return r;
- }
- unifi_trace(card->ospriv, UDBG1, "MAILBOX1 value=0x%04X\n", mbox1);
-
- break;
- }
-
- CsrThreadSleep(MAILBOX1_TIMEOUT);
- if ((i % 100) == 99)
- {
- unifi_trace(card->ospriv, UDBG2, "MAILBOX1 not ready (0x%X), still trying...\n", mbox1);
- }
- }
-
- if ((r == CSR_RESULT_SUCCESS) && (mbox1 == 0))
- {
- unifi_trace(card->ospriv, UDBG1, "Timeout waiting for firmware to start, Mailbox1 still 0 after %d ms\n",
- MAILBOX1_ATTEMPTS * MAILBOX1_TIMEOUT);
- return CSR_RESULT_FAILURE;
- }
-
-
- /*
- * Complete the reset handshake by setting MAILBOX2 to 0xFFFF
- */
- r = unifi_write_direct16(card, ChipHelper_SDIO_HIP_HANDSHAKE(card->helper) * 2, 0xFFFF);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to write f/w startup handshake to MAILBOX2\n");
- return r;
- }
-
-
- /*
- * Read the Symbol Look Up Table (SLUT) offset.
- * Top 16 bits are in mbox1, read the lower 16 bits from mbox0.
- */
- mbox0 = 0;
- r = unifi_read_direct16(card, ChipHelper_MAILBOX0(card->helper) * 2, &mbox0);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read UniFi Mailbox0 register\n");
- return r;
- }
-
- *paddr = (((u32)mbox1 << 16) | mbox0);
-
- return CSR_RESULT_SUCCESS;
-} /* card_wait_for_firmware_to_start() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_capture_panic
- *
- * Attempt to capture panic codes from the firmware. This may involve
- * warm reset of the chip to regain access following a watchdog reset.
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * CSR_RESULT_SUCCESS if panic codes were captured, or none available
- * CSR_RESULT_FAILURE if the driver could not access function 1
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_capture_panic(card_t *card)
-{
-
- /* The firmware must have previously initialised to read the panic addresses
- * from the SLUT
- */
- if (!card->panic_data_phy_addr || !card->panic_data_mac_addr)
- {
- return CSR_RESULT_SUCCESS;
- }
-
- /* Ensure we can access function 1 following a panic/watchdog reset */
- if (card_access_panic(card) == CSR_RESULT_SUCCESS)
- {
- /* Read the panic codes */
- unifi_read_panic(card);
- }
- else
- {
- unifi_info(card->ospriv, "Unable to read panic codes");
- }
-
- return CSR_RESULT_SUCCESS;
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * card_access_panic
- * Attempt to read the WLAN SDIO function in order to read panic codes
- * and perform various reset steps to regain access if the read fails.
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * CSR_RESULT_SUCCESS if panic codes can be read
- * CSR error code if panic codes can not be read
- * ---------------------------------------------------------------------------
- */
-static CsrResult card_access_panic(card_t *card)
-{
- u16 data_u16 = 0;
- s32 i;
- CsrResult r, sr;
-
- /* A chip version of zero means that the version never got successfully read
- * during reset. In this case give up because it will not be possible to
- * verify the chip version.
- */
- if (!card->chip_version)
- {
- unifi_info(card->ospriv, "Unknown chip version\n");
- return CSR_RESULT_FAILURE;
- }
-
- /* Ensure chip is awake or access to function 1 will fail */
- r = unifi_set_host_state(card, UNIFI_HOST_STATE_AWAKE);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "unifi_set_host_state() failed %d\n", r);
- return CSR_RESULT_FAILURE; /* Card is probably unpowered */
- }
- CsrThreadSleep(20);
-
- for (i = 0; i < 3; i++)
- {
- sr = CsrSdioRead16(card->sdio_if, CHIP_HELPER_UNIFI_GBL_CHIP_VERSION * 2, &data_u16);
- if (sr != CSR_RESULT_SUCCESS || data_u16 != card->chip_version)
- {
- unifi_info(card->ospriv, "Failed to read valid chip version sr=%d (0x%04x want 0x%04x) try %d\n",
- sr, data_u16, card->chip_version, i);
-
- /* Set clock speed low */
- sr = CsrSdioMaxBusClockFrequencySet(card->sdio_if, UNIFI_SDIO_CLOCK_SAFE_HZ);
- if (sr != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "CsrSdioMaxBusClockFrequencySet() failed1 %d\n", sr);
- r = ConvertCsrSdioToCsrHipResult(card, sr);
- }
- card->sdio_clock_speed = UNIFI_SDIO_CLOCK_SAFE_HZ;
-
- /* First try re-enabling function in case a f/w watchdog reset disabled it */
- if (i == 0)
- {
- unifi_info(card->ospriv, "Try function enable\n");
- sr = CsrSdioFunctionEnable(card->sdio_if);
- if (sr != CSR_RESULT_SUCCESS)
- {
- r = ConvertCsrSdioToCsrHipResult(card, sr);
- unifi_error(card->ospriv, "CsrSdioFunctionEnable failed %d (HIP %d)\n", sr, r);
- }
- continue;
- }
-
- /* Second try, set awake */
- unifi_info(card->ospriv, "Try set awake\n");
-
- /* Ensure chip is awake */
- r = unifi_set_host_state(card, UNIFI_HOST_STATE_AWAKE);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "unifi_set_host_state() failed2 %d\n", r);
- }
-
- /* Set clock speed low in case setting the host state raised it, which
- * would only happen if host state was previously TORPID
- */
- sr = CsrSdioMaxBusClockFrequencySet(card->sdio_if, UNIFI_SDIO_CLOCK_SAFE_HZ);
- if (sr != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "CsrSdioMaxBusClockFrequencySet() failed2 %d\n", sr);
- }
- card->sdio_clock_speed = UNIFI_SDIO_CLOCK_SAFE_HZ;
-
- if (i == 1)
- {
- continue;
- }
-
- /* Perform a s/w reset to preserve as much as the card state as possible,
- * (mainly the preserve RAM). The context will be lost for coredump - but as we
- * were unable to access the WLAN function for panic, the coredump would have
- * also failed without a reset.
- */
- unifi_info(card->ospriv, "Try s/w reset\n");
-
- r = unifi_card_hard_reset(card);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "unifi_card_hard_reset() failed %d\n", r);
- }
- }
- else
- {
- if (i > 0)
- {
- unifi_info(card->ospriv, "Read chip version 0x%x after %d retries\n", data_u16, i);
- }
- break;
- }
- }
-
- r = ConvertCsrSdioToCsrHipResult(card, sr);
- return r;
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_read_panic
- * Reads, saves and prints panic codes stored by the firmware in UniFi's
- * preserve RAM by the last panic that occurred since chip was powered.
- * Nothing is saved if the panic codes are read as zero.
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * ---------------------------------------------------------------------------
- */
-void unifi_read_panic(card_t *card)
-{
- CsrResult r;
- u16 p_code, p_arg;
-
- /* The firmware must have previously initialised to read the panic addresses
- * from the SLUT
- */
- if (!card->panic_data_phy_addr || !card->panic_data_mac_addr)
- {
- return;
- }
-
- /* Get the panic data from PHY */
- r = unifi_card_read16(card, card->panic_data_phy_addr, &p_code);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "capture_panic: unifi_read16 %08x failed %d\n", card->panic_data_phy_addr, r);
- p_code = 0;
- }
- if (p_code)
- {
- r = unifi_card_read16(card, card->panic_data_phy_addr + 2, &p_arg);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "capture_panic: unifi_read16 %08x failed %d\n", card->panic_data_phy_addr + 2, r);
- }
- unifi_error(card->ospriv, "Last UniFi PHY PANIC %04x arg %04x\n", p_code, p_arg);
- card->last_phy_panic_code = p_code;
- card->last_phy_panic_arg = p_arg;
- }
-
- /* Get the panic data from MAC */
- r = unifi_card_read16(card, card->panic_data_mac_addr, &p_code);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "capture_panic: unifi_read16 %08x failed %d\n", card->panic_data_mac_addr, r);
- p_code = 0;
- }
- if (p_code)
- {
- r = unifi_card_read16(card, card->panic_data_mac_addr + 2, &p_arg);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "capture_panic: unifi_read16 %08x failed %d\n", card->panic_data_mac_addr + 2, r);
- }
- unifi_error(card->ospriv, "Last UniFi MAC PANIC %04x arg %04x\n", p_code, p_arg);
- card->last_mac_panic_code = p_code;
- card->last_mac_panic_arg = p_arg;
- }
-
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * card_allocate_memory_resources
- *
- * Allocates memory for the from-host, to-host bulk data slots,
- * soft queue buffers and bulk data buffers.
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, CSR error code on failure.
- * ---------------------------------------------------------------------------
- */
-static CsrResult card_allocate_memory_resources(card_t *card)
-{
- s16 n, i, k, r;
- sdio_config_data_t *cfg_data;
-
- /* Reset any state carried forward from a previous life */
- card->fh_command_queue.q_rd_ptr = 0;
- card->fh_command_queue.q_wr_ptr = 0;
- (void)scnprintf(card->fh_command_queue.name, UNIFI_QUEUE_NAME_MAX_LENGTH,
- "fh_cmd_q");
- for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
- {
- card->fh_traffic_queue[i].q_rd_ptr = 0;
- card->fh_traffic_queue[i].q_wr_ptr = 0;
- (void)scnprintf(card->fh_traffic_queue[i].name,
- UNIFI_QUEUE_NAME_MAX_LENGTH, "fh_data_q%d", i);
- }
-#ifndef CSR_WIFI_HIP_TA_DISABLE
- unifi_ta_sampling_init(card);
-#endif
- /* Convenience short-cut */
- cfg_data = &card->config_data;
-
- /*
- * Allocate memory for the from-host and to-host signal buffers.
- */
- card->fh_buffer.buf = kmalloc(UNIFI_FH_BUF_SIZE, GFP_KERNEL);
- if (card->fh_buffer.buf == NULL)
- {
- unifi_error(card->ospriv, "Failed to allocate memory for F-H signals\n");
- return CSR_WIFI_HIP_RESULT_NO_MEMORY;
- }
- card->fh_buffer.bufsize = UNIFI_FH_BUF_SIZE;
- card->fh_buffer.ptr = card->fh_buffer.buf;
- card->fh_buffer.count = 0;
-
- card->th_buffer.buf = kmalloc(UNIFI_FH_BUF_SIZE, GFP_KERNEL);
- if (card->th_buffer.buf == NULL)
- {
- unifi_error(card->ospriv, "Failed to allocate memory for T-H signals\n");
- return CSR_WIFI_HIP_RESULT_NO_MEMORY;
- }
- card->th_buffer.bufsize = UNIFI_FH_BUF_SIZE;
- card->th_buffer.ptr = card->th_buffer.buf;
- card->th_buffer.count = 0;
-
-
- /*
- * Allocate memory for the from-host and to-host bulk data slots.
- * This is done as separate kmallocs because lots of smaller
- * allocations are more likely to succeed than one huge one.
- */
-
- /* Allocate memory for the array of pointers */
- n = cfg_data->num_fromhost_data_slots;
-
- unifi_trace(card->ospriv, UDBG3, "Alloc from-host resources, %d slots.\n", n);
- card->from_host_data = kmalloc(n * sizeof(slot_desc_t), GFP_KERNEL);
- if (card->from_host_data == NULL)
- {
- unifi_error(card->ospriv, "Failed to allocate memory for F-H bulk data array\n");
- return CSR_WIFI_HIP_RESULT_NO_MEMORY;
- }
-
- /* Initialise from-host bulk data slots */
- for (i = 0; i < n; i++)
- {
- UNIFI_INIT_BULK_DATA(&card->from_host_data[i].bd);
- }
-
- /* Allocate memory for the array used for slot host tag mapping */
- card->fh_slot_host_tag_record = kmalloc(n * sizeof(u32), GFP_KERNEL);
-
- if (card->fh_slot_host_tag_record == NULL)
- {
- unifi_error(card->ospriv, "Failed to allocate memory for F-H slot host tag mapping array\n");
- return CSR_WIFI_HIP_RESULT_NO_MEMORY;
- }
-
- /* Initialise host tag entries for from-host bulk data slots */
- for (i = 0; i < n; i++)
- {
- card->fh_slot_host_tag_record[i] = CSR_WIFI_HIP_RESERVED_HOST_TAG;
- }
-
-
- /* Allocate memory for the array of pointers */
- n = cfg_data->num_tohost_data_slots;
-
- unifi_trace(card->ospriv, UDBG3, "Alloc to-host resources, %d slots.\n", n);
- card->to_host_data = kmalloc(n * sizeof(bulk_data_desc_t), GFP_KERNEL);
- if (card->to_host_data == NULL)
- {
- unifi_error(card->ospriv, "Failed to allocate memory for T-H bulk data array\n");
- return CSR_WIFI_HIP_RESULT_NO_MEMORY;
- }
-
- /* Initialise to-host bulk data slots */
- for (i = 0; i < n; i++)
- {
- UNIFI_INIT_BULK_DATA(&card->to_host_data[i]);
- }
-
- /*
- * Initialise buffers for soft Q
- */
- for (i = 0; i < UNIFI_SOFT_COMMAND_Q_LENGTH; i++)
- {
- for (r = 0; r < UNIFI_MAX_DATA_REFERENCES; r++)
- {
- UNIFI_INIT_BULK_DATA(&card->fh_command_q_body[i].bulkdata[r]);
- }
- }
-
- for (k = 0; k < UNIFI_NO_OF_TX_QS; k++)
- {
- for (i = 0; i < UNIFI_SOFT_TRAFFIC_Q_LENGTH; i++)
- {
- for (r = 0; r < UNIFI_MAX_DATA_REFERENCES; r++)
- {
- UNIFI_INIT_BULK_DATA(&card->fh_traffic_q_body[k][i].bulkdata[r]);
- }
- }
- }
-
- card->memory_resources_allocated = 1;
-
- return CSR_RESULT_SUCCESS;
-} /* card_allocate_memory_resources() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_free_bulk_data
- *
- * Free the data associated to a bulk data structure.
- *
- * Arguments:
- * card Pointer to card struct
- * bulk_data_slot Pointer to bulk data structure
- *
- * Returns:
- * None.
- *
- * ---------------------------------------------------------------------------
- */
-static void unifi_free_bulk_data(card_t *card, bulk_data_desc_t *bulk_data_slot)
-{
- if (bulk_data_slot->data_length != 0)
- {
- unifi_net_data_free(card->ospriv, bulk_data_slot);
- }
-} /* unifi_free_bulk_data() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * card_free_memory_resources
- *
- * Frees memory allocated for the from-host, to-host bulk data slots,
- * soft queue buffers and bulk data buffers.
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * None.
- * ---------------------------------------------------------------------------
- */
-static void card_free_memory_resources(card_t *card)
-{
-
- unifi_trace(card->ospriv, UDBG1, "Freeing card memory resources.\n");
-
- /* Clear our internal queues */
- unifi_cancel_pending_signals(card);
-
-
- kfree(card->to_host_data);
- card->to_host_data = NULL;
-
- kfree(card->from_host_data);
- card->from_host_data = NULL;
-
- /* free the memory for slot host tag mapping array */
- kfree(card->fh_slot_host_tag_record);
- card->fh_slot_host_tag_record = NULL;
-
- kfree(card->fh_buffer.buf);
- card->fh_buffer.ptr = card->fh_buffer.buf = NULL;
- card->fh_buffer.bufsize = 0;
- card->fh_buffer.count = 0;
-
- kfree(card->th_buffer.buf);
- card->th_buffer.ptr = card->th_buffer.buf = NULL;
- card->th_buffer.bufsize = 0;
- card->th_buffer.count = 0;
-
-
- card->memory_resources_allocated = 0;
-
-} /* card_free_memory_resources() */
-
-
-static void card_init_soft_queues(card_t *card)
-{
- s16 i;
-
- unifi_trace(card->ospriv, UDBG1, "Initialising internal signal queues.\n");
- /* Reset any state carried forward from a previous life */
- card->fh_command_queue.q_rd_ptr = 0;
- card->fh_command_queue.q_wr_ptr = 0;
- (void)scnprintf(card->fh_command_queue.name, UNIFI_QUEUE_NAME_MAX_LENGTH,
- "fh_cmd_q");
- for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
- {
- card->fh_traffic_queue[i].q_rd_ptr = 0;
- card->fh_traffic_queue[i].q_wr_ptr = 0;
- (void)scnprintf(card->fh_traffic_queue[i].name,
- UNIFI_QUEUE_NAME_MAX_LENGTH, "fh_data_q%d", i);
- }
-#ifndef CSR_WIFI_HIP_TA_DISABLE
- unifi_ta_sampling_init(card);
-#endif
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_cancel_pending_signals
- *
- * Free the signals and associated bulk data, pending in the core.
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * None.
- * ---------------------------------------------------------------------------
- */
-void unifi_cancel_pending_signals(card_t *card)
-{
- s16 i, n, r;
-
- unifi_trace(card->ospriv, UDBG1, "Canceling pending signals.\n");
-
- if (card->to_host_data)
- {
- /*
- * Free any bulk data buffers allocated for the t-h slots
- * This will clear all buffers that did not make it to
- * unifi_receive_event() before cancel was request.
- */
- n = card->config_data.num_tohost_data_slots;
- unifi_trace(card->ospriv, UDBG3, "Freeing to-host resources, %d slots.\n", n);
- for (i = 0; i < n; i++)
- {
- unifi_free_bulk_data(card, &card->to_host_data[i]);
- }
- }
-
- /*
- * If any of the from-host bulk data has reached the card->from_host_data
- * but not UniFi, we need to free the buffers here.
- */
- if (card->from_host_data)
- {
- /* Free any bulk data buffers allocated for the f-h slots */
- n = card->config_data.num_fromhost_data_slots;
- unifi_trace(card->ospriv, UDBG3, "Freeing from-host resources, %d slots.\n", n);
- for (i = 0; i < n; i++)
- {
- unifi_free_bulk_data(card, &card->from_host_data[i].bd);
- }
-
- for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
- {
- card->dynamic_slot_data.from_host_used_slots[i] = 0;
- card->dynamic_slot_data.from_host_max_slots[i] = 0;
- card->dynamic_slot_data.from_host_reserved_slots[i] = 0;
- }
- }
-
- /*
- * Free any bulk data buffers allocated in the soft queues.
- * This covers the case where a bulk data pointer has reached the soft queue
- * but not the card->from_host_data.
- */
- unifi_trace(card->ospriv, UDBG3, "Freeing cmd q resources.\n");
- for (i = 0; i < UNIFI_SOFT_COMMAND_Q_LENGTH; i++)
- {
- for (r = 0; r < UNIFI_MAX_DATA_REFERENCES; r++)
- {
- unifi_free_bulk_data(card, &card->fh_command_q_body[i].bulkdata[r]);
- }
- }
-
- unifi_trace(card->ospriv, UDBG3, "Freeing traffic q resources.\n");
- for (n = 0; n < UNIFI_NO_OF_TX_QS; n++)
- {
- for (i = 0; i < UNIFI_SOFT_TRAFFIC_Q_LENGTH; i++)
- {
- for (r = 0; r < UNIFI_MAX_DATA_REFERENCES; r++)
- {
- unifi_free_bulk_data(card, &card->fh_traffic_q_body[n][i].bulkdata[r]);
- }
- }
- }
-
- card_init_soft_queues(card);
-
-} /* unifi_cancel_pending_signals() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_free_card
- *
- * Free the memory allocated for the card structure and buffers.
- *
- * Notes:
- * The porting layer is responsible for freeing any mini-coredump buffers
- * allocated when it called unifi_coredump_init(), by calling
- * unifi_coredump_free() before calling this function.
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * None.
- * ---------------------------------------------------------------------------
- */
-void unifi_free_card(card_t *card)
-{
-#ifdef CSR_PRE_ALLOC_NET_DATA
- prealloc_netdata_free(card);
-#endif
- /* Free any memory allocated. */
- card_free_memory_resources(card);
-
- /* Warn if caller didn't free coredump buffers */
- if (card->dump_buf)
- {
- unifi_error(card->ospriv, "Caller should call unifi_coredump_free()\n");
- unifi_coredump_free(card); /* free anyway to prevent memory leak */
- }
-
- kfree(card);
-
-} /* unifi_free_card() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * card_init_slots
- *
- * Allocate memory for host-side slot data and signal queues.
- *
- * Arguments:
- * card Pointer to card object
- *
- * Returns:
- * CSR error code.
- * ---------------------------------------------------------------------------
- */
-static CsrResult card_init_slots(card_t *card)
-{
- CsrResult r;
- u8 i;
-
- /* Allocate the buffers we need, only once. */
- if (card->memory_resources_allocated == 1)
- {
- card_free_memory_resources(card);
- }
- else
- {
- /* Initialise our internal command and traffic queues */
- card_init_soft_queues(card);
- }
-
- r = card_allocate_memory_resources(card);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to allocate card memory resources.\n");
- card_free_memory_resources(card);
- return r;
- }
-
- if (card->sdio_ctrl_addr == 0)
- {
- unifi_error(card->ospriv, "Failed to find config struct!\n");
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- /*
- * Set initial counts.
- */
-
- card->from_host_data_head = 0;
-
- /* Get initial signal counts from UniFi, in case it has not been reset. */
- {
- u16 s;
-
- /* Get the from-host-signals-written count */
- r = unifi_card_read16(card, card->sdio_ctrl_addr + 0, &s);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read from-host sig written count\n");
- return r;
- }
- card->from_host_signals_w = (s16)s;
-
- /* Get the to-host-signals-written count */
- r = unifi_card_read16(card, card->sdio_ctrl_addr + 6, &s);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read to-host sig read count\n");
- return r;
- }
- card->to_host_signals_r = (s16)s;
- }
-
- /* Set Initialised flag. */
- r = unifi_card_write16(card, card->init_flag_addr, 0x0001);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to write initialised flag\n");
- return r;
- }
-
- /* Dynamic queue reservation */
- memset(&card->dynamic_slot_data, 0, sizeof(card_dynamic_slot_t));
-
- for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
- {
- card->dynamic_slot_data.from_host_max_slots[i] = card->config_data.num_fromhost_data_slots -
- UNIFI_RESERVED_COMMAND_SLOTS;
- card->dynamic_slot_data.queue_stable[i] = FALSE;
- }
-
- card->dynamic_slot_data.packets_interval = UNIFI_PACKETS_INTERVAL;
-
- return CSR_RESULT_SUCCESS;
-} /* card_init_slots() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_set_udi_hook
- *
- * Registers the udi hook that reports the sent signals to the core.
- *
- * Arguments:
- * card Pointer to the card context struct
- * udi_fn Pointer to the callback function.
- *
- * Returns:
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE if the card pointer is invalid,
- * CSR_RESULT_SUCCESS on success.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_set_udi_hook(card_t *card, udi_func_t udi_fn)
-{
- if (card == NULL)
- {
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- if (card->udi_hook == NULL)
- {
- card->udi_hook = udi_fn;
- }
-
- return CSR_RESULT_SUCCESS;
-} /* unifi_set_udi_hook() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_remove_udi_hook
- *
- * Removes the udi hook that reports the sent signals from the core.
- *
- * Arguments:
- * card Pointer to the card context struct
- * udi_fn Pointer to the callback function.
- *
- * Returns:
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE if the card pointer is invalid,
- * CSR_RESULT_SUCCESS on success.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_remove_udi_hook(card_t *card, udi_func_t udi_fn)
-{
- if (card == NULL)
- {
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- if (card->udi_hook == udi_fn)
- {
- card->udi_hook = NULL;
- }
-
- return CSR_RESULT_SUCCESS;
-} /* unifi_remove_udi_hook() */
-
-
-static void CardReassignDynamicReservation(card_t *card)
-{
- u8 i;
-
- unifi_trace(card->ospriv, UDBG5, "Packets Txed %d %d %d %d\n",
- card->dynamic_slot_data.packets_txed[0],
- card->dynamic_slot_data.packets_txed[1],
- card->dynamic_slot_data.packets_txed[2],
- card->dynamic_slot_data.packets_txed[3]);
-
- /* Clear reservation and recalculate max slots */
- for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
- {
- card->dynamic_slot_data.queue_stable[i] = FALSE;
- card->dynamic_slot_data.from_host_reserved_slots[i] = 0;
- card->dynamic_slot_data.from_host_max_slots[i] = card->config_data.num_fromhost_data_slots -
- UNIFI_RESERVED_COMMAND_SLOTS;
- card->dynamic_slot_data.packets_txed[i] = 0;
-
- unifi_trace(card->ospriv, UDBG5, "CardReassignDynamicReservation: queue %d reserved %d Max %d\n", i,
- card->dynamic_slot_data.from_host_reserved_slots[i],
- card->dynamic_slot_data.from_host_max_slots[i]);
- }
-
- card->dynamic_slot_data.total_packets_txed = 0;
-}
-
-
-/* Algorithm to dynamically reserve slots. The logic is based mainly on the outstanding queue
- * length. Slots are reserved for particular queues during an interval and cleared after the interval.
- * Each queue has three associated variables.. a) used slots - the number of slots currently occupied
- * by the queue b) reserved slots - number of slots reserved specifically for the queue c) max slots - total
- * slots that this queue can actually use (may be higher than reserved slots and is dependent on reserved slots
- * for other queues).
- * This function is called when there are no slots available for a queue. It checks to see if there are enough
- * unreserved slots sufficient for this request. If available these slots are reserved for the queue.
- * If there are not enough unreserved slots, a fair share for each queue is calculated based on the total slots
- * and the number of active queues (any queue with existing reservation is considered active). Queues needing
- * less than their fair share are allowed to have the previously reserved slots. The remaining slots are
- * distributed evenly among queues that need more than the fair share
- *
- * A better scheme would take current bandwidth per AC into consideration when reserving slots. An
- * implementation scheme could consider the relative time/service period for slots in an AC. If the firmware
- * services other ACs faster than a particular AC (packets wait in the slots longer) then it is fair to reserve
- * less slots for the AC
- */
-static void CardCheckDynamicReservation(card_t *card, unifi_TrafficQueue queue)
-{
- u16 q_len, active_queues = 0, excess_queue_slots, div_extra_slots,
- queue_fair_share, reserved_slots = 0, q, excess_need_queues = 0, unmovable_slots = 0;
- s32 i;
- q_t *sigq;
- u16 num_data_slots = card->config_data.num_fromhost_data_slots - UNIFI_RESERVED_COMMAND_SLOTS;
-
- /* Calculate the pending queue length */
- sigq = &card->fh_traffic_queue[queue];
- q_len = CSR_WIFI_HIP_Q_SLOTS_USED(sigq);
-
- if (q_len <= card->dynamic_slot_data.from_host_reserved_slots[queue])
- {
- unifi_trace(card->ospriv, UDBG5, "queue %d q_len %d already has that many reserved slots, exiting\n", queue, q_len);
- return;
- }
-
- /* Upper limit */
- if (q_len > num_data_slots)
- {
- q_len = num_data_slots;
- }
-
- for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
- {
- if (i != (s32)queue)
- {
- reserved_slots += card->dynamic_slot_data.from_host_reserved_slots[i];
- }
- if ((i == (s32)queue) || (card->dynamic_slot_data.from_host_reserved_slots[i] > 0))
- {
- active_queues++;
- }
- }
-
- unifi_trace(card->ospriv, UDBG5, "CardCheckDynamicReservation: queue %d q_len %d\n", queue, q_len);
- unifi_trace(card->ospriv, UDBG5, "Active queues %d reserved slots on other queues %d\n",
- active_queues, reserved_slots);
-
- if (reserved_slots + q_len <= num_data_slots)
- {
- card->dynamic_slot_data.from_host_reserved_slots[queue] = q_len;
- if (q_len == num_data_slots)
- {
- /* This is the common case when just 1 stream is going */
- card->dynamic_slot_data.queue_stable[queue] = TRUE;
- }
- }
- else
- {
- queue_fair_share = num_data_slots / active_queues;
- unifi_trace(card->ospriv, UDBG5, "queue fair share %d\n", queue_fair_share);
-
- /* Evenly distribute slots among active queues */
- /* Find out the queues that need excess of fair share. Also find slots allocated
- * to queues less than their fair share, these slots cannot be reallocated (unmovable slots) */
-
- card->dynamic_slot_data.from_host_reserved_slots[queue] = q_len;
-
- for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
- {
- if (card->dynamic_slot_data.from_host_reserved_slots[i] > queue_fair_share)
- {
- excess_need_queues++;
- }
- else
- {
- unmovable_slots += card->dynamic_slot_data.from_host_reserved_slots[i];
- }
- }
-
- unifi_trace(card->ospriv, UDBG5, "Excess need queues %d\n", excess_need_queues);
-
- /* Now find the slots per excess demand queue */
- excess_queue_slots = (num_data_slots - unmovable_slots) / excess_need_queues;
- div_extra_slots = (num_data_slots - unmovable_slots) - excess_queue_slots * excess_need_queues;
- for (i = UNIFI_NO_OF_TX_QS - 1; i >= 0; i--)
- {
- if (card->dynamic_slot_data.from_host_reserved_slots[i] > excess_queue_slots)
- {
- card->dynamic_slot_data.from_host_reserved_slots[i] = excess_queue_slots;
- if (div_extra_slots > 0)
- {
- card->dynamic_slot_data.from_host_reserved_slots[i]++;
- div_extra_slots--;
- }
- /* No more slots will be allocated to this queue during the current interval */
- card->dynamic_slot_data.queue_stable[i] = TRUE;
- unifi_trace(card->ospriv, UDBG5, "queue stable %d\n", i);
- }
- }
- }
-
- /* Redistribute max slots */
- for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
- {
- reserved_slots = 0;
- for (q = 0; q < UNIFI_NO_OF_TX_QS; q++)
- {
- if (i != q)
- {
- reserved_slots += card->dynamic_slot_data.from_host_reserved_slots[q];
- }
- }
-
- card->dynamic_slot_data.from_host_max_slots[i] = num_data_slots - reserved_slots;
- unifi_trace(card->ospriv, UDBG5, "queue %d reserved %d Max %d\n", i,
- card->dynamic_slot_data.from_host_reserved_slots[i],
- card->dynamic_slot_data.from_host_max_slots[i]);
- }
-
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * CardClearFromHostDataSlot
- *
- * Clear a the given data slot, making it available again.
- *
- * Arguments:
- * card Pointer to Card object
- * slot Index of the signal slot to clear.
- *
- * Returns:
- * None.
- * ---------------------------------------------------------------------------
- */
-void CardClearFromHostDataSlot(card_t *card, const s16 slot)
-{
- u8 queue = card->from_host_data[slot].queue;
- const void *os_data_ptr = card->from_host_data[slot].bd.os_data_ptr;
-
- if (card->from_host_data[slot].bd.data_length == 0)
- {
- unifi_warning(card->ospriv,
- "Surprise: request to clear an already free FH data slot: %d\n",
- slot);
- return;
- }
-
- if (os_data_ptr == NULL)
- {
- unifi_warning(card->ospriv,
- "Clearing FH data slot %d: has null payload, len=%d\n",
- slot, card->from_host_data[slot].bd.data_length);
- }
-
- /* Free card->from_host_data[slot].bd.os_net_ptr here. */
- /* Mark slot as free by setting length to 0. */
- unifi_free_bulk_data(card, &card->from_host_data[slot].bd);
- if (queue < UNIFI_NO_OF_TX_QS)
- {
- if (card->dynamic_slot_data.from_host_used_slots[queue] == 0)
- {
- unifi_error(card->ospriv, "Goofed up used slots q = %d used slots = %d\n",
- queue,
- card->dynamic_slot_data.from_host_used_slots[queue]);
- }
- else
- {
- card->dynamic_slot_data.from_host_used_slots[queue]--;
- }
- card->dynamic_slot_data.packets_txed[queue]++;
- card->dynamic_slot_data.total_packets_txed++;
- if (card->dynamic_slot_data.total_packets_txed >= card->dynamic_slot_data.packets_interval)
- {
- CardReassignDynamicReservation(card);
- }
- }
-
- unifi_trace(card->ospriv, UDBG4, "CardClearFromHostDataSlot: slot %d recycled %p\n", slot, os_data_ptr);
-
-} /* CardClearFromHostDataSlot() */
-
-
-#ifdef CSR_WIFI_REQUEUE_PACKET_TO_HAL
-/*
- * ---------------------------------------------------------------------------
- * CardClearFromHostDataSlotWithoutFreeingBulkData
- *
- * Clear the given data slot with out freeing the bulk data.
- *
- * Arguments:
- * card Pointer to Card object
- * slot Index of the signal slot to clear.
- *
- * Returns:
- * None.
- * ---------------------------------------------------------------------------
- */
-void CardClearFromHostDataSlotWithoutFreeingBulkData(card_t *card, const s16 slot)
-{
- u8 queue = card->from_host_data[slot].queue;
-
- /* Initialise the from_host data slot so it can be re-used,
- * Set length field in from_host_data array to 0.
- */
- UNIFI_INIT_BULK_DATA(&card->from_host_data[slot].bd);
-
- queue = card->from_host_data[slot].queue;
-
- if (queue < UNIFI_NO_OF_TX_QS)
- {
- if (card->dynamic_slot_data.from_host_used_slots[queue] == 0)
- {
- unifi_error(card->ospriv, "Goofed up used slots q = %d used slots = %d\n",
- queue,
- card->dynamic_slot_data.from_host_used_slots[queue]);
- }
- else
- {
- card->dynamic_slot_data.from_host_used_slots[queue]--;
- }
- card->dynamic_slot_data.packets_txed[queue]++;
- card->dynamic_slot_data.total_packets_txed++;
- if (card->dynamic_slot_data.total_packets_txed >=
- card->dynamic_slot_data.packets_interval)
- {
- CardReassignDynamicReservation(card);
- }
- }
-} /* CardClearFromHostDataSlotWithoutFreeingBulkData() */
-
-
-#endif
-
-u16 CardGetDataSlotSize(card_t *card)
-{
- return card->config_data.data_slot_size;
-} /* CardGetDataSlotSize() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * CardGetFreeFromHostDataSlots
- *
- * Retrieve the number of from-host bulk data slots available.
- *
- * Arguments:
- * card Pointer to the card context struct
- *
- * Returns:
- * Number of free from-host bulk data slots.
- * ---------------------------------------------------------------------------
- */
-u16 CardGetFreeFromHostDataSlots(card_t *card)
-{
- u16 i, n = 0;
-
- /* First two slots reserved for MLME */
- for (i = 0; i < card->config_data.num_fromhost_data_slots; i++)
- {
- if (card->from_host_data[i].bd.data_length == 0)
- {
- /* Free slot */
- n++;
- }
- }
-
- return n;
-} /* CardGetFreeFromHostDataSlots() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * CardAreAllFromHostDataSlotsEmpty
- *
- * Returns the state of from-host bulk data slots.
- *
- * Arguments:
- * card Pointer to the card context struct
- *
- * Returns:
- * 1 The from-host bulk data slots are all empty (available).
- * 0 Some or all the from-host bulk data slots are in use.
- * ---------------------------------------------------------------------------
- */
-u16 CardAreAllFromHostDataSlotsEmpty(card_t *card)
-{
- u16 i;
-
- for (i = 0; i < card->config_data.num_fromhost_data_slots; i++)
- {
- if (card->from_host_data[i].bd.data_length != 0)
- {
- return 0;
- }
- }
-
- return 1;
-} /* CardGetFreeFromHostDataSlots() */
-
-
-static CsrResult unifi_identify_hw(card_t *card)
-{
-
- card->chip_id = card->sdio_if->sdioId.cardId;
- card->function = card->sdio_if->sdioId.sdioFunction;
- card->sdio_io_block_size = card->sdio_if->blockSize;
-
- /* If SDIO controller doesn't support byte mode CMD53, pad transfers to block sizes */
- card->sdio_io_block_pad = (card->sdio_if->features & CSR_SDIO_FEATURE_BYTE_MODE)?FALSE : TRUE;
-
- /*
- * Setup the chip helper so that we can access the registers (and
- * also tell what sub-type of HIP we should use).
- */
- card->helper = ChipHelper_GetVersionSdio((u8)card->chip_id);
- if (!card->helper)
- {
- unifi_error(card->ospriv, "Null ChipHelper\n");
- }
-
- unifi_info(card->ospriv, "Chip ID 0x%02X Function %u Block Size %u Name %s(%s)\n",
- card->chip_id, card->function, card->sdio_io_block_size,
- ChipHelper_MarketingName(card->helper),
- ChipHelper_FriendlyName(card->helper));
-
- return CSR_RESULT_SUCCESS;
-} /* unifi_identify_hw() */
-
-
-static CsrResult unifi_prepare_hw(card_t *card)
-{
- CsrResult r;
- CsrResult csrResult;
- enum unifi_host_state old_state = card->host_state;
-
- r = unifi_identify_hw(card);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to identify hw\n");
- return r;
- }
-
- unifi_trace(card->ospriv, UDBG1,
- "%s mode SDIO\n", card->sdio_io_block_pad?"Block" : "Byte");
- /*
- * Chip must be a awake or blocks that are asleep may not get
- * reset. We can only do this after we have read the chip_id.
- */
- r = unifi_set_host_state(card, UNIFI_HOST_STATE_AWAKE);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
-
- if (old_state == UNIFI_HOST_STATE_TORPID)
- {
- /* Ensure the initial clock rate is set; if a reset occurred when the chip was
- * TORPID, unifi_set_host_state() may have raised it to MAX.
- */
- csrResult = CsrSdioMaxBusClockFrequencySet(card->sdio_if, UNIFI_SDIO_CLOCK_INIT_HZ);
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- r = ConvertCsrSdioToCsrHipResult(card, csrResult);
- return r;
- }
- card->sdio_clock_speed = UNIFI_SDIO_CLOCK_INIT_HZ;
- }
-
- /*
- * The WLAN function must be enabled to access MAILBOX2 and DEBUG_RST
- * registers.
- */
- csrResult = CsrSdioFunctionEnable(card->sdio_if);
- if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
- {
- return CSR_WIFI_HIP_RESULT_NO_DEVICE;
- }
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- r = ConvertCsrSdioToCsrHipResult(card, csrResult);
- /* Can't enable WLAN function. Try resetting the SDIO block. */
- unifi_error(card->ospriv, "Failed to re-enable function %d.\n", card->function);
- return r;
- }
-
- /*
- * Poke some registers to make sure the PLL has started,
- * otherwise memory accesses are likely to fail.
- */
- bootstrap_chip_hw(card);
-
- /* Try to read the chip version from register. */
- r = unifi_read_chip_version(card);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- return CSR_RESULT_SUCCESS;
-} /* unifi_prepare_hw() */
-
-
-static CsrResult unifi_read_chip_version(card_t *card)
-{
- u32 gbl_chip_version;
- CsrResult r;
- u16 ver;
-
- gbl_chip_version = ChipHelper_GBL_CHIP_VERSION(card->helper);
-
- /* Try to read the chip version from register. */
- if (gbl_chip_version != 0)
- {
- r = unifi_read_direct16(card, gbl_chip_version * 2, &ver);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read GBL_CHIP_VERSION\n");
- return r;
- }
- card->chip_version = ver;
- }
- else
- {
- unifi_info(card->ospriv, "Unknown Chip ID, cannot locate GBL_CHIP_VERSION\n");
- r = CSR_RESULT_FAILURE;
- }
-
- unifi_info(card->ospriv, "Chip Version 0x%04X\n", card->chip_version);
-
- return r;
-} /* unifi_read_chip_version() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_reset_hardware
- *
- * Execute the UniFi reset sequence.
- *
- * Note: This may fail if the chip is going TORPID so retry at
- * least once.
- *
- * Arguments:
- * card - pointer to card context structure
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, CSR error otherwise.
- *
- * Notes:
- * Some platforms (e.g. Windows Vista) do not allow access to registers
- * that are necessary for a software soft reset.
- * ---------------------------------------------------------------------------
- */
-static CsrResult unifi_reset_hardware(card_t *card)
-{
- CsrResult r;
- u16 new_block_size = UNIFI_IO_BLOCK_SIZE;
- CsrResult csrResult;
-
- /* Errors returned by unifi_prepare_hw() are not critical at this point */
- r = unifi_prepare_hw(card);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
-
- /* First try SDIO controller reset, which may power cycle the UniFi, assert
- * its reset line, or not be implemented depending on the platform.
- */
- unifi_info(card->ospriv, "Calling CsrSdioHardReset\n");
- csrResult = CsrSdioHardReset(card->sdio_if);
- if (csrResult == CSR_RESULT_SUCCESS)
- {
- unifi_info(card->ospriv, "CsrSdioHardReset succeeded on resetting UniFi\n");
- r = unifi_prepare_hw(card);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "unifi_prepare_hw failed after hard reset\n");
- return r;
- }
- }
- else if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
- {
- return CSR_WIFI_HIP_RESULT_NO_DEVICE;
- }
- else
- {
- /* Falling back to software hard reset methods */
- unifi_info(card->ospriv, "Falling back to software hard reset\n");
- r = unifi_card_hard_reset(card);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "software hard reset failed\n");
- return r;
- }
-
- /* If we fell back to unifi_card_hard_reset() methods, chip version may
- * not have been read. (Note in the unlikely event that it is zero,
- * it will be harmlessly read again)
- */
- if (card->chip_version == 0)
- {
- r = unifi_read_chip_version(card);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
- }
- }
-
-#ifdef CSR_WIFI_HIP_SDIO_BLOCK_SIZE
- new_block_size = CSR_WIFI_HIP_SDIO_BLOCK_SIZE;
-#endif
-
- /* After hard reset, we need to restore the SDIO block size */
- csrResult = CsrSdioBlockSizeSet(card->sdio_if, new_block_size);
- r = ConvertCsrSdioToCsrHipResult(card, csrResult);
-
- /* Warn if a different block size was achieved by the transport */
- if (card->sdio_if->blockSize != new_block_size)
- {
- unifi_info(card->ospriv,
- "Actually got block size %d\n", card->sdio_if->blockSize);
- }
-
- /* sdio_io_block_size always needs be updated from the achieved block size,
- * as it is used by the OS layer to allocate memory in unifi_net_malloc().
- * Controllers which don't support block mode (e.g. CSPI) will report a
- * block size of zero.
- */
- if (card->sdio_if->blockSize == 0)
- {
- unifi_info(card->ospriv, "Block size 0, block mode not available\n");
-
- /* Set sdio_io_block_size to 1 so that unifi_net_data_malloc() has a
- * sensible rounding value. Elsewhere padding will already be
- * disabled because the controller supports byte mode.
- */
- card->sdio_io_block_size = 1;
-
- /* Controller features must declare support for byte mode */
- if (!(card->sdio_if->features & CSR_SDIO_FEATURE_BYTE_MODE))
- {
- unifi_error(card->ospriv, "Requires byte mode\n");
- r = CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
- }
- else
- {
- /* Padding will be enabled if CSR_SDIO_FEATURE_BYTE_MODE isn't set */
- card->sdio_io_block_size = card->sdio_if->blockSize;
- }
-
-
- return r;
-} /* unifi_reset_hardware() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * card_reset_method_io_enable
- *
- * Issue a hard reset to the hw writing the IO_ENABLE.
- *
- * Arguments:
- * card Pointer to Card object
- *
- * Returns:
- * 0 on success,
- * CSR_WIFI_HIP_RESULT_NO_DEVICE if the card was ejected
- * CSR_RESULT_FAILURE if an SDIO error occurred or if a response
- * was not seen in the expected time
- * ---------------------------------------------------------------------------
- */
-static CsrResult card_reset_method_io_enable(card_t *card)
-{
- CsrResult r;
- CsrResult csrResult;
-
- /*
- * This resets only function 1, so should be used in
- * preference to the method below (CSR_FUNC_EN)
- */
- unifi_trace(card->ospriv, UDBG1, "Hard reset (IO_ENABLE)\n");
-
- csrResult = CsrSdioFunctionDisable(card->sdio_if);
- if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
- {
- return CSR_WIFI_HIP_RESULT_NO_DEVICE;
- }
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- r = ConvertCsrSdioToCsrHipResult(card, csrResult);
- unifi_warning(card->ospriv, "SDIO error writing IO_ENABLE: %d\n", r);
- }
- else
- {
- /* Delay here to let the reset take affect. */
- CsrThreadSleep(RESET_SETTLE_DELAY);
-
- r = card_wait_for_unifi_to_disable(card);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
-
- if (r == CSR_RESULT_SUCCESS)
- {
- r = card_wait_for_unifi_to_reset(card);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- }
- }
-
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_trace(card->ospriv, UDBG1, "Hard reset (CSR_FUNC_EN)\n");
-
- r = sdio_write_f0(card, SDIO_CSR_FUNC_EN, 0);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_warning(card->ospriv, "SDIO error writing SDIO_CSR_FUNC_EN: %d\n", r);
- return r;
- }
- else
- {
- /* Delay here to let the reset take affect. */
- CsrThreadSleep(RESET_SETTLE_DELAY);
-
- r = card_wait_for_unifi_to_reset(card);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- }
- }
-
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_warning(card->ospriv, "card_reset_method_io_enable failed to reset UniFi\n");
- }
-
- return r;
-} /* card_reset_method_io_enable() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * card_reset_method_dbg_reset
- *
- * Issue a hard reset to the hw writing the DBG_RESET.
- *
- * Arguments:
- * card Pointer to Card object
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success,
- * CSR_WIFI_HIP_RESULT_NO_DEVICE if the card was ejected
- * CSR_RESULT_FAILURE if an SDIO error occurred or if a response
- * was not seen in the expected time
- * ---------------------------------------------------------------------------
- */
-static CsrResult card_reset_method_dbg_reset(card_t *card)
-{
- CsrResult r;
-
- /*
- * Prepare UniFi for h/w reset
- */
- if (card->host_state == UNIFI_HOST_STATE_TORPID)
- {
- r = unifi_set_host_state(card, UNIFI_HOST_STATE_DROWSY);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to set UNIFI_HOST_STATE_DROWSY\n");
- return r;
- }
- CsrThreadSleep(5);
- }
-
- r = unifi_card_stop_processor(card, UNIFI_PROC_BOTH);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Can't stop processors\n");
- return r;
- }
-
- unifi_trace(card->ospriv, UDBG1, "Hard reset (DBG_RESET)\n");
-
- /*
- * This register write may fail. The debug reset resets
- * parts of the Function 0 sections of the chip, and
- * therefore the response cannot be sent back to the host.
- */
- r = unifi_write_direct_8_or_16(card, ChipHelper_DBG_RESET(card->helper) * 2, 1);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_warning(card->ospriv, "SDIO error writing DBG_RESET: %d\n", r);
- return r;
- }
-
- /* Delay here to let the reset take affect. */
- CsrThreadSleep(RESET_SETTLE_DELAY);
-
- r = card_wait_for_unifi_to_reset(card);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_warning(card->ospriv, "card_reset_method_dbg_reset failed to reset UniFi\n");
- }
-
- return r;
-} /* card_reset_method_dbg_reset() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_card_hard_reset
- *
- * Issue reset to hardware, by writing to registers on the card.
- * Power to the card is preserved.
- *
- * Arguments:
- * card Pointer to Card object
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success,
- * CSR_WIFI_HIP_RESULT_NO_DEVICE if the card was ejected
- * CSR_RESULT_FAILURE if an SDIO error occurred or if a response
- * was not seen in the expected time
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_card_hard_reset(card_t *card)
-{
- CsrResult r;
- const struct chip_helper_reset_values *init_data;
- u32 chunks;
-
- /* Clear cache of page registers */
- card->proc_select = (u32)(-1);
- card->dmem_page = (u32)(-1);
- card->pmem_page = (u32)(-1);
-
- /*
- * We need to have a valid card->helper before we use software hard reset.
- * If unifi_identify_hw() fails to get the card ID, it probably means
- * that there is no way to talk to the h/w.
- */
- r = unifi_identify_hw(card);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "unifi_card_hard_reset failed to identify h/w\n");
- return r;
- }
-
- /* Search for some reset code. */
- chunks = ChipHelper_HostResetSequence(card->helper, &init_data);
- if (chunks != 0)
- {
- unifi_error(card->ospriv,
- "Hard reset (Code download) is unsupported\n");
-
- return CSR_RESULT_FAILURE;
- }
-
- if (card->chip_id > SDIO_CARD_ID_UNIFI_2)
- {
- /* The HIP spec considers this a bus-specific reset.
- * This resets only function 1, so should be used in
- * preference to the method below (CSR_FUNC_EN)
- * If this method fails, it means that the f/w is probably
- * not running. In this case, try the DBG_RESET method.
- */
- r = card_reset_method_io_enable(card);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r == CSR_RESULT_SUCCESS)
- {
- return r;
- }
- }
-
- /* Software hard reset */
- r = card_reset_method_dbg_reset(card);
-
- return r;
-} /* unifi_card_hard_reset() */
-
-
-/*
- * ---------------------------------------------------------------------------
- *
- * CardGenInt
- *
- * Prod the card.
- * This function causes an internal interrupt to be raised in the
- * UniFi chip. It is used to signal the firmware that some action has
- * been completed.
- * The UniFi Host Interface asks that the value used increments for
- * debugging purposes.
- *
- * Arguments:
- * card Pointer to Card object
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success,
- * CSR_WIFI_HIP_RESULT_NO_DEVICE if the card was ejected
- * CSR_RESULT_FAILURE if an SDIO error occurred or if a response
- * was not seen in the expected time
- * ---------------------------------------------------------------------------
- */
-CsrResult CardGenInt(card_t *card)
-{
- CsrResult r;
-
- if (card->chip_id > SDIO_CARD_ID_UNIFI_2)
- {
- r = sdio_write_f0(card, SDIO_CSR_FROM_HOST_SCRATCH0,
- (u8)card->unifi_interrupt_seq);
- }
- else
- {
- r = unifi_write_direct_8_or_16(card,
- ChipHelper_SHARED_IO_INTERRUPT(card->helper) * 2,
- (u8)card->unifi_interrupt_seq);
- }
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "SDIO error writing UNIFI_SHARED_IO_INTERRUPT: %d\n", r);
- return r;
- }
-
- card->unifi_interrupt_seq++;
-
- return CSR_RESULT_SUCCESS;
-} /* CardGenInt() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * CardEnableInt
- *
- * Enable the outgoing SDIO interrupt from UniFi to the host.
- *
- * Arguments:
- * card Pointer to Card object
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success,
- * CSR_WIFI_HIP_RESULT_NO_DEVICE if the card was ejected
- * CSR_RESULT_FAILURE if an SDIO error occurred,
- * ---------------------------------------------------------------------------
- */
-CsrResult CardEnableInt(card_t *card)
-{
- CsrResult r;
- u8 int_enable;
-
- r = sdio_read_f0(card, SDIO_INT_ENABLE, &int_enable);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "SDIO error reading SDIO_INT_ENABLE\n");
- return r;
- }
-
- int_enable |= (1 << card->function) | UNIFI_SD_INT_ENABLE_IENM;
-
- r = sdio_write_f0(card, SDIO_INT_ENABLE, int_enable);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "SDIO error writing SDIO_INT_ENABLE\n");
- return r;
- }
-
- return CSR_RESULT_SUCCESS;
-} /* CardEnableInt() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * CardDisableInt
- *
- * Disable the outgoing SDIO interrupt from UniFi to the host.
- *
- * Arguments:
- * card Pointer to Card object
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success,
- * CSR_WIFI_HIP_RESULT_NO_DEVICE if the card was ejected
- * CSR_RESULT_FAILURE if an SDIO error occurred,
- * ---------------------------------------------------------------------------
- */
-CsrResult CardDisableInt(card_t *card)
-{
- CsrResult r;
- u8 int_enable;
-
- r = sdio_read_f0(card, SDIO_INT_ENABLE, &int_enable);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "SDIO error reading SDIO_INT_ENABLE\n");
- return r;
- }
-
- int_enable &= ~(1 << card->function);
-
- r = sdio_write_f0(card, SDIO_INT_ENABLE, int_enable);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "SDIO error writing SDIO_INT_ENABLE\n");
- return r;
- }
-
- return CSR_RESULT_SUCCESS;
-} /* CardDisableInt() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * CardPendingInt
- *
- * Determine whether UniFi is currently asserting the SDIO interrupt
- * request.
- *
- * Arguments:
- * card Pointer to Card object
- * pintr Pointer to location to write interrupt status,
- * TRUE if interrupt pending,
- * FALSE if no interrupt pending.
- * Returns:
- * CSR_RESULT_SUCCESS interrupt status read successfully
- * CSR_WIFI_HIP_RESULT_NO_DEVICE if the card was ejected
- * CSR_RESULT_FAILURE if an SDIO error occurred,
- * ---------------------------------------------------------------------------
- */
-CsrResult CardPendingInt(card_t *card, u8 *pintr)
-{
- CsrResult r;
- u8 pending;
-
- *pintr = FALSE;
-
- r = sdio_read_f0(card, SDIO_INT_PENDING, &pending);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "SDIO error reading SDIO_INT_PENDING\n");
- return r;
- }
-
- *pintr = (pending & (1 << card->function))?TRUE : FALSE;
-
- return CSR_RESULT_SUCCESS;
-} /* CardPendingInt() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * CardClearInt
- *
- * Clear the UniFi SDIO interrupt request.
- *
- * Arguments:
- * card Pointer to Card object
- *
- * Returns:
- * CSR_RESULT_SUCCESS if pending interrupt was cleared, or no pending interrupt.
- * CSR_WIFI_HIP_RESULT_NO_DEVICE if the card was ejected
- * CSR_RESULT_FAILURE if an SDIO error occurred,
- * ---------------------------------------------------------------------------
- */
-CsrResult CardClearInt(card_t *card)
-{
- CsrResult r;
- u8 intr;
-
- if (card->chip_id > SDIO_CARD_ID_UNIFI_2)
- {
- /* CardPendingInt() sets intr, if there is a pending interrupt */
- r = CardPendingInt(card, &intr);
- if (intr == FALSE)
- {
- return r;
- }
-
- r = sdio_write_f0(card, SDIO_CSR_HOST_INT_CLEAR, 1);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "SDIO error writing SDIO_CSR_HOST_INT_CLEAR\n");
- }
- }
- else
- {
- r = unifi_write_direct_8_or_16(card,
- ChipHelper_SDIO_HOST_INT(card->helper) * 2,
- 0);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "SDIO error writing UNIFI_SDIO_HOST_INT\n");
- }
- }
-
- return r;
-} /* CardClearInt() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * CardIntEnabled
- *
- * Determine whether UniFi is currently asserting the SDIO interrupt
- * request.
- *
- * Arguments:
- * card Pointer to Card object
- * enabled Pointer to location to write interrupt enable status,
- * TRUE if interrupts enabled,
- * FALSE if interupts disabled.
- *
- * Returns:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE if the card was ejected
- * CSR_RESULT_FAILURE if an SDIO error occurred,
- * ---------------------------------------------------------------------------
- */
-CsrResult CardIntEnabled(card_t *card, u8 *enabled)
-{
- CsrResult r;
- u8 int_enable;
-
- r = sdio_read_f0(card, SDIO_INT_ENABLE, &int_enable);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "SDIO error reading SDIO_INT_ENABLE\n");
- return r;
- }
-
- *enabled = (int_enable & (1 << card->function))?TRUE : FALSE;
-
- return CSR_RESULT_SUCCESS;
-} /* CardIntEnabled() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * CardWriteBulkData
- * Allocate slot in the pending bulkdata arrays and assign it to a signal's
- * bulkdata reference. The slot is then ready for UniFi's bulkdata commands
- * to transfer the data to/from the host.
- *
- * Arguments:
- * card Pointer to Card object
- * csptr Pending signal pointer, including bulkdata ref
- * queue Traffic queue that this signal is using
- *
- * Returns:
- * CSR_RESULT_SUCCESS if a free slot was assigned
- * CSR_RESULT_FAILURE if no slot was available
- * ---------------------------------------------------------------------------
- */
-CsrResult CardWriteBulkData(card_t *card, card_signal_t *csptr, unifi_TrafficQueue queue)
-{
- u16 i, slots[UNIFI_MAX_DATA_REFERENCES], j = 0;
- u8 *packed_sigptr, num_slots_required = 0;
- bulk_data_desc_t *bulkdata = csptr->bulkdata;
- s16 h, nslots;
-
- /* Count the number of slots required */
- for (i = 0; i < UNIFI_MAX_DATA_REFERENCES; i++)
- {
- if (bulkdata[i].data_length != 0)
- {
- num_slots_required++;
- }
- }
-
- /* Get the slot numbers */
- if (num_slots_required != 0)
- {
- /* Last 2 slots for MLME */
- if (queue == UNIFI_TRAFFIC_Q_MLME)
- {
- h = card->config_data.num_fromhost_data_slots - UNIFI_RESERVED_COMMAND_SLOTS;
- for (i = 0; i < card->config_data.num_fromhost_data_slots; i++)
- {
- if (card->from_host_data[h].bd.data_length == 0)
- {
- /* Free data slot, claim it */
- slots[j++] = h;
- if (j == num_slots_required)
- {
- break;
- }
- }
-
- if (++h >= card->config_data.num_fromhost_data_slots)
- {
- h = 0;
- }
- }
- }
- else
- {
- if (card->dynamic_slot_data.from_host_used_slots[queue]
- < card->dynamic_slot_data.from_host_max_slots[queue])
- {
- /* Data commands get a free slot only after a few checks */
- nslots = card->config_data.num_fromhost_data_slots - UNIFI_RESERVED_COMMAND_SLOTS;
-
- h = card->from_host_data_head;
-
- for (i = 0; i < nslots; i++)
- {
- if (card->from_host_data[h].bd.data_length == 0)
- {
- /* Free data slot, claim it */
- slots[j++] = h;
- if (j == num_slots_required)
- {
- break;
- }
- }
-
- if (++h >= nslots)
- {
- h = 0;
- }
- }
- card->from_host_data_head = h;
- }
- }
-
- /* Required number of slots are not available, bail out */
- if (j != num_slots_required)
- {
- unifi_trace(card->ospriv, UDBG5, "CardWriteBulkData: didn't find free slot/s\n");
-
- /* If we haven't already reached the stable state we can ask for reservation */
- if ((queue != UNIFI_TRAFFIC_Q_MLME) && (card->dynamic_slot_data.queue_stable[queue] == FALSE))
- {
- CardCheckDynamicReservation(card, queue);
- }
-
- for (i = 0; i < card->config_data.num_fromhost_data_slots; i++)
- {
- unifi_trace(card->ospriv, UDBG5, "fh data slot %d: %d\n", i, card->from_host_data[i].bd.data_length);
- }
- return CSR_RESULT_FAILURE;
- }
- }
-
- packed_sigptr = csptr->sigbuf;
-
- /* Fill in the slots with data */
- j = 0;
- for (i = 0; i < UNIFI_MAX_DATA_REFERENCES; i++)
- {
- if (bulkdata[i].data_length == 0)
- {
- /* Zero-out the DATAREF in the signal */
- SET_PACKED_DATAREF_SLOT(packed_sigptr, i, 0);
- SET_PACKED_DATAREF_LEN(packed_sigptr, i, 0);
- }
- else
- {
- /*
- * Fill in the slot number in the SIGNAL structure but
- * preserve the offset already in there
- */
- SET_PACKED_DATAREF_SLOT(packed_sigptr, i, slots[j] | (((u16)packed_sigptr[SIZEOF_SIGNAL_HEADER + (i * SIZEOF_DATAREF) + 1]) << 8));
- SET_PACKED_DATAREF_LEN(packed_sigptr, i, bulkdata[i].data_length);
-
- /* Do not copy the data, just store the information to them */
- card->from_host_data[slots[j]].bd.os_data_ptr = bulkdata[i].os_data_ptr;
- card->from_host_data[slots[j]].bd.os_net_buf_ptr = bulkdata[i].os_net_buf_ptr;
- card->from_host_data[slots[j]].bd.data_length = bulkdata[i].data_length;
- card->from_host_data[slots[j]].bd.net_buf_length = bulkdata[i].net_buf_length;
- card->from_host_data[slots[j]].queue = queue;
-
- unifi_trace(card->ospriv, UDBG4, "CardWriteBulkData sig=0x%x, fh slot %d = %p\n",
- GET_SIGNAL_ID(packed_sigptr), i, bulkdata[i].os_data_ptr);
-
- /* Sanity-check that the bulk data desc being assigned to the slot
- * actually has a payload.
- */
- if (!bulkdata[i].os_data_ptr)
- {
- unifi_error(card->ospriv, "Assign null os_data_ptr (len=%d) fh slot %d, i=%d, q=%d, sig=0x%x",
- bulkdata[i].data_length, slots[j], i, queue, GET_SIGNAL_ID(packed_sigptr));
- }
-
- j++;
- if (queue < UNIFI_NO_OF_TX_QS)
- {
- card->dynamic_slot_data.from_host_used_slots[queue]++;
- }
- }
- }
-
- return CSR_RESULT_SUCCESS;
-} /* CardWriteBulkData() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * card_find_data_slot
- *
- * Dereference references to bulk data slots into pointers to real data.
- *
- * Arguments:
- * card Pointer to the card struct.
- * slot Slot number from a signal structure
- *
- * Returns:
- * Pointer to entry in bulk_data_slot array.
- * ---------------------------------------------------------------------------
- */
-bulk_data_desc_t* card_find_data_slot(card_t *card, s16 slot)
-{
- s16 sn;
- bulk_data_desc_t *bd;
-
- sn = slot & 0x7FFF;
-
- /* ?? check sanity of slot number ?? */
-
- if (slot & SLOT_DIR_TO_HOST)
- {
- bd = &card->to_host_data[sn];
- }
- else
- {
- bd = &card->from_host_data[sn].bd;
- }
-
- return bd;
-} /* card_find_data_slot() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * firmware_present_in_flash
- *
- * Probe for external Flash that looks like it might contain firmware.
- *
- * If Flash is not present, reads always return 0x0008.
- * If Flash is present, but empty, reads return 0xFFFF.
- * Anything else is considered to be firmware.
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * CSR_RESULT_SUCCESS firmware is present in ROM or flash
- * CSR_WIFI_HIP_RESULT_NOT_FOUND firmware is not present in ROM or flash
- * CSR_WIFI_HIP_RESULT_NO_DEVICE if the card was ejected
- * CSR_RESULT_FAILURE if an SDIO error occurred
- * ---------------------------------------------------------------------------
- */
-static CsrResult firmware_present_in_flash(card_t *card)
-{
- CsrResult r;
- u16 m1, m5;
-
- if (ChipHelper_HasRom(card->helper))
- {
- return CSR_RESULT_SUCCESS;
- }
- if (!ChipHelper_HasFlash(card->helper))
- {
- return CSR_WIFI_HIP_RESULT_NOT_FOUND;
- }
-
- /*
- * Examine the Flash locations that are the power-on default reset
- * vectors of the XAP processors.
- * These are words 1 and 5 in Flash.
- */
- r = unifi_card_read16(card, UNIFI_MAKE_GP(EXT_FLASH, 2), &m1);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- r = unifi_card_read16(card, UNIFI_MAKE_GP(EXT_FLASH, 10), &m5);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- /* Check for uninitialised/missing flash */
- if ((m1 == 0x0008) || (m1 == 0xFFFF) ||
- (m1 == 0x0004) || (m5 == 0x0004) ||
- (m5 == 0x0008) || (m5 == 0xFFFF))
- {
- return CSR_WIFI_HIP_RESULT_NOT_FOUND;
- }
-
- return CSR_RESULT_SUCCESS;
-} /* firmware_present_in_flash() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * bootstrap_chip_hw
- *
- * Perform chip specific magic to "Get It Working" TM. This will
- * increase speed of PLLs in analogue and maybe enable some
- * on-chip regulators.
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * None.
- * ---------------------------------------------------------------------------
- */
-static void bootstrap_chip_hw(card_t *card)
-{
- const struct chip_helper_init_values *vals;
- u32 i, len;
- void *sdio = card->sdio_if;
- CsrResult csrResult;
-
- len = ChipHelper_ClockStartupSequence(card->helper, &vals);
- if (len != 0)
- {
- for (i = 0; i < len; i++)
- {
- csrResult = CsrSdioWrite16(sdio, vals[i].addr * 2, vals[i].value);
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- unifi_warning(card->ospriv, "Failed to write bootstrap value %d\n", i);
- /* Might not be fatal */
- }
-
- CsrThreadSleep(1);
- }
- }
-} /* bootstrap_chip_hw() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_card_stop_processor
- *
- * Stop the UniFi XAP processors.
- *
- * Arguments:
- * card Pointer to card struct
- * which One of UNIFI_PROC_MAC, UNIFI_PROC_PHY, UNIFI_PROC_BOTH
- *
- * Returns:
- * CSR_RESULT_SUCCESS if successful, or CSR error code
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_card_stop_processor(card_t *card, enum unifi_dbg_processors_select which)
-{
- CsrResult r = CSR_RESULT_SUCCESS;
- u8 status;
- s16 retry = 100;
-
- while (retry--)
- {
- /* Select both XAPs */
- r = unifi_set_proc_select(card, which);
- if (r != CSR_RESULT_SUCCESS)
- {
- break;
- }
-
- /* Stop processors */
- r = unifi_write_direct16(card, ChipHelper_DBG_EMU_CMD(card->helper) * 2, 2);
- if (r != CSR_RESULT_SUCCESS)
- {
- break;
- }
-
- /* Read status */
- r = unifi_read_direct_8_or_16(card,
- ChipHelper_DBG_HOST_STOP_STATUS(card->helper) * 2,
- &status);
- if (r != CSR_RESULT_SUCCESS)
- {
- break;
- }
-
- if ((status & 1) == 1)
- {
- /* Success! */
- return CSR_RESULT_SUCCESS;
- }
-
- /* Processors didn't stop, try again */
- }
-
- if (r != CSR_RESULT_SUCCESS)
- {
- /* An SDIO error occurred */
- unifi_error(card->ospriv, "Failed to stop processors: SDIO error\n");
- }
- else
- {
- /* If we reach here, we didn't the status in time. */
- unifi_error(card->ospriv, "Failed to stop processors: timeout waiting for stopped status\n");
- r = CSR_RESULT_FAILURE;
- }
-
- return r;
-} /* unifi_card_stop_processor() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * card_start_processor
- *
- * Start the UniFi XAP processors.
- *
- * Arguments:
- * card Pointer to card struct
- * which One of UNIFI_PROC_MAC, UNIFI_PROC_PHY, UNIFI_PROC_BOTH
- *
- * Returns:
- * CSR_RESULT_SUCCESS or CSR error code
- * ---------------------------------------------------------------------------
- */
-CsrResult card_start_processor(card_t *card, enum unifi_dbg_processors_select which)
-{
- CsrResult r;
-
- /* Select both XAPs */
- r = unifi_set_proc_select(card, which);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "unifi_set_proc_select failed: %d.\n", r);
- return r;
- }
-
-
- r = unifi_write_direct_8_or_16(card,
- ChipHelper_DBG_EMU_CMD(card->helper) * 2, 8);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- r = unifi_write_direct_8_or_16(card,
- ChipHelper_DBG_EMU_CMD(card->helper) * 2, 0);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- return CSR_RESULT_SUCCESS;
-} /* card_start_processor() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_set_interrupt_mode
- *
- * Configure the interrupt processing mode used by the HIP
- *
- * Arguments:
- * card Pointer to card struct
- * mode Interrupt mode to apply
- *
- * Returns:
- * None
- * ---------------------------------------------------------------------------
- */
-void unifi_set_interrupt_mode(card_t *card, u32 mode)
-{
- if (mode == CSR_WIFI_INTMODE_RUN_BH_ONCE)
- {
- unifi_info(card->ospriv, "Scheduled interrupt mode");
- }
- card->intmode = mode;
-} /* unifi_set_interrupt_mode() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_start_processors
- *
- * Start all UniFi XAP processors.
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, CSR error code on error
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_start_processors(card_t *card)
-{
- return card_start_processor(card, UNIFI_PROC_BOTH);
-} /* unifi_start_processors() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_request_max_sdio_clock
- *
- * Requests that the maximum SDIO clock rate is set at the next suitable
- * opportunity (e.g. when the BH next runs, so as not to interfere with
- * any current operation).
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * None
- * ---------------------------------------------------------------------------
- */
-void unifi_request_max_sdio_clock(card_t *card)
-{
- card->request_max_clock = 1;
-} /* unifi_request_max_sdio_clock() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_set_host_state
- *
- * Set the host deep-sleep state.
- *
- * If transitioning to TORPID, the SDIO driver will be notified
- * that the SD bus will be unused (idle) and conversely, when
- * transitioning from TORPID that the bus will be used (active).
- *
- * Arguments:
- * card Pointer to card struct
- * state New deep-sleep state.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success
- * CSR_WIFI_HIP_RESULT_NO_DEVICE if the card was ejected
- * CSR_RESULT_FAILURE if an SDIO error occurred
- *
- * Notes:
- * We need to reduce the SDIO clock speed before trying to wake up the
- * chip. Actually, in the implementation below we reduce the clock speed
- * not just before we try to wake up the chip, but when we put the chip to
- * deep sleep. This means that if the f/w wakes up on its' own, we waste
- * a reduce/increace cycle. However, trying to eliminate this overhead is
- * proved difficult, as the current state machine in the HIP lib does at
- * least a CMD52 to disable the interrupts before we configure the host
- * state.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_set_host_state(card_t *card, enum unifi_host_state state)
-{
- CsrResult r = CSR_RESULT_SUCCESS;
- CsrResult csrResult;
- static const char *const states[] = {
- "AWAKE", "DROWSY", "TORPID"
- };
- static const u8 state_csr_host_wakeup[] = {
- 1, 3, 0
- };
- static const u8 state_io_abort[] = {
- 0, 2, 3
- };
-
- unifi_trace(card->ospriv, UDBG4, "State %s to %s\n",
- states[card->host_state], states[state]);
-
- if (card->host_state == UNIFI_HOST_STATE_TORPID)
- {
- CsrSdioFunctionActive(card->sdio_if);
- }
-
- /* Write the new state to UniFi. */
- if (card->chip_id > SDIO_CARD_ID_UNIFI_2)
- {
- r = sdio_write_f0(card, SDIO_CSR_HOST_WAKEUP,
- (u8)((card->function << 4) | state_csr_host_wakeup[state]));
- }
- else
- {
- r = sdio_write_f0(card, SDIO_IO_ABORT, state_io_abort[state]);
- }
-
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to write UniFi deep sleep state\n");
- }
- else
- {
- /*
- * If the chip was in state TORPID then we can now increase
- * the maximum bus clock speed.
- */
- if (card->host_state == UNIFI_HOST_STATE_TORPID)
- {
- csrResult = CsrSdioMaxBusClockFrequencySet(card->sdio_if,
- UNIFI_SDIO_CLOCK_MAX_HZ);
- r = ConvertCsrSdioToCsrHipResult(card, csrResult);
- /* Non-fatal error */
- if (r != CSR_RESULT_SUCCESS && r != CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- unifi_warning(card->ospriv,
- "Failed to increase the SDIO clock speed\n");
- }
- else
- {
- card->sdio_clock_speed = UNIFI_SDIO_CLOCK_MAX_HZ;
- }
- }
-
- /*
- * Cache the current state in the card structure to avoid
- * unnecessary SDIO reads.
- */
- card->host_state = state;
-
- if (state == UNIFI_HOST_STATE_TORPID)
- {
- /*
- * If the chip is now in state TORPID then we must now decrease
- * the maximum bus clock speed.
- */
- csrResult = CsrSdioMaxBusClockFrequencySet(card->sdio_if,
- UNIFI_SDIO_CLOCK_SAFE_HZ);
- r = ConvertCsrSdioToCsrHipResult(card, csrResult);
- if (r != CSR_RESULT_SUCCESS && r != CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- unifi_warning(card->ospriv,
- "Failed to decrease the SDIO clock speed\n");
- }
- else
- {
- card->sdio_clock_speed = UNIFI_SDIO_CLOCK_SAFE_HZ;
- }
- CsrSdioFunctionIdle(card->sdio_if);
- }
- }
-
- return r;
-} /* unifi_set_host_state() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_card_info
- *
- * Update the card information data structure
- *
- * Arguments:
- * card Pointer to card struct
- * card_info Pointer to info structure to update
- *
- * Returns:
- * None
- * ---------------------------------------------------------------------------
- */
-void unifi_card_info(card_t *card, card_info_t *card_info)
-{
- card_info->chip_id = card->chip_id;
- card_info->chip_version = card->chip_version;
- card_info->fw_build = card->build_id;
- card_info->fw_hip_version = card->config_data.version;
- card_info->sdio_block_size = card->sdio_io_block_size;
-} /* unifi_card_info() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_check_io_status
- *
- * Check UniFi for spontaneous reset and pending interrupt.
- *
- * Arguments:
- * card Pointer to card struct
- * status Pointer to location to write chip status:
- * 0 if UniFi is running, and no interrupt pending
- * 1 if UniFi has spontaneously reset
- * 2 if there is a pending interrupt
- * Returns:
- * CSR_RESULT_SUCCESS if OK, or CSR error
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_check_io_status(card_t *card, s32 *status)
-{
- u8 io_en;
- CsrResult r;
- u8 pending;
-
- *status = 0;
-
- r = sdio_read_f0(card, SDIO_IO_ENABLE, &io_en);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read SDIO_IO_ENABLE to check for spontaneous reset\n");
- return r;
- }
-
- if ((io_en & (1 << card->function)) == 0)
- {
- s32 fw_count;
- *status = 1;
- unifi_error(card->ospriv, "UniFi has spontaneously reset.\n");
-
- /*
- * These reads are very likely to fail. We want to know if the function is really
- * disabled or the SDIO driver just returns rubbish.
- */
- fw_count = unifi_read_shared_count(card, card->sdio_ctrl_addr + 4);
- if (fw_count < 0)
- {
- unifi_error(card->ospriv, "Failed to read to-host sig written count\n");
- }
- else
- {
- unifi_error(card->ospriv, "thsw: %u (driver thinks is %u)\n",
- fw_count, card->to_host_signals_w);
- }
- fw_count = unifi_read_shared_count(card, card->sdio_ctrl_addr + 2);
- if (fw_count < 0)
- {
- unifi_error(card->ospriv, "Failed to read from-host sig read count\n");
- }
- else
- {
- unifi_error(card->ospriv, "fhsr: %u (driver thinks is %u)\n",
- fw_count, card->from_host_signals_r);
- }
-
- return r;
- }
-
- unifi_info(card->ospriv, "UniFi function %d is enabled.\n", card->function);
-
- /* See if we missed an SDIO interrupt */
- r = CardPendingInt(card, &pending);
- if (pending)
- {
- unifi_error(card->ospriv, "There is an unhandled pending interrupt.\n");
- *status = 2;
- return r;
- }
-
- return r;
-} /* unifi_check_io_status() */
-
-
-void unifi_get_hip_qos_info(card_t *card, unifi_HipQosInfo *hipqosinfo)
-{
- s32 count_fhr;
- s16 t;
- u32 occupied_fh;
-
- q_t *sigq;
- u16 nslots, i;
-
- memset(hipqosinfo, 0, sizeof(unifi_HipQosInfo));
-
- nslots = card->config_data.num_fromhost_data_slots;
-
- for (i = 0; i < nslots; i++)
- {
- if (card->from_host_data[i].bd.data_length == 0)
- {
- hipqosinfo->free_fh_bulkdata_slots++;
- }
- }
-
- for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
- {
- sigq = &card->fh_traffic_queue[i];
- t = sigq->q_wr_ptr - sigq->q_rd_ptr;
- if (t < 0)
- {
- t += sigq->q_length;
- }
- hipqosinfo->free_fh_sig_queue_slots[i] = (sigq->q_length - t) - 1;
- }
-
- count_fhr = unifi_read_shared_count(card, card->sdio_ctrl_addr + 2);
- if (count_fhr < 0)
- {
- unifi_error(card->ospriv, "Failed to read from-host sig read count - %d\n", count_fhr);
- hipqosinfo->free_fh_fw_slots = 0xfa;
- return;
- }
-
- occupied_fh = (card->from_host_signals_w - count_fhr) % 128;
-
- hipqosinfo->free_fh_fw_slots = (u16)(card->config_data.num_fromhost_sig_frags - occupied_fh);
-}
-
-
-
-CsrResult ConvertCsrSdioToCsrHipResult(card_t *card, CsrResult csrResult)
-{
- CsrResult r = CSR_RESULT_FAILURE;
-
- switch (csrResult)
- {
- case CSR_RESULT_SUCCESS:
- r = CSR_RESULT_SUCCESS;
- break;
- /* Timeout errors */
- case CSR_SDIO_RESULT_TIMEOUT:
- /* Integrity errors */
- case CSR_SDIO_RESULT_CRC_ERROR:
- r = CSR_RESULT_FAILURE;
- break;
- case CSR_SDIO_RESULT_NO_DEVICE:
- r = CSR_WIFI_HIP_RESULT_NO_DEVICE;
- break;
- case CSR_SDIO_RESULT_INVALID_VALUE:
- r = CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- break;
- case CSR_RESULT_FAILURE:
- r = CSR_RESULT_FAILURE;
- break;
- default:
- unifi_warning(card->ospriv, "Unrecognised csrResult error code: %d\n", csrResult);
- break;
- }
-
- return r;
-} /* ConvertCsrSdioToCsrHipResult() */
-
-
diff --git a/drivers/staging/csr/csr_wifi_hip_card_sdio.h b/drivers/staging/csr/csr_wifi_hip_card_sdio.h
deleted file mode 100644
index a9b9ec427320..000000000000
--- a/drivers/staging/csr/csr_wifi_hip_card_sdio.h
+++ /dev/null
@@ -1,694 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2011
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-/*
- * ---------------------------------------------------------------------------
- *
- * FILE: csr_wifi_hip_card_sdio.h
- *
- * PURPOSE:
- * Internal header for Card API for SDIO.
- * ---------------------------------------------------------------------------
- */
-#ifndef __CARD_SDIO_H__
-#define __CARD_SDIO_H__
-
-#include "csr_wifi_hip_unifi.h"
-#include "csr_wifi_hip_unifi_udi.h"
-#include "csr_wifi_hip_unifihw.h"
-#include "csr_wifi_hip_unifiversion.h"
-#ifndef CSR_WIFI_HIP_TA_DISABLE
-#include "csr_wifi_hip_ta_sampling.h"
-#endif
-#include "csr_wifi_hip_xbv.h"
-#include "csr_wifi_hip_chiphelper.h"
-
-
-/*
- *
- * Configuration items.
- * Which of these should go in a platform unifi_config.h file?
- *
- */
-
-/*
- * When the traffic queues contain more signals than there is space for on
- * UniFi, a limiting algorithm comes into play.
- * If a traffic queue has enough slots free to buffer more traffic from the
- * network stack, then the following check is applied. The number of free
- * slots is RESUME_XMIT_THRESHOLD.
- */
-#define RESUME_XMIT_THRESHOLD 4
-
-
-/*
- * When reading signals from UniFi, the host processes pending all signals
- * and then acknowledges them together in a single write to update the
- * to-host-chunks-read location.
- * When there is more than one bulk data transfer (e.g. one received data
- * packet and a request for the payload data of a transmitted packet), the
- * update can be delayed significantly. This ties up resources on chip.
- *
- * To remedy this problem, to-host-chunks-read is updated after processing
- * a signal if TO_HOST_FLUSH_THRESHOLD bytes of bulk data have been
- * transferred since the last update.
- */
-#define TO_HOST_FLUSH_THRESHOLD (500 * 5)
-
-
-/* SDIO Card Common Control Registers */
-#define SDIO_CCCR_SDIO_REVISION (0x00)
-#define SDIO_SD_SPEC_REVISION (0x01)
-#define SDIO_IO_ENABLE (0x02)
-#define SDIO_IO_READY (0x03)
-#define SDIO_INT_ENABLE (0x04)
-#define SDIO_INT_PENDING (0x05)
-#define SDIO_IO_ABORT (0x06)
-#define SDIO_BUS_IFACE_CONTROL (0x07)
-#define SDIO_CARD_CAPABILOTY (0x08)
-#define SDIO_COMMON_CIS_POINTER (0x09)
-#define SDIO_BUS_SUSPEND (0x0C)
-#define SDIO_FUNCTION_SELECT (0x0D)
-#define SDIO_EXEC_FLAGS (0x0E)
-#define SDIO_READY_FLAGS (0x0F)
-#define SDIO_FN0_BLOCK_SIZE (0x10)
-#define SDIO_POWER_CONTROL (0x12)
-#define SDIO_VENDOR_START (0xF0)
-
-#define SDIO_CSR_HOST_WAKEUP (0xf0)
-#define SDIO_CSR_HOST_INT_CLEAR (0xf1)
-#define SDIO_CSR_FROM_HOST_SCRATCH0 (0xf2)
-#define SDIO_CSR_FROM_HOST_SCRATCH1 (0xf3)
-#define SDIO_CSR_TO_HOST_SCRATCH0 (0xf4)
-#define SDIO_CSR_TO_HOST_SCRATCH1 (0xf5)
-#define SDIO_CSR_FUNC_EN (0xf6)
-#define SDIO_CSR_CSPI_MODE (0xf7)
-#define SDIO_CSR_CSPI_STATUS (0xf8)
-#define SDIO_CSR_CSPI_PADDING (0xf9)
-
-
-#define UNIFI_SD_INT_ENABLE_IENM 0x0001 /* Master INT Enable */
-
-#ifdef CSR_PRE_ALLOC_NET_DATA
-#define BULK_DATA_PRE_ALLOC_NUM 16
-#endif
-
-/*
- * Structure to hold configuration information read from UniFi.
- */
-typedef struct
-{
- /*
- * The version of the SDIO signal queues and bulk data pools
- * configuration structure. The MSB is the major version number, used to
- * indicate incompatible changes. The LSB gives the minor revision number,
- * used to indicate changes that maintain backwards compatibility.
- */
- u16 version;
-
- /*
- * offset from the start of the shared data memory to the SD IO
- * control structure.
- */
- u16 sdio_ctrl_offset;
-
- /* Buffer handle of the from-host signal queue */
- u16 fromhost_sigbuf_handle;
-
- /* Buffer handle of the to-host signal queue */
- u16 tohost_sigbuf_handle;
-
- /*
- * Maximum number of signal primitive or bulk data command fragments that may be
- * pending in the to-hw signal queue.
- */
- u16 num_fromhost_sig_frags;
-
- /*
- * Number of signal primitive or bulk data command fragments that must be pending
- * in the to-host signal queue before the host will generate an interrupt
- * to indicate that it has read a signal. This will usually be the total
- * capacity of the to-host signal buffer less the size of the largest signal
- * primitive divided by the signal primitive fragment size, but may be set
- * to 1 to request interrupts every time that the host read a signal.
- * Note that the hw may place more signals in the to-host signal queue
- * than indicated by this field.
- */
- u16 num_tohost_sig_frags;
-
- /*
- * Number of to-hw bulk data slots. Slots are numbered from 0 (zero) to
- * one less than the value in this field
- */
- u16 num_fromhost_data_slots;
-
- /*
- * Number of frm-hw bulk data slots. Slots are numbered from 0 (zero) to
- * one less than the value in this field
- */
- u16 num_tohost_data_slots;
-
- /*
- * Size of the bulk data slots (2 octets)
- * The size of the bulk data slots in octets. This will usually be
- * the size of the largest MSDU. The value should always be even.
- */
- u16 data_slot_size;
-
- /*
- * Indicates that the host has finished the initialisation sequence.
- * Initialised to 0x0000 by the firmware, and set to 0x0001 by us.
- */
- u16 initialised;
-
- /* Added by protocol version 0x0001 */
- u32 overlay_size;
-
- /* Added by protocol version 0x0300 */
- u16 data_slot_round;
- u16 sig_frag_size;
-
- /* Added by protocol version 0x0500 */
- u16 tohost_signal_padding;
-} sdio_config_data_t;
-
-/*
- * These values may change with versions of the Host Interface Protocol.
- */
-/*
- * Size of config info block pointed to by the CSR_SLT_SDIO_SLOT_CONFIG
- * entry in the f/w symbol table
- */
-#define SDIO_CONFIG_DATA_SIZE 30
-
-/* Offset of the INIT flag in the config info block. */
-#define SDIO_INIT_FLAG_OFFSET 0x12
-#define SDIO_TO_HOST_SIG_PADDING_OFFSET 0x1C
-
-
-/* Structure for a bulk data transfer command */
-typedef struct
-{
- u16 cmd_and_len; /* bits 12-15 cmd, bits 0-11 len */
- u16 data_slot; /* slot number, perhaps OR'd with SLOT_DIR_TO_HOST */
- u16 offset;
- u16 buffer_handle;
-} bulk_data_cmd_t;
-
-
-/* Bulk Data signal command values */
-#define SDIO_CMD_SIGNAL 0x00
-#define SDIO_CMD_TO_HOST_TRANSFER 0x01
-#define SDIO_CMD_TO_HOST_TRANSFER_ACK 0x02 /*deprecated*/
-#define SDIO_CMD_FROM_HOST_TRANSFER 0x03
-#define SDIO_CMD_FROM_HOST_TRANSFER_ACK 0x04 /*deprecated*/
-#define SDIO_CMD_CLEAR_SLOT 0x05
-#define SDIO_CMD_OVERLAY_TRANSFER 0x06
-#define SDIO_CMD_OVERLAY_TRANSFER_ACK 0x07 /*deprecated*/
-#define SDIO_CMD_FROM_HOST_AND_CLEAR 0x08
-#define SDIO_CMD_PADDING 0x0f
-
-#define SLOT_DIR_TO_HOST 0x8000
-
-
-/* Initialise bulkdata slot
- * params:
- * bulk_data_desc_t *bulk_data_slot
- */
-#define UNIFI_INIT_BULK_DATA(bulk_data_slot) \
- { \
- (bulk_data_slot)->os_data_ptr = NULL; \
- (bulk_data_slot)->data_length = 0; \
- (bulk_data_slot)->os_net_buf_ptr = NULL; \
- (bulk_data_slot)->net_buf_length = 0; \
- }
-
-/*
- * Structure to contain a SIGNAL datagram.
- * This is used to build signal queues between the main driver and the
- * i/o thread.
- * The fields are:
- * sigbuf Contains the HIP signal is wire-format (i.e. packed,
- * little-endian)
- * bulkdata Contains a copy of any associated bulk data
- * signal_length The size of the signal in the sigbuf
- */
-typedef struct card_signal
-{
- u8 sigbuf[UNIFI_PACKED_SIGBUF_SIZE];
-
- /* Length of the SIGNAL inside sigbuf */
- u16 signal_length;
-
- bulk_data_desc_t bulkdata[UNIFI_MAX_DATA_REFERENCES];
-} card_signal_t;
-
-
-/*
- * Control structure for a generic ring buffer.
- */
-#define UNIFI_QUEUE_NAME_MAX_LENGTH 16
-typedef struct
-{
- card_signal_t *q_body;
-
- /* Num elements in queue (capacity is one less than this!) */
- u16 q_length;
-
- u16 q_wr_ptr;
- u16 q_rd_ptr;
-
- char name[UNIFI_QUEUE_NAME_MAX_LENGTH];
-} q_t;
-
-
-#define UNIFI_RESERVED_COMMAND_SLOTS 2
-
-/* Considering approx 500 us per packet giving 0.5 secs */
-#define UNIFI_PACKETS_INTERVAL 1000
-
-/*
- * Dynamic slot reservation for QoS
- */
-typedef struct
-{
- u16 from_host_used_slots[UNIFI_NO_OF_TX_QS];
- u16 from_host_max_slots[UNIFI_NO_OF_TX_QS];
- u16 from_host_reserved_slots[UNIFI_NO_OF_TX_QS];
-
- /* Parameters to determine if a queue was active.
- If number of packets sent is greater than the threshold
- for the queue, the queue is considered active and no
- re reservation is done, it is important not to keep this
- value too low */
- /* Packets sent during this interval */
- u16 packets_txed[UNIFI_NO_OF_TX_QS];
- u16 total_packets_txed;
-
- /* Number of packets to see if slots need to be reassigned */
- u16 packets_interval;
-
- /* Once a queue reaches a stable state, avoid processing */
- u8 queue_stable[UNIFI_NO_OF_TX_QS];
-} card_dynamic_slot_t;
-
-
-/* These are type-safe and don't write incorrect values to the
- * structure. */
-
-/* Return queue slots used count
- * params:
- * const q_t *q
- * returns:
- * u16
- */
-#define CSR_WIFI_HIP_Q_SLOTS_USED(q) \
- (((q)->q_wr_ptr - (q)->q_rd_ptr < 0)? \
- ((q)->q_wr_ptr - (q)->q_rd_ptr + (q)->q_length) : ((q)->q_wr_ptr - (q)->q_rd_ptr))
-
-/* Return queue slots free count
- * params:
- * const q_t *q
- * returns:
- * u16
- */
-#define CSR_WIFI_HIP_Q_SLOTS_FREE(q) \
- ((q)->q_length - CSR_WIFI_HIP_Q_SLOTS_USED((q)) - 1)
-
-/* Return slot signal data pointer
- * params:
- * const q_t *q
- * u16 slot
- * returns:
- * card_signal_t *
- */
-#define CSR_WIFI_HIP_Q_SLOT_DATA(q, slot) \
- ((q)->q_body + slot)
-
-/* Return queue next read slot
- * params:
- * const q_t *q
- * returns:
- * u16 slot offset
- */
-#define CSR_WIFI_HIP_Q_NEXT_R_SLOT(q) \
- ((q)->q_rd_ptr)
-
-/* Return queue next write slot
- * params:
- * const q_t *q
- * returns:
- * u16 slot offset
- */
-#define CSR_WIFI_HIP_Q_NEXT_W_SLOT(q) \
- ((q)->q_wr_ptr)
-
-/* Return updated queue pointer wrapped around its length
- * params:
- * const q_t *q
- * u16 x amount to add to queue pointer
- * returns:
- * u16 wrapped queue pointer
- */
-#define CSR_WIFI_HIP_Q_WRAP(q, x) \
- ((((x) >= (q)->q_length)?((x) % (q)->q_length) : (x)))
-
-/* Advance queue read pointer
- * params:
- * const q_t *q
- */
-#define CSR_WIFI_HIP_Q_INC_R(q) \
- ((q)->q_rd_ptr = CSR_WIFI_HIP_Q_WRAP((q), (q)->q_rd_ptr + 1))
-
-/* Advance queue write pointer
- * params:
- * const q_t *q
- */
-#define CSR_WIFI_HIP_Q_INC_W(q) \
- ((q)->q_wr_ptr = CSR_WIFI_HIP_Q_WRAP((q), (q)->q_wr_ptr + 1))
-
-enum unifi_host_state
-{
- UNIFI_HOST_STATE_AWAKE = 0,
- UNIFI_HOST_STATE_DROWSY = 1,
- UNIFI_HOST_STATE_TORPID = 2
-};
-
-typedef struct
-{
- bulk_data_desc_t bd;
- unifi_TrafficQueue queue; /* Used for dynamic slot reservation */
-} slot_desc_t;
-
-/*
- * Structure describing a UniFi SDIO card.
- */
-struct card
-{
- /*
- * Back pointer for the higher level OS code. This is passed as
- * an argument to callbacks (e.g. for received data and indications).
- */
- void *ospriv;
-
- /*
- * mapping of HIP slot to MA-PACKET.req host tag, the
- * array is indexed by slot numbers and each index stores
- * information of the last host tag it was used for
- */
- u32 *fh_slot_host_tag_record;
-
-
- /* Info read from Symbol Table during probe */
- u32 build_id;
- char build_id_string[128];
-
- /* Retrieve from SDIO driver. */
- u16 chip_id;
-
- /* Read from GBL_CHIP_VERSION. */
- u16 chip_version;
-
- /* From the SDIO driver (probably 1) */
- u8 function;
-
- /* This is sused to get the register addresses and things. */
- ChipDescript *helper;
-
- /*
- * Bit mask of PIOs for the loader to waggle during download.
- * We assume these are connected to LEDs. The main firmware gets
- * the mask from a MIB entry.
- */
- s32 loader_led_mask;
-
- /*
- * Support for flow control. When the from-host queue of signals
- * is full, we ask the host upper layer to stop sending packets. When
- * the queue drains we tell it that it can send packets again.
- * We use this flag to remember the current state.
- */
-#define card_is_tx_q_paused(card, q) (card->tx_q_paused_flag[q])
-#define card_tx_q_unpause(card, q) (card->tx_q_paused_flag[q] = 0)
-#define card_tx_q_pause(card, q) (card->tx_q_paused_flag[q] = 1)
-
- u16 tx_q_paused_flag[UNIFI_TRAFFIC_Q_MAX + 1 + UNIFI_NO_OF_TX_QS]; /* defensive more than big enough */
-
- /* UDI callback for logging UniFi interactions */
- udi_func_t udi_hook;
-
- u8 bh_reason_host;
- u8 bh_reason_unifi;
-
- /* SDIO clock speed request from OS layer */
- u8 request_max_clock;
-
- /* Last SDIO clock frequency set */
- u32 sdio_clock_speed;
-
- /*
- * Current host state (copy of value in IOABORT register and
- * spinlock to protect it.
- */
- enum unifi_host_state host_state;
-
- enum unifi_low_power_mode low_power_mode;
- enum unifi_periodic_wake_mode periodic_wake_mode;
-
- /*
- * Ring buffer of signal structs for a queue of data packets from
- * the host.
- * The queue is empty when fh_data_q_num_rd == fh_data_q_num_wr.
- * To add a packet to the queue, copy it to index given by
- * (fh_data_q_num_wr%UNIFI_SOFT_Q_LENGTH) and advance fh_data_q_num_wr.
- * To take a packet from the queue, copy data from index given by
- * (fh_data_q_num_rd%UNIFI_SOFT_Q_LENGTH) and advance fh_data_q_num_rd.
- * fh_data_q_num_rd and fh_data_q_num_rd are both modulo 256.
- */
- card_signal_t fh_command_q_body[UNIFI_SOFT_COMMAND_Q_LENGTH];
- q_t fh_command_queue;
-
- card_signal_t fh_traffic_q_body[UNIFI_NO_OF_TX_QS][UNIFI_SOFT_TRAFFIC_Q_LENGTH];
- q_t fh_traffic_queue[UNIFI_NO_OF_TX_QS];
-
- /*
- * Signal counts from UniFi SDIO Control Data Structure.
- * These are cached and synchronised with the UniFi before and after
- * a batch of operations.
- *
- * These are the modulo-256 count of signals written to or read from UniFi
- * The value is incremented for every signal.
- */
- s32 from_host_signals_w;
- s32 from_host_signals_r;
- s32 to_host_signals_r;
- s32 to_host_signals_w;
-
-
- /* Should specify buffer size as a number of signals */
- /*
- * Enough for 10 th and 10 fh data slots:
- * 1 * 10 * 8 = 80
- * 2 * 10 * 8 = 160
- */
-#define UNIFI_FH_BUF_SIZE 1024
- struct sigbuf
- {
- u8 *buf; /* buffer area */
- u8 *ptr; /* current pos */
- u16 count; /* signal count */
- u16 bufsize;
- } fh_buffer;
- struct sigbuf th_buffer;
-
-
- /*
- * Field to use for the incrementing value to write to the UniFi
- * SHARED_IO_INTERRUPT register.
- * Flag to say we need to generate an interrupt at end of processing.
- */
- u32 unifi_interrupt_seq;
- u8 generate_interrupt;
-
-
- /* Pointers to the bulk data slots */
- slot_desc_t *from_host_data;
- bulk_data_desc_t *to_host_data;
-
-
- /*
- * Index of the next (hopefully) free data slot.
- * This is an optimisation that starts searching at a more likely point
- * than the beginning.
- */
- s16 from_host_data_head;
-
- /* Dynamic slot allocation for queues */
- card_dynamic_slot_t dynamic_slot_data;
-
- /*
- * SDIO specific fields
- */
-
- /* Interface pointer for the SDIO library */
- CsrSdioFunction *sdio_if;
-
- /* Copy of config_data struct from the card */
- sdio_config_data_t config_data;
-
- /* SDIO address of the Initialised flag and Control Data struct */
- u32 init_flag_addr;
- u32 sdio_ctrl_addr;
-
- /* The last value written to the Shared Data Memory Page register */
- u32 proc_select;
- u32 dmem_page;
- u32 pmem_page;
-
- /* SDIO traffic counters limited to 32 bits for Synergy compatibility */
- u32 sdio_bytes_read;
- u32 sdio_bytes_written;
-
- u8 memory_resources_allocated;
-
- /* UniFi SDIO I/O Block size. */
- u16 sdio_io_block_size;
-
- /* Pad transfer sizes to SDIO block boundaries */
- u8 sdio_io_block_pad;
-
- /* Read from the XBV */
- struct FWOV fwov;
-
-#ifndef CSR_WIFI_HIP_TA_DISABLE
- /* TA sampling */
- ta_data_t ta_sampling;
-#endif
-
- /* Auto-coredump */
- s16 request_coredump_on_reset; /* request coredump on next reset */
- struct coredump_buf *dump_buf; /* root node */
- struct coredump_buf *dump_next_write; /* node to fill at next dump */
- struct coredump_buf *dump_cur_read; /* valid node to read, or NULL */
-
-#ifdef CSR_WIFI_HIP_DATA_PLANE_PROFILE
- struct cmd_profile
- {
- u32 cmd52_count;
- u32 cmd53_count;
- u32 tx_count;
- u32 tx_cfm_count;
- u32 rx_count;
- u32 bh_count;
- u32 process_count;
- u32 protocol_count;
-
- u32 cmd52_f0_r_count;
- u32 cmd52_f0_w_count;
- u32 cmd52_r8or16_count;
- u32 cmd52_w8or16_count;
- u32 cmd52_r16_count;
- u32 cmd52_w16_count;
- u32 cmd52_r32_count;
-
- u32 sdio_cmd_signal;
- u32 sdio_cmd_clear_slot;
- u32 sdio_cmd_to_host;
- u32 sdio_cmd_from_host;
- u32 sdio_cmd_from_host_and_clear;
- } hip_prof;
- struct cmd_profile cmd_prof;
-#endif
-
- /* Interrupt processing mode flags */
- u32 intmode;
-
-#ifdef UNIFI_DEBUG
- u8 lsb;
-#endif
-
- /* Historic firmware panic codes */
- u32 panic_data_phy_addr;
- u32 panic_data_mac_addr;
- u16 last_phy_panic_code;
- u16 last_phy_panic_arg;
- u16 last_mac_panic_code;
- u16 last_mac_panic_arg;
-#ifdef CSR_PRE_ALLOC_NET_DATA
- bulk_data_desc_t bulk_data_desc_list[BULK_DATA_PRE_ALLOC_NUM];
- u16 prealloc_netdata_r;
- u16 prealloc_netdata_w;
-#endif
-}; /* struct card */
-
-
-/* Reset types */
-enum unifi_reset_type
-{
- UNIFI_COLD_RESET = 1,
- UNIFI_WARM_RESET = 2
-};
-
-/*
- * unifi_set_host_state() implements signalling for waking UniFi from
- * deep sleep. The host indicates to UniFi that it is in one of three states:
- * Torpid - host has nothing to send, UniFi can go to sleep.
- * Drowsy - host has data to send to UniFi. UniFi will respond with an
- * SDIO interrupt. When hosts responds it moves to Awake.
- * Awake - host has data to transfer, UniFi must stay awake.
- * When host has finished, it moves to Torpid.
- */
-CsrResult unifi_set_host_state(card_t *card, enum unifi_host_state state);
-
-
-CsrResult unifi_set_proc_select(card_t *card, enum unifi_dbg_processors_select select);
-s32 card_read_signal_counts(card_t *card);
-bulk_data_desc_t* card_find_data_slot(card_t *card, s16 slot);
-
-
-CsrResult unifi_read32(card_t *card, u32 unifi_addr, u32 *pdata);
-CsrResult unifi_readnz(card_t *card, u32 unifi_addr,
- void *pdata, u16 len);
-s32 unifi_read_shared_count(card_t *card, u32 addr);
-
-CsrResult unifi_writen(card_t *card, u32 unifi_addr, void *pdata, u16 len);
-
-CsrResult unifi_bulk_rw(card_t *card, u32 handle,
- void *pdata, u32 len, s16 direction);
-CsrResult unifi_bulk_rw_noretry(card_t *card, u32 handle,
- void *pdata, u32 len, s16 direction);
-#define UNIFI_SDIO_READ 0
-#define UNIFI_SDIO_WRITE 1
-
-CsrResult unifi_read_8_or_16(card_t *card, u32 unifi_addr, u8 *pdata);
-CsrResult unifi_write_8_or_16(card_t *card, u32 unifi_addr, u8 data);
-CsrResult unifi_read_direct_8_or_16(card_t *card, u32 addr, u8 *pdata);
-CsrResult unifi_write_direct_8_or_16(card_t *card, u32 addr, u8 data);
-
-CsrResult unifi_read_direct16(card_t *card, u32 addr, u16 *pdata);
-CsrResult unifi_read_direct32(card_t *card, u32 addr, u32 *pdata);
-CsrResult unifi_read_directn(card_t *card, u32 addr, void *pdata, u16 len);
-
-CsrResult unifi_write_direct16(card_t *card, u32 addr, u16 data);
-CsrResult unifi_write_directn(card_t *card, u32 addr, void *pdata, u16 len);
-
-CsrResult sdio_read_f0(card_t *card, u32 addr, u8 *pdata);
-CsrResult sdio_write_f0(card_t *card, u32 addr, u8 data);
-
-void unifi_read_panic(card_t *card);
-#ifdef CSR_PRE_ALLOC_NET_DATA
-void prealloc_netdata_free(card_t *card);
-CsrResult prealloc_netdata_alloc(card_t *card);
-#endif
-/* For diagnostic use */
-void dump(void *mem, u16 len);
-void dump16(void *mem, u16 len);
-
-#endif /* __CARD_SDIO_H__ */
diff --git a/drivers/staging/csr/csr_wifi_hip_card_sdio_intr.c b/drivers/staging/csr/csr_wifi_hip_card_sdio_intr.c
deleted file mode 100644
index cfe186e07071..000000000000
--- a/drivers/staging/csr/csr_wifi_hip_card_sdio_intr.c
+++ /dev/null
@@ -1,2595 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2012
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-/*
- * ---------------------------------------------------------------------------
- * FILE: csr_wifi_hip_card_sdio_intr.c
- *
- * PURPOSE:
- * Interrupt processing for the UniFi SDIO driver.
- *
- * We may need another signal queue of responses to UniFi to hold
- * bulk data commands generated by read_to_host_signals().
- *
- * ---------------------------------------------------------------------------
- */
-#undef CSR_WIFI_HIP_NOISY
-
-#include "csr_wifi_hip_unifi.h"
-#include "csr_wifi_hip_conversions.h"
-#include "csr_wifi_hip_card.h"
-#include "csr_wifi_hip_xbv.h"
-
-
-/*
- * If the SDIO link is idle for this time (in milliseconds),
- * signal UniFi to go into Deep Sleep.
- * Valid return value of unifi_bh().
- */
-#define UNIFI_DEFAULT_HOST_IDLE_TIMEOUT 5
-/*
- * If the UniFi has not woken up for this time (in milliseconds),
- * signal the bottom half to take action.
- * Valid return value of unifi_bh().
- */
-#define UNIFI_DEFAULT_WAKE_TIMEOUT 1000
-
-
-static CsrResult process_bh(card_t *card);
-static CsrResult handle_host_protocol(card_t *card, u8 *processed_something);
-
-static CsrResult flush_fh_buffer(card_t *card);
-
-static CsrResult check_fh_sig_slots(card_t *card, u16 needed, s32 *space);
-
-static CsrResult read_to_host_signals(card_t *card, s32 *processed);
-static CsrResult process_to_host_signals(card_t *card, s32 *processed);
-
-static CsrResult process_bulk_data_command(card_t *card,
- const u8 *cmdptr,
- s16 cmd, u16 len);
-static CsrResult process_clear_slot_command(card_t *card,
- const u8 *cmdptr);
-static CsrResult process_fh_cmd_queue(card_t *card, s32 *processed);
-static CsrResult process_fh_traffic_queue(card_t *card, s32 *processed);
-static void restart_packet_flow(card_t *card);
-static CsrResult process_clock_request(card_t *card);
-
-#ifdef CSR_WIFI_HIP_NOISY
-s16 dump_fh_buf = 0;
-#endif /* CSR_WIFI_HIP_NOISY */
-
-#ifdef CSR_WIFI_HIP_DEBUG_OFFLINE
-
-/*
- * The unifi_debug_output buffer can be used to debug the HIP behaviour offline
- * i.e. without using the tracing functions that change the timing.
- *
- * Call unifi_debug_log_to_buf() with printf arguments to store a string into
- * unifi_debug_output. When unifi_debug_buf_dump() is called, the contents of the
- * buffer are dumped with dump_str() which has to be implemented in the
- * OS layer, during the porting exercise. The offset printed, holds the
- * offset where the last character is (always a zero).
- *
- */
-
-#define UNIFI_DEBUG_GBUFFER_SIZE 8192
-static char unifi_debug_output[UNIFI_DEBUG_GBUFFER_SIZE];
-static char *unifi_dbgbuf_ptr = unifi_debug_output;
-static char *unifi_dbgbuf_start = unifi_debug_output;
-
-static void append_char(char c)
-{
- /* write char and advance pointer */
- *unifi_dbgbuf_ptr++ = c;
- /* wrap pointer at end of buffer */
- if ((unifi_dbgbuf_ptr - unifi_debug_output) >= UNIFI_DEBUG_GBUFFER_SIZE)
- {
- unifi_dbgbuf_ptr = unifi_debug_output;
- }
-} /* append_char() */
-
-
-void unifi_debug_string_to_buf(const char *str)
-{
- const char *p = str;
- while (*p)
- {
- append_char(*p);
- p++;
- }
- /* Update start-of-buffer pointer */
- unifi_dbgbuf_start = unifi_dbgbuf_ptr + 1;
- if ((unifi_dbgbuf_start - unifi_debug_output) >= UNIFI_DEBUG_GBUFFER_SIZE)
- {
- unifi_dbgbuf_start = unifi_debug_output;
- }
-}
-
-
-void unifi_debug_log_to_buf(const char *fmt, ...)
-{
-#define DEBUG_BUFFER_SIZE 80
- static char s[DEBUG_BUFFER_SIZE];
- va_list args;
-
- va_start(args, fmt);
- vsnprintf(s, DEBUG_BUFFER_SIZE, fmt, args);
- va_end(args);
-
- unifi_debug_string_to_buf(s);
-} /* unifi_debug_log_to_buf() */
-
-
-/* Convert signed 32 bit (or less) integer to string */
-static void CsrUInt16ToHex(u16 number, char *str)
-{
- u16 index;
- u16 currentValue;
-
- for (index = 0; index < 4; index++)
- {
- currentValue = (u16) (number & 0x000F);
- number >>= 4;
- str[3 - index] = (char) (currentValue > 9 ? currentValue + 55 : currentValue + '0');
- }
- str[4] = '\0';
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_debug_hex_to_buf
- *
- * puts the contents of the passed buffer into the debug buffer as a hex string
- *
- * Arguments:
- * buff buffer to print as hex
- * length number of chars to print
- *
- * Returns:
- * None.
- *
- * ---------------------------------------------------------------------------
- */
-void unifi_debug_hex_to_buf(const char *buff, u16 length)
-{
- char s[5];
- u16 i;
-
- for (i = 0; i < length; i = i + 2)
- {
- CsrUInt16ToHex(*((u16 *)(buff + i)), s);
- unifi_debug_string_to_buf(s);
- }
-}
-
-
-void unifi_debug_buf_dump(void)
-{
- s32 offset = unifi_dbgbuf_ptr - unifi_debug_output;
-
- unifi_error(NULL, "HIP debug buffer offset=%d\n", offset);
- dump_str(unifi_debug_output + offset, UNIFI_DEBUG_GBUFFER_SIZE - offset);
- dump_str(unifi_debug_output, offset);
-} /* unifi_debug_buf_dump() */
-
-
-#endif /* CSR_WIFI_HIP_DEBUG_OFFLINE */
-
-#ifdef CSR_PRE_ALLOC_NET_DATA
-#define NETDATA_PRE_ALLOC_BUF_SIZE 8000
-
-void prealloc_netdata_free(card_t *card)
-{
- unifi_warning(card->ospriv, "prealloc_netdata_free: IN: w=%d r=%d\n", card->prealloc_netdata_w, card->prealloc_netdata_r);
-
- while (card->bulk_data_desc_list[card->prealloc_netdata_r].data_length != 0)
- {
- unifi_warning(card->ospriv, "prealloc_netdata_free: r=%d\n", card->prealloc_netdata_r);
-
- unifi_net_data_free(card->ospriv, &card->bulk_data_desc_list[card->prealloc_netdata_r]);
- card->prealloc_netdata_r++;
- card->prealloc_netdata_r %= BULK_DATA_PRE_ALLOC_NUM;
- }
- card->prealloc_netdata_r = card->prealloc_netdata_w = 0;
-
- unifi_warning(card->ospriv, "prealloc_netdata_free: OUT: w=%d r=%d\n", card->prealloc_netdata_w, card->prealloc_netdata_r);
-}
-
-
-CsrResult prealloc_netdata_alloc(card_t *card)
-{
- CsrResult r;
-
- unifi_trace(card->ospriv, UDBG5, "prealloc_netdata_alloc: IN: w=%d r=%d\n", card->prealloc_netdata_w, card->prealloc_netdata_r);
-
- while (card->bulk_data_desc_list[card->prealloc_netdata_w].data_length == 0)
- {
- r = unifi_net_data_malloc(card->ospriv, &card->bulk_data_desc_list[card->prealloc_netdata_w], NETDATA_PRE_ALLOC_BUF_SIZE);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "prealloc_netdata_alloc: Failed to allocate t-h bulk data\n");
- return CSR_RESULT_FAILURE;
- }
- card->prealloc_netdata_w++;
- card->prealloc_netdata_w %= BULK_DATA_PRE_ALLOC_NUM;
- }
- unifi_trace(card->ospriv, UDBG5, "prealloc_netdata_alloc: OUT: w=%d r=%d\n", card->prealloc_netdata_w, card->prealloc_netdata_r);
-
- return CSR_RESULT_SUCCESS;
-}
-
-
-static CsrResult prealloc_netdata_get(card_t *card, bulk_data_desc_t *bulk_data_slot, u32 size)
-{
- CsrResult r;
-
- unifi_trace(card->ospriv, UDBG5, "prealloc_netdata_get: IN: w=%d r=%d\n", card->prealloc_netdata_w, card->prealloc_netdata_r);
-
- if (card->bulk_data_desc_list[card->prealloc_netdata_r].data_length == 0)
- {
- unifi_error(card->ospriv, "prealloc_netdata_get: data_length = 0\n");
- }
-
- if ((size > NETDATA_PRE_ALLOC_BUF_SIZE) || (card->bulk_data_desc_list[card->prealloc_netdata_r].data_length == 0))
- {
- unifi_warning(card->ospriv, "prealloc_netdata_get: Calling net_data_malloc\n");
-
- r = unifi_net_data_malloc(card->ospriv, bulk_data_slot, size);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "prealloc_netdata_get: Failed to allocate t-h bulk data\n");
- return CSR_RESULT_FAILURE;
- }
- return CSR_RESULT_SUCCESS;
- }
-
- *bulk_data_slot = card->bulk_data_desc_list[card->prealloc_netdata_r];
- card->bulk_data_desc_list[card->prealloc_netdata_r].os_data_ptr = NULL;
- card->bulk_data_desc_list[card->prealloc_netdata_r].os_net_buf_ptr = NULL;
- card->bulk_data_desc_list[card->prealloc_netdata_r].net_buf_length = 0;
- card->bulk_data_desc_list[card->prealloc_netdata_r].data_length = 0;
-
- card->prealloc_netdata_r++;
- card->prealloc_netdata_r %= BULK_DATA_PRE_ALLOC_NUM;
-
- unifi_trace(card->ospriv, UDBG5, "prealloc_netdata_get: OUT: w=%d r=%d\n", card->prealloc_netdata_w, card->prealloc_netdata_r);
-
- return CSR_RESULT_SUCCESS;
-}
-
-
-#endif
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_sdio_interrupt_handler
- *
- * This function should be called by the OS-dependent code to handle
- * an SDIO interrupt from the UniFi.
- *
- * Arguments:
- * card Pointer to card context structure.
- *
- * Returns:
- * None.
- *
- * Notes: This function may be called in DRS context. In this case,
- * tracing with the unifi_trace(), etc, is not allowed.
- * ---------------------------------------------------------------------------
- */
-void unifi_sdio_interrupt_handler(card_t *card)
-{
- /*
- * Set the flag to say reason for waking was SDIO interrupt.
- * Then ask the OS layer to run the unifi_bh to give attention to the UniFi.
- */
- card->bh_reason_unifi = 1;
- (void)unifi_run_bh(card->ospriv);
-} /* sdio_interrupt_handler() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_configure_low_power_mode
- *
- * This function should be called by the OS-dependent when
- * the deep sleep signaling needs to be enabled or disabled.
- *
- * Arguments:
- * card Pointer to card context structure.
- * low_power_mode Disable/Enable the deep sleep signaling
- * periodic_wake_mode UniFi wakes host periodically.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success or a CSR error code.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_configure_low_power_mode(card_t *card,
- enum unifi_low_power_mode low_power_mode,
- enum unifi_periodic_wake_mode periodic_wake_mode)
-{
- card->low_power_mode = low_power_mode;
- card->periodic_wake_mode = periodic_wake_mode;
-
- unifi_trace(card->ospriv, UDBG1,
- "unifi_configure_low_power_mode: new mode = %s, wake_host = %s\n",
- (low_power_mode == UNIFI_LOW_POWER_DISABLED)?"disabled" : "enabled",
- (periodic_wake_mode == UNIFI_PERIODIC_WAKE_HOST_DISABLED)?"FALSE" : "TRUE");
-
- (void)unifi_run_bh(card->ospriv);
- return CSR_RESULT_SUCCESS;
-} /* unifi_configure_low_power_mode() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_force_low_power_mode
- *
- * This function should be called by the OS-dependent when
- * UniFi needs to be set to the low power mode (e.g. on suspend)
- *
- * Arguments:
- * card Pointer to card context structure.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success or a CSR error code.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_force_low_power_mode(card_t *card)
-{
- if (card->low_power_mode == UNIFI_LOW_POWER_DISABLED)
- {
- unifi_error(card->ospriv, "Attempt to set mode to TORPID when lower power mode is disabled\n");
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- return unifi_set_host_state(card, UNIFI_HOST_STATE_TORPID);
-} /* unifi_force_low_power_mode() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_bh
- *
- * This function should be called by the OS-dependent code when
- * host and/or UniFi has requested an exchange of messages.
- *
- * Arguments:
- * card Pointer to card context structure.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success or a CSR error code.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_bh(card_t *card, u32 *remaining)
-{
- CsrResult r;
- CsrResult csrResult;
- u8 pending;
- s32 iostate, j;
- const enum unifi_low_power_mode low_power_mode = card->low_power_mode;
- u16 data_slots_used = 0;
-
-
- /* Process request to raise the maximum SDIO clock */
- r = process_clock_request(card);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Error setting maximum SDIO clock\n");
- goto exit;
- }
-
- /*
- * Why was the BH thread woken?
- * If it was an SDIO interrupt, UniFi is awake and we need to process it.
- * If it was a host process queueing data, then we need to awaken UniFi.
- *
- * Priority of flags is top down.
- *
- * ----------------------------------------------------------+
- * \state| AWAKE | DROWSY | TORPID |
- * flag\ | | | |
- * ---------+--------------+----------------+----------------|
- * | do the host | go to AWAKE and| go to AWAKE and|
- * unifi | protocol | do the host | do the host |
- * | | protocol | protocol |
- * ---------+--------------+----------------+----------------|
- * | do the host | | |
- * host | protocol | do nothing | go to DROWSY |
- * | | | |
- * ---------+--------------+----------------+----------------|
- * | | | should not |
- * timeout | go to TORPID | error, unifi | occur |
- * | | didn't wake up | do nothing |
- * ----------------------------------------------------------+
- *
- * Note that if we end up in the AWAKE state we always do the host protocol.
- */
-
- do
- {
- /*
- * When the host state is set to DROWSY, then we can not disable the
- * interrupts as UniFi can generate an interrupt even when the INT_ENABLE
- * register has the interrupts disabled. This interrupt will be lost.
- */
- if (card->host_state == UNIFI_HOST_STATE_DROWSY || card->host_state == UNIFI_HOST_STATE_TORPID)
- {
- u8 reason_unifi;
-
- /*
- * An interrupt may occur while or after we cache the reason.
- * This interrupt will cause the unifi_bh() to be scheduled again.
- * Any interrupt that has happened before the register is read
- * and is considered spurious has to acknowledged.
- */
- reason_unifi = card->bh_reason_unifi;
-
- /*
- * If an interrupt is received, check if it was a real one,
- * set the host state to AWAKE and run the BH.
- */
- r = CardPendingInt(card, &pending);
- if (r != CSR_RESULT_SUCCESS)
- {
- goto exit;
- }
-
- if (pending)
- {
- unifi_trace(card->ospriv, UDBG5,
- "UNIFI_HOST_STATE_%s: Set state to AWAKE.\n",
- (card->host_state == UNIFI_HOST_STATE_TORPID)?"TORPID" : "DROWSY");
-
- r = unifi_set_host_state(card, UNIFI_HOST_STATE_AWAKE);
- if (r == CSR_RESULT_SUCCESS)
- {
- (*remaining) = 0;
- break;
- }
- }
- else if (reason_unifi)
- {
- CsrSdioInterruptAcknowledge(card->sdio_if);
- }
-
- /*
- * If an chip is in TORPID, and the host wants to wake it up,
- * set the host state to DROWSY and wait for the wake-up interrupt.
- */
- if ((card->host_state == UNIFI_HOST_STATE_TORPID) && card->bh_reason_host)
- {
- r = unifi_set_host_state(card, UNIFI_HOST_STATE_DROWSY);
- if (r == CSR_RESULT_SUCCESS)
- {
- /*
- * set the timeout value to UNIFI_DEFAULT_WAKE_TIMEOUT
- * to capture a wake error.
- */
- card->bh_reason_host = 0;
- (*remaining) = UNIFI_DEFAULT_WAKE_TIMEOUT;
- return CSR_RESULT_SUCCESS;
- }
-
- goto exit;
- }
-
- /*
- * If the chip is in DROWSY, and the timeout expires,
- * we need to reset the chip. This should never occur.
- * (If it does, check that the calling thread set "remaining"
- * according to the time remaining when unifi_bh() was called).
- */
- if ((card->host_state == UNIFI_HOST_STATE_DROWSY) && ((*remaining) == 0))
- {
- unifi_error(card->ospriv, "UniFi did not wake up on time...\n");
-
- /*
- * Check if Function1 has gone away or
- * if we missed an SDIO interrupt.
- */
- r = unifi_check_io_status(card, &iostate);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- goto exit;
- }
- /* Need to reset and reboot */
- return CSR_RESULT_FAILURE;
- }
- }
- else
- {
- if (card->bh_reason_unifi || card->bh_reason_host)
- {
- break;
- }
-
- if (((*remaining) == 0) && (low_power_mode == UNIFI_LOW_POWER_ENABLED))
- {
- r = unifi_set_host_state(card, UNIFI_HOST_STATE_TORPID);
- if (r == CSR_RESULT_SUCCESS)
- {
- (*remaining) = 0;
- return CSR_RESULT_SUCCESS;
- }
-
- goto exit;
- }
- }
-
- /* No need to run the host protocol */
- return CSR_RESULT_SUCCESS;
- } while (0);
-
-
- /* Disable the SDIO interrupts while doing SDIO ops */
- csrResult = CsrSdioInterruptDisable(card->sdio_if);
- if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
- {
- r = CSR_WIFI_HIP_RESULT_NO_DEVICE;
- goto exit;
- }
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- r = ConvertCsrSdioToCsrHipResult(card, csrResult);
- unifi_error(card->ospriv, "Failed to disable SDIO interrupts. unifi_bh queues error.\n");
- goto exit;
- }
-
- /* Now that the interrupts are disabled, ack the interrupt */
- CsrSdioInterruptAcknowledge(card->sdio_if);
-
- /* Run the HIP */
- r = process_bh(card);
- if (r != CSR_RESULT_SUCCESS)
- {
- goto exit;
- }
-
- /*
- * If host is now idle, schedule a timer for the delay before we
- * let UniFi go into deep sleep.
- * If the timer goes off, we will move to TORPID state.
- * If UniFi raises an interrupt in the meantime, we will cancel
- * the timer and start a new one when we become idle.
- */
- for (j = 0; j < UNIFI_NO_OF_TX_QS; j++)
- {
- data_slots_used += CSR_WIFI_HIP_Q_SLOTS_USED(&card->fh_traffic_queue[j]);
- }
-
- if ((low_power_mode == UNIFI_LOW_POWER_ENABLED) && (data_slots_used == 0))
- {
-#ifndef CSR_WIFI_HIP_TA_DISABLE
- if (card->ta_sampling.traffic_type != CSR_WIFI_ROUTER_CTRL_TRAFFIC_TYPE_PERIODIC)
- {
-#endif
- /* return the UNIFI_DEFAULT_HOST_IDLE_TIMEOUT, so we can go to sleep. */
- unifi_trace(card->ospriv, UDBG5,
- "Traffic is not periodic, set timer for TORPID.\n");
- (*remaining) = UNIFI_DEFAULT_HOST_IDLE_TIMEOUT;
-#ifndef CSR_WIFI_HIP_TA_DISABLE
- }
- else
- {
- unifi_trace(card->ospriv, UDBG5,
- "Traffic is periodic, set unifi to TORPID immediately.\n");
- if (CardAreAllFromHostDataSlotsEmpty(card) == 1)
- {
- r = unifi_set_host_state(card, UNIFI_HOST_STATE_TORPID);
- if (r != CSR_RESULT_SUCCESS)
- {
- goto exit;
- }
- }
- }
-#endif
- }
-
- csrResult = CsrSdioInterruptEnable(card->sdio_if);
- if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
- {
- r = CSR_WIFI_HIP_RESULT_NO_DEVICE;
- }
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- r = ConvertCsrSdioToCsrHipResult(card, csrResult);
- unifi_error(card->ospriv, "Failed to enable SDIO interrupt\n");
- }
-
-exit:
-
- unifi_trace(card->ospriv, UDBG4, "New state=%d\n", card->host_state);
-
- if (r != CSR_RESULT_SUCCESS)
- {
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- unifi_debug_buf_dump();
-#endif
- /* If an interrupt has been raised, ack it here */
- if (card->bh_reason_unifi)
- {
- CsrSdioInterruptAcknowledge(card->sdio_if);
- }
-
- unifi_error(card->ospriv,
- "unifi_bh: state=%d %c, clock=%dkHz, interrupt=%d host=%d, power_save=%s\n",
- card->host_state,
- (card->host_state == UNIFI_HOST_STATE_AWAKE)?'A' : (card->host_state == UNIFI_HOST_STATE_DROWSY)?'D' : 'T',
- card->sdio_clock_speed / 1000,
- card->bh_reason_unifi, card->bh_reason_host,
- (low_power_mode == UNIFI_LOW_POWER_DISABLED)?"disabled" : "enabled");
-
- /* Try to capture firmware panic codes */
- (void)unifi_capture_panic(card);
-
- /* Ask for a mini-coredump when the driver has reset UniFi */
- (void)unifi_coredump_request_at_next_reset(card, 1);
- }
-
- return r;
-} /* unifi_bh() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * process_clock_request
- *
- * Handle request from the OS layer to increase the SDIO clock speed.
- * The fast clock is limited until the firmware has indicated that it has
- * completed initialisation to the OS layer.
- *
- * Arguments:
- * card Pointer to card context structure.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success or CSR error code.
- * ---------------------------------------------------------------------------
- */
-static CsrResult process_clock_request(card_t *card)
-{
- CsrResult r = CSR_RESULT_SUCCESS;
- CsrResult csrResult;
-
- if (!card->request_max_clock)
- {
- return CSR_RESULT_SUCCESS; /* No pending request */
- }
-
- /*
- * The SDIO clock speed request from the OS layer is only acted upon if
- * the UniFi is awake. If it was in any other state, the clock speed will
- * transition through SAFE to MAX while the host wakes it up, and the
- * final speed reached will be UNIFI_SDIO_CLOCK_MAX_HZ.
- * This assumes that the SME never requests low power mode while the f/w
- * initialisation takes place.
- */
- if (card->host_state == UNIFI_HOST_STATE_AWAKE)
- {
- unifi_trace(card->ospriv, UDBG1, "Set SDIO max clock\n");
- csrResult = CsrSdioMaxBusClockFrequencySet(card->sdio_if, UNIFI_SDIO_CLOCK_MAX_HZ);
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- r = ConvertCsrSdioToCsrHipResult(card, csrResult);
- }
- else
- {
- card->sdio_clock_speed = UNIFI_SDIO_CLOCK_MAX_HZ; /* log the new freq */
- }
- }
- else
- {
- unifi_trace(card->ospriv, UDBG1, "Will set SDIO max clock after wakeup\n");
- }
-
- /* Cancel the request now that it has been acted upon, or is about to be
- * by the wakeup mechanism
- */
- card->request_max_clock = 0;
-
- return r;
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * process_bh
- *
- * Exchange messages with UniFi
- *
- * Arguments:
- * card Pointer to card context structure.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success or CSR error code.
- * ---------------------------------------------------------------------------
- */
-static CsrResult process_bh(card_t *card)
-{
- CsrResult r;
- u8 more;
- more = FALSE;
-
- /* Process the reasons (interrupt, signals) */
- do
- {
- /*
- * Run in a while loop, to save clearing the interrupts
- * every time around the outside loop.
- */
- do
- {
- /* If configured to run the HIP just once, skip first loop */
- if (card->intmode & CSR_WIFI_INTMODE_RUN_BH_ONCE)
- {
- break;
- }
-
- r = handle_host_protocol(card, &more);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- unifi_debug_log_to_buf("c52=%d c53=%d tx=%d txc=%d rx=%d s=%d t=%d fc=%d\n",
- card->cmd_prof.cmd52_count,
- card->cmd_prof.cmd53_count,
- card->cmd_prof.tx_count,
- card->cmd_prof.tx_cfm_count,
- card->cmd_prof.rx_count,
- card->cmd_prof.sdio_cmd_signal,
- card->cmd_prof.sdio_cmd_to_host,
- card->cmd_prof.sdio_cmd_from_host_and_clear
- );
-
- card->cmd_prof.cmd52_count = card->cmd_prof.cmd53_count = 0;
- card->cmd_prof.tx_count = card->cmd_prof.tx_cfm_count = card->cmd_prof.rx_count = 0;
-
- card->cmd_prof.cmd52_f0_r_count = 0;
- card->cmd_prof.cmd52_f0_w_count = 0;
- card->cmd_prof.cmd52_r8or16_count = 0;
- card->cmd_prof.cmd52_w8or16_count = 0;
- card->cmd_prof.cmd52_r16_count = 0;
- card->cmd_prof.cmd52_w16_count = 0;
- card->cmd_prof.cmd52_r32_count = 0;
-
- card->cmd_prof.sdio_cmd_signal = 0;
- card->cmd_prof.sdio_cmd_clear_slot = 0;
- card->cmd_prof.sdio_cmd_to_host = 0;
- card->cmd_prof.sdio_cmd_from_host = 0;
- card->cmd_prof.sdio_cmd_from_host_and_clear = 0;
-#endif
-
-
- } while (more || card->bh_reason_unifi || card->bh_reason_host);
-
- /* Acknowledge the h/w interrupt */
- r = CardClearInt(card);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to acknowledge interrupt.\n");
- return r;
- }
-
- /*
- * UniFi may have tried to generate an interrupt during the
- * CardClearInt() was running. So, we need to run the host
- * protocol again, to check if there are any pending requests.
- */
- r = handle_host_protocol(card, &more);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- unifi_debug_log_to_buf("c52=%d c53=%d tx=%d txc=%d rx=%d s=%d t=%d fc=%d\n",
- card->cmd_prof.cmd52_count,
- card->cmd_prof.cmd53_count,
- card->cmd_prof.tx_count,
- card->cmd_prof.tx_cfm_count,
- card->cmd_prof.rx_count,
- card->cmd_prof.sdio_cmd_signal,
- card->cmd_prof.sdio_cmd_to_host,
- card->cmd_prof.sdio_cmd_from_host_and_clear
- );
-
- card->cmd_prof.cmd52_count = card->cmd_prof.cmd53_count = 0;
- card->cmd_prof.tx_count = card->cmd_prof.tx_cfm_count = card->cmd_prof.rx_count = 0;
-
- card->cmd_prof.cmd52_f0_r_count = 0;
- card->cmd_prof.cmd52_f0_w_count = 0;
- card->cmd_prof.cmd52_r8or16_count = 0;
- card->cmd_prof.cmd52_w8or16_count = 0;
- card->cmd_prof.cmd52_r16_count = 0;
- card->cmd_prof.cmd52_w16_count = 0;
- card->cmd_prof.cmd52_r32_count = 0;
-
- card->cmd_prof.sdio_cmd_signal = 0;
- card->cmd_prof.sdio_cmd_clear_slot = 0;
- card->cmd_prof.sdio_cmd_to_host = 0;
- card->cmd_prof.sdio_cmd_from_host = 0;
- card->cmd_prof.sdio_cmd_from_host_and_clear = 0;
-#endif
- /* If configured to run the HIP just once, work is now done */
- if (card->intmode & CSR_WIFI_INTMODE_RUN_BH_ONCE)
- {
- break;
- }
-
- } while (more || card->bh_reason_unifi || card->bh_reason_host);
-
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- if ((card->intmode & CSR_WIFI_INTMODE_RUN_BH_ONCE) == 0)
- {
- unifi_debug_log_to_buf("proc=%d\n",
- card->cmd_prof.process_count);
- }
-#endif
-
- return CSR_RESULT_SUCCESS;
-} /* process_bh() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * handle_host_protocol
- *
- * This function implements the Host Interface Protocol (HIP) as
- * described in the Host Interface Protocol Specification.
- *
- * Arguments:
- * card Pointer to card context structure.
- * processed_something Pointer to location to update processing status:
- * TRUE when data was transferred
- * FALSE when no data was transferred (queues empty)
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success or CSR error code.
- * ---------------------------------------------------------------------------
- */
-static CsrResult handle_host_protocol(card_t *card, u8 *processed_something)
-{
- CsrResult r;
- s32 done;
-
- *processed_something = FALSE;
-
-#ifdef CSR_WIFI_HIP_NOISY
- unifi_error(card->ospriv, " ======================== \n");
-#endif /* CSR_WIFI_HIP_NOISY */
-
-#ifdef CSR_WIFI_HIP_DATA_PLANE_PROFILE
- card->cmd_prof.process_count++;
-#endif
-
- card->bh_reason_unifi = card->bh_reason_host = 0;
- card->generate_interrupt = 0;
-
-
- /*
- * (Re)fill the T-H signal buffer
- */
- r = read_to_host_signals(card, &done);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Error occurred reading to-host signals\n");
- return r;
- }
- if (done > 0)
- {
- *processed_something = TRUE;
- }
-
- /*
- * Process any to-host signals.
- * Perform any requested CMD53 transfers here, but just queue any
- * bulk data command responses.
- */
- r = process_to_host_signals(card, &done);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Error occurred processing to-host signals\n");
- return r;
- }
-
- /* Now send any signals in the F-H queues */
- /* Give precedence to the command queue */
- r = process_fh_cmd_queue(card, &done);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Error occurred processing from-host signals\n");
- return r;
- }
- if (done > 0)
- {
- *processed_something = TRUE;
- }
-
- r = process_fh_traffic_queue(card, &done);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Error occurred processing from-host data signals\n");
- return r;
- }
- if (done > 0)
- {
- *processed_something = TRUE;
- }
-
- /* Flush out the batch of signals to the UniFi. */
- r = flush_fh_buffer(card);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to copy from-host signals to UniFi\n");
- return r;
- }
-
-
- /*
- * Send the host interrupt to say the queues have been modified.
- */
- if (card->generate_interrupt)
- {
- r = CardGenInt(card);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to notify UniFi that queues have been modified.\n");
- return r;
- }
- }
-
-#ifdef CSR_WIFI_RX_PATH_SPLIT
-#ifdef CSR_WIFI_RX_PATH_SPLIT_DONT_USE_WQ
- unifi_rx_queue_flush(card->ospriv);
-#endif
-#endif
-
- /* See if we can re-enable transmission now */
- restart_packet_flow(card);
-
-#ifdef CSR_PRE_ALLOC_NET_DATA
- r = prealloc_netdata_alloc(card);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "prealloc_netdata failed\n");
- return r;
- }
-#endif
-
- /*
- * Don't put the thread sleep if we just interacted with the chip,
- * there might be more to do if we look again.
- */
- return r;
-} /* handle_host_protocol() */
-
-
-/*
- * Rounds the given signal length in bytes to a whole number
- * of sig_frag_size.
- */
-#define GET_CHUNKS_FOR(SIG_FRAG_SIZE, LENGTH) (((LENGTH) + ((SIG_FRAG_SIZE)-1)) / (SIG_FRAG_SIZE))
-
-
-/*
- * ---------------------------------------------------------------------------
- * read_to_host_signals
- *
- * Read everything pending in the UniFi TH signal buffer.
- * Only do it if the local buffer is empty.
- *
- * Arguments:
- * card Pointer to card context struct
- * processed Number of signals read:
- * 0 if there were no signals pending,
- * 1 if we read at least one signal
- * Returns:
- * CSR error code if an error occurred.
- * ---------------------------------------------------------------------------
- */
-static CsrResult read_to_host_signals(card_t *card, s32 *processed)
-{
- s32 count_thw, count_thr;
- s32 unread_chunks, unread_bytes;
- CsrResult r;
-
- *processed = 0;
-
- /* Read any pending signals or bulk data commands */
- count_thw = unifi_read_shared_count(card, card->sdio_ctrl_addr + 4);
- if (count_thw < 0)
- {
- unifi_error(card->ospriv, "Failed to read to-host sig written count\n");
- return CSR_RESULT_FAILURE;
- }
- card->to_host_signals_w = count_thw; /* diag */
-
- count_thr = card->to_host_signals_r;
-
- if (count_thw == count_thr)
- {
- return CSR_RESULT_SUCCESS;
- }
-
- unread_chunks =
- (((count_thw - count_thr) + 128) % 128) - card->th_buffer.count;
-
- if (unread_chunks == 0)
- {
- return CSR_RESULT_SUCCESS;
- }
-
- unread_bytes = card->config_data.sig_frag_size * unread_chunks;
-
-
- r = unifi_bulk_rw(card,
- card->config_data.tohost_sigbuf_handle,
- card->th_buffer.ptr,
- unread_bytes,
- UNIFI_SDIO_READ);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read ToHost signal\n");
- return r;
- }
-
- card->th_buffer.ptr += unread_bytes;
- card->th_buffer.count += (u16)unread_chunks;
-
- *processed = 1;
-
- return CSR_RESULT_SUCCESS;
-} /* read_to_host_signals() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * update_to_host_signals_r
- *
- * Advance the shared-memory count of chunks read from the to-host
- * signal buffer.
- * Raise a UniFi internal interrupt to tell the firmware that the
- * count has changed.
- *
- * Arguments:
- * card Pointer to card context struct
- * pending Number of chunks remaining
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success or CSR error code
- * ---------------------------------------------------------------------------
- */
-static CsrResult update_to_host_signals_r(card_t *card, s16 pending)
-{
- CsrResult r;
-
- card->to_host_signals_r =
- (card->to_host_signals_r + (card->th_buffer.count - pending)) % 128;
- card->th_buffer.count = pending;
-
- /* Update the count of signals read */
- r = unifi_write_8_or_16(card, card->sdio_ctrl_addr + 6,
- (u8)card->to_host_signals_r);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to update to-host signals read\n");
- return r;
- }
-
- r = CardGenInt(card);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to notify UniFi that we processed to-host signals.\n");
- return r;
- }
-
- card->generate_interrupt = 0;
-
- return CSR_RESULT_SUCCESS;
-} /* update_to_host_signals_r() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * read_unpack_cmd
- *
- * Converts a wire-formatted command to the host bulk_data_cmd_t structure.
- *
- * Arguments:
- * ptr Pointer to the command
- * bulk_data_cmd Pointer to the host structure
- *
- * Returns:
- * None.
- * ---------------------------------------------------------------------------
- */
-static void read_unpack_cmd(const u8 *ptr, bulk_data_cmd_t *bulk_data_cmd)
-{
- s16 index = 0;
- bulk_data_cmd->cmd_and_len = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(ptr + index);
- index += SIZEOF_UINT16;
- bulk_data_cmd->data_slot = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(ptr + index);
- index += SIZEOF_UINT16;
- bulk_data_cmd->offset = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(ptr + index);
- index += SIZEOF_UINT16;
- bulk_data_cmd->buffer_handle = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(ptr + index);
- index += SIZEOF_UINT16;
-} /* read_unpack_cmd */
-
-
-/*
- * ---------------------------------------------------------------------------
- * process_to_host_signals
- *
- * Read and dispatch signals from the UniFi
- *
- * Arguments:
- * card Pointer to card context struct
- * processed Pointer to location to write processing result:
- * 0 if there were no signals pending,
- * 1 if we read at least one signal
- *
- * Returns:
- * CSR error code if there was an error
- *
- * Notes:
- * Since bulk data transfers can take a long time, if we wait until
- * all are done before we acknowledge the signals, the UniFi runs out
- * of buffer space. Therefore we keep a count of the bytes transferred
- * in bulk data commands, and update the to-host-signals-read count
- * if we've done a large transfer.
- *
- * All data in the f/w is stored in a little endian format, without any
- * padding bytes. Every read from the memory has to be transformed in
- * host (cpu specific) format, before we can process it. Therefore we
- * use read_unpack_cmd() and read_unpack_signal() to convert the raw data
- * contained in the card->th_buffer.buf to host structures.
- * Important: UDI clients use wire-formatted structures, so we need to
- * indicate all data, as we have read it from the device.
- * ---------------------------------------------------------------------------
- */
-static CsrResult process_to_host_signals(card_t *card, s32 *processed)
-{
- s16 pending;
- s16 remaining;
- u8 *bufptr;
- bulk_data_param_t data_ptrs;
- s16 cmd;
- u16 sig_len;
- s16 i;
- u16 chunks_in_buf;
- u16 bytes_transferred = 0;
- CsrResult r = CSR_RESULT_SUCCESS;
-
- *processed = 0;
-
- pending = card->th_buffer.count;
-
- /* Are there new to-host signals? */
- unifi_trace(card->ospriv, UDBG4, "handling %d to-host chunks\n", pending);
-
- if (!pending)
- {
- return CSR_RESULT_SUCCESS;
- }
-
- /*
- * This is a pointer to the raw data we have read from the f/w.
- * Can be a signal or a command. Note that we need to convert
- * it to a host structure before we process it.
- */
- bufptr = card->th_buffer.buf;
-
- while (pending > 0)
- {
- s16 f_flush_count = 0;
-
- /*
- * Command and length are common to signal and bulk data msgs.
- * If command == 0 (i.e. a signal), len is number of bytes
- * *following* the 2-byte header.
- */
- cmd = bufptr[1] >> 4;
- sig_len = bufptr[0] + ((bufptr[1] & 0x0F) << 8);
-
-#ifdef CSR_WIFI_HIP_NOISY
- unifi_error(card->ospriv, "Received UniFi msg cmd=%d, len=%d\n",
- cmd, sig_len);
-#endif /* CSR_WIFI_HIP_NOISY */
-
- if ((sig_len == 0) &&
- ((cmd != SDIO_CMD_CLEAR_SLOT) && (cmd != SDIO_CMD_PADDING)))
- {
- unifi_error(card->ospriv, "incomplete signal or command: has size zero\n");
- return CSR_RESULT_FAILURE;
- }
- /*
- * Make sure the buffer contains a complete message.
- * Signals may occupy multiple chunks, bulk-data commands occupy
- * one chunk.
- */
- if (cmd == SDIO_CMD_SIGNAL)
- {
- chunks_in_buf = GET_CHUNKS_FOR(card->config_data.sig_frag_size, (u16)(sig_len + 2));
- }
- else
- {
- chunks_in_buf = 1;
- }
-
- if (chunks_in_buf > (u16)pending)
- {
- unifi_error(card->ospriv, "incomplete signal (0x%x?): need %d chunks, got %d\n",
- GET_SIGNAL_ID(bufptr + 2),
- chunks_in_buf, pending);
- unifi_error(card->ospriv, " thsw=%d, thsr=%d\n",
- card->to_host_signals_w,
- card->to_host_signals_r);
- return CSR_RESULT_FAILURE;
- }
-
-
- switch (cmd)
- {
- case SDIO_CMD_SIGNAL:
- /* This is a signal. Read the rest of it and then handle it. */
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- card->cmd_prof.sdio_cmd_signal++;
-#endif
-
- for (i = 0; i < UNIFI_MAX_DATA_REFERENCES; i++)
- {
- /* Retrieve dataRefs[i].DataLength */
- u16 data_len = GET_PACKED_DATAREF_LEN(bufptr + 2, i);
-
- /*
- * The bulk data length in the signal can not be greater than
- * the maximun length allowed by the SDIO config structure.
- */
- if (data_len > card->config_data.data_slot_size)
- {
- unifi_error(card->ospriv,
- "Bulk Data length (%d) exceeds Maximum Bulk Data length (%d)\n",
- data_len, card->config_data.data_slot_size);
- return CSR_RESULT_FAILURE;
- }
-
- /*
- * Len here might not be the same as the length in the
- * bulk data slot. The slot length will always be even,
- * but len could be odd.
- */
- if (data_len != 0)
- {
- /* Retrieve dataRefs[i].SlotNumber */
- s16 slot = GET_PACKED_DATAREF_SLOT(bufptr + 2, i);
-
- if (slot >= card->config_data.num_tohost_data_slots)
- {
- unifi_error(card->ospriv, "!!!bad slot number in to-host signal: %d, sig 0x%X\n",
- slot, cmd);
- return CSR_RESULT_FAILURE;
- }
-
- data_ptrs.d[i].os_data_ptr = card->to_host_data[slot].os_data_ptr;
- data_ptrs.d[i].os_net_buf_ptr = card->to_host_data[slot].os_net_buf_ptr;
- data_ptrs.d[i].net_buf_length = card->to_host_data[slot].net_buf_length;
- data_ptrs.d[i].data_length = data_len;
- }
- else
- {
- UNIFI_INIT_BULK_DATA(&data_ptrs.d[i]);
- }
- }
-
- /*
- * Log the signal to the UDI, before call unifi_receive_event() as
- * it can modify the bulk data.
- */
- if (card->udi_hook)
- {
- (*card->udi_hook)(card->ospriv, bufptr + 2, sig_len,
- &data_ptrs, UDI_LOG_TO_HOST);
- }
-
-#ifdef CSR_WIFI_HIP_DATA_PLANE_PROFILE
- if (GET_SIGNAL_ID(bufptr + 2) == CSR_MA_PACKET_CONFIRM_ID)
- {
- card->cmd_prof.tx_cfm_count++;
- }
- else if (GET_SIGNAL_ID(bufptr + 2) == CSR_MA_PACKET_INDICATION_ID)
- {
- if (data_ptrs.d[0].os_data_ptr)
- {
- if ((*data_ptrs.d[0].os_data_ptr) & 0x08)
- {
- card->cmd_prof.rx_count++;
- }
- }
- }
-#endif
- /*
- * Check if the signal is MA-PACKET.cfm and if so check the status.
- * If the status is failure, search through the slot records to find
- * if any slots are occupied for this host tag. This can happen if
- * f/w has not downloaded the bulkdata and before that itself it has
- * signalled the confirm with failure. If it finds a slot with that
- * host tag then, it clears the corresponding slot
- */
-
- if (GET_SIGNAL_ID(bufptr + 2) == CSR_MA_PACKET_CONFIRM_ID)
- {
- /* Get host tag and transmission status */
- u32 host_tag = GET_PACKED_MA_PACKET_CONFIRM_HOST_TAG(bufptr + 2);
- u16 status = GET_PACKED_MA_PACKET_CONFIRM_TRANSMISSION_STATUS(bufptr + 2);
-
- unifi_trace(card->ospriv, UDBG4, "process_to_host_signals signal ID=%x host Tag=%x status=%x\n",
- GET_SIGNAL_ID(bufptr + 2), host_tag, status);
-
- /* If transmission status is failure then search through the slot records
- * and if for any slot records the clear slot is not done then do it now
- */
-
- if (status && (card->fh_slot_host_tag_record))
- {
- u16 num_fh_slots = card->config_data.num_fromhost_data_slots;
-
- /* search through the list of slot records and match with host tag
- * If a slot is not yet cleared then clear the slot from here
- */
- for (i = 0; i < num_fh_slots; i++)
- {
- if (card->fh_slot_host_tag_record[i] == host_tag)
- {
-#ifdef CSR_WIFI_REQUEUE_PACKET_TO_HAL
- /* Invoke the HAL module function to requeue it back to HAL Queues */
- r = unifi_reque_ma_packet_request(card->ospriv, host_tag, status, &card->from_host_data[i].bd);
- card->fh_slot_host_tag_record[i] = CSR_WIFI_HIP_RESERVED_HOST_TAG;
- if (CSR_RESULT_SUCCESS != r)
- {
- unifi_trace(card->ospriv, UDBG5, "process_to_host_signals: Failed to requeue Packet(hTag:%x) back to HAL \n", host_tag);
- CardClearFromHostDataSlot(card, i);
- }
- else
- {
- CardClearFromHostDataSlotWithoutFreeingBulkData(card, i);
- }
-
-#else
- unifi_trace(card->ospriv, UDBG4, "process_to_host_signals Clear slot=%x host tag=%x\n", i, host_tag);
- card->fh_slot_host_tag_record[i] = CSR_WIFI_HIP_RESERVED_HOST_TAG;
-
- /* Set length field in from_host_data array to 0 */
- CardClearFromHostDataSlot(card, i);
-#endif
- break;
- }
- }
- }
- }
-
- /* Pass event to OS layer */
- unifi_receive_event(card->ospriv, bufptr + 2, sig_len, &data_ptrs);
-
- /* Initialise the to_host data, so it can be re-used. */
- for (i = 0; i < UNIFI_MAX_DATA_REFERENCES; i++)
- {
- /* The slot is only valid if the length is non-zero. */
- if (GET_PACKED_DATAREF_LEN(bufptr + 2, i) != 0)
- {
- s16 slot = GET_PACKED_DATAREF_SLOT(bufptr + 2, i);
- if (slot < card->config_data.num_tohost_data_slots)
- {
- UNIFI_INIT_BULK_DATA(&card->to_host_data[slot]);
- }
- }
- }
-
-#ifndef CSR_WIFI_DEFER_TH_FLUSH
- /*
- * If we have previously transferred a lot of data, ack
- * the signals read so far, so f/w can reclaim the buffer
- * memory sooner.
- */
- if (bytes_transferred >= TO_HOST_FLUSH_THRESHOLD)
- {
- f_flush_count = 1;
- }
-#endif
- break;
-
-
- case SDIO_CMD_CLEAR_SLOT:
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- card->cmd_prof.sdio_cmd_clear_slot++;
-#endif
- /* This is a clear slot command. */
- if (sig_len != 0)
- {
- unifi_error(card->ospriv, "process_to_host_signals: clear slot, bad data len: 0x%X at offset %d\n",
- sig_len, bufptr - card->th_buffer.buf);
- return CSR_RESULT_FAILURE;
- }
-
- r = process_clear_slot_command(card, bufptr);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to process clear slot\n");
- return r;
- }
- break;
-
- case SDIO_CMD_TO_HOST_TRANSFER:
- case SDIO_CMD_FROM_HOST_TRANSFER:
- case SDIO_CMD_FROM_HOST_AND_CLEAR:
- case SDIO_CMD_OVERLAY_TRANSFER:
- /* This is a bulk data command. */
- if (sig_len & 1)
- {
- unifi_error(card->ospriv, "process_to_host_signals: bulk data, bad data len: 0x%X at offset %d\n",
- sig_len, bufptr - card->th_buffer.buf);
- return CSR_RESULT_FAILURE;
- }
-
- r = process_bulk_data_command(card, bufptr, cmd, sig_len);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to process bulk cmd\n");
- return r;
- }
- /* Count the bytes transferred */
- bytes_transferred += sig_len;
-
- if (cmd == SDIO_CMD_FROM_HOST_AND_CLEAR)
- {
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- card->cmd_prof.sdio_cmd_from_host_and_clear++;
-#endif
-#ifndef CSR_WIFI_DEFER_TH_FLUSH
- f_flush_count = 1;
-#endif
- }
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- else if (cmd == SDIO_CMD_FROM_HOST_TRANSFER)
- {
- card->cmd_prof.sdio_cmd_from_host++;
- }
- else if (cmd == SDIO_CMD_TO_HOST_TRANSFER)
- {
- card->cmd_prof.sdio_cmd_to_host++;
- }
-#endif
- break;
-
- case SDIO_CMD_PADDING:
- break;
-
- default:
- unifi_error(card->ospriv, "Unrecognised to-host command: %d\n", cmd);
- break;
- }
-
- bufptr += chunks_in_buf * card->config_data.sig_frag_size;
- pending -= chunks_in_buf;
-
- /*
- * Write out the host signal count when a significant
- * number of bytes of bulk data have been transferred or
- * when we have performed a CopyFromHostAndClear.
- */
- if (f_flush_count)
- {
- r = update_to_host_signals_r(card, pending);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
- bytes_transferred = 0;
- }
- }
-
- if (pending)
- {
- unifi_warning(card->ospriv, "proc_th_sigs: %d unprocessed\n", pending);
- }
-
- /* If we processed any signals, write the updated count to UniFi */
- if (card->th_buffer.count != pending)
- {
- r = update_to_host_signals_r(card, pending);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
- }
-
- /*
- * Reset the buffer pointer, copying down any un-processed signals.
- * This can happen if we enable the optimisation in read_to_host_signals()
- * that limits the length to whole blocks.
- */
- remaining = card->th_buffer.ptr - bufptr;
- if (remaining < 0)
- {
- unifi_error(card->ospriv, "Processing TH signals overran the buffer\n");
- return CSR_RESULT_FAILURE;
- }
- if (remaining > 0)
- {
- /* Use a safe copy because source and destination may overlap */
- u8 *d = card->th_buffer.buf;
- u8 *s = bufptr;
- s32 n = remaining;
- while (n--)
- {
- *d++ = *s++;
- }
- }
- card->th_buffer.ptr = card->th_buffer.buf + remaining;
-
-
- /* If we reach here then we processed something */
- *processed = 1;
- return CSR_RESULT_SUCCESS;
-} /* process_to_host_signals() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * process_clear_slot_command
- *
- * Process a clear slot command fom the UniFi.
- *
- * Arguments:
- * card Pointer to card context struct
- * bdcmd Pointer to bulk-data command msg from UniFi
- *
- * Returns:
- * 0 on success, CSR error code on error
- * ---------------------------------------------------------------------------
- */
-static CsrResult process_clear_slot_command(card_t *card, const u8 *cmdptr)
-{
- u16 data_slot;
- s16 slot;
-
- data_slot = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cmdptr + SIZEOF_UINT16);
-
- unifi_trace(card->ospriv, UDBG4, "Processing clear slot cmd, slot=0x%X\n",
- data_slot);
-
- slot = data_slot & 0x7FFF;
-
-#ifdef CSR_WIFI_HIP_NOISY
- unifi_error(card->ospriv, "CMD clear data slot 0x%04x\n", data_slot);
-#endif /* CSR_WIFI_HIP_NOISY */
-
- if (data_slot & SLOT_DIR_TO_HOST)
- {
- if (slot >= card->config_data.num_tohost_data_slots)
- {
- unifi_error(card->ospriv,
- "Invalid to-host data slot in SDIO_CMD_CLEAR_SLOT: %d\n",
- slot);
- return CSR_RESULT_FAILURE;
- }
- /* clear to-host data slot */
- unifi_warning(card->ospriv, "Unexpected clear to-host data slot cmd: 0x%04x\n",
- data_slot);
- }
- else
- {
- if (slot >= card->config_data.num_fromhost_data_slots)
- {
- unifi_error(card->ospriv,
- "Invalid from-host data slot in SDIO_CMD_CLEAR_SLOT: %d\n",
- slot);
- return CSR_RESULT_FAILURE;
- }
-
- /*
- * The driver is the owner to clear all slots now
- * Ref - comment in process_fh_traffic_queue
- * so it will just ignore the clear slot command from firmware
- * and return success
- */
- return CSR_RESULT_SUCCESS;
-
- /* Set length field in from_host_data array to 0 */
- /* CardClearFromHostDataSlot(card, slot); */
- }
-
- return CSR_RESULT_SUCCESS;
-} /* process_clear_slot_command() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * process_bulk_data_command
- *
- * Process a bulk data request from the UniFi.
- *
- * Arguments:
- * card Pointer to card context struct
- * bdcmd Pointer to bulk-data command msg from UniFi
- * cmd, len Decoded values of command and length from the msg header
- * Cmd will only be one of:
- * SDIO_CMD_TO_HOST_TRANSFER
- * SDIO_CMD_FROM_HOST_TRANSFER
- * SDIO_CMD_FROM_HOST_AND_CLEAR
- * SDIO_CMD_OVERLAY_TRANSFER
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, CSR error code on error
- * ---------------------------------------------------------------------------
- */
-static CsrResult process_bulk_data_command(card_t *card, const u8 *cmdptr,
- s16 cmd, u16 len)
-{
- bulk_data_desc_t *bdslot;
-#ifdef CSR_WIFI_ALIGNMENT_WORKAROUND
- u8 *host_bulk_data_slot;
-#endif
- bulk_data_cmd_t bdcmd;
- s16 offset;
- s16 slot;
- s16 dir;
- CsrResult r;
-
- read_unpack_cmd(cmdptr, &bdcmd);
-
- unifi_trace(card->ospriv, UDBG4, "Processing bulk data cmd %d %s, len=%d, slot=0x%X\n",
- cmd, lookup_bulkcmd_name(cmd), len, bdcmd.data_slot);
-
- /*
- * Round up the transfer length if required.
- * This is useful to force all transfers to be a multiple of the SDIO block
- * size, so the SDIO driver won't try to use a byte-mode CMD53. These are
- * broken on some hardware platforms.
- */
- if (card->sdio_io_block_pad)
- {
- len = (len + card->sdio_io_block_size - 1) & ~(card->sdio_io_block_size - 1);
- unifi_trace(card->ospriv, UDBG4, "Rounded bulk data length up to %d\n", len);
- }
-
- slot = bdcmd.data_slot & 0x7FFF;
-
- if (cmd == SDIO_CMD_OVERLAY_TRANSFER)
- {
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE; /* Not used on CSR6xxx */
- }
- else
- {
- if (bdcmd.data_slot & SLOT_DIR_TO_HOST)
- {
- /* Request is for to-host bulk data */
-
- /* Check sanity of slot number */
- if (slot >= card->config_data.num_tohost_data_slots)
- {
- unifi_error(card->ospriv,
- "Invalid to-host data slot in SDIO bulk xfr req: %d\n",
- slot);
- return CSR_RESULT_FAILURE;
- }
-
- /* Allocate memory for card->to_host_data[slot] bulk data here. */
-#ifdef CSR_PRE_ALLOC_NET_DATA
- r = prealloc_netdata_get(card, &card->to_host_data[slot], len);
-#else
- r = unifi_net_data_malloc(card->ospriv, &card->to_host_data[slot], len);
-#endif
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to allocate t-h bulk data\n");
- return CSR_RESULT_FAILURE;
- }
-
- bdslot = &card->to_host_data[slot];
-
- /* Make sure that the buffer is 4-bytes aligned */
- r = unifi_net_dma_align(card->ospriv, bdslot);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to align t-h bulk data buffer for DMA\n");
- return CSR_RESULT_FAILURE;
- }
- }
- else
- {
- /* Request is for from-host bulk data */
-
- if (slot >= card->config_data.num_fromhost_data_slots)
- {
- unifi_error(card->ospriv,
- "Invalid from-host data slot in SDIO bulk xfr req: %d\n",
- slot);
- return CSR_RESULT_FAILURE;
- }
- bdslot = &card->from_host_data[slot].bd;
- }
- offset = bdcmd.offset;
- }
- /* Do the transfer */
- dir = (cmd == SDIO_CMD_TO_HOST_TRANSFER)?
- UNIFI_SDIO_READ : UNIFI_SDIO_WRITE;
-
- unifi_trace(card->ospriv, UDBG4,
- "Bulk %c %s len=%d, handle %d - slot=%d %p+(%d)\n",
- (dir == UNIFI_SDIO_READ)?'R' : 'W',
- lookup_bulkcmd_name(cmd),
- len,
- bdcmd.buffer_handle,
- slot, bdslot->os_data_ptr, offset);
-#ifdef CSR_WIFI_HIP_NOISY
- unifi_error(card->ospriv, "Bulk %s len=%d, handle %d - slot=%d %p+(%d)\n",
- lookup_bulkcmd_name(cmd),
- len,
- bdcmd.buffer_handle,
- slot, bdslot->os_data_ptr, offset);
-#endif /* CSR_WIFI_HIP_NOISY */
-
-
- if (bdslot->os_data_ptr == NULL)
- {
- unifi_error(card->ospriv, "Null os_data_ptr - Bulk %s handle %d - slot=%d o=(%d)\n",
- lookup_bulkcmd_name(cmd),
- bdcmd.buffer_handle,
- slot,
- offset);
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
-#ifdef CSR_WIFI_ALIGNMENT_WORKAROUND
- /* if os_data_ptr is not 4-byte aligned, then allocate a new buffer and copy data
- to new buffer to ensure the address passed to unifi_bulk_rw is 4-byte aligned */
-
- if (len != 0 && (dir == UNIFI_SDIO_WRITE) && (((ptrdiff_t)bdslot->os_data_ptr + offset) & 3))
- {
- host_bulk_data_slot = kmalloc(len, GFP_KERNEL);
-
- if (!host_bulk_data_slot)
- {
- unifi_error(card->ospriv, " failed to allocate request_data before unifi_bulk_rw\n");
- return -1;
- }
-
- memcpy((void *)host_bulk_data_slot,
- (void *)(bdslot->os_data_ptr + offset), len);
-
- r = unifi_bulk_rw(card,
- bdcmd.buffer_handle,
- (void *)host_bulk_data_slot,
- len,
- dir);
- }
- else
-#endif
- {
- r = unifi_bulk_rw(card,
- bdcmd.buffer_handle,
- (void *)(bdslot->os_data_ptr + offset),
- len,
- dir);
- }
-
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv,
- "Failed: %s hlen=%d, slen=%d, handle %d - slot=%d %p+0x%X\n",
- lookup_bulkcmd_name(cmd),
- len, /* Header length */
- bdslot->data_length, /* Length stored in slot */
- bdcmd.buffer_handle,
- slot, bdslot->os_data_ptr, offset);
- return r;
- }
-
- bdslot->data_length = len;
-
- if (cmd == SDIO_CMD_FROM_HOST_AND_CLEAR)
- {
- if (slot >= card->config_data.num_fromhost_data_slots)
- {
- unifi_error(card->ospriv,
- "Invalid from-host data slot in SDIO_CMD_FROM_HOST_AND_CLEAR: %d\n",
- slot);
- return CSR_RESULT_FAILURE;
- }
-
-#ifdef CSR_WIFI_ALIGNMENT_WORKAROUND
- /* moving this check before we clear host data slot */
- if ((len != 0) && (dir == UNIFI_SDIO_WRITE) && (((ptrdiff_t)bdslot->os_data_ptr + offset) & 3))
- {
- kfree(host_bulk_data_slot);
- }
-#endif
-
- if (card->fh_slot_host_tag_record)
- {
- unifi_trace(card->ospriv, UDBG5, "CopyFromHostAndClearSlot Reset entry for slot=%d\n", slot);
-
- /* reset the host tag entry for the corresponding slot */
- card->fh_slot_host_tag_record[slot] = CSR_WIFI_HIP_RESERVED_HOST_TAG;
- }
-
-
- /* Set length field in from_host_data array to 0 */
- CardClearFromHostDataSlot(card, slot);
- }
-
- return CSR_RESULT_SUCCESS;
-} /* process_bulk_data_command() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * check_fh_sig_slots
- *
- * Check whether there are <n> free signal slots available on UniFi.
- * This takes into account the signals already batched since the
- * from_host_signal counts were last read.
- * If the from_host_signal counts indicate not enough space, we read
- * the latest count from UniFi to see if some more have been freed.
- *
- * Arguments:
- * None.
- *
- * Returns:
- * CSR_RESULT_SUCCESS, otherwise CSR error code on error.
- * ---------------------------------------------------------------------------
- */
-static CsrResult check_fh_sig_slots(card_t *card, u16 needed, s32 *space_fh)
-{
- u32 count_fhw;
- u32 occupied_fh, slots_fh;
- s32 count_fhr;
-
- count_fhw = card->from_host_signals_w;
- count_fhr = card->from_host_signals_r;
- slots_fh = card->config_data.num_fromhost_sig_frags;
-
- /* Only read the space in from-host queue if necessary */
- occupied_fh = (count_fhw - count_fhr) % 128;
-
- if (slots_fh < occupied_fh)
- {
- *space_fh = 0;
- }
- else
- {
- *space_fh = slots_fh - occupied_fh;
- }
-
- if ((occupied_fh != 0) && (*space_fh < needed))
- {
- count_fhr = unifi_read_shared_count(card, card->sdio_ctrl_addr + 2);
- if (count_fhr < 0)
- {
- unifi_error(card->ospriv, "Failed to read from-host sig read count\n");
- return CSR_RESULT_FAILURE;
- }
- card->from_host_signals_r = count_fhr; /* diag */
-
- occupied_fh = (count_fhw - count_fhr) % 128;
- *space_fh = slots_fh - occupied_fh;
- }
-
- return CSR_RESULT_SUCCESS;
-} /* check_fh_sig_slots() */
-
-
-/*
-* If we are padding the From-Host signals to the SDIO block size,
-* we need to round up the needed_chunks to the SDIO block size.
-*/
-#define ROUND_UP_NEEDED_CHUNKS(_card, _needed_chunks) \
- { \
- u16 _chunks_per_block; \
- u16 _chunks_in_last_block; \
- \
- if (_card->sdio_io_block_pad) \
- { \
- _chunks_per_block = _card->sdio_io_block_size / _card->config_data.sig_frag_size; \
- _chunks_in_last_block = _needed_chunks % _chunks_per_block; \
- if (_chunks_in_last_block != 0) \
- { \
- _needed_chunks = _needed_chunks + (_chunks_per_block - _chunks_in_last_block); \
- } \
- } \
- }
-
-
-#define ROUND_UP_SPACE_CHUNKS(_card, _space_chunks) \
- { \
- u16 _chunks_per_block; \
- \
- if (_card->sdio_io_block_pad) \
- { \
- _chunks_per_block = _card->sdio_io_block_size / _card->config_data.sig_frag_size; \
- _space_chunks = ((_space_chunks / _chunks_per_block) * _chunks_per_block); \
- } \
- }
-
-
-
-
-
-/*
- * ---------------------------------------------------------------------------
- * process_fh_cmd_queue
- *
- * Take one signal off the from-host queue and copy it to the UniFi.
- * Does nothing if the UniFi has no slots free.
- *
- * Arguments:
- * card Pointer to card context struct
- * processed Location to write:
- * 0 if there is nothing on the queue to process
- * 1 if a signal was successfully processed
- *
- * Returns:
- * CSR error code if an error occurred.
- *
- * Notes:
- * The from-host queue contains signal requests from the network driver
- * and any UDI clients interspersed. UDI clients' requests have been stored
- * in the from-host queue using the wire-format structures, as they arrive.
- * All other requests are stored in the from-host queue using the host
- * (cpu specific) structures. We use the is_packed member of the card_signal_t
- * structure that describes the queue to make the distinction.
- * ---------------------------------------------------------------------------
- */
-static CsrResult process_fh_cmd_queue(card_t *card, s32 *processed)
-{
- q_t *sigq = &card->fh_command_queue;
-
- CsrResult r;
- u16 pending_sigs;
- u16 pending_chunks;
- u16 needed_chunks;
- s32 space_chunks;
- u16 q_index;
-
- *processed = 0;
-
- /* Get the number of pending signals. */
- pending_sigs = CSR_WIFI_HIP_Q_SLOTS_USED(sigq);
- unifi_trace(card->ospriv, UDBG5, "proc_fh: %d pending\n", pending_sigs);
- if (pending_sigs == 0)
- {
- /* Nothing to do */
- return CSR_RESULT_SUCCESS;
- }
-
- /* Work out how many chunks we have waiting to send */
- for (pending_chunks = 0, q_index = CSR_WIFI_HIP_Q_NEXT_R_SLOT(sigq);
- q_index != CSR_WIFI_HIP_Q_NEXT_W_SLOT(sigq);
- q_index = CSR_WIFI_HIP_Q_WRAP(sigq, q_index + 1))
- {
- card_signal_t *csptr = CSR_WIFI_HIP_Q_SLOT_DATA(sigq, q_index);
-
- /*
- * Note that GET_CHUNKS_FOR() needs the size of the packed
- * (wire-formatted) structure
- */
- pending_chunks += GET_CHUNKS_FOR(card->config_data.sig_frag_size, (u16)(csptr->signal_length + 2));
- }
-
- /*
- * Check whether UniFi has space for all the buffered bulk-data
- * commands and signals as well.
- */
- needed_chunks = pending_chunks + card->fh_buffer.count;
-
- /* Round up to the block size if necessary */
- ROUND_UP_NEEDED_CHUNKS(card, needed_chunks);
-
- r = check_fh_sig_slots(card, needed_chunks, &space_chunks);
- if (r != CSR_RESULT_SUCCESS)
- {
- /* Error */
- unifi_error(card->ospriv, "Failed to read fh sig count\n");
- return r;
- }
-
-#ifdef CSR_WIFI_HIP_NOISY
- unifi_error(card->ospriv, "proc_fh: %d chunks free, need %d\n",
- space_chunks, needed_chunks);
-#endif /* CSR_WIFI_HIP_NOISY */
-
-
- /*
- * Coalesce as many from-host signals as possible
- * into a single block and write using a single CMD53
- */
- if (needed_chunks > (u16)space_chunks)
- {
- /* Round up to the block size if necessary */
- ROUND_UP_SPACE_CHUNKS(card, space_chunks);
-
- /*
- * If the f/w has less free chunks than those already pending
- * return immediately.
- */
- if ((u16)space_chunks <= card->fh_buffer.count)
- {
- /*
- * No room in UniFi for any signals after the buffered bulk
- * data commands have been sent.
- */
- unifi_error(card->ospriv, "not enough room to send signals, need %d chunks, %d free\n",
- card->fh_buffer.count, space_chunks);
- card->generate_interrupt = 1;
- return CSR_RESULT_SUCCESS;
- }
- pending_chunks = (u16)(space_chunks - card->fh_buffer.count);
- }
-
- while (pending_sigs-- && pending_chunks > 0)
- {
- card_signal_t *csptr;
- s16 i;
- u16 sig_chunks, total_length, free_chunks_in_fh_buffer;
- bulk_data_param_t bulkdata;
- u8 *packed_sigptr;
- u16 signal_length = 0;
-
- /* Retrieve the entry at the head of the queue */
- q_index = CSR_WIFI_HIP_Q_NEXT_R_SLOT(sigq);
-
- /* Get a pointer to the containing card_signal_t struct */
- csptr = CSR_WIFI_HIP_Q_SLOT_DATA(sigq, q_index);
-
- /* Get the new length of the packed signal */
- signal_length = csptr->signal_length;
-
- if ((signal_length & 1) || (signal_length > UNIFI_PACKED_SIGBUF_SIZE))
- {
- unifi_error(card->ospriv, "process_fh_queue: Bad len: %d\n", signal_length);
- return CSR_RESULT_FAILURE;
- }
-
- /* Need space for 2-byte SDIO protocol header + signal */
- sig_chunks = GET_CHUNKS_FOR(card->config_data.sig_frag_size, (u16)(signal_length + 2));
-
- free_chunks_in_fh_buffer = GET_CHUNKS_FOR(card->config_data.sig_frag_size,
- (u16)((card->fh_buffer.buf + UNIFI_FH_BUF_SIZE) - card->fh_buffer.ptr));
- if (free_chunks_in_fh_buffer < sig_chunks)
- {
- /* No more room */
- unifi_notice(card->ospriv, "proc_fh_cmd_q: no room in fh buffer for 0x%.4X, deferring\n",
- (u16)(GET_SIGNAL_ID(csptr->sigbuf)));
- break;
- }
-
- packed_sigptr = csptr->sigbuf;
-
- /* Claim and set up a from-host data slot */
- if (CSR_RESULT_FAILURE == CardWriteBulkData(card, csptr, UNIFI_TRAFFIC_Q_MLME))
- {
- unifi_notice(card->ospriv, "proc_fh_cmd_q: no fh data slots for 0x%.4X, deferring\n",
- (u16)(GET_SIGNAL_ID(csptr->sigbuf)));
- break;
- }
-
- for (i = 0; i < UNIFI_MAX_DATA_REFERENCES; i++)
- {
- if (csptr->bulkdata[i].data_length == 0)
- {
- UNIFI_INIT_BULK_DATA(&bulkdata.d[i]);
- }
- else
- {
- bulkdata.d[i].os_data_ptr = csptr->bulkdata[i].os_data_ptr;
- bulkdata.d[i].data_length = csptr->bulkdata[i].data_length;
- }
-
- /* Pass the free responsibility to the lower layer. */
- UNIFI_INIT_BULK_DATA(&csptr->bulkdata[i]);
- }
-
- unifi_trace(card->ospriv, UDBG2, "Sending signal 0x%.4X\n",
- GET_SIGNAL_ID(packed_sigptr));
-#ifdef CSR_WIFI_HIP_NOISY
- unifi_error(card->ospriv, "Sending signal 0x%.4X\n",
- GET_SIGNAL_ID(packed_sigptr));
-#endif /* CSR_WIFI_HIP_NOISY */
-
-
- /* Append packed signal to F-H buffer */
- total_length = sig_chunks * card->config_data.sig_frag_size;
-
- card->fh_buffer.ptr[0] = (u8)(signal_length & 0xff);
- card->fh_buffer.ptr[1] =
- (u8)(((signal_length >> 8) & 0xf) | (SDIO_CMD_SIGNAL << 4));
-
- memcpy(card->fh_buffer.ptr + 2, packed_sigptr, signal_length);
- memset(card->fh_buffer.ptr + 2 + signal_length, 0,
- total_length - (2 + signal_length));
-
-#ifdef CSR_WIFI_HIP_NOISY
- unifi_error(card->ospriv, "proc_fh: fh_buffer %d bytes \n",
- signal_length + 2);
- dump(card->fh_buffer.ptr, signal_length + 2);
- unifi_trace(card->ospriv, UDBG1, " \n");
-#endif /* CSR_WIFI_HIP_NOISY */
-
- card->fh_buffer.ptr += total_length;
- card->fh_buffer.count += sig_chunks;
-
-#ifdef CSR_WIFI_HIP_NOISY
- unifi_error(card->ospriv, "Added %d to fh buf, len now %d, count %d\n",
- signal_length,
- card->fh_buffer.ptr - card->fh_buffer.buf,
- card->fh_buffer.count);
-#endif /* CSR_WIFI_HIP_NOISY */
-
- (*processed)++;
- pending_chunks -= sig_chunks;
-
- /* Log the signal to the UDI. */
- /* UDI will get the packed structure */
- /* Can not log the unpacked signal, unless we reconstruct it! */
- if (card->udi_hook)
- {
- (*card->udi_hook)(card->ospriv, packed_sigptr, signal_length,
- &bulkdata, UDI_LOG_FROM_HOST);
- }
-
- /* Remove entry from q */
- csptr->signal_length = 0;
- CSR_WIFI_HIP_Q_INC_R(sigq);
- }
-
- return CSR_RESULT_SUCCESS;
-} /* process_fh_cmd_queue() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * process_fh_traffic_queue
- *
- * Take signals off the from-host queue and copy them to the UniFi.
- * Does nothing if the UniFi has no slots free.
- *
- * Arguments:
- * card Pointer to card context struct
- * sigq Pointer to the traffic queue
- * processed Pointer to location to write:
- * 0 if there is nothing on the queue to process
- * 1 if a signal was successfully processed
- *
- * Returns:
- * CSR error code if an error occurred.
- *
- * Notes:
- * The from-host queue contains signal requests from the network driver
- * and any UDI clients interspersed.
- * ---------------------------------------------------------------------------
- */
-static CsrResult process_fh_traffic_queue(card_t *card, s32 *processed)
-{
- q_t *sigq = card->fh_traffic_queue;
-
- CsrResult r;
- s16 n = 0;
- s32 q_no;
- u16 pending_sigs = 0;
- u16 pending_chunks = 0;
- u16 needed_chunks;
- s32 space_chunks;
- u16 q_index;
- u32 host_tag = 0;
- u16 slot_num = 0;
-
- *processed = 0;
-
- /* calculate how many signals are in queues and how many chunks are needed. */
- for (n = UNIFI_NO_OF_TX_QS - 1; n >= 0; n--)
- {
- /* Get the number of pending signals. */
- pending_sigs += CSR_WIFI_HIP_Q_SLOTS_USED(&sigq[n]);
- unifi_trace(card->ospriv, UDBG5, "proc_fh%d: %d pending\n", n, pending_sigs);
-
- /* Work out how many chunks we have waiting to send */
- for (q_index = CSR_WIFI_HIP_Q_NEXT_R_SLOT(&sigq[n]);
- q_index != CSR_WIFI_HIP_Q_NEXT_W_SLOT(&sigq[n]);
- q_index = CSR_WIFI_HIP_Q_WRAP(&sigq[n], q_index + 1))
- {
- card_signal_t *csptr = CSR_WIFI_HIP_Q_SLOT_DATA(&sigq[n], q_index);
-
- /*
- * Note that GET_CHUNKS_FOR() needs the size of the packed
- * (wire-formatted) structure
- */
- pending_chunks += GET_CHUNKS_FOR(card->config_data.sig_frag_size, (u16)(csptr->signal_length + 2));
- }
- }
-
- /* If there are no pending signals, just return */
- if (pending_sigs == 0)
- {
- /* Nothing to do */
- return CSR_RESULT_SUCCESS;
- }
-
- /*
- * Check whether UniFi has space for all the buffered bulk-data
- * commands and signals as well.
- */
- needed_chunks = pending_chunks + card->fh_buffer.count;
-
- /* Round up to the block size if necessary */
- ROUND_UP_NEEDED_CHUNKS(card, needed_chunks);
-
- r = check_fh_sig_slots(card, needed_chunks, &space_chunks);
- if (r != CSR_RESULT_SUCCESS)
- {
- /* Error */
- unifi_error(card->ospriv, "Failed to read fh sig count\n");
- return r;
- }
-
-#ifdef CSR_WIFI_HIP_NOISY
- unifi_error(card->ospriv,
- "process_fh_traffic_queue: %d chunks free, need %d\n",
- space_chunks, needed_chunks);
- read_fhsr(card); /* debugging only */
-#endif /* CSR_WIFI_HIP_NOISY */
-
- /* Coalesce as many from-host signals as possible
- into a single block and write using a single CMD53 */
- if (needed_chunks > (u16)space_chunks)
- {
- /* Round up to the block size if necessary */
- ROUND_UP_SPACE_CHUNKS(card, space_chunks);
-
- if ((u16)space_chunks <= card->fh_buffer.count)
- {
- /*
- * No room in UniFi for any signals after the buffered bulk
- * data commands have been sent.
- */
- unifi_error(card->ospriv, "not enough room to send signals, need %d chunks, %d free\n",
- card->fh_buffer.count, space_chunks);
- card->generate_interrupt = 1;
- return 0;
- }
-
- pending_chunks = (u16)space_chunks - card->fh_buffer.count;
- }
-
- q_no = UNIFI_NO_OF_TX_QS - 1;
-
- /*
- * pending_sigs will be exhausted if there are is no restriction to the pending
- * signals per queue. pending_chunks may be exhausted if there is a restriction.
- * q_no check will be exhausted if there is a restriction and our round-robin
- * algorith fails to fill all chunks.
- */
- do
- {
- card_signal_t *csptr;
- u16 sig_chunks, total_length, free_chunks_in_fh_buffer;
- bulk_data_param_t bulkdata;
- u8 *packed_sigptr;
- u16 signal_length = 0;
-
- /* if this queue is empty go to next one. */
- if (CSR_WIFI_HIP_Q_SLOTS_USED(&sigq[q_no]) == 0)
- {
- q_no--;
- continue;
- }
-
- /* Retrieve the entry at the head of the queue */
- q_index = CSR_WIFI_HIP_Q_NEXT_R_SLOT(&sigq[q_no]);
-
- /* Get a pointer to the containing card_signal_t struct */
- csptr = CSR_WIFI_HIP_Q_SLOT_DATA(&sigq[q_no], q_index);
-
- /* Get the new length of the packed signal */
- signal_length = csptr->signal_length;
-
- if ((signal_length & 1) || (signal_length > UNIFI_PACKED_SIGBUF_SIZE))
- {
- unifi_error(card->ospriv, "process_fh_traffic_queue: Bad len: %d\n", signal_length);
- return CSR_RESULT_FAILURE;
- }
-
- /* Need space for 2-byte SDIO protocol header + signal */
- sig_chunks = GET_CHUNKS_FOR(card->config_data.sig_frag_size, (u16)(signal_length + 2));
- free_chunks_in_fh_buffer = GET_CHUNKS_FOR(card->config_data.sig_frag_size,
- (u16)((card->fh_buffer.buf + UNIFI_FH_BUF_SIZE) - card->fh_buffer.ptr));
- if (free_chunks_in_fh_buffer < sig_chunks)
- {
- /* No more room */
- unifi_notice(card->ospriv, "process_fh_traffic_queue: no more chunks.\n");
- break;
- }
-
- packed_sigptr = csptr->sigbuf;
- /* Claim and set up a from-host data slot */
- if (CSR_RESULT_FAILURE == CardWriteBulkData(card, csptr, (unifi_TrafficQueue)q_no))
- {
- q_no--;
- continue;
- }
-
- /* Sanity check: MA-PACKET.req must have a valid bulk data */
- if ((csptr->bulkdata[0].data_length == 0) || (csptr->bulkdata[0].os_data_ptr == NULL))
- {
- unifi_error(card->ospriv, "MA-PACKET.req with empty bulk data (%d bytes in %p)\n",
- csptr->bulkdata[0].data_length, csptr->bulkdata[0].os_data_ptr);
- dump(packed_sigptr, signal_length);
- return CSR_RESULT_FAILURE;
- }
-
- bulkdata.d[0].os_data_ptr = csptr->bulkdata[0].os_data_ptr;
- bulkdata.d[0].data_length = csptr->bulkdata[0].data_length;
- bulkdata.d[0].os_net_buf_ptr = csptr->bulkdata[0].os_net_buf_ptr;
- bulkdata.d[0].net_buf_length = csptr->bulkdata[0].net_buf_length;
-
- /* The driver owns clearing of HIP slots for following scenario
- * - driver has requested a MA-PACKET.req signal
- * - The f/w after receiving the signal decides it can't send it out due to various reasons
- * - So the f/w without downloading the bulk data decides to just send a confirmation with fail
- * - and then sends a clear slot signal to HIP
- *
- * But in some cases the clear slot signal never comes and the slot remains --NOT-- freed for ever
- *
- * To handle this, HIP will keep the record of host tag for each occupied slot
- * and then based on status of that Host tag and slot the driver will decide if the slot is
- * cleared by f/w signal or the slot has to be freed by driver
- */
-
- if (card->fh_slot_host_tag_record)
- {
- /* Update the f-h slot record for the corresponding host tag */
- host_tag = GET_PACKED_MA_PACKET_REQUEST_HOST_TAG(packed_sigptr);
- slot_num = GET_PACKED_DATAREF_SLOT(packed_sigptr, 0) & 0x00FF;
-
- unifi_trace(card->ospriv, UDBG5,
- "process_fh_traffic_queue signal ID =%x fh slot=%x Host tag =%x\n",
- GET_SIGNAL_ID(packed_sigptr), slot_num, host_tag);
- card->fh_slot_host_tag_record[slot_num] = host_tag;
- }
- UNIFI_INIT_BULK_DATA(&bulkdata.d[1]);
- UNIFI_INIT_BULK_DATA(&csptr->bulkdata[0]);
- UNIFI_INIT_BULK_DATA(&csptr->bulkdata[1]);
-
-#ifdef CSR_WIFI_HIP_DATA_PLANE_PROFILE
- if (bulkdata.d[0].os_data_ptr)
- {
- if ((*bulkdata.d[0].os_data_ptr) & 0x08)
- {
- card->cmd_prof.tx_count++;
- }
- }
-#endif
- unifi_trace(card->ospriv, UDBG3, "Sending signal 0x%.4X\n",
- GET_SIGNAL_ID(packed_sigptr));
-#ifdef CSR_WIFI_HIP_NOISY
- unifi_error(card->ospriv, "Sending signal 0x%.4X\n",
- GET_SIGNAL_ID(packed_sigptr));
-#endif /* CSR_WIFI_HIP_NOISY */
-
- /* Append packed signal to F-H buffer */
- total_length = sig_chunks * card->config_data.sig_frag_size;
-
- card->fh_buffer.ptr[0] = (u8)(signal_length & 0xff);
- card->fh_buffer.ptr[1] =
- (u8)(((signal_length >> 8) & 0xf) | (SDIO_CMD_SIGNAL << 4));
-
- memcpy(card->fh_buffer.ptr + 2, packed_sigptr, signal_length);
- memset(card->fh_buffer.ptr + 2 + signal_length, 0,
- total_length - (2 + signal_length));
-
-#ifdef CSR_WIFI_HIP_NOISY
- unifi_error(card->ospriv, "proc_fh: fh_buffer %d bytes \n",
- signal_length + 2);
- dump(card->fh_buffer.ptr, signal_length + 2);
- unifi_trace(card->ospriv, UDBG1, " \n");
-#endif /* CSR_WIFI_HIP_NOISY */
-
- card->fh_buffer.ptr += total_length;
- card->fh_buffer.count += sig_chunks;
-
-#ifdef CSR_WIFI_HIP_NOISY
- unifi_error(card->ospriv, "Added %d to fh buf, len now %d, count %d\n",
- signal_length,
- card->fh_buffer.ptr - card->fh_buffer.buf,
- card->fh_buffer.count);
-#endif /* CSR_WIFI_HIP_NOISY */
-
- (*processed)++;
- pending_sigs--;
- pending_chunks -= sig_chunks;
-
- /* Log the signal to the UDI. */
- /* UDI will get the packed structure */
- /* Can not log the unpacked signal, unless we reconstruct it! */
- if (card->udi_hook)
- {
- (*card->udi_hook)(card->ospriv, packed_sigptr, signal_length,
- &bulkdata, UDI_LOG_FROM_HOST);
- }
-
- /* Remove entry from q */
- csptr->signal_length = 0;
- /* Note that the traffic queue has only one valid bulk data buffer. */
- csptr->bulkdata[0].data_length = 0;
-
- CSR_WIFI_HIP_Q_INC_R(&sigq[q_no]);
- } while ((pending_sigs > 0) && (pending_chunks > 0) && (q_no >= 0));
-
- return CSR_RESULT_SUCCESS;
-} /* process_fh_traffic_queue() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * flush_fh_buffer
- *
- * Write out the cache from-hosts signals to the UniFi.
- *
- * Arguments:
- * card Pointer to card context struct
- *
- * Returns:
- * CSR error code if an SDIO error occurred.
- * ---------------------------------------------------------------------------
- */
-static CsrResult flush_fh_buffer(card_t *card)
-{
- CsrResult r;
- u16 len;
- u16 sig_units;
- u16 data_round;
- u16 chunks_in_last_block;
- u16 padding_chunks;
- u16 i;
-
- len = card->fh_buffer.ptr - card->fh_buffer.buf;
-
-#ifdef CSR_WIFI_HIP_NOISY
- unifi_error(card->ospriv, "fh_buffer is at %p, ptr= %p\n",
- card->fh_buffer.buf, card->fh_buffer.ptr);
-#endif /* CSR_WIFI_HIP_NOISY */
-
- if (len == 0)
- {
- return CSR_RESULT_SUCCESS;
- }
-
-#ifdef CSR_WIFI_HIP_NOISY
- if (dump_fh_buf)
- {
- dump(card->fh_buffer.buf, len);
- dump_fh_buf = 0;
- }
-#endif /* CSR_WIFI_HIP_NOISY */
-
- if (card->sdio_io_block_pad)
- {
- /* Both of these are powers of 2 */
- sig_units = card->config_data.sig_frag_size;
- data_round = card->sdio_io_block_size;
-
- if (data_round > sig_units)
- {
- chunks_in_last_block = (len % data_round) / sig_units;
-
- if (chunks_in_last_block != 0)
- {
- padding_chunks = (data_round / sig_units) - chunks_in_last_block;
-
- memset(card->fh_buffer.ptr, 0, padding_chunks * sig_units);
- for (i = 0; i < padding_chunks; i++)
- {
- card->fh_buffer.ptr[1] = SDIO_CMD_PADDING << 4;
- card->fh_buffer.ptr += sig_units;
- }
-
- card->fh_buffer.count += padding_chunks;
- len += padding_chunks * sig_units;
- }
- }
- }
-
- r = unifi_bulk_rw(card,
- card->config_data.fromhost_sigbuf_handle,
- card->fh_buffer.buf,
- len, UNIFI_SDIO_WRITE);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to write fh signals: %u bytes, error %d\n", len, r);
- return r;
- }
-
- /* Update from-host-signals-written signal count */
- card->from_host_signals_w =
- (card->from_host_signals_w + card->fh_buffer.count) % 128u;
- r = unifi_write_8_or_16(card, card->sdio_ctrl_addr + 0,
- (u8)card->from_host_signals_w);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to write fh signal count %u with error %d\n",
- card->from_host_signals_w, r);
- return r;
- }
- card->generate_interrupt = 1;
-
- /* Reset the fh buffer pointer */
- card->fh_buffer.ptr = card->fh_buffer.buf;
- card->fh_buffer.count = 0;
-
-#ifdef CSR_WIFI_HIP_NOISY
- unifi_error(card->ospriv, "END flush: fh len %d, count %d\n",
- card->fh_buffer.ptr - card->fh_buffer.buf,
- card->fh_buffer.count);
-#endif /* CSR_WIFI_HIP_NOISY */
-
- return CSR_RESULT_SUCCESS;
-} /* flush_fh_buffer() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * restart_packet_flow
- *
- * This function is called before the bottom-half thread sleeps.
- * It checks whether both data and signal resources are available and
- * then calls the OS-layer function to re-enable packet transmission.
- *
- * Arguments:
- * card Pointer to card context struct
- *
- * Returns:
- * None.
- * ---------------------------------------------------------------------------
- */
-static void restart_packet_flow(card_t *card)
-{
- u8 q;
-
- /*
- * We only look at the fh_traffic_queue, because that is where packets from
- * the network stack are placed.
- */
- for (q = 0; q <= UNIFI_TRAFFIC_Q_VO; q++)
- {
- if (card_is_tx_q_paused(card, q) &&
- CSR_WIFI_HIP_Q_SLOTS_FREE(&card->fh_traffic_queue[q]) >= RESUME_XMIT_THRESHOLD)
- {
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- unifi_debug_log_to_buf("U");
-#endif
- card_tx_q_unpause(card, q);
- unifi_restart_xmit(card->ospriv, (unifi_TrafficQueue)q);
- }
- }
-} /* restart_packet_flow() */
-
-
diff --git a/drivers/staging/csr/csr_wifi_hip_card_sdio_mem.c b/drivers/staging/csr/csr_wifi_hip_card_sdio_mem.c
deleted file mode 100644
index 17867f60df16..000000000000
--- a/drivers/staging/csr/csr_wifi_hip_card_sdio_mem.c
+++ /dev/null
@@ -1,1713 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2012
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-/*
- * ---------------------------------------------------------------------------
- * FILE: csr_wifi_hip_card_sdio_mem.c
- *
- * PURPOSE: Implementation of the Card API for SDIO.
- *
- * ---------------------------------------------------------------------------
- */
-#include "csr_wifi_hip_unifi.h"
-#include "csr_wifi_hip_card.h"
-
-#define SDIO_RETRIES 3
-#define CSR_WIFI_HIP_SDIO_TRACE_DATA_LENGTH 16
-
-
-#define retryable_sdio_error(_csrResult) (((_csrResult) == CSR_SDIO_RESULT_CRC_ERROR) || ((_csrResult) == CSR_SDIO_RESULT_TIMEOUT))
-
-
-/*
- * ---------------------------------------------------------------------------
- * retrying_read8
- * retrying_write8
- *
- * These functions provide the first level of retry for SDIO operations.
- * If an SDIO command fails for reason of a response timeout or CRC
- * error, it is retried immediately. If three attempts fail we report a
- * failure.
- * If the command failed for any other reason, the failure is reported
- * immediately.
- *
- * Arguments:
- * card Pointer to card structure.
- * funcnum The SDIO function to access.
- * Function 0 is the Card Configuration Register space,
- * function 1/2 is the UniFi register space.
- * addr Address to access
- * pdata Pointer in which to return the value read.
- * data Value to write.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- * ---------------------------------------------------------------------------
- */
-static CsrResult retrying_read8(card_t *card, s16 funcnum, u32 addr, u8 *pdata)
-{
- CsrSdioFunction *sdio = card->sdio_if;
- CsrResult r = CSR_RESULT_SUCCESS;
- s16 retries;
- CsrResult csrResult = CSR_RESULT_SUCCESS;
-
- retries = 0;
- while (retries++ < SDIO_RETRIES)
- {
- if (funcnum == 0)
- {
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- unifi_debug_log_to_buf("r0@%02X", addr);
-#endif
- csrResult = CsrSdioF0Read8(sdio, addr, pdata);
- }
- else
- {
-#ifdef CSR_WIFI_TRANSPORT_CSPI
- unifi_error(card->ospriv,
- "retrying_read_f0_8: F1 8-bit reads are not allowed.\n");
- return CSR_RESULT_FAILURE;
-#else
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- unifi_debug_log_to_buf("r@%02X", addr);
-#endif
- csrResult = CsrSdioRead8(sdio, addr, pdata);
-#endif
- }
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- unifi_debug_log_to_buf("error=%X\n", csrResult);
- }
- else
- {
- unifi_debug_log_to_buf("=%X\n", *pdata);
- }
-#endif
- if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
- {
- return CSR_WIFI_HIP_RESULT_NO_DEVICE;
- }
- /*
- * Try again for retryable (CRC or TIMEOUT) errors,
- * break on success or fatal error
- */
- if (!retryable_sdio_error(csrResult))
- {
-#ifdef CSR_WIFI_HIP_DATA_PLANE_PROFILE
- card->cmd_prof.cmd52_count++;
-#endif
- break;
- }
- unifi_trace(card->ospriv, UDBG2, "retryable SDIO error reading F%d 0x%lX\n", funcnum, addr);
- }
-
- if ((csrResult == CSR_RESULT_SUCCESS) && (retries > 1))
- {
- unifi_warning(card->ospriv, "Read succeeded after %d attempts\n", retries);
- }
-
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read from UniFi (addr 0x%lX) after %d tries\n",
- addr, retries - 1);
- /* Report any SDIO error as a general i/o error */
- r = CSR_RESULT_FAILURE;
- }
-
- return r;
-} /* retrying_read8() */
-
-
-static CsrResult retrying_write8(card_t *card, s16 funcnum, u32 addr, u8 data)
-{
- CsrSdioFunction *sdio = card->sdio_if;
- CsrResult r = CSR_RESULT_SUCCESS;
- s16 retries;
- CsrResult csrResult = CSR_RESULT_SUCCESS;
-
- retries = 0;
- while (retries++ < SDIO_RETRIES)
- {
- if (funcnum == 0)
- {
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- unifi_debug_log_to_buf("w0@%02X=%X", addr, data);
-#endif
- csrResult = CsrSdioF0Write8(sdio, addr, data);
- }
- else
- {
-#ifdef CSR_WIFI_TRANSPORT_CSPI
- unifi_error(card->ospriv,
- "retrying_write_f0_8: F1 8-bit writes are not allowed.\n");
- return CSR_RESULT_FAILURE;
-#else
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- unifi_debug_log_to_buf("w@%02X=%X", addr, data);
-#endif
- csrResult = CsrSdioWrite8(sdio, addr, data);
-#endif
- }
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- unifi_debug_log_to_buf(",error=%X", csrResult);
- }
- unifi_debug_string_to_buf("\n");
-#endif
- if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
- {
- return CSR_WIFI_HIP_RESULT_NO_DEVICE;
- }
- /*
- * Try again for retryable (CRC or TIMEOUT) errors,
- * break on success or fatal error
- */
- if (!retryable_sdio_error(csrResult))
- {
-#ifdef CSR_WIFI_HIP_DATA_PLANE_PROFILE
- card->cmd_prof.cmd52_count++;
-#endif
- break;
- }
- unifi_trace(card->ospriv, UDBG2, "retryable SDIO error writing %02X to F%d 0x%lX\n",
- data, funcnum, addr);
- }
-
- if ((csrResult == CSR_RESULT_SUCCESS) && (retries > 1))
- {
- unifi_warning(card->ospriv, "Write succeeded after %d attempts\n", retries);
- }
-
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to write to UniFi (addr 0x%lX) after %d tries\n",
- addr, retries - 1);
- /* Report any SDIO error as a general i/o error */
- r = CSR_RESULT_FAILURE;
- }
-
- return r;
-} /* retrying_write8() */
-
-
-static CsrResult retrying_read16(card_t *card, s16 funcnum,
- u32 addr, u16 *pdata)
-{
- CsrSdioFunction *sdio = card->sdio_if;
- CsrResult r = CSR_RESULT_SUCCESS;
- s16 retries;
- CsrResult csrResult = CSR_RESULT_SUCCESS;
-
- retries = 0;
- while (retries++ < SDIO_RETRIES)
- {
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- unifi_debug_log_to_buf("r@%02X", addr);
-#endif
- csrResult = CsrSdioRead16(sdio, addr, pdata);
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- unifi_debug_log_to_buf("error=%X\n", csrResult);
- }
- else
- {
- unifi_debug_log_to_buf("=%X\n", *pdata);
- }
-#endif
- if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
- {
- return CSR_WIFI_HIP_RESULT_NO_DEVICE;
- }
-
- /*
- * Try again for retryable (CRC or TIMEOUT) errors,
- * break on success or fatal error
- */
- if (!retryable_sdio_error(csrResult))
- {
-#ifdef CSR_WIFI_HIP_DATA_PLANE_PROFILE
- card->cmd_prof.cmd52_count++;
-#endif
- break;
- }
- unifi_trace(card->ospriv, UDBG2, "retryable SDIO error reading F%d 0x%lX\n", funcnum, addr);
- }
-
- if ((csrResult == CSR_RESULT_SUCCESS) && (retries > 1))
- {
- unifi_warning(card->ospriv, "Read succeeded after %d attempts\n", retries);
- }
-
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read from UniFi (addr 0x%lX) after %d tries\n",
- addr, retries - 1);
- /* Report any SDIO error as a general i/o error */
- r = CSR_RESULT_FAILURE;
- }
-
- return r;
-} /* retrying_read16() */
-
-
-static CsrResult retrying_write16(card_t *card, s16 funcnum,
- u32 addr, u16 data)
-{
- CsrSdioFunction *sdio = card->sdio_if;
- CsrResult r = CSR_RESULT_SUCCESS;
- s16 retries;
- CsrResult csrResult = CSR_RESULT_SUCCESS;
-
- retries = 0;
- while (retries++ < SDIO_RETRIES)
- {
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- unifi_debug_log_to_buf("w@%02X=%X", addr, data);
-#endif
- csrResult = CsrSdioWrite16(sdio, addr, data);
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- unifi_debug_log_to_buf(",error=%X", csrResult);
- }
- unifi_debug_string_to_buf("\n");
-#endif
- if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
- {
- return CSR_WIFI_HIP_RESULT_NO_DEVICE;
- }
-
- /*
- * Try again for retryable (CRC or TIMEOUT) errors,
- * break on success or fatal error
- */
- if (!retryable_sdio_error(csrResult))
- {
-#ifdef CSR_WIFI_HIP_DATA_PLANE_PROFILE
- card->cmd_prof.cmd52_count++;
-#endif
- break;
- }
- unifi_trace(card->ospriv, UDBG2, "retryable SDIO error writing %02X to F%d 0x%lX\n",
- data, funcnum, addr);
- }
-
- if ((csrResult == CSR_RESULT_SUCCESS) && (retries > 1))
- {
- unifi_warning(card->ospriv, "Write succeeded after %d attempts\n", retries);
- }
-
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to write to UniFi (addr 0x%lX) after %d tries\n",
- addr, retries - 1);
- /* Report any SDIO error as a general i/o error */
- r = CSR_RESULT_FAILURE;
- }
-
- return r;
-} /* retrying_write16() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * sdio_read_f0
- *
- * Reads a byte value from the CCCR (func 0) area of UniFi.
- *
- * Arguments:
- * card Pointer to card structure.
- * addr Address to read from
- * pdata Pointer in which to store the read value.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- * ---------------------------------------------------------------------------
- */
-CsrResult sdio_read_f0(card_t *card, u32 addr, u8 *pdata)
-{
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- card->cmd_prof.cmd52_f0_r_count++;
-#endif
- return retrying_read8(card, 0, addr, pdata);
-} /* sdio_read_f0() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * sdio_write_f0
- *
- * Writes a byte value to the CCCR (func 0) area of UniFi.
- *
- * Arguments:
- * card Pointer to card structure.
- * addr Address to read from
- * data Data value to write.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- * ---------------------------------------------------------------------------
- */
-CsrResult sdio_write_f0(card_t *card, u32 addr, u8 data)
-{
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- card->cmd_prof.cmd52_f0_w_count++;
-#endif
- return retrying_write8(card, 0, addr, data);
-} /* sdio_write_f0() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_read_direct_8_or_16
- *
- * Read a 8-bit value from the UniFi SDIO interface.
- *
- * Arguments:
- * card Pointer to card structure.
- * addr Address to read from
- * pdata Pointer in which to return data.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, non-zero error code on error:
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_read_direct_8_or_16(card_t *card, u32 addr, u8 *pdata)
-{
-#ifdef CSR_WIFI_TRANSPORT_CSPI
- u16 w;
- CsrResult r;
-
- r = retrying_read16(card, card->function, addr, &w);
- *pdata = (u8)(w & 0xFF);
- return r;
-#else
- return retrying_read8(card, card->function, addr, pdata);
-#endif
-} /* unifi_read_direct_8_or_16() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_write_direct_8_or_16
- *
- * Write a byte value to the UniFi SDIO interface.
- *
- * Arguments:
- * card Pointer to card structure.
- * addr Address to write to
- * data Value to write.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, non-zero error code on error
- *
- * Notes:
- * If 8-bit write is used, the even address *must* be written second.
- * This is because writes to odd bytes are cached and not committed
- * to memory until the preceding even address is written.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_write_direct_8_or_16(card_t *card, u32 addr, u8 data)
-{
- if (addr & 1)
- {
- unifi_warning(card->ospriv,
- "Warning: Byte write to an odd address (0x%lX) is dangerous\n",
- addr);
- }
-
-#ifdef CSR_WIFI_TRANSPORT_CSPI
- return retrying_write16(card, card->function, addr, (u16)data);
-#else
- return retrying_write8(card, card->function, addr, data);
-#endif
-} /* unifi_write_direct_8_or_16() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_read_direct16
- *
- * Read a 16-bit value from the UniFi SDIO interface.
- *
- * Arguments:
- * card Pointer to card structure.
- * addr Address to read from
- * pdata Pointer in which to return data.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- *
- * Notes:
- * The even address *must* be read first. This is because reads from
- * odd bytes are cached and read from memory when the preceding
- * even address is read.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_read_direct16(card_t *card, u32 addr, u16 *pdata)
-{
- return retrying_read16(card, card->function, addr, pdata);
-} /* unifi_read_direct16() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_write_direct16
- *
- * Write a 16-bit value to the UniFi SDIO interface.
- *
- * Arguments:
- * card Pointer to card structure.
- * addr Address to write to
- * data Value to write.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- *
- * Notes:
- * The even address *must* be written second. This is because writes to
- * odd bytes are cached and not committed to memory until the preceding
- * even address is written.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_write_direct16(card_t *card, u32 addr, u16 data)
-{
- return retrying_write16(card, card->function, addr, data);
-} /* unifi_write_direct16() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_read_direct32
- *
- * Read a 32-bit value from the UniFi SDIO interface.
- *
- * Arguments:
- * card Pointer to card structure.
- * addr Address to read from
- * pdata Pointer in which to return data.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_read_direct32(card_t *card, u32 addr, u32 *pdata)
-{
- CsrResult r;
- u16 w0, w1;
-
- r = retrying_read16(card, card->function, addr, &w0);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- r = retrying_read16(card, card->function, addr + 2, &w1);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- *pdata = ((u32)w1 << 16) | (u32)w0;
-
- return CSR_RESULT_SUCCESS;
-} /* unifi_read_direct32() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_read_directn_match
- *
- * Read multiple 8-bit values from the UniFi SDIO interface,
- * stopping when either we have read 'len' bytes or we have read
- * a octet equal to 'match'. If 'match' is not a valid octet
- * then this function is the same as 'unifi_read_directn'.
- *
- * Arguments:
- * card Pointer to card structure.
- * addr Start address to read from.
- * pdata Pointer to which to write data.
- * len Maximum umber of bytes to read
- * match The value to stop reading at.
- * num Pointer to buffer to write number of bytes read
- *
- * Returns:
- * number of octets read on success, negative error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- *
- * Notes:
- * The even address *must* be read first. This is because reads from
- * odd bytes are cached and read from memory when the preceding
- * even address is read.
- * ---------------------------------------------------------------------------
- */
-static CsrResult unifi_read_directn_match(card_t *card, u32 addr, void *pdata, u16 len, s8 m, u32 *num)
-{
- CsrResult r;
- u32 i;
- u8 *cptr;
- u16 w;
-
- *num = 0;
-
- cptr = (u8 *)pdata;
- for (i = 0; i < len; i += 2)
- {
- r = retrying_read16(card, card->function, addr, &w);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- *cptr++ = ((u8)w & 0xFF);
- if ((m >= 0) && (((s8)w & 0xFF) == m))
- {
- break;
- }
-
- if (i + 1 == len)
- {
- /* The len is odd. Ignore the last high byte */
- break;
- }
-
- *cptr++ = ((u8)(w >> 8) & 0xFF);
- if ((m >= 0) && (((s8)(w >> 8) & 0xFF) == m))
- {
- break;
- }
-
- addr += 2;
- }
-
- *num = (s32)(cptr - (u8 *)pdata);
- return CSR_RESULT_SUCCESS;
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_read_directn
- *
- * Read multiple 8-bit values from the UniFi SDIO interface.
- *
- * Arguments:
- * card Pointer to card structure.
- * addr Start address to read from.
- * pdata Pointer to which to write data.
- * len Number of bytes to read
- *
- * Returns:
- * 0 on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- *
- * Notes:
- * The even address *must* be read first. This is because reads from
- * odd bytes are cached and read from memory when the preceding
- * even address is read.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_read_directn(card_t *card, u32 addr, void *pdata, u16 len)
-{
- u32 num;
-
- return unifi_read_directn_match(card, addr, pdata, len, -1, &num);
-} /* unifi_read_directn() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_write_directn
- *
- * Write multiple 8-bit values to the UniFi SDIO interface.
- *
- * Arguments:
- * card Pointer to card structure.
- * addr Start address to write to.
- * pdata Source data pointer.
- * len Number of bytes to write, must be even.
- *
- * Returns:
- * 0 on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- *
- * Notes:
- * The UniFi has a peculiar 16-bit bus architecture. Writes are only
- * committed to memory when an even address is accessed. Writes to
- * odd addresses are cached and only committed if the next write is
- * to the preceding address.
- * This means we must write data as pairs of bytes in reverse order.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_write_directn(card_t *card, u32 addr, void *pdata, u16 len)
-{
- CsrResult r;
- u8 *cptr;
- s16 signed_len;
-
- cptr = (u8 *)pdata;
- signed_len = (s16)len;
- while (signed_len > 0)
- {
- /* This is UniFi-1 specific code. CSPI not supported so 8-bit write allowed */
- r = retrying_write16(card, card->function, addr, *cptr);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- cptr += 2;
- addr += 2;
- signed_len -= 2;
- }
-
- return CSR_RESULT_SUCCESS;
-} /* unifi_write_directn() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * set_dmem_page
- * set_pmem_page
- *
- * Set up the page register for the shared data memory window or program
- * memory window.
- *
- * Arguments:
- * card Pointer to card structure.
- * dmem_addr UniFi shared-data-memory address to access.
- * pmem_addr UniFi program memory address to access. This includes
- * External FLASH memory at 0x000000
- * Processor program memory at 0x200000
- * External SRAM at memory 0x400000
- * paddr Location to write an SDIO address (24-bit) for
- * use in a unifi_read_direct or unifi_write_direct call.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- * ---------------------------------------------------------------------------
- */
-static CsrResult set_dmem_page(card_t *card, u32 dmem_addr, u32 *paddr)
-{
- u16 page, addr;
- u32 len;
- CsrResult r;
-
- *paddr = 0;
-
- if (!ChipHelper_DecodeWindow(card->helper,
- CHIP_HELPER_WINDOW_3,
- CHIP_HELPER_WT_SHARED,
- dmem_addr / 2,
- &page, &addr, &len))
- {
- unifi_error(card->ospriv, "Failed to decode SHARED_DMEM_PAGE %08lx\n", dmem_addr);
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- if (page != card->dmem_page)
- {
- unifi_trace(card->ospriv, UDBG6, "setting dmem page=0x%X, addr=0x%lX\n", page, addr);
-
- /* change page register */
- r = unifi_write_direct16(card, ChipHelper_HOST_WINDOW3_PAGE(card->helper) * 2, page);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to write SHARED_DMEM_PAGE\n");
- return r;
- }
-
- card->dmem_page = page;
- }
-
- *paddr = ((s32)addr * 2) + (dmem_addr & 1);
-
- return CSR_RESULT_SUCCESS;
-} /* set_dmem_page() */
-
-
-static CsrResult set_pmem_page(card_t *card, u32 pmem_addr,
- enum chip_helper_window_type mem_type, u32 *paddr)
-{
- u16 page, addr;
- u32 len;
- CsrResult r;
-
- *paddr = 0;
-
- if (!ChipHelper_DecodeWindow(card->helper,
- CHIP_HELPER_WINDOW_2,
- mem_type,
- pmem_addr / 2,
- &page, &addr, &len))
- {
- unifi_error(card->ospriv, "Failed to decode PROG MEM PAGE %08lx %d\n", pmem_addr, mem_type);
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- if (page != card->pmem_page)
- {
- unifi_trace(card->ospriv, UDBG6, "setting pmem page=0x%X, addr=0x%lX\n", page, addr);
-
- /* change page register */
- r = unifi_write_direct16(card, ChipHelper_HOST_WINDOW2_PAGE(card->helper) * 2, page);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to write PROG MEM PAGE\n");
- return r;
- }
-
- card->pmem_page = page;
- }
-
- *paddr = ((s32)addr * 2) + (pmem_addr & 1);
-
- return CSR_RESULT_SUCCESS;
-} /* set_pmem_page() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * set_page
- *
- * Sets up the appropriate page register to access the given address.
- * Returns the sdio address at which the unifi address can be accessed.
- *
- * Arguments:
- * card Pointer to card structure.
- * generic_addr UniFi internal address to access, in Generic Pointer
- * format, i.e. top byte is space indicator.
- * paddr Location to write page address
- * SDIO address (24-bit) for use in a unifi_read_direct or
- * unifi_write_direct call
- *
- * Returns:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE the address is invalid
- * ---------------------------------------------------------------------------
- */
-static CsrResult set_page(card_t *card, u32 generic_addr, u32 *paddr)
-{
- s32 space;
- u32 addr;
- CsrResult r = CSR_RESULT_SUCCESS;
-
- if (!paddr)
- {
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
- *paddr = 0;
- space = UNIFI_GP_SPACE(generic_addr);
- addr = UNIFI_GP_OFFSET(generic_addr);
- switch (space)
- {
- case UNIFI_SH_DMEM:
- /* Shared Data Memory is accessed via the Shared Data Memory window */
- r = set_dmem_page(card, addr, paddr);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
- break;
-
- case UNIFI_EXT_FLASH:
- if (!ChipHelper_HasFlash(card->helper))
- {
- unifi_error(card->ospriv, "Bad address space for chip in generic pointer 0x%08lX (helper=0x%x)\n",
- generic_addr, card->helper);
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
- /* External FLASH is accessed via the Program Memory window */
- r = set_pmem_page(card, addr, CHIP_HELPER_WT_FLASH, paddr);
- break;
-
- case UNIFI_EXT_SRAM:
- if (!ChipHelper_HasExtSram(card->helper))
- {
- unifi_error(card->ospriv, "Bad address space for chip in generic pointer 0x%08l (helper=0x%x)\n",
- generic_addr, card->helper);
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
- /* External SRAM is accessed via the Program Memory window */
- r = set_pmem_page(card, addr, CHIP_HELPER_WT_EXT_SRAM, paddr);
- break;
-
- case UNIFI_REGISTERS:
- /* Registers are accessed directly */
- *paddr = addr;
- break;
-
- case UNIFI_PHY_DMEM:
- r = unifi_set_proc_select(card, UNIFI_PROC_PHY);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
- *paddr = ChipHelper_DATA_MEMORY_RAM_OFFSET(card->helper) * 2 + addr;
- break;
-
- case UNIFI_MAC_DMEM:
- r = unifi_set_proc_select(card, UNIFI_PROC_MAC);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
- *paddr = ChipHelper_DATA_MEMORY_RAM_OFFSET(card->helper) * 2 + addr;
- break;
-
- case UNIFI_BT_DMEM:
- if (!ChipHelper_HasBt(card->helper))
- {
- unifi_error(card->ospriv, "Bad address space for chip in generic pointer 0x%08lX (helper=0x%x)\n",
- generic_addr, card->helper);
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
- r = unifi_set_proc_select(card, UNIFI_PROC_BT);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
- *paddr = ChipHelper_DATA_MEMORY_RAM_OFFSET(card->helper) * 2 + addr;
- break;
-
- case UNIFI_PHY_PMEM:
- r = unifi_set_proc_select(card, UNIFI_PROC_PHY);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
- r = set_pmem_page(card, addr, CHIP_HELPER_WT_CODE_RAM, paddr);
- break;
-
- case UNIFI_MAC_PMEM:
- r = unifi_set_proc_select(card, UNIFI_PROC_MAC);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
- r = set_pmem_page(card, addr, CHIP_HELPER_WT_CODE_RAM, paddr);
- break;
-
- case UNIFI_BT_PMEM:
- if (!ChipHelper_HasBt(card->helper))
- {
- unifi_error(card->ospriv, "Bad address space for chip in generic pointer 0x%08lX (helper=0x%x)\n",
- generic_addr, card->helper);
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
- r = unifi_set_proc_select(card, UNIFI_PROC_BT);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
- r = set_pmem_page(card, addr, CHIP_HELPER_WT_CODE_RAM, paddr);
- break;
-
- case UNIFI_PHY_ROM:
- if (!ChipHelper_HasRom(card->helper))
- {
- unifi_error(card->ospriv, "Bad address space for chip in generic pointer 0x%08lX (helper=0x%x)\n",
- generic_addr, card->helper);
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
- r = unifi_set_proc_select(card, UNIFI_PROC_PHY);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
- r = set_pmem_page(card, addr, CHIP_HELPER_WT_ROM, paddr);
- break;
-
- case UNIFI_MAC_ROM:
- if (!ChipHelper_HasRom(card->helper))
- {
- unifi_error(card->ospriv, "Bad address space for chip in generic pointer 0x%08lX (helper=0x%x)\n",
- generic_addr, card->helper);
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
- r = unifi_set_proc_select(card, UNIFI_PROC_MAC);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
- r = set_pmem_page(card, addr, CHIP_HELPER_WT_ROM, paddr);
- break;
-
- case UNIFI_BT_ROM:
- if (!ChipHelper_HasRom(card->helper) || !ChipHelper_HasBt(card->helper))
- {
- unifi_error(card->ospriv, "Bad address space for chip in generic pointer 0x%08lX (helper=0x%x)\n",
- generic_addr, card->helper);
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
- r = unifi_set_proc_select(card, UNIFI_PROC_BT);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
- r = set_pmem_page(card, addr, CHIP_HELPER_WT_ROM, paddr);
- break;
-
- default:
- unifi_error(card->ospriv, "Bad address space %d in generic pointer 0x%08lX (helper=0x%x)\n",
- space, generic_addr, card->helper);
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- return r;
-} /* set_page() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_set_proc_select
- *
- *
- * Arguments:
- * card Pointer to card structure.
- * select Which XAP core to select
- *
- * Returns:
- * 0 on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_set_proc_select(card_t *card, enum unifi_dbg_processors_select select)
-{
- CsrResult r;
-
- /* Verify the the select value is allowed. */
- switch (select)
- {
- case UNIFI_PROC_MAC:
- case UNIFI_PROC_PHY:
- case UNIFI_PROC_BOTH:
- break;
-
-
- default:
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- if (card->proc_select != (u32)select)
- {
- r = unifi_write_direct16(card,
- ChipHelper_DBG_HOST_PROC_SELECT(card->helper) * 2,
- (u8)select);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to write to Proc Select register\n");
- return r;
- }
-
- card->proc_select = (u32)select;
- }
-
- return CSR_RESULT_SUCCESS;
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_read_8_or_16
- *
- * Performs a byte read of the given address in shared data memory.
- * Set up the shared data memory page register as required.
- *
- * Arguments:
- * card Pointer to card structure.
- * unifi_addr UniFi shared-data-memory address to access.
- * pdata Pointer to a byte variable for the value read.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE a bad generic pointer was specified
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_read_8_or_16(card_t *card, u32 unifi_addr, u8 *pdata)
-{
- u32 sdio_addr;
- CsrResult r;
-#ifdef CSR_WIFI_TRANSPORT_CSPI
- u16 w;
-#endif
-
- r = set_page(card, unifi_addr, &sdio_addr);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- card->cmd_prof.cmd52_r8or16_count++;
-#endif
-#ifdef CSR_WIFI_TRANSPORT_CSPI
- r = retrying_read16(card, card->function, sdio_addr, &w);
- *pdata = (u8)(w & 0xFF);
- return r;
-#else
- return retrying_read8(card, card->function, sdio_addr, pdata);
-#endif
-} /* unifi_read_8_or_16() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_write_8_or_16
- *
- * Performs a byte write of the given address in shared data memory.
- * Set up the shared data memory page register as required.
- *
- * Arguments:
- * card Pointer to card context struct.
- * unifi_addr UniFi shared-data-memory address to access.
- * data Value to write.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE a bad generic pointer was specified
- *
- * Notes:
- * Beware using unifi_write8() because byte writes are not safe on UniFi.
- * Writes to odd bytes are cached, writes to even bytes perform a 16-bit
- * write with the previously cached odd byte.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_write_8_or_16(card_t *card, u32 unifi_addr, u8 data)
-{
- u32 sdio_addr;
- CsrResult r;
-#ifdef CSR_WIFI_TRANSPORT_CSPI
- u16 w;
-#endif
-
- r = set_page(card, unifi_addr, &sdio_addr);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- if (sdio_addr & 1)
- {
- unifi_warning(card->ospriv,
- "Warning: Byte write to an odd address (0x%lX) is dangerous\n",
- sdio_addr);
- }
-
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- card->cmd_prof.cmd52_w8or16_count++;
-#endif
-#ifdef CSR_WIFI_TRANSPORT_CSPI
- w = data;
- return retrying_write16(card, card->function, sdio_addr, w);
-#else
- return retrying_write8(card, card->function, sdio_addr, data);
-#endif
-} /* unifi_write_8_or_16() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_card_read16
- *
- * Performs a 16-bit read of the given address in shared data memory.
- * Set up the shared data memory page register as required.
- *
- * Arguments:
- * card Pointer to card structure.
- * unifi_addr UniFi shared-data-memory address to access.
- * pdata Pointer to a 16-bit int variable for the value read.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE a bad generic pointer was specified
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_card_read16(card_t *card, u32 unifi_addr, u16 *pdata)
-{
- u32 sdio_addr;
- CsrResult r;
-
- r = set_page(card, unifi_addr, &sdio_addr);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- card->cmd_prof.cmd52_r16_count++;
-#endif
- return unifi_read_direct16(card, sdio_addr, pdata);
-} /* unifi_card_read16() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_card_write16
- *
- * Performs a 16-bit write of the given address in shared data memory.
- * Set up the shared data memory page register as required.
- *
- * Arguments:
- * card Pointer to card structure.
- * unifi_addr UniFi shared-data-memory address to access.
- * pdata Pointer to a byte variable for the value write.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE a bad generic pointer was specified
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_card_write16(card_t *card, u32 unifi_addr, u16 data)
-{
- u32 sdio_addr;
- CsrResult r;
-
- r = set_page(card, unifi_addr, &sdio_addr);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- card->cmd_prof.cmd52_w16_count++;
-#endif
- return unifi_write_direct16(card, sdio_addr, data);
-} /* unifi_card_write16() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_read32
- *
- * Performs a 32-bit read of the given address in shared data memory.
- * Set up the shared data memory page register as required.
- *
- * Arguments:
- * card Pointer to card structure.
- * unifi_addr UniFi shared-data-memory address to access.
- * pdata Pointer to a int variable for the value read.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE a bad generic pointer was specified
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_read32(card_t *card, u32 unifi_addr, u32 *pdata)
-{
- u32 sdio_addr;
- CsrResult r;
-
- r = set_page(card, unifi_addr, &sdio_addr);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- card->cmd_prof.cmd52_r32_count++;
-#endif
- return unifi_read_direct32(card, sdio_addr, pdata);
-} /* unifi_read32() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_card_readn
- * unifi_readnz
- *
- * Read multiple 8-bit values from the UniFi SDIO interface.
- * This function interprets the address as a GenericPointer as
- * defined in the UniFi Host Interface Protocol Specification.
- * The readnz version of this function will stop when it reads a
- * zero octet.
- *
- * Arguments:
- * card Pointer to card structure.
- * unifi_addr UniFi shared-data-memory address to access.
- * pdata Pointer to which to write data.
- * len Number of bytes to read
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE a bad generic pointer was specified
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_readn_match(card_t *card, u32 unifi_addr, void *pdata, u16 len, s8 match)
-{
- u32 sdio_addr;
- CsrResult r;
- u32 num;
-
- r = set_page(card, unifi_addr, &sdio_addr);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- r = unifi_read_directn_match(card, sdio_addr, pdata, len, match, &num);
- return r;
-} /* unifi_readn_match() */
-
-
-CsrResult unifi_card_readn(card_t *card, u32 unifi_addr, void *pdata, u16 len)
-{
- return unifi_readn_match(card, unifi_addr, pdata, len, -1);
-} /* unifi_card_readn() */
-
-
-CsrResult unifi_readnz(card_t *card, u32 unifi_addr, void *pdata, u16 len)
-{
- return unifi_readn_match(card, unifi_addr, pdata, len, 0);
-} /* unifi_readnz() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_read_shared_count
- *
- * Read signal count locations, checking for an SDIO error. The
- * signal count locations only contain a valid number if the
- * highest bit isn't set.
- *
- * Arguments:
- * card Pointer to card context structure.
- * addr Shared-memory address to read.
- *
- * Returns:
- * Value read from memory (0-127) or -1 on error
- * ---------------------------------------------------------------------------
- */
-s32 unifi_read_shared_count(card_t *card, u32 addr)
-{
- u8 b;
- /* I've increased this count, because I have seen cases where
- * there were three reads in a row with the top bit set. I'm not
- * sure why this might have happened, but I can't see a problem
- * with increasing this limit. It's better to take a while to
- * recover than to fail. */
-#define SHARED_READ_RETRY_LIMIT 10
- s32 i;
-
- /*
- * Get the to-host-signals-written count.
- * The top-bit will be set if the firmware was in the process of
- * changing the value, in which case we read again.
- */
- /* Limit the number of repeats so we don't freeze */
- for (i = 0; i < SHARED_READ_RETRY_LIMIT; i++)
- {
- CsrResult r;
- r = unifi_read_8_or_16(card, addr, &b);
- if (r != CSR_RESULT_SUCCESS)
- {
- return -1;
- }
- if (!(b & 0x80))
- {
- /* There is a chance that the MSB may have contained invalid data
- * (overflow) at the time it was read. Therefore mask off the MSB.
- * This avoids a race between driver read and firmware write of the
- * word, the value we need is in the lower 8 bits anway.
- */
- return (s32)(b & 0xff);
- }
- }
-
- return -1; /* this function has changed in WMM mods */
-} /* unifi_read_shared_count() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_writen
- *
- * Write multiple 8-bit values to the UniFi SDIO interface using CMD52
- * This function interprets the address as a GenericPointer as
- * defined in the UniFi Host Interface Protocol Specification.
- *
- * Arguments:
- * card Pointer to card structure.
- * unifi_addr UniFi shared-data-memory address to access.
- * pdata Pointer to which to write data.
- * len Number of bytes to write
- *
- * Returns:
- * 0 on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE an odd length or length too big.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_writen(card_t *card, u32 unifi_addr, void *pdata, u16 len)
-{
- u32 sdio_addr;
- CsrResult r;
-
- r = set_page(card, unifi_addr, &sdio_addr);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- return unifi_write_directn(card, sdio_addr, pdata, len);
-} /* unifi_writen() */
-
-
-static CsrResult csr_sdio_block_rw(card_t *card, s16 funcnum,
- u32 addr, u8 *pdata,
- u16 count, s16 dir_is_write)
-{
- CsrResult csrResult;
-
- if (dir_is_write == UNIFI_SDIO_READ)
- {
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- unifi_debug_log_to_buf("r@%02X#%X=", addr, count);
-#endif
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- unifi_debug_log_to_buf("R");
-#endif
- csrResult = CsrSdioRead(card->sdio_if, addr, pdata, count);
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- unifi_debug_log_to_buf("<");
-#endif
- }
- else
- {
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- unifi_debug_log_to_buf("w@%02X#%X=", addr, count);
- unifi_debug_hex_to_buf(pdata, count > CSR_WIFI_HIP_SDIO_TRACE_DATA_LENGTH?CSR_WIFI_HIP_SDIO_TRACE_DATA_LENGTH : count);
-#endif
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- unifi_debug_log_to_buf("W");
-#endif
- csrResult = CsrSdioWrite(card->sdio_if, addr, pdata, count);
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_DATA_PLANE_PROFILE)
- unifi_debug_log_to_buf(">");
-#endif
- }
-#ifdef CSR_WIFI_HIP_DATA_PLANE_PROFILE
- card->cmd_prof.cmd53_count++;
-#endif
-#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- unifi_debug_log_to_buf("error=%X", csrResult);
- }
- else if (dir_is_write == UNIFI_SDIO_READ)
- {
- unifi_debug_hex_to_buf(pdata, count > CSR_WIFI_HIP_SDIO_TRACE_DATA_LENGTH?CSR_WIFI_HIP_SDIO_TRACE_DATA_LENGTH : count);
- }
- unifi_debug_string_to_buf("\n");
-#endif
- return csrResult; /* CSR SDIO (not HIP) error code */
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_bulk_rw
- *
- * Transfer bulk data to or from the UniFi SDIO interface.
- * This function is used to read or write signals and bulk data.
- *
- * Arguments:
- * card Pointer to card structure.
- * handle Value to put in the Register Address field of the CMD53 req.
- * data Pointer to data to write.
- * direction One of UNIFI_SDIO_READ or UNIFI_SDIO_WRITE
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- *
- * Notes:
- * This function uses SDIO CMD53, which is the block transfer mode.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_bulk_rw(card_t *card, u32 handle, void *pdata,
- u32 len, s16 direction)
-{
-#define CMD53_RETRIES 3
- /*
- * Ideally instead of sleeping, we want to busy wait.
- * Currently there is no framework API to do this. When it becomes available,
- * we can use it to busy wait using usecs
- */
-#define REWIND_RETRIES 15 /* when REWIND_DELAY==1msec, or 250 when REWIND_DELAY==50usecs */
-#define REWIND_POLLING_RETRIES 5
-#define REWIND_DELAY 1 /* msec or 50usecs */
- CsrResult csrResult; /* SDIO error code */
- CsrResult r = CSR_RESULT_SUCCESS; /* HIP error code */
- s16 retries = CMD53_RETRIES;
- s16 stat_retries;
- u8 stat;
- s16 dump_read;
-#ifdef UNIFI_DEBUG
- u8 *pdata_lsb = ((u8 *)&pdata) + card->lsb;
-#endif
-#ifdef CSR_WIFI_MAKE_FAKE_CMD53_ERRORS
- static s16 fake_error;
-#endif
-
- dump_read = 0;
-#ifdef UNIFI_DEBUG
- if (*pdata_lsb & 1)
- {
- unifi_notice(card->ospriv, "CD53 request on a unaligned buffer (addr: 0x%X) dir %s-Host\n",
- pdata, (direction == UNIFI_SDIO_READ)?"To" : "From");
- if (direction == UNIFI_SDIO_WRITE)
- {
- dump(pdata, (u16)len);
- }
- else
- {
- dump_read = 1;
- }
- }
-#endif
-
- /* Defensive checks */
- if (!pdata)
- {
- unifi_error(card->ospriv, "Null pdata for unifi_bulk_rw() len: %d\n", len);
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
- if ((len & 1) || (len > 0xffff))
- {
- unifi_error(card->ospriv, "Impossible CMD53 length requested: %d\n", len);
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- while (1)
- {
- csrResult = csr_sdio_block_rw(card, card->function, handle,
- (u8 *)pdata, (u16)len,
- direction);
- if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
- {
- return CSR_WIFI_HIP_RESULT_NO_DEVICE;
- }
-#ifdef CSR_WIFI_MAKE_FAKE_CMD53_ERRORS
- if (++fake_error > 100)
- {
- fake_error = 90;
- unifi_warning(card->ospriv, "Faking a CMD53 error,\n");
- if (csrResult == CSR_RESULT_SUCCESS)
- {
- csrResult = CSR_RESULT_FAILURE;
- }
- }
-#endif
- if (csrResult == CSR_RESULT_SUCCESS)
- {
- if (dump_read)
- {
- dump(pdata, (u16)len);
- }
- break;
- }
-
- /*
- * At this point the SDIO driver should have written the I/O Abort
- * register to notify UniFi that the command has failed.
- * UniFi-1 and UniFi-2 (not UF6xxx) use the same register to store the
- * Deep Sleep State. This means we have to restore the Deep Sleep
- * State (AWAKE in any case since we can not perform a CD53 in any other
- * state) by rewriting the I/O Abort register to its previous value.
- */
- if (card->chip_id <= SDIO_CARD_ID_UNIFI_2)
- {
- (void)unifi_set_host_state(card, UNIFI_HOST_STATE_AWAKE);
- }
-
- /* If csr_sdio_block_rw() failed in a non-retryable way, or retries exhausted
- * then stop retrying
- */
- if (!retryable_sdio_error(csrResult))
- {
- unifi_error(card->ospriv, "Fatal error in a CMD53 transfer\n");
- break;
- }
-
- /*
- * These happen from time to time, try again
- */
- if (--retries == 0)
- {
- break;
- }
-
- unifi_trace(card->ospriv, UDBG4,
- "Error in a CMD53 transfer, retrying (h:%d,l:%u)...\n",
- (s16)handle & 0xff, len);
-
- /* The transfer failed, rewind and try again */
- r = unifi_write_8_or_16(card, card->sdio_ctrl_addr + 8,
- (u8)(handle & 0xff));
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- /*
- * If we can't even do CMD52 (register read/write) then
- * stop here.
- */
- unifi_error(card->ospriv, "Failed to write REWIND cmd\n");
- return r;
- }
-
- /* Signal the UniFi to look for the rewind request. */
- r = CardGenInt(card);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- /* Wait for UniFi to acknowledge the rewind */
- stat_retries = REWIND_RETRIES;
- while (1)
- {
- r = unifi_read_8_or_16(card, card->sdio_ctrl_addr + 8, &stat);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read REWIND status\n");
- return CSR_RESULT_FAILURE;
- }
-
- if (stat == 0)
- {
- break;
- }
- if (--stat_retries == 0)
- {
- unifi_error(card->ospriv, "Timeout waiting for REWIND ready\n");
- return CSR_RESULT_FAILURE;
- }
-
- /* Poll for the ack a few times */
- if (stat_retries < REWIND_RETRIES - REWIND_POLLING_RETRIES)
- {
- CsrThreadSleep(REWIND_DELAY);
- }
- }
- }
-
- /* The call to csr_sdio_block_rw() still failed after retrying */
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Block %s failed after %d retries\n",
- (direction == UNIFI_SDIO_READ)?"read" : "write",
- CMD53_RETRIES - retries);
- /* Report any SDIO error as a general i/o error */
- return CSR_RESULT_FAILURE;
- }
-
- /* Collect some stats */
- if (direction == UNIFI_SDIO_READ)
- {
- card->sdio_bytes_read += len;
- }
- else
- {
- card->sdio_bytes_written += len;
- }
-
- return CSR_RESULT_SUCCESS;
-} /* unifi_bulk_rw() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_bulk_rw_noretry
- *
- * Transfer bulk data to or from the UniFi SDIO interface.
- * This function is used to read or write signals and bulk data.
- *
- * Arguments:
- * card Pointer to card structure.
- * handle Value to put in the Register Address field of
- * the CMD53 req.
- * data Pointer to data to write.
- * direction One of UNIFI_SDIO_READ or UNIFI_SDIO_WRITE
- *
- * Returns:
- * 0 on success, non-zero error code on error:
- * CSR_WIFI_HIP_RESULT_NO_DEVICE card was ejected
- * CSR_RESULT_FAILURE an SDIO error occurred
- *
- * Notes:
- * This function uses SDIO CMD53, which is the block transfer mode.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_bulk_rw_noretry(card_t *card, u32 handle, void *pdata,
- u32 len, s16 direction)
-{
- CsrResult csrResult;
-
- csrResult = csr_sdio_block_rw(card, card->function, handle,
- (u8 *)pdata, (u16)len, direction);
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Block %s failed\n",
- (direction == UNIFI_SDIO_READ)?"read" : "write");
- return csrResult;
- }
-
- return CSR_RESULT_SUCCESS;
-} /* unifi_bulk_rw_noretry() */
-
-
diff --git a/drivers/staging/csr/csr_wifi_hip_chiphelper.c b/drivers/staging/csr/csr_wifi_hip_chiphelper.c
deleted file mode 100644
index 5cf5b8a5a1e1..000000000000
--- a/drivers/staging/csr/csr_wifi_hip_chiphelper.c
+++ /dev/null
@@ -1,793 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2011
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#include "csr_macro.h"
-#include "csr_wifi_hip_chiphelper_private.h"
-
-#ifndef nelem
-#define nelem(a) (sizeof(a) / sizeof(a[0]))
-#endif
-
-#define counted(foo) { nelem(foo), foo }
-#define null_counted() { 0, NULL }
-
-/* The init values are a set of register writes that we must
- perform when we first connect to the chip to get it working.
- They swicth on the correct clocks and possibly set the host
- interface as a wkaeup source. They should not be used if
- proper HIP opperation is required, but are useful before we
- do a code download. */
-static const struct chip_helper_init_values init_vals_v1[] = {
- { 0xFDBB, 0xFFFF },
- { 0xFDB6, 0x03FF },
- { 0xFDB1, 0x01E3 },
- { 0xFDB3, 0x0FFF },
- { 0xFEE3, 0x08F0 },
- { 0xFEE7, 0x3C3F },
- { 0xFEE6, 0x0050 },
- { 0xFDBA, 0x0000 }
-};
-
-static const struct chip_helper_init_values init_vals_v2[] = {
- { 0xFDB6, 0x0FFF },
- { 0xF023, 0x3F3F },
- { 0xFDB1, 0x01E3 },
- { 0xFDB3, 0x0FFF },
- { 0xF003, 0x08F0 },
- { 0xF007, 0x3C3F },
- { 0xF006, 0x0050 }
-};
-
-
-static const struct chip_helper_init_values init_vals_v22_v23[] = {
- { 0xF81C, 0x00FF },
- /*{ 0x????, 0x???? }, */
- { 0xF80C, 0x1FFF },
- { 0xFA25, 0x001F },
- { 0xF804, 0x00FF },
- { 0xF802, 0x0FFF },
- /*{ 0x????, 0x???? },
- { 0x????, 0x???? },
- { 0x????, 0x???? }*/
-};
-
-static const u16 reset_program_a_v1_or_v2[] = {
- 0x0000
-};
-static const u16 reset_program_b_v1_or_v2[] = {
- 0x0010, 0xFE00, 0xA021, 0xFF00, 0x8111, 0x0009, 0x0CA4, 0x0114,
- 0x0280, 0x04F8, 0xFE00, 0x6F25, 0x06E0, 0x0010, 0xFC00, 0x0121,
- 0xFC00, 0x0225, 0xFE00, 0x7125, 0xFE00, 0x6D11, 0x03F0, 0xFE00,
- 0x6E25, 0x0008, 0x00E0
-};
-
-static const struct chip_helper_reset_values reset_program_v1_or_v2[] =
-{
- {
- MAKE_GP(REGISTERS, 0x000C),
- nelem(reset_program_a_v1_or_v2),
- reset_program_a_v1_or_v2
- },
- {
- MAKE_GP(MAC_PMEM, 0x000000),
- nelem(reset_program_b_v1_or_v2),
- reset_program_b_v1_or_v2
- }
-};
-
-static const struct chip_map_address_t unifi_map_address_v1_v2[] =
-{
- { 0xFE9F, 0xFE7B }, /* PM1_BANK_SELECT */
- { 0xFE9E, 0xFE78 }, /* PM2_BANK_SELECT */
- { 0xFE9D, 0xFE7E }, /* SHARED_DMEM_PAGE */
- { 0xFE91, 0xFE90 }, /* PROC_SELECT */
- { 0xFE8D, 0xFE8C }, /* STOP_STATUS */
-};
-
-static const struct chip_map_address_t unifi_map_address_v22_v23[] =
-{
- { 0xF8F9, 0xF8AC }, /* GW1_CONFIG */
- { 0xF8FA, 0xF8AD }, /* GW2_CONFIG */
- { 0xF8FB, 0xF8AE }, /* GW3_CONFIG */
- { 0xF830, 0xF81E }, /* PROC_SELECT */
- { 0xF831, 0xF81F }, /* STOP_STATUS */
- { 0xF8FC, 0xF8AF }, /* IO_LOG_ADDRESS */
-};
-
-static const struct chip_device_regs_t unifi_device_regs_null =
-{
- 0xFE81, /* GBL_CHIP_VERSION */
- 0x0000, /* GBL_MISC_ENABLES */
- 0x0000, /* DBG_EMU_CMD */
- {
- 0x0000, /* HOST.DBG_PROC_SELECT */
- 0x0000, /* HOST.DBG_STOP_STATUS */
- 0x0000, /* HOST.WINDOW1_PAGE */
- 0x0000, /* HOST.WINDOW2_PAGE */
- 0x0000, /* HOST.WINDOW3_PAGE */
- 0x0000 /* HOST.IO_LOG_ADDR */
- },
- {
- 0x0000, /* SPI.DBG_PROC_SELECT */
- 0x0000, /* SPI.DBG_STOP_STATUS */
- 0x0000, /* SPI.WINDOW1_PAGE */
- 0x0000, /* SPI.WINDOW2_PAGE */
- 0x0000, /* SPI.WINDOW3_PAGE */
- 0x0000 /* SPI.IO_LOG_ADDR */
- },
- 0x0000, /* DBG_RESET */
- 0x0000, /* > DBG_RESET_VALUE */
- 0x0000, /* DBG_RESET_WARN */
- 0x0000, /* DBG_RESET_WARN_VALUE */
- 0x0000, /* DBG_RESET_RESULT */
- 0xFFE9, /* XAP_PCH */
- 0xFFEA, /* XAP_PCL */
- 0x0000, /* PROC_PC_SNOOP */
- 0x0000, /* WATCHDOG_DISABLE */
- 0x0000, /* MAILBOX0 */
- 0x0000, /* MAILBOX1 */
- 0x0000, /* MAILBOX2 */
- 0x0000, /* MAILBOX3 */
- 0x0000, /* SDIO_HOST_INT */
- 0x0000, /* SHARED_IO_INTERRUPT */
- 0x0000, /* SDIO HIP HANDSHAKE */
- 0x0000 /* COEX_STATUS */
-};
-
-/* UF105x */
-static const struct chip_device_regs_t unifi_device_regs_v1 =
-{
- 0xFE81, /* GBL_CHIP_VERSION */
- 0xFE87, /* GBL_MISC_ENABLES */
- 0xFE9C, /* DBG_EMU_CMD */
- {
- 0xFE90, /* HOST.DBG_PROC_SELECT */
- 0xFE8C, /* HOST.DBG_STOP_STATUS */
- 0xFE7B, /* HOST.WINDOW1_PAGE */
- 0xFE78, /* HOST.WINDOW2_PAGE */
- 0xFE7E, /* HOST.WINDOW3_PAGE */
- 0x0000 /* HOST.IO_LOG_ADDR */
- },
- {
- 0xFE91, /* SPI.DBG_PROC_SELECT */
- 0xFE8D, /* SPI.DBG_STOP_STATUS */
- 0xFE9F, /* SPI.WINDOW1_PAGE */
- 0xFE9E, /* SPI.WINDOW2_PAGE */
- 0xFE9D, /* SPI.WINDOW3_PAGE */
- 0x0000 /* SPI.IO_LOG_ADDR */
- },
- 0xFE92, /* DBG_RESET */
- 0x0001, /* > DBG_RESET_VALUE */
- 0xFDA0, /* DBG_RESET_WARN (HOST_SELECT) */
- 0x0000, /* DBG_RESET_WARN_VALUE */
- 0xFE92, /* DBG_RESET_RESULT */
- 0xFFE9, /* XAP_PCH */
- 0xFFEA, /* XAP_PCL */
- 0x0051, /* PROC_PC_SNOOP */
- 0xFE70, /* WATCHDOG_DISABLE */
- 0xFE6B, /* MAILBOX0 */
- 0xFE6A, /* MAILBOX1 */
- 0xFE69, /* MAILBOX2 */
- 0xFE68, /* MAILBOX3 */
- 0xFE67, /* SDIO_HOST_INT */
- 0xFE65, /* SHARED_IO_INTERRUPT */
- 0xFDE9, /* SDIO HIP HANDSHAKE */
- 0x0000 /* COEX_STATUS */
-};
-
-/* UF2... */
-static const struct chip_device_regs_t unifi_device_regs_v2 =
-{
- 0xFE81, /* GBL_CHIP_VERSION */
- 0xFE87, /* GBL_MISC_ENABLES */
- 0xFE9C, /* DBG_EMU_CMD */
- {
- 0xFE90, /* HOST.DBG_PROC_SELECT */
- 0xFE8C, /* HOST.DBG_STOP_STATUS */
- 0xFE7B, /* HOST.WINDOW1_PAGE */
- 0xFE78, /* HOST.WINDOW2_PAGE */
- 0xFE7E, /* HOST.WINDOW3_PAGE */
- 0x0000 /* HOST.IO_LOG_ADDR */
- },
- {
- 0xFE91, /* SPI.DBG_PROC_SELECT */
- 0xFE8D, /* SPI.DBG_STOP_STATUS */
- 0xFE9F, /* SPI.WINDOW1_PAGE */
- 0xFE9E, /* SPI.WINDOW2_PAGE */
- 0xFE9D, /* SPI.WINDOW3_PAGE */
- 0x0000 /* SPI.IO_LOG_ADDR */
- },
- 0xFE92, /* DBG_RESET */
- 0x0000, /* > DBG_RESET_VALUE */
- 0xFDE9, /* DBG_RESET_WARN (TEST_FLASH_DATA - SHARED_MAILBOX2B) */
- 0xFFFF, /* DBG_RESET_WARN_VALUE */
- 0xFDE9, /* DBG_RESET_RESULT (TEST_FLASH_DATA) */
- 0xFFE9, /* XAP_PCH */
- 0xFFEA, /* XAP_PCL */
- 0x0051, /* PROC_PC_SNOOP */
- 0xFE70, /* WATCHDOG_DISABLE */
- 0xFE6B, /* MAILBOX0 */
- 0xFE6A, /* MAILBOX1 */
- 0xFE69, /* MAILBOX2 */
- 0xFE68, /* MAILBOX3 */
- 0xFE67, /* SDIO_HOST_INT */
- 0xFE65, /* SHARED_IO_INTERRUPT */
- 0xFE69, /* SDIO HIP HANDSHAKE */
- 0x0000 /* COEX_STATUS */
-};
-
-/* UF60xx */
-static const struct chip_device_regs_t unifi_device_regs_v22_v23 =
-{
- 0xFE81, /* GBL_CHIP_VERSION */
- 0xF84F, /* GBL_MISC_ENABLES */
- 0xF81D, /* DBG_EMU_CMD */
- {
- 0xF81E, /* HOST.DBG_PROC_SELECT */
- 0xF81F, /* HOST.DBG_STOP_STATUS */
- 0xF8AC, /* HOST.WINDOW1_PAGE */
- 0xF8AD, /* HOST.WINDOW2_PAGE */
- 0xF8AE, /* HOST.WINDOW3_PAGE */
- 0xF8AF /* HOST.IO_LOG_ADDR */
- },
- {
- 0xF830, /* SPI.DBG_PROC_SELECT */
- 0xF831, /* SPI.DBG_STOP_STATUS */
- 0xF8F9, /* SPI.WINDOW1_PAGE */
- 0xF8FA, /* SPI.WINDOW2_PAGE */
- 0xF8FB, /* SPI.WINDOW3_PAGE */
- 0xF8FC /* SPI.IO_LOG_ADDR */
- },
- 0xF82F, /* DBG_RESET */
- 0x0001, /* > DBG_RESET_VALUE */
- 0x0000, /* DBG_RESET_WARN */
- 0x0000, /* DBG_RESET_WARN_VALUE */
- 0xF82F, /* DBG_RESET_RESULT */
- 0xFFE9, /* XAP_PCH */
- 0xFFEA, /* XAP_PCL */
- 0x001B, /* PROC_PC_SNOOP */
- 0x0055, /* WATCHDOG_DISABLE */
- 0xF84B, /* MAILBOX0 */
- 0xF84C, /* MAILBOX1 */
- 0xF84D, /* MAILBOX2 */
- 0xF84E, /* MAILBOX3 */
- 0xF92F, /* SDIO_HOST_INT */
- 0xF92B, /* SDIO_FROMHOST_SCRTACH0 / SHARED_IO_INTERRUPT */
- 0xF84D, /* SDIO HIP HANDSHAKE (MAILBOX2) */
- 0xF9FB /* COEX_STATUS */
-};
-
-/* Program memory window on UF105x. */
-static const struct window_shift_info_t prog_window_array_unifi_v1_v2[CHIP_HELPER_WT_COUNT] =
-{
- { TRUE, 11, 0x0200 }, /* CODE RAM */
- { TRUE, 11, 0x0000 }, /* FLASH */
- { TRUE, 11, 0x0400 }, /* External SRAM */
- { FALSE, 0, 0 }, /* ROM */
- { FALSE, 0, 0 } /* SHARED */
-};
-
-/* Shared memory window on UF105x. */
-static const struct window_shift_info_t shared_window_array_unifi_v1_v2[CHIP_HELPER_WT_COUNT] =
-{
- { FALSE, 0, 0 }, /* CODE RAM */
- { FALSE, 0, 0 }, /* FLASH */
- { FALSE, 0, 0 }, /* External SRAM */
- { FALSE, 0, 0 }, /* ROM */
- { TRUE, 11, 0x0000 } /* SHARED */
-};
-
-/* One of the Generic Windows on UF60xx and later. */
-static const struct window_shift_info_t generic_window_array_unifi_v22_v23[CHIP_HELPER_WT_COUNT] =
-{
- { TRUE, 11, 0x3800 }, /* CODE RAM */
- { FALSE, 0, 0 }, /* FLASH */
- { FALSE, 0, 0 }, /* External SRAM */
- { TRUE, 11, 0x2000 }, /* ROM */
- { TRUE, 11, 0x0000 } /* SHARED */
-};
-
-/* The three windows on UF105x. */
-static const struct window_info_t prog1_window_unifi_v1_v2 = { 0x0000, 0x2000, 0x0080, prog_window_array_unifi_v1_v2 };
-static const struct window_info_t prog2_window_unifi_v1_v2 = { 0x2000, 0x2000, 0x0000, prog_window_array_unifi_v1_v2 };
-static const struct window_info_t shared_window_unifi_v1_v2 = { 0x4000, 0x2000, 0x0000, shared_window_array_unifi_v1_v2 };
-
-/* The three windows on UF60xx and later. */
-static const struct window_info_t generic1_window_unifi_v22_v23 = { 0x0000, 0x2000, 0x0080, generic_window_array_unifi_v22_v23 };
-static const struct window_info_t generic2_window_unifi_v22_v23 = { 0x2000, 0x2000, 0x0000, generic_window_array_unifi_v22_v23 };
-static const struct window_info_t generic3_window_unifi_v22_v23 = { 0x4000, 0x2000, 0x0000, generic_window_array_unifi_v22_v23 };
-
-static const struct chip_device_desc_t chip_device_desc_null =
-{
- { FALSE, 0x0000, 0x0000, 0x00 },
- "",
- "",
- null_counted(), /* init */
- null_counted(), /* reset_prog */
- &unifi_device_regs_null, /* regs */
- {
- FALSE, /* has_flash */
- FALSE, /* has_ext_sram */
- FALSE, /* has_rom */
- FALSE, /* has_bt */
- FALSE, /* has_wlan */
- },
- null_counted(),
- /* prog_offset */
- {
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000
- },
- /* data_offset */
- {
- 0x0000 /* ram */
- },
- /* windows */
- {
- NULL,
- NULL,
- NULL
- }
-};
-
-static const struct chip_device_desc_t unifi_device_desc_v1 =
-{
- { FALSE, 0xf0ff, 0x1001, 0x01 }, /* UF105x R01 */
- "UF105x",
- "UniFi-1",
- counted(init_vals_v1), /* init */
- counted(reset_program_v1_or_v2), /* reset_prog */
- &unifi_device_regs_v1, /* regs */
- {
- TRUE, /* has_flash */
- TRUE, /* has_ext_sram */
- FALSE, /* has_rom */
- FALSE, /* has_bt */
- TRUE, /* has_wlan */
- },
- counted(unifi_map_address_v1_v2), /* map */
- /* prog_offset */
- {
- 0x00100000, /* ram */
- 0x00000000, /* rom (invalid) */
- 0x00000000, /* flash */
- 0x00200000, /* ext_ram */
- },
- /* data_offset */
- {
- 0x8000 /* ram */
- },
- /* windows */
- {
- &prog1_window_unifi_v1_v2,
- &prog2_window_unifi_v1_v2,
- &shared_window_unifi_v1_v2
- }
-};
-
-static const struct chip_device_desc_t unifi_device_desc_v2 =
-{
- { FALSE, 0xf0ff, 0x2001, 0x02 }, /* UF2... R02 */
- "UF2...",
- "UniFi-2",
- counted(init_vals_v2), /* init */
- counted(reset_program_v1_or_v2), /* reset_prog */
- &unifi_device_regs_v2, /* regs */
- {
- TRUE, /* has_flash */
- TRUE, /* has_ext_sram */
- FALSE, /* has_rom */
- FALSE, /* has_bt */
- TRUE, /* has_wlan */
- },
- counted(unifi_map_address_v1_v2), /* map */
- /* prog_offset */
- {
- 0x00100000, /* ram */
- 0x00000000, /* rom (invalid) */
- 0x00000000, /* flash */
- 0x00200000, /* ext_ram */
- },
- /* data_offset */
- {
- 0x8000 /* ram */
- },
- /* windows */
- {
- &prog1_window_unifi_v1_v2,
- &prog2_window_unifi_v1_v2,
- &shared_window_unifi_v1_v2
- }
-};
-
-static const struct chip_device_desc_t unifi_device_desc_v3 =
-{
- { FALSE, 0xf0ff, 0x3001, 0x02 }, /* UF2... R03 */
- "UF2...",
- "UniFi-3",
- counted(init_vals_v2), /* init */
- counted(reset_program_v1_or_v2), /* reset_prog */
- &unifi_device_regs_v2, /* regs */
- {
- TRUE, /* has_flash */
- TRUE, /* has_ext_sram */
- FALSE, /* has_rom */
- FALSE, /* has_bt */
- TRUE, /* has_wlan */
- },
- counted(unifi_map_address_v1_v2), /* map */
- /* prog_offset */
- {
- 0x00100000, /* ram */
- 0x00000000, /* rom (invalid) */
- 0x00000000, /* flash */
- 0x00200000, /* ext_ram */
- },
- /* data_offset */
- {
- 0x8000 /* ram */
- },
- /* windows */
- {
- &prog1_window_unifi_v1_v2,
- &prog2_window_unifi_v1_v2,
- &shared_window_unifi_v1_v2
- }
-};
-
-static const struct chip_device_desc_t unifi_device_desc_v22 =
-{
- { FALSE, 0x00ff, 0x0022, 0x07 }, /* UF60xx */
- "UF60xx",
- "UniFi-4",
- counted(init_vals_v22_v23), /* init */
- null_counted(), /* reset_prog */
- &unifi_device_regs_v22_v23, /* regs */
- {
- FALSE, /* has_flash */
- FALSE, /* has_ext_sram */
- TRUE, /* has_rom */
- FALSE, /* has_bt */
- TRUE, /* has_wlan */
- },
- counted(unifi_map_address_v22_v23), /* map */
- /* prog_offset */
- {
- 0x00C00000, /* ram */
- 0x00000000, /* rom */
- 0x00000000, /* flash (invalid) */
- 0x00000000, /* ext_ram (invalid) */
- },
- /* data_offset */
- {
- 0x8000 /* ram */
- },
- /* windows */
- {
- &generic1_window_unifi_v22_v23,
- &generic2_window_unifi_v22_v23,
- &generic3_window_unifi_v22_v23
- }
-};
-
-static const struct chip_device_desc_t unifi_device_desc_v23 =
-{
- { FALSE, 0x00ff, 0x0023, 0x08 }, /* UF.... */
- "UF....",
- "UF.... (5)",
- counted(init_vals_v22_v23), /* init */
- null_counted(), /* reset_prog */
- &unifi_device_regs_v22_v23, /* regs */
- {
- FALSE, /* has_flash */
- FALSE, /* has_ext_sram */
- TRUE, /* has_rom */
- TRUE, /* has_bt */
- TRUE, /* has_wlan */
- },
- counted(unifi_map_address_v22_v23),
- /* prog_offset */
- {
- 0x00C00000, /* ram */
- 0x00000000, /* rom */
- 0x00000000, /* flash (invalid) */
- 0x00000000, /* ext_sram (invalid) */
- },
- /* data_offset */
- {
- 0x8000 /* ram */
- },
- /* windows */
- {
- &generic1_window_unifi_v22_v23,
- &generic2_window_unifi_v22_v23,
- &generic3_window_unifi_v22_v23
- }
-};
-
-static const struct chip_device_desc_t hyd_wlan_subsys_desc_v1 =
-{
- { FALSE, 0x00ff, 0x0044, 0x00 }, /* UF.... */
- "HYD...",
- "HYD... ",
- counted(init_vals_v22_v23), /* init */
- null_counted(), /* reset_prog */
- &unifi_device_regs_v22_v23, /* regs */
- {
- FALSE, /* has_flash */
- FALSE, /* has_ext_sram */
- TRUE, /* has_rom */
- FALSE, /* has_bt */
- TRUE, /* has_wlan */
- },
- counted(unifi_map_address_v22_v23),
- /* prog_offset */
- {
- 0x00C00000, /* ram */
- 0x00000000, /* rom */
- 0x00000000, /* flash (invalid) */
- 0x00000000, /* ext_sram (invalid) */
- },
- /* data_offset */
- {
- 0x8000 /* ram */
- },
- /* windows */
- {
- &generic1_window_unifi_v22_v23,
- &generic2_window_unifi_v22_v23,
- &generic3_window_unifi_v22_v23
- }
-};
-
-
-/* This is the list of all chips that we know about. I'm
- assuming that the order here will be important - we
- might have multiple entries witrh the same SDIO id for
- instance. The first one in this list will be the one
- that is returned if a search is done on only that id.
- The client will then have to call GetVersionXXX again
- but with more detailed info.
-
- I don't know if we need to signal this up to the client
- in some way?
-
- (We get the SDIO id before we know anything else about
- the chip. We might not be able to read any of the other
- registers at first, but we still need to know about the
- chip). */
-static const struct chip_device_desc_t *chip_ver_to_desc[] =
-{
- &unifi_device_desc_v1, /* UF105x R01 */
- &unifi_device_desc_v2, /* UF2... R02 */
- &unifi_device_desc_v3, /* UF2... R03 */
- &unifi_device_desc_v22, /* UF60xx */
- &unifi_device_desc_v23, /* UF.... */
- &hyd_wlan_subsys_desc_v1
-};
-
-ChipDescript* ChipHelper_GetVersionSdio(u8 sdio_ver)
-{
- u32 i;
-
- for (i = 0; i < nelem(chip_ver_to_desc); i++)
- {
- if (chip_ver_to_desc[i]->chip_version.sdio == sdio_ver)
- {
- return chip_ver_to_desc[i];
- }
- }
-
- return &chip_device_desc_null;
-}
-
-
-ChipDescript* ChipHelper_GetVersionAny(u16 from_FF9A, u16 from_FE81)
-{
- u32 i;
-
- if ((from_FF9A & 0xFF00) != 0)
- {
- for (i = 0; i < nelem(chip_ver_to_desc); i++)
- {
- if (chip_ver_to_desc[i]->chip_version.pre_bc7 &&
- ((from_FF9A & chip_ver_to_desc[i]->chip_version.mask) ==
- chip_ver_to_desc[i]->chip_version.result))
- {
- return chip_ver_to_desc[i];
- }
- }
- }
- else
- {
- for (i = 0; i < nelem(chip_ver_to_desc); i++)
- {
- if (!chip_ver_to_desc[i]->chip_version.pre_bc7 &&
- ((from_FE81 & chip_ver_to_desc[i]->chip_version.mask) ==
- chip_ver_to_desc[i]->chip_version.result))
- {
- return chip_ver_to_desc[i];
- }
- }
- }
-
- return &chip_device_desc_null;
-}
-
-
-ChipDescript* ChipHelper_GetVersionUniFi(u16 ver)
-{
- return ChipHelper_GetVersionAny(0x0000, ver);
-}
-
-
-ChipDescript *ChipHelper_Null(void)
-{
- return &chip_device_desc_null;
-}
-
-
-ChipDescript* ChipHelper_GetVersionBlueCore(enum chip_helper_bluecore_age bc_age, u16 version)
-{
- if (bc_age == chip_helper_bluecore_pre_bc7)
- {
- return ChipHelper_GetVersionAny(version, 0x0000);
- }
- else
- {
- return ChipHelper_GetVersionAny(0x0000, version);
- }
-}
-
-
-/* Expand the DEF0 functions into simple code to return the
- correct thing. The DEF1 functions expand to nothing in
- this X macro expansion. */
-#define CHIP_HELPER_DEF0_C_DEF(ret_type, name, info) \
- ret_type ChipHelper_ ## name(ChipDescript * chip_help) \
- { \
- return chip_help->info; \
- }
-#define CHIP_HELPER_DEF1_C_DEF(ret_type, name, type1, name1)
-
-CHIP_HELPER_LIST(C_DEF)
-
-/*
- * Map register addresses between HOST and SPI access.
- */
-u16 ChipHelper_MapAddress_SPI2HOST(ChipDescript *chip_help, u16 addr)
-{
- u32 i;
- for (i = 0; i < chip_help->map.len; i++)
- {
- if (chip_help->map.vals[i].spi == addr)
- {
- return chip_help->map.vals[i].host;
- }
- }
- return addr;
-}
-
-
-u16 ChipHelper_MapAddress_HOST2SPI(ChipDescript *chip_help, u16 addr)
-{
- u32 i;
- for (i = 0; i < chip_help->map.len; i++)
- {
- if (chip_help->map.vals[i].host == addr)
- {
- return chip_help->map.vals[i].spi;
- }
- }
- return addr;
-}
-
-
-/* The address returned by this function is the start of the
- window in the address space, that is where we can start
- accessing data from. If a section of the window at the
- start is unusable because something else is cluttering up
- the address map then that is taken into account and this
- function returns that address justt past that. */
-u16 ChipHelper_WINDOW_ADDRESS(ChipDescript *chip_help,
- enum chip_helper_window_index window)
-{
- if (window < CHIP_HELPER_WINDOW_COUNT &&
- chip_help->windows[window] != NULL)
- {
- return chip_help->windows[window]->address + chip_help->windows[window]->blocked;
- }
- return 0;
-}
-
-
-/* This returns the size of the window minus any blocked section */
-u16 ChipHelper_WINDOW_SIZE(ChipDescript *chip_help,
- enum chip_helper_window_index window)
-{
- if (window < CHIP_HELPER_WINDOW_COUNT &&
- chip_help->windows[window] != NULL)
- {
- return chip_help->windows[window]->size - chip_help->windows[window]->blocked;
- }
- return 0;
-}
-
-
-/* Get the register writes we should do to make sure that
- the chip is running with most clocks on. */
-u32 ChipHelper_ClockStartupSequence(ChipDescript *chip_help,
- const struct chip_helper_init_values **val)
-{
- *val = chip_help->init.vals;
- return chip_help->init.len;
-}
-
-
-/* Get the set of values tat we should write to the chip to perform a reset. */
-u32 ChipHelper_HostResetSequence(ChipDescript *chip_help,
- const struct chip_helper_reset_values **val)
-{
- *val = chip_help->reset_prog.vals;
- return chip_help->reset_prog.len;
-}
-
-
-/* Decode a windowed access to the chip. */
-s32 ChipHelper_DecodeWindow(ChipDescript *chip_help,
- enum chip_helper_window_index window,
- enum chip_helper_window_type type,
- u32 offset,
- u16 *page, u16 *addr, u32 *len)
-{
- const struct window_info_t *win;
- const struct window_shift_info_t *mode;
- u16 of, pg;
-
- if (window >= CHIP_HELPER_WINDOW_COUNT)
- {
- return FALSE;
- }
- if ((win = chip_help->windows[window]) == NULL)
- {
- return FALSE;
- }
- if (type >= CHIP_HELPER_WT_COUNT)
- {
- return FALSE;
- }
- if ((mode = &win->mode[type]) == NULL)
- {
- return FALSE;
- }
- if (!mode->allowed)
- {
- return FALSE;
- }
-
- pg = (u16)(offset >> mode->page_shift) + mode->page_offset;
- of = (u16)(offset & ((1 << mode->page_shift) - 1));
- /* If 'blocked' is zero this does nothing, else decrease
- the page register and increase the offset until we aren't
- in the blocked region of the window. */
- while (of < win->blocked)
- {
- of += 1 << mode->page_shift;
- pg--;
- }
- *page = pg;
- *addr = win->address + of;
- *len = win->size - of;
- return TRUE;
-}
-
-
diff --git a/drivers/staging/csr/csr_wifi_hip_chiphelper.h b/drivers/staging/csr/csr_wifi_hip_chiphelper.h
deleted file mode 100644
index 09b3aefcbced..000000000000
--- a/drivers/staging/csr/csr_wifi_hip_chiphelper.h
+++ /dev/null
@@ -1,407 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2011
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#ifndef CSR_WIFI_HIP_CHIPHELPER_H__
-#define CSR_WIFI_HIP_CHIPHELPER_H__
-
-
-#include <linux/types.h>
-
-/* The age of the BlueCore chip. This is probably not useful, if
- you know the age then you can probably work out the version directly. */
-enum chip_helper_bluecore_age
-{
- chip_helper_bluecore_pre_bc7,
- chip_helper_bluecore_bc7_or_later
-};
-
-/* We support up to three windowed regions at the moment.
- Don't reorder these - they're used to index into an array. */
-enum chip_helper_window_index
-{
- CHIP_HELPER_WINDOW_1 = 0,
- CHIP_HELPER_WINDOW_2 = 1,
- CHIP_HELPER_WINDOW_3 = 2,
- CHIP_HELPER_WINDOW_COUNT = 3
-};
-
-/* These are the things that we can access through a window.
- Don't reorder these - they're used to index into an array. */
-enum chip_helper_window_type
-{
- CHIP_HELPER_WT_CODE_RAM = 0,
- CHIP_HELPER_WT_FLASH = 1,
- CHIP_HELPER_WT_EXT_SRAM = 2,
- CHIP_HELPER_WT_ROM = 3,
- CHIP_HELPER_WT_SHARED = 4,
- CHIP_HELPER_WT_COUNT = 5
-};
-
-/* Commands to stop and start the XAP */
-enum chip_helper_dbg_emu_cmd_enum
-{
- CHIP_HELPER_DBG_EMU_CMD_XAP_STEP_MASK = 0x0001,
- CHIP_HELPER_DBG_EMU_CMD_XAP_RUN_B_MASK = 0x0002,
- CHIP_HELPER_DBG_EMU_CMD_XAP_BRK_MASK = 0x0004,
- CHIP_HELPER_DBG_EMU_CMD_XAP_WAKEUP_MASK = 0x0008
-};
-
-/* Bitmasks for Stop and sleep status: DBG_SPI_STOP_STATUS & DBG_HOST_STOP_STATUS */
-enum chip_helper_dbg_stop_status_enum
-{
- CHIP_HELPER_DBG_STOP_STATUS_NONE_MASK = 0x0000,
- CHIP_HELPER_DBG_STOP_STATUS_P0_MASK = 0x0001,
- CHIP_HELPER_DBG_STOP_STATUS_P1_MASK = 0x0002,
- CHIP_HELPER_DBG_STOP_STATUS_P2_MASK = 0x0004,
- CHIP_HELPER_DBG_STOP_STATUS_SLEEP_STATUS_P0_MASK = 0x0008,
- CHIP_HELPER_DBG_STOP_STATUS_SLEEP_STATUS_P1_MASK = 0x0010,
- CHIP_HELPER_DBG_STOP_STATUS_SLEEP_STATUS_P2_MASK = 0x0020,
- /* Legacy names/alias */
- CHIP_HELPER_DBG_STOP_STATUS_MAC_MASK = 0x0001,
- CHIP_HELPER_DBG_STOP_STATUS_PHY_MASK = 0x0002,
- CHIP_HELPER_DBG_STOP_STATUS_BT_MASK = 0x0004,
- CHIP_HELPER_DBG_STOP_STATUS_SLEEP_STATUS_MAC_MASK = 0x0008,
- CHIP_HELPER_DBG_STOP_STATUS_SLEEP_STATUS_PHY_MASK = 0x0010,
- CHIP_HELPER_DBG_STOP_STATUS_SLEEP_STATUS_BT_MASK = 0x0020
-};
-
-/* Codes to disable the watchdog */
-enum chip_helper_watchdog_disable_enum
-{
- CHIP_HELPER_WATCHDOG_DISABLE_CODE1 = 0x6734,
- CHIP_HELPER_WATCHDOG_DISABLE_CODE2 = 0xD6BF,
- CHIP_HELPER_WATCHDOG_DISABLE_CODE3 = 0xC31E
-};
-
-/* Other bits have changed between versions */
-enum chip_helper_gbl_misc_enum
-{
- CHIP_HELPER_GBL_MISC_SPI_STOP_OUT_EN_MASK = 0x0001,
- CHIP_HELPER_GBL_MISC_MMU_INIT_DONE_MASK = 0x0004
-};
-
-/* Coex status register, contains interrupt status and reset pullup status.
- * CHIP_HELPER_COEX_STATUS_RST_PULLS_MSB_MASK can be used to check
- * for WAPI on R03 chips and later. */
-enum chip_helper_coex_status_mask_enum
-{
- CHIP_HELPER_COEX_STATUS_RST_PULLS_LSB_MASK = 0x0001,
- CHIP_HELPER_COEX_STATUS_RST_PULLS_MSB_MASK = 0x0008,
- CHIP_HELPER_COEX_STATUS_WL_FEC_PINS_LSB_MASK = 0x0010,
- CHIP_HELPER_COEX_STATUS_WL_FEC_PINS_MSB_MASK = 0x0080,
- CHIP_HELPER_COEX_STATUS_INT_UART_MASK = 0x0100,
- CHIP_HELPER_COEX_STATUS_INT_BT_LEG_MASK = 0x0200
-};
-
-/* How to select the different CPUs */
-enum chip_helper_dbg_proc_sel_enum
-{
- CHIP_HELPER_DBG_PROC_SEL_MAC = 0,
- CHIP_HELPER_DBG_PROC_SEL_PHY = 1,
- CHIP_HELPER_DBG_PROC_SEL_BT = 2,
- CHIP_HELPER_DBG_PROC_SEL_NONE = 2,
- CHIP_HELPER_DBG_PROC_SEL_BOTH = 3
-};
-
-/* These are the only registers that we have to know the
- address of before we know the chip version. */
-enum chip_helper_fixed_registers
-{
- /* This is the address of GBL_CHIP_VERISON on BC7,
- UF105x, UF60xx and
- anything later than that. */
- CHIP_HELPER_UNIFI_GBL_CHIP_VERSION = 0xFE81,
-
- CHIP_HELPER_OLD_BLUECORE_GBL_CHIP_VERSION = 0xFF9A
-
- /* This isn't used at the moment (but might be needed
- to distinguish the BlueCore sub version?) */
- /* CHIP_HELPER_OLD_BLUECORE_ANA_VERSION_ID = 0xFF7D */
-};
-
-/* Address-value pairs for defining initialisation values */
-struct chip_helper_init_values
-{
- u16 addr;
- u16 value;
-};
-
-/* A block of data that should be written to the device */
-struct chip_helper_reset_values
-{
- u32 gp_address;
- u32 len;
- const u16 *data;
-};
-
-/*
- * This is the C API.
- */
-
-/* opaque type */
-typedef const struct chip_device_desc_t ChipDescript;
-
-/* Return a NULL descriptor */
-ChipDescript* ChipHelper_Null(void);
-
-/* This should get the correct version for any CSR chip.
- The two parameters are what is read from addresses
- 0xFF9A and 0xFE81 (OLD_BLUECORE_GBL_CHIP_VERSION and
- UNIFI_GBL_CHIP_VERSION). These should give a unique identity
- for most (all?) chips.
-
- FF9A is the old GBL_CHIP_VERSION register. If the high
- eight bits are zero then the chip is a new (BC7 +) one
- and FE81 is the _new_ GBL_CHIP_VERSION register. */
-ChipDescript* ChipHelper_GetVersionAny(u16 from_FF9A, u16 from_FE81);
-
-/* The chip is a UniFi, but we don't know which type
- The parameter is the value of UNIFI_GBL_CHIP_VERSION (0xFE81) */
-ChipDescript* ChipHelper_GetVersionUniFi(u16 version);
-
-/* This gets the version from the SDIO device id. This only
- gives quite a coarse grained version, so we should update once
- we hav access to the function N registers. */
-ChipDescript* ChipHelper_GetVersionSdio(u8 sdio_version);
-
-/* The chip is some sort of BlueCore. If "age" is "pre_bc7" then
- "version" is what was read from FF9A. If "age" is bc7_or_later
- then "version" is read from FE81. If we don't know if we're pre
- or post BC7 then we should use "GetVersionAny". */
-ChipDescript* ChipHelper_GetVersionBlueCore(enum chip_helper_bluecore_age age,
- u16 version);
-
-/* The main functions of this class are built with an X macro. This
- means we can generate the C and C++ versions from the same source
- without the two diverging.
-
- The DEF0 functions are simple and take no parameters. The first
- parameter to the macro is the return type. The second parameter
- is the function name and the third parameter is where to get the
- info from (this is hidden from the user).
-
- The DEF1 functions take one parameter. This time the third macro
- parameter is the type of this parameter, and the fourth macro
- parameter is the name of the parameter. The bodies of these
- functions are hand written. */
-#define CHIP_HELPER_LIST(m) \
- CHIP_HELPER_DEF0(m, (const char *, FriendlyName, friendly_name)) \
- CHIP_HELPER_DEF0(m, (const char *, MarketingName, marketing_name)) \
- CHIP_HELPER_DEF0(m, (u16, DBG_EMU_CMD, regs->dbg_emu_cmd)) \
- CHIP_HELPER_DEF0(m, (u16, DBG_HOST_PROC_SELECT, regs->host.dbg_proc_select)) \
- CHIP_HELPER_DEF0(m, (u16, DBG_HOST_STOP_STATUS, regs->host.dbg_stop_status)) \
- CHIP_HELPER_DEF0(m, (u16, HOST_WINDOW1_PAGE, regs->host.window1_page)) \
- CHIP_HELPER_DEF0(m, (u16, HOST_WINDOW2_PAGE, regs->host.window2_page)) \
- CHIP_HELPER_DEF0(m, (u16, HOST_WINDOW3_PAGE, regs->host.window3_page)) \
- CHIP_HELPER_DEF0(m, (u16, HOST_IO_LOG_ADDR, regs->host.io_log_addr)) \
- CHIP_HELPER_DEF0(m, (u16, DBG_SPI_PROC_SELECT, regs->spi.dbg_proc_select)) \
- CHIP_HELPER_DEF0(m, (u16, DBG_SPI_STOP_STATUS, regs->spi.dbg_stop_status)) \
- CHIP_HELPER_DEF0(m, (u16, SPI_WINDOW1_PAGE, regs->spi.window1_page)) \
- CHIP_HELPER_DEF0(m, (u16, SPI_WINDOW2_PAGE, regs->spi.window2_page)) \
- CHIP_HELPER_DEF0(m, (u16, SPI_WINDOW3_PAGE, regs->spi.window3_page)) \
- CHIP_HELPER_DEF0(m, (u16, SPI_IO_LOG_ADDR, regs->spi.io_log_addr)) \
- CHIP_HELPER_DEF0(m, (u16, DBG_RESET, regs->dbg_reset)) \
- CHIP_HELPER_DEF0(m, (u16, DBG_RESET_VALUE, regs->dbg_reset_value)) \
- CHIP_HELPER_DEF0(m, (u16, DBG_RESET_WARN, regs->dbg_reset_warn)) \
- CHIP_HELPER_DEF0(m, (u16, DBG_RESET_WARN_VALUE, regs->dbg_reset_warn_value)) \
- CHIP_HELPER_DEF0(m, (u16, DBG_RESET_RESULT, regs->dbg_reset_result)) \
- CHIP_HELPER_DEF0(m, (u16, WATCHDOG_DISABLE, regs->watchdog_disable)) \
- CHIP_HELPER_DEF0(m, (u16, PROC_PC_SNOOP, regs->proc_pc_snoop)) \
- CHIP_HELPER_DEF0(m, (u16, GBL_CHIP_VERSION, regs->gbl_chip_version)) \
- CHIP_HELPER_DEF0(m, (u16, GBL_MISC_ENABLES, regs->gbl_misc_enables)) \
- CHIP_HELPER_DEF0(m, (u16, XAP_PCH, regs->xap_pch)) \
- CHIP_HELPER_DEF0(m, (u16, XAP_PCL, regs->xap_pcl)) \
- CHIP_HELPER_DEF0(m, (u16, MAILBOX0, regs->mailbox0)) \
- CHIP_HELPER_DEF0(m, (u16, MAILBOX1, regs->mailbox1)) \
- CHIP_HELPER_DEF0(m, (u16, MAILBOX2, regs->mailbox2)) \
- CHIP_HELPER_DEF0(m, (u16, MAILBOX3, regs->mailbox3)) \
- CHIP_HELPER_DEF0(m, (u16, SDIO_HIP_HANDSHAKE, regs->sdio_hip_handshake)) \
- CHIP_HELPER_DEF0(m, (u16, SDIO_HOST_INT, regs->sdio_host_int)) \
- CHIP_HELPER_DEF0(m, (u16, COEX_STATUS, regs->coex_status)) \
- CHIP_HELPER_DEF0(m, (u16, SHARED_IO_INTERRUPT, regs->shared_io_interrupt)) \
- CHIP_HELPER_DEF0(m, (u32, PROGRAM_MEMORY_RAM_OFFSET, prog_offset.ram)) \
- CHIP_HELPER_DEF0(m, (u32, PROGRAM_MEMORY_ROM_OFFSET, prog_offset.rom)) \
- CHIP_HELPER_DEF0(m, (u32, PROGRAM_MEMORY_FLASH_OFFSET, prog_offset.flash)) \
- CHIP_HELPER_DEF0(m, (u32, PROGRAM_MEMORY_EXT_SRAM_OFFSET, prog_offset.ext_sram)) \
- CHIP_HELPER_DEF0(m, (u16, DATA_MEMORY_RAM_OFFSET, data_offset.ram)) \
- CHIP_HELPER_DEF0(m, (s32, HasFlash, bools.has_flash)) \
- CHIP_HELPER_DEF0(m, (s32, HasExtSram, bools.has_ext_sram)) \
- CHIP_HELPER_DEF0(m, (s32, HasRom, bools.has_rom)) \
- CHIP_HELPER_DEF0(m, (s32, HasBt, bools.has_bt)) \
- CHIP_HELPER_DEF0(m, (s32, HasWLan, bools.has_wlan)) \
- CHIP_HELPER_DEF1(m, (u16, WINDOW_ADDRESS, enum chip_helper_window_index, window)) \
- CHIP_HELPER_DEF1(m, (u16, WINDOW_SIZE, enum chip_helper_window_index, window)) \
- CHIP_HELPER_DEF1(m, (u16, MapAddress_SPI2HOST, u16, addr)) \
- CHIP_HELPER_DEF1(m, (u16, MapAddress_HOST2SPI, u16, addr)) \
- CHIP_HELPER_DEF1(m, (u32, ClockStartupSequence, const struct chip_helper_init_values **, val)) \
- CHIP_HELPER_DEF1(m, (u32, HostResetSequence, const struct chip_helper_reset_values **, val))
-
-/* Some magic to help the expansion */
-#define CHIP_HELPER_DEF0(a, b) \
- CHIP_HELPER_DEF0_ ## a b
-#define CHIP_HELPER_DEF1(a, b) \
- CHIP_HELPER_DEF1_ ## a b
-
-/* Macros so that when we expand the list we get "C" function prototypes. */
-#define CHIP_HELPER_DEF0_C_DEC(ret_type, name, info) \
- ret_type ChipHelper_ ## name(ChipDescript * chip_help);
-#define CHIP_HELPER_DEF1_C_DEC(ret_type, name, type1, name1) \
- ret_type ChipHelper_ ## name(ChipDescript * chip_help, type1 name1);
-
-CHIP_HELPER_LIST(C_DEC)
-
-/* FriendlyName
- MarketingName
-
- These two functions return human readable strings that describe
- the chip. FriendlyName returns something that a software engineer
- at CSR might understand. MarketingName returns something more like
- an external name for a CSR chip.
-*/
-/* DBG_EMU_CMD
- WATCHDOG_DISABLE
- PROC_PC_SNOOP
- GBL_CHIP_VERSION
- XAP_PCH
- XAP_PCL
-
- These registers are used to control the XAPs.
-*/
-/* DBG_HOST_PROC_SELECT DBG_HOST_STOP_STATUS
- HOST_WINDOW1_PAGE HOST_WINDOW2_PAGE HOST_WINDOW3_PAGE
- HOST_IO_LOG_ADDR
- DBG_SPI_PROC_SELECT DBG_SPI_STOP_STATUS
- SPI_WINDOW1_PAGE SPI_WINDOW2_PAGE SPI_WINDOW3_PAGE
- SPI_IO_LOG_ADDR
-
- These register are used to control the XAPs and the memory
- windows, normally while debugging the code on chip. There
- are two versons of these registers, one for access via SPI
- and another for access via the host interface.
-*/
-/* DBG_RESET
- DBG_RESET_VALUE
- DBG_RESET_WARN
- DBG_RESET_WARN_VALUE
- DBG_RESET_RESULT
-
- These registers are used to reset the XAP. This can be
- quite complex for some chips. If DBG_RESET_WARN is non
- zero the DBG_RESET_WARN_VALUE should be written to address
- DBG_RESET_WARN before the reset is perfeormed. DBG_RESET_VALUE
- should then be written to DBG_RESET to make the reset happen.
- The DBG_RESET_RESULT register should contain 0 if the reset
- was successful.
-*/
-/* GBL_MISC_ENABLES
-
- This register controls some special chip features. It
- should be used with care is it changes quite a lot between
- chip versions.
-*/
-/* MAILBOX0
- MAILBOX1
- MAILBOX2
- MAILBOX3
-
- The mailbox registers are for communication between the host
- and the firmware. There use is described in part by the host
- interface protcol specifcation.
-*/
-/* SDIO_HIP_HANDSHAKE
-
- This is one of the more important SDIO HIP registers. On some
- chips it has the same value as one of the mailbox registers
- and on other chips it is different.
-*/
-/* SDIO_HOST_INT
- SHARED_IO_INTERRUPT
-
- These registers are used by some versions of the host interface
- protocol specification. Their names should probably be changed
- to hide the registers and to expose the functions more.
-*/
-/* COEX_STATUS
-
- Coex status register, contains interrupt status and reset
- pullup status. The latter is used to detect WAPI.
-*/
-/* PROGRAM_MEMORY_RAM_OFFSET
- PROGRAM_MEMORY_ROM_OFFSET
- PROGRAM_MEMORY_FLASH_OFFSET
- PROGRAM_MEMORY_EXT_SRAM_OFFSET
- DATA_MEMORY_RAM_OFFSET
-
- These are constants that describe the offset of the different
- memory types in the two different address spaces.
-*/
-/* HasFlash HasExtSram HasRom
- HasBt HasWLan
-
- These are a set of bools describing the chip.
-*/
-/* WINDOW_ADDRESS WINDOW_SIZE
-
- These two functions return the size and address of the windows.
- The address is the address of the lowest value in the address
- map that is part of the window and the size is the number of
- visible words.
-
- Some of the windows have their lowest portion covered by
- registers. For these windows address is the first address
- after the registers and size is the siave excluding the part
- covered by registers.
-*/
-/* MapAddress_SPI2HOST
- MapAddress_HOST2SPI
-
- The debugging interface is duplicated on UniFi and later chips
- so that there are two versions - one over the SPI interaface and
- the other over the SDIO interface. These functions map the
- registers between these two interfaces.
-*/
-/* ClockStartupSequence
-
- This function returns the list of register value pairs that
- should be forced into UniFi to enable SPI communication. This
- set of registers is not needed if the firmware is running, but
- will be needed if the device is being booted from cold. These
- register writes enable the clocks and setup the PLL to a basic
- working state. SPI access might be unreliable until these writes
- have occurred (And they may take mulitple goes).
-*/
-/* HostResetSequence
-
- This returns a number of chunks of data and generic pointers.
- All of the XAPs should be stopped. The data should be written
- to the generic pointers. The instruction pointer for the MAC
- should then be set to the start of program memory and then the
- MAC should be "go"d. This will reset the chip in a reliable
- and orderly manner without resetting the SDIO interface. It
- is therefore not needed if the chip is being accessed by the
- SPI interface (the DBG_RESET_ mechanism can be used instead).
-*/
-
-/* The Decode Window function is more complex. For the window
- 'window' it tries to return the address and page register
- value needed to see offset 'offset' of memory type 'type'.
-
- It return 1 on success and 0 on failure. 'page' is what
- should be written to the page register. 'addr' is the
- address in the XAPs 16 address map to read from. 'len'
- is the length that we can read without having to change
- the page registers. */
-s32 ChipHelper_DecodeWindow(ChipDescript *chip_help,
- enum chip_helper_window_index window,
- enum chip_helper_window_type type,
- u32 offset,
- u16 *page, u16 *addr, u32 *len);
-
-#endif
diff --git a/drivers/staging/csr/csr_wifi_hip_chiphelper_private.h b/drivers/staging/csr/csr_wifi_hip_chiphelper_private.h
deleted file mode 100644
index e5e579912550..000000000000
--- a/drivers/staging/csr/csr_wifi_hip_chiphelper_private.h
+++ /dev/null
@@ -1,200 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2011
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-#ifndef CSR_WIFI_HIP_CHIPHELPER_PRIVATE_H__
-#define CSR_WIFI_HIP_CHIPHELPER_PRIVATE_H__
-
-
-#include "csr_wifi_hip_chiphelper.h"
-
-/* This GP stuff should be somewhere else? */
-
-/* Memory spaces encoded in top byte of Generic Pointer type */
-#define UNIFI_SH_DMEM 0x01 /* Shared Data Memory */
-#define UNIFI_EXT_FLASH 0x02 /* External FLASH */
-#define UNIFI_EXT_SRAM 0x03 /* External SRAM */
-#define UNIFI_REGISTERS 0x04 /* Registers */
-#define UNIFI_PHY_DMEM 0x10 /* PHY Data Memory */
-#define UNIFI_PHY_PMEM 0x11 /* PHY Program Memory */
-#define UNIFI_PHY_ROM 0x12 /* PHY ROM */
-#define UNIFI_MAC_DMEM 0x20 /* MAC Data Memory */
-#define UNIFI_MAC_PMEM 0x21 /* MAC Program Memory */
-#define UNIFI_MAC_ROM 0x22 /* MAC ROM */
-#define UNIFI_BT_DMEM 0x30 /* BT Data Memory */
-#define UNIFI_BT_PMEM 0x31 /* BT Program Memory */
-#define UNIFI_BT_ROM 0x32 /* BT ROM */
-
-#define MAKE_GP(R, O) (((UNIFI_ ## R) << 24) | (O))
-#define GP_OFFSET(GP) ((GP) & 0xFFFFFF)
-#define GP_SPACE(GP) (((GP) >> 24) & 0xFF)
-
-
-/* Address value pairs */
-struct val_array_t
-{
- u32 len;
- const struct chip_helper_init_values *vals;
-};
-
-/* Just a (counted) u16 array */
-struct data_array_t
-{
- u32 len;
- const u16 *vals;
-};
-
-struct reset_prog_t
-{
- u32 len;
- const struct chip_helper_reset_values *vals;
-};
-
-/* The addresses of registers that are equivalent but on
- different host transports. */
-struct chip_map_address_t
-{
- u16 spi, host;
-};
-
-struct map_array_t
-{
- u32 len;
- const struct chip_map_address_t *vals;
-};
-
-struct chip_device_regs_per_transport_t
-{
- u16 dbg_proc_select;
- u16 dbg_stop_status;
- u16 window1_page; /* PROG_PMEM1 or GW1 */
- u16 window2_page; /* PROG_PMEM2 or GW2 */
- u16 window3_page; /* SHARED or GW3 */
- u16 io_log_addr;
-};
-
-struct chip_device_regs_t
-{
- u16 gbl_chip_version;
- u16 gbl_misc_enables;
- u16 dbg_emu_cmd;
- struct chip_device_regs_per_transport_t host;
- struct chip_device_regs_per_transport_t spi;
- u16 dbg_reset;
- u16 dbg_reset_value;
- u16 dbg_reset_warn;
- u16 dbg_reset_warn_value;
- u16 dbg_reset_result;
- u16 xap_pch;
- u16 xap_pcl;
- u16 proc_pc_snoop;
- u16 watchdog_disable;
- u16 mailbox0;
- u16 mailbox1;
- u16 mailbox2;
- u16 mailbox3;
- u16 sdio_host_int;
- u16 shared_io_interrupt;
- u16 sdio_hip_handshake;
- u16 coex_status; /* Allows WAPI detection */
-};
-
-/* If allowed is false then this window does not provide this
- type of access.
- This describes how addresses should be shifted to make the
- "page" address. The address is shifted left by 'page_shift'
- and then has 'page_offset' added. This value should then be
- written to the page register. */
-struct window_shift_info_t
-{
- s32 allowed;
- u32 page_shift;
- u16 page_offset;
-};
-
-/* Each window has an address and size. These are obvious. It then
- has a description for each type of memory that might be accessed
- through it. There might also be a start to the offset of the window.
- This means that that number of addresses at the start of the window
- are unusable. */
-struct window_info_t
-{
- u16 address;
- u16 size;
- u16 blocked;
- const struct window_shift_info_t *mode;
-};
-
-/* If GBL_CHIP_VERSION and'ed with 'mask' and is equal to 'result'
- then this is the correct set of info. If pre_bc7 is true then the
- address of GBL_CHIP_VERSION is FF9A, else its FE81. */
-struct chip_version_t
-{
- s32 pre_bc7;
- u16 mask;
- u16 result;
- u8 sdio;
-};
-
-struct chip_device_desc_t
-{
- struct chip_version_t chip_version;
-
- /* This is a text string that a human might find useful (BC02, UF105x) */
- const char *friendly_name;
- /* This is what we show to customers */
- const char *marketing_name;
-
- /* Initialisation values to write following a reset */
- struct val_array_t init;
-
- /* Binary sequence for hard reset */
- struct reset_prog_t reset_prog;
-
- /* The register map */
- const struct chip_device_regs_t *regs;
-
- /* Some misc. info on the chip */
- struct
- {
- u32 has_flash : 1;
- u32 has_ext_sram : 1;
- u32 has_rom : 1;
- u32 has_bt : 1;
- u32 has_wlan : 1;
- } bools;
-
- /* This table is used to remap register addresses depending on what
- host interface is used. On the BC7 and later chips there are
- multiple sets of memory window registers, on for each host
- interafce (SDIO / SPI). The correct one is needed. */
- struct map_array_t map;
-
- /* The offsets into the program address space of the different types of memory.
- The RAM offset is probably the most useful. */
- struct
- {
- u32 ram;
- u32 rom;
- u32 flash;
- u32 ext_sram;
- } prog_offset;
-
- /* The offsets into the data address space of interesting things. */
- struct
- {
- u16 ram;
- /* maybe add shared / page tables? */
- } data_offset;
-
- /* Information on the different windows */
- const struct window_info_t *windows[CHIP_HELPER_WINDOW_COUNT];
-};
-
-#endif /* CSR_WIFI_HIP_CHIPHELPER_PRIVATE_H__ */
diff --git a/drivers/staging/csr/csr_wifi_hip_conversions.h b/drivers/staging/csr/csr_wifi_hip_conversions.h
deleted file mode 100644
index bf7a52e82995..000000000000
--- a/drivers/staging/csr/csr_wifi_hip_conversions.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2011
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-/*
- * ---------------------------------------------------------------------------
- *
- * FILE: csr_wifi_hip_conversions.h
- *
- * PURPOSE:
- * This header file provides the macros for converting to and from
- * wire format.
- * These macros *MUST* work for little-endian AND big-endian hosts.
- *
- * ---------------------------------------------------------------------------
- */
-#ifndef __CSR_WIFI_HIP_CONVERSIONS_H__
-#define __CSR_WIFI_HIP_CONVERSIONS_H__
-
-#define SIZEOF_UINT16 2
-#define SIZEOF_UINT32 4
-#define SIZEOF_UINT64 8
-
-#define SIZEOF_SIGNAL_HEADER 6
-#define SIZEOF_DATAREF 4
-
-
-/*
- * Macro to retrieve the signal ID from a wire-format signal.
- */
-#define GET_SIGNAL_ID(_buf) CSR_GET_UINT16_FROM_LITTLE_ENDIAN((_buf))
-
-/*
- * Macros to retrieve and set the DATAREF fields in a packed (i.e. wire-format)
- * HIP signal.
- */
-#define GET_PACKED_DATAREF_SLOT(_buf, _ref) \
- CSR_GET_UINT16_FROM_LITTLE_ENDIAN(((_buf) + SIZEOF_SIGNAL_HEADER + ((_ref) * SIZEOF_DATAREF) + 0))
-
-#define GET_PACKED_DATAREF_LEN(_buf, _ref) \
- CSR_GET_UINT16_FROM_LITTLE_ENDIAN(((_buf) + SIZEOF_SIGNAL_HEADER + ((_ref) * SIZEOF_DATAREF) + 2))
-
-#define SET_PACKED_DATAREF_SLOT(_buf, _ref, _slot) \
- CSR_COPY_UINT16_TO_LITTLE_ENDIAN((_slot), ((_buf) + SIZEOF_SIGNAL_HEADER + ((_ref) * SIZEOF_DATAREF) + 0))
-
-#define SET_PACKED_DATAREF_LEN(_buf, _ref, _len) \
- CSR_COPY_UINT16_TO_LITTLE_ENDIAN((_len), ((_buf) + SIZEOF_SIGNAL_HEADER + ((_ref) * SIZEOF_DATAREF) + 2))
-
-#define GET_PACKED_MA_PACKET_REQUEST_FRAME_PRIORITY(_buf) \
- CSR_GET_UINT16_FROM_LITTLE_ENDIAN(((_buf) + SIZEOF_SIGNAL_HEADER + UNIFI_MAX_DATA_REFERENCES * SIZEOF_DATAREF + 8))
-
-#define GET_PACKED_MA_PACKET_REQUEST_HOST_TAG(_buf) \
- CSR_GET_UINT32_FROM_LITTLE_ENDIAN(((_buf) + SIZEOF_SIGNAL_HEADER + UNIFI_MAX_DATA_REFERENCES * SIZEOF_DATAREF + 4))
-
-#define GET_PACKED_MA_PACKET_CONFIRM_HOST_TAG(_buf) \
- CSR_GET_UINT32_FROM_LITTLE_ENDIAN(((_buf) + SIZEOF_SIGNAL_HEADER + UNIFI_MAX_DATA_REFERENCES * SIZEOF_DATAREF + 8))
-
-#define GET_PACKED_MA_PACKET_CONFIRM_TRANSMISSION_STATUS(_buf) \
- CSR_GET_UINT16_FROM_LITTLE_ENDIAN(((_buf) + SIZEOF_SIGNAL_HEADER + UNIFI_MAX_DATA_REFERENCES * SIZEOF_DATAREF + 2))
-
-
-s32 get_packed_struct_size(const u8 *buf);
-CsrResult read_unpack_signal(const u8 *ptr, CSR_SIGNAL *sig);
-CsrResult write_pack(const CSR_SIGNAL *sig, u8 *ptr, u16 *sig_len);
-
-#endif /* __CSR_WIFI_HIP_CONVERSIONS_H__ */
-
diff --git a/drivers/staging/csr/csr_wifi_hip_download.c b/drivers/staging/csr/csr_wifi_hip_download.c
deleted file mode 100644
index 2f44a383d2cf..000000000000
--- a/drivers/staging/csr/csr_wifi_hip_download.c
+++ /dev/null
@@ -1,819 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2012
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-/*
- * ---------------------------------------------------------------------------
- * FILE: csr_wifi_hip_download.c
- *
- * PURPOSE:
- * Routines for downloading firmware to UniFi.
- *
- * ---------------------------------------------------------------------------
- */
-#include <linux/slab.h>
-#include "csr_wifi_hip_unifi.h"
-#include "csr_wifi_hip_unifiversion.h"
-#include "csr_wifi_hip_card.h"
-#include "csr_wifi_hip_xbv.h"
-
-#undef CSR_WIFI_IGNORE_PATCH_VERSION_MISMATCH
-
-static CsrResult do_patch_download(card_t *card, void *dlpriv,
- xbv1_t *pfwinfo, u32 boot_ctrl_addr);
-
-static CsrResult do_patch_convert_download(card_t *card,
- void *dlpriv, xbv1_t *pfwinfo);
-
-/*
- * ---------------------------------------------------------------------------
- * _find_in_slut
- *
- * Find the offset of the appropriate object in the SLUT of a card
- *
- * Arguments:
- * card Pointer to card struct
- * psym Pointer to symbol object.
- * id set up by caller
- * obj will be set up by this function
- * pslut Pointer to SLUT address, if 0xffffffff then it must be
- * read from the chip.
- * Returns:
- * CSR_RESULT_SUCCESS on success
- * Non-zero on error,
- * CSR_WIFI_HIP_RESULT_NOT_FOUND if not found
- * ---------------------------------------------------------------------------
- */
-static CsrResult _find_in_slut(card_t *card, symbol_t *psym, u32 *pslut)
-{
- u32 slut_address;
- u16 finger_print;
- CsrResult r;
- CsrResult csrResult;
-
- /* Get SLUT address */
- if (*pslut == 0xffffffff)
- {
- r = card_wait_for_firmware_to_start(card, &slut_address);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Firmware hasn't started\n");
- return r;
- }
- *pslut = slut_address;
-
- /*
- * Firmware has started so set the SDIO bus clock to the initial speed,
- * faster than UNIFI_SDIO_CLOCK_SAFE_HZ, to speed up the f/w download.
- */
- csrResult = CsrSdioMaxBusClockFrequencySet(card->sdio_if, UNIFI_SDIO_CLOCK_INIT_HZ);
- if (csrResult != CSR_RESULT_SUCCESS)
- {
- r = ConvertCsrSdioToCsrHipResult(card, csrResult);
- return r;
- }
- card->sdio_clock_speed = UNIFI_SDIO_CLOCK_INIT_HZ;
- }
- else
- {
- slut_address = *pslut; /* Use previously discovered address */
- }
- unifi_trace(card->ospriv, UDBG4, "SLUT addr: 0x%lX\n", slut_address);
-
- /*
- * Check the SLUT fingerprint.
- * The slut_address is a generic pointer so we must use unifi_card_read16().
- */
- unifi_trace(card->ospriv, UDBG4, "Looking for SLUT finger print\n");
- finger_print = 0;
- r = unifi_card_read16(card, slut_address, &finger_print);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read SLUT finger print\n");
- return r;
- }
-
- if (finger_print != SLUT_FINGERPRINT)
- {
- unifi_error(card->ospriv, "Failed to find SLUT fingerprint\n");
- return CSR_RESULT_FAILURE;
- }
-
- /* Symbol table starts imedately after the fingerprint */
- slut_address += 2;
-
- while (1)
- {
- u16 id;
- u32 obj;
-
- r = unifi_card_read16(card, slut_address, &id);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
- slut_address += 2;
-
- if (id == CSR_SLT_END)
- {
- /* End of table reached: not found */
- r = CSR_WIFI_HIP_RESULT_RANGE;
- break;
- }
-
- r = unifi_read32(card, slut_address, &obj);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
- slut_address += 4;
-
- unifi_trace(card->ospriv, UDBG3, " found SLUT id %02d.%08lx\n", id, obj);
-
- r = CSR_WIFI_HIP_RESULT_NOT_FOUND;
- /* Found search term? */
- if (id == psym->id)
- {
- unifi_trace(card->ospriv, UDBG1, " matched SLUT id %02d.%08lx\n", id, obj);
- psym->obj = obj;
- r = CSR_RESULT_SUCCESS;
- break;
- }
- }
-
- return r;
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * do_patch_convert_download
- *
- * Download the given firmware image to the UniFi, converting from FWDL
- * to PTDL XBV format.
- *
- * Arguments:
- * card Pointer to card struct
- * dlpriv Pointer to source firmware image
- * fwinfo Pointer to source firmware info struct
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, CSR error code on error
- *
- * Notes:
- * ---------------------------------------------------------------------------
- */
-static CsrResult do_patch_convert_download(card_t *card, void *dlpriv, xbv1_t *pfwinfo)
-{
- CsrResult r;
- u32 slut_base = 0xffffffff;
- void *pfw;
- u32 psize;
- symbol_t sym;
-
- /* Reset the chip to guarantee that the ROM loader is running */
- r = unifi_init(card);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv,
- "do_patch_convert_download: failed to re-init UniFi\n");
- return r;
- }
-
- /* If no unifi_helper is running, the firmware version must be read */
- if (card->build_id == 0)
- {
- u32 ver = 0;
- sym.id = CSR_SLT_BUILD_ID_NUMBER;
- sym.obj = 0; /* To be updated by _find_in_slut() */
-
- unifi_trace(card->ospriv, UDBG1, "Need f/w version\n");
-
- /* Find chip build id entry in SLUT */
- r = _find_in_slut(card, &sym, &slut_base);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to find CSR_SLT_BUILD_ID_NUMBER\n");
- return CSR_RESULT_FAILURE;
- }
-
- /* Read running f/w version */
- r = unifi_read32(card, sym.obj, &ver);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read f/w id\n");
- return CSR_RESULT_FAILURE;
- }
- card->build_id = ver;
- }
-
- /* Convert the ptest firmware to a patch against the running firmware */
- pfw = xbv_to_patch(card, unifi_fw_read, dlpriv, pfwinfo, &psize);
- if (!pfw)
- {
- unifi_error(card->ospriv, "Failed to convert f/w to patch");
- return CSR_WIFI_HIP_RESULT_NO_MEMORY;
- }
- else
- {
- void *desc;
- sym.id = CSR_SLT_BOOT_LOADER_CONTROL;
- sym.obj = 0; /* To be updated by _find_in_slut() */
-
- /* Find boot loader control entry in SLUT */
- r = _find_in_slut(card, &sym, &slut_base);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to find BOOT_LOADER_CONTROL\n");
- kfree(pfw);
- return CSR_RESULT_FAILURE;
- }
-
- r = unifi_set_host_state(card, UNIFI_HOST_STATE_AWAKE);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to wake UniFi\n");
- }
-
- /* Get a dlpriv for the patch buffer so that unifi_fw_read() can
- * access it.
- */
- desc = unifi_fw_open_buffer(card->ospriv, pfw, psize);
- if (!desc)
- {
- kfree(pfw);
- return CSR_WIFI_HIP_RESULT_NO_MEMORY;
- }
-
- /* Download the patch */
- unifi_info(card->ospriv, "Downloading converted f/w as patch\n");
- r = unifi_dl_patch(card, desc, sym.obj);
- kfree(pfw);
- unifi_fw_close_buffer(card->ospriv, desc);
-
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Converted patch download failed\n");
- return r;
- }
- else
- {
- unifi_trace(card->ospriv, UDBG1, "Converted patch downloaded\n");
- }
-
- /* This command starts the firmware */
- r = unifi_do_loader_op(card, sym.obj + 6, UNIFI_BOOT_LOADER_RESTART);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to write loader restart cmd\n");
- }
-
- return r;
- }
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_dl_firmware
- *
- * Download the given firmware image to the UniFi.
- *
- * Arguments:
- * card Pointer to card struct
- * dlpriv A context pointer from the calling function to be
- * passed when calling unifi_fw_read().
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success,
- * CSR_WIFI_HIP_RESULT_NO_MEMORY memory allocation failed
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE error in XBV file
- * CSR_RESULT_FAILURE SDIO error
- *
- * Notes:
- * Stops and resets the chip, does the download and runs the new
- * firmware.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_dl_firmware(card_t *card, void *dlpriv)
-{
- xbv1_t *fwinfo;
- CsrResult r;
-
- fwinfo = kmalloc(sizeof(xbv1_t), GFP_KERNEL);
- if (fwinfo == NULL)
- {
- unifi_error(card->ospriv, "Failed to allocate memory for firmware\n");
- return CSR_WIFI_HIP_RESULT_NO_MEMORY;
- }
-
- /*
- * Scan the firmware file to find the TLVs we are interested in.
- * These are:
- * - check we support the file format version in VERF
- * - SLTP Symbol Lookup Table Pointer
- * - FWDL firmware download segments
- * - FWOV firmware overlay segment
- * - VMEQ Register probe tests to verify matching h/w
- */
- r = xbv1_parse(card, unifi_fw_read, dlpriv, fwinfo);
- if (r != CSR_RESULT_SUCCESS || fwinfo->mode != xbv_firmware)
- {
- unifi_error(card->ospriv, "File type is %s, expected firmware.\n",
- fwinfo->mode == xbv_patch?"patch" : "unknown");
- kfree(fwinfo);
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- /* UF6xxx doesn't accept firmware, only patches. Therefore we convert
- * the file to patch format with version numbers matching the current
- * running firmware, and then download via the patch mechanism.
- * The sole purpose of this is to support production test firmware across
- * different ROM releases, the test firmware being provided in non-patch
- * format.
- */
- if (card->chip_id > SDIO_CARD_ID_UNIFI_2)
- {
- unifi_info(card->ospriv, "Must convert f/w to patch format\n");
- r = do_patch_convert_download(card, dlpriv, fwinfo);
- }
- else
- {
- /* Older UniFi chips allowed firmware to be directly loaded onto the
- * chip, which is no longer supported.
- */
- unifi_error(card->ospriv, "Only patch downloading supported\n");
- r = CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- kfree(fwinfo);
- return r;
-} /* unifi_dl_firmware() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_dl_patch
- *
- * Load the given patch set into UniFi.
- *
- * Arguments:
- * card Pointer to card struct
- * dlpriv The os specific handle to the firmware file.
- * boot_ctrl The address of the boot loader control structure.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success,
- * CSR_WIFI_HIP_RESULT_NO_MEMORY memory allocation failed
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE error in XBV file
- * CSR_RESULT_FAILURE SDIO error
- *
- * Notes:
- * This ends up telling UniFi to restart.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_dl_patch(card_t *card, void *dlpriv, u32 boot_ctrl)
-{
- xbv1_t *fwinfo;
- CsrResult r;
-
- unifi_info(card->ospriv, "unifi_dl_patch %p %08x\n", dlpriv, boot_ctrl);
-
- fwinfo = kmalloc(sizeof(xbv1_t), GFP_KERNEL);
- if (fwinfo == NULL)
- {
- unifi_error(card->ospriv, "Failed to allocate memory for patches\n");
- return CSR_WIFI_HIP_RESULT_NO_MEMORY;
- }
-
- /*
- * Scan the firmware file to find the TLVs we are interested in.
- * These are:
- * - check we support the file format version in VERF
- * - FWID The build ID of the ROM that we can patch
- * - PTDL patch download segments
- */
- r = xbv1_parse(card, unifi_fw_read, dlpriv, fwinfo);
- if (r != CSR_RESULT_SUCCESS || fwinfo->mode != xbv_patch)
- {
- kfree(fwinfo);
- unifi_error(card->ospriv, "Failed to read in patch file\n");
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- /*
- * We have to check the build id read from the SLUT against that
- * for the patch file. They have to match exactly.
- * "card->build_id" == XBV1.PTCH.FWID
- */
- if (card->build_id != fwinfo->build_id)
- {
- unifi_error(card->ospriv, "Wrong patch file for chip (chip = %lu, file = %lu)\n",
- card->build_id, fwinfo->build_id);
- kfree(fwinfo);
-#ifndef CSR_WIFI_IGNORE_PATCH_VERSION_MISMATCH
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
-#else
- fwinfo = NULL;
- dlpriv = NULL;
- return CSR_RESULT_SUCCESS;
-#endif
- }
-
- r = do_patch_download(card, dlpriv, fwinfo, boot_ctrl);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to patch image\n");
- }
-
- kfree(fwinfo);
-
- return r;
-} /* unifi_dl_patch() */
-
-
-void* unifi_dl_fw_read_start(card_t *card, s8 is_fw)
-{
- card_info_t card_info;
-
- unifi_card_info(card, &card_info);
- unifi_trace(card->ospriv, UDBG5,
- "id=%d, ver=0x%x, fw_build=%u, fw_hip=0x%x, block_size=%d\n",
- card_info.chip_id, card_info.chip_version,
- card_info.fw_build, card_info.fw_hip_version,
- card_info.sdio_block_size);
-
- return unifi_fw_read_start(card->ospriv, is_fw, &card_info);
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * safe_read_shared_location
- *
- * Read a shared memory location repeatedly until we get two readings
- * the same.
- *
- * Arguments:
- * card Pointer to card context struct.
- * unifi_addr UniFi shared-data-memory address to access.
- * pdata Pointer to a byte variable for the value read.
- *
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, CSR error code on failure
- * ---------------------------------------------------------------------------
- */
-static CsrResult safe_read_shared_location(card_t *card, u32 address, u8 *pdata)
-{
- CsrResult r;
- u16 limit = 1000;
- u8 b, b2;
-
- *pdata = 0;
-
- r = unifi_read_8_or_16(card, address, &b);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- while (limit--)
- {
- r = unifi_read_8_or_16(card, address, &b2);
- if (r != CSR_RESULT_SUCCESS)
- {
- return r;
- }
-
- /* When we have a stable value, return it */
- if (b == b2)
- {
- *pdata = b;
- return CSR_RESULT_SUCCESS;
- }
-
- b = b2;
- }
-
- return CSR_RESULT_FAILURE;
-} /* safe_read_shared_location() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_do_loader_op
- *
- * Send a loader / boot_loader command to the UniFi and wait for
- * it to complete.
- *
- * Arguments:
- * card Pointer to card context struct.
- * op_addr The address of the loader operation control word.
- * opcode The operation to perform.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success
- * CSR_RESULT_FAILURE SDIO error or SDIO/XAP timeout
- * ---------------------------------------------------------------------------
- */
-
-/*
- * Ideally instead of sleeping, we want to busy wait.
- * Currently there is no framework API to do this. When it becomes available,
- * we can use it to busy wait using usecs
- */
-#define OPERATION_TIMEOUT_LOOPS (100) /* when OPERATION_TIMEOUT_DELAY==1, (500) otherwise */
-#define OPERATION_TIMEOUT_DELAY 1 /* msec, or 200usecs */
-
-CsrResult unifi_do_loader_op(card_t *card, u32 op_addr, u8 opcode)
-{
- CsrResult r;
- s16 op_retries;
-
- unifi_trace(card->ospriv, UDBG4, "Loader cmd 0x%0x -> 0x%08x\n", opcode, op_addr);
-
- /* Set the Operation command byte to the opcode */
- r = unifi_write_8_or_16(card, op_addr, opcode);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to write loader copy command\n");
- return r;
- }
-
- /* Wait for Operation command byte to be Idle */
- /* Typically takes ~100us */
- op_retries = 0;
- r = CSR_RESULT_SUCCESS;
- while (1)
- {
- u8 op;
-
- /*
- * Read the memory location until two successive reads give
- * the same value.
- * Then handle it.
- */
- r = safe_read_shared_location(card, op_addr, &op);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to read loader status\n");
- break;
- }
-
- if (op == UNIFI_LOADER_IDLE)
- {
- /* Success */
- break;
- }
-
- if (op != opcode)
- {
- unifi_error(card->ospriv, "Error reported by loader: 0x%X\n", op);
- r = CSR_RESULT_FAILURE;
- break;
- }
-
- /* Allow 500us timeout */
- if (++op_retries >= OPERATION_TIMEOUT_LOOPS)
- {
- unifi_error(card->ospriv, "Timeout waiting for loader to ack transfer\n");
- /* Stop XAPs to aid post-mortem */
- r = unifi_card_stop_processor(card, UNIFI_PROC_BOTH);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to stop UniFi processors\n");
- }
- else
- {
- r = CSR_RESULT_FAILURE;
- }
- break;
- }
- CsrThreadSleep(OPERATION_TIMEOUT_DELAY);
- } /* Loop exits with r != CSR_RESULT_SUCCESS on error */
-
- return r;
-} /* unifi_do_loader_op() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * send_ptdl_to_unifi
- *
- * Copy a patch block from userland to the UniFi.
- * This function reads data, 2K at a time, from userland and writes
- * it to the UniFi.
- *
- * Arguments:
- * card A pointer to the card structure
- * dlpriv The os specific handle for the firmware file
- * ptdl A pointer ot the PTDL block
- * handle The buffer handle to use for the xfer
- * op_addr The address of the loader operation control word
- *
- * Returns:
- * Number of bytes sent (Positive) or negative value indicating
- * error code:
- * CSR_WIFI_HIP_RESULT_NO_MEMORY memory allocation failed
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE error in XBV file
- * CSR_RESULT_FAILURE SDIO error
- * ---------------------------------------------------------------------------
- */
-static CsrResult send_ptdl_to_unifi(card_t *card, void *dlpriv,
- const struct PTDL *ptdl, u32 handle,
- u32 op_addr)
-{
- u32 offset;
- u8 *buf;
- s32 data_len;
- u32 write_len;
- CsrResult r;
- const u16 buf_size = 2 * 1024;
-
- offset = ptdl->dl_offset;
- data_len = ptdl->dl_size;
-
- if (data_len > buf_size)
- {
- unifi_error(card->ospriv, "PTDL block is too large (%u)\n",
- ptdl->dl_size);
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- buf = kmalloc(buf_size, GFP_KERNEL);
- if (buf == NULL)
- {
- unifi_error(card->ospriv, "Failed to allocate transfer buffer for firmware download\n");
- return CSR_WIFI_HIP_RESULT_NO_MEMORY;
- }
-
- r = CSR_RESULT_SUCCESS;
-
- if (unifi_fw_read(card->ospriv, dlpriv, offset, buf, data_len) != data_len)
- {
- unifi_error(card->ospriv, "Failed to read from file\n");
- }
- else
- {
- /* We can always round these if the host wants to */
- if (card->sdio_io_block_pad)
- {
- write_len = (data_len + (card->sdio_io_block_size - 1)) &
- ~(card->sdio_io_block_size - 1);
-
- /* Zero out the rest of the buffer (This isn't needed, but it
- * makes debugging things later much easier). */
- memset(buf + data_len, 0, write_len - data_len);
- }
- else
- {
- write_len = data_len;
- }
-
- r = unifi_bulk_rw_noretry(card, handle, buf, write_len, UNIFI_SDIO_WRITE);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "CMD53 failed writing %d bytes to handle %ld\n",
- data_len, handle);
- }
- else
- {
- /*
- * Can change the order of things to overlap read from file
- * with copy to unifi
- */
- r = unifi_do_loader_op(card, op_addr, UNIFI_BOOT_LOADER_PATCH);
- }
- }
-
- kfree(buf);
-
- if (r != CSR_RESULT_SUCCESS && r != CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- unifi_error(card->ospriv, "Failed to copy block of %u bytes to UniFi\n",
- ptdl->dl_size);
- }
-
- return r;
-} /* send_ptdl_to_unifi() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * do_patch_download
- *
- * This function downloads a set of patches to UniFi and then
- * causes it to restart.
- *
- * Arguments:
- * card Pointer to card struct.
- * dlpriv A context pointer from the calling function to be
- * used when reading the XBV file. This can be NULL
- * in which case not patches are applied.
- * pfwinfo Pointer to a fwinfo struct describing the f/w
- * XBV file.
- * boot_ctrl_addr The address of the boot loader control structure.
- *
- * Returns:
- * 0 on success, or an error code
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE for a bad laoader version number
- * ---------------------------------------------------------------------------
- */
-static CsrResult do_patch_download(card_t *card, void *dlpriv, xbv1_t *pfwinfo, u32 boot_ctrl_addr)
-{
- CsrResult r;
- s32 i;
- u16 loader_version;
- u16 handle;
- u32 total_bytes;
-
- /*
- * Read info from the SDIO Loader Control Data Structure
- */
- /* Check the loader version */
- r = unifi_card_read16(card, boot_ctrl_addr, &loader_version);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Patch download: Failed to read loader version\n");
- return r;
- }
- unifi_trace(card->ospriv, UDBG2, "Patch download: boot loader version 0x%04X\n", loader_version);
- switch (loader_version)
- {
- case 0x0000:
- break;
-
- default:
- unifi_error(card->ospriv, "Patch loader version (0x%04X) is not supported by this driver\n",
- loader_version);
- return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
-
- /* Retrieve the handle to use with CMD53 */
- r = unifi_card_read16(card, boot_ctrl_addr + 4, &handle);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Patch download: Failed to read loader handle\n");
- return r;
- }
-
- /* Set the mask of LEDs to flash */
- if (card->loader_led_mask)
- {
- r = unifi_card_write16(card, boot_ctrl_addr + 2,
- (u16)card->loader_led_mask);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Patch download: Failed to write LED mask\n");
- return r;
- }
- }
-
- total_bytes = 0;
-
- /* Copy download data to UniFi memory */
- for (i = 0; i < pfwinfo->num_ptdl; i++)
- {
- unifi_trace(card->ospriv, UDBG3, "Patch download: %d Downloading for %d from offset %d\n",
- i,
- pfwinfo->ptdl[i].dl_size,
- pfwinfo->ptdl[i].dl_offset);
-
- r = send_ptdl_to_unifi(card, dlpriv, &pfwinfo->ptdl[i],
- handle, boot_ctrl_addr + 6);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- return r;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Patch failed after %u bytes\n",
- total_bytes);
- return r;
- }
- total_bytes += pfwinfo->ptdl[i].dl_size;
- }
-
- return CSR_RESULT_SUCCESS;
-} /* do_patch_download() */
-
-
diff --git a/drivers/staging/csr/csr_wifi_hip_dump.c b/drivers/staging/csr/csr_wifi_hip_dump.c
deleted file mode 100644
index 7b7eec49d028..000000000000
--- a/drivers/staging/csr/csr_wifi_hip_dump.c
+++ /dev/null
@@ -1,837 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2012
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-/*
- * ---------------------------------------------------------------------------
- * FILE: csr_wifi_hip_dump.c
- *
- * PURPOSE:
- * Routines for retrieving and buffering core status from the UniFi
- *
- * ---------------------------------------------------------------------------
- */
-#include <linux/slab.h>
-#include "csr_wifi_hip_unifi.h"
-#include "csr_wifi_hip_unifiversion.h"
-#include "csr_wifi_hip_card.h"
-
-/* Locations to capture in dump (XAP words) */
-#define HIP_CDUMP_FIRST_CPUREG (0xFFE0) /* First CPU register */
-#define HIP_CDUMP_FIRST_LO (0) /* Start of low address range */
-#define HIP_CDUMP_FIRST_HI_MAC (0x3C00) /* Start of MAC high area */
-#define HIP_CDUMP_FIRST_HI_PHY (0x1C00) /* Start of PHY high area */
-#define HIP_CDUMP_FIRST_SH (0) /* Start of shared memory area */
-
-#define HIP_CDUMP_NCPUREGS (10) /* No. of 16-bit XAP registers */
-#define HIP_CDUMP_NWORDS_LO (0x0100) /* Low area size in 16-bit words */
-#define HIP_CDUMP_NWORDS_HI (0x0400) /* High area size in 16-bit words */
-#define HIP_CDUMP_NWORDS_SH (0x0500) /* Shared memory area size, 16-bit words */
-
-#define HIP_CDUMP_NUM_ZONES 7 /* Number of UniFi memory areas to capture */
-
-/* Mini-coredump state */
-typedef struct coredump_buf
-{
- u16 count; /* serial number of dump */
- u32 timestamp; /* host's system time at capture */
- s16 requestor; /* request: 0=auto dump, 1=manual */
- u16 chip_ver;
- u32 fw_ver;
- u16 *zone[HIP_CDUMP_NUM_ZONES];
-
- struct coredump_buf *next; /* circular list */
- struct coredump_buf *prev; /* circular list */
-} coredump_buffer;
-
-/* Structure used to describe a zone of chip memory captured by mini-coredump */
-struct coredump_zone
-{
- unifi_coredump_space_t space; /* XAP memory space this zone covers */
- enum unifi_dbg_processors_select cpu; /* XAP CPU core selector */
- u32 gp; /* Generic Pointer to memory zone on XAP */
- u16 offset; /* 16-bit XAP word offset of zone in memory space */
- u16 length; /* Length of zone in XAP words */
-};
-
-static CsrResult unifi_coredump_from_sdio(card_t *card, coredump_buffer *dump_buf);
-static CsrResult unifi_coredump_read_zones(card_t *card, coredump_buffer *dump_buf);
-static CsrResult unifi_coredump_read_zone(card_t *card, u16 *zone,
- const struct coredump_zone *def);
-static s32 get_value_from_coredump(const coredump_buffer *dump,
- const unifi_coredump_space_t space, const u16 offset);
-
-/* Table of chip memory zones we capture on mini-coredump */
-static const struct coredump_zone zonedef_table[HIP_CDUMP_NUM_ZONES] = {
- { UNIFI_COREDUMP_MAC_REG, UNIFI_PROC_MAC, UNIFI_MAKE_GP(REGISTERS, HIP_CDUMP_FIRST_CPUREG * 2), HIP_CDUMP_FIRST_CPUREG, HIP_CDUMP_NCPUREGS },
- { UNIFI_COREDUMP_PHY_REG, UNIFI_PROC_PHY, UNIFI_MAKE_GP(REGISTERS, HIP_CDUMP_FIRST_CPUREG * 2), HIP_CDUMP_FIRST_CPUREG, HIP_CDUMP_NCPUREGS },
- { UNIFI_COREDUMP_SH_DMEM, UNIFI_PROC_INVALID, UNIFI_MAKE_GP(SH_DMEM, HIP_CDUMP_FIRST_SH * 2), HIP_CDUMP_FIRST_SH, HIP_CDUMP_NWORDS_SH },
- { UNIFI_COREDUMP_MAC_DMEM, UNIFI_PROC_MAC, UNIFI_MAKE_GP(MAC_DMEM, HIP_CDUMP_FIRST_LO * 2), HIP_CDUMP_FIRST_LO, HIP_CDUMP_NWORDS_LO },
- { UNIFI_COREDUMP_MAC_DMEM, UNIFI_PROC_MAC, UNIFI_MAKE_GP(MAC_DMEM, HIP_CDUMP_FIRST_HI_MAC * 2), HIP_CDUMP_FIRST_HI_MAC, HIP_CDUMP_NWORDS_HI },
- { UNIFI_COREDUMP_PHY_DMEM, UNIFI_PROC_PHY, UNIFI_MAKE_GP(PHY_DMEM, HIP_CDUMP_FIRST_LO * 2), HIP_CDUMP_FIRST_LO, HIP_CDUMP_NWORDS_LO },
- { UNIFI_COREDUMP_PHY_DMEM, UNIFI_PROC_PHY, UNIFI_MAKE_GP(PHY_DMEM, HIP_CDUMP_FIRST_HI_PHY * 2), HIP_CDUMP_FIRST_HI_PHY, HIP_CDUMP_NWORDS_HI },
-};
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_coredump_request_at_next_reset
- *
- * Request that a mini-coredump is performed when the driver has
- * completed resetting the UniFi device.
- *
- * Arguments:
- * card Pointer to card struct
- * enable If non-zero, sets the request.
- * If zero, cancels any pending request.
- *
- * Returns:
- * CSR_RESULT_SUCCESS or CSR HIP error code
- *
- * Notes:
- * This function is typically called once the driver has detected that
- * the UniFi device has become unresponsive due to crash, or internal
- * watchdog reset. The driver must reset it to regain communication and,
- * immediately after that, the mini-coredump can be captured.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_coredump_request_at_next_reset(card_t *card, s8 enable)
-{
- CsrResult r;
-
- if (enable)
- {
- unifi_trace(card->ospriv, UDBG2, "Mini-coredump requested after reset\n");
- }
-
- if (card == NULL)
- {
- r = CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
- else
- {
- card->request_coredump_on_reset = enable?1 : 0;
- r = CSR_RESULT_SUCCESS;
- }
-
- return r;
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_coredump_handle_request
- *
- * Performs a coredump now, if one was requested, and clears the request.
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * CSR_RESULT_SUCCESS or CSR HIP error code
- *
- * Notes:
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_coredump_handle_request(card_t *card)
-{
- CsrResult r = CSR_RESULT_SUCCESS;
-
- if (card == NULL)
- {
- r = CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- }
- else
- {
- if (card->request_coredump_on_reset == 1)
- {
- card->request_coredump_on_reset = 0;
- r = unifi_coredump_capture(card, NULL);
- }
- }
-
- return r;
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_coredump_capture
- *
- * Capture the current status of the UniFi device.
- * Various registers are buffered for future offline inspection.
- *
- * Arguments:
- * card Pointer to card struct
- * req Pointer to request struct, or NULL:
- * A coredump requested manually by the user app
- * will have a request struct pointer, an automatic
- * coredump will have a NULL pointer.
- * Returns:
- * CSR_RESULT_SUCCESS on success,
- * CSR_RESULT_FAILURE SDIO error
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE Initialisation not complete
- *
- * Notes:
- * The result is a filled entry in the circular buffer of core dumps,
- * values from which can be extracted to userland via an ioctl.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_coredump_capture(card_t *card, struct unifi_coredump_req *req)
-{
- CsrResult r = CSR_RESULT_SUCCESS;
- static u16 dump_seq_no = 1;
- u32 time_of_capture;
-
- if (card->dump_next_write == NULL)
- {
- r = CSR_RESULT_SUCCESS;
- goto done;
- }
-
- /* Reject forced capture before initialisation has happened */
- if (card->helper == NULL)
- {
- r = CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- goto done;
- }
-
-
- /*
- * Force a mini-coredump capture right now
- */
- time_of_capture = CsrTimeGet(NULL);
- unifi_info(card->ospriv, "Mini-coredump capture at t=%u\n", time_of_capture);
-
- /* Wake up the processors so we can talk to them */
- r = unifi_set_host_state(card, UNIFI_HOST_STATE_AWAKE);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to wake UniFi\n");
- goto done;
- }
- CsrThreadSleep(20);
-
- /* Stop both XAPs */
- unifi_trace(card->ospriv, UDBG4, "Stopping XAPs for coredump capture\n");
- r = unifi_card_stop_processor(card, UNIFI_PROC_BOTH);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to stop UniFi XAPs\n");
- goto done;
- }
-
- /* Dump core into the next available slot in the circular list */
- r = unifi_coredump_from_sdio(card, card->dump_next_write);
- if (r == CSR_RESULT_SUCCESS)
- {
- /* Record whether the dump was manual or automatic */
- card->dump_next_write->requestor = (req?1 : 0);
- card->dump_next_write->timestamp = time_of_capture;
- /* Advance to the next buffer */
- card->dump_next_write->count = dump_seq_no++;
- card->dump_cur_read = card->dump_next_write;
- card->dump_next_write = card->dump_next_write->next;
-
- /* Sequence no. of zero indicates slot not in use, so handle wrap */
- if (dump_seq_no == 0)
- {
- dump_seq_no = 1;
- }
-
- unifi_trace(card->ospriv, UDBG3,
- "Coredump (%p), SeqNo=%d, cur_read=%p, next_write=%p\n",
- req,
- card->dump_cur_read->count,
- card->dump_cur_read, card->dump_next_write);
- }
-
- /* Start both XAPs */
- unifi_trace(card->ospriv, UDBG4, "Restart XAPs after coredump\n");
- r = card_start_processor(card, UNIFI_PROC_BOTH);
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Failed to start UniFi XAPs\n");
- goto done;
- }
-
-done:
- return r;
-} /* unifi_coredump_capture() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * get_value_from_coredump
- *
- *
- *
- * Arguments:
- * dump Pointer to buffered coredump data
- * offset_in_space XAP memory space to retrieve from the buffer (there
- * may be more than one zone covering the same memory
- * space, but starting from different offsets).
- * offset Offset within the XAP memory space to be retrieved
- *
- * Returns:
- * >=0 Register value on success
- * <0 Register out of range of any captured zones
- *
- * Notes:
- * ---------------------------------------------------------------------------
- */
-static s32 get_value_from_coredump(const coredump_buffer *coreDump,
- const unifi_coredump_space_t space,
- const u16 offset_in_space)
-{
- s32 r = -1;
- u16 offset_in_zone;
- u32 zone_end_offset;
- s32 i;
- const struct coredump_zone *def = &zonedef_table[0];
-
- /* Search zone def table for a match with the requested memory space */
- for (i = 0; i < HIP_CDUMP_NUM_ZONES; i++, def++)
- {
- if (space == def->space)
- {
- zone_end_offset = def->offset + def->length;
-
- /* Is the space offset contained in this zone? */
- if (offset_in_space < zone_end_offset &&
- offset_in_space >= def->offset)
- {
- /* Calculate the offset of data within the zone buffer */
- offset_in_zone = offset_in_space - def->offset;
- r = (s32) * (coreDump->zone[i] + offset_in_zone);
-
- unifi_trace(NULL, UDBG6,
- "sp %d, offs 0x%04x = 0x%04x (in z%d 0x%04x->0x%04x)\n",
- space, offset_in_space, r,
- i, def->offset, zone_end_offset - 1);
- break;
- }
- }
- }
- return r;
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_coredump_get_value
- *
- * Retrieve the value of a register buffered from a previous core dump,
- * so that it may be reported back to application code.
- *
- * Arguments:
- * card Pointer to card struct
- * req_reg Pointer to request parameter partially filled. This
- * function puts in the values retrieved from the dump.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, or:
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE Null parameter error
- * CSR_WIFI_HIP_RESULT_RANGE Register out of range
- * CSR_WIFI_HIP_RESULT_NOT_FOUND Dump index not (yet) captured
- *
- * Notes:
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_coredump_get_value(card_t *card, struct unifi_coredump_req *req)
-{
- CsrResult r;
- s32 i = 0;
- coredump_buffer *find_dump = NULL;
-
- if (req == NULL || card == NULL)
- {
- r = CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- goto done;
- }
- req->value = -1;
- if (card->dump_buf == NULL)
- {
- unifi_trace(card->ospriv, UDBG2, "No coredump buffers\n");
- r = CSR_WIFI_HIP_RESULT_NOT_FOUND; /* Coredumping disabled */
- goto done;
- }
- if (card->dump_cur_read == NULL)
- {
- unifi_trace(card->ospriv, UDBG4, "No coredumps captured\n");
- r = CSR_WIFI_HIP_RESULT_NOT_FOUND; /* No coredump yet captured */
- goto done;
- }
-
- /* Find the requested dump buffer */
- switch (req->index)
- {
- case 0: /* Newest */
- find_dump = card->dump_cur_read;
- break;
- case -1: /* Oldest: The next used slot forward */
- for (find_dump = card->dump_cur_read->next;
- (find_dump->count == 0) && (find_dump != card->dump_cur_read);
- find_dump = card->dump_cur_read->next)
- {
- }
- break;
- default: /* Number of steps back from current read position */
- for (i = 0, find_dump = card->dump_cur_read;
- i < req->index;
- i++, find_dump = find_dump->prev)
- {
- /* Walk the list for the index'th entry, but
- * stop when about to wrap. */
- unifi_trace(card->ospriv, UDBG6,
- "%d: %d, @%p, p=%p, n=%p, cr=%p, h=%p\n",
- i, find_dump->count, find_dump, find_dump->prev,
- find_dump->next, card->dump_cur_read, card->dump_buf);
- if (find_dump->prev == card->dump_cur_read)
- {
- /* Wrapped but still not found, index out of range */
- if (i != req->index)
- {
- unifi_trace(card->ospriv, UDBG6,
- "Dump index %d not found %d\n", req->index, i);
- r = CSR_WIFI_HIP_RESULT_NOT_FOUND;
- goto done;
- }
- break;
- }
- }
- break;
- }
-
- /* Check if the slot is actually filled with a core dump */
- if (find_dump->count == 0)
- {
- unifi_trace(card->ospriv, UDBG4, "Not captured %d\n", req->index);
- r = CSR_WIFI_HIP_RESULT_NOT_FOUND;
- goto done;
- }
-
- unifi_trace(card->ospriv, UDBG6, "Req index %d, found seq %d at step %d\n",
- req->index, find_dump->count, i);
-
- /* Find the appropriate entry in the buffer */
- req->value = get_value_from_coredump(find_dump, req->space, (u16)req->offset);
- if (req->value < 0)
- {
- r = CSR_WIFI_HIP_RESULT_RANGE; /* Un-captured register */
- unifi_trace(card->ospriv, UDBG4,
- "Can't read space %d, reg 0x%x from coredump buffer %d\n",
- req->space, req->offset, req->index);
- }
- else
- {
- r = CSR_RESULT_SUCCESS;
- }
-
- /* Update the private request structure with the found values */
- req->chip_ver = find_dump->chip_ver;
- req->fw_ver = find_dump->fw_ver;
- req->timestamp = find_dump->timestamp;
- req->requestor = find_dump->requestor;
- req->serial = find_dump->count;
-
-done:
- return r;
-} /* unifi_coredump_get_value() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_coredump_read_zone
- *
- * Captures a UniFi memory zone into a buffer on the host
- *
- * Arguments:
- * card Pointer to card struct
- * zonebuf Pointer to on-host buffer to dump the memory zone into
- * def Pointer to description of the memory zone to read from UniFi.
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, or:
- * CSR_RESULT_FAILURE SDIO error
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE Parameter error
- *
- * Notes:
- * It is assumed that the caller has already stopped the XAPs
- * ---------------------------------------------------------------------------
- */
-static CsrResult unifi_coredump_read_zone(card_t *card, u16 *zonebuf, const struct coredump_zone *def)
-{
- CsrResult r;
-
- if (zonebuf == NULL || def == NULL)
- {
- r = CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- goto done;
- }
-
- /* Select XAP CPU if necessary */
- if (def->cpu != UNIFI_PROC_INVALID)
- {
- if (def->cpu != UNIFI_PROC_MAC && def->cpu != UNIFI_PROC_PHY)
- {
- r = CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- goto done;
- }
- r = unifi_set_proc_select(card, def->cpu);
- if (r != CSR_RESULT_SUCCESS)
- {
- goto done;
- }
- }
-
- unifi_trace(card->ospriv, UDBG4,
- "Dump sp %d, offs 0x%04x, 0x%04x words @GP=%08x CPU %d\n",
- def->space, def->offset, def->length, def->gp, def->cpu);
-
- /* Read on-chip RAM (byte-wise) */
- r = unifi_card_readn(card, def->gp, zonebuf, (u16)(def->length * 2));
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- goto done;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Can't read UniFi shared data area\n");
- goto done;
- }
-
-done:
- return r;
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_coredump_read_zones
- *
- * Walks through the table of on-chip memory zones defined in zonedef_table,
- * and reads each of them from the UniFi chip
- *
- * Arguments:
- * card Pointer to card struct
- * dump_buf Buffer into which register values will be dumped
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, or:
- * CSR_RESULT_FAILURE SDIO error
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE Parameter error
- *
- * Notes:
- * It is assumed that the caller has already stopped the XAPs
- * ---------------------------------------------------------------------------
- */
-static CsrResult unifi_coredump_read_zones(card_t *card, coredump_buffer *dump_buf)
-{
- CsrResult r = CSR_RESULT_SUCCESS;
- s32 i;
-
- /* Walk the table of coredump zone definitions and read them from the chip */
- for (i = 0;
- (i < HIP_CDUMP_NUM_ZONES) && (r == 0);
- i++)
- {
- r = unifi_coredump_read_zone(card, dump_buf->zone[i], &zonedef_table[i]);
- }
-
- return r;
-}
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_coredump_from_sdio
- *
- * Capture the status of the UniFi processors, over SDIO
- *
- * Arguments:
- * card Pointer to card struct
- * reg_buffer Buffer into which register values will be dumped
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, or:
- * CSR_RESULT_FAILURE SDIO error
- * CSR_WIFI_HIP_RESULT_INVALID_VALUE Parameter error
- *
- * Notes:
- * ---------------------------------------------------------------------------
- */
-static CsrResult unifi_coredump_from_sdio(card_t *card, coredump_buffer *dump_buf)
-{
- u16 val;
- CsrResult r;
- u32 sdio_addr;
-
- if (dump_buf == NULL)
- {
- r = CSR_WIFI_HIP_RESULT_INVALID_VALUE;
- goto done;
- }
-
-
- /* Chip and firmware version */
- unifi_trace(card->ospriv, UDBG4, "Get chip version\n");
- sdio_addr = 2 * ChipHelper_GBL_CHIP_VERSION(card->helper);
- if (sdio_addr != 0)
- {
- r = unifi_read_direct16(card, sdio_addr, &val);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- goto done;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Can't read GBL_CHIP_VERSION\n");
- goto done;
- }
- }
- dump_buf->chip_ver = val;
- dump_buf->fw_ver = card->build_id;
-
- unifi_trace(card->ospriv, UDBG4, "chip_ver 0x%04x, fw_ver %u\n",
- dump_buf->chip_ver, dump_buf->fw_ver);
-
- /* Capture the memory zones required from UniFi */
- r = unifi_coredump_read_zones(card, dump_buf);
- if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
- {
- goto done;
- }
- if (r != CSR_RESULT_SUCCESS)
- {
- unifi_error(card->ospriv, "Can't read UniFi memory areas\n");
- goto done;
- }
-
-done:
- return r;
-} /* unifi_coredump_from_sdio() */
-
-
-#ifndef UNIFI_DISABLE_COREDUMP
-/*
- * ---------------------------------------------------------------------------
- * new_coredump_node
- *
- * Allocates a coredump linked-list node, and links it to the previous.
- *
- * Arguments:
- * ospriv OS context
- * prevnode Previous node to link into
- *
- * Returns:
- * Pointer to valid coredump_buffer on success
- * NULL on memory allocation failure
- *
- * Notes:
- * Allocates "all or nothing"
- * ---------------------------------------------------------------------------
- */
-static
-coredump_buffer* new_coredump_node(void *ospriv, coredump_buffer *prevnode)
-{
- coredump_buffer *newnode = NULL;
- u16 *newzone = NULL;
- s32 i;
- u32 zone_size;
-
- /* Allocate node header */
- newnode = kzalloc(sizeof(coredump_buffer), GFP_KERNEL);
- if (newnode == NULL)
- {
- return NULL;
- }
-
- /* Allocate chip memory zone capture buffers */
- for (i = 0; i < HIP_CDUMP_NUM_ZONES; i++)
- {
- zone_size = sizeof(u16) * zonedef_table[i].length;
- newzone = kzalloc(zone_size, GFP_KERNEL);
- newnode->zone[i] = newzone;
- if (newzone == NULL)
- {
- unifi_error(ospriv, "Out of memory on coredump zone %d (%d words)\n",
- i, zonedef_table[i].length);
- break;
- }
- }
-
- /* Clean up if any zone alloc failed */
- if (newzone == NULL)
- {
- for (i = 0; newnode->zone[i] != NULL; i++)
- {
- kfree(newnode->zone[i]);
- newnode->zone[i] = NULL;
- }
- }
-
- /* Link to previous node */
- newnode->prev = prevnode;
- if (prevnode)
- {
- prevnode->next = newnode;
- }
- newnode->next = NULL;
-
- return newnode;
-}
-
-
-#endif /* UNIFI_DISABLE_COREDUMP */
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_coredump_init
- *
- * Allocates buffers for the automatic SDIO core dump
- *
- * Arguments:
- * card Pointer to card struct
- * num_dump_buffers Number of buffers to reserve for coredumps
- *
- * Returns:
- * CSR_RESULT_SUCCESS on success, or:
- * CSR_WIFI_HIP_RESULT_NO_MEMORY memory allocation failed
- *
- * Notes:
- * Allocates space in advance, to be used for the last n coredump buffers
- * the intention being that the size is sufficient for at least one dump,
- * probably several.
- * It's probably advisable to have at least 2 coredump buffers to allow
- * one to be enquired with the unifi_coredump tool, while leaving another
- * free for capturing.
- * ---------------------------------------------------------------------------
- */
-CsrResult unifi_coredump_init(card_t *card, u16 num_dump_buffers)
-{
-#ifndef UNIFI_DISABLE_COREDUMP
- void *ospriv = card->ospriv;
- coredump_buffer *prev = NULL;
- coredump_buffer *newnode = NULL;
- u32 i = 0;
-#endif
-
- card->request_coredump_on_reset = 0;
- card->dump_next_write = NULL;
- card->dump_cur_read = NULL;
- card->dump_buf = NULL;
-
-#ifndef UNIFI_DISABLE_COREDUMP
- unifi_trace(ospriv, UDBG1,
- "Allocate buffers for %d core dumps\n", num_dump_buffers);
- if (num_dump_buffers == 0)
- {
- goto done;
- }
-
- /* Root node */
- card->dump_buf = new_coredump_node(ospriv, NULL);
- if (card->dump_buf == NULL)
- {
- goto fail;
- }
- prev = card->dump_buf;
- newnode = card->dump_buf;
-
- /* Add each subsequent node at tail */
- for (i = 1; i < num_dump_buffers; i++)
- {
- newnode = new_coredump_node(ospriv, prev);
- if (newnode == NULL)
- {
- goto fail;
- }
- prev = newnode;
- }
-
- /* Link the first and last nodes to make the list circular */
- card->dump_buf->prev = newnode;
- newnode->next = card->dump_buf;
-
- /* Set initial r/w access pointers */
- card->dump_next_write = card->dump_buf;
- card->dump_cur_read = NULL;
-
- unifi_trace(ospriv, UDBG2, "Core dump configured (%d dumps max)\n", i);
-
-done:
-#endif
- return CSR_RESULT_SUCCESS;
-
-#ifndef UNIFI_DISABLE_COREDUMP
-fail:
- /* Unwind what we allocated so far */
- unifi_error(ospriv, "Out of memory allocating core dump node %d\n", i);
- unifi_coredump_free(card);
- return CSR_WIFI_HIP_RESULT_NO_MEMORY;
-#endif
-} /* unifi_coreump_init() */
-
-
-/*
- * ---------------------------------------------------------------------------
- * unifi_coredump_free
- *
- * Free all memory dynamically allocated for core dump
- *
- * Arguments:
- * card Pointer to card struct
- *
- * Returns:
- * None
- *
- * Notes:
- * ---------------------------------------------------------------------------
- */
-void unifi_coredump_free(card_t *card)
-{
- void *ospriv = card->ospriv;
- coredump_buffer *node, *del_node;
- s16 i = 0;
- s16 j;
-
- unifi_trace(ospriv, UDBG2, "Core dump de-configured\n");
-
- if (card->dump_buf == NULL)
- {
- return;
- }
-
- node = card->dump_buf;
- do
- {
- /* Free payload zones */
- for (j = 0; j < HIP_CDUMP_NUM_ZONES; j++)
- {
- kfree(node->zone[j]);
- node->zone[j] = NULL;
- }
-
- /* Detach */
- del_node = node;
- node = node->next;
-
- /* Free header */
- kfree(del_node);
- i++;
- } while ((node != NULL) && (node != card->dump_buf));
-
- unifi_trace(ospriv, UDBG3, "Freed %d coredump buffers\n", i);
-
- card->dump_buf = NULL;
- card->dump_next_write = NULL;
- card->dump_cur_read = NULL;
-} /* unifi_coredump_free() */
-
-
diff --git a/drivers/staging/csr/csr_wifi_hip_packing.c b/drivers/staging/csr/csr_wifi_hip_packing.c
deleted file mode 100644
index 0768aefc6d1f..000000000000
--- a/drivers/staging/csr/csr_wifi_hip_packing.c
+++ /dev/null
@@ -1,4804 +0,0 @@
-/*****************************************************************************
-
- (c) Cambridge Silicon Radio Limited 2011
- All rights reserved and confidential information of CSR
-
- Refer to LICENSE.txt included with this source for details
- on the license terms.
-
-*****************************************************************************/
-
-/* Note: this is an auto-generated file. */
-
-#include "csr_wifi_hip_signals.h"
-#include "csr_wifi_hip_unifi.h"
-#include "csr_wifi_hip_conversions.h"
-
-
-/*
- * ---------------------------------------------------------------------------
- * get_packed_struct_size
- *
- * Examine a buffer containing a UniFi signal in wire-format.
- * The first two bytes contain the signal ID, decode the signal ID and
- * return the size, in bytes, of the signal, not including any bulk
- * data.
- *
- * WARNING: This function is auto-generated, DO NOT EDIT!
- *
- * Arguments:
- * buf Pointer to buffer to decode.
- *
- * Returns:
- * 0 if the signal ID is not recognised (i.e. zero length),
- * otherwise the number of bytes occupied by the signal in the buffer.
- * This is useful for stepping past the signal to the object in the buffer.
- * ---------------------------------------------------------------------------
- */
-s32 get_packed_struct_size(const u8 *buf)
-{
- s32 size = 0;
- u16 sig_id;
-
- sig_id = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(buf);
-
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- switch (sig_id)
- {
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_SET_PACKET_FILTER_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_SETKEYS_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_CONFIG_QUEUE_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_ADD_AUTONOMOUS_SCAN_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_ADD_BLACKOUT_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_DEL_BLACKOUT_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_GET_KEY_SEQUENCE_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_SM_START_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_STOP_AGGREGATION_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_DEL_TSPEC_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
- case CSR_DEBUG_WORD16_INDICATION_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
- case CSR_DEBUG_GENERIC_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
- case CSR_MA_PACKET_INDICATION_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT64;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
- case CSR_MLME_SET_TIM_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_CONNECTED_INDICATION_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_DEL_RX_TRIGGER_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_TRIGGERED_GET_INDICATION_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_SCAN_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT32;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_DELETEKEYS_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_GET_NEXT_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_SET_CHANNEL_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_START_AGGREGATION_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_HL_SYNC_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- break;
-#endif
- case CSR_DEBUG_GENERIC_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_LEAVE_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_DEL_TRIGGERED_GET_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_ADD_MULTICAST_ADDRESS_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_RESET_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_SCAN_CANCEL_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_ADD_TRIGGERED_GET_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_SET_PACKET_FILTER_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT32;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_DEL_RX_TRIGGER_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_CONNECT_STATUS_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_LEAVE_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_CONFIG_QUEUE_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_DEL_TSPEC_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
- case CSR_MLME_SET_TIM_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_MEASURE_INDICATION_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_DEL_BLACKOUT_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_DEL_TRIGGERED_GET_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
- case CSR_DEBUG_GENERIC_INDICATION_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
- case CSR_MA_PACKET_CANCEL_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT32;
- break;
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_MODIFY_BSS_PARAMETER_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_PAUSE_AUTONOMOUS_SCAN_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
- case CSR_MA_PACKET_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT32;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- size += SIZEOF_UINT16;
- break;
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_MODIFY_BSS_PARAMETER_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_ADD_RX_TRIGGER_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
- case CSR_MA_VIF_AVAILABILITY_INDICATION_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_HL_SYNC_CANCEL_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_DEL_AUTONOMOUS_SCAN_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_BLACKOUT_ENDED_INDICATION_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_AUTONOMOUS_SCAN_DONE_INDICATION_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_GET_KEY_SEQUENCE_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_SET_CHANNEL_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_MEASURE_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_ADD_TRIGGERED_GET_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_AUTONOMOUS_SCAN_LOSS_INDICATION_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- break;
-#endif
- case CSR_MA_VIF_AVAILABILITY_RESPONSE_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_ADD_TEMPLATE_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_POWERMGT_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_ADD_PERIODIC_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_GET_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_GET_NEXT_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_STOP_AGGREGATION_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_ADD_RX_TRIGGER_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_ADD_BLACKOUT_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT32;
- size += SIZEOF_UINT32;
- size += SIZEOF_UINT32;
- size += 48 / 8;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_DELETEKEYS_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_RESET_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_HL_SYNC_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_ADD_AUTONOMOUS_SCAN_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT32;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_SET_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_SM_START_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- size += 48 / 8;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_CONNECT_STATUS_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_DEL_AUTONOMOUS_SCAN_CONFIRM_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_DEL_PERIODIC_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_SETKEYS_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 32 / 8;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_PAUSE_AUTONOMOUS_SCAN_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_GET_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
-#ifdef CSR_WIFI_HIP_FULL_SIGNAL_SET
- case CSR_MLME_POWERMGT_REQUEST_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- break;
-#endif
- case CSR_MA_PACKET_ERROR_INDICATION_ID:
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += SIZEOF_UINT16;
- size += 48 / 8;
- size += SIZEOF_UIN