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