softing_fw.c 18 KB

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