|
@@ -24,11 +24,12 @@
|
|
|
#include <linux/interrupt.h>
|
|
|
#include <linux/irq.h>
|
|
|
#include <linux/module.h>
|
|
|
+#include <linux/slab.h>
|
|
|
+#include <linux/swab.h>
|
|
|
#include <linux/crc7.h>
|
|
|
#include <linux/spi/spi.h>
|
|
|
#include <linux/wl12xx.h>
|
|
|
#include <linux/platform_device.h>
|
|
|
-#include <linux/slab.h>
|
|
|
|
|
|
#include "wlcore.h"
|
|
|
#include "wl12xx_80211.h"
|
|
@@ -110,18 +111,16 @@ static void wl12xx_spi_reset(struct device *child)
|
|
|
static void wl12xx_spi_init(struct device *child)
|
|
|
{
|
|
|
struct wl12xx_spi_glue *glue = dev_get_drvdata(child->parent);
|
|
|
- u8 crc[WSPI_INIT_CMD_CRC_LEN], *cmd;
|
|
|
struct spi_transfer t;
|
|
|
struct spi_message m;
|
|
|
+ u8 *cmd = kzalloc(WSPI_INIT_CMD_LEN, GFP_KERNEL);
|
|
|
|
|
|
- cmd = kzalloc(WSPI_INIT_CMD_LEN, GFP_KERNEL);
|
|
|
if (!cmd) {
|
|
|
dev_err(child->parent,
|
|
|
"could not allocate cmd for spi init\n");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- memset(crc, 0, sizeof(crc));
|
|
|
memset(&t, 0, sizeof(t));
|
|
|
spi_message_init(&m);
|
|
|
|
|
@@ -129,29 +128,29 @@ static void wl12xx_spi_init(struct device *child)
|
|
|
* Set WSPI_INIT_COMMAND
|
|
|
* the data is being send from the MSB to LSB
|
|
|
*/
|
|
|
- cmd[2] = 0xff;
|
|
|
- cmd[3] = 0xff;
|
|
|
- cmd[1] = WSPI_INIT_CMD_START | WSPI_INIT_CMD_TX;
|
|
|
- cmd[0] = 0;
|
|
|
- cmd[7] = 0;
|
|
|
- cmd[6] |= HW_ACCESS_WSPI_INIT_CMD_MASK << 3;
|
|
|
- cmd[6] |= HW_ACCESS_WSPI_FIXED_BUSY_LEN & WSPI_INIT_CMD_FIXEDBUSY_LEN;
|
|
|
+ cmd[0] = 0xff;
|
|
|
+ cmd[1] = 0xff;
|
|
|
+ cmd[2] = WSPI_INIT_CMD_START | WSPI_INIT_CMD_TX;
|
|
|
+ cmd[3] = 0;
|
|
|
+ cmd[4] = 0;
|
|
|
+ cmd[5] = HW_ACCESS_WSPI_INIT_CMD_MASK << 3;
|
|
|
+ cmd[5] |= HW_ACCESS_WSPI_FIXED_BUSY_LEN & WSPI_INIT_CMD_FIXEDBUSY_LEN;
|
|
|
+
|
|
|
+ cmd[6] = WSPI_INIT_CMD_IOD | WSPI_INIT_CMD_IP | WSPI_INIT_CMD_CS
|
|
|
+ | WSPI_INIT_CMD_WSPI | WSPI_INIT_CMD_WS;
|
|
|
|
|
|
if (HW_ACCESS_WSPI_FIXED_BUSY_LEN == 0)
|
|
|
- cmd[5] |= WSPI_INIT_CMD_DIS_FIXEDBUSY;
|
|
|
+ cmd[6] |= WSPI_INIT_CMD_DIS_FIXEDBUSY;
|
|
|
else
|
|
|
- cmd[5] |= WSPI_INIT_CMD_EN_FIXEDBUSY;
|
|
|
+ cmd[6] |= WSPI_INIT_CMD_EN_FIXEDBUSY;
|
|
|
|
|
|
- cmd[5] |= WSPI_INIT_CMD_IOD | WSPI_INIT_CMD_IP | WSPI_INIT_CMD_CS
|
|
|
- | WSPI_INIT_CMD_WSPI | WSPI_INIT_CMD_WS;
|
|
|
-
|
|
|
- crc[0] = cmd[1];
|
|
|
- crc[1] = cmd[0];
|
|
|
- crc[2] = cmd[7];
|
|
|
- crc[3] = cmd[6];
|
|
|
- crc[4] = cmd[5];
|
|
|
-
|
|
|
- cmd[4] = crc7_be(0, crc, WSPI_INIT_CMD_CRC_LEN) | WSPI_INIT_CMD_END;
|
|
|
+ cmd[7] = crc7_be(0, cmd+2, WSPI_INIT_CMD_CRC_LEN) | WSPI_INIT_CMD_END;
|
|
|
+ /*
|
|
|
+ * The above is the logical order; it must actually be stored
|
|
|
+ * in the buffer byte-swapped.
|
|
|
+ */
|
|
|
+ __swab32s((u32 *)cmd);
|
|
|
+ __swab32s((u32 *)cmd+1);
|
|
|
|
|
|
t.tx_buf = cmd;
|
|
|
t.len = WSPI_INIT_CMD_LEN;
|