softing_fw.c 18 KB

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