]> git.karo-electronics.de Git - mv-sheeva.git/blob - drivers/net/wireless/wl12xx/wl1271_boot.c
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[mv-sheeva.git] / drivers / net / wireless / wl12xx / wl1271_boot.c
1 /*
2  * This file is part of wl1271
3  *
4  * Copyright (C) 2008-2009 Nokia Corporation
5  *
6  * Contact: Luciano Coelho <luciano.coelho@nokia.com>
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * version 2 as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20  * 02110-1301 USA
21  *
22  */
23
24 #include <linux/gpio.h>
25
26 #include "wl1271_acx.h"
27 #include "wl1271_reg.h"
28 #include "wl1271_boot.h"
29 #include "wl1271_spi.h"
30 #include "wl1271_event.h"
31
32 static struct wl1271_partition_set part_table[PART_TABLE_LEN] = {
33         [PART_DOWN] = {
34                 .mem = {
35                         .start = 0x00000000,
36                         .size  = 0x000177c0
37                 },
38                 .reg = {
39                         .start = REGISTERS_BASE,
40                         .size  = 0x00008800
41                 },
42                 .mem2 = {
43                         .start = 0x00000000,
44                         .size  = 0x00000000
45                 },
46                 .mem3 = {
47                         .start = 0x00000000,
48                         .size  = 0x00000000
49                 },
50         },
51
52         [PART_WORK] = {
53                 .mem = {
54                         .start = 0x00040000,
55                         .size  = 0x00014fc0
56                 },
57                 .reg = {
58                         .start = REGISTERS_BASE,
59                         .size  = 0x0000a000
60                 },
61                 .mem2 = {
62                         .start = 0x003004f8,
63                         .size  = 0x00000004
64                 },
65                 .mem3 = {
66                         .start = 0x00040404,
67                         .size  = 0x00000000
68                 },
69         },
70
71         [PART_DRPW] = {
72                 .mem = {
73                         .start = 0x00040000,
74                         .size  = 0x00014fc0
75                 },
76                 .reg = {
77                         .start = DRPW_BASE,
78                         .size  = 0x00006000
79                 },
80                 .mem2 = {
81                         .start = 0x00000000,
82                         .size  = 0x00000000
83                 },
84                 .mem3 = {
85                         .start = 0x00000000,
86                         .size  = 0x00000000
87                 }
88         }
89 };
90
91 static void wl1271_boot_set_ecpu_ctrl(struct wl1271 *wl, u32 flag)
92 {
93         u32 cpu_ctrl;
94
95         /* 10.5.0 run the firmware (I) */
96         cpu_ctrl = wl1271_spi_read32(wl, ACX_REG_ECPU_CONTROL);
97
98         /* 10.5.1 run the firmware (II) */
99         cpu_ctrl |= flag;
100         wl1271_spi_write32(wl, ACX_REG_ECPU_CONTROL, cpu_ctrl);
101 }
102
103 static void wl1271_boot_fw_version(struct wl1271 *wl)
104 {
105         struct wl1271_static_data static_data;
106
107         wl1271_spi_read(wl, wl->cmd_box_addr,
108                         &static_data, sizeof(static_data), false);
109
110         strncpy(wl->chip.fw_ver, static_data.fw_version,
111                 sizeof(wl->chip.fw_ver));
112
113         /* make sure the string is NULL-terminated */
114         wl->chip.fw_ver[sizeof(wl->chip.fw_ver) - 1] = '\0';
115 }
116
117 static int wl1271_boot_upload_firmware_chunk(struct wl1271 *wl, void *buf,
118                                              size_t fw_data_len, u32 dest)
119 {
120         struct wl1271_partition_set partition;
121         int addr, chunk_num, partition_limit;
122         u8 *p, *chunk;
123
124         /* whal_FwCtrl_LoadFwImageSm() */
125
126         wl1271_debug(DEBUG_BOOT, "starting firmware upload");
127
128         wl1271_debug(DEBUG_BOOT, "fw_data_len %zd chunk_size %d",
129                      fw_data_len, CHUNK_SIZE);
130
131         if ((fw_data_len % 4) != 0) {
132                 wl1271_error("firmware length not multiple of four");
133                 return -EIO;
134         }
135
136         chunk = kmalloc(CHUNK_SIZE, GFP_KERNEL);
137         if (!chunk) {
138                 wl1271_error("allocation for firmware upload chunk failed");
139                 return -ENOMEM;
140         }
141
142         memcpy(&partition, &part_table[PART_DOWN], sizeof(partition));
143         partition.mem.start = dest;
144         wl1271_set_partition(wl, &partition);
145
146         /* 10.1 set partition limit and chunk num */
147         chunk_num = 0;
148         partition_limit = part_table[PART_DOWN].mem.size;
149
150         while (chunk_num < fw_data_len / CHUNK_SIZE) {
151                 /* 10.2 update partition, if needed */
152                 addr = dest + (chunk_num + 2) * CHUNK_SIZE;
153                 if (addr > partition_limit) {
154                         addr = dest + chunk_num * CHUNK_SIZE;
155                         partition_limit = chunk_num * CHUNK_SIZE +
156                                 part_table[PART_DOWN].mem.size;
157                         partition.mem.start = addr;
158                         wl1271_set_partition(wl, &partition);
159                 }
160
161                 /* 10.3 upload the chunk */
162                 addr = dest + chunk_num * CHUNK_SIZE;
163                 p = buf + chunk_num * CHUNK_SIZE;
164                 memcpy(chunk, p, CHUNK_SIZE);
165                 wl1271_debug(DEBUG_BOOT, "uploading fw chunk 0x%p to 0x%x",
166                              p, addr);
167                 wl1271_spi_write(wl, addr, chunk, CHUNK_SIZE, false);
168
169                 chunk_num++;
170         }
171
172         /* 10.4 upload the last chunk */
173         addr = dest + chunk_num * CHUNK_SIZE;
174         p = buf + chunk_num * CHUNK_SIZE;
175         memcpy(chunk, p, fw_data_len % CHUNK_SIZE);
176         wl1271_debug(DEBUG_BOOT, "uploading fw last chunk (%zd B) 0x%p to 0x%x",
177                      fw_data_len % CHUNK_SIZE, p, addr);
178         wl1271_spi_write(wl, addr, chunk, fw_data_len % CHUNK_SIZE, false);
179
180         kfree(chunk);
181         return 0;
182 }
183
184 static int wl1271_boot_upload_firmware(struct wl1271 *wl)
185 {
186         u32 chunks, addr, len;
187         int ret = 0;
188         u8 *fw;
189
190         fw = wl->fw;
191         chunks = be32_to_cpup((__be32 *) fw);
192         fw += sizeof(u32);
193
194         wl1271_debug(DEBUG_BOOT, "firmware chunks to be uploaded: %u", chunks);
195
196         while (chunks--) {
197                 addr = be32_to_cpup((__be32 *) fw);
198                 fw += sizeof(u32);
199                 len = be32_to_cpup((__be32 *) fw);
200                 fw += sizeof(u32);
201
202                 if (len > 300000) {
203                         wl1271_info("firmware chunk too long: %u", len);
204                         return -EINVAL;
205                 }
206                 wl1271_debug(DEBUG_BOOT, "chunk %d addr 0x%x len %u",
207                              chunks, addr, len);
208                 ret = wl1271_boot_upload_firmware_chunk(wl, fw, len, addr);
209                 if (ret != 0)
210                         break;
211                 fw += len;
212         }
213
214         return ret;
215 }
216
217 static int wl1271_boot_upload_nvs(struct wl1271 *wl)
218 {
219         size_t nvs_len, burst_len;
220         int i;
221         u32 dest_addr, val;
222         u8 *nvs_ptr, *nvs, *nvs_aligned;
223
224         nvs = wl->nvs;
225         if (nvs == NULL)
226                 return -ENODEV;
227
228         if (wl->nvs_len < WL1271_NVS_LEN)
229                 return -EINVAL;
230
231         nvs_ptr = nvs;
232
233         /* only the first part of the NVS needs to be uploaded */
234         nvs_len = WL1271_NVS_LEN;
235
236         /* FIXME: read init settings from the remaining part of the NVS */
237
238         /* Update the device MAC address into the nvs */
239         nvs[11] = wl->mac_addr[0];
240         nvs[10] = wl->mac_addr[1];
241         nvs[6] = wl->mac_addr[2];
242         nvs[5] = wl->mac_addr[3];
243         nvs[4] = wl->mac_addr[4];
244         nvs[3] = wl->mac_addr[5];
245
246         /*
247          * Layout before the actual NVS tables:
248          * 1 byte : burst length.
249          * 2 bytes: destination address.
250          * n bytes: data to burst copy.
251          *
252          * This is ended by a 0 length, then the NVS tables.
253          */
254
255         /* FIXME: Do we need to check here whether the LSB is 1? */
256         while (nvs_ptr[0]) {
257                 burst_len = nvs_ptr[0];
258                 dest_addr = (nvs_ptr[1] & 0xfe) | ((u32)(nvs_ptr[2] << 8));
259
260                 /* FIXME: Due to our new wl1271_translate_reg_addr function,
261                    we need to add the REGISTER_BASE to the destination */
262                 dest_addr += REGISTERS_BASE;
263
264                 /* We move our pointer to the data */
265                 nvs_ptr += 3;
266
267                 for (i = 0; i < burst_len; i++) {
268                         val = (nvs_ptr[0] | (nvs_ptr[1] << 8)
269                                | (nvs_ptr[2] << 16) | (nvs_ptr[3] << 24));
270
271                         wl1271_debug(DEBUG_BOOT,
272                                      "nvs burst write 0x%x: 0x%x",
273                                      dest_addr, val);
274                         wl1271_spi_write32(wl, dest_addr, val);
275
276                         nvs_ptr += 4;
277                         dest_addr += 4;
278                 }
279         }
280
281         /*
282          * We've reached the first zero length, the first NVS table
283          * is 7 bytes further.
284          */
285         nvs_ptr += 7;
286         nvs_len -= nvs_ptr - nvs;
287         nvs_len = ALIGN(nvs_len, 4);
288
289         /* FIXME: The driver sets the partition here, but this is not needed,
290            since it sets to the same one as currently in use */
291         /* Now we must set the partition correctly */
292         wl1271_set_partition(wl, &part_table[PART_WORK]);
293
294         /* Copy the NVS tables to a new block to ensure alignment */
295         nvs_aligned = kmemdup(nvs_ptr, nvs_len, GFP_KERNEL);
296         if (!nvs_aligned)
297                 return -ENOMEM;
298
299         /* And finally we upload the NVS tables */
300         /* FIXME: In wl1271, we upload everything at once.
301            No endianness handling needed here?! The ref driver doesn't do
302            anything about it at this point */
303         wl1271_spi_write(wl, CMD_MBOX_ADDRESS, nvs_aligned, nvs_len, false);
304
305         kfree(nvs_aligned);
306         return 0;
307 }
308
309 static void wl1271_boot_enable_interrupts(struct wl1271 *wl)
310 {
311         enable_irq(wl->irq);
312         wl1271_spi_write32(wl, ACX_REG_INTERRUPT_MASK,
313                            WL1271_ACX_INTR_ALL & ~(WL1271_INTR_MASK));
314         wl1271_spi_write32(wl, HI_CFG, HI_CFG_DEF_VAL);
315 }
316
317 static int wl1271_boot_soft_reset(struct wl1271 *wl)
318 {
319         unsigned long timeout;
320         u32 boot_data;
321
322         /* perform soft reset */
323         wl1271_spi_write32(wl, ACX_REG_SLV_SOFT_RESET,
324                            ACX_SLV_SOFT_RESET_BIT);
325
326         /* SOFT_RESET is self clearing */
327         timeout = jiffies + usecs_to_jiffies(SOFT_RESET_MAX_TIME);
328         while (1) {
329                 boot_data = wl1271_spi_read32(wl, ACX_REG_SLV_SOFT_RESET);
330                 wl1271_debug(DEBUG_BOOT, "soft reset bootdata 0x%x", boot_data);
331                 if ((boot_data & ACX_SLV_SOFT_RESET_BIT) == 0)
332                         break;
333
334                 if (time_after(jiffies, timeout)) {
335                         /* 1.2 check pWhalBus->uSelfClearTime if the
336                          * timeout was reached */
337                         wl1271_error("soft reset timeout");
338                         return -1;
339                 }
340
341                 udelay(SOFT_RESET_STALL_TIME);
342         }
343
344         /* disable Rx/Tx */
345         wl1271_spi_write32(wl, ENABLE, 0x0);
346
347         /* disable auto calibration on start*/
348         wl1271_spi_write32(wl, SPARE_A2, 0xffff);
349
350         return 0;
351 }
352
353 static int wl1271_boot_run_firmware(struct wl1271 *wl)
354 {
355         int loop, ret;
356         u32 chip_id, interrupt;
357
358         wl1271_boot_set_ecpu_ctrl(wl, ECPU_CONTROL_HALT);
359
360         chip_id = wl1271_spi_read32(wl, CHIP_ID_B);
361
362         wl1271_debug(DEBUG_BOOT, "chip id after firmware boot: 0x%x", chip_id);
363
364         if (chip_id != wl->chip.id) {
365                 wl1271_error("chip id doesn't match after firmware boot");
366                 return -EIO;
367         }
368
369         /* wait for init to complete */
370         loop = 0;
371         while (loop++ < INIT_LOOP) {
372                 udelay(INIT_LOOP_DELAY);
373                 interrupt = wl1271_spi_read32(wl,
374                                               ACX_REG_INTERRUPT_NO_CLEAR);
375
376                 if (interrupt == 0xffffffff) {
377                         wl1271_error("error reading hardware complete "
378                                      "init indication");
379                         return -EIO;
380                 }
381                 /* check that ACX_INTR_INIT_COMPLETE is enabled */
382                 else if (interrupt & WL1271_ACX_INTR_INIT_COMPLETE) {
383                         wl1271_spi_write32(wl, ACX_REG_INTERRUPT_ACK,
384                                            WL1271_ACX_INTR_INIT_COMPLETE);
385                         break;
386                 }
387         }
388
389         if (loop > INIT_LOOP) {
390                 wl1271_error("timeout waiting for the hardware to "
391                              "complete initialization");
392                 return -EIO;
393         }
394
395         /* get hardware config command mail box */
396         wl->cmd_box_addr = wl1271_spi_read32(wl, REG_COMMAND_MAILBOX_PTR);
397
398         /* get hardware config event mail box */
399         wl->event_box_addr = wl1271_spi_read32(wl, REG_EVENT_MAILBOX_PTR);
400
401         /* set the working partition to its "running" mode offset */
402         wl1271_set_partition(wl, &part_table[PART_WORK]);
403
404         wl1271_debug(DEBUG_MAILBOX, "cmd_box_addr 0x%x event_box_addr 0x%x",
405                      wl->cmd_box_addr, wl->event_box_addr);
406
407         wl1271_boot_fw_version(wl);
408
409         /*
410          * in case of full asynchronous mode the firmware event must be
411          * ready to receive event from the command mailbox
412          */
413
414         /* unmask required mbox events  */
415         wl->event_mask = BSS_LOSE_EVENT_ID |
416                 SCAN_COMPLETE_EVENT_ID |
417                 PS_REPORT_EVENT_ID;
418
419         ret = wl1271_event_unmask(wl);
420         if (ret < 0) {
421                 wl1271_error("EVENT mask setting failed");
422                 return ret;
423         }
424
425         wl1271_event_mbox_config(wl);
426
427         /* firmware startup completed */
428         return 0;
429 }
430
431 static int wl1271_boot_write_irq_polarity(struct wl1271 *wl)
432 {
433         u32 polarity;
434
435         polarity = wl1271_top_reg_read(wl, OCP_REG_POLARITY);
436
437         /* We use HIGH polarity, so unset the LOW bit */
438         polarity &= ~POLARITY_LOW;
439         wl1271_top_reg_write(wl, OCP_REG_POLARITY, polarity);
440
441         return 0;
442 }
443
444 int wl1271_boot(struct wl1271 *wl)
445 {
446         int ret = 0;
447         u32 tmp, clk, pause;
448
449         if (REF_CLOCK == 0 || REF_CLOCK == 2 || REF_CLOCK == 4)
450                 /* ref clk: 19.2/38.4/38.4-XTAL */
451                 clk = 0x3;
452         else if (REF_CLOCK == 1 || REF_CLOCK == 3)
453                 /* ref clk: 26/52 */
454                 clk = 0x5;
455
456         if (REF_CLOCK != 0) {
457                 u16 val;
458                 /* Set clock type */
459                 val = wl1271_top_reg_read(wl, OCP_REG_CLK_TYPE);
460                 val &= FREF_CLK_TYPE_BITS;
461                 val |= CLK_REQ_PRCM;
462                 wl1271_top_reg_write(wl, OCP_REG_CLK_TYPE, val);
463         } else {
464                 u16 val;
465                 /* Set clock polarity */
466                 val = wl1271_top_reg_read(wl, OCP_REG_CLK_POLARITY);
467                 val &= FREF_CLK_POLARITY_BITS;
468                 val |= CLK_REQ_OUTN_SEL;
469                 wl1271_top_reg_write(wl, OCP_REG_CLK_POLARITY, val);
470         }
471
472         wl1271_spi_write32(wl, PLL_PARAMETERS, clk);
473
474         pause = wl1271_spi_read32(wl, PLL_PARAMETERS);
475
476         wl1271_debug(DEBUG_BOOT, "pause1 0x%x", pause);
477
478         pause &= ~(WU_COUNTER_PAUSE_VAL); /* FIXME: This should probably be
479                                            * WU_COUNTER_PAUSE_VAL instead of
480                                            * 0x3ff (magic number ).  How does
481                                            * this work?! */
482         pause |= WU_COUNTER_PAUSE_VAL;
483         wl1271_spi_write32(wl, WU_COUNTER_PAUSE, pause);
484
485         /* Continue the ELP wake up sequence */
486         wl1271_spi_write32(wl, WELP_ARM_COMMAND, WELP_ARM_COMMAND_VAL);
487         udelay(500);
488
489         wl1271_set_partition(wl, &part_table[PART_DRPW]);
490
491         /* Read-modify-write DRPW_SCRATCH_START register (see next state)
492            to be used by DRPw FW. The RTRIM value will be added by the FW
493            before taking DRPw out of reset */
494
495         wl1271_debug(DEBUG_BOOT, "DRPW_SCRATCH_START %08x", DRPW_SCRATCH_START);
496         clk = wl1271_spi_read32(wl, DRPW_SCRATCH_START);
497
498         wl1271_debug(DEBUG_BOOT, "clk2 0x%x", clk);
499
500         /* 2 */
501         clk |= (REF_CLOCK << 1) << 4;
502         wl1271_spi_write32(wl, DRPW_SCRATCH_START, clk);
503
504         wl1271_set_partition(wl, &part_table[PART_WORK]);
505
506         /* Disable interrupts */
507         wl1271_spi_write32(wl, ACX_REG_INTERRUPT_MASK, WL1271_ACX_INTR_ALL);
508
509         ret = wl1271_boot_soft_reset(wl);
510         if (ret < 0)
511                 goto out;
512
513         /* 2. start processing NVS file */
514         ret = wl1271_boot_upload_nvs(wl);
515         if (ret < 0)
516                 goto out;
517
518         /* write firmware's last address (ie. it's length) to
519          * ACX_EEPROMLESS_IND_REG */
520         wl1271_debug(DEBUG_BOOT, "ACX_EEPROMLESS_IND_REG");
521
522         wl1271_spi_write32(wl, ACX_EEPROMLESS_IND_REG,
523                            ACX_EEPROMLESS_IND_REG);
524
525         tmp = wl1271_spi_read32(wl, CHIP_ID_B);
526
527         wl1271_debug(DEBUG_BOOT, "chip id 0x%x", tmp);
528
529         /* 6. read the EEPROM parameters */
530         tmp = wl1271_spi_read32(wl, SCR_PAD2);
531
532         ret = wl1271_boot_write_irq_polarity(wl);
533         if (ret < 0)
534                 goto out;
535
536         /* FIXME: Need to check whether this is really what we want */
537         wl1271_spi_write32(wl, ACX_REG_INTERRUPT_MASK,
538                            WL1271_ACX_ALL_EVENTS_VECTOR);
539
540         /* WL1271: The reference driver skips steps 7 to 10 (jumps directly
541          * to upload_fw) */
542
543         ret = wl1271_boot_upload_firmware(wl);
544         if (ret < 0)
545                 goto out;
546
547         /* 10.5 start firmware */
548         ret = wl1271_boot_run_firmware(wl);
549         if (ret < 0)
550                 goto out;
551
552         /* Enable firmware interrupts now */
553         wl1271_boot_enable_interrupts(wl);
554
555         /* set the wl1271 default filters */
556         wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
557         wl->rx_filter = WL1271_DEFAULT_RX_FILTER;
558
559         wl1271_event_mbox_config(wl);
560
561 out:
562         return ret;
563 }