1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2008-2010
5 * - Kurt Van Dijck, EIA Electronics
8 #include <linux/ethtool.h>
9 #include <linux/module.h>
10 #include <linux/interrupt.h>
15 #define TX_ECHO_SKB_MAX (((TXMAX+1)/2)-1)
18 * test is a specific CAN netdev
19 * is online (ie. up 'n running, not sleeping, not busoff
21 static inline int canif_is_active(struct net_device
*netdev
)
23 struct can_priv
*can
= netdev_priv(netdev
);
25 if (!netif_running(netdev
))
27 return (can
->state
<= CAN_STATE_ERROR_PASSIVE
);
31 static inline void softing_set_reset_dpram(struct softing
*card
)
33 if (card
->pdat
->generation
>= 2) {
34 spin_lock_bh(&card
->spin
);
35 iowrite8(ioread8(&card
->dpram
[DPRAM_V2_RESET
]) & ~1,
36 &card
->dpram
[DPRAM_V2_RESET
]);
37 spin_unlock_bh(&card
->spin
);
41 static inline void softing_clr_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 /* trigger the tx queue-ing */
52 static netdev_tx_t
softing_netdev_start_xmit(struct sk_buff
*skb
,
53 struct net_device
*dev
)
55 struct softing_priv
*priv
= netdev_priv(dev
);
56 struct softing
*card
= priv
->card
;
59 uint8_t fifo_wr
, fifo_rd
;
60 struct can_frame
*cf
= (struct can_frame
*)skb
->data
;
61 uint8_t buf
[DPRAM_TX_SIZE
];
63 if (can_dev_dropped_skb(dev
, skb
))
66 spin_lock(&card
->spin
);
70 (card
->tx
.pending
>= TXMAX
) ||
71 (priv
->tx
.pending
>= TX_ECHO_SKB_MAX
))
73 fifo_wr
= ioread8(&card
->dpram
[DPRAM_TX_WR
]);
74 fifo_rd
= ioread8(&card
->dpram
[DPRAM_TX_RD
]);
75 if (fifo_wr
== fifo_rd
)
78 memset(buf
, 0, sizeof(buf
));
81 if (cf
->can_id
& CAN_RTR_FLAG
)
83 if (cf
->can_id
& CAN_EFF_FLAG
)
89 *ptr
++ = (cf
->can_id
>> 0);
90 *ptr
++ = (cf
->can_id
>> 8);
91 if (cf
->can_id
& CAN_EFF_FLAG
) {
92 *ptr
++ = (cf
->can_id
>> 16);
93 *ptr
++ = (cf
->can_id
>> 24);
95 /* increment 1, not 2 as you might think */
98 if (!(cf
->can_id
& CAN_RTR_FLAG
))
99 memcpy(ptr
, &cf
->data
[0], cf
->len
);
100 memcpy_toio(&card
->dpram
[DPRAM_TX
+ DPRAM_TX_SIZE
* fifo_wr
],
102 if (++fifo_wr
>= DPRAM_TX_CNT
)
104 iowrite8(fifo_wr
, &card
->dpram
[DPRAM_TX_WR
]);
105 card
->tx
.last_bus
= priv
->index
;
108 can_put_echo_skb(skb
, dev
, priv
->tx
.echo_put
, 0);
110 if (priv
->tx
.echo_put
>= TX_ECHO_SKB_MAX
)
111 priv
->tx
.echo_put
= 0;
112 /* can_put_echo_skb() saves the skb, safe to return TX_OK */
115 spin_unlock(&card
->spin
);
116 if (card
->tx
.pending
>= TXMAX
) {
118 for (j
= 0; j
< ARRAY_SIZE(card
->net
); ++j
) {
120 netif_stop_queue(card
->net
[j
]);
123 if (ret
!= NETDEV_TX_OK
)
124 netif_stop_queue(dev
);
130 * shortcut for skb delivery
132 int softing_netdev_rx(struct net_device
*netdev
, const struct can_frame
*msg
,
136 struct can_frame
*cf
;
138 skb
= alloc_can_skb(netdev
, &cf
);
141 memcpy(cf
, msg
, sizeof(*msg
));
143 return netif_rx(skb
);
148 * pop 1 entry from the DPRAM queue, and process
150 static int softing_handle_1(struct softing
*card
)
152 struct net_device
*netdev
;
153 struct softing_priv
*priv
;
155 struct can_frame msg
;
156 int cnt
= 0, lost_msg
;
157 uint8_t fifo_rd
, fifo_wr
, cmd
;
160 uint8_t buf
[DPRAM_RX_SIZE
];
162 memset(&msg
, 0, sizeof(msg
));
163 /* test for lost msgs */
164 lost_msg
= ioread8(&card
->dpram
[DPRAM_RX_LOST
]);
167 /* reset condition */
168 iowrite8(0, &card
->dpram
[DPRAM_RX_LOST
]);
170 msg
.can_id
= CAN_ERR_FLAG
| CAN_ERR_CRTL
;
171 msg
.len
= CAN_ERR_DLC
;
172 msg
.data
[1] = CAN_ERR_CRTL_RX_OVERFLOW
;
174 * service to all buses, we don't know which it was applicable
175 * but only service buses that are online
177 for (j
= 0; j
< ARRAY_SIZE(card
->net
); ++j
) {
178 netdev
= card
->net
[j
];
181 if (!canif_is_active(netdev
))
182 /* a dead bus has no overflows */
184 ++netdev
->stats
.rx_over_errors
;
185 softing_netdev_rx(netdev
, &msg
, 0);
187 /* prepare for other use */
188 memset(&msg
, 0, sizeof(msg
));
192 fifo_rd
= ioread8(&card
->dpram
[DPRAM_RX_RD
]);
193 fifo_wr
= ioread8(&card
->dpram
[DPRAM_RX_WR
]);
195 if (++fifo_rd
>= DPRAM_RX_CNT
)
197 if (fifo_wr
== fifo_rd
)
200 memcpy_fromio(buf
, &card
->dpram
[DPRAM_RX
+ DPRAM_RX_SIZE
*fifo_rd
],
203 /* trigger dual port RAM */
204 iowrite8(fifo_rd
, &card
->dpram
[DPRAM_RX_RD
]);
209 /* not quite useful, probably the card has got out */
211 netdev
= card
->net
[0];
213 netdev
= card
->net
[1];
214 priv
= netdev_priv(netdev
);
217 uint8_t can_state
, state
;
221 msg
.can_id
= CAN_ERR_FLAG
;
222 msg
.len
= CAN_ERR_DLC
;
224 if (state
& SF_MASK_BUSOFF
) {
225 can_state
= CAN_STATE_BUS_OFF
;
226 msg
.can_id
|= CAN_ERR_BUSOFF
;
227 state
= STATE_BUSOFF
;
228 } else if (state
& SF_MASK_EPASSIVE
) {
229 can_state
= CAN_STATE_ERROR_PASSIVE
;
230 msg
.can_id
|= CAN_ERR_CRTL
;
231 msg
.data
[1] = CAN_ERR_CRTL_TX_PASSIVE
;
232 state
= STATE_EPASSIVE
;
234 can_state
= CAN_STATE_ERROR_ACTIVE
;
235 msg
.can_id
|= CAN_ERR_CRTL
;
236 state
= STATE_EACTIVE
;
239 iowrite8(state
, &card
->dpram
[priv
->index
?
240 DPRAM_INFO_BUSSTATE2
: DPRAM_INFO_BUSSTATE
]);
242 tmp_u32
= le32_to_cpup((void *)ptr
);
243 ktime
= softing_raw2ktime(card
, tmp_u32
);
245 ++netdev
->stats
.rx_errors
;
246 /* update internal status */
247 if (can_state
!= priv
->can
.state
) {
248 priv
->can
.state
= can_state
;
249 if (can_state
== CAN_STATE_ERROR_PASSIVE
)
250 ++priv
->can
.can_stats
.error_passive
;
251 else if (can_state
== CAN_STATE_BUS_OFF
) {
252 /* this calls can_close_cleanup() */
253 ++priv
->can
.can_stats
.bus_off
;
255 netif_stop_queue(netdev
);
257 /* trigger socketcan */
258 softing_netdev_rx(netdev
, &msg
, ktime
);
263 msg
.can_id
|= CAN_RTR_FLAG
;
264 msg
.len
= can_cc_dlc2len(*ptr
++);
266 msg
.can_id
|= CAN_EFF_FLAG
;
267 msg
.can_id
|= le32_to_cpup((void *)ptr
);
270 msg
.can_id
|= le16_to_cpup((void *)ptr
);
274 tmp_u32
= le32_to_cpup((void *)ptr
);
276 ktime
= softing_raw2ktime(card
, tmp_u32
);
277 if (!(msg
.can_id
& CAN_RTR_FLAG
))
278 memcpy(&msg
.data
[0], ptr
, 8);
281 /* acknowledge, was tx msg */
283 skb
= priv
->can
.echo_skb
[priv
->tx
.echo_get
];
286 ++netdev
->stats
.tx_packets
;
287 netdev
->stats
.tx_bytes
+=
288 can_get_echo_skb(netdev
, priv
->tx
.echo_get
,
291 if (priv
->tx
.echo_get
>= TX_ECHO_SKB_MAX
)
292 priv
->tx
.echo_get
= 0;
293 if (priv
->tx
.pending
)
295 if (card
->tx
.pending
)
300 ret
= softing_netdev_rx(netdev
, &msg
, ktime
);
301 if (ret
== NET_RX_SUCCESS
) {
302 ++netdev
->stats
.rx_packets
;
303 if (!(msg
.can_id
& CAN_RTR_FLAG
))
304 netdev
->stats
.rx_bytes
+= msg
.len
;
306 ++netdev
->stats
.rx_dropped
;
315 * real interrupt handler
317 static irqreturn_t
softing_irq_thread(int irq
, void *dev_id
)
319 struct softing
*card
= (struct softing
*)dev_id
;
320 struct net_device
*netdev
;
321 struct softing_priv
*priv
;
322 int j
, offset
, work_done
;
325 spin_lock_bh(&card
->spin
);
326 while (softing_handle_1(card
) > 0) {
327 ++card
->irq
.svc_count
;
330 spin_unlock_bh(&card
->spin
);
331 /* resume tx queue's */
332 offset
= card
->tx
.last_bus
;
333 for (j
= 0; j
< ARRAY_SIZE(card
->net
); ++j
) {
334 if (card
->tx
.pending
>= TXMAX
)
336 netdev
= card
->net
[(j
+ offset
+ 1) % card
->pdat
->nbus
];
339 priv
= netdev_priv(netdev
);
340 if (!canif_is_active(netdev
))
341 /* it makes no sense to wake dead buses */
343 if (priv
->tx
.pending
>= TX_ECHO_SKB_MAX
)
346 netif_wake_queue(netdev
);
348 return work_done
? IRQ_HANDLED
: IRQ_NONE
;
352 * interrupt routines:
353 * schedule the 'real interrupt handler'
355 static irqreturn_t
softing_irq_v2(int irq
, void *dev_id
)
357 struct softing
*card
= (struct softing
*)dev_id
;
360 ir
= ioread8(&card
->dpram
[DPRAM_V2_IRQ_TOHOST
]);
361 iowrite8(0, &card
->dpram
[DPRAM_V2_IRQ_TOHOST
]);
362 return (1 == ir
) ? IRQ_WAKE_THREAD
: IRQ_NONE
;
365 static irqreturn_t
softing_irq_v1(int irq
, void *dev_id
)
367 struct softing
*card
= (struct softing
*)dev_id
;
370 ir
= ioread8(&card
->dpram
[DPRAM_IRQ_TOHOST
]);
371 iowrite8(0, &card
->dpram
[DPRAM_IRQ_TOHOST
]);
372 return ir
? IRQ_WAKE_THREAD
: IRQ_NONE
;
376 * netdev/candev interoperability
378 static int softing_netdev_open(struct net_device
*ndev
)
382 /* check or determine and set bittime */
383 ret
= open_candev(ndev
);
387 ret
= softing_startstop(ndev
, 1);
394 static int softing_netdev_stop(struct net_device
*ndev
)
396 netif_stop_queue(ndev
);
398 /* softing cycle does close_candev() */
399 return softing_startstop(ndev
, 0);
402 static int softing_candev_set_mode(struct net_device
*ndev
, enum can_mode mode
)
408 /* softing_startstop does close_candev() */
409 ret
= softing_startstop(ndev
, 1);
419 * Softing device management helpers
421 int softing_enable_irq(struct softing
*card
, int enable
)
427 } else if (card
->irq
.requested
&& !enable
) {
428 free_irq(card
->irq
.nr
, card
);
429 card
->irq
.requested
= 0;
430 } else if (!card
->irq
.requested
&& enable
) {
431 ret
= request_threaded_irq(card
->irq
.nr
,
432 (card
->pdat
->generation
>= 2) ?
433 softing_irq_v2
: softing_irq_v1
,
434 softing_irq_thread
, IRQF_SHARED
,
435 dev_name(&card
->pdev
->dev
), card
);
437 dev_alert(&card
->pdev
->dev
,
438 "request_threaded_irq(%u) failed\n",
442 card
->irq
.requested
= 1;
447 static void softing_card_shutdown(struct softing
*card
)
451 if (mutex_lock_interruptible(&card
->fw
.lock
)) {
452 /* return -ERESTARTSYS */;
457 if (card
->irq
.requested
&& card
->irq
.nr
) {
458 free_irq(card
->irq
.nr
, card
);
459 card
->irq
.requested
= 0;
462 if (card
->pdat
->enable_irq
)
463 card
->pdat
->enable_irq(card
->pdev
, 0);
464 softing_set_reset_dpram(card
);
465 if (card
->pdat
->reset
)
466 card
->pdat
->reset(card
->pdev
, 1);
468 mutex_unlock(&card
->fw
.lock
);
471 static int softing_card_boot(struct softing
*card
)
474 static const uint8_t stream
[] = {
475 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, };
476 unsigned char back
[sizeof(stream
)];
478 if (mutex_lock_interruptible(&card
->fw
.lock
))
481 mutex_unlock(&card
->fw
.lock
);
485 if (card
->pdat
->enable_irq
)
486 card
->pdat
->enable_irq(card
->pdev
, 1);
488 softing_set_reset_dpram(card
);
489 if (card
->pdat
->reset
)
490 card
->pdat
->reset(card
->pdev
, 1);
491 for (j
= 0; (j
+ sizeof(stream
)) < card
->dpram_size
;
492 j
+= sizeof(stream
)) {
494 memcpy_toio(&card
->dpram
[j
], stream
, sizeof(stream
));
497 memcpy_fromio(back
, &card
->dpram
[j
], sizeof(stream
));
499 if (!memcmp(back
, stream
, sizeof(stream
)))
501 /* memory is not equal */
502 dev_alert(&card
->pdev
->dev
, "dpram failed at 0x%04x\n", j
);
507 /* load boot firmware */
508 ret
= softing_load_fw(card
->pdat
->boot
.fw
, card
, card
->dpram
,
510 card
->pdat
->boot
.offs
- card
->pdat
->boot
.addr
);
513 /* load loader firmware */
514 ret
= softing_load_fw(card
->pdat
->load
.fw
, card
, card
->dpram
,
516 card
->pdat
->load
.offs
- card
->pdat
->load
.addr
);
520 if (card
->pdat
->reset
)
521 card
->pdat
->reset(card
->pdev
, 0);
522 softing_clr_reset_dpram(card
);
523 ret
= softing_bootloader_command(card
, 0, "card boot");
526 ret
= softing_load_app_fw(card
->pdat
->app
.fw
, card
);
530 ret
= softing_chip_poweron(card
);
535 mutex_unlock(&card
->fw
.lock
);
539 if (card
->pdat
->enable_irq
)
540 card
->pdat
->enable_irq(card
->pdev
, 0);
541 softing_set_reset_dpram(card
);
542 if (card
->pdat
->reset
)
543 card
->pdat
->reset(card
->pdev
, 1);
544 mutex_unlock(&card
->fw
.lock
);
551 static ssize_t
show_chip(struct device
*dev
, struct device_attribute
*attr
,
554 struct net_device
*ndev
= to_net_dev(dev
);
555 struct softing_priv
*priv
= netdev2softing(ndev
);
557 return sprintf(buf
, "%i\n", priv
->chip
);
560 static ssize_t
show_output(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
, "0x%02x\n", priv
->output
);
569 static ssize_t
store_output(struct device
*dev
, struct device_attribute
*attr
,
570 const char *buf
, size_t count
)
572 struct net_device
*ndev
= to_net_dev(dev
);
573 struct softing_priv
*priv
= netdev2softing(ndev
);
574 struct softing
*card
= priv
->card
;
578 ret
= kstrtoul(buf
, 0, &val
);
583 ret
= mutex_lock_interruptible(&card
->fw
.lock
);
586 if (netif_running(ndev
)) {
587 mutex_unlock(&card
->fw
.lock
);
591 mutex_unlock(&card
->fw
.lock
);
595 static const DEVICE_ATTR(chip
, 0444, show_chip
, NULL
);
596 static const DEVICE_ATTR(output
, 0644, show_output
, store_output
);
598 static const struct attribute
*const netdev_sysfs_attrs
[] = {
600 &dev_attr_output
.attr
,
603 static const struct attribute_group netdev_sysfs_group
= {
605 .attrs
= (struct attribute
**)netdev_sysfs_attrs
,
608 static const struct net_device_ops softing_netdev_ops
= {
609 .ndo_open
= softing_netdev_open
,
610 .ndo_stop
= softing_netdev_stop
,
611 .ndo_start_xmit
= softing_netdev_start_xmit
,
612 .ndo_change_mtu
= can_change_mtu
,
615 static const struct ethtool_ops softing_ethtool_ops
= {
616 .get_ts_info
= ethtool_op_get_ts_info
,
619 static const struct can_bittiming_const softing_btr_const
= {
620 .name
= KBUILD_MODNAME
,
625 .sjw_max
= 4, /* overruled */
627 .brp_max
= 32, /* overruled */
632 static struct net_device
*softing_netdev_create(struct softing
*card
,
635 struct net_device
*netdev
;
636 struct softing_priv
*priv
;
638 netdev
= alloc_candev(sizeof(*priv
), TX_ECHO_SKB_MAX
);
640 dev_alert(&card
->pdev
->dev
, "alloc_candev failed\n");
643 priv
= netdev_priv(netdev
);
644 priv
->netdev
= netdev
;
646 memcpy(&priv
->btr_const
, &softing_btr_const
, sizeof(priv
->btr_const
));
647 priv
->btr_const
.brp_max
= card
->pdat
->max_brp
;
648 priv
->btr_const
.sjw_max
= card
->pdat
->max_sjw
;
649 priv
->can
.bittiming_const
= &priv
->btr_const
;
650 priv
->can
.clock
.freq
= 8000000;
651 priv
->chip
= chip_id
;
652 priv
->output
= softing_default_output(netdev
);
653 SET_NETDEV_DEV(netdev
, &card
->pdev
->dev
);
655 netdev
->flags
|= IFF_ECHO
;
656 netdev
->netdev_ops
= &softing_netdev_ops
;
657 netdev
->ethtool_ops
= &softing_ethtool_ops
;
658 priv
->can
.do_set_mode
= softing_candev_set_mode
;
659 priv
->can
.ctrlmode_supported
= CAN_CTRLMODE_3_SAMPLES
;
664 static int softing_netdev_register(struct net_device
*netdev
)
668 ret
= register_candev(netdev
);
670 dev_alert(&netdev
->dev
, "register failed\n");
673 if (sysfs_create_group(&netdev
->dev
.kobj
, &netdev_sysfs_group
) < 0)
674 netdev_alert(netdev
, "sysfs group failed\n");
679 static void softing_netdev_cleanup(struct net_device
*netdev
)
681 sysfs_remove_group(&netdev
->dev
.kobj
, &netdev_sysfs_group
);
682 unregister_candev(netdev
);
687 * sysfs for Platform device
689 #define DEV_ATTR_RO(name, member) \
690 static ssize_t show_##name(struct device *dev, \
691 struct device_attribute *attr, char *buf) \
693 struct softing *card = dev_get_drvdata(dev); \
694 return sprintf(buf, "%u\n", card->member); \
696 static DEVICE_ATTR(name, 0444, show_##name, NULL)
698 #define DEV_ATTR_RO_STR(name, member) \
699 static ssize_t show_##name(struct device *dev, \
700 struct device_attribute *attr, char *buf) \
702 struct softing *card = dev_get_drvdata(dev); \
703 return sprintf(buf, "%s\n", card->member); \
705 static DEVICE_ATTR(name, 0444, show_##name, NULL)
707 DEV_ATTR_RO(serial
, id
.serial
);
708 DEV_ATTR_RO_STR(firmware
, pdat
->app
.fw
);
709 DEV_ATTR_RO(firmware_version
, id
.fw_version
);
710 DEV_ATTR_RO_STR(hardware
, pdat
->name
);
711 DEV_ATTR_RO(hardware_version
, id
.hw_version
);
712 DEV_ATTR_RO(license
, id
.license
);
714 static struct attribute
*softing_pdev_attrs
[] = {
715 &dev_attr_serial
.attr
,
716 &dev_attr_firmware
.attr
,
717 &dev_attr_firmware_version
.attr
,
718 &dev_attr_hardware
.attr
,
719 &dev_attr_hardware_version
.attr
,
720 &dev_attr_license
.attr
,
724 static const struct attribute_group softing_pdev_group
= {
726 .attrs
= softing_pdev_attrs
,
732 static void softing_pdev_remove(struct platform_device
*pdev
)
734 struct softing
*card
= platform_get_drvdata(pdev
);
737 /* first, disable card*/
738 softing_card_shutdown(card
);
740 for (j
= 0; j
< ARRAY_SIZE(card
->net
); ++j
) {
743 softing_netdev_cleanup(card
->net
[j
]);
746 sysfs_remove_group(&pdev
->dev
.kobj
, &softing_pdev_group
);
748 iounmap(card
->dpram
);
752 static int softing_pdev_probe(struct platform_device
*pdev
)
754 const struct softing_platform_data
*pdat
= dev_get_platdata(&pdev
->dev
);
755 struct softing
*card
;
756 struct net_device
*netdev
;
757 struct softing_priv
*priv
;
758 struct resource
*pres
;
763 dev_warn(&pdev
->dev
, "no platform data\n");
766 if (pdat
->nbus
> ARRAY_SIZE(card
->net
)) {
767 dev_warn(&pdev
->dev
, "%u nets??\n", pdat
->nbus
);
771 card
= kzalloc(sizeof(*card
), GFP_KERNEL
);
776 platform_set_drvdata(pdev
, card
);
777 mutex_init(&card
->fw
.lock
);
778 spin_lock_init(&card
->spin
);
781 pres
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
783 goto platform_resource_failed
;
784 card
->dpram_phys
= pres
->start
;
785 card
->dpram_size
= resource_size(pres
);
786 card
->dpram
= ioremap(card
->dpram_phys
, card
->dpram_size
);
788 dev_alert(&card
->pdev
->dev
, "dpram ioremap failed\n");
792 pres
= platform_get_resource(pdev
, IORESOURCE_IRQ
, 0);
794 card
->irq
.nr
= pres
->start
;
797 ret
= softing_card_boot(card
);
799 dev_alert(&pdev
->dev
, "failed to boot\n");
803 /* only now, the chip's are known */
804 card
->id
.freq
= card
->pdat
->freq
;
806 ret
= sysfs_create_group(&pdev
->dev
.kobj
, &softing_pdev_group
);
808 dev_alert(&card
->pdev
->dev
, "sysfs failed\n");
812 for (j
= 0; j
< ARRAY_SIZE(card
->net
); ++j
) {
813 card
->net
[j
] = netdev
=
814 softing_netdev_create(card
, card
->id
.chip
[j
]);
816 dev_alert(&pdev
->dev
, "failed to make can[%i]", j
);
821 priv
= netdev_priv(card
->net
[j
]);
823 ret
= softing_netdev_register(netdev
);
827 dev_alert(&card
->pdev
->dev
,
828 "failed to register can[%i]\n", j
);
832 dev_info(&card
->pdev
->dev
, "%s ready.\n", card
->pdat
->name
);
836 for (j
= 0; j
< ARRAY_SIZE(card
->net
); ++j
) {
839 softing_netdev_cleanup(card
->net
[j
]);
841 sysfs_remove_group(&pdev
->dev
.kobj
, &softing_pdev_group
);
843 softing_card_shutdown(card
);
845 iounmap(card
->dpram
);
847 platform_resource_failed
:
852 static struct platform_driver softing_driver
= {
854 .name
= KBUILD_MODNAME
,
856 .probe
= softing_pdev_probe
,
857 .remove
= softing_pdev_remove
,
860 module_platform_driver(softing_driver
);
862 MODULE_ALIAS("platform:softing");
863 MODULE_DESCRIPTION("Softing DPRAM CAN driver");
864 MODULE_AUTHOR("Kurt Van Dijck <kurt.van.dijck@eia.be>");
865 MODULE_LICENSE("GPL v2");