wl12xx: reserve buffer for partition command in struct wl12xx
authorKalle Valo <kalle.valo@nokia.com>
Fri, 12 Jun 2009 11:14:41 +0000 (14:14 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 10 Jul 2009 18:57:42 +0000 (14:57 -0400)
This is now DMA safe.

Signed-off-by: Kalle Valo <kalle.valo@nokia.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/wl12xx/spi.c
drivers/net/wireless/wl12xx/spi.h

index abdf171a47e738613fc1779bae3a512d60c7f415..fb7c52c4d9c4dc91b968d3a0a91635620a5f3a28 100644 (file)
@@ -167,24 +167,26 @@ void wl12xx_spi_init(struct wl12xx *wl)
  *                                    |    |
  *
  */
-void wl12xx_set_partition(struct wl12xx *wl,
+int wl12xx_set_partition(struct wl12xx *wl,
                          u32 mem_start, u32 mem_size,
                          u32 reg_start, u32 reg_size)
 {
-       u8 tx_buf[sizeof(u32) + 2 * sizeof(struct wl12xx_partition)];
        struct wl12xx_partition *partition;
        struct spi_transfer t;
        struct spi_message m;
+       size_t len, cmd_len;
        u32 *cmd;
-       size_t len;
        int addr;
 
+       cmd_len = sizeof(u32) + 2 * sizeof(struct wl12xx_partition);
+       cmd = kzalloc(cmd_len, GFP_KERNEL);
+       if (!cmd)
+               return -ENOMEM;
+
        spi_message_init(&m);
        memset(&t, 0, sizeof(t));
-       memset(tx_buf, 0, sizeof(tx_buf));
 
-       cmd = (u32 *) tx_buf;
-       partition = (struct wl12xx_partition *) (tx_buf + sizeof(u32));
+       partition = (struct wl12xx_partition *) (cmd + 1);
        addr = HW_ACCESS_PART0_SIZE_ADDR;
        len = 2 * sizeof(struct wl12xx_partition);
 
@@ -244,11 +246,15 @@ void wl12xx_set_partition(struct wl12xx *wl,
        wl->virtual_mem_addr = 0;
        wl->virtual_reg_addr = mem_size;
 
-       t.tx_buf = tx_buf;
-       t.len = sizeof(tx_buf);
+       t.tx_buf = cmd;
+       t.len = cmd_len;
        spi_message_add_tail(&t, &m);
 
        spi_sync(wl->spi, &m);
+
+       kfree(cmd);
+
+       return 0;
 }
 
 void wl12xx_spi_read(struct wl12xx *wl, int addr, void *buf,
index f3f18958657c72c855c8361d552524b4c7e1be2c..7edb218ee76cab3f60f7b86af7b7333c8fcdbf89 100644 (file)
@@ -88,9 +88,9 @@ void wl12xx_reg_write32(struct wl12xx *wl, int addr, u32 val);
 /* INIT and RESET words */
 void wl12xx_spi_reset(struct wl12xx *wl);
 void wl12xx_spi_init(struct wl12xx *wl);
-void wl12xx_set_partition(struct wl12xx *wl,
-                         u32 part_start, u32 part_size,
-                         u32 reg_start,  u32 reg_size);
+int wl12xx_set_partition(struct wl12xx *wl,
+                        u32 part_start, u32 part_size,
+                        u32 reg_start,  u32 reg_size);
 
 static inline u32 wl12xx_read32(struct wl12xx *wl, int addr)
 {