softing_main.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895
  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/version.h>
  20. #include <linux/module.h>
  21. #include <linux/init.h>
  22. #include <linux/interrupt.h>
  23. #include <asm/io.h>
  24. #include "softing.h"
  25. #define TX_ECHO_SKB_MAX (((TXMAX+1)/2)-1)
  26. /*
  27. * test is a specific CAN netdev
  28. * is online (ie. up 'n running, not sleeping, not busoff
  29. */
  30. static inline int canif_is_active(struct net_device *netdev)
  31. {
  32. struct can_priv *can = netdev_priv(netdev);
  33. if (!netif_running(netdev))
  34. return 0;
  35. return (can->state <= CAN_STATE_ERROR_PASSIVE);
  36. }
  37. /* reset DPRAM */
  38. static inline void softing_set_reset_dpram(struct softing *card)
  39. {
  40. if (card->pdat->generation >= 2) {
  41. spin_lock_bh(&card->spin);
  42. iowrite8(ioread8(&card->dpram[DPRAM_V2_RESET]) & ~1,
  43. &card->dpram[DPRAM_V2_RESET]);
  44. spin_unlock_bh(&card->spin);
  45. }
  46. }
  47. static inline void softing_clr_reset_dpram(struct softing *card)
  48. {
  49. if (card->pdat->generation >= 2) {
  50. spin_lock_bh(&card->spin);
  51. iowrite8(ioread8(&card->dpram[DPRAM_V2_RESET]) | 1,
  52. &card->dpram[DPRAM_V2_RESET]);
  53. spin_unlock_bh(&card->spin);
  54. }
  55. }
  56. /* trigger the tx queue-ing */
  57. static netdev_tx_t softing_netdev_start_xmit(struct sk_buff *skb,
  58. struct net_device *dev)
  59. {
  60. struct softing_priv *priv = netdev_priv(dev);
  61. struct softing *card = priv->card;
  62. int ret;
  63. uint8_t *ptr;
  64. uint8_t fifo_wr, fifo_rd;
  65. struct can_frame *cf = (struct can_frame *)skb->data;
  66. uint8_t buf[DPRAM_TX_SIZE];
  67. if (can_dropped_invalid_skb(dev, skb))
  68. return NETDEV_TX_OK;
  69. spin_lock(&card->spin);
  70. ret = NETDEV_TX_BUSY;
  71. if (!card->fw.up ||
  72. (card->tx.pending >= TXMAX) ||
  73. (priv->tx.pending >= TX_ECHO_SKB_MAX))
  74. goto xmit_done;
  75. fifo_wr = ioread8(&card->dpram[DPRAM_TX_WR]);
  76. fifo_rd = ioread8(&card->dpram[DPRAM_TX_RD]);
  77. if (fifo_wr == fifo_rd)
  78. /* fifo full */
  79. goto xmit_done;
  80. memset(buf, 0, sizeof(buf));
  81. ptr = buf;
  82. *ptr = CMD_TX;
  83. if (cf->can_id & CAN_RTR_FLAG)
  84. *ptr |= CMD_RTR;
  85. if (cf->can_id & CAN_EFF_FLAG)
  86. *ptr |= CMD_XTD;
  87. if (priv->index)
  88. *ptr |= CMD_BUS2;
  89. ++ptr;
  90. *ptr++ = cf->can_dlc;
  91. *ptr++ = (cf->can_id >> 0);
  92. *ptr++ = (cf->can_id >> 8);
  93. if (cf->can_id & CAN_EFF_FLAG) {
  94. *ptr++ = (cf->can_id >> 16);
  95. *ptr++ = (cf->can_id >> 24);
  96. } else {
  97. /* increment 1, not 2 as you might think */
  98. ptr += 1;
  99. }
  100. if (!(cf->can_id & CAN_RTR_FLAG))
  101. memcpy(ptr, &cf->data[0], cf->can_dlc);
  102. memcpy_toio(&card->dpram[DPRAM_TX + DPRAM_TX_SIZE * fifo_wr],
  103. buf, DPRAM_TX_SIZE);
  104. if (++fifo_wr >= DPRAM_TX_CNT)
  105. fifo_wr = 0;
  106. iowrite8(fifo_wr, &card->dpram[DPRAM_TX_WR]);
  107. card->tx.last_bus = priv->index;
  108. ++card->tx.pending;
  109. ++priv->tx.pending;
  110. can_put_echo_skb(skb, dev, priv->tx.echo_put);
  111. ++priv->tx.echo_put;
  112. if (priv->tx.echo_put >= TX_ECHO_SKB_MAX)
  113. priv->tx.echo_put = 0;
  114. /* can_put_echo_skb() saves the skb, safe to return TX_OK */
  115. ret = NETDEV_TX_OK;
  116. xmit_done:
  117. spin_unlock(&card->spin);
  118. if (card->tx.pending >= TXMAX) {
  119. int j;
  120. for (j = 0; j < ARRAY_SIZE(card->net); ++j) {
  121. if (card->net[j])
  122. netif_stop_queue(card->net[j]);
  123. }
  124. }
  125. if (ret != NETDEV_TX_OK)
  126. netif_stop_queue(dev);
  127. return ret;
  128. }
  129. /*
  130. * shortcut for skb delivery
  131. */
  132. int softing_netdev_rx(struct net_device *netdev, const struct can_frame *msg,
  133. ktime_t ktime)
  134. {
  135. struct sk_buff *skb;
  136. struct can_frame *cf;
  137. skb = alloc_can_skb(netdev, &cf);
  138. if (!skb)
  139. return -ENOMEM;
  140. memcpy(cf, msg, sizeof(*msg));
  141. skb->tstamp = ktime;
  142. return netif_rx(skb);
  143. }
  144. /*
  145. * softing_handle_1
  146. * pop 1 entry from the DPRAM queue, and process
  147. */
  148. static int softing_handle_1(struct softing *card)
  149. {
  150. struct net_device *netdev;
  151. struct softing_priv *priv;
  152. ktime_t ktime;
  153. struct can_frame msg;
  154. int cnt = 0, lost_msg;
  155. uint8_t fifo_rd, fifo_wr, cmd;
  156. uint8_t *ptr;
  157. uint32_t tmp_u32;
  158. uint8_t buf[DPRAM_RX_SIZE];
  159. memset(&msg, 0, sizeof(msg));
  160. /* test for lost msgs */
  161. lost_msg = ioread8(&card->dpram[DPRAM_RX_LOST]);
  162. if (lost_msg) {
  163. int j;
  164. /* reset condition */
  165. iowrite8(0, &card->dpram[DPRAM_RX_LOST]);
  166. /* prepare msg */
  167. msg.can_id = CAN_ERR_FLAG | CAN_ERR_CRTL;
  168. msg.can_dlc = CAN_ERR_DLC;
  169. msg.data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
  170. /*
  171. * service to all busses, we don't know which it was applicable
  172. * but only service busses that are online
  173. */
  174. for (j = 0; j < ARRAY_SIZE(card->net); ++j) {
  175. netdev = card->net[j];
  176. if (!netdev)
  177. continue;
  178. if (!canif_is_active(netdev))
  179. /* a dead bus has no overflows */
  180. continue;
  181. ++netdev->stats.rx_over_errors;
  182. softing_netdev_rx(netdev, &msg, ktime_set(0, 0));
  183. }
  184. /* prepare for other use */
  185. memset(&msg, 0, sizeof(msg));
  186. ++cnt;
  187. }
  188. fifo_rd = ioread8(&card->dpram[DPRAM_RX_RD]);
  189. fifo_wr = ioread8(&card->dpram[DPRAM_RX_WR]);
  190. if (++fifo_rd >= DPRAM_RX_CNT)
  191. fifo_rd = 0;
  192. if (fifo_wr == fifo_rd)
  193. return cnt;
  194. memcpy_fromio(buf, &card->dpram[DPRAM_RX + DPRAM_RX_SIZE*fifo_rd],
  195. DPRAM_RX_SIZE);
  196. mb();
  197. /* trigger dual port RAM */
  198. iowrite8(fifo_rd, &card->dpram[DPRAM_RX_RD]);
  199. ptr = buf;
  200. cmd = *ptr++;
  201. if (cmd == 0xff)
  202. /* not quite useful, probably the card has got out */
  203. return 0;
  204. netdev = card->net[0];
  205. if (cmd & CMD_BUS2)
  206. netdev = card->net[1];
  207. priv = netdev_priv(netdev);
  208. if (cmd & CMD_ERR) {
  209. uint8_t can_state, state;
  210. state = *ptr++;
  211. msg.can_id = CAN_ERR_FLAG;
  212. msg.can_dlc = CAN_ERR_DLC;
  213. if (state & SF_MASK_BUSOFF) {
  214. can_state = CAN_STATE_BUS_OFF;
  215. msg.can_id |= CAN_ERR_BUSOFF;
  216. state = STATE_BUSOFF;
  217. } else if (state & SF_MASK_EPASSIVE) {
  218. can_state = CAN_STATE_ERROR_PASSIVE;
  219. msg.can_id |= CAN_ERR_CRTL;
  220. msg.data[1] = CAN_ERR_CRTL_TX_PASSIVE;
  221. state = STATE_EPASSIVE;
  222. } else {
  223. can_state = CAN_STATE_ERROR_ACTIVE;
  224. msg.can_id |= CAN_ERR_CRTL;
  225. state = STATE_EACTIVE;
  226. }
  227. /* update DPRAM */
  228. iowrite8(state, &card->dpram[priv->index ?
  229. DPRAM_INFO_BUSSTATE2 : DPRAM_INFO_BUSSTATE]);
  230. /* timestamp */
  231. tmp_u32 = le32_to_cpup((void *)ptr);
  232. ptr += 4;
  233. ktime = softing_raw2ktime(card, tmp_u32);
  234. ++netdev->stats.rx_errors;
  235. /* update internal status */
  236. if (can_state != priv->can.state) {
  237. priv->can.state = can_state;
  238. if (can_state == CAN_STATE_ERROR_PASSIVE)
  239. ++priv->can.can_stats.error_passive;
  240. else if (can_state == CAN_STATE_BUS_OFF) {
  241. /* this calls can_close_cleanup() */
  242. can_bus_off(netdev);
  243. netif_stop_queue(netdev);
  244. }
  245. /* trigger socketcan */
  246. softing_netdev_rx(netdev, &msg, ktime);
  247. }
  248. } else {
  249. if (cmd & CMD_RTR)
  250. msg.can_id |= CAN_RTR_FLAG;
  251. msg.can_dlc = get_can_dlc(*ptr++);
  252. if (cmd & CMD_XTD) {
  253. msg.can_id |= CAN_EFF_FLAG;
  254. msg.can_id |= le32_to_cpup((void *)ptr);
  255. ptr += 4;
  256. } else {
  257. msg.can_id |= le16_to_cpup((void *)ptr);
  258. ptr += 2;
  259. }
  260. /* timestamp */
  261. tmp_u32 = le32_to_cpup((void *)ptr);
  262. ptr += 4;
  263. ktime = softing_raw2ktime(card, tmp_u32);
  264. if (!(msg.can_id & CAN_RTR_FLAG))
  265. memcpy(&msg.data[0], ptr, 8);
  266. ptr += 8;
  267. /* update socket */
  268. if (cmd & CMD_ACK) {
  269. /* acknowledge, was tx msg */
  270. struct sk_buff *skb;
  271. skb = priv->can.echo_skb[priv->tx.echo_get];
  272. if (skb)
  273. skb->tstamp = ktime;
  274. can_get_echo_skb(netdev, priv->tx.echo_get);
  275. ++priv->tx.echo_get;
  276. if (priv->tx.echo_get >= TX_ECHO_SKB_MAX)
  277. priv->tx.echo_get = 0;
  278. if (priv->tx.pending)
  279. --priv->tx.pending;
  280. if (card->tx.pending)
  281. --card->tx.pending;
  282. ++netdev->stats.tx_packets;
  283. if (!(msg.can_id & CAN_RTR_FLAG))
  284. netdev->stats.tx_bytes += msg.can_dlc;
  285. } else {
  286. int ret;
  287. ret = softing_netdev_rx(netdev, &msg, ktime);
  288. if (ret == NET_RX_SUCCESS) {
  289. ++netdev->stats.rx_packets;
  290. if (!(msg.can_id & CAN_RTR_FLAG))
  291. netdev->stats.rx_bytes += msg.can_dlc;
  292. } else {
  293. ++netdev->stats.rx_dropped;
  294. }
  295. }
  296. }
  297. ++cnt;
  298. return cnt;
  299. }
  300. /*
  301. * real interrupt handler
  302. */
  303. static irqreturn_t softing_irq_thread(int irq, void *dev_id)
  304. {
  305. struct softing *card = (struct softing *)dev_id;
  306. struct net_device *netdev;
  307. struct softing_priv *priv;
  308. int j, offset, work_done;
  309. work_done = 0;
  310. spin_lock_bh(&card->spin);
  311. while (softing_handle_1(card) > 0) {
  312. ++card->irq.svc_count;
  313. ++work_done;
  314. }
  315. spin_unlock_bh(&card->spin);
  316. /* resume tx queue's */
  317. offset = card->tx.last_bus;
  318. for (j = 0; j < ARRAY_SIZE(card->net); ++j) {
  319. if (card->tx.pending >= TXMAX)
  320. break;
  321. netdev = card->net[(j + offset + 1) % card->pdat->nbus];
  322. if (!netdev)
  323. continue;
  324. priv = netdev_priv(netdev);
  325. if (!canif_is_active(netdev))
  326. /* it makes no sense to wake dead busses */
  327. continue;
  328. if (priv->tx.pending >= TX_ECHO_SKB_MAX)
  329. continue;
  330. ++work_done;
  331. netif_wake_queue(netdev);
  332. }
  333. return work_done ? IRQ_HANDLED : IRQ_NONE;
  334. }
  335. /*
  336. * interrupt routines:
  337. * schedule the 'real interrupt handler'
  338. */
  339. static irqreturn_t softing_irq_v2(int irq, void *dev_id)
  340. {
  341. struct softing *card = (struct softing *)dev_id;
  342. uint8_t ir;
  343. ir = ioread8(&card->dpram[DPRAM_V2_IRQ_TOHOST]);
  344. iowrite8(0, &card->dpram[DPRAM_V2_IRQ_TOHOST]);
  345. return (1 == ir) ? IRQ_WAKE_THREAD : IRQ_NONE;
  346. }
  347. static irqreturn_t softing_irq_v1(int irq, void *dev_id)
  348. {
  349. struct softing *card = (struct softing *)dev_id;
  350. uint8_t ir;
  351. ir = ioread8(&card->dpram[DPRAM_IRQ_TOHOST]);
  352. iowrite8(0, &card->dpram[DPRAM_IRQ_TOHOST]);
  353. return ir ? IRQ_WAKE_THREAD : IRQ_NONE;
  354. }
  355. /*
  356. * netdev/candev inter-operability
  357. */
  358. static int softing_netdev_open(struct net_device *ndev)
  359. {
  360. int ret;
  361. /* check or determine and set bittime */
  362. ret = open_candev(ndev);
  363. if (!ret)
  364. ret = softing_startstop(ndev, 1);
  365. return ret;
  366. }
  367. static int softing_netdev_stop(struct net_device *ndev)
  368. {
  369. int ret;
  370. netif_stop_queue(ndev);
  371. /* softing cycle does close_candev() */
  372. ret = softing_startstop(ndev, 0);
  373. return ret;
  374. }
  375. static int softing_candev_set_mode(struct net_device *ndev, enum can_mode mode)
  376. {
  377. int ret;
  378. switch (mode) {
  379. case CAN_MODE_START:
  380. /* softing_startstop does close_candev() */
  381. ret = softing_startstop(ndev, 1);
  382. return ret;
  383. case CAN_MODE_STOP:
  384. case CAN_MODE_SLEEP:
  385. return -EOPNOTSUPP;
  386. }
  387. return 0;
  388. }
  389. /*
  390. * Softing device management helpers
  391. */
  392. int softing_enable_irq(struct softing *card, int enable)
  393. {
  394. int ret;
  395. if (!card->irq.nr) {
  396. return 0;
  397. } else if (card->irq.requested && !enable) {
  398. free_irq(card->irq.nr, card);
  399. card->irq.requested = 0;
  400. } else if (!card->irq.requested && enable) {
  401. ret = request_threaded_irq(card->irq.nr,
  402. (card->pdat->generation >= 2) ?
  403. softing_irq_v2 : softing_irq_v1,
  404. softing_irq_thread, IRQF_SHARED,
  405. dev_name(&card->pdev->dev), card);
  406. if (ret) {
  407. dev_alert(&card->pdev->dev,
  408. "request_threaded_irq(%u) failed\n",
  409. card->irq.nr);
  410. return ret;
  411. }
  412. card->irq.requested = 1;
  413. }
  414. return 0;
  415. }
  416. static void softing_card_shutdown(struct softing *card)
  417. {
  418. int fw_up = 0;
  419. if (mutex_lock_interruptible(&card->fw.lock))
  420. /* return -ERESTARTSYS */;
  421. fw_up = card->fw.up;
  422. card->fw.up = 0;
  423. if (card->irq.requested && card->irq.nr) {
  424. free_irq(card->irq.nr, card);
  425. card->irq.requested = 0;
  426. }
  427. if (fw_up) {
  428. if (card->pdat->enable_irq)
  429. card->pdat->enable_irq(card->pdev, 0);
  430. softing_set_reset_dpram(card);
  431. if (card->pdat->reset)
  432. card->pdat->reset(card->pdev, 1);
  433. }
  434. mutex_unlock(&card->fw.lock);
  435. }
  436. static __devinit int softing_card_boot(struct softing *card)
  437. {
  438. int ret, j;
  439. static const uint8_t stream[] = {
  440. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, };
  441. unsigned char back[sizeof(stream)];
  442. if (mutex_lock_interruptible(&card->fw.lock))
  443. return -ERESTARTSYS;
  444. if (card->fw.up) {
  445. mutex_unlock(&card->fw.lock);
  446. return 0;
  447. }
  448. /* reset board */
  449. if (card->pdat->enable_irq)
  450. card->pdat->enable_irq(card->pdev, 1);
  451. /* boot card */
  452. softing_set_reset_dpram(card);
  453. if (card->pdat->reset)
  454. card->pdat->reset(card->pdev, 1);
  455. for (j = 0; (j + sizeof(stream)) < card->dpram_size;
  456. j += sizeof(stream)) {
  457. memcpy_toio(&card->dpram[j], stream, sizeof(stream));
  458. /* flush IO cache */
  459. mb();
  460. memcpy_fromio(back, &card->dpram[j], sizeof(stream));
  461. if (!memcmp(back, stream, sizeof(stream)))
  462. continue;
  463. /* memory is not equal */
  464. dev_alert(&card->pdev->dev, "dpram failed at 0x%04x\n", j);
  465. ret = -EIO;
  466. goto failed;
  467. }
  468. wmb();
  469. /* load boot firmware */
  470. ret = softing_load_fw(card->pdat->boot.fw, card, card->dpram,
  471. card->dpram_size,
  472. card->pdat->boot.offs - card->pdat->boot.addr);
  473. if (ret < 0)
  474. goto failed;
  475. /* load loader firmware */
  476. ret = softing_load_fw(card->pdat->load.fw, card, card->dpram,
  477. card->dpram_size,
  478. card->pdat->load.offs - card->pdat->load.addr);
  479. if (ret < 0)
  480. goto failed;
  481. if (card->pdat->reset)
  482. card->pdat->reset(card->pdev, 0);
  483. softing_clr_reset_dpram(card);
  484. ret = softing_bootloader_command(card, 0, "card boot");
  485. if (ret < 0)
  486. goto failed;
  487. ret = softing_load_app_fw(card->pdat->app.fw, card);
  488. if (ret < 0)
  489. goto failed;
  490. ret = softing_chip_poweron(card);
  491. if (ret < 0)
  492. goto failed;
  493. card->fw.up = 1;
  494. mutex_unlock(&card->fw.lock);
  495. return 0;
  496. failed:
  497. card->fw.up = 0;
  498. if (card->pdat->enable_irq)
  499. card->pdat->enable_irq(card->pdev, 0);
  500. softing_set_reset_dpram(card);
  501. if (card->pdat->reset)
  502. card->pdat->reset(card->pdev, 1);
  503. mutex_unlock(&card->fw.lock);
  504. return ret;
  505. }
  506. /*
  507. * netdev sysfs
  508. */
  509. static ssize_t show_channel(struct device *dev, struct device_attribute *attr,
  510. char *buf)
  511. {
  512. struct net_device *ndev = to_net_dev(dev);
  513. struct softing_priv *priv = netdev2softing(ndev);
  514. return sprintf(buf, "%i\n", priv->index);
  515. }
  516. static ssize_t show_chip(struct device *dev, struct device_attribute *attr,
  517. char *buf)
  518. {
  519. struct net_device *ndev = to_net_dev(dev);
  520. struct softing_priv *priv = netdev2softing(ndev);
  521. return sprintf(buf, "%i\n", priv->chip);
  522. }
  523. static ssize_t show_output(struct device *dev, struct device_attribute *attr,
  524. char *buf)
  525. {
  526. struct net_device *ndev = to_net_dev(dev);
  527. struct softing_priv *priv = netdev2softing(ndev);
  528. return sprintf(buf, "0x%02x\n", priv->output);
  529. }
  530. static ssize_t store_output(struct device *dev, struct device_attribute *attr,
  531. const char *buf, size_t count)
  532. {
  533. struct net_device *ndev = to_net_dev(dev);
  534. struct softing_priv *priv = netdev2softing(ndev);
  535. struct softing *card = priv->card;
  536. unsigned long val;
  537. int ret;
  538. ret = strict_strtoul(buf, 0, &val);
  539. if (ret < 0)
  540. return ret;
  541. val &= 0xFF;
  542. ret = mutex_lock_interruptible(&card->fw.lock);
  543. if (ret)
  544. return -ERESTARTSYS;
  545. if (netif_running(ndev)) {
  546. mutex_unlock(&card->fw.lock);
  547. return -EBUSY;
  548. }
  549. priv->output = val;
  550. mutex_unlock(&card->fw.lock);
  551. return count;
  552. }
  553. static const DEVICE_ATTR(channel, S_IRUGO, show_channel, NULL);
  554. static const DEVICE_ATTR(chip, S_IRUGO, show_chip, NULL);
  555. static const DEVICE_ATTR(output, S_IRUGO | S_IWUSR, show_output, store_output);
  556. static const struct attribute *const netdev_sysfs_attrs[] = {
  557. &dev_attr_channel.attr,
  558. &dev_attr_chip.attr,
  559. &dev_attr_output.attr,
  560. NULL,
  561. };
  562. static const struct attribute_group netdev_sysfs_group = {
  563. .name = NULL,
  564. .attrs = (struct attribute **)netdev_sysfs_attrs,
  565. };
  566. static const struct net_device_ops softing_netdev_ops = {
  567. .ndo_open = softing_netdev_open,
  568. .ndo_stop = softing_netdev_stop,
  569. .ndo_start_xmit = softing_netdev_start_xmit,
  570. };
  571. static const struct can_bittiming_const softing_btr_const = {
  572. .name = "softing",
  573. .tseg1_min = 1,
  574. .tseg1_max = 16,
  575. .tseg2_min = 1,
  576. .tseg2_max = 8,
  577. .sjw_max = 4, /* overruled */
  578. .brp_min = 1,
  579. .brp_max = 32, /* overruled */
  580. .brp_inc = 1,
  581. };
  582. static __devinit struct net_device *softing_netdev_create(struct softing *card,
  583. uint16_t chip_id)
  584. {
  585. struct net_device *netdev;
  586. struct softing_priv *priv;
  587. netdev = alloc_candev(sizeof(*priv), TX_ECHO_SKB_MAX);
  588. if (!netdev) {
  589. dev_alert(&card->pdev->dev, "alloc_candev failed\n");
  590. return NULL;
  591. }
  592. priv = netdev_priv(netdev);
  593. priv->netdev = netdev;
  594. priv->card = card;
  595. memcpy(&priv->btr_const, &softing_btr_const, sizeof(priv->btr_const));
  596. priv->btr_const.brp_max = card->pdat->max_brp;
  597. priv->btr_const.sjw_max = card->pdat->max_sjw;
  598. priv->can.bittiming_const = &priv->btr_const;
  599. priv->can.clock.freq = 8000000;
  600. priv->chip = chip_id;
  601. priv->output = softing_default_output(netdev);
  602. SET_NETDEV_DEV(netdev, &card->pdev->dev);
  603. netdev->flags |= IFF_ECHO;
  604. netdev->netdev_ops = &softing_netdev_ops;
  605. priv->can.do_set_mode = softing_candev_set_mode;
  606. priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES;
  607. return netdev;
  608. }
  609. static __devinit int softing_netdev_register(struct net_device *netdev)
  610. {
  611. int ret;
  612. netdev->sysfs_groups[0] = &netdev_sysfs_group;
  613. ret = register_candev(netdev);
  614. if (ret) {
  615. dev_alert(&netdev->dev, "register failed\n");
  616. return ret;
  617. }
  618. return 0;
  619. }
  620. static void softing_netdev_cleanup(struct net_device *netdev)
  621. {
  622. unregister_candev(netdev);
  623. free_candev(netdev);
  624. }
  625. /*
  626. * sysfs for Platform device
  627. */
  628. #define DEV_ATTR_RO(name, member) \
  629. static ssize_t show_##name(struct device *dev, \
  630. struct device_attribute *attr, char *buf) \
  631. { \
  632. struct softing *card = platform_get_drvdata(to_platform_device(dev)); \
  633. return sprintf(buf, "%u\n", card->member); \
  634. } \
  635. static DEVICE_ATTR(name, 0444, show_##name, NULL)
  636. #define DEV_ATTR_RO_STR(name, member) \
  637. static ssize_t show_##name(struct device *dev, \
  638. struct device_attribute *attr, char *buf) \
  639. { \
  640. struct softing *card = platform_get_drvdata(to_platform_device(dev)); \
  641. return sprintf(buf, "%s\n", card->member); \
  642. } \
  643. static DEVICE_ATTR(name, 0444, show_##name, NULL)
  644. DEV_ATTR_RO(serial, id.serial);
  645. DEV_ATTR_RO_STR(firmware, pdat->app.fw);
  646. DEV_ATTR_RO(firmware_version, id.fw_version);
  647. DEV_ATTR_RO_STR(hardware, pdat->name);
  648. DEV_ATTR_RO(hardware_version, id.hw_version);
  649. DEV_ATTR_RO(license, id.license);
  650. DEV_ATTR_RO(frequency, id.freq);
  651. DEV_ATTR_RO(txpending, tx.pending);
  652. static struct attribute *softing_pdev_attrs[] = {
  653. &dev_attr_serial.attr,
  654. &dev_attr_firmware.attr,
  655. &dev_attr_firmware_version.attr,
  656. &dev_attr_hardware.attr,
  657. &dev_attr_hardware_version.attr,
  658. &dev_attr_license.attr,
  659. &dev_attr_frequency.attr,
  660. &dev_attr_txpending.attr,
  661. NULL,
  662. };
  663. static const struct attribute_group softing_pdev_group = {
  664. .name = NULL,
  665. .attrs = softing_pdev_attrs,
  666. };
  667. /*
  668. * platform driver
  669. */
  670. static __devexit int softing_pdev_remove(struct platform_device *pdev)
  671. {
  672. struct softing *card = platform_get_drvdata(pdev);
  673. int j;
  674. /* first, disable card*/
  675. softing_card_shutdown(card);
  676. for (j = 0; j < ARRAY_SIZE(card->net); ++j) {
  677. if (!card->net[j])
  678. continue;
  679. softing_netdev_cleanup(card->net[j]);
  680. card->net[j] = NULL;
  681. }
  682. sysfs_remove_group(&pdev->dev.kobj, &softing_pdev_group);
  683. iounmap(card->dpram);
  684. kfree(card);
  685. return 0;
  686. }
  687. static __devinit int softing_pdev_probe(struct platform_device *pdev)
  688. {
  689. const struct softing_platform_data *pdat = pdev->dev.platform_data;
  690. struct softing *card;
  691. struct net_device *netdev;
  692. struct softing_priv *priv;
  693. struct resource *pres;
  694. int ret;
  695. int j;
  696. if (!pdat) {
  697. dev_warn(&pdev->dev, "no platform data\n");
  698. return -EINVAL;
  699. }
  700. if (pdat->nbus > ARRAY_SIZE(card->net)) {
  701. dev_warn(&pdev->dev, "%u nets??\n", pdat->nbus);
  702. return -EINVAL;
  703. }
  704. card = kzalloc(sizeof(*card), GFP_KERNEL);
  705. if (!card)
  706. return -ENOMEM;
  707. card->pdat = pdat;
  708. card->pdev = pdev;
  709. platform_set_drvdata(pdev, card);
  710. mutex_init(&card->fw.lock);
  711. spin_lock_init(&card->spin);
  712. ret = -EINVAL;
  713. pres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  714. if (!pres)
  715. goto platform_resource_failed;
  716. card->dpram_phys = pres->start;
  717. card->dpram_size = pres->end - pres->start + 1;
  718. card->dpram = ioremap_nocache(card->dpram_phys, card->dpram_size);
  719. if (!card->dpram) {
  720. dev_alert(&card->pdev->dev, "dpram ioremap failed\n");
  721. goto ioremap_failed;
  722. }
  723. pres = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
  724. if (pres)
  725. card->irq.nr = pres->start;
  726. /* reset card */
  727. ret = softing_card_boot(card);
  728. if (ret < 0) {
  729. dev_alert(&pdev->dev, "failed to boot\n");
  730. goto boot_failed;
  731. }
  732. /* only now, the chip's are known */
  733. card->id.freq = card->pdat->freq;
  734. ret = sysfs_create_group(&pdev->dev.kobj, &softing_pdev_group);
  735. if (ret < 0) {
  736. dev_alert(&card->pdev->dev, "sysfs failed\n");
  737. goto sysfs_failed;
  738. }
  739. ret = -ENOMEM;
  740. for (j = 0; j < ARRAY_SIZE(card->net); ++j) {
  741. card->net[j] = netdev =
  742. softing_netdev_create(card, card->id.chip[j]);
  743. if (!netdev) {
  744. dev_alert(&pdev->dev, "failed to make can[%i]", j);
  745. goto netdev_failed;
  746. }
  747. priv = netdev_priv(card->net[j]);
  748. priv->index = j;
  749. ret = softing_netdev_register(netdev);
  750. if (ret) {
  751. free_candev(netdev);
  752. card->net[j] = NULL;
  753. dev_alert(&card->pdev->dev,
  754. "failed to register can[%i]\n", j);
  755. goto netdev_failed;
  756. }
  757. }
  758. dev_info(&card->pdev->dev, "%s ready.\n", card->pdat->name);
  759. return 0;
  760. netdev_failed:
  761. for (j = 0; j < ARRAY_SIZE(card->net); ++j) {
  762. if (!card->net[j])
  763. continue;
  764. softing_netdev_cleanup(card->net[j]);
  765. }
  766. sysfs_remove_group(&pdev->dev.kobj, &softing_pdev_group);
  767. sysfs_failed:
  768. softing_card_shutdown(card);
  769. boot_failed:
  770. iounmap(card->dpram);
  771. ioremap_failed:
  772. platform_resource_failed:
  773. kfree(card);
  774. return ret;
  775. }
  776. static struct platform_driver softing_driver = {
  777. .driver = {
  778. .name = "softing",
  779. .owner = THIS_MODULE,
  780. },
  781. .probe = softing_pdev_probe,
  782. .remove = __devexit_p(softing_pdev_remove),
  783. };
  784. MODULE_ALIAS("platform:softing");
  785. static int __init softing_start(void)
  786. {
  787. return platform_driver_register(&softing_driver);
  788. }
  789. static void __exit softing_stop(void)
  790. {
  791. platform_driver_unregister(&softing_driver);
  792. }
  793. module_init(softing_start);
  794. module_exit(softing_stop);
  795. MODULE_DESCRIPTION("Softing DPRAM CAN driver");
  796. MODULE_AUTHOR("Kurt Van Dijck <kurt.van.dijck@eia.be>");
  797. MODULE_LICENSE("GPL v2");