2 * drivers/net/can/softing/softing_fw.c
6 * - Kurt Van Dijck, EIA Electronics
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the version 2 of the GNU General Public License
10 * as published by the Free Software Foundation
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <linux/module.h>
23 #include <linux/init.h>
24 #include <linux/device.h>
25 #include <linux/firmware.h>
26 #include <linux/interrupt.h>
27 #include <linux/mutex.h>
32 #define fw_dir "softing-4.6/"
34 const struct can_bittiming_const softing_btr_const = {
39 .sjw_max = 4, /* overruled */
41 .brp_max = 32, /* overruled */
45 static const struct softing_desc carddescs[] = {
48 .manf = 0x0168, .prod = 0x001,
50 .freq = 16, .max_brp = 32, .max_sjw = 4,
52 .boot = {0x0000, 0x000000, fw_dir "bcard.bin",},
53 .load = {0x0120, 0x00f600, fw_dir "ldcard.bin",},
54 .app = {0x0010, 0x0d0000, fw_dir "cancard.bin",},
56 .name = "CANcard-NEC",
57 .manf = 0x0168, .prod = 0x002,
59 .freq = 16, .max_brp = 32, .max_sjw = 4,
61 .boot = {0x0000, 0x000000, fw_dir "bcard.bin",},
62 .load = {0x0120, 0x00f600, fw_dir "ldcard.bin",},
63 .app = {0x0010, 0x0d0000, fw_dir "cancard.bin",},
65 .name = "CANcard-SJA",
66 .manf = 0x0168, .prod = 0x004,
68 .freq = 20, .max_brp = 32, .max_sjw = 4,
70 .boot = {0x0000, 0x000000, fw_dir "bcard.bin",},
71 .load = {0x0120, 0x00f600, fw_dir "ldcard.bin",},
72 .app = {0x0010, 0x0d0000, fw_dir "cansja.bin",},
75 .manf = 0x0168, .prod = 0x005,
77 .freq = 24, .max_brp = 64, .max_sjw = 4,
79 .boot = {0x0000, 0x000000, fw_dir "bcard2.bin",},
80 .load = {0x0120, 0x00f600, fw_dir "ldcard2.bin",},
81 .app = {0x0010, 0x0d0000, fw_dir "cancrd2.bin",},
83 .name = "Vector-CANcard",
84 .manf = 0x0168, .prod = 0x081,
86 .freq = 16, .max_brp = 64, .max_sjw = 4,
88 .boot = {0x0000, 0x000000, fw_dir "bcard.bin",},
89 .load = {0x0120, 0x00f600, fw_dir "ldcard.bin",},
90 .app = {0x0010, 0x0d0000, fw_dir "cancard.bin",},
92 .name = "Vector-CANcard-SJA",
93 .manf = 0x0168, .prod = 0x084,
95 .freq = 20, .max_brp = 32, .max_sjw = 4,
97 .boot = {0x0000, 0x000000, fw_dir "bcard.bin",},
98 .load = {0x0120, 0x00f600, fw_dir "ldcard.bin",},
99 .app = {0x0010, 0x0d0000, fw_dir "cansja.bin",},
101 .name = "Vector-CANcard-2",
102 .manf = 0x0168, .prod = 0x085,
104 .freq = 24, .max_brp = 64, .max_sjw = 4,
105 .dpram_size = 0x0800,
106 .boot = {0x0000, 0x000000, fw_dir "bcard2.bin",},
107 .load = {0x0120, 0x00f600, fw_dir "ldcard2.bin",},
108 .app = {0x0010, 0x0d0000, fw_dir "cancrd2.bin",},
110 .name = "EDICcard-NEC",
111 .manf = 0x0168, .prod = 0x102,
113 .freq = 16, .max_brp = 64, .max_sjw = 4,
114 .dpram_size = 0x0800,
115 .boot = {0x0000, 0x000000, fw_dir "bcard.bin",},
116 .load = {0x0120, 0x00f600, fw_dir "ldcard.bin",},
117 .app = {0x0010, 0x0d0000, fw_dir "cancard.bin",},
119 .name = "EDICcard-2",
120 .manf = 0x0168, .prod = 0x105,
122 .freq = 24, .max_brp = 64, .max_sjw = 4,
123 .dpram_size = 0x0800,
124 .boot = {0x0000, 0x000000, fw_dir "bcard2.bin",},
125 .load = {0x0120, 0x00f600, fw_dir "ldcard2.bin",},
126 .app = {0x0010, 0x0d0000, fw_dir "cancrd2.bin",},
129 /* never tested, but taken from original softing */
130 { .name = "CAN-AC2-104",
131 .manf = 0x0000, .prod = 0x009,
133 .freq = 25, .max_brp = 64, .max_sjw = 4,
134 .dpram_size = 0x1000,
135 .boot = {0x0000, 0x000000, fw_dir "boot104.bin",},
136 .load = {0x0800, 0x035000, fw_dir "ld104.bin",},
137 .app = {0x0010, 0x120000, fw_dir "canpc104.bin",},
142 const struct softing_desc *softing_lookup_desc
143 (unsigned int manf, unsigned int prod)
145 const struct softing_desc *lp = carddescs;
146 for (; lp->name; ++lp) {
147 if ((lp->manf == manf) && (lp->prod == prod))
152 EXPORT_SYMBOL(softing_lookup_desc);
154 int softing_fct_cmd(struct softing *card, int cmd, int vector, const char *msg)
158 if (vector == RES_OK)
160 card->dpram.fct->param[0] = cmd;
161 card->dpram.fct->host_access = vector;
162 /* be sure to flush this to the card */
167 ret = card->dpram.fct->host_access;
168 /* don't have any cached variables */
171 /*don't read return-value now */
172 ret = card->dpram.fct->returned;
175 "%s returned %u\n", msg, ret);
178 if ((jiffies - stamp) >= 1 * HZ)
181 /* go as fast as possible */
183 /* process context => relax */
185 } while (!signal_pending(current));
187 if (ret == RES_NONE) {
189 "%s, no response from card on %u/0x%02x\n",
194 "%s, bad response from card on %u/0x%02x, 0x%04x\n",
195 msg, cmd, vector, ret);
196 /*make sure to return something not 0 */
197 return ret ? ret : 1;
201 int softing_bootloader_command(struct softing *card
202 , int command, const char *msg)
206 card->dpram.receipt[0] = RES_NONE;
207 card->dpram.command[0] = command;
208 /* be sure to flush this to the card */
213 ret = card->dpram.receipt[0];
214 /* don't have any cached variables */
218 if ((jiffies - stamp) >= (3 * HZ))
221 } while (!signal_pending(current));
225 dev_alert(card->dev, "%s: no response from card\n", msg);
228 dev_alert(card->dev, "%s: response from card nok\n", msg);
231 dev_alert(card->dev, "%s: command 0x%04x unknown\n",
235 dev_alert(card->dev, "%s: bad response from card (%u)]\n",
239 return ret ? ret : 1;
247 const unsigned char *base;
248 } __attribute__ ((packed));
250 static int fw_parse(const unsigned char **pmem, struct fw_hdr *hdr)
253 const unsigned char *mem;
254 const unsigned char *end;
256 hdr->type = (mem[0] << 0) | (mem[1] << 8);
257 hdr->addr = (mem[2] << 0) | (mem[3] << 8)
258 | (mem[4] << 16) | (mem[5] << 24);
259 hdr->len = (mem[6] << 0) | (mem[7] << 8);
262 (hdr->base[hdr->len] << 0) | (hdr->base[hdr->len + 1] << 8);
263 for (tmp = 0, mem = *pmem, end = &hdr->base[hdr->len]; mem < end; ++mem)
265 if (tmp != hdr->checksum)
267 *pmem += 10 + hdr->len;
271 int softing_load_fw(const char *file, struct softing *card,
272 unsigned char *virt, unsigned int size, int offset)
274 const struct firmware *fw;
275 const unsigned char *mem;
276 const unsigned char *end;
281 unsigned char buf[1024];
283 ret = request_firmware(&fw, file, card->dev);
285 dev_alert(card->dev, "request_firmware(%s) got %i\n",
289 dev_dbg(card->dev, "%s, firmware(%s) got %u bytes"
290 ", offset %c0x%04x\n",
291 card->id.name, file, (unsigned int)fw->size,
292 (offset >= 0) ? '+' : '-', abs(offset));
293 /* parse the firmware */
295 end = &mem[fw->size];
296 /* look for header record */
297 if (fw_parse(&mem, &rec))
299 if (rec.type != 0xffff) {
300 dev_alert(card->dev, "firware starts with type 0x%04x\n",
304 if (strncmp("Structured Binary Format, Softing GmbH"
305 , rec.base, rec.len)) {
306 dev_info(card->dev, "firware string '%.*s'\n",
311 /* ok, we had a header */
313 if (fw_parse(&mem, &rec))
317 start_addr = rec.addr;
320 } else if (rec.type == 1) {
324 } else if (rec.type != 0) {
325 dev_alert(card->dev, "unknown record type 0x%04x\n",
330 if ((rec.addr + rec.len + offset) > size) {
332 "firmware out of range (0x%08x / 0x%08x)\n",
333 (rec.addr + rec.len + offset), size);
336 memcpy_toio(&virt[rec.addr + offset],
338 /* be sure to flush caches from IO space */
340 if (rec.len > sizeof(buf)) {
342 "record is big (%u bytes), not verifying\n",
346 /* verify record data */
347 memcpy_fromio(buf, &virt[rec.addr + offset], rec.len);
348 if (!memcmp(buf, rec.base, rec.len))
351 dev_alert(card->dev, "0x%08x:0x%03x at 0x%p failed\n",
352 rec.addr, rec.len, &virt[rec.addr + offset]);
356 release_firmware(fw);
357 if (0x5 == (ok & 0x5)) {
361 dev_info(card->dev, "firmware %s failed\n", file);
365 int softing_load_app_fw(const char *file, struct softing *card)
367 const struct firmware *fw;
368 const unsigned char *mem;
369 const unsigned char *end;
376 const unsigned char *mem_lp;
377 const unsigned char *mem_end;
383 } __attribute__((packed)) *pcpy =
384 (struct cpy *)&card->dpram.command[1];
388 } __attribute__((packed)) *pcmdstart =
389 (struct cmd *)&card->dpram.command[1];
391 ret = request_firmware(&fw, file, card->dev);
393 dev_alert(card->dev, "request_firmware(%s) got %i\n",
397 dev_dbg(card->dev, "%s, firmware(%s) got %lu bytes\n",
398 card->id.name, file, (unsigned long)fw->size);
399 /* parse the firmware */
401 end = &mem[fw->size];
402 /* look for header record */
403 if (fw_parse(&mem, &rec))
405 if (rec.type != 0xffff) {
406 dev_alert(card->dev, "firware starts with type 0x%04x\n",
410 if (strncmp("Structured Binary Format, Softing GmbH"
411 , rec.base, rec.len)) {
412 dev_alert(card->dev, "firware string '%.*s' fault\n",
417 /* ok, we had a header */
419 if (fw_parse(&mem, &rec))
424 start_addr = rec.addr;
427 } else if (rec.type == 1) {
431 } else if (rec.type != 0) {
432 dev_alert(card->dev, "unknown record type 0x%04x\n",
437 for (sum = 0, mem_lp = rec.base, mem_end = &mem_lp[rec.len];
438 mem_lp < mem_end; ++mem_lp)
441 memcpy_toio(&card->dpram. virt[card->desc->app.offs],
443 pcpy->src = card->desc->app.offs + card->desc->app.addr;
444 pcpy->dst = rec.addr;
447 if (softing_bootloader_command(card, 1, "loading app."))
450 rx_sum = card->dpram.receipt[1];
451 if (rx_sum != (sum & 0xffff)) {
452 dev_alert(card->dev, "SRAM seems to be damaged"
453 ", wanted 0x%04x, got 0x%04x\n", sum, rx_sum);
458 release_firmware(fw);
461 /*got start, start_addr, & eof */
462 pcmdstart->start = start_addr;
463 pcmdstart->autorestart = 1;
464 if (softing_bootloader_command(card, 3, "start app."))
466 dev_info(card->dev, "firmware %s up\n", file);
469 dev_info(card->dev, "firmware %s failed\n", file);
473 int softing_reset_chip(struct softing *card)
477 card->dpram.info->reset_rcv_fifo = 0;
478 card->dpram.info->reset = 1;
479 if (!softing_fct_cmd(card, 0, 0, "reset_chip"))
481 if (signal_pending(current))
484 if (softing_fct_cmd(card, 99, 0x55, "sync-a"))
486 if (softing_fct_cmd(card, 99, 0xaa, "sync-a"))
489 card->tx.pending = 0;
495 int softing_cycle(struct softing *card, struct softing_priv *bus, int up)
498 struct softing_priv *pbus;
501 struct can_frame msg;
506 ret = mutex_lock_interruptible(&card->fw.lock);
513 /* bring netdevs down */
514 for (j = 0; j < card->nbus; ++j) {
520 netif_stop_queue(pbus->netdev);
522 if ((bus != pbus) && netif_running(pbus->netdev))
523 mask_start |= (1 << j);
524 if (netif_running(pbus->netdev)) {
525 pbus->tx.pending = 0;
526 pbus->tx.echo_put = 0;
527 pbus->tx.echo_get = 0;
528 /* this bus' may just have called open_candev()
529 * which is rather stupid to call close_candev()
531 * but we may come here from busoff recovery too
532 * in which case the echo_skb _needs_ flushing too.
533 * just be sure to call open_candev() again
535 close_candev(pbus->netdev);
537 pbus->can.state = CAN_STATE_STOPPED;
539 card->tx.pending = 0;
541 /* prepare to start this bus as well */
542 mask_start |= (1 << bus->index);
544 softing_card_irq(card, 0);
545 ret = softing_reset_chip(card);
549 /* no busses to be brought up */
552 /* from here, we must jump to failed: */
554 if (mask_start & 1) {
557 card->dpram.fct->param[1] = pbus->can.bittiming.brp;
558 card->dpram.fct->param[2] = pbus->can.bittiming.sjw;
559 card->dpram.fct->param[3] =
560 pbus->can.bittiming.phase_seg1 +
561 pbus->can.bittiming.prop_seg;
562 card->dpram.fct->param[4] =
563 pbus->can.bittiming.phase_seg2;
564 card->dpram.fct->param[5] = (pbus->can.ctrlmode &
565 CAN_CTRLMODE_3_SAMPLES) ? 1 : 0;
566 if (softing_fct_cmd(card, 1, 0, "initialize_chip[0]"))
569 card->dpram.fct->param[1] = 0;
570 card->dpram.fct->param[2] = 0;
571 if (softing_fct_cmd(card, 3, 0, "set_mode[0]"))
574 card->dpram.fct->param[1] = 0x0000;/*card->bus[0].s.msg; */
575 card->dpram.fct->param[2] = 0x07ff;/*card->bus[0].s.msk; */
576 card->dpram.fct->param[3] = 0x0000;/*card->bus[0].l.msg; */
577 card->dpram.fct->param[4] = 0xffff;/*card->bus[0].l.msk; */
578 card->dpram.fct->param[5] = 0x0000;/*card->bus[0].l.msg >> 16;*/
579 card->dpram.fct->param[6] = 0x1fff;/*card->bus[0].l.msk >> 16;*/
580 if (softing_fct_cmd(card, 7, 0, "set_filter[0]"))
582 /*set output control */
583 card->dpram.fct->param[1] = pbus->output;
584 if (softing_fct_cmd(card, 5, 0, "set_output[0]"))
587 if (mask_start & 2) {
590 card->dpram.fct->param[1] = pbus->can.bittiming.brp;
591 card->dpram.fct->param[2] = pbus->can.bittiming.sjw;
592 card->dpram.fct->param[3] =
593 pbus->can.bittiming.phase_seg1 +
594 pbus->can.bittiming.prop_seg;
595 card->dpram.fct->param[4] =
596 pbus->can.bittiming.phase_seg2;
597 card->dpram.fct->param[5] = (pbus->can.ctrlmode &
598 CAN_CTRLMODE_3_SAMPLES) ? 1 : 0;
599 if (softing_fct_cmd(card, 2, 0, "initialize_chip[1]"))
602 card->dpram.fct->param[1] = 0;
603 card->dpram.fct->param[2] = 0;
604 if (softing_fct_cmd(card, 4, 0, "set_mode[1]"))
607 card->dpram.fct->param[1] = 0x0000;/*card->bus[1].s.msg; */
608 card->dpram.fct->param[2] = 0x07ff;/*card->bus[1].s.msk; */
609 card->dpram.fct->param[3] = 0x0000;/*card->bus[1].l.msg; */
610 card->dpram.fct->param[4] = 0xffff;/*card->bus[1].l.msk; */
611 card->dpram.fct->param[5] = 0x0000;/*card->bus[1].l.msg >> 16;*/
612 card->dpram.fct->param[6] = 0x1fff;/*card->bus[1].l.msk >> 16;*/
613 if (softing_fct_cmd(card, 8, 0, "set_filter[1]"))
615 /*set output control2 */
616 card->dpram.fct->param[1] = pbus->output;
617 if (softing_fct_cmd(card, 6, 0, "set_output[1]"))
620 /*enable_error_frame */
622 if (softing_fct_cmd(card, 51, 0, "enable_error_frame"))
625 /*initialize interface */
626 card->dpram.fct->param[1] = 1;
627 card->dpram.fct->param[2] = 1;
628 card->dpram.fct->param[3] = 1;
629 card->dpram.fct->param[4] = 1;
630 card->dpram.fct->param[5] = 1;
631 card->dpram.fct->param[6] = 1;
632 card->dpram.fct->param[7] = 1;
633 card->dpram.fct->param[8] = 1;
634 card->dpram.fct->param[9] = 1;
635 card->dpram.fct->param[10] = 1;
636 if (softing_fct_cmd(card, 17, 0, "initialize_interface"))
639 if (softing_fct_cmd(card, 36, 0, "enable_fifo"))
641 /*enable fifo tx ack */
642 if (softing_fct_cmd(card, 13, 0, "fifo_tx_ack[0]"))
644 /*enable fifo tx ack2 */
645 if (softing_fct_cmd(card, 14, 0, "fifo_tx_ack[1]"))
647 /*enable timestamps */
648 /*is default, no code found */
650 if (softing_fct_cmd(card, 11, 0, "start_chip"))
652 card->dpram.info->bus_state = 0;
653 card->dpram.info->bus_state2 = 0;
654 dev_info(card->dev, "ok for %s, %s/%s\n",
655 card->bus[0]->netdev->name, card->bus[1]->netdev->name,
657 if (card->desc->generation < 2) {
658 card->dpram.irq->to_host = 0;
659 /* flush the DPRAM caches */
663 card->boot_time = ktime_get_real();
666 /*the bottom halve will start flushing the tx-queue too */
667 /*tasklet_schedule(&card->irq.bh);*/
668 ret = softing_card_irq(card, 1);
673 * do socketcan notifications/status changes
674 * from here, no errors should occur, or the failed: part
677 memset(&msg, 0, sizeof(msg));
678 msg.can_id = CAN_ERR_FLAG | CAN_ERR_RESTARTED;
679 msg.can_dlc = CAN_ERR_DLC;
680 for (j = 0; j < card->nbus; ++j) {
684 if (!(mask_start & (1 << j)))
686 pbus->can.state = CAN_STATE_ERROR_ACTIVE;
687 open_candev(pbus->netdev);
689 /* notify other busses on the restart */
690 softing_rx(pbus->netdev, &msg, ktime_set(0, 0));
691 ++pbus->can.can_stats.restarts;
693 netif_wake_queue(pbus->netdev);
696 mutex_unlock(&card->fw.lock);
699 dev_alert(card->dev, "firmware failed, going idle\n");
700 softing_card_irq(card, 0);
701 softing_reset_chip(card);
703 mutex_unlock(&card->fw.lock);
704 /* bring all other interfaces down */
705 for (j = 0; j < card->nbus; ++j) {
709 dev_close(pbus->netdev);
714 mutex_unlock(&card->fw.lock);
719 int softing_default_output(struct softing *card, struct softing_priv *priv)
721 switch (priv->chip) {
723 if (card->desc->generation < 2)
733 ktime_t softing_raw2ktime(struct softing *card, u32 raw)
740 ovf = 0x100000000ULL;
742 /*TODO : don't loose higher order bits in computation */
743 switch (card->desc->freq) {
754 rawl = rawl * 16 / 25;
760 /* return empty time */
761 return ktime_set(0, 0);
763 now = ktime_get_real();
764 expected = (ktime_us_delta(now, card->boot_time)) % ovf;
766 * strange seuence for equation, but mind the 'unsigned-ness'
768 * if (expected < (rawl - (ovf / 2)))
769 * meaning: on wrap-around (occurs at 'ovf'), expected (actual time)
770 * may wrap around, altough rawl (receive time)
771 * is just before wrap-around. In that case, offset 'expected'
772 * note that expected can also be slightly earlier, as the card's
773 * timer starts a little (but unknown to me) after I mark 'boot_time'
775 if (rawl < (expected + (ovf / 2)))
776 /* now (expected) is always later than card stamp */
778 target = ktime_sub_us(now, (expected - rawl));