2 * Copyright (C) 2008-2010
4 * - Kurt Van Dijck, EIA Electronics
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
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.
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/>.
19 #include <linux/module.h>
20 #include <linux/interrupt.h>
25 #define TX_ECHO_SKB_MAX (((TXMAX+1)/2)-1)
28 * test is a specific CAN netdev
29 * is online (ie. up 'n running, not sleeping, not busoff
31 static inline int canif_is_active(struct net_device
*netdev
)
33 struct can_priv
*can
= netdev_priv(netdev
);
35 if (!netif_running(netdev
))
37 return (can
->state
<= CAN_STATE_ERROR_PASSIVE
);
41 static inline void softing_set_reset_dpram(struct softing
*card
)
43 if (card
->pdat
->generation
>= 2) {
44 spin_lock_bh(&card
->spin
);
45 iowrite8(ioread8(&card
->dpram
[DPRAM_V2_RESET
]) & ~1,
46 &card
->dpram
[DPRAM_V2_RESET
]);
47 spin_unlock_bh(&card
->spin
);
51 static inline void softing_clr_reset_dpram(struct softing
*card
)
53 if (card
->pdat
->generation
>= 2) {
54 spin_lock_bh(&card
->spin
);
55 iowrite8(ioread8(&card
->dpram
[DPRAM_V2_RESET
]) | 1,
56 &card
->dpram
[DPRAM_V2_RESET
]);
57 spin_unlock_bh(&card
->spin
);
61 /* trigger the tx queue-ing */
62 static netdev_tx_t
softing_netdev_start_xmit(struct sk_buff
*skb
,
63 struct net_device
*dev
)
65 struct softing_priv
*priv
= netdev_priv(dev
);
66 struct softing
*card
= priv
->card
;
69 uint8_t fifo_wr
, fifo_rd
;
70 struct can_frame
*cf
= (struct can_frame
*)skb
->data
;
71 uint8_t buf
[DPRAM_TX_SIZE
];
73 if (can_dropped_invalid_skb(dev
, skb
))
76 spin_lock(&card
->spin
);
80 (card
->tx
.pending
>= TXMAX
) ||
81 (priv
->tx
.pending
>= TX_ECHO_SKB_MAX
))
83 fifo_wr
= ioread8(&card
->dpram
[DPRAM_TX_WR
]);
84 fifo_rd
= ioread8(&card
->dpram
[DPRAM_TX_RD
]);
85 if (fifo_wr
== fifo_rd
)
88 memset(buf
, 0, sizeof(buf
));
91 if (cf
->can_id
& CAN_RTR_FLAG
)
93 if (cf
->can_id
& CAN_EFF_FLAG
)
99 *ptr
++ = (cf
->can_id
>> 0);
100 *ptr
++ = (cf
->can_id
>> 8);
101 if (cf
->can_id
& CAN_EFF_FLAG
) {
102 *ptr
++ = (cf
->can_id
>> 16);
103 *ptr
++ = (cf
->can_id
>> 24);
105 /* increment 1, not 2 as you might think */
108 if (!(cf
->can_id
& CAN_RTR_FLAG
))
109 memcpy(ptr
, &cf
->data
[0], cf
->can_dlc
);
110 memcpy_toio(&card
->dpram
[DPRAM_TX
+ DPRAM_TX_SIZE
* fifo_wr
],
112 if (++fifo_wr
>= DPRAM_TX_CNT
)
114 iowrite8(fifo_wr
, &card
->dpram
[DPRAM_TX_WR
]);
115 card
->tx
.last_bus
= priv
->index
;
118 can_put_echo_skb(skb
, dev
, priv
->tx
.echo_put
);
120 if (priv
->tx
.echo_put
>= TX_ECHO_SKB_MAX
)
121 priv
->tx
.echo_put
= 0;
122 /* can_put_echo_skb() saves the skb, safe to return TX_OK */
125 spin_unlock(&card
->spin
);
126 if (card
->tx
.pending
>= TXMAX
) {
128 for (j
= 0; j
< ARRAY_SIZE(card
->net
); ++j
) {
130 netif_stop_queue(card
->net
[j
]);
133 if (ret
!= NETDEV_TX_OK
)
134 netif_stop_queue(dev
);
140 * shortcut for skb delivery
142 int softing_netdev_rx(struct net_device
*netdev
, const struct can_frame
*msg
,
146 struct can_frame
*cf
;
148 skb
= alloc_can_skb(netdev
, &cf
);
151 memcpy(cf
, msg
, sizeof(*msg
));
153 return netif_rx(skb
);
158 * pop 1 entry from the DPRAM queue, and process
160 static int softing_handle_1(struct softing
*card
)
162 struct net_device
*netdev
;
163 struct softing_priv
*priv
;
165 struct can_frame msg
;
166 int cnt
= 0, lost_msg
;
167 uint8_t fifo_rd
, fifo_wr
, cmd
;
170 uint8_t buf
[DPRAM_RX_SIZE
];
172 memset(&msg
, 0, sizeof(msg
));
173 /* test for lost msgs */
174 lost_msg
= ioread8(&card
->dpram
[DPRAM_RX_LOST
]);
177 /* reset condition */
178 iowrite8(0, &card
->dpram
[DPRAM_RX_LOST
]);
180 msg
.can_id
= CAN_ERR_FLAG
| CAN_ERR_CRTL
;
181 msg
.can_dlc
= CAN_ERR_DLC
;
182 msg
.data
[1] = CAN_ERR_CRTL_RX_OVERFLOW
;
184 * service to all busses, we don't know which it was applicable
185 * but only service busses that are online
187 for (j
= 0; j
< ARRAY_SIZE(card
->net
); ++j
) {
188 netdev
= card
->net
[j
];
191 if (!canif_is_active(netdev
))
192 /* a dead bus has no overflows */
194 ++netdev
->stats
.rx_over_errors
;
195 softing_netdev_rx(netdev
, &msg
, 0);
197 /* prepare for other use */
198 memset(&msg
, 0, sizeof(msg
));
202 fifo_rd
= ioread8(&card
->dpram
[DPRAM_RX_RD
]);
203 fifo_wr
= ioread8(&card
->dpram
[DPRAM_RX_WR
]);
205 if (++fifo_rd
>= DPRAM_RX_CNT
)
207 if (fifo_wr
== fifo_rd
)
210 memcpy_fromio(buf
, &card
->dpram
[DPRAM_RX
+ DPRAM_RX_SIZE
*fifo_rd
],
213 /* trigger dual port RAM */
214 iowrite8(fifo_rd
, &card
->dpram
[DPRAM_RX_RD
]);
219 /* not quite useful, probably the card has got out */
221 netdev
= card
->net
[0];
223 netdev
= card
->net
[1];
224 priv
= netdev_priv(netdev
);
227 uint8_t can_state
, state
;
231 msg
.can_id
= CAN_ERR_FLAG
;
232 msg
.can_dlc
= CAN_ERR_DLC
;
234 if (state
& SF_MASK_BUSOFF
) {
235 can_state
= CAN_STATE_BUS_OFF
;
236 msg
.can_id
|= CAN_ERR_BUSOFF
;
237 state
= STATE_BUSOFF
;
238 } else if (state
& SF_MASK_EPASSIVE
) {
239 can_state
= CAN_STATE_ERROR_PASSIVE
;
240 msg
.can_id
|= CAN_ERR_CRTL
;
241 msg
.data
[1] = CAN_ERR_CRTL_TX_PASSIVE
;
242 state
= STATE_EPASSIVE
;
244 can_state
= CAN_STATE_ERROR_ACTIVE
;
245 msg
.can_id
|= CAN_ERR_CRTL
;
246 state
= STATE_EACTIVE
;
249 iowrite8(state
, &card
->dpram
[priv
->index
?
250 DPRAM_INFO_BUSSTATE2
: DPRAM_INFO_BUSSTATE
]);
252 tmp_u32
= le32_to_cpup((void *)ptr
);
254 ktime
= softing_raw2ktime(card
, tmp_u32
);
256 ++netdev
->stats
.rx_errors
;
257 /* update internal status */
258 if (can_state
!= priv
->can
.state
) {
259 priv
->can
.state
= can_state
;
260 if (can_state
== CAN_STATE_ERROR_PASSIVE
)
261 ++priv
->can
.can_stats
.error_passive
;
262 else if (can_state
== CAN_STATE_BUS_OFF
) {
263 /* this calls can_close_cleanup() */
264 ++priv
->can
.can_stats
.bus_off
;
266 netif_stop_queue(netdev
);
268 /* trigger socketcan */
269 softing_netdev_rx(netdev
, &msg
, ktime
);
274 msg
.can_id
|= CAN_RTR_FLAG
;
275 msg
.can_dlc
= get_can_dlc(*ptr
++);
277 msg
.can_id
|= CAN_EFF_FLAG
;
278 msg
.can_id
|= le32_to_cpup((void *)ptr
);
281 msg
.can_id
|= le16_to_cpup((void *)ptr
);
285 tmp_u32
= le32_to_cpup((void *)ptr
);
287 ktime
= softing_raw2ktime(card
, tmp_u32
);
288 if (!(msg
.can_id
& CAN_RTR_FLAG
))
289 memcpy(&msg
.data
[0], ptr
, 8);
293 /* acknowledge, was tx msg */
295 skb
= priv
->can
.echo_skb
[priv
->tx
.echo_get
];
298 can_get_echo_skb(netdev
, priv
->tx
.echo_get
);
300 if (priv
->tx
.echo_get
>= TX_ECHO_SKB_MAX
)
301 priv
->tx
.echo_get
= 0;
302 if (priv
->tx
.pending
)
304 if (card
->tx
.pending
)
306 ++netdev
->stats
.tx_packets
;
307 if (!(msg
.can_id
& CAN_RTR_FLAG
))
308 netdev
->stats
.tx_bytes
+= msg
.can_dlc
;
312 ret
= softing_netdev_rx(netdev
, &msg
, ktime
);
313 if (ret
== NET_RX_SUCCESS
) {
314 ++netdev
->stats
.rx_packets
;
315 if (!(msg
.can_id
& CAN_RTR_FLAG
))
316 netdev
->stats
.rx_bytes
+= msg
.can_dlc
;
318 ++netdev
->stats
.rx_dropped
;
327 * real interrupt handler
329 static irqreturn_t
softing_irq_thread(int irq
, void *dev_id
)
331 struct softing
*card
= (struct softing
*)dev_id
;
332 struct net_device
*netdev
;
333 struct softing_priv
*priv
;
334 int j
, offset
, work_done
;
337 spin_lock_bh(&card
->spin
);
338 while (softing_handle_1(card
) > 0) {
339 ++card
->irq
.svc_count
;
342 spin_unlock_bh(&card
->spin
);
343 /* resume tx queue's */
344 offset
= card
->tx
.last_bus
;
345 for (j
= 0; j
< ARRAY_SIZE(card
->net
); ++j
) {
346 if (card
->tx
.pending
>= TXMAX
)
348 netdev
= card
->net
[(j
+ offset
+ 1) % card
->pdat
->nbus
];
351 priv
= netdev_priv(netdev
);
352 if (!canif_is_active(netdev
))
353 /* it makes no sense to wake dead busses */
355 if (priv
->tx
.pending
>= TX_ECHO_SKB_MAX
)
358 netif_wake_queue(netdev
);
360 return work_done
? IRQ_HANDLED
: IRQ_NONE
;
364 * interrupt routines:
365 * schedule the 'real interrupt handler'
367 static irqreturn_t
softing_irq_v2(int irq
, void *dev_id
)
369 struct softing
*card
= (struct softing
*)dev_id
;
372 ir
= ioread8(&card
->dpram
[DPRAM_V2_IRQ_TOHOST
]);
373 iowrite8(0, &card
->dpram
[DPRAM_V2_IRQ_TOHOST
]);
374 return (1 == ir
) ? IRQ_WAKE_THREAD
: IRQ_NONE
;
377 static irqreturn_t
softing_irq_v1(int irq
, void *dev_id
)
379 struct softing
*card
= (struct softing
*)dev_id
;
382 ir
= ioread8(&card
->dpram
[DPRAM_IRQ_TOHOST
]);
383 iowrite8(0, &card
->dpram
[DPRAM_IRQ_TOHOST
]);
384 return ir
? IRQ_WAKE_THREAD
: IRQ_NONE
;
388 * netdev/candev inter-operability
390 static int softing_netdev_open(struct net_device
*ndev
)
394 /* check or determine and set bittime */
395 ret
= open_candev(ndev
);
397 ret
= softing_startstop(ndev
, 1);
401 static int softing_netdev_stop(struct net_device
*ndev
)
405 netif_stop_queue(ndev
);
407 /* softing cycle does close_candev() */
408 ret
= softing_startstop(ndev
, 0);
412 static int softing_candev_set_mode(struct net_device
*ndev
, enum can_mode mode
)
418 /* softing_startstop does close_candev() */
419 ret
= softing_startstop(ndev
, 1);
429 * Softing device management helpers
431 int softing_enable_irq(struct softing
*card
, int enable
)
437 } else if (card
->irq
.requested
&& !enable
) {
438 free_irq(card
->irq
.nr
, card
);
439 card
->irq
.requested
= 0;
440 } else if (!card
->irq
.requested
&& enable
) {
441 ret
= request_threaded_irq(card
->irq
.nr
,
442 (card
->pdat
->generation
>= 2) ?
443 softing_irq_v2
: softing_irq_v1
,
444 softing_irq_thread
, IRQF_SHARED
,
445 dev_name(&card
->pdev
->dev
), card
);
447 dev_alert(&card
->pdev
->dev
,
448 "request_threaded_irq(%u) failed\n",
452 card
->irq
.requested
= 1;
457 static void softing_card_shutdown(struct softing
*card
)
461 if (mutex_lock_interruptible(&card
->fw
.lock
))
462 /* return -ERESTARTSYS */;
466 if (card
->irq
.requested
&& card
->irq
.nr
) {
467 free_irq(card
->irq
.nr
, card
);
468 card
->irq
.requested
= 0;
471 if (card
->pdat
->enable_irq
)
472 card
->pdat
->enable_irq(card
->pdev
, 0);
473 softing_set_reset_dpram(card
);
474 if (card
->pdat
->reset
)
475 card
->pdat
->reset(card
->pdev
, 1);
477 mutex_unlock(&card
->fw
.lock
);
480 static int softing_card_boot(struct softing
*card
)
483 static const uint8_t stream
[] = {
484 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, };
485 unsigned char back
[sizeof(stream
)];
487 if (mutex_lock_interruptible(&card
->fw
.lock
))
490 mutex_unlock(&card
->fw
.lock
);
494 if (card
->pdat
->enable_irq
)
495 card
->pdat
->enable_irq(card
->pdev
, 1);
497 softing_set_reset_dpram(card
);
498 if (card
->pdat
->reset
)
499 card
->pdat
->reset(card
->pdev
, 1);
500 for (j
= 0; (j
+ sizeof(stream
)) < card
->dpram_size
;
501 j
+= sizeof(stream
)) {
503 memcpy_toio(&card
->dpram
[j
], stream
, sizeof(stream
));
506 memcpy_fromio(back
, &card
->dpram
[j
], sizeof(stream
));
508 if (!memcmp(back
, stream
, sizeof(stream
)))
510 /* memory is not equal */
511 dev_alert(&card
->pdev
->dev
, "dpram failed at 0x%04x\n", j
);
516 /* load boot firmware */
517 ret
= softing_load_fw(card
->pdat
->boot
.fw
, card
, card
->dpram
,
519 card
->pdat
->boot
.offs
- card
->pdat
->boot
.addr
);
522 /* load loader firmware */
523 ret
= softing_load_fw(card
->pdat
->load
.fw
, card
, card
->dpram
,
525 card
->pdat
->load
.offs
- card
->pdat
->load
.addr
);
529 if (card
->pdat
->reset
)
530 card
->pdat
->reset(card
->pdev
, 0);
531 softing_clr_reset_dpram(card
);
532 ret
= softing_bootloader_command(card
, 0, "card boot");
535 ret
= softing_load_app_fw(card
->pdat
->app
.fw
, card
);
539 ret
= softing_chip_poweron(card
);
544 mutex_unlock(&card
->fw
.lock
);
548 if (card
->pdat
->enable_irq
)
549 card
->pdat
->enable_irq(card
->pdev
, 0);
550 softing_set_reset_dpram(card
);
551 if (card
->pdat
->reset
)
552 card
->pdat
->reset(card
->pdev
, 1);
553 mutex_unlock(&card
->fw
.lock
);
560 static ssize_t
show_chip(struct device
*dev
, struct device_attribute
*attr
,
563 struct net_device
*ndev
= to_net_dev(dev
);
564 struct softing_priv
*priv
= netdev2softing(ndev
);
566 return sprintf(buf
, "%i\n", priv
->chip
);
569 static ssize_t
show_output(struct device
*dev
, struct device_attribute
*attr
,
572 struct net_device
*ndev
= to_net_dev(dev
);
573 struct softing_priv
*priv
= netdev2softing(ndev
);
575 return sprintf(buf
, "0x%02x\n", priv
->output
);
578 static ssize_t
store_output(struct device
*dev
, struct device_attribute
*attr
,
579 const char *buf
, size_t count
)
581 struct net_device
*ndev
= to_net_dev(dev
);
582 struct softing_priv
*priv
= netdev2softing(ndev
);
583 struct softing
*card
= priv
->card
;
587 ret
= kstrtoul(buf
, 0, &val
);
592 ret
= mutex_lock_interruptible(&card
->fw
.lock
);
595 if (netif_running(ndev
)) {
596 mutex_unlock(&card
->fw
.lock
);
600 mutex_unlock(&card
->fw
.lock
);
604 static const DEVICE_ATTR(chip
, S_IRUGO
, show_chip
, NULL
);
605 static const DEVICE_ATTR(output
, S_IRUGO
| S_IWUSR
, show_output
, store_output
);
607 static const struct attribute
*const netdev_sysfs_attrs
[] = {
609 &dev_attr_output
.attr
,
612 static const struct attribute_group netdev_sysfs_group
= {
614 .attrs
= (struct attribute
**)netdev_sysfs_attrs
,
617 static const struct net_device_ops softing_netdev_ops
= {
618 .ndo_open
= softing_netdev_open
,
619 .ndo_stop
= softing_netdev_stop
,
620 .ndo_start_xmit
= softing_netdev_start_xmit
,
621 .ndo_change_mtu
= can_change_mtu
,
624 static const struct can_bittiming_const softing_btr_const
= {
630 .sjw_max
= 4, /* overruled */
632 .brp_max
= 32, /* overruled */
637 static struct net_device
*softing_netdev_create(struct softing
*card
,
640 struct net_device
*netdev
;
641 struct softing_priv
*priv
;
643 netdev
= alloc_candev(sizeof(*priv
), TX_ECHO_SKB_MAX
);
645 dev_alert(&card
->pdev
->dev
, "alloc_candev failed\n");
648 priv
= netdev_priv(netdev
);
649 priv
->netdev
= netdev
;
651 memcpy(&priv
->btr_const
, &softing_btr_const
, sizeof(priv
->btr_const
));
652 priv
->btr_const
.brp_max
= card
->pdat
->max_brp
;
653 priv
->btr_const
.sjw_max
= card
->pdat
->max_sjw
;
654 priv
->can
.bittiming_const
= &priv
->btr_const
;
655 priv
->can
.clock
.freq
= 8000000;
656 priv
->chip
= chip_id
;
657 priv
->output
= softing_default_output(netdev
);
658 SET_NETDEV_DEV(netdev
, &card
->pdev
->dev
);
660 netdev
->flags
|= IFF_ECHO
;
661 netdev
->netdev_ops
= &softing_netdev_ops
;
662 priv
->can
.do_set_mode
= softing_candev_set_mode
;
663 priv
->can
.ctrlmode_supported
= CAN_CTRLMODE_3_SAMPLES
;
668 static int softing_netdev_register(struct net_device
*netdev
)
672 ret
= register_candev(netdev
);
674 dev_alert(&netdev
->dev
, "register failed\n");
677 if (sysfs_create_group(&netdev
->dev
.kobj
, &netdev_sysfs_group
) < 0)
678 netdev_alert(netdev
, "sysfs group failed\n");
683 static void softing_netdev_cleanup(struct net_device
*netdev
)
685 sysfs_remove_group(&netdev
->dev
.kobj
, &netdev_sysfs_group
);
686 unregister_candev(netdev
);
691 * sysfs for Platform device
693 #define DEV_ATTR_RO(name, member) \
694 static ssize_t show_##name(struct device *dev, \
695 struct device_attribute *attr, char *buf) \
697 struct softing *card = platform_get_drvdata(to_platform_device(dev)); \
698 return sprintf(buf, "%u\n", card->member); \
700 static DEVICE_ATTR(name, 0444, show_##name, NULL)
702 #define DEV_ATTR_RO_STR(name, member) \
703 static ssize_t show_##name(struct device *dev, \
704 struct device_attribute *attr, char *buf) \
706 struct softing *card = platform_get_drvdata(to_platform_device(dev)); \
707 return sprintf(buf, "%s\n", card->member); \
709 static DEVICE_ATTR(name, 0444, show_##name, NULL)
711 DEV_ATTR_RO(serial
, id
.serial
);
712 DEV_ATTR_RO_STR(firmware
, pdat
->app
.fw
);
713 DEV_ATTR_RO(firmware_version
, id
.fw_version
);
714 DEV_ATTR_RO_STR(hardware
, pdat
->name
);
715 DEV_ATTR_RO(hardware_version
, id
.hw_version
);
716 DEV_ATTR_RO(license
, id
.license
);
718 static struct attribute
*softing_pdev_attrs
[] = {
719 &dev_attr_serial
.attr
,
720 &dev_attr_firmware
.attr
,
721 &dev_attr_firmware_version
.attr
,
722 &dev_attr_hardware
.attr
,
723 &dev_attr_hardware_version
.attr
,
724 &dev_attr_license
.attr
,
728 static const struct attribute_group softing_pdev_group
= {
730 .attrs
= softing_pdev_attrs
,
736 static int softing_pdev_remove(struct platform_device
*pdev
)
738 struct softing
*card
= platform_get_drvdata(pdev
);
741 /* first, disable card*/
742 softing_card_shutdown(card
);
744 for (j
= 0; j
< ARRAY_SIZE(card
->net
); ++j
) {
747 softing_netdev_cleanup(card
->net
[j
]);
750 sysfs_remove_group(&pdev
->dev
.kobj
, &softing_pdev_group
);
752 iounmap(card
->dpram
);
757 static int softing_pdev_probe(struct platform_device
*pdev
)
759 const struct softing_platform_data
*pdat
= dev_get_platdata(&pdev
->dev
);
760 struct softing
*card
;
761 struct net_device
*netdev
;
762 struct softing_priv
*priv
;
763 struct resource
*pres
;
768 dev_warn(&pdev
->dev
, "no platform data\n");
771 if (pdat
->nbus
> ARRAY_SIZE(card
->net
)) {
772 dev_warn(&pdev
->dev
, "%u nets??\n", pdat
->nbus
);
776 card
= kzalloc(sizeof(*card
), GFP_KERNEL
);
781 platform_set_drvdata(pdev
, card
);
782 mutex_init(&card
->fw
.lock
);
783 spin_lock_init(&card
->spin
);
786 pres
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
788 goto platform_resource_failed
;
789 card
->dpram_phys
= pres
->start
;
790 card
->dpram_size
= resource_size(pres
);
791 card
->dpram
= ioremap_nocache(card
->dpram_phys
, card
->dpram_size
);
793 dev_alert(&card
->pdev
->dev
, "dpram ioremap failed\n");
797 pres
= platform_get_resource(pdev
, IORESOURCE_IRQ
, 0);
799 card
->irq
.nr
= pres
->start
;
802 ret
= softing_card_boot(card
);
804 dev_alert(&pdev
->dev
, "failed to boot\n");
808 /* only now, the chip's are known */
809 card
->id
.freq
= card
->pdat
->freq
;
811 ret
= sysfs_create_group(&pdev
->dev
.kobj
, &softing_pdev_group
);
813 dev_alert(&card
->pdev
->dev
, "sysfs failed\n");
817 for (j
= 0; j
< ARRAY_SIZE(card
->net
); ++j
) {
818 card
->net
[j
] = netdev
=
819 softing_netdev_create(card
, card
->id
.chip
[j
]);
821 dev_alert(&pdev
->dev
, "failed to make can[%i]", j
);
826 priv
= netdev_priv(card
->net
[j
]);
828 ret
= softing_netdev_register(netdev
);
832 dev_alert(&card
->pdev
->dev
,
833 "failed to register can[%i]\n", j
);
837 dev_info(&card
->pdev
->dev
, "%s ready.\n", card
->pdat
->name
);
841 for (j
= 0; j
< ARRAY_SIZE(card
->net
); ++j
) {
844 softing_netdev_cleanup(card
->net
[j
]);
846 sysfs_remove_group(&pdev
->dev
.kobj
, &softing_pdev_group
);
848 softing_card_shutdown(card
);
850 iounmap(card
->dpram
);
852 platform_resource_failed
:
857 static struct platform_driver softing_driver
= {
861 .probe
= softing_pdev_probe
,
862 .remove
= softing_pdev_remove
,
865 module_platform_driver(softing_driver
);
867 MODULE_ALIAS("platform:softing");
868 MODULE_DESCRIPTION("Softing DPRAM CAN driver");
869 MODULE_AUTHOR("Kurt Van Dijck <kurt.van.dijck@eia.be>");
870 MODULE_LICENSE("GPL v2");