softing_fw.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  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. #include <linux/firmware.h>
  19. #include <linux/sched.h>
  20. #include <asm/div64.h>
  21. #include <asm/io.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, *new_buf;
  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. new_buf = krealloc(buf, buflen, GFP_KERNEL);
  186. if (!new_buf) {
  187. ret = -ENOMEM;
  188. goto failed;
  189. }
  190. buf = new_buf;
  191. }
  192. /* verify record data */
  193. memcpy_fromio(buf, &dpram[addr + offset], len);
  194. if (memcmp(buf, dat, len)) {
  195. /* is not ok */
  196. dev_alert(&card->pdev->dev, "DPRAM readback failed\n");
  197. ret = -EIO;
  198. goto failed;
  199. }
  200. }
  201. if (!type_end)
  202. /* no end record seen */
  203. goto failed;
  204. ret = 0;
  205. failed:
  206. kfree(buf);
  207. release_firmware(fw);
  208. if (ret < 0)
  209. dev_info(&card->pdev->dev, "firmware %s failed\n", file);
  210. return ret;
  211. }
  212. int softing_load_app_fw(const char *file, struct softing *card)
  213. {
  214. const struct firmware *fw;
  215. const uint8_t *mem, *end, *dat;
  216. int ret, j;
  217. uint16_t type, len;
  218. uint32_t addr, start_addr = 0;
  219. unsigned int sum, rx_sum;
  220. int8_t type_end = 0, type_entrypoint = 0;
  221. ret = request_firmware(&fw, file, &card->pdev->dev);
  222. if (ret) {
  223. dev_alert(&card->pdev->dev, "request_firmware(%s) got %i\n",
  224. file, ret);
  225. return ret;
  226. }
  227. dev_dbg(&card->pdev->dev, "firmware(%s) got %lu bytes\n",
  228. file, (unsigned long)fw->size);
  229. /* parse the firmware */
  230. mem = fw->data;
  231. end = &mem[fw->size];
  232. /* look for header record */
  233. ret = fw_parse(&mem, &type, &addr, &len, &dat);
  234. if (ret)
  235. goto failed;
  236. ret = -EINVAL;
  237. if (type != 0xffff) {
  238. dev_alert(&card->pdev->dev, "firmware starts with type 0x%x\n",
  239. type);
  240. goto failed;
  241. }
  242. if (strncmp("Structured Binary Format, Softing GmbH", dat, len)) {
  243. dev_alert(&card->pdev->dev, "firmware string '%.*s' fault\n",
  244. len, dat);
  245. goto failed;
  246. }
  247. /* ok, we had a header */
  248. while (mem < end) {
  249. ret = fw_parse(&mem, &type, &addr, &len, &dat);
  250. if (ret)
  251. goto failed;
  252. if (type == 3) {
  253. /* start address */
  254. start_addr = addr;
  255. type_entrypoint = 1;
  256. continue;
  257. } else if (type == 1) {
  258. /* eof */
  259. type_end = 1;
  260. break;
  261. } else if (type != 0) {
  262. dev_alert(&card->pdev->dev,
  263. "unknown record type 0x%04x\n", type);
  264. ret = -EINVAL;
  265. goto failed;
  266. }
  267. /* regualar data */
  268. for (sum = 0, j = 0; j < len; ++j)
  269. sum += dat[j];
  270. /* work in 16bit (target) */
  271. sum &= 0xffff;
  272. memcpy_toio(&card->dpram[card->pdat->app.offs], dat, len);
  273. iowrite32(card->pdat->app.offs + card->pdat->app.addr,
  274. &card->dpram[DPRAM_COMMAND + 2]);
  275. iowrite32(addr, &card->dpram[DPRAM_COMMAND + 6]);
  276. iowrite16(len, &card->dpram[DPRAM_COMMAND + 10]);
  277. iowrite8(1, &card->dpram[DPRAM_COMMAND + 12]);
  278. ret = softing_bootloader_command(card, 1, "loading app.");
  279. if (ret < 0)
  280. goto failed;
  281. /* verify checksum */
  282. rx_sum = ioread16(&card->dpram[DPRAM_RECEIPT + 2]);
  283. if (rx_sum != sum) {
  284. dev_alert(&card->pdev->dev, "SRAM seems to be damaged"
  285. ", wanted 0x%04x, got 0x%04x\n", sum, rx_sum);
  286. ret = -EIO;
  287. goto failed;
  288. }
  289. }
  290. if (!type_end || !type_entrypoint)
  291. goto failed;
  292. /* start application in card */
  293. iowrite32(start_addr, &card->dpram[DPRAM_COMMAND + 2]);
  294. iowrite8(1, &card->dpram[DPRAM_COMMAND + 6]);
  295. ret = softing_bootloader_command(card, 3, "start app.");
  296. if (ret < 0)
  297. goto failed;
  298. ret = 0;
  299. failed:
  300. release_firmware(fw);
  301. if (ret < 0)
  302. dev_info(&card->pdev->dev, "firmware %s failed\n", file);
  303. return ret;
  304. }
  305. static int softing_reset_chip(struct softing *card)
  306. {
  307. int ret;
  308. do {
  309. /* reset chip */
  310. iowrite8(0, &card->dpram[DPRAM_RESET_RX_FIFO]);
  311. iowrite8(0, &card->dpram[DPRAM_RESET_RX_FIFO+1]);
  312. iowrite8(1, &card->dpram[DPRAM_RESET]);
  313. iowrite8(0, &card->dpram[DPRAM_RESET+1]);
  314. ret = softing_fct_cmd(card, 0, "reset_can");
  315. if (!ret)
  316. break;
  317. if (signal_pending(current))
  318. /* don't wait any longer */
  319. break;
  320. } while (1);
  321. card->tx.pending = 0;
  322. return ret;
  323. }
  324. int softing_chip_poweron(struct softing *card)
  325. {
  326. int ret;
  327. /* sync */
  328. ret = _softing_fct_cmd(card, 99, 0x55, "sync-a");
  329. if (ret < 0)
  330. goto failed;
  331. ret = _softing_fct_cmd(card, 99, 0xaa, "sync-b");
  332. if (ret < 0)
  333. goto failed;
  334. ret = softing_reset_chip(card);
  335. if (ret < 0)
  336. goto failed;
  337. /* get_serial */
  338. ret = softing_fct_cmd(card, 43, "get_serial_number");
  339. if (ret < 0)
  340. goto failed;
  341. card->id.serial = ioread32(&card->dpram[DPRAM_FCT_PARAM]);
  342. /* get_version */
  343. ret = softing_fct_cmd(card, 12, "get_version");
  344. if (ret < 0)
  345. goto failed;
  346. card->id.fw_version = ioread16(&card->dpram[DPRAM_FCT_PARAM + 2]);
  347. card->id.hw_version = ioread16(&card->dpram[DPRAM_FCT_PARAM + 4]);
  348. card->id.license = ioread16(&card->dpram[DPRAM_FCT_PARAM + 6]);
  349. card->id.chip[0] = ioread16(&card->dpram[DPRAM_FCT_PARAM + 8]);
  350. card->id.chip[1] = ioread16(&card->dpram[DPRAM_FCT_PARAM + 10]);
  351. return 0;
  352. failed:
  353. return ret;
  354. }
  355. static void softing_initialize_timestamp(struct softing *card)
  356. {
  357. uint64_t ovf;
  358. card->ts_ref = ktime_get();
  359. /* 16MHz is the reference */
  360. ovf = 0x100000000ULL * 16;
  361. do_div(ovf, card->pdat->freq ?: 16);
  362. card->ts_overflow = ktime_add_us(ktime_set(0, 0), ovf);
  363. }
  364. ktime_t softing_raw2ktime(struct softing *card, u32 raw)
  365. {
  366. uint64_t rawl;
  367. ktime_t now, real_offset;
  368. ktime_t target;
  369. ktime_t tmp;
  370. now = ktime_get();
  371. real_offset = ktime_sub(ktime_get_real(), now);
  372. /* find nsec from card */
  373. rawl = raw * 16;
  374. do_div(rawl, card->pdat->freq ?: 16);
  375. target = ktime_add_us(card->ts_ref, rawl);
  376. /* test for overflows */
  377. tmp = ktime_add(target, card->ts_overflow);
  378. while (unlikely(ktime_to_ns(tmp) > ktime_to_ns(now))) {
  379. card->ts_ref = ktime_add(card->ts_ref, card->ts_overflow);
  380. target = tmp;
  381. tmp = ktime_add(target, card->ts_overflow);
  382. }
  383. return ktime_add(target, real_offset);
  384. }
  385. static inline int softing_error_reporting(struct net_device *netdev)
  386. {
  387. struct softing_priv *priv = netdev_priv(netdev);
  388. return (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)
  389. ? 1 : 0;
  390. }
  391. int softing_startstop(struct net_device *dev, int up)
  392. {
  393. int ret;
  394. struct softing *card;
  395. struct softing_priv *priv;
  396. struct net_device *netdev;
  397. int bus_bitmask_start;
  398. int j, error_reporting;
  399. struct can_frame msg;
  400. const struct can_bittiming *bt;
  401. priv = netdev_priv(dev);
  402. card = priv->card;
  403. if (!card->fw.up)
  404. return -EIO;
  405. ret = mutex_lock_interruptible(&card->fw.lock);
  406. if (ret)
  407. return ret;
  408. bus_bitmask_start = 0;
  409. if (dev && up)
  410. /* prepare to start this bus as well */
  411. bus_bitmask_start |= (1 << priv->index);
  412. /* bring netdevs down */
  413. for (j = 0; j < ARRAY_SIZE(card->net); ++j) {
  414. netdev = card->net[j];
  415. if (!netdev)
  416. continue;
  417. priv = netdev_priv(netdev);
  418. if (dev != netdev)
  419. netif_stop_queue(netdev);
  420. if (netif_running(netdev)) {
  421. if (dev != netdev)
  422. bus_bitmask_start |= (1 << j);
  423. priv->tx.pending = 0;
  424. priv->tx.echo_put = 0;
  425. priv->tx.echo_get = 0;
  426. /*
  427. * this bus' may just have called open_candev()
  428. * which is rather stupid to call close_candev()
  429. * already
  430. * but we may come here from busoff recovery too
  431. * in which case the echo_skb _needs_ flushing too.
  432. * just be sure to call open_candev() again
  433. */
  434. close_candev(netdev);
  435. }
  436. priv->can.state = CAN_STATE_STOPPED;
  437. }
  438. card->tx.pending = 0;
  439. softing_enable_irq(card, 0);
  440. ret = softing_reset_chip(card);
  441. if (ret)
  442. goto failed;
  443. if (!bus_bitmask_start)
  444. /* no busses to be brought up */
  445. goto card_done;
  446. if ((bus_bitmask_start & 1) && (bus_bitmask_start & 2)
  447. && (softing_error_reporting(card->net[0])
  448. != softing_error_reporting(card->net[1]))) {
  449. dev_alert(&card->pdev->dev,
  450. "err_reporting flag differs for busses\n");
  451. goto invalid;
  452. }
  453. error_reporting = 0;
  454. if (bus_bitmask_start & 1) {
  455. netdev = card->net[0];
  456. priv = netdev_priv(netdev);
  457. error_reporting += softing_error_reporting(netdev);
  458. /* init chip 1 */
  459. bt = &priv->can.bittiming;
  460. iowrite16(bt->brp, &card->dpram[DPRAM_FCT_PARAM + 2]);
  461. iowrite16(bt->sjw, &card->dpram[DPRAM_FCT_PARAM + 4]);
  462. iowrite16(bt->phase_seg1 + bt->prop_seg,
  463. &card->dpram[DPRAM_FCT_PARAM + 6]);
  464. iowrite16(bt->phase_seg2, &card->dpram[DPRAM_FCT_PARAM + 8]);
  465. iowrite16((priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) ? 1 : 0,
  466. &card->dpram[DPRAM_FCT_PARAM + 10]);
  467. ret = softing_fct_cmd(card, 1, "initialize_chip[0]");
  468. if (ret < 0)
  469. goto failed;
  470. /* set mode */
  471. iowrite16(0, &card->dpram[DPRAM_FCT_PARAM + 2]);
  472. iowrite16(0, &card->dpram[DPRAM_FCT_PARAM + 4]);
  473. ret = softing_fct_cmd(card, 3, "set_mode[0]");
  474. if (ret < 0)
  475. goto failed;
  476. /* set filter */
  477. /* 11bit id & mask */
  478. iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 2]);
  479. iowrite16(0x07ff, &card->dpram[DPRAM_FCT_PARAM + 4]);
  480. /* 29bit id.lo & mask.lo & id.hi & mask.hi */
  481. iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 6]);
  482. iowrite16(0xffff, &card->dpram[DPRAM_FCT_PARAM + 8]);
  483. iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 10]);
  484. iowrite16(0x1fff, &card->dpram[DPRAM_FCT_PARAM + 12]);
  485. ret = softing_fct_cmd(card, 7, "set_filter[0]");
  486. if (ret < 0)
  487. goto failed;
  488. /* set output control */
  489. iowrite16(priv->output, &card->dpram[DPRAM_FCT_PARAM + 2]);
  490. ret = softing_fct_cmd(card, 5, "set_output[0]");
  491. if (ret < 0)
  492. goto failed;
  493. }
  494. if (bus_bitmask_start & 2) {
  495. netdev = card->net[1];
  496. priv = netdev_priv(netdev);
  497. error_reporting += softing_error_reporting(netdev);
  498. /* init chip2 */
  499. bt = &priv->can.bittiming;
  500. iowrite16(bt->brp, &card->dpram[DPRAM_FCT_PARAM + 2]);
  501. iowrite16(bt->sjw, &card->dpram[DPRAM_FCT_PARAM + 4]);
  502. iowrite16(bt->phase_seg1 + bt->prop_seg,
  503. &card->dpram[DPRAM_FCT_PARAM + 6]);
  504. iowrite16(bt->phase_seg2, &card->dpram[DPRAM_FCT_PARAM + 8]);
  505. iowrite16((priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) ? 1 : 0,
  506. &card->dpram[DPRAM_FCT_PARAM + 10]);
  507. ret = softing_fct_cmd(card, 2, "initialize_chip[1]");
  508. if (ret < 0)
  509. goto failed;
  510. /* set mode2 */
  511. iowrite16(0, &card->dpram[DPRAM_FCT_PARAM + 2]);
  512. iowrite16(0, &card->dpram[DPRAM_FCT_PARAM + 4]);
  513. ret = softing_fct_cmd(card, 4, "set_mode[1]");
  514. if (ret < 0)
  515. goto failed;
  516. /* set filter2 */
  517. /* 11bit id & mask */
  518. iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 2]);
  519. iowrite16(0x07ff, &card->dpram[DPRAM_FCT_PARAM + 4]);
  520. /* 29bit id.lo & mask.lo & id.hi & mask.hi */
  521. iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 6]);
  522. iowrite16(0xffff, &card->dpram[DPRAM_FCT_PARAM + 8]);
  523. iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 10]);
  524. iowrite16(0x1fff, &card->dpram[DPRAM_FCT_PARAM + 12]);
  525. ret = softing_fct_cmd(card, 8, "set_filter[1]");
  526. if (ret < 0)
  527. goto failed;
  528. /* set output control2 */
  529. iowrite16(priv->output, &card->dpram[DPRAM_FCT_PARAM + 2]);
  530. ret = softing_fct_cmd(card, 6, "set_output[1]");
  531. if (ret < 0)
  532. goto failed;
  533. }
  534. /* enable_error_frame */
  535. /*
  536. * Error reporting is switched off at the moment since
  537. * the receiving of them is not yet 100% verified
  538. * This should be enabled sooner or later
  539. *
  540. if (error_reporting) {
  541. ret = softing_fct_cmd(card, 51, "enable_error_frame");
  542. if (ret < 0)
  543. goto failed;
  544. }
  545. */
  546. /* initialize interface */
  547. iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 2]);
  548. iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 4]);
  549. iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 6]);
  550. iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 8]);
  551. iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 10]);
  552. iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 12]);
  553. iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 14]);
  554. iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 16]);
  555. iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 18]);
  556. iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 20]);
  557. ret = softing_fct_cmd(card, 17, "initialize_interface");
  558. if (ret < 0)
  559. goto failed;
  560. /* enable_fifo */
  561. ret = softing_fct_cmd(card, 36, "enable_fifo");
  562. if (ret < 0)
  563. goto failed;
  564. /* enable fifo tx ack */
  565. ret = softing_fct_cmd(card, 13, "fifo_tx_ack[0]");
  566. if (ret < 0)
  567. goto failed;
  568. /* enable fifo tx ack2 */
  569. ret = softing_fct_cmd(card, 14, "fifo_tx_ack[1]");
  570. if (ret < 0)
  571. goto failed;
  572. /* start_chip */
  573. ret = softing_fct_cmd(card, 11, "start_chip");
  574. if (ret < 0)
  575. goto failed;
  576. iowrite8(0, &card->dpram[DPRAM_INFO_BUSSTATE]);
  577. iowrite8(0, &card->dpram[DPRAM_INFO_BUSSTATE2]);
  578. if (card->pdat->generation < 2) {
  579. iowrite8(0, &card->dpram[DPRAM_V2_IRQ_TOHOST]);
  580. /* flush the DPRAM caches */
  581. wmb();
  582. }
  583. softing_initialize_timestamp(card);
  584. /*
  585. * do socketcan notifications/status changes
  586. * from here, no errors should occur, or the failed: part
  587. * must be reviewed
  588. */
  589. memset(&msg, 0, sizeof(msg));
  590. msg.can_id = CAN_ERR_FLAG | CAN_ERR_RESTARTED;
  591. msg.can_dlc = CAN_ERR_DLC;
  592. for (j = 0; j < ARRAY_SIZE(card->net); ++j) {
  593. if (!(bus_bitmask_start & (1 << j)))
  594. continue;
  595. netdev = card->net[j];
  596. if (!netdev)
  597. continue;
  598. priv = netdev_priv(netdev);
  599. priv->can.state = CAN_STATE_ERROR_ACTIVE;
  600. open_candev(netdev);
  601. if (dev != netdev) {
  602. /* notify other busses on the restart */
  603. softing_netdev_rx(netdev, &msg, ktime_set(0, 0));
  604. ++priv->can.can_stats.restarts;
  605. }
  606. netif_wake_queue(netdev);
  607. }
  608. /* enable interrupts */
  609. ret = softing_enable_irq(card, 1);
  610. if (ret)
  611. goto failed;
  612. card_done:
  613. mutex_unlock(&card->fw.lock);
  614. return 0;
  615. invalid:
  616. ret = -EINVAL;
  617. failed:
  618. softing_enable_irq(card, 0);
  619. softing_reset_chip(card);
  620. mutex_unlock(&card->fw.lock);
  621. /* bring all other interfaces down */
  622. for (j = 0; j < ARRAY_SIZE(card->net); ++j) {
  623. netdev = card->net[j];
  624. if (!netdev)
  625. continue;
  626. dev_close(netdev);
  627. }
  628. return ret;
  629. }
  630. int softing_default_output(struct net_device *netdev)
  631. {
  632. struct softing_priv *priv = netdev_priv(netdev);
  633. struct softing *card = priv->card;
  634. switch (priv->chip) {
  635. case 1000:
  636. return (card->pdat->generation < 2) ? 0xfb : 0xfa;
  637. case 5:
  638. return 0x60;
  639. default:
  640. return 0x40;
  641. }
  642. }