xref: /linux/drivers/net/can/softing/softing_fw.c (revision 6a143a7cf94730f57544ea14a987dc025364dbb8)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2008-2010
4  *
5  * - Kurt Van Dijck, EIA Electronics
6  */
7 
8 #include <linux/firmware.h>
9 #include <linux/sched/signal.h>
10 #include <asm/div64.h>
11 #include <asm/io.h>
12 
13 #include "softing.h"
14 
15 /*
16  * low level DPRAM command.
17  * Make sure that card->dpram[DPRAM_FCT_HOST] is preset
18  */
19 static int _softing_fct_cmd(struct softing *card, int16_t cmd, uint16_t vector,
20 		const char *msg)
21 {
22 	int ret;
23 	unsigned long stamp;
24 
25 	iowrite16(cmd, &card->dpram[DPRAM_FCT_PARAM]);
26 	iowrite8(vector >> 8, &card->dpram[DPRAM_FCT_HOST + 1]);
27 	iowrite8(vector, &card->dpram[DPRAM_FCT_HOST]);
28 	/* be sure to flush this to the card */
29 	wmb();
30 	stamp = jiffies + 1 * HZ;
31 	/* wait for card */
32 	do {
33 		/* DPRAM_FCT_HOST is _not_ aligned */
34 		ret = ioread8(&card->dpram[DPRAM_FCT_HOST]) +
35 			(ioread8(&card->dpram[DPRAM_FCT_HOST + 1]) << 8);
36 		/* don't have any cached variables */
37 		rmb();
38 		if (ret == RES_OK)
39 			/* read return-value now */
40 			return ioread16(&card->dpram[DPRAM_FCT_RESULT]);
41 
42 		if ((ret != vector) || time_after(jiffies, stamp))
43 			break;
44 		/* process context => relax */
45 		usleep_range(500, 10000);
46 	} while (1);
47 
48 	ret = (ret == RES_NONE) ? -ETIMEDOUT : -ECANCELED;
49 	dev_alert(&card->pdev->dev, "firmware %s failed (%i)\n", msg, ret);
50 	return ret;
51 }
52 
53 static int softing_fct_cmd(struct softing *card, int16_t cmd, const char *msg)
54 {
55 	int ret;
56 
57 	ret = _softing_fct_cmd(card, cmd, 0, msg);
58 	if (ret > 0) {
59 		dev_alert(&card->pdev->dev, "%s returned %u\n", msg, ret);
60 		ret = -EIO;
61 	}
62 	return ret;
63 }
64 
65 int softing_bootloader_command(struct softing *card, int16_t cmd,
66 		const char *msg)
67 {
68 	int ret;
69 	unsigned long stamp;
70 
71 	iowrite16(RES_NONE, &card->dpram[DPRAM_RECEIPT]);
72 	iowrite16(cmd, &card->dpram[DPRAM_COMMAND]);
73 	/* be sure to flush this to the card */
74 	wmb();
75 	stamp = jiffies + 3 * HZ;
76 	/* wait for card */
77 	do {
78 		ret = ioread16(&card->dpram[DPRAM_RECEIPT]);
79 		/* don't have any cached variables */
80 		rmb();
81 		if (ret == RES_OK)
82 			return 0;
83 		if (time_after(jiffies, stamp))
84 			break;
85 		/* process context => relax */
86 		usleep_range(500, 10000);
87 	} while (!signal_pending(current));
88 
89 	ret = (ret == RES_NONE) ? -ETIMEDOUT : -ECANCELED;
90 	dev_alert(&card->pdev->dev, "bootloader %s failed (%i)\n", msg, ret);
91 	return ret;
92 }
93 
94 static int fw_parse(const uint8_t **pmem, uint16_t *ptype, uint32_t *paddr,
95 		uint16_t *plen, const uint8_t **pdat)
96 {
97 	uint16_t checksum[2];
98 	const uint8_t *mem;
99 	const uint8_t *end;
100 
101 	/*
102 	 * firmware records are a binary, unaligned stream composed of:
103 	 * uint16_t type;
104 	 * uint32_t addr;
105 	 * uint16_t len;
106 	 * uint8_t dat[len];
107 	 * uint16_t checksum;
108 	 * all values in little endian.
109 	 * We could define a struct for this, with __attribute__((packed)),
110 	 * but would that solve the alignment in _all_ cases (cfr. the
111 	 * struct itself may be an odd address)?
112 	 *
113 	 * I chose to use leXX_to_cpup() since this solves both
114 	 * endianness & alignment.
115 	 */
116 	mem = *pmem;
117 	*ptype = le16_to_cpup((void *)&mem[0]);
118 	*paddr = le32_to_cpup((void *)&mem[2]);
119 	*plen = le16_to_cpup((void *)&mem[6]);
120 	*pdat = &mem[8];
121 	/* verify checksum */
122 	end = &mem[8 + *plen];
123 	checksum[0] = le16_to_cpup((void *)end);
124 	for (checksum[1] = 0; mem < end; ++mem)
125 		checksum[1] += *mem;
126 	if (checksum[0] != checksum[1])
127 		return -EINVAL;
128 	/* increment */
129 	*pmem += 10 + *plen;
130 	return 0;
131 }
132 
133 int softing_load_fw(const char *file, struct softing *card,
134 		__iomem uint8_t *dpram, unsigned int size, int offset)
135 {
136 	const struct firmware *fw;
137 	int ret;
138 	const uint8_t *mem, *end, *dat;
139 	uint16_t type, len;
140 	uint32_t addr;
141 	uint8_t *buf = NULL, *new_buf;
142 	int buflen = 0;
143 	int8_t type_end = 0;
144 
145 	ret = request_firmware(&fw, file, &card->pdev->dev);
146 	if (ret < 0)
147 		return ret;
148 	dev_dbg(&card->pdev->dev, "%s, firmware(%s) got %u bytes"
149 		", offset %c0x%04x\n",
150 		card->pdat->name, file, (unsigned int)fw->size,
151 		(offset >= 0) ? '+' : '-', (unsigned int)abs(offset));
152 	/* parse the firmware */
153 	mem = fw->data;
154 	end = &mem[fw->size];
155 	/* look for header record */
156 	ret = fw_parse(&mem, &type, &addr, &len, &dat);
157 	if (ret < 0)
158 		goto failed;
159 	if (type != 0xffff)
160 		goto failed;
161 	if (strncmp("Structured Binary Format, Softing GmbH" , dat, len)) {
162 		ret = -EINVAL;
163 		goto failed;
164 	}
165 	/* ok, we had a header */
166 	while (mem < end) {
167 		ret = fw_parse(&mem, &type, &addr, &len, &dat);
168 		if (ret < 0)
169 			goto failed;
170 		if (type == 3) {
171 			/* start address, not used here */
172 			continue;
173 		} else if (type == 1) {
174 			/* eof */
175 			type_end = 1;
176 			break;
177 		} else if (type != 0) {
178 			ret = -EINVAL;
179 			goto failed;
180 		}
181 
182 		if ((addr + len + offset) > size)
183 			goto failed;
184 		memcpy_toio(&dpram[addr + offset], dat, len);
185 		/* be sure to flush caches from IO space */
186 		mb();
187 		if (len > buflen) {
188 			/* align buflen */
189 			buflen = (len + (1024-1)) & ~(1024-1);
190 			new_buf = krealloc(buf, buflen, GFP_KERNEL);
191 			if (!new_buf) {
192 				ret = -ENOMEM;
193 				goto failed;
194 			}
195 			buf = new_buf;
196 		}
197 		/* verify record data */
198 		memcpy_fromio(buf, &dpram[addr + offset], len);
199 		if (memcmp(buf, dat, len)) {
200 			/* is not ok */
201 			dev_alert(&card->pdev->dev, "DPRAM readback failed\n");
202 			ret = -EIO;
203 			goto failed;
204 		}
205 	}
206 	if (!type_end)
207 		/* no end record seen */
208 		goto failed;
209 	ret = 0;
210 failed:
211 	kfree(buf);
212 	release_firmware(fw);
213 	if (ret < 0)
214 		dev_info(&card->pdev->dev, "firmware %s failed\n", file);
215 	return ret;
216 }
217 
218 int softing_load_app_fw(const char *file, struct softing *card)
219 {
220 	const struct firmware *fw;
221 	const uint8_t *mem, *end, *dat;
222 	int ret, j;
223 	uint16_t type, len;
224 	uint32_t addr, start_addr = 0;
225 	unsigned int sum, rx_sum;
226 	int8_t type_end = 0, type_entrypoint = 0;
227 
228 	ret = request_firmware(&fw, file, &card->pdev->dev);
229 	if (ret) {
230 		dev_alert(&card->pdev->dev, "request_firmware(%s) got %i\n",
231 			file, ret);
232 		return ret;
233 	}
234 	dev_dbg(&card->pdev->dev, "firmware(%s) got %lu bytes\n",
235 		file, (unsigned long)fw->size);
236 	/* parse the firmware */
237 	mem = fw->data;
238 	end = &mem[fw->size];
239 	/* look for header record */
240 	ret = fw_parse(&mem, &type, &addr, &len, &dat);
241 	if (ret)
242 		goto failed;
243 	ret = -EINVAL;
244 	if (type != 0xffff) {
245 		dev_alert(&card->pdev->dev, "firmware starts with type 0x%x\n",
246 			type);
247 		goto failed;
248 	}
249 	if (strncmp("Structured Binary Format, Softing GmbH", dat, len)) {
250 		dev_alert(&card->pdev->dev, "firmware string '%.*s' fault\n",
251 				len, dat);
252 		goto failed;
253 	}
254 	/* ok, we had a header */
255 	while (mem < end) {
256 		ret = fw_parse(&mem, &type, &addr, &len, &dat);
257 		if (ret)
258 			goto failed;
259 
260 		if (type == 3) {
261 			/* start address */
262 			start_addr = addr;
263 			type_entrypoint = 1;
264 			continue;
265 		} else if (type == 1) {
266 			/* eof */
267 			type_end = 1;
268 			break;
269 		} else if (type != 0) {
270 			dev_alert(&card->pdev->dev,
271 					"unknown record type 0x%04x\n", type);
272 			ret = -EINVAL;
273 			goto failed;
274 		}
275 
276 		/* regular data */
277 		for (sum = 0, j = 0; j < len; ++j)
278 			sum += dat[j];
279 		/* work in 16bit (target) */
280 		sum &= 0xffff;
281 
282 		memcpy_toio(&card->dpram[card->pdat->app.offs], dat, len);
283 		iowrite32(card->pdat->app.offs + card->pdat->app.addr,
284 				&card->dpram[DPRAM_COMMAND + 2]);
285 		iowrite32(addr, &card->dpram[DPRAM_COMMAND + 6]);
286 		iowrite16(len, &card->dpram[DPRAM_COMMAND + 10]);
287 		iowrite8(1, &card->dpram[DPRAM_COMMAND + 12]);
288 		ret = softing_bootloader_command(card, 1, "loading app.");
289 		if (ret < 0)
290 			goto failed;
291 		/* verify checksum */
292 		rx_sum = ioread16(&card->dpram[DPRAM_RECEIPT + 2]);
293 		if (rx_sum != sum) {
294 			dev_alert(&card->pdev->dev, "SRAM seems to be damaged"
295 				", wanted 0x%04x, got 0x%04x\n", sum, rx_sum);
296 			ret = -EIO;
297 			goto failed;
298 		}
299 	}
300 	if (!type_end || !type_entrypoint)
301 		goto failed;
302 	/* start application in card */
303 	iowrite32(start_addr, &card->dpram[DPRAM_COMMAND + 2]);
304 	iowrite8(1, &card->dpram[DPRAM_COMMAND + 6]);
305 	ret = softing_bootloader_command(card, 3, "start app.");
306 	if (ret < 0)
307 		goto failed;
308 	ret = 0;
309 failed:
310 	release_firmware(fw);
311 	if (ret < 0)
312 		dev_info(&card->pdev->dev, "firmware %s failed\n", file);
313 	return ret;
314 }
315 
316 static int softing_reset_chip(struct softing *card)
317 {
318 	int ret;
319 
320 	do {
321 		/* reset chip */
322 		iowrite8(0, &card->dpram[DPRAM_RESET_RX_FIFO]);
323 		iowrite8(0, &card->dpram[DPRAM_RESET_RX_FIFO+1]);
324 		iowrite8(1, &card->dpram[DPRAM_RESET]);
325 		iowrite8(0, &card->dpram[DPRAM_RESET+1]);
326 
327 		ret = softing_fct_cmd(card, 0, "reset_can");
328 		if (!ret)
329 			break;
330 		if (signal_pending(current))
331 			/* don't wait any longer */
332 			break;
333 	} while (1);
334 	card->tx.pending = 0;
335 	return ret;
336 }
337 
338 int softing_chip_poweron(struct softing *card)
339 {
340 	int ret;
341 	/* sync */
342 	ret = _softing_fct_cmd(card, 99, 0x55, "sync-a");
343 	if (ret < 0)
344 		goto failed;
345 
346 	ret = _softing_fct_cmd(card, 99, 0xaa, "sync-b");
347 	if (ret < 0)
348 		goto failed;
349 
350 	ret = softing_reset_chip(card);
351 	if (ret < 0)
352 		goto failed;
353 	/* get_serial */
354 	ret = softing_fct_cmd(card, 43, "get_serial_number");
355 	if (ret < 0)
356 		goto failed;
357 	card->id.serial = ioread32(&card->dpram[DPRAM_FCT_PARAM]);
358 	/* get_version */
359 	ret = softing_fct_cmd(card, 12, "get_version");
360 	if (ret < 0)
361 		goto failed;
362 	card->id.fw_version = ioread16(&card->dpram[DPRAM_FCT_PARAM + 2]);
363 	card->id.hw_version = ioread16(&card->dpram[DPRAM_FCT_PARAM + 4]);
364 	card->id.license = ioread16(&card->dpram[DPRAM_FCT_PARAM + 6]);
365 	card->id.chip[0] = ioread16(&card->dpram[DPRAM_FCT_PARAM + 8]);
366 	card->id.chip[1] = ioread16(&card->dpram[DPRAM_FCT_PARAM + 10]);
367 	return 0;
368 failed:
369 	return ret;
370 }
371 
372 static void softing_initialize_timestamp(struct softing *card)
373 {
374 	uint64_t ovf;
375 
376 	card->ts_ref = ktime_get();
377 
378 	/* 16MHz is the reference */
379 	ovf = 0x100000000ULL * 16;
380 	do_div(ovf, card->pdat->freq ?: 16);
381 
382 	card->ts_overflow = ktime_add_us(0, ovf);
383 }
384 
385 ktime_t softing_raw2ktime(struct softing *card, u32 raw)
386 {
387 	uint64_t rawl;
388 	ktime_t now, real_offset;
389 	ktime_t target;
390 	ktime_t tmp;
391 
392 	now = ktime_get();
393 	real_offset = ktime_sub(ktime_get_real(), now);
394 
395 	/* find nsec from card */
396 	rawl = raw * 16;
397 	do_div(rawl, card->pdat->freq ?: 16);
398 	target = ktime_add_us(card->ts_ref, rawl);
399 	/* test for overflows */
400 	tmp = ktime_add(target, card->ts_overflow);
401 	while (unlikely(ktime_to_ns(tmp) > ktime_to_ns(now))) {
402 		card->ts_ref = ktime_add(card->ts_ref, card->ts_overflow);
403 		target = tmp;
404 		tmp = ktime_add(target, card->ts_overflow);
405 	}
406 	return ktime_add(target, real_offset);
407 }
408 
409 static inline int softing_error_reporting(struct net_device *netdev)
410 {
411 	struct softing_priv *priv = netdev_priv(netdev);
412 
413 	return (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)
414 		? 1 : 0;
415 }
416 
417 int softing_startstop(struct net_device *dev, int up)
418 {
419 	int ret;
420 	struct softing *card;
421 	struct softing_priv *priv;
422 	struct net_device *netdev;
423 	int bus_bitmask_start;
424 	int j, error_reporting;
425 	struct can_frame msg;
426 	const struct can_bittiming *bt;
427 
428 	priv = netdev_priv(dev);
429 	card = priv->card;
430 
431 	if (!card->fw.up)
432 		return -EIO;
433 
434 	ret = mutex_lock_interruptible(&card->fw.lock);
435 	if (ret)
436 		return ret;
437 
438 	bus_bitmask_start = 0;
439 	if (dev && up)
440 		/* prepare to start this bus as well */
441 		bus_bitmask_start |= (1 << priv->index);
442 	/* bring netdevs down */
443 	for (j = 0; j < ARRAY_SIZE(card->net); ++j) {
444 		netdev = card->net[j];
445 		if (!netdev)
446 			continue;
447 		priv = netdev_priv(netdev);
448 
449 		if (dev != netdev)
450 			netif_stop_queue(netdev);
451 
452 		if (netif_running(netdev)) {
453 			if (dev != netdev)
454 				bus_bitmask_start |= (1 << j);
455 			priv->tx.pending = 0;
456 			priv->tx.echo_put = 0;
457 			priv->tx.echo_get = 0;
458 			/*
459 			 * this bus' may just have called open_candev()
460 			 * which is rather stupid to call close_candev()
461 			 * already
462 			 * but we may come here from busoff recovery too
463 			 * in which case the echo_skb _needs_ flushing too.
464 			 * just be sure to call open_candev() again
465 			 */
466 			close_candev(netdev);
467 		}
468 		priv->can.state = CAN_STATE_STOPPED;
469 	}
470 	card->tx.pending = 0;
471 
472 	softing_enable_irq(card, 0);
473 	ret = softing_reset_chip(card);
474 	if (ret)
475 		goto failed;
476 	if (!bus_bitmask_start)
477 		/* no buses to be brought up */
478 		goto card_done;
479 
480 	if ((bus_bitmask_start & 1) && (bus_bitmask_start & 2)
481 			&& (softing_error_reporting(card->net[0])
482 				!= softing_error_reporting(card->net[1]))) {
483 		dev_alert(&card->pdev->dev,
484 				"err_reporting flag differs for buses\n");
485 		goto invalid;
486 	}
487 	error_reporting = 0;
488 	if (bus_bitmask_start & 1) {
489 		netdev = card->net[0];
490 		priv = netdev_priv(netdev);
491 		error_reporting += softing_error_reporting(netdev);
492 		/* init chip 1 */
493 		bt = &priv->can.bittiming;
494 		iowrite16(bt->brp, &card->dpram[DPRAM_FCT_PARAM + 2]);
495 		iowrite16(bt->sjw, &card->dpram[DPRAM_FCT_PARAM + 4]);
496 		iowrite16(bt->phase_seg1 + bt->prop_seg,
497 				&card->dpram[DPRAM_FCT_PARAM + 6]);
498 		iowrite16(bt->phase_seg2, &card->dpram[DPRAM_FCT_PARAM + 8]);
499 		iowrite16((priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) ? 1 : 0,
500 				&card->dpram[DPRAM_FCT_PARAM + 10]);
501 		ret = softing_fct_cmd(card, 1, "initialize_chip[0]");
502 		if (ret < 0)
503 			goto failed;
504 		/* set mode */
505 		iowrite16(0, &card->dpram[DPRAM_FCT_PARAM + 2]);
506 		iowrite16(0, &card->dpram[DPRAM_FCT_PARAM + 4]);
507 		ret = softing_fct_cmd(card, 3, "set_mode[0]");
508 		if (ret < 0)
509 			goto failed;
510 		/* set filter */
511 		/* 11bit id & mask */
512 		iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 2]);
513 		iowrite16(0x07ff, &card->dpram[DPRAM_FCT_PARAM + 4]);
514 		/* 29bit id.lo & mask.lo & id.hi & mask.hi */
515 		iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 6]);
516 		iowrite16(0xffff, &card->dpram[DPRAM_FCT_PARAM + 8]);
517 		iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 10]);
518 		iowrite16(0x1fff, &card->dpram[DPRAM_FCT_PARAM + 12]);
519 		ret = softing_fct_cmd(card, 7, "set_filter[0]");
520 		if (ret < 0)
521 			goto failed;
522 		/* set output control */
523 		iowrite16(priv->output, &card->dpram[DPRAM_FCT_PARAM + 2]);
524 		ret = softing_fct_cmd(card, 5, "set_output[0]");
525 		if (ret < 0)
526 			goto failed;
527 	}
528 	if (bus_bitmask_start & 2) {
529 		netdev = card->net[1];
530 		priv = netdev_priv(netdev);
531 		error_reporting += softing_error_reporting(netdev);
532 		/* init chip2 */
533 		bt = &priv->can.bittiming;
534 		iowrite16(bt->brp, &card->dpram[DPRAM_FCT_PARAM + 2]);
535 		iowrite16(bt->sjw, &card->dpram[DPRAM_FCT_PARAM + 4]);
536 		iowrite16(bt->phase_seg1 + bt->prop_seg,
537 				&card->dpram[DPRAM_FCT_PARAM + 6]);
538 		iowrite16(bt->phase_seg2, &card->dpram[DPRAM_FCT_PARAM + 8]);
539 		iowrite16((priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) ? 1 : 0,
540 				&card->dpram[DPRAM_FCT_PARAM + 10]);
541 		ret = softing_fct_cmd(card, 2, "initialize_chip[1]");
542 		if (ret < 0)
543 			goto failed;
544 		/* set mode2 */
545 		iowrite16(0, &card->dpram[DPRAM_FCT_PARAM + 2]);
546 		iowrite16(0, &card->dpram[DPRAM_FCT_PARAM + 4]);
547 		ret = softing_fct_cmd(card, 4, "set_mode[1]");
548 		if (ret < 0)
549 			goto failed;
550 		/* set filter2 */
551 		/* 11bit id & mask */
552 		iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 2]);
553 		iowrite16(0x07ff, &card->dpram[DPRAM_FCT_PARAM + 4]);
554 		/* 29bit id.lo & mask.lo & id.hi & mask.hi */
555 		iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 6]);
556 		iowrite16(0xffff, &card->dpram[DPRAM_FCT_PARAM + 8]);
557 		iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 10]);
558 		iowrite16(0x1fff, &card->dpram[DPRAM_FCT_PARAM + 12]);
559 		ret = softing_fct_cmd(card, 8, "set_filter[1]");
560 		if (ret < 0)
561 			goto failed;
562 		/* set output control2 */
563 		iowrite16(priv->output, &card->dpram[DPRAM_FCT_PARAM + 2]);
564 		ret = softing_fct_cmd(card, 6, "set_output[1]");
565 		if (ret < 0)
566 			goto failed;
567 	}
568 	/* enable_error_frame */
569 	/*
570 	 * Error reporting is switched off at the moment since
571 	 * the receiving of them is not yet 100% verified
572 	 * This should be enabled sooner or later
573 	 *
574 	if (error_reporting) {
575 		ret = softing_fct_cmd(card, 51, "enable_error_frame");
576 		if (ret < 0)
577 			goto failed;
578 	}
579 	*/
580 	/* initialize interface */
581 	iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 2]);
582 	iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 4]);
583 	iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 6]);
584 	iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 8]);
585 	iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 10]);
586 	iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 12]);
587 	iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 14]);
588 	iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 16]);
589 	iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 18]);
590 	iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 20]);
591 	ret = softing_fct_cmd(card, 17, "initialize_interface");
592 	if (ret < 0)
593 		goto failed;
594 	/* enable_fifo */
595 	ret = softing_fct_cmd(card, 36, "enable_fifo");
596 	if (ret < 0)
597 		goto failed;
598 	/* enable fifo tx ack */
599 	ret = softing_fct_cmd(card, 13, "fifo_tx_ack[0]");
600 	if (ret < 0)
601 		goto failed;
602 	/* enable fifo tx ack2 */
603 	ret = softing_fct_cmd(card, 14, "fifo_tx_ack[1]");
604 	if (ret < 0)
605 		goto failed;
606 	/* start_chip */
607 	ret = softing_fct_cmd(card, 11, "start_chip");
608 	if (ret < 0)
609 		goto failed;
610 	iowrite8(0, &card->dpram[DPRAM_INFO_BUSSTATE]);
611 	iowrite8(0, &card->dpram[DPRAM_INFO_BUSSTATE2]);
612 	if (card->pdat->generation < 2) {
613 		iowrite8(0, &card->dpram[DPRAM_V2_IRQ_TOHOST]);
614 		/* flush the DPRAM caches */
615 		wmb();
616 	}
617 
618 	softing_initialize_timestamp(card);
619 
620 	/*
621 	 * do socketcan notifications/status changes
622 	 * from here, no errors should occur, or the failed: part
623 	 * must be reviewed
624 	 */
625 	memset(&msg, 0, sizeof(msg));
626 	msg.can_id = CAN_ERR_FLAG | CAN_ERR_RESTARTED;
627 	msg.len = CAN_ERR_DLC;
628 	for (j = 0; j < ARRAY_SIZE(card->net); ++j) {
629 		if (!(bus_bitmask_start & (1 << j)))
630 			continue;
631 		netdev = card->net[j];
632 		if (!netdev)
633 			continue;
634 		priv = netdev_priv(netdev);
635 		priv->can.state = CAN_STATE_ERROR_ACTIVE;
636 		open_candev(netdev);
637 		if (dev != netdev) {
638 			/* notify other buses on the restart */
639 			softing_netdev_rx(netdev, &msg, 0);
640 			++priv->can.can_stats.restarts;
641 		}
642 		netif_wake_queue(netdev);
643 	}
644 
645 	/* enable interrupts */
646 	ret = softing_enable_irq(card, 1);
647 	if (ret)
648 		goto failed;
649 card_done:
650 	mutex_unlock(&card->fw.lock);
651 	return 0;
652 invalid:
653 	ret = -EINVAL;
654 failed:
655 	softing_enable_irq(card, 0);
656 	softing_reset_chip(card);
657 	mutex_unlock(&card->fw.lock);
658 	/* bring all other interfaces down */
659 	for (j = 0; j < ARRAY_SIZE(card->net); ++j) {
660 		netdev = card->net[j];
661 		if (!netdev)
662 			continue;
663 		dev_close(netdev);
664 	}
665 	return ret;
666 }
667 
668 int softing_default_output(struct net_device *netdev)
669 {
670 	struct softing_priv *priv = netdev_priv(netdev);
671 	struct softing *card = priv->card;
672 
673 	switch (priv->chip) {
674 	case 1000:
675 		return (card->pdat->generation < 2) ? 0xfb : 0xfa;
676 	case 5:
677 		return 0x60;
678 	default:
679 		return 0x40;
680 	}
681 }
682