diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
commit | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch) | |
tree | a8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /drivers/net/can | |
parent | 406089d01562f1e2bf9f089fd7637009ebaad589 (diff) |
Patched in Tegra support.
Diffstat (limited to 'drivers/net/can')
56 files changed, 940 insertions, 12124 deletions
diff --git a/drivers/net/can/Kconfig b/drivers/net/can/Kconfig index b56bd9e8095..f6c98fb4a51 100644 --- a/drivers/net/can/Kconfig +++ b/drivers/net/can/Kconfig | |||
@@ -103,30 +103,19 @@ config CAN_FLEXCAN | |||
103 | Say Y here if you want to support for Freescale FlexCAN. | 103 | Say Y here if you want to support for Freescale FlexCAN. |
104 | 104 | ||
105 | config PCH_CAN | 105 | config PCH_CAN |
106 | tristate "Intel EG20T PCH CAN controller" | 106 | tristate "PCH CAN" |
107 | depends on CAN_DEV && PCI | 107 | depends on CAN_DEV && PCI |
108 | ---help--- | 108 | ---help--- |
109 | This driver is for PCH CAN of Topcliff (Intel EG20T PCH) which | 109 | This driver is for PCH CAN of Topcliff which is an IOH for x86 |
110 | is an IOH for x86 embedded processor (Intel Atom E6xx series). | 110 | embedded processor. |
111 | This driver can access CAN bus. | 111 | This driver can access CAN bus. |
112 | 112 | ||
113 | config CAN_GRCAN | ||
114 | tristate "Aeroflex Gaisler GRCAN and GRHCAN CAN devices" | ||
115 | depends on CAN_DEV && OF | ||
116 | ---help--- | ||
117 | Say Y here if you want to use Aeroflex Gaisler GRCAN or GRHCAN. | ||
118 | Note that the driver supports little endian, even though little | ||
119 | endian syntheses of the cores would need some modifications on | ||
120 | the hardware level to work. | ||
121 | |||
122 | source "drivers/net/can/mscan/Kconfig" | 113 | source "drivers/net/can/mscan/Kconfig" |
123 | 114 | ||
124 | source "drivers/net/can/sja1000/Kconfig" | 115 | source "drivers/net/can/sja1000/Kconfig" |
125 | 116 | ||
126 | source "drivers/net/can/c_can/Kconfig" | 117 | source "drivers/net/can/c_can/Kconfig" |
127 | 118 | ||
128 | source "drivers/net/can/cc770/Kconfig" | ||
129 | |||
130 | source "drivers/net/can/usb/Kconfig" | 119 | source "drivers/net/can/usb/Kconfig" |
131 | 120 | ||
132 | source "drivers/net/can/softing/Kconfig" | 121 | source "drivers/net/can/softing/Kconfig" |
diff --git a/drivers/net/can/Makefile b/drivers/net/can/Makefile index 7de59862bbe..24ebfe8d758 100644 --- a/drivers/net/can/Makefile +++ b/drivers/net/can/Makefile | |||
@@ -14,7 +14,6 @@ obj-y += softing/ | |||
14 | obj-$(CONFIG_CAN_SJA1000) += sja1000/ | 14 | obj-$(CONFIG_CAN_SJA1000) += sja1000/ |
15 | obj-$(CONFIG_CAN_MSCAN) += mscan/ | 15 | obj-$(CONFIG_CAN_MSCAN) += mscan/ |
16 | obj-$(CONFIG_CAN_C_CAN) += c_can/ | 16 | obj-$(CONFIG_CAN_C_CAN) += c_can/ |
17 | obj-$(CONFIG_CAN_CC770) += cc770/ | ||
18 | obj-$(CONFIG_CAN_AT91) += at91_can.o | 17 | obj-$(CONFIG_CAN_AT91) += at91_can.o |
19 | obj-$(CONFIG_CAN_TI_HECC) += ti_hecc.o | 18 | obj-$(CONFIG_CAN_TI_HECC) += ti_hecc.o |
20 | obj-$(CONFIG_CAN_MCP251X) += mcp251x.o | 19 | obj-$(CONFIG_CAN_MCP251X) += mcp251x.o |
@@ -22,6 +21,5 @@ obj-$(CONFIG_CAN_BFIN) += bfin_can.o | |||
22 | obj-$(CONFIG_CAN_JANZ_ICAN3) += janz-ican3.o | 21 | obj-$(CONFIG_CAN_JANZ_ICAN3) += janz-ican3.o |
23 | obj-$(CONFIG_CAN_FLEXCAN) += flexcan.o | 22 | obj-$(CONFIG_CAN_FLEXCAN) += flexcan.o |
24 | obj-$(CONFIG_PCH_CAN) += pch_can.o | 23 | obj-$(CONFIG_PCH_CAN) += pch_can.o |
25 | obj-$(CONFIG_CAN_GRCAN) += grcan.o | ||
26 | 24 | ||
27 | ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG | 25 | ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG |
diff --git a/drivers/net/can/at91_can.c b/drivers/net/can/at91_can.c index 81baefda037..121ede663e2 100644 --- a/drivers/net/can/at91_can.c +++ b/drivers/net/can/at91_can.c | |||
@@ -8,6 +8,8 @@ | |||
8 | * Public License ("GPL") version 2 as distributed in the 'COPYING' | 8 | * Public License ("GPL") version 2 as distributed in the 'COPYING' |
9 | * file from the main directory of the linux kernel source. | 9 | * file from the main directory of the linux kernel source. |
10 | * | 10 | * |
11 | * Send feedback to <socketcan-users@lists.berlios.de> | ||
12 | * | ||
11 | * | 13 | * |
12 | * Your platform definition file should specify something like: | 14 | * Your platform definition file should specify something like: |
13 | * | 15 | * |
@@ -33,11 +35,12 @@ | |||
33 | #include <linux/spinlock.h> | 35 | #include <linux/spinlock.h> |
34 | #include <linux/string.h> | 36 | #include <linux/string.h> |
35 | #include <linux/types.h> | 37 | #include <linux/types.h> |
36 | #include <linux/platform_data/atmel.h> | ||
37 | 38 | ||
38 | #include <linux/can/dev.h> | 39 | #include <linux/can/dev.h> |
39 | #include <linux/can/error.h> | 40 | #include <linux/can/error.h> |
40 | 41 | ||
42 | #include <mach/board.h> | ||
43 | |||
41 | #define AT91_MB_MASK(i) ((1 << (i)) - 1) | 44 | #define AT91_MB_MASK(i) ((1 << (i)) - 1) |
42 | 45 | ||
43 | /* Common registers */ | 46 | /* Common registers */ |
@@ -154,7 +157,7 @@ struct at91_priv { | |||
154 | canid_t mb0_id; | 157 | canid_t mb0_id; |
155 | }; | 158 | }; |
156 | 159 | ||
157 | static const struct at91_devtype_data at91_devtype_data[] = { | 160 | static const struct at91_devtype_data at91_devtype_data[] __devinitconst = { |
158 | [AT91_DEVTYPE_SAM9263] = { | 161 | [AT91_DEVTYPE_SAM9263] = { |
159 | .rx_first = 1, | 162 | .rx_first = 1, |
160 | .rx_split = 8, | 163 | .rx_split = 8, |
@@ -169,7 +172,7 @@ static const struct at91_devtype_data at91_devtype_data[] = { | |||
169 | }, | 172 | }, |
170 | }; | 173 | }; |
171 | 174 | ||
172 | static const struct can_bittiming_const at91_bittiming_const = { | 175 | static struct can_bittiming_const at91_bittiming_const = { |
173 | .name = KBUILD_MODNAME, | 176 | .name = KBUILD_MODNAME, |
174 | .tseg1_min = 4, | 177 | .tseg1_min = 4, |
175 | .tseg1_max = 16, | 178 | .tseg1_max = 16, |
@@ -1241,7 +1244,7 @@ static struct attribute_group at91_sysfs_attr_group = { | |||
1241 | .attrs = at91_sysfs_attrs, | 1244 | .attrs = at91_sysfs_attrs, |
1242 | }; | 1245 | }; |
1243 | 1246 | ||
1244 | static int at91_can_probe(struct platform_device *pdev) | 1247 | static int __devinit at91_can_probe(struct platform_device *pdev) |
1245 | { | 1248 | { |
1246 | const struct at91_devtype_data *devtype_data; | 1249 | const struct at91_devtype_data *devtype_data; |
1247 | enum at91_devtype devtype; | 1250 | enum at91_devtype devtype; |
@@ -1338,7 +1341,7 @@ static int at91_can_probe(struct platform_device *pdev) | |||
1338 | return err; | 1341 | return err; |
1339 | } | 1342 | } |
1340 | 1343 | ||
1341 | static int at91_can_remove(struct platform_device *pdev) | 1344 | static int __devexit at91_can_remove(struct platform_device *pdev) |
1342 | { | 1345 | { |
1343 | struct net_device *dev = platform_get_drvdata(pdev); | 1346 | struct net_device *dev = platform_get_drvdata(pdev); |
1344 | struct at91_priv *priv = netdev_priv(dev); | 1347 | struct at91_priv *priv = netdev_priv(dev); |
@@ -1371,11 +1374,10 @@ static const struct platform_device_id at91_can_id_table[] = { | |||
1371 | /* sentinel */ | 1374 | /* sentinel */ |
1372 | } | 1375 | } |
1373 | }; | 1376 | }; |
1374 | MODULE_DEVICE_TABLE(platform, at91_can_id_table); | ||
1375 | 1377 | ||
1376 | static struct platform_driver at91_can_driver = { | 1378 | static struct platform_driver at91_can_driver = { |
1377 | .probe = at91_can_probe, | 1379 | .probe = at91_can_probe, |
1378 | .remove = at91_can_remove, | 1380 | .remove = __devexit_p(at91_can_remove), |
1379 | .driver = { | 1381 | .driver = { |
1380 | .name = KBUILD_MODNAME, | 1382 | .name = KBUILD_MODNAME, |
1381 | .owner = THIS_MODULE, | 1383 | .owner = THIS_MODULE, |
@@ -1383,7 +1385,18 @@ static struct platform_driver at91_can_driver = { | |||
1383 | .id_table = at91_can_id_table, | 1385 | .id_table = at91_can_id_table, |
1384 | }; | 1386 | }; |
1385 | 1387 | ||
1386 | module_platform_driver(at91_can_driver); | 1388 | static int __init at91_can_module_init(void) |
1389 | { | ||
1390 | return platform_driver_register(&at91_can_driver); | ||
1391 | } | ||
1392 | |||
1393 | static void __exit at91_can_module_exit(void) | ||
1394 | { | ||
1395 | platform_driver_unregister(&at91_can_driver); | ||
1396 | } | ||
1397 | |||
1398 | module_init(at91_can_module_init); | ||
1399 | module_exit(at91_can_module_exit); | ||
1387 | 1400 | ||
1388 | MODULE_AUTHOR("Marc Kleine-Budde <mkl@pengutronix.de>"); | 1401 | MODULE_AUTHOR("Marc Kleine-Budde <mkl@pengutronix.de>"); |
1389 | MODULE_LICENSE("GPL v2"); | 1402 | MODULE_LICENSE("GPL v2"); |
diff --git a/drivers/net/can/bfin_can.c b/drivers/net/can/bfin_can.c index 6a0532176b6..a1c5abc38cd 100644 --- a/drivers/net/can/bfin_can.c +++ b/drivers/net/can/bfin_can.c | |||
@@ -44,7 +44,7 @@ struct bfin_can_priv { | |||
44 | /* | 44 | /* |
45 | * bfin can timing parameters | 45 | * bfin can timing parameters |
46 | */ | 46 | */ |
47 | static const struct can_bittiming_const bfin_can_bittiming_const = { | 47 | static struct can_bittiming_const bfin_can_bittiming_const = { |
48 | .name = DRV_NAME, | 48 | .name = DRV_NAME, |
49 | .tseg1_min = 1, | 49 | .tseg1_min = 1, |
50 | .tseg1_max = 16, | 50 | .tseg1_max = 16, |
@@ -82,7 +82,8 @@ static int bfin_can_set_bittiming(struct net_device *dev) | |||
82 | bfin_write(®->clock, clk); | 82 | bfin_write(®->clock, clk); |
83 | bfin_write(®->timing, timing); | 83 | bfin_write(®->timing, timing); |
84 | 84 | ||
85 | netdev_info(dev, "setting CLOCK=0x%04x TIMING=0x%04x\n", clk, timing); | 85 | dev_info(dev->dev.parent, "setting CLOCK=0x%04x TIMING=0x%04x\n", |
86 | clk, timing); | ||
86 | 87 | ||
87 | return 0; | 88 | return 0; |
88 | } | 89 | } |
@@ -107,7 +108,8 @@ static void bfin_can_set_reset_mode(struct net_device *dev) | |||
107 | while (!(bfin_read(®->control) & CCA)) { | 108 | while (!(bfin_read(®->control) & CCA)) { |
108 | udelay(10); | 109 | udelay(10); |
109 | if (--timeout == 0) { | 110 | if (--timeout == 0) { |
110 | netdev_err(dev, "fail to enter configuration mode\n"); | 111 | dev_err(dev->dev.parent, |
112 | "fail to enter configuration mode\n"); | ||
111 | BUG(); | 113 | BUG(); |
112 | } | 114 | } |
113 | } | 115 | } |
@@ -163,7 +165,8 @@ static void bfin_can_set_normal_mode(struct net_device *dev) | |||
163 | while (bfin_read(®->status) & CCA) { | 165 | while (bfin_read(®->status) & CCA) { |
164 | udelay(10); | 166 | udelay(10); |
165 | if (--timeout == 0) { | 167 | if (--timeout == 0) { |
166 | netdev_err(dev, "fail to leave configuration mode\n"); | 168 | dev_err(dev->dev.parent, |
169 | "fail to leave configuration mode\n"); | ||
167 | BUG(); | 170 | BUG(); |
168 | } | 171 | } |
169 | } | 172 | } |
@@ -221,20 +224,6 @@ static int bfin_can_set_mode(struct net_device *dev, enum can_mode mode) | |||
221 | return 0; | 224 | return 0; |
222 | } | 225 | } |
223 | 226 | ||
224 | static int bfin_can_get_berr_counter(const struct net_device *dev, | ||
225 | struct can_berr_counter *bec) | ||
226 | { | ||
227 | struct bfin_can_priv *priv = netdev_priv(dev); | ||
228 | struct bfin_can_regs __iomem *reg = priv->membase; | ||
229 | |||
230 | u16 cec = bfin_read(®->cec); | ||
231 | |||
232 | bec->txerr = cec >> 8; | ||
233 | bec->rxerr = cec; | ||
234 | |||
235 | return 0; | ||
236 | } | ||
237 | |||
238 | static int bfin_can_start_xmit(struct sk_buff *skb, struct net_device *dev) | 227 | static int bfin_can_start_xmit(struct sk_buff *skb, struct net_device *dev) |
239 | { | 228 | { |
240 | struct bfin_can_priv *priv = netdev_priv(dev); | 229 | struct bfin_can_priv *priv = netdev_priv(dev); |
@@ -342,7 +331,7 @@ static int bfin_can_err(struct net_device *dev, u16 isrc, u16 status) | |||
342 | 331 | ||
343 | if (isrc & RMLIS) { | 332 | if (isrc & RMLIS) { |
344 | /* data overrun interrupt */ | 333 | /* data overrun interrupt */ |
345 | netdev_dbg(dev, "data overrun interrupt\n"); | 334 | dev_dbg(dev->dev.parent, "data overrun interrupt\n"); |
346 | cf->can_id |= CAN_ERR_CRTL; | 335 | cf->can_id |= CAN_ERR_CRTL; |
347 | cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; | 336 | cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; |
348 | stats->rx_over_errors++; | 337 | stats->rx_over_errors++; |
@@ -350,7 +339,7 @@ static int bfin_can_err(struct net_device *dev, u16 isrc, u16 status) | |||
350 | } | 339 | } |
351 | 340 | ||
352 | if (isrc & BOIS) { | 341 | if (isrc & BOIS) { |
353 | netdev_dbg(dev, "bus-off mode interrupt\n"); | 342 | dev_dbg(dev->dev.parent, "bus-off mode interrupt\n"); |
354 | state = CAN_STATE_BUS_OFF; | 343 | state = CAN_STATE_BUS_OFF; |
355 | cf->can_id |= CAN_ERR_BUSOFF; | 344 | cf->can_id |= CAN_ERR_BUSOFF; |
356 | can_bus_off(dev); | 345 | can_bus_off(dev); |
@@ -358,12 +347,13 @@ static int bfin_can_err(struct net_device *dev, u16 isrc, u16 status) | |||
358 | 347 | ||
359 | if (isrc & EPIS) { | 348 | if (isrc & EPIS) { |
360 | /* error passive interrupt */ | 349 | /* error passive interrupt */ |
361 | netdev_dbg(dev, "error passive interrupt\n"); | 350 | dev_dbg(dev->dev.parent, "error passive interrupt\n"); |
362 | state = CAN_STATE_ERROR_PASSIVE; | 351 | state = CAN_STATE_ERROR_PASSIVE; |
363 | } | 352 | } |
364 | 353 | ||
365 | if ((isrc & EWTIS) || (isrc & EWRIS)) { | 354 | if ((isrc & EWTIS) || (isrc & EWRIS)) { |
366 | netdev_dbg(dev, "Error Warning Transmit/Receive Interrupt\n"); | 355 | dev_dbg(dev->dev.parent, |
356 | "Error Warning Transmit/Receive Interrupt\n"); | ||
367 | state = CAN_STATE_ERROR_WARNING; | 357 | state = CAN_STATE_ERROR_WARNING; |
368 | } | 358 | } |
369 | 359 | ||
@@ -519,7 +509,6 @@ struct net_device *alloc_bfin_candev(void) | |||
519 | priv->can.bittiming_const = &bfin_can_bittiming_const; | 509 | priv->can.bittiming_const = &bfin_can_bittiming_const; |
520 | priv->can.do_set_bittiming = bfin_can_set_bittiming; | 510 | priv->can.do_set_bittiming = bfin_can_set_bittiming; |
521 | priv->can.do_set_mode = bfin_can_set_mode; | 511 | priv->can.do_set_mode = bfin_can_set_mode; |
522 | priv->can.do_get_berr_counter = bfin_can_get_berr_counter; | ||
523 | priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES; | 512 | priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES; |
524 | 513 | ||
525 | return dev; | 514 | return dev; |
@@ -531,7 +520,7 @@ static const struct net_device_ops bfin_can_netdev_ops = { | |||
531 | .ndo_start_xmit = bfin_can_start_xmit, | 520 | .ndo_start_xmit = bfin_can_start_xmit, |
532 | }; | 521 | }; |
533 | 522 | ||
534 | static int bfin_can_probe(struct platform_device *pdev) | 523 | static int __devinit bfin_can_probe(struct platform_device *pdev) |
535 | { | 524 | { |
536 | int err; | 525 | int err; |
537 | struct net_device *dev; | 526 | struct net_device *dev; |
@@ -597,7 +586,7 @@ static int bfin_can_probe(struct platform_device *pdev) | |||
597 | dev_info(&pdev->dev, | 586 | dev_info(&pdev->dev, |
598 | "%s device registered" | 587 | "%s device registered" |
599 | "(®_base=%p, rx_irq=%d, tx_irq=%d, err_irq=%d, sclk=%d)\n", | 588 | "(®_base=%p, rx_irq=%d, tx_irq=%d, err_irq=%d, sclk=%d)\n", |
600 | DRV_NAME, priv->membase, priv->rx_irq, | 589 | DRV_NAME, (void *)priv->membase, priv->rx_irq, |
601 | priv->tx_irq, priv->err_irq, priv->can.clock.freq); | 590 | priv->tx_irq, priv->err_irq, priv->can.clock.freq); |
602 | return 0; | 591 | return 0; |
603 | 592 | ||
@@ -611,7 +600,7 @@ exit: | |||
611 | return err; | 600 | return err; |
612 | } | 601 | } |
613 | 602 | ||
614 | static int bfin_can_remove(struct platform_device *pdev) | 603 | static int __devexit bfin_can_remove(struct platform_device *pdev) |
615 | { | 604 | { |
616 | struct net_device *dev = dev_get_drvdata(&pdev->dev); | 605 | struct net_device *dev = dev_get_drvdata(&pdev->dev); |
617 | struct bfin_can_priv *priv = netdev_priv(dev); | 606 | struct bfin_can_priv *priv = netdev_priv(dev); |
@@ -647,7 +636,8 @@ static int bfin_can_suspend(struct platform_device *pdev, pm_message_t mesg) | |||
647 | while (!(bfin_read(®->intr) & SMACK)) { | 636 | while (!(bfin_read(®->intr) & SMACK)) { |
648 | udelay(10); | 637 | udelay(10); |
649 | if (--timeout == 0) { | 638 | if (--timeout == 0) { |
650 | netdev_err(dev, "fail to enter sleep mode\n"); | 639 | dev_err(dev->dev.parent, |
640 | "fail to enter sleep mode\n"); | ||
651 | BUG(); | 641 | BUG(); |
652 | } | 642 | } |
653 | } | 643 | } |
@@ -677,7 +667,7 @@ static int bfin_can_resume(struct platform_device *pdev) | |||
677 | 667 | ||
678 | static struct platform_driver bfin_can_driver = { | 668 | static struct platform_driver bfin_can_driver = { |
679 | .probe = bfin_can_probe, | 669 | .probe = bfin_can_probe, |
680 | .remove = bfin_can_remove, | 670 | .remove = __devexit_p(bfin_can_remove), |
681 | .suspend = bfin_can_suspend, | 671 | .suspend = bfin_can_suspend, |
682 | .resume = bfin_can_resume, | 672 | .resume = bfin_can_resume, |
683 | .driver = { | 673 | .driver = { |
@@ -686,9 +676,18 @@ static struct platform_driver bfin_can_driver = { | |||
686 | }, | 676 | }, |
687 | }; | 677 | }; |
688 | 678 | ||
689 | module_platform_driver(bfin_can_driver); | 679 | static int __init bfin_can_init(void) |
680 | { | ||
681 | return platform_driver_register(&bfin_can_driver); | ||
682 | } | ||
683 | module_init(bfin_can_init); | ||
684 | |||
685 | static void __exit bfin_can_exit(void) | ||
686 | { | ||
687 | platform_driver_unregister(&bfin_can_driver); | ||
688 | } | ||
689 | module_exit(bfin_can_exit); | ||
690 | 690 | ||
691 | MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); | 691 | MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); |
692 | MODULE_LICENSE("GPL"); | 692 | MODULE_LICENSE("GPL"); |
693 | MODULE_DESCRIPTION("Blackfin on-chip CAN netdevice driver"); | 693 | MODULE_DESCRIPTION("Blackfin on-chip CAN netdevice driver"); |
694 | MODULE_ALIAS("platform:" DRV_NAME); | ||
diff --git a/drivers/net/can/c_can/Kconfig b/drivers/net/can/c_can/Kconfig index 3b83bafcd94..ffb9773d102 100644 --- a/drivers/net/can/c_can/Kconfig +++ b/drivers/net/can/c_can/Kconfig | |||
@@ -1,23 +1,15 @@ | |||
1 | menuconfig CAN_C_CAN | 1 | menuconfig CAN_C_CAN |
2 | tristate "Bosch C_CAN/D_CAN devices" | 2 | tristate "Bosch C_CAN devices" |
3 | depends on CAN_DEV && HAS_IOMEM | 3 | depends on CAN_DEV && HAS_IOMEM |
4 | 4 | ||
5 | if CAN_C_CAN | 5 | if CAN_C_CAN |
6 | 6 | ||
7 | config CAN_C_CAN_PLATFORM | 7 | config CAN_C_CAN_PLATFORM |
8 | tristate "Generic Platform Bus based C_CAN/D_CAN driver" | 8 | tristate "Generic Platform Bus based C_CAN driver" |
9 | ---help--- | 9 | ---help--- |
10 | This driver adds support for the C_CAN/D_CAN chips connected | 10 | This driver adds support for the C_CAN chips connected to |
11 | to the "platform bus" (Linux abstraction for directly to the | 11 | the "platform bus" (Linux abstraction for directly to the |
12 | processor attached devices) which can be found on various | 12 | processor attached devices) which can be found on various |
13 | boards from ST Microelectronics (http://www.st.com) like the | 13 | boards from ST Microelectronics (http://www.st.com) |
14 | SPEAr1310 and SPEAr320 evaluation boards & TI (www.ti.com) | 14 | like the SPEAr1310 and SPEAr320 evaluation boards. |
15 | boards like am335x, dm814x, dm813x and dm811x. | ||
16 | |||
17 | config CAN_C_CAN_PCI | ||
18 | tristate "Generic PCI Bus based C_CAN/D_CAN driver" | ||
19 | depends on PCI | ||
20 | ---help--- | ||
21 | This driver adds support for the C_CAN/D_CAN chips connected | ||
22 | to the PCI bus. | ||
23 | endif | 15 | endif |
diff --git a/drivers/net/can/c_can/Makefile b/drivers/net/can/c_can/Makefile index ad1cc842170..9273f6d5c4b 100644 --- a/drivers/net/can/c_can/Makefile +++ b/drivers/net/can/c_can/Makefile | |||
@@ -4,6 +4,5 @@ | |||
4 | 4 | ||
5 | obj-$(CONFIG_CAN_C_CAN) += c_can.o | 5 | obj-$(CONFIG_CAN_C_CAN) += c_can.o |
6 | obj-$(CONFIG_CAN_C_CAN_PLATFORM) += c_can_platform.o | 6 | obj-$(CONFIG_CAN_C_CAN_PLATFORM) += c_can_platform.o |
7 | obj-$(CONFIG_CAN_C_CAN_PCI) += c_can_pci.o | ||
8 | 7 | ||
9 | ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG | 8 | ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG |
diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c index 5233b8f58d7..536bda072a1 100644 --- a/drivers/net/can/c_can/c_can.c +++ b/drivers/net/can/c_can/c_can.c | |||
@@ -34,7 +34,6 @@ | |||
34 | #include <linux/if_ether.h> | 34 | #include <linux/if_ether.h> |
35 | #include <linux/list.h> | 35 | #include <linux/list.h> |
36 | #include <linux/io.h> | 36 | #include <linux/io.h> |
37 | #include <linux/pm_runtime.h> | ||
38 | 37 | ||
39 | #include <linux/can.h> | 38 | #include <linux/can.h> |
40 | #include <linux/can/dev.h> | 39 | #include <linux/can/dev.h> |
@@ -42,13 +41,6 @@ | |||
42 | 41 | ||
43 | #include "c_can.h" | 42 | #include "c_can.h" |
44 | 43 | ||
45 | /* Number of interface registers */ | ||
46 | #define IF_ENUM_REG_LEN 11 | ||
47 | #define C_CAN_IFACE(reg, iface) (C_CAN_IF1_##reg + (iface) * IF_ENUM_REG_LEN) | ||
48 | |||
49 | /* control extension register D_CAN specific */ | ||
50 | #define CONTROL_EX_PDR BIT(8) | ||
51 | |||
52 | /* control register */ | 44 | /* control register */ |
53 | #define CONTROL_TEST BIT(7) | 45 | #define CONTROL_TEST BIT(7) |
54 | #define CONTROL_CCE BIT(6) | 46 | #define CONTROL_CCE BIT(6) |
@@ -68,7 +60,6 @@ | |||
68 | #define TEST_BASIC BIT(2) | 60 | #define TEST_BASIC BIT(2) |
69 | 61 | ||
70 | /* status register */ | 62 | /* status register */ |
71 | #define STATUS_PDA BIT(10) | ||
72 | #define STATUS_BOFF BIT(7) | 63 | #define STATUS_BOFF BIT(7) |
73 | #define STATUS_EWARN BIT(6) | 64 | #define STATUS_EWARN BIT(6) |
74 | #define STATUS_EPASS BIT(5) | 65 | #define STATUS_EPASS BIT(5) |
@@ -168,9 +159,6 @@ | |||
168 | /* minimum timeout for checking BUSY status */ | 159 | /* minimum timeout for checking BUSY status */ |
169 | #define MIN_TIMEOUT_VALUE 6 | 160 | #define MIN_TIMEOUT_VALUE 6 |
170 | 161 | ||
171 | /* Wait for ~1 sec for INIT bit */ | ||
172 | #define INIT_WAIT_MS 1000 | ||
173 | |||
174 | /* napi related */ | 162 | /* napi related */ |
175 | #define C_CAN_NAPI_WEIGHT C_CAN_MSG_OBJ_RX_NUM | 163 | #define C_CAN_NAPI_WEIGHT C_CAN_MSG_OBJ_RX_NUM |
176 | 164 | ||
@@ -197,7 +185,7 @@ enum c_can_bus_error_types { | |||
197 | C_CAN_ERROR_PASSIVE, | 185 | C_CAN_ERROR_PASSIVE, |
198 | }; | 186 | }; |
199 | 187 | ||
200 | static const struct can_bittiming_const c_can_bittiming_const = { | 188 | static struct can_bittiming_const c_can_bittiming_const = { |
201 | .name = KBUILD_MODNAME, | 189 | .name = KBUILD_MODNAME, |
202 | .tseg1_min = 2, /* Time segment 1 = prop_seg + phase_seg1 */ | 190 | .tseg1_min = 2, /* Time segment 1 = prop_seg + phase_seg1 */ |
203 | .tseg1_max = 16, | 191 | .tseg1_max = 16, |
@@ -209,36 +197,6 @@ static const struct can_bittiming_const c_can_bittiming_const = { | |||
209 | .brp_inc = 1, | 197 | .brp_inc = 1, |
210 | }; | 198 | }; |
211 | 199 | ||
212 | static inline void c_can_pm_runtime_enable(const struct c_can_priv *priv) | ||
213 | { | ||
214 | if (priv->device) | ||
215 | pm_runtime_enable(priv->device); | ||
216 | } | ||
217 | |||
218 | static inline void c_can_pm_runtime_disable(const struct c_can_priv *priv) | ||
219 | { | ||
220 | if (priv->device) | ||
221 | pm_runtime_disable(priv->device); | ||
222 | } | ||
223 | |||
224 | static inline void c_can_pm_runtime_get_sync(const struct c_can_priv *priv) | ||
225 | { | ||
226 | if (priv->device) | ||
227 | pm_runtime_get_sync(priv->device); | ||
228 | } | ||
229 | |||
230 | static inline void c_can_pm_runtime_put_sync(const struct c_can_priv *priv) | ||
231 | { | ||
232 | if (priv->device) | ||
233 | pm_runtime_put_sync(priv->device); | ||
234 | } | ||
235 | |||
236 | static inline void c_can_reset_ram(const struct c_can_priv *priv, bool enable) | ||
237 | { | ||
238 | if (priv->raminit) | ||
239 | priv->raminit(priv, enable); | ||
240 | } | ||
241 | |||
242 | static inline int get_tx_next_msg_obj(const struct c_can_priv *priv) | 200 | static inline int get_tx_next_msg_obj(const struct c_can_priv *priv) |
243 | { | 201 | { |
244 | return (priv->tx_next & C_CAN_NEXT_MSG_OBJ_MASK) + | 202 | return (priv->tx_next & C_CAN_NEXT_MSG_OBJ_MASK) + |
@@ -251,10 +209,10 @@ static inline int get_tx_echo_msg_obj(const struct c_can_priv *priv) | |||
251 | C_CAN_MSG_OBJ_TX_FIRST; | 209 | C_CAN_MSG_OBJ_TX_FIRST; |
252 | } | 210 | } |
253 | 211 | ||
254 | static u32 c_can_read_reg32(struct c_can_priv *priv, enum reg index) | 212 | static u32 c_can_read_reg32(struct c_can_priv *priv, void *reg) |
255 | { | 213 | { |
256 | u32 val = priv->read_reg(priv, index); | 214 | u32 val = priv->read_reg(priv, reg); |
257 | val |= ((u32) priv->read_reg(priv, index + 1)) << 16; | 215 | val |= ((u32) priv->read_reg(priv, reg + 2)) << 16; |
258 | return val; | 216 | return val; |
259 | } | 217 | } |
260 | 218 | ||
@@ -262,14 +220,14 @@ static void c_can_enable_all_interrupts(struct c_can_priv *priv, | |||
262 | int enable) | 220 | int enable) |
263 | { | 221 | { |
264 | unsigned int cntrl_save = priv->read_reg(priv, | 222 | unsigned int cntrl_save = priv->read_reg(priv, |
265 | C_CAN_CTRL_REG); | 223 | &priv->regs->control); |
266 | 224 | ||
267 | if (enable) | 225 | if (enable) |
268 | cntrl_save |= (CONTROL_SIE | CONTROL_EIE | CONTROL_IE); | 226 | cntrl_save |= (CONTROL_SIE | CONTROL_EIE | CONTROL_IE); |
269 | else | 227 | else |
270 | cntrl_save &= ~(CONTROL_EIE | CONTROL_IE | CONTROL_SIE); | 228 | cntrl_save &= ~(CONTROL_EIE | CONTROL_IE | CONTROL_SIE); |
271 | 229 | ||
272 | priv->write_reg(priv, C_CAN_CTRL_REG, cntrl_save); | 230 | priv->write_reg(priv, &priv->regs->control, cntrl_save); |
273 | } | 231 | } |
274 | 232 | ||
275 | static inline int c_can_msg_obj_is_busy(struct c_can_priv *priv, int iface) | 233 | static inline int c_can_msg_obj_is_busy(struct c_can_priv *priv, int iface) |
@@ -277,7 +235,7 @@ static inline int c_can_msg_obj_is_busy(struct c_can_priv *priv, int iface) | |||
277 | int count = MIN_TIMEOUT_VALUE; | 235 | int count = MIN_TIMEOUT_VALUE; |
278 | 236 | ||
279 | while (count && priv->read_reg(priv, | 237 | while (count && priv->read_reg(priv, |
280 | C_CAN_IFACE(COMREQ_REG, iface)) & | 238 | &priv->regs->ifregs[iface].com_req) & |
281 | IF_COMR_BUSY) { | 239 | IF_COMR_BUSY) { |
282 | count--; | 240 | count--; |
283 | udelay(1); | 241 | udelay(1); |
@@ -300,9 +258,9 @@ static inline void c_can_object_get(struct net_device *dev, | |||
300 | * register and message RAM must be complete in 6 CAN-CLK | 258 | * register and message RAM must be complete in 6 CAN-CLK |
301 | * period. | 259 | * period. |
302 | */ | 260 | */ |
303 | priv->write_reg(priv, C_CAN_IFACE(COMMSK_REG, iface), | 261 | priv->write_reg(priv, &priv->regs->ifregs[iface].com_mask, |
304 | IFX_WRITE_LOW_16BIT(mask)); | 262 | IFX_WRITE_LOW_16BIT(mask)); |
305 | priv->write_reg(priv, C_CAN_IFACE(COMREQ_REG, iface), | 263 | priv->write_reg(priv, &priv->regs->ifregs[iface].com_req, |
306 | IFX_WRITE_LOW_16BIT(objno)); | 264 | IFX_WRITE_LOW_16BIT(objno)); |
307 | 265 | ||
308 | if (c_can_msg_obj_is_busy(priv, iface)) | 266 | if (c_can_msg_obj_is_busy(priv, iface)) |
@@ -320,9 +278,9 @@ static inline void c_can_object_put(struct net_device *dev, | |||
320 | * register and message RAM must be complete in 6 CAN-CLK | 278 | * register and message RAM must be complete in 6 CAN-CLK |
321 | * period. | 279 | * period. |
322 | */ | 280 | */ |
323 | priv->write_reg(priv, C_CAN_IFACE(COMMSK_REG, iface), | 281 | priv->write_reg(priv, &priv->regs->ifregs[iface].com_mask, |
324 | (IF_COMM_WR | IFX_WRITE_LOW_16BIT(mask))); | 282 | (IF_COMM_WR | IFX_WRITE_LOW_16BIT(mask))); |
325 | priv->write_reg(priv, C_CAN_IFACE(COMREQ_REG, iface), | 283 | priv->write_reg(priv, &priv->regs->ifregs[iface].com_req, |
326 | IFX_WRITE_LOW_16BIT(objno)); | 284 | IFX_WRITE_LOW_16BIT(objno)); |
327 | 285 | ||
328 | if (c_can_msg_obj_is_busy(priv, iface)) | 286 | if (c_can_msg_obj_is_busy(priv, iface)) |
@@ -348,18 +306,18 @@ static void c_can_write_msg_object(struct net_device *dev, | |||
348 | 306 | ||
349 | flags |= IF_ARB_MSGVAL; | 307 | flags |= IF_ARB_MSGVAL; |
350 | 308 | ||
351 | priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface), | 309 | priv->write_reg(priv, &priv->regs->ifregs[iface].arb1, |
352 | IFX_WRITE_LOW_16BIT(id)); | 310 | IFX_WRITE_LOW_16BIT(id)); |
353 | priv->write_reg(priv, C_CAN_IFACE(ARB2_REG, iface), flags | | 311 | priv->write_reg(priv, &priv->regs->ifregs[iface].arb2, flags | |
354 | IFX_WRITE_HIGH_16BIT(id)); | 312 | IFX_WRITE_HIGH_16BIT(id)); |
355 | 313 | ||
356 | for (i = 0; i < frame->can_dlc; i += 2) { | 314 | for (i = 0; i < frame->can_dlc; i += 2) { |
357 | priv->write_reg(priv, C_CAN_IFACE(DATA1_REG, iface) + i / 2, | 315 | priv->write_reg(priv, &priv->regs->ifregs[iface].data[i / 2], |
358 | frame->data[i] | (frame->data[i + 1] << 8)); | 316 | frame->data[i] | (frame->data[i + 1] << 8)); |
359 | } | 317 | } |
360 | 318 | ||
361 | /* enable interrupt for this message object */ | 319 | /* enable interrupt for this message object */ |
362 | priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), | 320 | priv->write_reg(priv, &priv->regs->ifregs[iface].msg_cntrl, |
363 | IF_MCONT_TXIE | IF_MCONT_TXRQST | IF_MCONT_EOB | | 321 | IF_MCONT_TXIE | IF_MCONT_TXRQST | IF_MCONT_EOB | |
364 | frame->can_dlc); | 322 | frame->can_dlc); |
365 | c_can_object_put(dev, iface, objno, IF_COMM_ALL); | 323 | c_can_object_put(dev, iface, objno, IF_COMM_ALL); |
@@ -371,7 +329,7 @@ static inline void c_can_mark_rx_msg_obj(struct net_device *dev, | |||
371 | { | 329 | { |
372 | struct c_can_priv *priv = netdev_priv(dev); | 330 | struct c_can_priv *priv = netdev_priv(dev); |
373 | 331 | ||
374 | priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), | 332 | priv->write_reg(priv, &priv->regs->ifregs[iface].msg_cntrl, |
375 | ctrl_mask & ~(IF_MCONT_MSGLST | IF_MCONT_INTPND)); | 333 | ctrl_mask & ~(IF_MCONT_MSGLST | IF_MCONT_INTPND)); |
376 | c_can_object_put(dev, iface, obj, IF_COMM_CONTROL); | 334 | c_can_object_put(dev, iface, obj, IF_COMM_CONTROL); |
377 | 335 | ||
@@ -385,7 +343,7 @@ static inline void c_can_activate_all_lower_rx_msg_obj(struct net_device *dev, | |||
385 | struct c_can_priv *priv = netdev_priv(dev); | 343 | struct c_can_priv *priv = netdev_priv(dev); |
386 | 344 | ||
387 | for (i = C_CAN_MSG_OBJ_RX_FIRST; i <= C_CAN_MSG_RX_LOW_LAST; i++) { | 345 | for (i = C_CAN_MSG_OBJ_RX_FIRST; i <= C_CAN_MSG_RX_LOW_LAST; i++) { |
388 | priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), | 346 | priv->write_reg(priv, &priv->regs->ifregs[iface].msg_cntrl, |
389 | ctrl_mask & ~(IF_MCONT_MSGLST | | 347 | ctrl_mask & ~(IF_MCONT_MSGLST | |
390 | IF_MCONT_INTPND | IF_MCONT_NEWDAT)); | 348 | IF_MCONT_INTPND | IF_MCONT_NEWDAT)); |
391 | c_can_object_put(dev, iface, i, IF_COMM_CONTROL); | 349 | c_can_object_put(dev, iface, i, IF_COMM_CONTROL); |
@@ -398,7 +356,7 @@ static inline void c_can_activate_rx_msg_obj(struct net_device *dev, | |||
398 | { | 356 | { |
399 | struct c_can_priv *priv = netdev_priv(dev); | 357 | struct c_can_priv *priv = netdev_priv(dev); |
400 | 358 | ||
401 | priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), | 359 | priv->write_reg(priv, &priv->regs->ifregs[iface].msg_cntrl, |
402 | ctrl_mask & ~(IF_MCONT_MSGLST | | 360 | ctrl_mask & ~(IF_MCONT_MSGLST | |
403 | IF_MCONT_INTPND | IF_MCONT_NEWDAT)); | 361 | IF_MCONT_INTPND | IF_MCONT_NEWDAT)); |
404 | c_can_object_put(dev, iface, obj, IF_COMM_CONTROL); | 362 | c_can_object_put(dev, iface, obj, IF_COMM_CONTROL); |
@@ -416,7 +374,7 @@ static void c_can_handle_lost_msg_obj(struct net_device *dev, | |||
416 | 374 | ||
417 | c_can_object_get(dev, iface, objno, IF_COMM_ALL & ~IF_COMM_TXRQST); | 375 | c_can_object_get(dev, iface, objno, IF_COMM_ALL & ~IF_COMM_TXRQST); |
418 | 376 | ||
419 | priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), | 377 | priv->write_reg(priv, &priv->regs->ifregs[iface].msg_cntrl, |
420 | IF_MCONT_CLR_MSGLST); | 378 | IF_MCONT_CLR_MSGLST); |
421 | 379 | ||
422 | c_can_object_put(dev, 0, objno, IF_COMM_CONTROL); | 380 | c_can_object_put(dev, 0, objno, IF_COMM_CONTROL); |
@@ -452,8 +410,8 @@ static int c_can_read_msg_object(struct net_device *dev, int iface, int ctrl) | |||
452 | 410 | ||
453 | frame->can_dlc = get_can_dlc(ctrl & 0x0F); | 411 | frame->can_dlc = get_can_dlc(ctrl & 0x0F); |
454 | 412 | ||
455 | flags = priv->read_reg(priv, C_CAN_IFACE(ARB2_REG, iface)); | 413 | flags = priv->read_reg(priv, &priv->regs->ifregs[iface].arb2); |
456 | val = priv->read_reg(priv, C_CAN_IFACE(ARB1_REG, iface)) | | 414 | val = priv->read_reg(priv, &priv->regs->ifregs[iface].arb1) | |
457 | (flags << 16); | 415 | (flags << 16); |
458 | 416 | ||
459 | if (flags & IF_ARB_MSGXTD) | 417 | if (flags & IF_ARB_MSGXTD) |
@@ -466,7 +424,7 @@ static int c_can_read_msg_object(struct net_device *dev, int iface, int ctrl) | |||
466 | else { | 424 | else { |
467 | for (i = 0; i < frame->can_dlc; i += 2) { | 425 | for (i = 0; i < frame->can_dlc; i += 2) { |
468 | data = priv->read_reg(priv, | 426 | data = priv->read_reg(priv, |
469 | C_CAN_IFACE(DATA1_REG, iface) + i / 2); | 427 | &priv->regs->ifregs[iface].data[i / 2]); |
470 | frame->data[i] = data; | 428 | frame->data[i] = data; |
471 | frame->data[i + 1] = data >> 8; | 429 | frame->data[i + 1] = data >> 8; |
472 | } | 430 | } |
@@ -486,40 +444,40 @@ static void c_can_setup_receive_object(struct net_device *dev, int iface, | |||
486 | { | 444 | { |
487 | struct c_can_priv *priv = netdev_priv(dev); | 445 | struct c_can_priv *priv = netdev_priv(dev); |
488 | 446 | ||
489 | priv->write_reg(priv, C_CAN_IFACE(MASK1_REG, iface), | 447 | priv->write_reg(priv, &priv->regs->ifregs[iface].mask1, |
490 | IFX_WRITE_LOW_16BIT(mask)); | 448 | IFX_WRITE_LOW_16BIT(mask)); |
491 | priv->write_reg(priv, C_CAN_IFACE(MASK2_REG, iface), | 449 | priv->write_reg(priv, &priv->regs->ifregs[iface].mask2, |
492 | IFX_WRITE_HIGH_16BIT(mask)); | 450 | IFX_WRITE_HIGH_16BIT(mask)); |
493 | 451 | ||
494 | priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface), | 452 | priv->write_reg(priv, &priv->regs->ifregs[iface].arb1, |
495 | IFX_WRITE_LOW_16BIT(id)); | 453 | IFX_WRITE_LOW_16BIT(id)); |
496 | priv->write_reg(priv, C_CAN_IFACE(ARB2_REG, iface), | 454 | priv->write_reg(priv, &priv->regs->ifregs[iface].arb2, |
497 | (IF_ARB_MSGVAL | IFX_WRITE_HIGH_16BIT(id))); | 455 | (IF_ARB_MSGVAL | IFX_WRITE_HIGH_16BIT(id))); |
498 | 456 | ||
499 | priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), mcont); | 457 | priv->write_reg(priv, &priv->regs->ifregs[iface].msg_cntrl, mcont); |
500 | c_can_object_put(dev, iface, objno, IF_COMM_ALL & ~IF_COMM_TXRQST); | 458 | c_can_object_put(dev, iface, objno, IF_COMM_ALL & ~IF_COMM_TXRQST); |
501 | 459 | ||
502 | netdev_dbg(dev, "obj no:%d, msgval:0x%08x\n", objno, | 460 | netdev_dbg(dev, "obj no:%d, msgval:0x%08x\n", objno, |
503 | c_can_read_reg32(priv, C_CAN_MSGVAL1_REG)); | 461 | c_can_read_reg32(priv, &priv->regs->msgval1)); |
504 | } | 462 | } |
505 | 463 | ||
506 | static void c_can_inval_msg_object(struct net_device *dev, int iface, int objno) | 464 | static void c_can_inval_msg_object(struct net_device *dev, int iface, int objno) |
507 | { | 465 | { |
508 | struct c_can_priv *priv = netdev_priv(dev); | 466 | struct c_can_priv *priv = netdev_priv(dev); |
509 | 467 | ||
510 | priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface), 0); | 468 | priv->write_reg(priv, &priv->regs->ifregs[iface].arb1, 0); |
511 | priv->write_reg(priv, C_CAN_IFACE(ARB2_REG, iface), 0); | 469 | priv->write_reg(priv, &priv->regs->ifregs[iface].arb2, 0); |
512 | priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), 0); | 470 | priv->write_reg(priv, &priv->regs->ifregs[iface].msg_cntrl, 0); |
513 | 471 | ||
514 | c_can_object_put(dev, iface, objno, IF_COMM_ARB | IF_COMM_CONTROL); | 472 | c_can_object_put(dev, iface, objno, IF_COMM_ARB | IF_COMM_CONTROL); |
515 | 473 | ||
516 | netdev_dbg(dev, "obj no:%d, msgval:0x%08x\n", objno, | 474 | netdev_dbg(dev, "obj no:%d, msgval:0x%08x\n", objno, |
517 | c_can_read_reg32(priv, C_CAN_MSGVAL1_REG)); | 475 | c_can_read_reg32(priv, &priv->regs->msgval1)); |
518 | } | 476 | } |
519 | 477 | ||
520 | static inline int c_can_is_next_tx_obj_busy(struct c_can_priv *priv, int objno) | 478 | static inline int c_can_is_next_tx_obj_busy(struct c_can_priv *priv, int objno) |
521 | { | 479 | { |
522 | int val = c_can_read_reg32(priv, C_CAN_TXRQST1_REG); | 480 | int val = c_can_read_reg32(priv, &priv->regs->txrqst1); |
523 | 481 | ||
524 | /* | 482 | /* |
525 | * as transmission request register's bit n-1 corresponds to | 483 | * as transmission request register's bit n-1 corresponds to |
@@ -582,12 +540,12 @@ static int c_can_set_bittiming(struct net_device *dev) | |||
582 | netdev_info(dev, | 540 | netdev_info(dev, |
583 | "setting BTR=%04x BRPE=%04x\n", reg_btr, reg_brpe); | 541 | "setting BTR=%04x BRPE=%04x\n", reg_btr, reg_brpe); |
584 | 542 | ||
585 | ctrl_save = priv->read_reg(priv, C_CAN_CTRL_REG); | 543 | ctrl_save = priv->read_reg(priv, &priv->regs->control); |
586 | priv->write_reg(priv, C_CAN_CTRL_REG, | 544 | priv->write_reg(priv, &priv->regs->control, |
587 | ctrl_save | CONTROL_CCE | CONTROL_INIT); | 545 | ctrl_save | CONTROL_CCE | CONTROL_INIT); |
588 | priv->write_reg(priv, C_CAN_BTR_REG, reg_btr); | 546 | priv->write_reg(priv, &priv->regs->btr, reg_btr); |
589 | priv->write_reg(priv, C_CAN_BRPEXT_REG, reg_brpe); | 547 | priv->write_reg(priv, &priv->regs->brp_ext, reg_brpe); |
590 | priv->write_reg(priv, C_CAN_CTRL_REG, ctrl_save); | 548 | priv->write_reg(priv, &priv->regs->control, ctrl_save); |
591 | 549 | ||
592 | return 0; | 550 | return 0; |
593 | } | 551 | } |
@@ -629,36 +587,36 @@ static void c_can_chip_config(struct net_device *dev) | |||
629 | struct c_can_priv *priv = netdev_priv(dev); | 587 | struct c_can_priv *priv = netdev_priv(dev); |
630 | 588 | ||
631 | /* enable automatic retransmission */ | 589 | /* enable automatic retransmission */ |
632 | priv->write_reg(priv, C_CAN_CTRL_REG, | 590 | priv->write_reg(priv, &priv->regs->control, |
633 | CONTROL_ENABLE_AR); | 591 | CONTROL_ENABLE_AR); |
634 | 592 | ||
635 | if ((priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) && | 593 | if (priv->can.ctrlmode & (CAN_CTRLMODE_LISTENONLY & |
636 | (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK)) { | 594 | CAN_CTRLMODE_LOOPBACK)) { |
637 | /* loopback + silent mode : useful for hot self-test */ | 595 | /* loopback + silent mode : useful for hot self-test */ |
638 | priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_EIE | | 596 | priv->write_reg(priv, &priv->regs->control, CONTROL_EIE | |
639 | CONTROL_SIE | CONTROL_IE | CONTROL_TEST); | 597 | CONTROL_SIE | CONTROL_IE | CONTROL_TEST); |
640 | priv->write_reg(priv, C_CAN_TEST_REG, | 598 | priv->write_reg(priv, &priv->regs->test, |
641 | TEST_LBACK | TEST_SILENT); | 599 | TEST_LBACK | TEST_SILENT); |
642 | } else if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) { | 600 | } else if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) { |
643 | /* loopback mode : useful for self-test function */ | 601 | /* loopback mode : useful for self-test function */ |
644 | priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_EIE | | 602 | priv->write_reg(priv, &priv->regs->control, CONTROL_EIE | |
645 | CONTROL_SIE | CONTROL_IE | CONTROL_TEST); | 603 | CONTROL_SIE | CONTROL_IE | CONTROL_TEST); |
646 | priv->write_reg(priv, C_CAN_TEST_REG, TEST_LBACK); | 604 | priv->write_reg(priv, &priv->regs->test, TEST_LBACK); |
647 | } else if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) { | 605 | } else if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) { |
648 | /* silent mode : bus-monitoring mode */ | 606 | /* silent mode : bus-monitoring mode */ |
649 | priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_EIE | | 607 | priv->write_reg(priv, &priv->regs->control, CONTROL_EIE | |
650 | CONTROL_SIE | CONTROL_IE | CONTROL_TEST); | 608 | CONTROL_SIE | CONTROL_IE | CONTROL_TEST); |
651 | priv->write_reg(priv, C_CAN_TEST_REG, TEST_SILENT); | 609 | priv->write_reg(priv, &priv->regs->test, TEST_SILENT); |
652 | } else | 610 | } else |
653 | /* normal mode*/ | 611 | /* normal mode*/ |
654 | priv->write_reg(priv, C_CAN_CTRL_REG, | 612 | priv->write_reg(priv, &priv->regs->control, |
655 | CONTROL_EIE | CONTROL_SIE | CONTROL_IE); | 613 | CONTROL_EIE | CONTROL_SIE | CONTROL_IE); |
656 | 614 | ||
657 | /* configure message objects */ | 615 | /* configure message objects */ |
658 | c_can_configure_msg_objects(dev); | 616 | c_can_configure_msg_objects(dev); |
659 | 617 | ||
660 | /* set a `lec` value so that we can check for updates later */ | 618 | /* set a `lec` value so that we can check for updates later */ |
661 | priv->write_reg(priv, C_CAN_STS_REG, LEC_UNUSED); | 619 | priv->write_reg(priv, &priv->regs->status, LEC_UNUSED); |
662 | 620 | ||
663 | /* set bittiming params */ | 621 | /* set bittiming params */ |
664 | c_can_set_bittiming(dev); | 622 | c_can_set_bittiming(dev); |
@@ -711,15 +669,11 @@ static int c_can_get_berr_counter(const struct net_device *dev, | |||
711 | unsigned int reg_err_counter; | 669 | unsigned int reg_err_counter; |
712 | struct c_can_priv *priv = netdev_priv(dev); | 670 | struct c_can_priv *priv = netdev_priv(dev); |
713 | 671 | ||
714 | c_can_pm_runtime_get_sync(priv); | 672 | reg_err_counter = priv->read_reg(priv, &priv->regs->err_cnt); |
715 | |||
716 | reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG); | ||
717 | bec->rxerr = (reg_err_counter & ERR_CNT_REC_MASK) >> | 673 | bec->rxerr = (reg_err_counter & ERR_CNT_REC_MASK) >> |
718 | ERR_CNT_REC_SHIFT; | 674 | ERR_CNT_REC_SHIFT; |
719 | bec->txerr = reg_err_counter & ERR_CNT_TEC_MASK; | 675 | bec->txerr = reg_err_counter & ERR_CNT_TEC_MASK; |
720 | 676 | ||
721 | c_can_pm_runtime_put_sync(priv); | ||
722 | |||
723 | return 0; | 677 | return 0; |
724 | } | 678 | } |
725 | 679 | ||
@@ -732,7 +686,7 @@ static int c_can_get_berr_counter(const struct net_device *dev, | |||
732 | * | 686 | * |
733 | * We iterate from priv->tx_echo to priv->tx_next and check if the | 687 | * We iterate from priv->tx_echo to priv->tx_next and check if the |
734 | * packet has been transmitted, echo it back to the CAN framework. | 688 | * packet has been transmitted, echo it back to the CAN framework. |
735 | * If we discover a not yet transmitted packet, stop looking for more. | 689 | * If we discover a not yet transmitted package, stop looking for more. |
736 | */ | 690 | */ |
737 | static void c_can_do_tx(struct net_device *dev) | 691 | static void c_can_do_tx(struct net_device *dev) |
738 | { | 692 | { |
@@ -743,17 +697,15 @@ static void c_can_do_tx(struct net_device *dev) | |||
743 | 697 | ||
744 | for (/* nix */; (priv->tx_next - priv->tx_echo) > 0; priv->tx_echo++) { | 698 | for (/* nix */; (priv->tx_next - priv->tx_echo) > 0; priv->tx_echo++) { |
745 | msg_obj_no = get_tx_echo_msg_obj(priv); | 699 | msg_obj_no = get_tx_echo_msg_obj(priv); |
746 | val = c_can_read_reg32(priv, C_CAN_TXRQST1_REG); | 700 | val = c_can_read_reg32(priv, &priv->regs->txrqst1); |
747 | if (!(val & (1 << (msg_obj_no - 1)))) { | 701 | if (!(val & (1 << msg_obj_no))) { |
748 | can_get_echo_skb(dev, | 702 | can_get_echo_skb(dev, |
749 | msg_obj_no - C_CAN_MSG_OBJ_TX_FIRST); | 703 | msg_obj_no - C_CAN_MSG_OBJ_TX_FIRST); |
750 | stats->tx_bytes += priv->read_reg(priv, | 704 | stats->tx_bytes += priv->read_reg(priv, |
751 | C_CAN_IFACE(MSGCTRL_REG, 0)) | 705 | &priv->regs->ifregs[0].msg_cntrl) |
752 | & IF_MCONT_DLC_MASK; | 706 | & IF_MCONT_DLC_MASK; |
753 | stats->tx_packets++; | 707 | stats->tx_packets++; |
754 | c_can_inval_msg_object(dev, 0, msg_obj_no); | 708 | c_can_inval_msg_object(dev, 0, msg_obj_no); |
755 | } else { | ||
756 | break; | ||
757 | } | 709 | } |
758 | } | 710 | } |
759 | 711 | ||
@@ -790,11 +742,11 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota) | |||
790 | u32 num_rx_pkts = 0; | 742 | u32 num_rx_pkts = 0; |
791 | unsigned int msg_obj, msg_ctrl_save; | 743 | unsigned int msg_obj, msg_ctrl_save; |
792 | struct c_can_priv *priv = netdev_priv(dev); | 744 | struct c_can_priv *priv = netdev_priv(dev); |
793 | u32 val = c_can_read_reg32(priv, C_CAN_INTPND1_REG); | 745 | u32 val = c_can_read_reg32(priv, &priv->regs->intpnd1); |
794 | 746 | ||
795 | for (msg_obj = C_CAN_MSG_OBJ_RX_FIRST; | 747 | for (msg_obj = C_CAN_MSG_OBJ_RX_FIRST; |
796 | msg_obj <= C_CAN_MSG_OBJ_RX_LAST && quota > 0; | 748 | msg_obj <= C_CAN_MSG_OBJ_RX_LAST && quota > 0; |
797 | val = c_can_read_reg32(priv, C_CAN_INTPND1_REG), | 749 | val = c_can_read_reg32(priv, &priv->regs->intpnd1), |
798 | msg_obj++) { | 750 | msg_obj++) { |
799 | /* | 751 | /* |
800 | * as interrupt pending register's bit n-1 corresponds to | 752 | * as interrupt pending register's bit n-1 corresponds to |
@@ -804,7 +756,7 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota) | |||
804 | c_can_object_get(dev, 0, msg_obj, IF_COMM_ALL & | 756 | c_can_object_get(dev, 0, msg_obj, IF_COMM_ALL & |
805 | ~IF_COMM_TXRQST); | 757 | ~IF_COMM_TXRQST); |
806 | msg_ctrl_save = priv->read_reg(priv, | 758 | msg_ctrl_save = priv->read_reg(priv, |
807 | C_CAN_IFACE(MSGCTRL_REG, 0)); | 759 | &priv->regs->ifregs[0].msg_cntrl); |
808 | 760 | ||
809 | if (msg_ctrl_save & IF_MCONT_EOB) | 761 | if (msg_ctrl_save & IF_MCONT_EOB) |
810 | return num_rx_pkts; | 762 | return num_rx_pkts; |
@@ -865,7 +817,7 @@ static int c_can_handle_state_change(struct net_device *dev, | |||
865 | return 0; | 817 | return 0; |
866 | 818 | ||
867 | c_can_get_berr_counter(dev, &bec); | 819 | c_can_get_berr_counter(dev, &bec); |
868 | reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG); | 820 | reg_err_counter = priv->read_reg(priv, &priv->regs->err_cnt); |
869 | rx_err_passive = (reg_err_counter & ERR_CNT_RP_MASK) >> | 821 | rx_err_passive = (reg_err_counter & ERR_CNT_RP_MASK) >> |
870 | ERR_CNT_RP_SHIFT; | 822 | ERR_CNT_RP_SHIFT; |
871 | 823 | ||
@@ -981,7 +933,7 @@ static int c_can_handle_bus_err(struct net_device *dev, | |||
981 | } | 933 | } |
982 | 934 | ||
983 | /* set a `lec` value so that we can check for updates later */ | 935 | /* set a `lec` value so that we can check for updates later */ |
984 | priv->write_reg(priv, C_CAN_STS_REG, LEC_UNUSED); | 936 | priv->write_reg(priv, &priv->regs->status, LEC_UNUSED); |
985 | 937 | ||
986 | netif_receive_skb(skb); | 938 | netif_receive_skb(skb); |
987 | stats->rx_packets++; | 939 | stats->rx_packets++; |
@@ -998,22 +950,22 @@ static int c_can_poll(struct napi_struct *napi, int quota) | |||
998 | struct net_device *dev = napi->dev; | 950 | struct net_device *dev = napi->dev; |
999 | struct c_can_priv *priv = netdev_priv(dev); | 951 | struct c_can_priv *priv = netdev_priv(dev); |
1000 | 952 | ||
1001 | irqstatus = priv->irqstatus; | 953 | irqstatus = priv->read_reg(priv, &priv->regs->interrupt); |
1002 | if (!irqstatus) | 954 | if (!irqstatus) |
1003 | goto end; | 955 | goto end; |
1004 | 956 | ||
1005 | /* status events have the highest priority */ | 957 | /* status events have the highest priority */ |
1006 | if (irqstatus == STATUS_INTERRUPT) { | 958 | if (irqstatus == STATUS_INTERRUPT) { |
1007 | priv->current_status = priv->read_reg(priv, | 959 | priv->current_status = priv->read_reg(priv, |
1008 | C_CAN_STS_REG); | 960 | &priv->regs->status); |
1009 | 961 | ||
1010 | /* handle Tx/Rx events */ | 962 | /* handle Tx/Rx events */ |
1011 | if (priv->current_status & STATUS_TXOK) | 963 | if (priv->current_status & STATUS_TXOK) |
1012 | priv->write_reg(priv, C_CAN_STS_REG, | 964 | priv->write_reg(priv, &priv->regs->status, |
1013 | priv->current_status & ~STATUS_TXOK); | 965 | priv->current_status & ~STATUS_TXOK); |
1014 | 966 | ||
1015 | if (priv->current_status & STATUS_RXOK) | 967 | if (priv->current_status & STATUS_RXOK) |
1016 | priv->write_reg(priv, C_CAN_STS_REG, | 968 | priv->write_reg(priv, &priv->regs->status, |
1017 | priv->current_status & ~STATUS_RXOK); | 969 | priv->current_status & ~STATUS_RXOK); |
1018 | 970 | ||
1019 | /* handle state changes */ | 971 | /* handle state changes */ |
@@ -1076,11 +1028,12 @@ end: | |||
1076 | 1028 | ||
1077 | static irqreturn_t c_can_isr(int irq, void *dev_id) | 1029 | static irqreturn_t c_can_isr(int irq, void *dev_id) |
1078 | { | 1030 | { |
1031 | u16 irqstatus; | ||
1079 | struct net_device *dev = (struct net_device *)dev_id; | 1032 | struct net_device *dev = (struct net_device *)dev_id; |
1080 | struct c_can_priv *priv = netdev_priv(dev); | 1033 | struct c_can_priv *priv = netdev_priv(dev); |
1081 | 1034 | ||
1082 | priv->irqstatus = priv->read_reg(priv, C_CAN_INT_REG); | 1035 | irqstatus = priv->read_reg(priv, &priv->regs->interrupt); |
1083 | if (!priv->irqstatus) | 1036 | if (!irqstatus) |
1084 | return IRQ_NONE; | 1037 | return IRQ_NONE; |
1085 | 1038 | ||
1086 | /* disable all interrupts and schedule the NAPI */ | 1039 | /* disable all interrupts and schedule the NAPI */ |
@@ -1095,14 +1048,11 @@ static int c_can_open(struct net_device *dev) | |||
1095 | int err; | 1048 | int err; |
1096 | struct c_can_priv *priv = netdev_priv(dev); | 1049 | struct c_can_priv *priv = netdev_priv(dev); |
1097 | 1050 | ||
1098 | c_can_pm_runtime_get_sync(priv); | ||
1099 | c_can_reset_ram(priv, true); | ||
1100 | |||
1101 | /* open the can device */ | 1051 | /* open the can device */ |
1102 | err = open_candev(dev); | 1052 | err = open_candev(dev); |
1103 | if (err) { | 1053 | if (err) { |
1104 | netdev_err(dev, "failed to open can device\n"); | 1054 | netdev_err(dev, "failed to open can device\n"); |
1105 | goto exit_open_fail; | 1055 | return err; |
1106 | } | 1056 | } |
1107 | 1057 | ||
1108 | /* register interrupt handler */ | 1058 | /* register interrupt handler */ |
@@ -1113,20 +1063,16 @@ static int c_can_open(struct net_device *dev) | |||
1113 | goto exit_irq_fail; | 1063 | goto exit_irq_fail; |
1114 | } | 1064 | } |
1115 | 1065 | ||
1116 | napi_enable(&priv->napi); | ||
1117 | |||
1118 | /* start the c_can controller */ | 1066 | /* start the c_can controller */ |
1119 | c_can_start(dev); | 1067 | c_can_start(dev); |
1120 | 1068 | ||
1069 | napi_enable(&priv->napi); | ||
1121 | netif_start_queue(dev); | 1070 | netif_start_queue(dev); |
1122 | 1071 | ||
1123 | return 0; | 1072 | return 0; |
1124 | 1073 | ||
1125 | exit_irq_fail: | 1074 | exit_irq_fail: |
1126 | close_candev(dev); | 1075 | close_candev(dev); |
1127 | exit_open_fail: | ||
1128 | c_can_reset_ram(priv, false); | ||
1129 | c_can_pm_runtime_put_sync(priv); | ||
1130 | return err; | 1076 | return err; |
1131 | } | 1077 | } |
1132 | 1078 | ||
@@ -1140,9 +1086,6 @@ static int c_can_close(struct net_device *dev) | |||
1140 | free_irq(dev->irq, dev); | 1086 | free_irq(dev->irq, dev); |
1141 | close_candev(dev); | 1087 | close_candev(dev); |
1142 | 1088 | ||
1143 | c_can_reset_ram(priv, false); | ||
1144 | c_can_pm_runtime_put_sync(priv); | ||
1145 | |||
1146 | return 0; | 1089 | return 0; |
1147 | } | 1090 | } |
1148 | 1091 | ||
@@ -1170,79 +1113,6 @@ struct net_device *alloc_c_can_dev(void) | |||
1170 | } | 1113 | } |
1171 | EXPORT_SYMBOL_GPL(alloc_c_can_dev); | 1114 | EXPORT_SYMBOL_GPL(alloc_c_can_dev); |
1172 | 1115 | ||
1173 | #ifdef CONFIG_PM | ||
1174 | int c_can_power_down(struct net_device *dev) | ||
1175 | { | ||
1176 | u32 val; | ||
1177 | unsigned long time_out; | ||
1178 | struct c_can_priv *priv = netdev_priv(dev); | ||
1179 | |||
1180 | if (!(dev->flags & IFF_UP)) | ||
1181 | return 0; | ||
1182 | |||
1183 | WARN_ON(priv->type != BOSCH_D_CAN); | ||
1184 | |||
1185 | /* set PDR value so the device goes to power down mode */ | ||
1186 | val = priv->read_reg(priv, C_CAN_CTRL_EX_REG); | ||
1187 | val |= CONTROL_EX_PDR; | ||
1188 | priv->write_reg(priv, C_CAN_CTRL_EX_REG, val); | ||
1189 | |||
1190 | /* Wait for the PDA bit to get set */ | ||
1191 | time_out = jiffies + msecs_to_jiffies(INIT_WAIT_MS); | ||
1192 | while (!(priv->read_reg(priv, C_CAN_STS_REG) & STATUS_PDA) && | ||
1193 | time_after(time_out, jiffies)) | ||
1194 | cpu_relax(); | ||
1195 | |||
1196 | if (time_after(jiffies, time_out)) | ||
1197 | return -ETIMEDOUT; | ||
1198 | |||
1199 | c_can_stop(dev); | ||
1200 | |||
1201 | c_can_reset_ram(priv, false); | ||
1202 | c_can_pm_runtime_put_sync(priv); | ||
1203 | |||
1204 | return 0; | ||
1205 | } | ||
1206 | EXPORT_SYMBOL_GPL(c_can_power_down); | ||
1207 | |||
1208 | int c_can_power_up(struct net_device *dev) | ||
1209 | { | ||
1210 | u32 val; | ||
1211 | unsigned long time_out; | ||
1212 | struct c_can_priv *priv = netdev_priv(dev); | ||
1213 | |||
1214 | if (!(dev->flags & IFF_UP)) | ||
1215 | return 0; | ||
1216 | |||
1217 | WARN_ON(priv->type != BOSCH_D_CAN); | ||
1218 | |||
1219 | c_can_pm_runtime_get_sync(priv); | ||
1220 | c_can_reset_ram(priv, true); | ||
1221 | |||
1222 | /* Clear PDR and INIT bits */ | ||
1223 | val = priv->read_reg(priv, C_CAN_CTRL_EX_REG); | ||
1224 | val &= ~CONTROL_EX_PDR; | ||
1225 | priv->write_reg(priv, C_CAN_CTRL_EX_REG, val); | ||
1226 | val = priv->read_reg(priv, C_CAN_CTRL_REG); | ||
1227 | val &= ~CONTROL_INIT; | ||
1228 | priv->write_reg(priv, C_CAN_CTRL_REG, val); | ||
1229 | |||
1230 | /* Wait for the PDA bit to get clear */ | ||
1231 | time_out = jiffies + msecs_to_jiffies(INIT_WAIT_MS); | ||
1232 | while ((priv->read_reg(priv, C_CAN_STS_REG) & STATUS_PDA) && | ||
1233 | time_after(time_out, jiffies)) | ||
1234 | cpu_relax(); | ||
1235 | |||
1236 | if (time_after(jiffies, time_out)) | ||
1237 | return -ETIMEDOUT; | ||
1238 | |||
1239 | c_can_start(dev); | ||
1240 | |||
1241 | return 0; | ||
1242 | } | ||
1243 | EXPORT_SYMBOL_GPL(c_can_power_up); | ||
1244 | #endif | ||
1245 | |||
1246 | void free_c_can_dev(struct net_device *dev) | 1116 | void free_c_can_dev(struct net_device *dev) |
1247 | { | 1117 | { |
1248 | free_candev(dev); | 1118 | free_candev(dev); |
@@ -1257,19 +1127,10 @@ static const struct net_device_ops c_can_netdev_ops = { | |||
1257 | 1127 | ||
1258 | int register_c_can_dev(struct net_device *dev) | 1128 | int register_c_can_dev(struct net_device *dev) |
1259 | { | 1129 | { |
1260 | struct c_can_priv *priv = netdev_priv(dev); | ||
1261 | int err; | ||
1262 | |||
1263 | c_can_pm_runtime_enable(priv); | ||
1264 | |||
1265 | dev->flags |= IFF_ECHO; /* we support local echo */ | 1130 | dev->flags |= IFF_ECHO; /* we support local echo */ |
1266 | dev->netdev_ops = &c_can_netdev_ops; | 1131 | dev->netdev_ops = &c_can_netdev_ops; |
1267 | 1132 | ||
1268 | err = register_candev(dev); | 1133 | return register_candev(dev); |
1269 | if (err) | ||
1270 | c_can_pm_runtime_disable(priv); | ||
1271 | |||
1272 | return err; | ||
1273 | } | 1134 | } |
1274 | EXPORT_SYMBOL_GPL(register_c_can_dev); | 1135 | EXPORT_SYMBOL_GPL(register_c_can_dev); |
1275 | 1136 | ||
@@ -1277,9 +1138,10 @@ void unregister_c_can_dev(struct net_device *dev) | |||
1277 | { | 1138 | { |
1278 | struct c_can_priv *priv = netdev_priv(dev); | 1139 | struct c_can_priv *priv = netdev_priv(dev); |
1279 | 1140 | ||
1280 | unregister_candev(dev); | 1141 | /* disable all interrupts */ |
1142 | c_can_enable_all_interrupts(priv, DISABLE_ALL_INTERRUPTS); | ||
1281 | 1143 | ||
1282 | c_can_pm_runtime_disable(priv); | 1144 | unregister_candev(dev); |
1283 | } | 1145 | } |
1284 | EXPORT_SYMBOL_GPL(unregister_c_can_dev); | 1146 | EXPORT_SYMBOL_GPL(unregister_c_can_dev); |
1285 | 1147 | ||
diff --git a/drivers/net/can/c_can/c_can.h b/drivers/net/can/c_can/c_can.h index d2e1c21b143..9b7fbef3d09 100644 --- a/drivers/net/can/c_can/c_can.h +++ b/drivers/net/can/c_can/c_can.h | |||
@@ -22,132 +22,43 @@ | |||
22 | #ifndef C_CAN_H | 22 | #ifndef C_CAN_H |
23 | #define C_CAN_H | 23 | #define C_CAN_H |
24 | 24 | ||
25 | enum reg { | 25 | /* c_can IF registers */ |
26 | C_CAN_CTRL_REG = 0, | 26 | struct c_can_if_regs { |
27 | C_CAN_CTRL_EX_REG, | 27 | u16 com_req; |
28 | C_CAN_STS_REG, | 28 | u16 com_mask; |
29 | C_CAN_ERR_CNT_REG, | 29 | u16 mask1; |
30 | C_CAN_BTR_REG, | 30 | u16 mask2; |
31 | C_CAN_INT_REG, | 31 | u16 arb1; |
32 | C_CAN_TEST_REG, | 32 | u16 arb2; |
33 | C_CAN_BRPEXT_REG, | 33 | u16 msg_cntrl; |
34 | C_CAN_IF1_COMREQ_REG, | 34 | u16 data[4]; |
35 | C_CAN_IF1_COMMSK_REG, | 35 | u16 _reserved[13]; |
36 | C_CAN_IF1_MASK1_REG, | ||
37 | C_CAN_IF1_MASK2_REG, | ||
38 | C_CAN_IF1_ARB1_REG, | ||
39 | C_CAN_IF1_ARB2_REG, | ||
40 | C_CAN_IF1_MSGCTRL_REG, | ||
41 | C_CAN_IF1_DATA1_REG, | ||
42 | C_CAN_IF1_DATA2_REG, | ||
43 | C_CAN_IF1_DATA3_REG, | ||
44 | C_CAN_IF1_DATA4_REG, | ||
45 | C_CAN_IF2_COMREQ_REG, | ||
46 | C_CAN_IF2_COMMSK_REG, | ||
47 | C_CAN_IF2_MASK1_REG, | ||
48 | C_CAN_IF2_MASK2_REG, | ||
49 | C_CAN_IF2_ARB1_REG, | ||
50 | C_CAN_IF2_ARB2_REG, | ||
51 | C_CAN_IF2_MSGCTRL_REG, | ||
52 | C_CAN_IF2_DATA1_REG, | ||
53 | C_CAN_IF2_DATA2_REG, | ||
54 | C_CAN_IF2_DATA3_REG, | ||
55 | C_CAN_IF2_DATA4_REG, | ||
56 | C_CAN_TXRQST1_REG, | ||
57 | C_CAN_TXRQST2_REG, | ||
58 | C_CAN_NEWDAT1_REG, | ||
59 | C_CAN_NEWDAT2_REG, | ||
60 | C_CAN_INTPND1_REG, | ||
61 | C_CAN_INTPND2_REG, | ||
62 | C_CAN_MSGVAL1_REG, | ||
63 | C_CAN_MSGVAL2_REG, | ||
64 | }; | 36 | }; |
65 | 37 | ||
66 | static const u16 reg_map_c_can[] = { | 38 | /* c_can hardware registers */ |
67 | [C_CAN_CTRL_REG] = 0x00, | 39 | struct c_can_regs { |
68 | [C_CAN_STS_REG] = 0x02, | 40 | u16 control; |
69 | [C_CAN_ERR_CNT_REG] = 0x04, | 41 | u16 status; |
70 | [C_CAN_BTR_REG] = 0x06, | 42 | u16 err_cnt; |
71 | [C_CAN_INT_REG] = 0x08, | 43 | u16 btr; |
72 | [C_CAN_TEST_REG] = 0x0A, | 44 | u16 interrupt; |
73 | [C_CAN_BRPEXT_REG] = 0x0C, | 45 | u16 test; |
74 | [C_CAN_IF1_COMREQ_REG] = 0x10, | 46 | u16 brp_ext; |
75 | [C_CAN_IF1_COMMSK_REG] = 0x12, | 47 | u16 _reserved1; |
76 | [C_CAN_IF1_MASK1_REG] = 0x14, | 48 | struct c_can_if_regs ifregs[2]; /* [0] = IF1 and [1] = IF2 */ |
77 | [C_CAN_IF1_MASK2_REG] = 0x16, | 49 | u16 _reserved2[8]; |
78 | [C_CAN_IF1_ARB1_REG] = 0x18, | 50 | u16 txrqst1; |
79 | [C_CAN_IF1_ARB2_REG] = 0x1A, | 51 | u16 txrqst2; |
80 | [C_CAN_IF1_MSGCTRL_REG] = 0x1C, | 52 | u16 _reserved3[6]; |
81 | [C_CAN_IF1_DATA1_REG] = 0x1E, | 53 | u16 newdat1; |
82 | [C_CAN_IF1_DATA2_REG] = 0x20, | 54 | u16 newdat2; |
83 | [C_CAN_IF1_DATA3_REG] = 0x22, | 55 | u16 _reserved4[6]; |
84 | [C_CAN_IF1_DATA4_REG] = 0x24, | 56 | u16 intpnd1; |
85 | [C_CAN_IF2_COMREQ_REG] = 0x40, | 57 | u16 intpnd2; |
86 | [C_CAN_IF2_COMMSK_REG] = 0x42, | 58 | u16 _reserved5[6]; |
87 | [C_CAN_IF2_MASK1_REG] = 0x44, | 59 | u16 msgval1; |
88 | [C_CAN_IF2_MASK2_REG] = 0x46, | 60 | u16 msgval2; |
89 | [C_CAN_IF2_ARB1_REG] = 0x48, | 61 | u16 _reserved6[6]; |
90 | [C_CAN_IF2_ARB2_REG] = 0x4A, | ||
91 | [C_CAN_IF2_MSGCTRL_REG] = 0x4C, | ||
92 | [C_CAN_IF2_DATA1_REG] = 0x4E, | ||
93 | [C_CAN_IF2_DATA2_REG] = 0x50, | ||
94 | [C_CAN_IF2_DATA3_REG] = 0x52, | ||
95 | [C_CAN_IF2_DATA4_REG] = 0x54, | ||
96 | [C_CAN_TXRQST1_REG] = 0x80, | ||
97 | [C_CAN_TXRQST2_REG] = 0x82, | ||
98 | [C_CAN_NEWDAT1_REG] = 0x90, | ||
99 | [C_CAN_NEWDAT2_REG] = 0x92, | ||
100 | [C_CAN_INTPND1_REG] = 0xA0, | ||
101 | [C_CAN_INTPND2_REG] = 0xA2, | ||
102 | [C_CAN_MSGVAL1_REG] = 0xB0, | ||
103 | [C_CAN_MSGVAL2_REG] = 0xB2, | ||
104 | }; | ||
105 | |||
106 | static const u16 reg_map_d_can[] = { | ||
107 | [C_CAN_CTRL_REG] = 0x00, | ||
108 | [C_CAN_CTRL_EX_REG] = 0x02, | ||
109 | [C_CAN_STS_REG] = 0x04, | ||
110 | [C_CAN_ERR_CNT_REG] = 0x08, | ||
111 | [C_CAN_BTR_REG] = 0x0C, | ||
112 | [C_CAN_BRPEXT_REG] = 0x0E, | ||
113 | [C_CAN_INT_REG] = 0x10, | ||
114 | [C_CAN_TEST_REG] = 0x14, | ||
115 | [C_CAN_TXRQST1_REG] = 0x88, | ||
116 | [C_CAN_TXRQST2_REG] = 0x8A, | ||
117 | [C_CAN_NEWDAT1_REG] = 0x9C, | ||
118 | [C_CAN_NEWDAT2_REG] = 0x9E, | ||
119 | [C_CAN_INTPND1_REG] = 0xB0, | ||
120 | [C_CAN_INTPND2_REG] = 0xB2, | ||
121 | [C_CAN_MSGVAL1_REG] = 0xC4, | ||
122 | [C_CAN_MSGVAL2_REG] = 0xC6, | ||
123 | [C_CAN_IF1_COMREQ_REG] = 0x100, | ||
124 | [C_CAN_IF1_COMMSK_REG] = 0x102, | ||
125 | [C_CAN_IF1_MASK1_REG] = 0x104, | ||
126 | [C_CAN_IF1_MASK2_REG] = 0x106, | ||
127 | [C_CAN_IF1_ARB1_REG] = 0x108, | ||
128 | [C_CAN_IF1_ARB2_REG] = 0x10A, | ||
129 | [C_CAN_IF1_MSGCTRL_REG] = 0x10C, | ||
130 | [C_CAN_IF1_DATA1_REG] = 0x110, | ||
131 | [C_CAN_IF1_DATA2_REG] = 0x112, | ||
132 | [C_CAN_IF1_DATA3_REG] = 0x114, | ||
133 | [C_CAN_IF1_DATA4_REG] = 0x116, | ||
134 | [C_CAN_IF2_COMREQ_REG] = 0x120, | ||
135 | [C_CAN_IF2_COMMSK_REG] = 0x122, | ||
136 | [C_CAN_IF2_MASK1_REG] = 0x124, | ||
137 | [C_CAN_IF2_MASK2_REG] = 0x126, | ||
138 | [C_CAN_IF2_ARB1_REG] = 0x128, | ||
139 | [C_CAN_IF2_ARB2_REG] = 0x12A, | ||
140 | [C_CAN_IF2_MSGCTRL_REG] = 0x12C, | ||
141 | [C_CAN_IF2_DATA1_REG] = 0x130, | ||
142 | [C_CAN_IF2_DATA2_REG] = 0x132, | ||
143 | [C_CAN_IF2_DATA3_REG] = 0x134, | ||
144 | [C_CAN_IF2_DATA4_REG] = 0x136, | ||
145 | }; | ||
146 | |||
147 | enum c_can_dev_id { | ||
148 | BOSCH_C_CAN_PLATFORM, | ||
149 | BOSCH_C_CAN, | ||
150 | BOSCH_D_CAN, | ||
151 | }; | 62 | }; |
152 | 63 | ||
153 | /* c_can private data structure */ | 64 | /* c_can private data structure */ |
@@ -155,23 +66,16 @@ struct c_can_priv { | |||
155 | struct can_priv can; /* must be the first member */ | 66 | struct can_priv can; /* must be the first member */ |
156 | struct napi_struct napi; | 67 | struct napi_struct napi; |
157 | struct net_device *dev; | 68 | struct net_device *dev; |
158 | struct device *device; | ||
159 | int tx_object; | 69 | int tx_object; |
160 | int current_status; | 70 | int current_status; |
161 | int last_status; | 71 | int last_status; |
162 | u16 (*read_reg) (struct c_can_priv *priv, enum reg index); | 72 | u16 (*read_reg) (struct c_can_priv *priv, void *reg); |
163 | void (*write_reg) (struct c_can_priv *priv, enum reg index, u16 val); | 73 | void (*write_reg) (struct c_can_priv *priv, void *reg, u16 val); |
164 | void __iomem *base; | 74 | struct c_can_regs __iomem *regs; |
165 | const u16 *regs; | ||
166 | unsigned long irq_flags; /* for request_irq() */ | 75 | unsigned long irq_flags; /* for request_irq() */ |
167 | unsigned int tx_next; | 76 | unsigned int tx_next; |
168 | unsigned int tx_echo; | 77 | unsigned int tx_echo; |
169 | void *priv; /* for board-specific data */ | 78 | void *priv; /* for board-specific data */ |
170 | u16 irqstatus; | ||
171 | enum c_can_dev_id type; | ||
172 | u32 __iomem *raminit_ctrlreg; | ||
173 | unsigned int instance; | ||
174 | void (*raminit) (const struct c_can_priv *priv, bool enable); | ||
175 | }; | 79 | }; |
176 | 80 | ||
177 | struct net_device *alloc_c_can_dev(void); | 81 | struct net_device *alloc_c_can_dev(void); |
@@ -179,9 +83,4 @@ void free_c_can_dev(struct net_device *dev); | |||
179 | int register_c_can_dev(struct net_device *dev); | 83 | int register_c_can_dev(struct net_device *dev); |
180 | void unregister_c_can_dev(struct net_device *dev); | 84 | void unregister_c_can_dev(struct net_device *dev); |
181 | 85 | ||
182 | #ifdef CONFIG_PM | ||
183 | int c_can_power_up(struct net_device *dev); | ||
184 | int c_can_power_down(struct net_device *dev); | ||
185 | #endif | ||
186 | |||
187 | #endif /* C_CAN_H */ | 86 | #endif /* C_CAN_H */ |
diff --git a/drivers/net/can/c_can/c_can_pci.c b/drivers/net/can/c_can/c_can_pci.c deleted file mode 100644 index b374be7891a..00000000000 --- a/drivers/net/can/c_can/c_can_pci.c +++ /dev/null | |||
@@ -1,221 +0,0 @@ | |||
1 | /* | ||
2 | * PCI bus driver for Bosch C_CAN/D_CAN controller | ||
3 | * | ||
4 | * Copyright (C) 2012 Federico Vaga <federico.vaga@gmail.com> | ||
5 | * | ||
6 | * Borrowed from c_can_platform.c | ||
7 | * | ||
8 | * This file is licensed under the terms of the GNU General Public | ||
9 | * License version 2. This program is licensed "as is" without any | ||
10 | * warranty of any kind, whether express or implied. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/module.h> | ||
15 | #include <linux/netdevice.h> | ||
16 | #include <linux/pci.h> | ||
17 | |||
18 | #include <linux/can/dev.h> | ||
19 | |||
20 | #include "c_can.h" | ||
21 | |||
22 | enum c_can_pci_reg_align { | ||
23 | C_CAN_REG_ALIGN_16, | ||
24 | C_CAN_REG_ALIGN_32, | ||
25 | }; | ||
26 | |||
27 | struct c_can_pci_data { | ||
28 | /* Specify if is C_CAN or D_CAN */ | ||
29 | enum c_can_dev_id type; | ||
30 | /* Set the register alignment in the memory */ | ||
31 | enum c_can_pci_reg_align reg_align; | ||
32 | /* Set the frequency */ | ||
33 | unsigned int freq; | ||
34 | }; | ||
35 | |||
36 | /* | ||
37 | * 16-bit c_can registers can be arranged differently in the memory | ||
38 | * architecture of different implementations. For example: 16-bit | ||
39 | * registers can be aligned to a 16-bit boundary or 32-bit boundary etc. | ||
40 | * Handle the same by providing a common read/write interface. | ||
41 | */ | ||
42 | static u16 c_can_pci_read_reg_aligned_to_16bit(struct c_can_priv *priv, | ||
43 | enum reg index) | ||
44 | { | ||
45 | return readw(priv->base + priv->regs[index]); | ||
46 | } | ||
47 | |||
48 | static void c_can_pci_write_reg_aligned_to_16bit(struct c_can_priv *priv, | ||
49 | enum reg index, u16 val) | ||
50 | { | ||
51 | writew(val, priv->base + priv->regs[index]); | ||
52 | } | ||
53 | |||
54 | static u16 c_can_pci_read_reg_aligned_to_32bit(struct c_can_priv *priv, | ||
55 | enum reg index) | ||
56 | { | ||
57 | return readw(priv->base + 2 * priv->regs[index]); | ||
58 | } | ||
59 | |||
60 | static void c_can_pci_write_reg_aligned_to_32bit(struct c_can_priv *priv, | ||
61 | enum reg index, u16 val) | ||
62 | { | ||
63 | writew(val, priv->base + 2 * priv->regs[index]); | ||
64 | } | ||
65 | |||
66 | static int c_can_pci_probe(struct pci_dev *pdev, | ||
67 | const struct pci_device_id *ent) | ||
68 | { | ||
69 | struct c_can_pci_data *c_can_pci_data = (void *)ent->driver_data; | ||
70 | struct c_can_priv *priv; | ||
71 | struct net_device *dev; | ||
72 | void __iomem *addr; | ||
73 | int ret; | ||
74 | |||
75 | ret = pci_enable_device(pdev); | ||
76 | if (ret) { | ||
77 | dev_err(&pdev->dev, "pci_enable_device FAILED\n"); | ||
78 | goto out; | ||
79 | } | ||
80 | |||
81 | ret = pci_request_regions(pdev, KBUILD_MODNAME); | ||
82 | if (ret) { | ||
83 | dev_err(&pdev->dev, "pci_request_regions FAILED\n"); | ||
84 | goto out_disable_device; | ||
85 | } | ||
86 | |||
87 | pci_set_master(pdev); | ||
88 | pci_enable_msi(pdev); | ||
89 | |||
90 | addr = pci_iomap(pdev, 0, pci_resource_len(pdev, 0)); | ||
91 | if (!addr) { | ||
92 | dev_err(&pdev->dev, | ||
93 | "device has no PCI memory resources, " | ||
94 | "failing adapter\n"); | ||
95 | ret = -ENOMEM; | ||
96 | goto out_release_regions; | ||
97 | } | ||
98 | |||
99 | /* allocate the c_can device */ | ||
100 | dev = alloc_c_can_dev(); | ||
101 | if (!dev) { | ||
102 | ret = -ENOMEM; | ||
103 | goto out_iounmap; | ||
104 | } | ||
105 | |||
106 | priv = netdev_priv(dev); | ||
107 | pci_set_drvdata(pdev, dev); | ||
108 | SET_NETDEV_DEV(dev, &pdev->dev); | ||
109 | |||
110 | dev->irq = pdev->irq; | ||
111 | priv->base = addr; | ||
112 | |||
113 | if (!c_can_pci_data->freq) { | ||
114 | dev_err(&pdev->dev, "no clock frequency defined\n"); | ||
115 | ret = -ENODEV; | ||
116 | goto out_free_c_can; | ||
117 | } else { | ||
118 | priv->can.clock.freq = c_can_pci_data->freq; | ||
119 | } | ||
120 | |||
121 | /* Configure CAN type */ | ||
122 | switch (c_can_pci_data->type) { | ||
123 | case BOSCH_C_CAN: | ||
124 | priv->regs = reg_map_c_can; | ||
125 | break; | ||
126 | case BOSCH_D_CAN: | ||
127 | priv->regs = reg_map_d_can; | ||
128 | priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES; | ||
129 | break; | ||
130 | default: | ||
131 | ret = -EINVAL; | ||
132 | goto out_free_c_can; | ||
133 | } | ||
134 | |||
135 | /* Configure access to registers */ | ||
136 | switch (c_can_pci_data->reg_align) { | ||
137 | case C_CAN_REG_ALIGN_32: | ||
138 | priv->read_reg = c_can_pci_read_reg_aligned_to_32bit; | ||
139 | priv->write_reg = c_can_pci_write_reg_aligned_to_32bit; | ||
140 | break; | ||
141 | case C_CAN_REG_ALIGN_16: | ||
142 | priv->read_reg = c_can_pci_read_reg_aligned_to_16bit; | ||
143 | priv->write_reg = c_can_pci_write_reg_aligned_to_16bit; | ||
144 | break; | ||
145 | default: | ||
146 | ret = -EINVAL; | ||
147 | goto out_free_c_can; | ||
148 | } | ||
149 | |||
150 | ret = register_c_can_dev(dev); | ||
151 | if (ret) { | ||
152 | dev_err(&pdev->dev, "registering %s failed (err=%d)\n", | ||
153 | KBUILD_MODNAME, ret); | ||
154 | goto out_free_c_can; | ||
155 | } | ||
156 | |||
157 | dev_dbg(&pdev->dev, "%s device registered (regs=%p, irq=%d)\n", | ||
158 | KBUILD_MODNAME, priv->regs, dev->irq); | ||
159 | |||
160 | return 0; | ||
161 | |||
162 | out_free_c_can: | ||
163 | pci_set_drvdata(pdev, NULL); | ||
164 | free_c_can_dev(dev); | ||
165 | out_iounmap: | ||
166 | pci_iounmap(pdev, addr); | ||
167 | out_release_regions: | ||
168 | pci_disable_msi(pdev); | ||
169 | pci_clear_master(pdev); | ||
170 | pci_release_regions(pdev); | ||
171 | out_disable_device: | ||
172 | pci_disable_device(pdev); | ||
173 | out: | ||
174 | return ret; | ||
175 | } | ||
176 | |||
177 | static void c_can_pci_remove(struct pci_dev *pdev) | ||
178 | { | ||
179 | struct net_device *dev = pci_get_drvdata(pdev); | ||
180 | struct c_can_priv *priv = netdev_priv(dev); | ||
181 | |||
182 | unregister_c_can_dev(dev); | ||
183 | |||
184 | pci_set_drvdata(pdev, NULL); | ||
185 | free_c_can_dev(dev); | ||
186 | |||
187 | pci_iounmap(pdev, priv->base); | ||
188 | pci_disable_msi(pdev); | ||
189 | pci_clear_master(pdev); | ||
190 | pci_release_regions(pdev); | ||
191 | pci_disable_device(pdev); | ||
192 | } | ||
193 | |||
194 | static struct c_can_pci_data c_can_sta2x11= { | ||
195 | .type = BOSCH_C_CAN, | ||
196 | .reg_align = C_CAN_REG_ALIGN_32, | ||
197 | .freq = 52000000, /* 52 Mhz */ | ||
198 | }; | ||
199 | |||
200 | #define C_CAN_ID(_vend, _dev, _driverdata) { \ | ||
201 | PCI_DEVICE(_vend, _dev), \ | ||
202 | .driver_data = (unsigned long)&_driverdata, \ | ||
203 | } | ||
204 | static DEFINE_PCI_DEVICE_TABLE(c_can_pci_tbl) = { | ||
205 | C_CAN_ID(PCI_VENDOR_ID_STMICRO, PCI_DEVICE_ID_STMICRO_CAN, | ||
206 | c_can_sta2x11), | ||
207 | {}, | ||
208 | }; | ||
209 | static struct pci_driver c_can_pci_driver = { | ||
210 | .name = KBUILD_MODNAME, | ||
211 | .id_table = c_can_pci_tbl, | ||
212 | .probe = c_can_pci_probe, | ||
213 | .remove = c_can_pci_remove, | ||
214 | }; | ||
215 | |||
216 | module_pci_driver(c_can_pci_driver); | ||
217 | |||
218 | MODULE_AUTHOR("Federico Vaga <federico.vaga@gmail.com>"); | ||
219 | MODULE_LICENSE("GPL v2"); | ||
220 | MODULE_DESCRIPTION("PCI CAN bus driver for Bosch C_CAN/D_CAN controller"); | ||
221 | MODULE_DEVICE_TABLE(pci, c_can_pci_tbl); | ||
diff --git a/drivers/net/can/c_can/c_can_platform.c b/drivers/net/can/c_can/c_can_platform.c index d63b91904f8..0b5c6f8bdd3 100644 --- a/drivers/net/can/c_can/c_can_platform.c +++ b/drivers/net/can/c_can/c_can_platform.c | |||
@@ -30,16 +30,11 @@ | |||
30 | #include <linux/io.h> | 30 | #include <linux/io.h> |
31 | #include <linux/platform_device.h> | 31 | #include <linux/platform_device.h> |
32 | #include <linux/clk.h> | 32 | #include <linux/clk.h> |
33 | #include <linux/of.h> | ||
34 | #include <linux/of_device.h> | ||
35 | #include <linux/pinctrl/consumer.h> | ||
36 | 33 | ||
37 | #include <linux/can/dev.h> | 34 | #include <linux/can/dev.h> |
38 | 35 | ||
39 | #include "c_can.h" | 36 | #include "c_can.h" |
40 | 37 | ||
41 | #define CAN_RAMINIT_START_MASK(i) (1 << (i)) | ||
42 | |||
43 | /* | 38 | /* |
44 | * 16-bit c_can registers can be arranged differently in the memory | 39 | * 16-bit c_can registers can be arranged differently in the memory |
45 | * architecture of different implementations. For example: 16-bit | 40 | * architecture of different implementations. For example: 16-bit |
@@ -47,95 +42,40 @@ | |||
47 | * Handle the same by providing a common read/write interface. | 42 | * Handle the same by providing a common read/write interface. |
48 | */ | 43 | */ |
49 | static u16 c_can_plat_read_reg_aligned_to_16bit(struct c_can_priv *priv, | 44 | static u16 c_can_plat_read_reg_aligned_to_16bit(struct c_can_priv *priv, |
50 | enum reg index) | 45 | void *reg) |
51 | { | 46 | { |
52 | return readw(priv->base + priv->regs[index]); | 47 | return readw(reg); |
53 | } | 48 | } |
54 | 49 | ||
55 | static void c_can_plat_write_reg_aligned_to_16bit(struct c_can_priv *priv, | 50 | static void c_can_plat_write_reg_aligned_to_16bit(struct c_can_priv *priv, |
56 | enum reg index, u16 val) | 51 | void *reg, u16 val) |
57 | { | 52 | { |
58 | writew(val, priv->base + priv->regs[index]); | 53 | writew(val, reg); |
59 | } | 54 | } |
60 | 55 | ||
61 | static u16 c_can_plat_read_reg_aligned_to_32bit(struct c_can_priv *priv, | 56 | static u16 c_can_plat_read_reg_aligned_to_32bit(struct c_can_priv *priv, |
62 | enum reg index) | 57 | void *reg) |
63 | { | 58 | { |
64 | return readw(priv->base + 2 * priv->regs[index]); | 59 | return readw(reg + (long)reg - (long)priv->regs); |
65 | } | 60 | } |
66 | 61 | ||
67 | static void c_can_plat_write_reg_aligned_to_32bit(struct c_can_priv *priv, | 62 | static void c_can_plat_write_reg_aligned_to_32bit(struct c_can_priv *priv, |
68 | enum reg index, u16 val) | 63 | void *reg, u16 val) |
69 | { | 64 | { |
70 | writew(val, priv->base + 2 * priv->regs[index]); | 65 | writew(val, reg + (long)reg - (long)priv->regs); |
71 | } | ||
72 | |||
73 | static void c_can_hw_raminit(const struct c_can_priv *priv, bool enable) | ||
74 | { | ||
75 | u32 val; | ||
76 | |||
77 | val = readl(priv->raminit_ctrlreg); | ||
78 | if (enable) | ||
79 | val |= CAN_RAMINIT_START_MASK(priv->instance); | ||
80 | else | ||
81 | val &= ~CAN_RAMINIT_START_MASK(priv->instance); | ||
82 | writel(val, priv->raminit_ctrlreg); | ||
83 | } | 66 | } |
84 | 67 | ||
85 | static struct platform_device_id c_can_id_table[] = { | 68 | static int __devinit c_can_plat_probe(struct platform_device *pdev) |
86 | [BOSCH_C_CAN_PLATFORM] = { | ||
87 | .name = KBUILD_MODNAME, | ||
88 | .driver_data = BOSCH_C_CAN, | ||
89 | }, | ||
90 | [BOSCH_C_CAN] = { | ||
91 | .name = "c_can", | ||
92 | .driver_data = BOSCH_C_CAN, | ||
93 | }, | ||
94 | [BOSCH_D_CAN] = { | ||
95 | .name = "d_can", | ||
96 | .driver_data = BOSCH_D_CAN, | ||
97 | }, { | ||
98 | } | ||
99 | }; | ||
100 | MODULE_DEVICE_TABLE(platform, c_can_id_table); | ||
101 | |||
102 | static const struct of_device_id c_can_of_table[] = { | ||
103 | { .compatible = "bosch,c_can", .data = &c_can_id_table[BOSCH_C_CAN] }, | ||
104 | { .compatible = "bosch,d_can", .data = &c_can_id_table[BOSCH_D_CAN] }, | ||
105 | { /* sentinel */ }, | ||
106 | }; | ||
107 | MODULE_DEVICE_TABLE(of, c_can_of_table); | ||
108 | |||
109 | static int c_can_plat_probe(struct platform_device *pdev) | ||
110 | { | 69 | { |
111 | int ret; | 70 | int ret; |
112 | void __iomem *addr; | 71 | void __iomem *addr; |
113 | struct net_device *dev; | 72 | struct net_device *dev; |
114 | struct c_can_priv *priv; | 73 | struct c_can_priv *priv; |
115 | const struct of_device_id *match; | 74 | struct resource *mem; |
116 | const struct platform_device_id *id; | ||
117 | struct pinctrl *pinctrl; | ||
118 | struct resource *mem, *res; | ||
119 | int irq; | 75 | int irq; |
76 | #ifdef CONFIG_HAVE_CLK | ||
120 | struct clk *clk; | 77 | struct clk *clk; |
121 | 78 | ||
122 | if (pdev->dev.of_node) { | ||
123 | match = of_match_device(c_can_of_table, &pdev->dev); | ||
124 | if (!match) { | ||
125 | dev_err(&pdev->dev, "Failed to find matching dt id\n"); | ||
126 | ret = -EINVAL; | ||
127 | goto exit; | ||
128 | } | ||
129 | id = match->data; | ||
130 | } else { | ||
131 | id = platform_get_device_id(pdev); | ||
132 | } | ||
133 | |||
134 | pinctrl = devm_pinctrl_get_select_default(&pdev->dev); | ||
135 | if (IS_ERR(pinctrl)) | ||
136 | dev_warn(&pdev->dev, | ||
137 | "failed to configure pins from driver\n"); | ||
138 | |||
139 | /* get the appropriate clk */ | 79 | /* get the appropriate clk */ |
140 | clk = clk_get(&pdev->dev, NULL); | 80 | clk = clk_get(&pdev->dev, NULL); |
141 | if (IS_ERR(clk)) { | 81 | if (IS_ERR(clk)) { |
@@ -143,6 +83,7 @@ static int c_can_plat_probe(struct platform_device *pdev) | |||
143 | ret = -ENODEV; | 83 | ret = -ENODEV; |
144 | goto exit; | 84 | goto exit; |
145 | } | 85 | } |
86 | #endif | ||
146 | 87 | ||
147 | /* get the platform data */ | 88 | /* get the platform data */ |
148 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 89 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
@@ -174,51 +115,26 @@ static int c_can_plat_probe(struct platform_device *pdev) | |||
174 | } | 115 | } |
175 | 116 | ||
176 | priv = netdev_priv(dev); | 117 | priv = netdev_priv(dev); |
177 | switch (id->driver_data) { | ||
178 | case BOSCH_C_CAN: | ||
179 | priv->regs = reg_map_c_can; | ||
180 | switch (mem->flags & IORESOURCE_MEM_TYPE_MASK) { | ||
181 | case IORESOURCE_MEM_32BIT: | ||
182 | priv->read_reg = c_can_plat_read_reg_aligned_to_32bit; | ||
183 | priv->write_reg = c_can_plat_write_reg_aligned_to_32bit; | ||
184 | break; | ||
185 | case IORESOURCE_MEM_16BIT: | ||
186 | default: | ||
187 | priv->read_reg = c_can_plat_read_reg_aligned_to_16bit; | ||
188 | priv->write_reg = c_can_plat_write_reg_aligned_to_16bit; | ||
189 | break; | ||
190 | } | ||
191 | break; | ||
192 | case BOSCH_D_CAN: | ||
193 | priv->regs = reg_map_d_can; | ||
194 | priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES; | ||
195 | priv->read_reg = c_can_plat_read_reg_aligned_to_16bit; | ||
196 | priv->write_reg = c_can_plat_write_reg_aligned_to_16bit; | ||
197 | 118 | ||
198 | if (pdev->dev.of_node) | 119 | dev->irq = irq; |
199 | priv->instance = of_alias_get_id(pdev->dev.of_node, "d_can"); | 120 | priv->regs = addr; |
200 | else | 121 | #ifdef CONFIG_HAVE_CLK |
201 | priv->instance = pdev->id; | 122 | priv->can.clock.freq = clk_get_rate(clk); |
123 | priv->priv = clk; | ||
124 | #endif | ||
202 | 125 | ||
203 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); | 126 | switch (mem->flags & IORESOURCE_MEM_TYPE_MASK) { |
204 | priv->raminit_ctrlreg = devm_request_and_ioremap(&pdev->dev, res); | 127 | case IORESOURCE_MEM_32BIT: |
205 | if (!priv->raminit_ctrlreg || priv->instance < 0) | 128 | priv->read_reg = c_can_plat_read_reg_aligned_to_32bit; |
206 | dev_info(&pdev->dev, "control memory is not used for raminit\n"); | 129 | priv->write_reg = c_can_plat_write_reg_aligned_to_32bit; |
207 | else | ||
208 | priv->raminit = c_can_hw_raminit; | ||
209 | break; | 130 | break; |
131 | case IORESOURCE_MEM_16BIT: | ||
210 | default: | 132 | default: |
211 | ret = -EINVAL; | 133 | priv->read_reg = c_can_plat_read_reg_aligned_to_16bit; |
212 | goto exit_free_device; | 134 | priv->write_reg = c_can_plat_write_reg_aligned_to_16bit; |
135 | break; | ||
213 | } | 136 | } |
214 | 137 | ||
215 | dev->irq = irq; | ||
216 | priv->base = addr; | ||
217 | priv->device = &pdev->dev; | ||
218 | priv->can.clock.freq = clk_get_rate(clk); | ||
219 | priv->priv = clk; | ||
220 | priv->type = id->driver_data; | ||
221 | |||
222 | platform_set_drvdata(pdev, dev); | 138 | platform_set_drvdata(pdev, dev); |
223 | SET_NETDEV_DEV(dev, &pdev->dev); | 139 | SET_NETDEV_DEV(dev, &pdev->dev); |
224 | 140 | ||
@@ -230,7 +146,7 @@ static int c_can_plat_probe(struct platform_device *pdev) | |||
230 | } | 146 | } |
231 | 147 | ||
232 | dev_info(&pdev->dev, "%s device registered (regs=%p, irq=%d)\n", | 148 | dev_info(&pdev->dev, "%s device registered (regs=%p, irq=%d)\n", |
233 | KBUILD_MODNAME, priv->base, dev->irq); | 149 | KBUILD_MODNAME, priv->regs, dev->irq); |
234 | return 0; | 150 | return 0; |
235 | 151 | ||
236 | exit_free_device: | 152 | exit_free_device: |
@@ -241,14 +157,16 @@ exit_iounmap: | |||
241 | exit_release_mem: | 157 | exit_release_mem: |
242 | release_mem_region(mem->start, resource_size(mem)); | 158 | release_mem_region(mem->start, resource_size(mem)); |
243 | exit_free_clk: | 159 | exit_free_clk: |
160 | #ifdef CONFIG_HAVE_CLK | ||
244 | clk_put(clk); | 161 | clk_put(clk); |
245 | exit: | 162 | exit: |
163 | #endif | ||
246 | dev_err(&pdev->dev, "probe failed\n"); | 164 | dev_err(&pdev->dev, "probe failed\n"); |
247 | 165 | ||
248 | return ret; | 166 | return ret; |
249 | } | 167 | } |
250 | 168 | ||
251 | static int c_can_plat_remove(struct platform_device *pdev) | 169 | static int __devexit c_can_plat_remove(struct platform_device *pdev) |
252 | { | 170 | { |
253 | struct net_device *dev = platform_get_drvdata(pdev); | 171 | struct net_device *dev = platform_get_drvdata(pdev); |
254 | struct c_can_priv *priv = netdev_priv(dev); | 172 | struct c_can_priv *priv = netdev_priv(dev); |
@@ -258,89 +176,38 @@ static int c_can_plat_remove(struct platform_device *pdev) | |||
258 | platform_set_drvdata(pdev, NULL); | 176 | platform_set_drvdata(pdev, NULL); |
259 | 177 | ||
260 | free_c_can_dev(dev); | 178 | free_c_can_dev(dev); |
261 | iounmap(priv->base); | 179 | iounmap(priv->regs); |
262 | 180 | ||
263 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 181 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
264 | release_mem_region(mem->start, resource_size(mem)); | 182 | release_mem_region(mem->start, resource_size(mem)); |
265 | 183 | ||
184 | #ifdef CONFIG_HAVE_CLK | ||
266 | clk_put(priv->priv); | 185 | clk_put(priv->priv); |
186 | #endif | ||
267 | 187 | ||
268 | return 0; | 188 | return 0; |
269 | } | 189 | } |
270 | 190 | ||
271 | #ifdef CONFIG_PM | ||
272 | static int c_can_suspend(struct platform_device *pdev, pm_message_t state) | ||
273 | { | ||
274 | int ret; | ||
275 | struct net_device *ndev = platform_get_drvdata(pdev); | ||
276 | struct c_can_priv *priv = netdev_priv(ndev); | ||
277 | |||
278 | if (priv->type != BOSCH_D_CAN) { | ||
279 | dev_warn(&pdev->dev, "Not supported\n"); | ||
280 | return 0; | ||
281 | } | ||
282 | |||
283 | if (netif_running(ndev)) { | ||
284 | netif_stop_queue(ndev); | ||
285 | netif_device_detach(ndev); | ||
286 | } | ||
287 | |||
288 | ret = c_can_power_down(ndev); | ||
289 | if (ret) { | ||
290 | netdev_err(ndev, "failed to enter power down mode\n"); | ||
291 | return ret; | ||
292 | } | ||
293 | |||
294 | priv->can.state = CAN_STATE_SLEEPING; | ||
295 | |||
296 | return 0; | ||
297 | } | ||
298 | |||
299 | static int c_can_resume(struct platform_device *pdev) | ||
300 | { | ||
301 | int ret; | ||
302 | struct net_device *ndev = platform_get_drvdata(pdev); | ||
303 | struct c_can_priv *priv = netdev_priv(ndev); | ||
304 | |||
305 | if (priv->type != BOSCH_D_CAN) { | ||
306 | dev_warn(&pdev->dev, "Not supported\n"); | ||
307 | return 0; | ||
308 | } | ||
309 | |||
310 | ret = c_can_power_up(ndev); | ||
311 | if (ret) { | ||
312 | netdev_err(ndev, "Still in power down mode\n"); | ||
313 | return ret; | ||
314 | } | ||
315 | |||
316 | priv->can.state = CAN_STATE_ERROR_ACTIVE; | ||
317 | |||
318 | if (netif_running(ndev)) { | ||
319 | netif_device_attach(ndev); | ||
320 | netif_start_queue(ndev); | ||
321 | } | ||
322 | |||
323 | return 0; | ||
324 | } | ||
325 | #else | ||
326 | #define c_can_suspend NULL | ||
327 | #define c_can_resume NULL | ||
328 | #endif | ||
329 | |||
330 | static struct platform_driver c_can_plat_driver = { | 191 | static struct platform_driver c_can_plat_driver = { |
331 | .driver = { | 192 | .driver = { |
332 | .name = KBUILD_MODNAME, | 193 | .name = KBUILD_MODNAME, |
333 | .owner = THIS_MODULE, | 194 | .owner = THIS_MODULE, |
334 | .of_match_table = of_match_ptr(c_can_of_table), | ||
335 | }, | 195 | }, |
336 | .probe = c_can_plat_probe, | 196 | .probe = c_can_plat_probe, |
337 | .remove = c_can_plat_remove, | 197 | .remove = __devexit_p(c_can_plat_remove), |
338 | .suspend = c_can_suspend, | ||
339 | .resume = c_can_resume, | ||
340 | .id_table = c_can_id_table, | ||
341 | }; | 198 | }; |
342 | 199 | ||
343 | module_platform_driver(c_can_plat_driver); | 200 | static int __init c_can_plat_init(void) |
201 | { | ||
202 | return platform_driver_register(&c_can_plat_driver); | ||
203 | } | ||
204 | module_init(c_can_plat_init); | ||
205 | |||
206 | static void __exit c_can_plat_exit(void) | ||
207 | { | ||
208 | platform_driver_unregister(&c_can_plat_driver); | ||
209 | } | ||
210 | module_exit(c_can_plat_exit); | ||
344 | 211 | ||
345 | MODULE_AUTHOR("Bhupesh Sharma <bhupesh.sharma@st.com>"); | 212 | MODULE_AUTHOR("Bhupesh Sharma <bhupesh.sharma@st.com>"); |
346 | MODULE_LICENSE("GPL v2"); | 213 | MODULE_LICENSE("GPL v2"); |
diff --git a/drivers/net/can/cc770/Kconfig b/drivers/net/can/cc770/Kconfig deleted file mode 100644 index 22c07a8c8b4..00000000000 --- a/drivers/net/can/cc770/Kconfig +++ /dev/null | |||
@@ -1,21 +0,0 @@ | |||
1 | menuconfig CAN_CC770 | ||
2 | tristate "Bosch CC770 and Intel AN82527 devices" | ||
3 | depends on CAN_DEV && HAS_IOMEM | ||
4 | |||
5 | if CAN_CC770 | ||
6 | |||
7 | config CAN_CC770_ISA | ||
8 | tristate "ISA Bus based legacy CC770 driver" | ||
9 | ---help--- | ||
10 | This driver adds legacy support for CC770 and AN82527 chips | ||
11 | connected to the ISA bus using I/O port, memory mapped or | ||
12 | indirect access. | ||
13 | |||
14 | config CAN_CC770_PLATFORM | ||
15 | tristate "Generic Platform Bus based CC770 driver" | ||
16 | ---help--- | ||
17 | This driver adds support for the CC770 and AN82527 chips | ||
18 | connected to the "platform bus" (Linux abstraction for directly | ||
19 | to the processor attached devices). | ||
20 | |||
21 | endif | ||
diff --git a/drivers/net/can/cc770/Makefile b/drivers/net/can/cc770/Makefile deleted file mode 100644 index 9fb8321b33e..00000000000 --- a/drivers/net/can/cc770/Makefile +++ /dev/null | |||
@@ -1,9 +0,0 @@ | |||
1 | # | ||
2 | # Makefile for the Bosch CC770 CAN controller drivers. | ||
3 | # | ||
4 | |||
5 | obj-$(CONFIG_CAN_CC770) += cc770.o | ||
6 | obj-$(CONFIG_CAN_CC770_ISA) += cc770_isa.o | ||
7 | obj-$(CONFIG_CAN_CC770_PLATFORM) += cc770_platform.o | ||
8 | |||
9 | ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG | ||
diff --git a/drivers/net/can/cc770/cc770.c b/drivers/net/can/cc770/cc770.c deleted file mode 100644 index 0f12abf6591..00000000000 --- a/drivers/net/can/cc770/cc770.c +++ /dev/null | |||
@@ -1,882 +0,0 @@ | |||
1 | /* | ||
2 | * Core driver for the CC770 and AN82527 CAN controllers | ||
3 | * | ||
4 | * Copyright (C) 2009, 2011 Wolfgang Grandegger <wg@grandegger.com> | ||
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 | |||
16 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
17 | |||
18 | #include <linux/module.h> | ||
19 | #include <linux/init.h> | ||
20 | #include <linux/kernel.h> | ||
21 | #include <linux/sched.h> | ||
22 | #include <linux/types.h> | ||
23 | #include <linux/fcntl.h> | ||
24 | #include <linux/interrupt.h> | ||
25 | #include <linux/ptrace.h> | ||
26 | #include <linux/string.h> | ||
27 | #include <linux/errno.h> | ||
28 | #include <linux/netdevice.h> | ||
29 | #include <linux/if_arp.h> | ||
30 | #include <linux/if_ether.h> | ||
31 | #include <linux/skbuff.h> | ||
32 | #include <linux/delay.h> | ||
33 | |||
34 | #include <linux/can.h> | ||
35 | #include <linux/can/dev.h> | ||
36 | #include <linux/can/error.h> | ||
37 | #include <linux/can/platform/cc770.h> | ||
38 | |||
39 | #include "cc770.h" | ||
40 | |||
41 | MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>"); | ||
42 | MODULE_LICENSE("GPL v2"); | ||
43 | MODULE_DESCRIPTION(KBUILD_MODNAME "CAN netdevice driver"); | ||
44 | |||
45 | /* | ||
46 | * The CC770 is a CAN controller from Bosch, which is 100% compatible | ||
47 | * with the AN82527 from Intel, but with "bugs" being fixed and some | ||
48 | * additional functionality, mainly: | ||
49 | * | ||
50 | * 1. RX and TX error counters are readable. | ||
51 | * 2. Support of silent (listen-only) mode. | ||
52 | * 3. Message object 15 can receive all types of frames, also RTR and EFF. | ||
53 | * | ||
54 | * Details are available from Bosch's "CC770_Product_Info_2007-01.pdf", | ||
55 | * which explains in detail the compatibility between the CC770 and the | ||
56 | * 82527. This driver use the additional functionality 3. on real CC770 | ||
57 | * devices. Unfortunately, the CC770 does still not store the message | ||
58 | * identifier of received remote transmission request frames and | ||
59 | * therefore it's set to 0. | ||
60 | * | ||
61 | * The message objects 1..14 can be used for TX and RX while the message | ||
62 | * objects 15 is optimized for RX. It has a shadow register for reliable | ||
63 | * data receiption under heavy bus load. Therefore it makes sense to use | ||
64 | * this message object for the needed use case. The frame type (EFF/SFF) | ||
65 | * for the message object 15 can be defined via kernel module parameter | ||
66 | * "msgobj15_eff". If not equal 0, it will receive 29-bit EFF frames, | ||
67 | * otherwise 11 bit SFF messages. | ||
68 | */ | ||
69 | static int msgobj15_eff; | ||
70 | module_param(msgobj15_eff, int, S_IRUGO); | ||
71 | MODULE_PARM_DESC(msgobj15_eff, "Extended 29-bit frames for message object 15 " | ||
72 | "(default: 11-bit standard frames)"); | ||
73 | |||
74 | static int i82527_compat; | ||
75 | module_param(i82527_compat, int, S_IRUGO); | ||
76 | MODULE_PARM_DESC(i82527_compat, "Strict Intel 82527 comptibility mode " | ||
77 | "without using additional functions"); | ||
78 | |||
79 | /* | ||
80 | * This driver uses the last 5 message objects 11..15. The definitions | ||
81 | * and structure below allows to configure and assign them to the real | ||
82 | * message object. | ||
83 | */ | ||
84 | static unsigned char cc770_obj_flags[CC770_OBJ_MAX] = { | ||
85 | [CC770_OBJ_RX0] = CC770_OBJ_FLAG_RX, | ||
86 | [CC770_OBJ_RX1] = CC770_OBJ_FLAG_RX | CC770_OBJ_FLAG_EFF, | ||
87 | [CC770_OBJ_RX_RTR0] = CC770_OBJ_FLAG_RX | CC770_OBJ_FLAG_RTR, | ||
88 | [CC770_OBJ_RX_RTR1] = CC770_OBJ_FLAG_RX | CC770_OBJ_FLAG_RTR | | ||
89 | CC770_OBJ_FLAG_EFF, | ||
90 | [CC770_OBJ_TX] = 0, | ||
91 | }; | ||
92 | |||
93 | static const struct can_bittiming_const cc770_bittiming_const = { | ||
94 | .name = KBUILD_MODNAME, | ||
95 | .tseg1_min = 1, | ||
96 | .tseg1_max = 16, | ||
97 | .tseg2_min = 1, | ||
98 | .tseg2_max = 8, | ||
99 | .sjw_max = 4, | ||
100 | .brp_min = 1, | ||
101 | .brp_max = 64, | ||
102 | .brp_inc = 1, | ||
103 | }; | ||
104 | |||
105 | static inline int intid2obj(unsigned int intid) | ||
106 | { | ||
107 | if (intid == 2) | ||
108 | return 0; | ||
109 | else | ||
110 | return MSGOBJ_LAST + 2 - intid; | ||
111 | } | ||
112 | |||
113 | static void enable_all_objs(const struct net_device *dev) | ||
114 | { | ||
115 | struct cc770_priv *priv = netdev_priv(dev); | ||
116 | u8 msgcfg; | ||
117 | unsigned char obj_flags; | ||
118 | unsigned int o, mo; | ||
119 | |||
120 | for (o = 0; o < ARRAY_SIZE(priv->obj_flags); o++) { | ||
121 | obj_flags = priv->obj_flags[o]; | ||
122 | mo = obj2msgobj(o); | ||
123 | |||
124 | if (obj_flags & CC770_OBJ_FLAG_RX) { | ||
125 | /* | ||
126 | * We don't need extra objects for RTR and EFF if | ||
127 | * the additional CC770 functions are enabled. | ||
128 | */ | ||
129 | if (priv->control_normal_mode & CTRL_EAF) { | ||
130 | if (o > 0) | ||
131 | continue; | ||
132 | netdev_dbg(dev, "Message object %d for " | ||
133 | "RX data, RTR, SFF and EFF\n", mo); | ||
134 | } else { | ||
135 | netdev_dbg(dev, | ||
136 | "Message object %d for RX %s %s\n", | ||
137 | mo, obj_flags & CC770_OBJ_FLAG_RTR ? | ||
138 | "RTR" : "data", | ||
139 | obj_flags & CC770_OBJ_FLAG_EFF ? | ||
140 | "EFF" : "SFF"); | ||
141 | } | ||
142 | |||
143 | if (obj_flags & CC770_OBJ_FLAG_EFF) | ||
144 | msgcfg = MSGCFG_XTD; | ||
145 | else | ||
146 | msgcfg = 0; | ||
147 | if (obj_flags & CC770_OBJ_FLAG_RTR) | ||
148 | msgcfg |= MSGCFG_DIR; | ||
149 | |||
150 | cc770_write_reg(priv, msgobj[mo].config, msgcfg); | ||
151 | cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
152 | MSGVAL_SET | TXIE_RES | | ||
153 | RXIE_SET | INTPND_RES); | ||
154 | |||
155 | if (obj_flags & CC770_OBJ_FLAG_RTR) | ||
156 | cc770_write_reg(priv, msgobj[mo].ctrl1, | ||
157 | NEWDAT_RES | CPUUPD_SET | | ||
158 | TXRQST_RES | RMTPND_RES); | ||
159 | else | ||
160 | cc770_write_reg(priv, msgobj[mo].ctrl1, | ||
161 | NEWDAT_RES | MSGLST_RES | | ||
162 | TXRQST_RES | RMTPND_RES); | ||
163 | } else { | ||
164 | netdev_dbg(dev, "Message object %d for " | ||
165 | "TX data, RTR, SFF and EFF\n", mo); | ||
166 | |||
167 | cc770_write_reg(priv, msgobj[mo].ctrl1, | ||
168 | RMTPND_RES | TXRQST_RES | | ||
169 | CPUUPD_RES | NEWDAT_RES); | ||
170 | cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
171 | MSGVAL_RES | TXIE_RES | | ||
172 | RXIE_RES | INTPND_RES); | ||
173 | } | ||
174 | } | ||
175 | } | ||
176 | |||
177 | static void disable_all_objs(const struct cc770_priv *priv) | ||
178 | { | ||
179 | int o, mo; | ||
180 | |||
181 | for (o = 0; o < ARRAY_SIZE(priv->obj_flags); o++) { | ||
182 | mo = obj2msgobj(o); | ||
183 | |||
184 | if (priv->obj_flags[o] & CC770_OBJ_FLAG_RX) { | ||
185 | if (o > 0 && priv->control_normal_mode & CTRL_EAF) | ||
186 | continue; | ||
187 | |||
188 | cc770_write_reg(priv, msgobj[mo].ctrl1, | ||
189 | NEWDAT_RES | MSGLST_RES | | ||
190 | TXRQST_RES | RMTPND_RES); | ||
191 | cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
192 | MSGVAL_RES | TXIE_RES | | ||
193 | RXIE_RES | INTPND_RES); | ||
194 | } else { | ||
195 | /* Clear message object for send */ | ||
196 | cc770_write_reg(priv, msgobj[mo].ctrl1, | ||
197 | RMTPND_RES | TXRQST_RES | | ||
198 | CPUUPD_RES | NEWDAT_RES); | ||
199 | cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
200 | MSGVAL_RES | TXIE_RES | | ||
201 | RXIE_RES | INTPND_RES); | ||
202 | } | ||
203 | } | ||
204 | } | ||
205 | |||
206 | static void set_reset_mode(struct net_device *dev) | ||
207 | { | ||
208 | struct cc770_priv *priv = netdev_priv(dev); | ||
209 | |||
210 | /* Enable configuration and puts chip in bus-off, disable interrupts */ | ||
211 | cc770_write_reg(priv, control, CTRL_CCE | CTRL_INI); | ||
212 | |||
213 | priv->can.state = CAN_STATE_STOPPED; | ||
214 | |||
215 | /* Clear interrupts */ | ||
216 | cc770_read_reg(priv, interrupt); | ||
217 | |||
218 | /* Clear status register */ | ||
219 | cc770_write_reg(priv, status, 0); | ||
220 | |||
221 | /* Disable all used message objects */ | ||
222 | disable_all_objs(priv); | ||
223 | } | ||
224 | |||
225 | static void set_normal_mode(struct net_device *dev) | ||
226 | { | ||
227 | struct cc770_priv *priv = netdev_priv(dev); | ||
228 | |||
229 | /* Clear interrupts */ | ||
230 | cc770_read_reg(priv, interrupt); | ||
231 | |||
232 | /* Clear status register and pre-set last error code */ | ||
233 | cc770_write_reg(priv, status, STAT_LEC_MASK); | ||
234 | |||
235 | /* Enable all used message objects*/ | ||
236 | enable_all_objs(dev); | ||
237 | |||
238 | /* | ||
239 | * Clear bus-off, interrupts only for errors, | ||
240 | * not for status change | ||
241 | */ | ||
242 | cc770_write_reg(priv, control, priv->control_normal_mode); | ||
243 | |||
244 | priv->can.state = CAN_STATE_ERROR_ACTIVE; | ||
245 | } | ||
246 | |||
247 | static void chipset_init(struct cc770_priv *priv) | ||
248 | { | ||
249 | int mo, id, data; | ||
250 | |||
251 | /* Enable configuration and put chip in bus-off, disable interrupts */ | ||
252 | cc770_write_reg(priv, control, (CTRL_CCE | CTRL_INI)); | ||
253 | |||
254 | /* Set CLKOUT divider and slew rates */ | ||
255 | cc770_write_reg(priv, clkout, priv->clkout); | ||
256 | |||
257 | /* Configure CPU interface / CLKOUT enable */ | ||
258 | cc770_write_reg(priv, cpu_interface, priv->cpu_interface); | ||
259 | |||
260 | /* Set bus configuration */ | ||
261 | cc770_write_reg(priv, bus_config, priv->bus_config); | ||
262 | |||
263 | /* Clear interrupts */ | ||
264 | cc770_read_reg(priv, interrupt); | ||
265 | |||
266 | /* Clear status register */ | ||
267 | cc770_write_reg(priv, status, 0); | ||
268 | |||
269 | /* Clear and invalidate message objects */ | ||
270 | for (mo = MSGOBJ_FIRST; mo <= MSGOBJ_LAST; mo++) { | ||
271 | cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
272 | INTPND_UNC | RXIE_RES | | ||
273 | TXIE_RES | MSGVAL_RES); | ||
274 | cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
275 | INTPND_RES | RXIE_RES | | ||
276 | TXIE_RES | MSGVAL_RES); | ||
277 | cc770_write_reg(priv, msgobj[mo].ctrl1, | ||
278 | NEWDAT_RES | MSGLST_RES | | ||
279 | TXRQST_RES | RMTPND_RES); | ||
280 | for (data = 0; data < 8; data++) | ||
281 | cc770_write_reg(priv, msgobj[mo].data[data], 0); | ||
282 | for (id = 0; id < 4; id++) | ||
283 | cc770_write_reg(priv, msgobj[mo].id[id], 0); | ||
284 | cc770_write_reg(priv, msgobj[mo].config, 0); | ||
285 | } | ||
286 | |||
287 | /* Set all global ID masks to "don't care" */ | ||
288 | cc770_write_reg(priv, global_mask_std[0], 0); | ||
289 | cc770_write_reg(priv, global_mask_std[1], 0); | ||
290 | cc770_write_reg(priv, global_mask_ext[0], 0); | ||
291 | cc770_write_reg(priv, global_mask_ext[1], 0); | ||
292 | cc770_write_reg(priv, global_mask_ext[2], 0); | ||
293 | cc770_write_reg(priv, global_mask_ext[3], 0); | ||
294 | |||
295 | } | ||
296 | |||
297 | static int cc770_probe_chip(struct net_device *dev) | ||
298 | { | ||
299 | struct cc770_priv *priv = netdev_priv(dev); | ||
300 | |||
301 | /* Enable configuration, put chip in bus-off, disable ints */ | ||
302 | cc770_write_reg(priv, control, CTRL_CCE | CTRL_EAF | CTRL_INI); | ||
303 | /* Configure cpu interface / CLKOUT disable */ | ||
304 | cc770_write_reg(priv, cpu_interface, priv->cpu_interface); | ||
305 | |||
306 | /* | ||
307 | * Check if hardware reset is still inactive or maybe there | ||
308 | * is no chip in this address space | ||
309 | */ | ||
310 | if (cc770_read_reg(priv, cpu_interface) & CPUIF_RST) { | ||
311 | netdev_info(dev, "probing @0x%p failed (reset)\n", | ||
312 | priv->reg_base); | ||
313 | return -ENODEV; | ||
314 | } | ||
315 | |||
316 | /* Write and read back test pattern (some arbitrary values) */ | ||
317 | cc770_write_reg(priv, msgobj[1].data[1], 0x25); | ||
318 | cc770_write_reg(priv, msgobj[2].data[3], 0x52); | ||
319 | cc770_write_reg(priv, msgobj[10].data[6], 0xc3); | ||
320 | if ((cc770_read_reg(priv, msgobj[1].data[1]) != 0x25) || | ||
321 | (cc770_read_reg(priv, msgobj[2].data[3]) != 0x52) || | ||
322 | (cc770_read_reg(priv, msgobj[10].data[6]) != 0xc3)) { | ||
323 | netdev_info(dev, "probing @0x%p failed (pattern)\n", | ||
324 | priv->reg_base); | ||
325 | return -ENODEV; | ||
326 | } | ||
327 | |||
328 | /* Check if this chip is a CC770 supporting additional functions */ | ||
329 | if (cc770_read_reg(priv, control) & CTRL_EAF) | ||
330 | priv->control_normal_mode |= CTRL_EAF; | ||
331 | |||
332 | return 0; | ||
333 | } | ||
334 | |||
335 | static void cc770_start(struct net_device *dev) | ||
336 | { | ||
337 | struct cc770_priv *priv = netdev_priv(dev); | ||
338 | |||
339 | /* leave reset mode */ | ||
340 | if (priv->can.state != CAN_STATE_STOPPED) | ||
341 | set_reset_mode(dev); | ||
342 | |||
343 | /* leave reset mode */ | ||
344 | set_normal_mode(dev); | ||
345 | } | ||
346 | |||
347 | static int cc770_set_mode(struct net_device *dev, enum can_mode mode) | ||
348 | { | ||
349 | switch (mode) { | ||
350 | case CAN_MODE_START: | ||
351 | cc770_start(dev); | ||
352 | netif_wake_queue(dev); | ||
353 | break; | ||
354 | |||
355 | default: | ||
356 | return -EOPNOTSUPP; | ||
357 | } | ||
358 | |||
359 | return 0; | ||
360 | } | ||
361 | |||
362 | static int cc770_set_bittiming(struct net_device *dev) | ||
363 | { | ||
364 | struct cc770_priv *priv = netdev_priv(dev); | ||
365 | struct can_bittiming *bt = &priv->can.bittiming; | ||
366 | u8 btr0, btr1; | ||
367 | |||
368 | btr0 = ((bt->brp - 1) & 0x3f) | (((bt->sjw - 1) & 0x3) << 6); | ||
369 | btr1 = ((bt->prop_seg + bt->phase_seg1 - 1) & 0xf) | | ||
370 | (((bt->phase_seg2 - 1) & 0x7) << 4); | ||
371 | if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) | ||
372 | btr1 |= 0x80; | ||
373 | |||
374 | netdev_info(dev, "setting BTR0=0x%02x BTR1=0x%02x\n", btr0, btr1); | ||
375 | |||
376 | cc770_write_reg(priv, bit_timing_0, btr0); | ||
377 | cc770_write_reg(priv, bit_timing_1, btr1); | ||
378 | |||
379 | return 0; | ||
380 | } | ||
381 | |||
382 | static int cc770_get_berr_counter(const struct net_device *dev, | ||
383 | struct can_berr_counter *bec) | ||
384 | { | ||
385 | struct cc770_priv *priv = netdev_priv(dev); | ||
386 | |||
387 | bec->txerr = cc770_read_reg(priv, tx_error_counter); | ||
388 | bec->rxerr = cc770_read_reg(priv, rx_error_counter); | ||
389 | |||
390 | return 0; | ||
391 | } | ||
392 | |||
393 | static netdev_tx_t cc770_start_xmit(struct sk_buff *skb, struct net_device *dev) | ||
394 | { | ||
395 | struct cc770_priv *priv = netdev_priv(dev); | ||
396 | struct net_device_stats *stats = &dev->stats; | ||
397 | struct can_frame *cf = (struct can_frame *)skb->data; | ||
398 | unsigned int mo = obj2msgobj(CC770_OBJ_TX); | ||
399 | u8 dlc, rtr; | ||
400 | u32 id; | ||
401 | int i; | ||
402 | |||
403 | if (can_dropped_invalid_skb(dev, skb)) | ||
404 | return NETDEV_TX_OK; | ||
405 | |||
406 | if ((cc770_read_reg(priv, | ||
407 | msgobj[mo].ctrl1) & TXRQST_UNC) == TXRQST_SET) { | ||
408 | netdev_err(dev, "TX register is still occupied!\n"); | ||
409 | return NETDEV_TX_BUSY; | ||
410 | } | ||
411 | |||
412 | netif_stop_queue(dev); | ||
413 | |||
414 | dlc = cf->can_dlc; | ||
415 | id = cf->can_id; | ||
416 | if (cf->can_id & CAN_RTR_FLAG) | ||
417 | rtr = 0; | ||
418 | else | ||
419 | rtr = MSGCFG_DIR; | ||
420 | cc770_write_reg(priv, msgobj[mo].ctrl1, | ||
421 | RMTPND_RES | TXRQST_RES | CPUUPD_SET | NEWDAT_RES); | ||
422 | cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
423 | MSGVAL_SET | TXIE_SET | RXIE_RES | INTPND_RES); | ||
424 | if (id & CAN_EFF_FLAG) { | ||
425 | id &= CAN_EFF_MASK; | ||
426 | cc770_write_reg(priv, msgobj[mo].config, | ||
427 | (dlc << 4) | rtr | MSGCFG_XTD); | ||
428 | cc770_write_reg(priv, msgobj[mo].id[3], id << 3); | ||
429 | cc770_write_reg(priv, msgobj[mo].id[2], id >> 5); | ||
430 | cc770_write_reg(priv, msgobj[mo].id[1], id >> 13); | ||
431 | cc770_write_reg(priv, msgobj[mo].id[0], id >> 21); | ||
432 | } else { | ||
433 | id &= CAN_SFF_MASK; | ||
434 | cc770_write_reg(priv, msgobj[mo].config, (dlc << 4) | rtr); | ||
435 | cc770_write_reg(priv, msgobj[mo].id[0], id >> 3); | ||
436 | cc770_write_reg(priv, msgobj[mo].id[1], id << 5); | ||
437 | } | ||
438 | |||
439 | for (i = 0; i < dlc; i++) | ||
440 | cc770_write_reg(priv, msgobj[mo].data[i], cf->data[i]); | ||
441 | |||
442 | /* Store echo skb before starting the transfer */ | ||
443 | can_put_echo_skb(skb, dev, 0); | ||
444 | |||
445 | cc770_write_reg(priv, msgobj[mo].ctrl1, | ||
446 | RMTPND_RES | TXRQST_SET | CPUUPD_RES | NEWDAT_UNC); | ||
447 | |||
448 | stats->tx_bytes += dlc; | ||
449 | |||
450 | |||
451 | /* | ||
452 | * HM: We had some cases of repeated IRQs so make sure the | ||
453 | * INT is acknowledged I know it's already further up, but | ||
454 | * doing again fixed the issue | ||
455 | */ | ||
456 | cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
457 | MSGVAL_UNC | TXIE_UNC | RXIE_UNC | INTPND_RES); | ||
458 | |||
459 | return NETDEV_TX_OK; | ||
460 | } | ||
461 | |||
462 | static void cc770_rx(struct net_device *dev, unsigned int mo, u8 ctrl1) | ||
463 | { | ||
464 | struct cc770_priv *priv = netdev_priv(dev); | ||
465 | struct net_device_stats *stats = &dev->stats; | ||
466 | struct can_frame *cf; | ||
467 | struct sk_buff *skb; | ||
468 | u8 config; | ||
469 | u32 id; | ||
470 | int i; | ||
471 | |||
472 | skb = alloc_can_skb(dev, &cf); | ||
473 | if (!skb) | ||
474 | return; | ||
475 | |||
476 | config = cc770_read_reg(priv, msgobj[mo].config); | ||
477 | |||
478 | if (ctrl1 & RMTPND_SET) { | ||
479 | /* | ||
480 | * Unfortunately, the chip does not store the real message | ||
481 | * identifier of the received remote transmission request | ||
482 | * frame. Therefore we set it to 0. | ||
483 | */ | ||
484 | cf->can_id = CAN_RTR_FLAG; | ||
485 | if (config & MSGCFG_XTD) | ||
486 | cf->can_id |= CAN_EFF_FLAG; | ||
487 | cf->can_dlc = 0; | ||
488 | } else { | ||
489 | if (config & MSGCFG_XTD) { | ||
490 | id = cc770_read_reg(priv, msgobj[mo].id[3]); | ||
491 | id |= cc770_read_reg(priv, msgobj[mo].id[2]) << 8; | ||
492 | id |= cc770_read_reg(priv, msgobj[mo].id[1]) << 16; | ||
493 | id |= cc770_read_reg(priv, msgobj[mo].id[0]) << 24; | ||
494 | id >>= 3; | ||
495 | id |= CAN_EFF_FLAG; | ||
496 | } else { | ||
497 | id = cc770_read_reg(priv, msgobj[mo].id[1]); | ||
498 | id |= cc770_read_reg(priv, msgobj[mo].id[0]) << 8; | ||
499 | id >>= 5; | ||
500 | } | ||
501 | |||
502 | cf->can_id = id; | ||
503 | cf->can_dlc = get_can_dlc((config & 0xf0) >> 4); | ||
504 | for (i = 0; i < cf->can_dlc; i++) | ||
505 | cf->data[i] = cc770_read_reg(priv, msgobj[mo].data[i]); | ||
506 | } | ||
507 | netif_rx(skb); | ||
508 | |||
509 | stats->rx_packets++; | ||
510 | stats->rx_bytes += cf->can_dlc; | ||
511 | } | ||
512 | |||
513 | static int cc770_err(struct net_device *dev, u8 status) | ||
514 | { | ||
515 | struct cc770_priv *priv = netdev_priv(dev); | ||
516 | struct net_device_stats *stats = &dev->stats; | ||
517 | struct can_frame *cf; | ||
518 | struct sk_buff *skb; | ||
519 | u8 lec; | ||
520 | |||
521 | netdev_dbg(dev, "status interrupt (%#x)\n", status); | ||
522 | |||
523 | skb = alloc_can_err_skb(dev, &cf); | ||
524 | if (!skb) | ||
525 | return -ENOMEM; | ||
526 | |||
527 | /* Use extended functions of the CC770 */ | ||
528 | if (priv->control_normal_mode & CTRL_EAF) { | ||
529 | cf->data[6] = cc770_read_reg(priv, tx_error_counter); | ||
530 | cf->data[7] = cc770_read_reg(priv, rx_error_counter); | ||
531 | } | ||
532 | |||
533 | if (status & STAT_BOFF) { | ||
534 | /* Disable interrupts */ | ||
535 | cc770_write_reg(priv, control, CTRL_INI); | ||
536 | cf->can_id |= CAN_ERR_BUSOFF; | ||
537 | priv->can.state = CAN_STATE_BUS_OFF; | ||
538 | can_bus_off(dev); | ||
539 | } else if (status & STAT_WARN) { | ||
540 | cf->can_id |= CAN_ERR_CRTL; | ||
541 | /* Only the CC770 does show error passive */ | ||
542 | if (cf->data[7] > 127) { | ||
543 | cf->data[1] = CAN_ERR_CRTL_RX_PASSIVE | | ||
544 | CAN_ERR_CRTL_TX_PASSIVE; | ||
545 | priv->can.state = CAN_STATE_ERROR_PASSIVE; | ||
546 | priv->can.can_stats.error_passive++; | ||
547 | } else { | ||
548 | cf->data[1] = CAN_ERR_CRTL_RX_WARNING | | ||
549 | CAN_ERR_CRTL_TX_WARNING; | ||
550 | priv->can.state = CAN_STATE_ERROR_WARNING; | ||
551 | priv->can.can_stats.error_warning++; | ||
552 | } | ||
553 | } else { | ||
554 | /* Back to error avtive */ | ||
555 | cf->can_id |= CAN_ERR_PROT; | ||
556 | cf->data[2] = CAN_ERR_PROT_ACTIVE; | ||
557 | priv->can.state = CAN_STATE_ERROR_ACTIVE; | ||
558 | } | ||
559 | |||
560 | lec = status & STAT_LEC_MASK; | ||
561 | if (lec < 7 && lec > 0) { | ||
562 | if (lec == STAT_LEC_ACK) { | ||
563 | cf->can_id |= CAN_ERR_ACK; | ||
564 | } else { | ||
565 | cf->can_id |= CAN_ERR_PROT; | ||
566 | switch (lec) { | ||
567 | case STAT_LEC_STUFF: | ||
568 | cf->data[2] |= CAN_ERR_PROT_STUFF; | ||
569 | break; | ||
570 | case STAT_LEC_FORM: | ||
571 | cf->data[2] |= CAN_ERR_PROT_FORM; | ||
572 | break; | ||
573 | case STAT_LEC_BIT1: | ||
574 | cf->data[2] |= CAN_ERR_PROT_BIT1; | ||
575 | break; | ||
576 | case STAT_LEC_BIT0: | ||
577 | cf->data[2] |= CAN_ERR_PROT_BIT0; | ||
578 | break; | ||
579 | case STAT_LEC_CRC: | ||
580 | cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ; | ||
581 | break; | ||
582 | } | ||
583 | } | ||
584 | } | ||
585 | |||
586 | netif_rx(skb); | ||
587 | |||
588 | stats->rx_packets++; | ||
589 | stats->rx_bytes += cf->can_dlc; | ||
590 | |||
591 | return 0; | ||
592 | } | ||
593 | |||
594 | static int cc770_status_interrupt(struct net_device *dev) | ||
595 | { | ||
596 | struct cc770_priv *priv = netdev_priv(dev); | ||
597 | u8 status; | ||
598 | |||
599 | status = cc770_read_reg(priv, status); | ||
600 | /* Reset the status register including RXOK and TXOK */ | ||
601 | cc770_write_reg(priv, status, STAT_LEC_MASK); | ||
602 | |||
603 | if (status & (STAT_WARN | STAT_BOFF) || | ||
604 | (status & STAT_LEC_MASK) != STAT_LEC_MASK) { | ||
605 | cc770_err(dev, status); | ||
606 | return status & STAT_BOFF; | ||
607 | } | ||
608 | |||
609 | return 0; | ||
610 | } | ||
611 | |||
612 | static void cc770_rx_interrupt(struct net_device *dev, unsigned int o) | ||
613 | { | ||
614 | struct cc770_priv *priv = netdev_priv(dev); | ||
615 | struct net_device_stats *stats = &dev->stats; | ||
616 | unsigned int mo = obj2msgobj(o); | ||
617 | u8 ctrl1; | ||
618 | int n = CC770_MAX_MSG; | ||
619 | |||
620 | while (n--) { | ||
621 | ctrl1 = cc770_read_reg(priv, msgobj[mo].ctrl1); | ||
622 | |||
623 | if (!(ctrl1 & NEWDAT_SET)) { | ||
624 | /* Check for RTR if additional functions are enabled */ | ||
625 | if (priv->control_normal_mode & CTRL_EAF) { | ||
626 | if (!(cc770_read_reg(priv, msgobj[mo].ctrl0) & | ||
627 | INTPND_SET)) | ||
628 | break; | ||
629 | } else { | ||
630 | break; | ||
631 | } | ||
632 | } | ||
633 | |||
634 | if (ctrl1 & MSGLST_SET) { | ||
635 | stats->rx_over_errors++; | ||
636 | stats->rx_errors++; | ||
637 | } | ||
638 | if (mo < MSGOBJ_LAST) | ||
639 | cc770_write_reg(priv, msgobj[mo].ctrl1, | ||
640 | NEWDAT_RES | MSGLST_RES | | ||
641 | TXRQST_UNC | RMTPND_UNC); | ||
642 | cc770_rx(dev, mo, ctrl1); | ||
643 | |||
644 | cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
645 | MSGVAL_SET | TXIE_RES | | ||
646 | RXIE_SET | INTPND_RES); | ||
647 | cc770_write_reg(priv, msgobj[mo].ctrl1, | ||
648 | NEWDAT_RES | MSGLST_RES | | ||
649 | TXRQST_RES | RMTPND_RES); | ||
650 | } | ||
651 | } | ||
652 | |||
653 | static void cc770_rtr_interrupt(struct net_device *dev, unsigned int o) | ||
654 | { | ||
655 | struct cc770_priv *priv = netdev_priv(dev); | ||
656 | unsigned int mo = obj2msgobj(o); | ||
657 | u8 ctrl0, ctrl1; | ||
658 | int n = CC770_MAX_MSG; | ||
659 | |||
660 | while (n--) { | ||
661 | ctrl0 = cc770_read_reg(priv, msgobj[mo].ctrl0); | ||
662 | if (!(ctrl0 & INTPND_SET)) | ||
663 | break; | ||
664 | |||
665 | ctrl1 = cc770_read_reg(priv, msgobj[mo].ctrl1); | ||
666 | cc770_rx(dev, mo, ctrl1); | ||
667 | |||
668 | cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
669 | MSGVAL_SET | TXIE_RES | | ||
670 | RXIE_SET | INTPND_RES); | ||
671 | cc770_write_reg(priv, msgobj[mo].ctrl1, | ||
672 | NEWDAT_RES | CPUUPD_SET | | ||
673 | TXRQST_RES | RMTPND_RES); | ||
674 | } | ||
675 | } | ||
676 | |||
677 | static void cc770_tx_interrupt(struct net_device *dev, unsigned int o) | ||
678 | { | ||
679 | struct cc770_priv *priv = netdev_priv(dev); | ||
680 | struct net_device_stats *stats = &dev->stats; | ||
681 | unsigned int mo = obj2msgobj(o); | ||
682 | |||
683 | /* Nothing more to send, switch off interrupts */ | ||
684 | cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
685 | MSGVAL_RES | TXIE_RES | RXIE_RES | INTPND_RES); | ||
686 | /* | ||
687 | * We had some cases of repeated IRQ so make sure the | ||
688 | * INT is acknowledged | ||
689 | */ | ||
690 | cc770_write_reg(priv, msgobj[mo].ctrl0, | ||
691 | MSGVAL_UNC | TXIE_UNC | RXIE_UNC | INTPND_RES); | ||
692 | |||
693 | stats->tx_packets++; | ||
694 | can_get_echo_skb(dev, 0); | ||
695 | netif_wake_queue(dev); | ||
696 | } | ||
697 | |||
698 | static irqreturn_t cc770_interrupt(int irq, void *dev_id) | ||
699 | { | ||
700 | struct net_device *dev = (struct net_device *)dev_id; | ||
701 | struct cc770_priv *priv = netdev_priv(dev); | ||
702 | u8 intid; | ||
703 | int o, n = 0; | ||
704 | |||
705 | /* Shared interrupts and IRQ off? */ | ||
706 | if (priv->can.state == CAN_STATE_STOPPED) | ||
707 | return IRQ_NONE; | ||
708 | |||
709 | if (priv->pre_irq) | ||
710 | priv->pre_irq(priv); | ||
711 | |||
712 | while (n < CC770_MAX_IRQ) { | ||
713 | /* Read the highest pending interrupt request */ | ||
714 | intid = cc770_read_reg(priv, interrupt); | ||
715 | if (!intid) | ||
716 | break; | ||
717 | n++; | ||
718 | |||
719 | if (intid == 1) { | ||
720 | /* Exit in case of bus-off */ | ||
721 | if (cc770_status_interrupt(dev)) | ||
722 | break; | ||
723 | } else { | ||
724 | o = intid2obj(intid); | ||
725 | |||
726 | if (o >= CC770_OBJ_MAX) { | ||
727 | netdev_err(dev, "Unexpected interrupt id %d\n", | ||
728 | intid); | ||
729 | continue; | ||
730 | } | ||
731 | |||
732 | if (priv->obj_flags[o] & CC770_OBJ_FLAG_RTR) | ||
733 | cc770_rtr_interrupt(dev, o); | ||
734 | else if (priv->obj_flags[o] & CC770_OBJ_FLAG_RX) | ||
735 | cc770_rx_interrupt(dev, o); | ||
736 | else | ||
737 | cc770_tx_interrupt(dev, o); | ||
738 | } | ||
739 | } | ||
740 | |||
741 | if (priv->post_irq) | ||
742 | priv->post_irq(priv); | ||
743 | |||
744 | if (n >= CC770_MAX_IRQ) | ||
745 | netdev_dbg(dev, "%d messages handled in ISR", n); | ||
746 | |||
747 | return (n) ? IRQ_HANDLED : IRQ_NONE; | ||
748 | } | ||
749 | |||
750 | static int cc770_open(struct net_device *dev) | ||
751 | { | ||
752 | struct cc770_priv *priv = netdev_priv(dev); | ||
753 | int err; | ||
754 | |||
755 | /* set chip into reset mode */ | ||
756 | set_reset_mode(dev); | ||
757 | |||
758 | /* common open */ | ||
759 | err = open_candev(dev); | ||
760 | if (err) | ||
761 | return err; | ||
762 | |||
763 | err = request_irq(dev->irq, &cc770_interrupt, priv->irq_flags, | ||
764 | dev->name, dev); | ||
765 | if (err) { | ||
766 | close_candev(dev); | ||
767 | return -EAGAIN; | ||
768 | } | ||
769 | |||
770 | /* init and start chip */ | ||
771 | cc770_start(dev); | ||
772 | |||
773 | netif_start_queue(dev); | ||
774 | |||
775 | return 0; | ||
776 | } | ||
777 | |||
778 | static int cc770_close(struct net_device *dev) | ||
779 | { | ||
780 | netif_stop_queue(dev); | ||
781 | set_reset_mode(dev); | ||
782 | |||
783 | free_irq(dev->irq, dev); | ||
784 | close_candev(dev); | ||
785 | |||
786 | return 0; | ||
787 | } | ||
788 | |||
789 | struct net_device *alloc_cc770dev(int sizeof_priv) | ||
790 | { | ||
791 | struct net_device *dev; | ||
792 | struct cc770_priv *priv; | ||
793 | |||
794 | dev = alloc_candev(sizeof(struct cc770_priv) + sizeof_priv, | ||
795 | CC770_ECHO_SKB_MAX); | ||
796 | if (!dev) | ||
797 | return NULL; | ||
798 | |||
799 | priv = netdev_priv(dev); | ||
800 | |||
801 | priv->dev = dev; | ||
802 | priv->can.bittiming_const = &cc770_bittiming_const; | ||
803 | priv->can.do_set_bittiming = cc770_set_bittiming; | ||
804 | priv->can.do_set_mode = cc770_set_mode; | ||
805 | priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES; | ||
806 | |||
807 | memcpy(priv->obj_flags, cc770_obj_flags, sizeof(cc770_obj_flags)); | ||
808 | |||
809 | if (sizeof_priv) | ||
810 | priv->priv = (void *)priv + sizeof(struct cc770_priv); | ||
811 | |||
812 | return dev; | ||
813 | } | ||
814 | EXPORT_SYMBOL_GPL(alloc_cc770dev); | ||
815 | |||
816 | void free_cc770dev(struct net_device *dev) | ||
817 | { | ||
818 | free_candev(dev); | ||
819 | } | ||
820 | EXPORT_SYMBOL_GPL(free_cc770dev); | ||
821 | |||
822 | static const struct net_device_ops cc770_netdev_ops = { | ||
823 | .ndo_open = cc770_open, | ||
824 | .ndo_stop = cc770_close, | ||
825 | .ndo_start_xmit = cc770_start_xmit, | ||
826 | }; | ||
827 | |||
828 | int register_cc770dev(struct net_device *dev) | ||
829 | { | ||
830 | struct cc770_priv *priv = netdev_priv(dev); | ||
831 | int err; | ||
832 | |||
833 | err = cc770_probe_chip(dev); | ||
834 | if (err) | ||
835 | return err; | ||
836 | |||
837 | dev->netdev_ops = &cc770_netdev_ops; | ||
838 | |||
839 | dev->flags |= IFF_ECHO; /* we support local echo */ | ||
840 | |||
841 | /* Should we use additional functions? */ | ||
842 | if (!i82527_compat && priv->control_normal_mode & CTRL_EAF) { | ||
843 | priv->can.do_get_berr_counter = cc770_get_berr_counter; | ||
844 | priv->control_normal_mode = CTRL_IE | CTRL_EAF | CTRL_EIE; | ||
845 | netdev_dbg(dev, "i82527 mode with additional functions\n"); | ||
846 | } else { | ||
847 | priv->control_normal_mode = CTRL_IE | CTRL_EIE; | ||
848 | netdev_dbg(dev, "strict i82527 compatibility mode\n"); | ||
849 | } | ||
850 | |||
851 | chipset_init(priv); | ||
852 | set_reset_mode(dev); | ||
853 | |||
854 | return register_candev(dev); | ||
855 | } | ||
856 | EXPORT_SYMBOL_GPL(register_cc770dev); | ||
857 | |||
858 | void unregister_cc770dev(struct net_device *dev) | ||
859 | { | ||
860 | set_reset_mode(dev); | ||
861 | unregister_candev(dev); | ||
862 | } | ||
863 | EXPORT_SYMBOL_GPL(unregister_cc770dev); | ||
864 | |||
865 | static __init int cc770_init(void) | ||
866 | { | ||
867 | if (msgobj15_eff) { | ||
868 | cc770_obj_flags[CC770_OBJ_RX0] |= CC770_OBJ_FLAG_EFF; | ||
869 | cc770_obj_flags[CC770_OBJ_RX1] &= ~CC770_OBJ_FLAG_EFF; | ||
870 | } | ||
871 | |||
872 | pr_info("CAN netdevice driver\n"); | ||
873 | |||
874 | return 0; | ||
875 | } | ||
876 | module_init(cc770_init); | ||
877 | |||
878 | static __exit void cc770_exit(void) | ||
879 | { | ||
880 | pr_info("driver removed\n"); | ||
881 | } | ||
882 | module_exit(cc770_exit); | ||
diff --git a/drivers/net/can/cc770/cc770.h b/drivers/net/can/cc770/cc770.h deleted file mode 100644 index a1739db98d9..00000000000 --- a/drivers/net/can/cc770/cc770.h +++ /dev/null | |||
@@ -1,203 +0,0 @@ | |||
1 | /* | ||
2 | * Core driver for the CC770 and AN82527 CAN controllers | ||
3 | * | ||
4 | * Copyright (C) 2009, 2011 Wolfgang Grandegger <wg@grandegger.com> | ||
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 | |||
16 | #ifndef CC770_DEV_H | ||
17 | #define CC770_DEV_H | ||
18 | |||
19 | #include <linux/can/dev.h> | ||
20 | |||
21 | struct cc770_msgobj { | ||
22 | u8 ctrl0; | ||
23 | u8 ctrl1; | ||
24 | u8 id[4]; | ||
25 | u8 config; | ||
26 | u8 data[8]; | ||
27 | u8 dontuse; /* padding */ | ||
28 | } __packed; | ||
29 | |||
30 | struct cc770_regs { | ||
31 | union { | ||
32 | struct cc770_msgobj msgobj[16]; /* Message object 1..15 */ | ||
33 | struct { | ||
34 | u8 control; /* Control Register */ | ||
35 | u8 status; /* Status Register */ | ||
36 | u8 cpu_interface; /* CPU Interface Register */ | ||
37 | u8 dontuse1; | ||
38 | u8 high_speed_read[2]; /* High Speed Read */ | ||
39 | u8 global_mask_std[2]; /* Standard Global Mask */ | ||
40 | u8 global_mask_ext[4]; /* Extended Global Mask */ | ||
41 | u8 msg15_mask[4]; /* Message 15 Mask */ | ||
42 | u8 dontuse2[15]; | ||
43 | u8 clkout; /* Clock Out Register */ | ||
44 | u8 dontuse3[15]; | ||
45 | u8 bus_config; /* Bus Configuration Register */ | ||
46 | u8 dontuse4[15]; | ||
47 | u8 bit_timing_0; /* Bit Timing Register byte 0 */ | ||
48 | u8 dontuse5[15]; | ||
49 | u8 bit_timing_1; /* Bit Timing Register byte 1 */ | ||
50 | u8 dontuse6[15]; | ||
51 | u8 interrupt; /* Interrupt Register */ | ||
52 | u8 dontuse7[15]; | ||
53 | u8 rx_error_counter; /* Receive Error Counter */ | ||
54 | u8 dontuse8[15]; | ||
55 | u8 tx_error_counter; /* Transmit Error Counter */ | ||
56 | u8 dontuse9[31]; | ||
57 | u8 p1_conf; | ||
58 | u8 dontuse10[15]; | ||
59 | u8 p2_conf; | ||
60 | u8 dontuse11[15]; | ||
61 | u8 p1_in; | ||
62 | u8 dontuse12[15]; | ||
63 | u8 p2_in; | ||
64 | u8 dontuse13[15]; | ||
65 | u8 p1_out; | ||
66 | u8 dontuse14[15]; | ||
67 | u8 p2_out; | ||
68 | u8 dontuse15[15]; | ||
69 | u8 serial_reset_addr; | ||
70 | }; | ||
71 | }; | ||
72 | } __packed; | ||
73 | |||
74 | /* Control Register (0x00) */ | ||
75 | #define CTRL_INI 0x01 /* Initialization */ | ||
76 | #define CTRL_IE 0x02 /* Interrupt Enable */ | ||
77 | #define CTRL_SIE 0x04 /* Status Interrupt Enable */ | ||
78 | #define CTRL_EIE 0x08 /* Error Interrupt Enable */ | ||
79 | #define CTRL_EAF 0x20 /* Enable additional functions */ | ||
80 | #define CTRL_CCE 0x40 /* Change Configuration Enable */ | ||
81 | |||
82 | /* Status Register (0x01) */ | ||
83 | #define STAT_LEC_STUFF 0x01 /* Stuff error */ | ||
84 | #define STAT_LEC_FORM 0x02 /* Form error */ | ||
85 | #define STAT_LEC_ACK 0x03 /* Acknowledgement error */ | ||
86 | #define STAT_LEC_BIT1 0x04 /* Bit1 error */ | ||
87 | #define STAT_LEC_BIT0 0x05 /* Bit0 error */ | ||
88 | #define STAT_LEC_CRC 0x06 /* CRC error */ | ||
89 | #define STAT_LEC_MASK 0x07 /* Last Error Code mask */ | ||
90 | #define STAT_TXOK 0x08 /* Transmit Message Successfully */ | ||
91 | #define STAT_RXOK 0x10 /* Receive Message Successfully */ | ||
92 | #define STAT_WAKE 0x20 /* Wake Up Status */ | ||
93 | #define STAT_WARN 0x40 /* Warning Status */ | ||
94 | #define STAT_BOFF 0x80 /* Bus Off Status */ | ||
95 | |||
96 | /* | ||
97 | * CPU Interface Register (0x02) | ||
98 | * Clock Out Register (0x1f) | ||
99 | * Bus Configuration Register (0x2f) | ||
100 | * | ||
101 | * see include/linux/can/platform/cc770.h | ||
102 | */ | ||
103 | |||
104 | /* Message Control Register 0 (Base Address + 0x0) */ | ||
105 | #define INTPND_RES 0x01 /* No Interrupt pending */ | ||
106 | #define INTPND_SET 0x02 /* Interrupt pending */ | ||
107 | #define INTPND_UNC 0x03 | ||
108 | #define RXIE_RES 0x04 /* Receive Interrupt Disable */ | ||
109 | #define RXIE_SET 0x08 /* Receive Interrupt Enable */ | ||
110 | #define RXIE_UNC 0x0c | ||
111 | #define TXIE_RES 0x10 /* Transmit Interrupt Disable */ | ||
112 | #define TXIE_SET 0x20 /* Transmit Interrupt Enable */ | ||
113 | #define TXIE_UNC 0x30 | ||
114 | #define MSGVAL_RES 0x40 /* Message Invalid */ | ||
115 | #define MSGVAL_SET 0x80 /* Message Valid */ | ||
116 | #define MSGVAL_UNC 0xc0 | ||
117 | |||
118 | /* Message Control Register 1 (Base Address + 0x01) */ | ||
119 | #define NEWDAT_RES 0x01 /* No New Data */ | ||
120 | #define NEWDAT_SET 0x02 /* New Data */ | ||
121 | #define NEWDAT_UNC 0x03 | ||
122 | #define MSGLST_RES 0x04 /* No Message Lost */ | ||
123 | #define MSGLST_SET 0x08 /* Message Lost */ | ||
124 | #define MSGLST_UNC 0x0c | ||
125 | #define CPUUPD_RES 0x04 /* No CPU Updating */ | ||
126 | #define CPUUPD_SET 0x08 /* CPU Updating */ | ||
127 | #define CPUUPD_UNC 0x0c | ||
128 | #define TXRQST_RES 0x10 /* No Transmission Request */ | ||
129 | #define TXRQST_SET 0x20 /* Transmission Request */ | ||
130 | #define TXRQST_UNC 0x30 | ||
131 | #define RMTPND_RES 0x40 /* No Remote Request Pending */ | ||
132 | #define RMTPND_SET 0x80 /* Remote Request Pending */ | ||
133 | #define RMTPND_UNC 0xc0 | ||
134 | |||
135 | /* Message Configuration Register (Base Address + 0x06) */ | ||
136 | #define MSGCFG_XTD 0x04 /* Extended Identifier */ | ||
137 | #define MSGCFG_DIR 0x08 /* Direction is Transmit */ | ||
138 | |||
139 | #define MSGOBJ_FIRST 1 | ||
140 | #define MSGOBJ_LAST 15 | ||
141 | |||
142 | #define CC770_IO_SIZE 0x100 | ||
143 | #define CC770_MAX_IRQ 20 /* max. number of interrupts handled in ISR */ | ||
144 | #define CC770_MAX_MSG 4 /* max. number of messages handled in ISR */ | ||
145 | |||
146 | #define CC770_ECHO_SKB_MAX 1 | ||
147 | |||
148 | #define cc770_read_reg(priv, member) \ | ||
149 | priv->read_reg(priv, offsetof(struct cc770_regs, member)) | ||
150 | |||
151 | #define cc770_write_reg(priv, member, value) \ | ||
152 | priv->write_reg(priv, offsetof(struct cc770_regs, member), value) | ||
153 | |||
154 | /* | ||
155 | * Message objects and flags used by this driver | ||
156 | */ | ||
157 | #define CC770_OBJ_FLAG_RX 0x01 | ||
158 | #define CC770_OBJ_FLAG_RTR 0x02 | ||
159 | #define CC770_OBJ_FLAG_EFF 0x04 | ||
160 | |||
161 | enum { | ||
162 | CC770_OBJ_RX0 = 0, /* for receiving normal messages */ | ||
163 | CC770_OBJ_RX1, /* for receiving normal messages */ | ||
164 | CC770_OBJ_RX_RTR0, /* for receiving remote transmission requests */ | ||
165 | CC770_OBJ_RX_RTR1, /* for receiving remote transmission requests */ | ||
166 | CC770_OBJ_TX, /* for sending messages */ | ||
167 | CC770_OBJ_MAX | ||
168 | }; | ||
169 | |||
170 | #define obj2msgobj(o) (MSGOBJ_LAST - (o)) /* message object 11..15 */ | ||
171 | |||
172 | /* | ||
173 | * CC770 private data structure | ||
174 | */ | ||
175 | struct cc770_priv { | ||
176 | struct can_priv can; /* must be the first member */ | ||
177 | struct sk_buff *echo_skb; | ||
178 | |||
179 | /* the lower-layer is responsible for appropriate locking */ | ||
180 | u8 (*read_reg)(const struct cc770_priv *priv, int reg); | ||
181 | void (*write_reg)(const struct cc770_priv *priv, int reg, u8 val); | ||
182 | void (*pre_irq)(const struct cc770_priv *priv); | ||
183 | void (*post_irq)(const struct cc770_priv *priv); | ||
184 | |||
185 | void *priv; /* for board-specific data */ | ||
186 | struct net_device *dev; | ||
187 | |||
188 | void __iomem *reg_base; /* ioremap'ed address to registers */ | ||
189 | unsigned long irq_flags; /* for request_irq() */ | ||
190 | |||
191 | unsigned char obj_flags[CC770_OBJ_MAX]; | ||
192 | u8 control_normal_mode; /* Control register for normal mode */ | ||
193 | u8 cpu_interface; /* CPU interface register */ | ||
194 | u8 clkout; /* Clock out register */ | ||
195 | u8 bus_config; /* Bus conffiguration register */ | ||
196 | }; | ||
197 | |||
198 | struct net_device *alloc_cc770dev(int sizeof_priv); | ||
199 | void free_cc770dev(struct net_device *dev); | ||
200 | int register_cc770dev(struct net_device *dev); | ||
201 | void unregister_cc770dev(struct net_device *dev); | ||
202 | |||
203 | #endif /* CC770_DEV_H */ | ||
diff --git a/drivers/net/can/cc770/cc770_isa.c b/drivers/net/can/cc770/cc770_isa.c deleted file mode 100644 index 8eaaac81f32..00000000000 --- a/drivers/net/can/cc770/cc770_isa.c +++ /dev/null | |||
@@ -1,381 +0,0 @@ | |||
1 | /* | ||
2 | * Driver for CC770 and AN82527 CAN controllers on the legacy ISA bus | ||
3 | * | ||
4 | * Copyright (C) 2009, 2011 Wolfgang Grandegger <wg@grandegger.com> | ||
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 | |||
16 | /* | ||
17 | * Bosch CC770 and Intel AN82527 CAN controllers on the ISA or PC-104 bus. | ||
18 | * The I/O port or memory address and the IRQ number must be specified via | ||
19 | * module parameters: | ||
20 | * | ||
21 | * insmod cc770_isa.ko port=0x310,0x380 irq=7,11 | ||
22 | * | ||
23 | * for ISA devices using I/O ports or: | ||
24 | * | ||
25 | * insmod cc770_isa.ko mem=0xd1000,0xd1000 irq=7,11 | ||
26 | * | ||
27 | * for memory mapped ISA devices. | ||
28 | * | ||
29 | * Indirect access via address and data port is supported as well: | ||
30 | * | ||
31 | * insmod cc770_isa.ko port=0x310,0x380 indirect=1 irq=7,11 | ||
32 | * | ||
33 | * Furthermore, the following mode parameter can be defined: | ||
34 | * | ||
35 | * clk: External oscillator clock frequency (default=16000000 [16 MHz]) | ||
36 | * cir: CPU interface register (default=0x40 [DSC]) | ||
37 | * bcr: Bus configuration register (default=0x40 [CBY]) | ||
38 | * cor: Clockout register (default=0x00) | ||
39 | * | ||
40 | * Note: for clk, cir, bcr and cor, the first argument re-defines the | ||
41 | * default for all other devices, e.g.: | ||
42 | * | ||
43 | * insmod cc770_isa.ko mem=0xd1000,0xd1000 irq=7,11 clk=24000000 | ||
44 | * | ||
45 | * is equivalent to | ||
46 | * | ||
47 | * insmod cc770_isa.ko mem=0xd1000,0xd1000 irq=7,11 clk=24000000,24000000 | ||
48 | */ | ||
49 | |||
50 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
51 | |||
52 | #include <linux/kernel.h> | ||
53 | #include <linux/module.h> | ||
54 | #include <linux/platform_device.h> | ||
55 | #include <linux/interrupt.h> | ||
56 | #include <linux/netdevice.h> | ||
57 | #include <linux/delay.h> | ||
58 | #include <linux/irq.h> | ||
59 | #include <linux/io.h> | ||
60 | #include <linux/can.h> | ||
61 | #include <linux/can/dev.h> | ||
62 | #include <linux/can/platform/cc770.h> | ||
63 | |||
64 | #include "cc770.h" | ||
65 | |||
66 | #define MAXDEV 8 | ||
67 | |||
68 | MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>"); | ||
69 | MODULE_DESCRIPTION("Socket-CAN driver for CC770 on the ISA bus"); | ||
70 | MODULE_LICENSE("GPL v2"); | ||
71 | |||
72 | #define CLK_DEFAULT 16000000 /* 16 MHz */ | ||
73 | #define COR_DEFAULT 0x00 | ||
74 | #define BCR_DEFAULT BUSCFG_CBY | ||
75 | |||
76 | static unsigned long port[MAXDEV]; | ||
77 | static unsigned long mem[MAXDEV]; | ||
78 | static int irq[MAXDEV]; | ||
79 | static int clk[MAXDEV]; | ||
80 | static u8 cir[MAXDEV] = {[0 ... (MAXDEV - 1)] = 0xff}; | ||
81 | static u8 cor[MAXDEV] = {[0 ... (MAXDEV - 1)] = 0xff}; | ||
82 | static u8 bcr[MAXDEV] = {[0 ... (MAXDEV - 1)] = 0xff}; | ||
83 | static int indirect[MAXDEV] = {[0 ... (MAXDEV - 1)] = -1}; | ||
84 | |||
85 | module_param_array(port, ulong, NULL, S_IRUGO); | ||
86 | MODULE_PARM_DESC(port, "I/O port number"); | ||
87 | |||
88 | module_param_array(mem, ulong, NULL, S_IRUGO); | ||
89 | MODULE_PARM_DESC(mem, "I/O memory address"); | ||
90 | |||
91 | module_param_array(indirect, int, NULL, S_IRUGO); | ||
92 | MODULE_PARM_DESC(indirect, "Indirect access via address and data port"); | ||
93 | |||
94 | module_param_array(irq, int, NULL, S_IRUGO); | ||
95 | MODULE_PARM_DESC(irq, "IRQ number"); | ||
96 | |||
97 | module_param_array(clk, int, NULL, S_IRUGO); | ||
98 | MODULE_PARM_DESC(clk, "External oscillator clock frequency " | ||
99 | "(default=16000000 [16 MHz])"); | ||
100 | |||
101 | module_param_array(cir, byte, NULL, S_IRUGO); | ||
102 | MODULE_PARM_DESC(cir, "CPU interface register (default=0x40 [DSC])"); | ||
103 | |||
104 | module_param_array(cor, byte, NULL, S_IRUGO); | ||
105 | MODULE_PARM_DESC(cor, "Clockout register (default=0x00)"); | ||
106 | |||
107 | module_param_array(bcr, byte, NULL, S_IRUGO); | ||
108 | MODULE_PARM_DESC(bcr, "Bus configuration register (default=0x40 [CBY])"); | ||
109 | |||
110 | #define CC770_IOSIZE 0x20 | ||
111 | #define CC770_IOSIZE_INDIRECT 0x02 | ||
112 | |||
113 | /* Spinlock for cc770_isa_port_write_reg_indirect | ||
114 | * and cc770_isa_port_read_reg_indirect | ||
115 | */ | ||
116 | static DEFINE_SPINLOCK(cc770_isa_port_lock); | ||
117 | |||
118 | static struct platform_device *cc770_isa_devs[MAXDEV]; | ||
119 | |||
120 | static u8 cc770_isa_mem_read_reg(const struct cc770_priv *priv, int reg) | ||
121 | { | ||
122 | return readb(priv->reg_base + reg); | ||
123 | } | ||
124 | |||
125 | static void cc770_isa_mem_write_reg(const struct cc770_priv *priv, | ||
126 | int reg, u8 val) | ||
127 | { | ||
128 | writeb(val, priv->reg_base + reg); | ||
129 | } | ||
130 | |||
131 | static u8 cc770_isa_port_read_reg(const struct cc770_priv *priv, int reg) | ||
132 | { | ||
133 | return inb((unsigned long)priv->reg_base + reg); | ||
134 | } | ||
135 | |||
136 | static void cc770_isa_port_write_reg(const struct cc770_priv *priv, | ||
137 | int reg, u8 val) | ||
138 | { | ||
139 | outb(val, (unsigned long)priv->reg_base + reg); | ||
140 | } | ||
141 | |||
142 | static u8 cc770_isa_port_read_reg_indirect(const struct cc770_priv *priv, | ||
143 | int reg) | ||
144 | { | ||
145 | unsigned long base = (unsigned long)priv->reg_base; | ||
146 | unsigned long flags; | ||
147 | u8 val; | ||
148 | |||
149 | spin_lock_irqsave(&cc770_isa_port_lock, flags); | ||
150 | outb(reg, base); | ||
151 | val = inb(base + 1); | ||
152 | spin_unlock_irqrestore(&cc770_isa_port_lock, flags); | ||
153 | |||
154 | return val; | ||
155 | } | ||
156 | |||
157 | static void cc770_isa_port_write_reg_indirect(const struct cc770_priv *priv, | ||
158 | int reg, u8 val) | ||
159 | { | ||
160 | unsigned long base = (unsigned long)priv->reg_base; | ||
161 | unsigned long flags; | ||
162 | |||
163 | spin_lock_irqsave(&cc770_isa_port_lock, flags); | ||
164 | outb(reg, base); | ||
165 | outb(val, base + 1); | ||
166 | spin_unlock_irqrestore(&cc770_isa_port_lock, flags); | ||
167 | } | ||
168 | |||
169 | static int cc770_isa_probe(struct platform_device *pdev) | ||
170 | { | ||
171 | struct net_device *dev; | ||
172 | struct cc770_priv *priv; | ||
173 | void __iomem *base = NULL; | ||
174 | int iosize = CC770_IOSIZE; | ||
175 | int idx = pdev->id; | ||
176 | int err; | ||
177 | u32 clktmp; | ||
178 | |||
179 | dev_dbg(&pdev->dev, "probing idx=%d: port=%#lx, mem=%#lx, irq=%d\n", | ||
180 | idx, port[idx], mem[idx], irq[idx]); | ||
181 | if (mem[idx]) { | ||
182 | if (!request_mem_region(mem[idx], iosize, KBUILD_MODNAME)) { | ||
183 | err = -EBUSY; | ||
184 | goto exit; | ||
185 | } | ||
186 | base = ioremap_nocache(mem[idx], iosize); | ||
187 | if (!base) { | ||
188 | err = -ENOMEM; | ||
189 | goto exit_release; | ||
190 | } | ||
191 | } else { | ||
192 | if (indirect[idx] > 0 || | ||
193 | (indirect[idx] == -1 && indirect[0] > 0)) | ||
194 | iosize = CC770_IOSIZE_INDIRECT; | ||
195 | if (!request_region(port[idx], iosize, KBUILD_MODNAME)) { | ||
196 | err = -EBUSY; | ||
197 | goto exit; | ||
198 | } | ||
199 | } | ||
200 | |||
201 | dev = alloc_cc770dev(0); | ||
202 | if (!dev) { | ||
203 | err = -ENOMEM; | ||
204 | goto exit_unmap; | ||
205 | } | ||
206 | priv = netdev_priv(dev); | ||
207 | |||
208 | dev->irq = irq[idx]; | ||
209 | priv->irq_flags = IRQF_SHARED; | ||
210 | if (mem[idx]) { | ||
211 | priv->reg_base = base; | ||
212 | dev->base_addr = mem[idx]; | ||
213 | priv->read_reg = cc770_isa_mem_read_reg; | ||
214 | priv->write_reg = cc770_isa_mem_write_reg; | ||
215 | } else { | ||
216 | priv->reg_base = (void __iomem *)port[idx]; | ||
217 | dev->base_addr = port[idx]; | ||
218 | |||
219 | if (iosize == CC770_IOSIZE_INDIRECT) { | ||
220 | priv->read_reg = cc770_isa_port_read_reg_indirect; | ||
221 | priv->write_reg = cc770_isa_port_write_reg_indirect; | ||
222 | } else { | ||
223 | priv->read_reg = cc770_isa_port_read_reg; | ||
224 | priv->write_reg = cc770_isa_port_write_reg; | ||
225 | } | ||
226 | } | ||
227 | |||
228 | if (clk[idx]) | ||
229 | clktmp = clk[idx]; | ||
230 | else if (clk[0]) | ||
231 | clktmp = clk[0]; | ||
232 | else | ||
233 | clktmp = CLK_DEFAULT; | ||
234 | priv->can.clock.freq = clktmp; | ||
235 | |||
236 | if (cir[idx] != 0xff) { | ||
237 | priv->cpu_interface = cir[idx]; | ||
238 | } else if (cir[0] != 0xff) { | ||
239 | priv->cpu_interface = cir[0]; | ||
240 | } else { | ||
241 | /* The system clock may not exceed 10 MHz */ | ||
242 | if (clktmp > 10000000) { | ||
243 | priv->cpu_interface |= CPUIF_DSC; | ||
244 | clktmp /= 2; | ||
245 | } | ||
246 | /* The memory clock may not exceed 8 MHz */ | ||
247 | if (clktmp > 8000000) | ||
248 | priv->cpu_interface |= CPUIF_DMC; | ||
249 | } | ||
250 | |||
251 | if (priv->cpu_interface & CPUIF_DSC) | ||
252 | priv->can.clock.freq /= 2; | ||
253 | |||
254 | if (bcr[idx] != 0xff) | ||
255 | priv->bus_config = bcr[idx]; | ||
256 | else if (bcr[0] != 0xff) | ||
257 | priv->bus_config = bcr[0]; | ||
258 | else | ||
259 | priv->bus_config = BCR_DEFAULT; | ||
260 | |||
261 | if (cor[idx] != 0xff) | ||
262 | priv->clkout = cor[idx]; | ||
263 | else if (cor[0] != 0xff) | ||
264 | priv->clkout = cor[0]; | ||
265 | else | ||
266 | priv->clkout = COR_DEFAULT; | ||
267 | |||
268 | dev_set_drvdata(&pdev->dev, dev); | ||
269 | SET_NETDEV_DEV(dev, &pdev->dev); | ||
270 | |||
271 | err = register_cc770dev(dev); | ||
272 | if (err) { | ||
273 | dev_err(&pdev->dev, | ||
274 | "couldn't register device (err=%d)\n", err); | ||
275 | goto exit_unmap; | ||
276 | } | ||
277 | |||
278 | dev_info(&pdev->dev, "device registered (reg_base=0x%p, irq=%d)\n", | ||
279 | priv->reg_base, dev->irq); | ||
280 | return 0; | ||
281 | |||
282 | exit_unmap: | ||
283 | if (mem[idx]) | ||
284 | iounmap(base); | ||
285 | exit_release: | ||
286 | if (mem[idx]) | ||
287 | release_mem_region(mem[idx], iosize); | ||
288 | else | ||
289 | release_region(port[idx], iosize); | ||
290 | exit: | ||
291 | return err; | ||
292 | } | ||
293 | |||
294 | static int cc770_isa_remove(struct platform_device *pdev) | ||
295 | { | ||
296 | struct net_device *dev = dev_get_drvdata(&pdev->dev); | ||
297 | struct cc770_priv *priv = netdev_priv(dev); | ||
298 | int idx = pdev->id; | ||
299 | |||
300 | unregister_cc770dev(dev); | ||
301 | dev_set_drvdata(&pdev->dev, NULL); | ||
302 | |||
303 | if (mem[idx]) { | ||
304 | iounmap(priv->reg_base); | ||
305 | release_mem_region(mem[idx], CC770_IOSIZE); | ||
306 | } else { | ||
307 | if (priv->read_reg == cc770_isa_port_read_reg_indirect) | ||
308 | release_region(port[idx], CC770_IOSIZE_INDIRECT); | ||
309 | else | ||
310 | release_region(port[idx], CC770_IOSIZE); | ||
311 | } | ||
312 | free_cc770dev(dev); | ||
313 | |||
314 | return 0; | ||
315 | } | ||
316 | |||
317 | static struct platform_driver cc770_isa_driver = { | ||
318 | .probe = cc770_isa_probe, | ||
319 | .remove = cc770_isa_remove, | ||
320 | .driver = { | ||
321 | .name = KBUILD_MODNAME, | ||
322 | .owner = THIS_MODULE, | ||
323 | }, | ||
324 | }; | ||
325 | |||
326 | static int __init cc770_isa_init(void) | ||
327 | { | ||
328 | int idx, err; | ||
329 | |||
330 | for (idx = 0; idx < ARRAY_SIZE(cc770_isa_devs); idx++) { | ||
331 | if ((port[idx] || mem[idx]) && irq[idx]) { | ||
332 | cc770_isa_devs[idx] = | ||
333 | platform_device_alloc(KBUILD_MODNAME, idx); | ||
334 | if (!cc770_isa_devs[idx]) { | ||
335 | err = -ENOMEM; | ||
336 | goto exit_free_devices; | ||
337 | } | ||
338 | err = platform_device_add(cc770_isa_devs[idx]); | ||
339 | if (err) { | ||
340 | platform_device_put(cc770_isa_devs[idx]); | ||
341 | goto exit_free_devices; | ||
342 | } | ||
343 | pr_debug("platform device %d: port=%#lx, mem=%#lx, " | ||
344 | "irq=%d\n", | ||
345 | idx, port[idx], mem[idx], irq[idx]); | ||
346 | } else if (idx == 0 || port[idx] || mem[idx]) { | ||
347 | pr_err("insufficient parameters supplied\n"); | ||
348 | err = -EINVAL; | ||
349 | goto exit_free_devices; | ||
350 | } | ||
351 | } | ||
352 | |||
353 | err = platform_driver_register(&cc770_isa_driver); | ||
354 | if (err) | ||
355 | goto exit_free_devices; | ||
356 | |||
357 | pr_info("driver for max. %d devices registered\n", MAXDEV); | ||
358 | |||
359 | return 0; | ||
360 | |||
361 | exit_free_devices: | ||
362 | while (--idx >= 0) { | ||
363 | if (cc770_isa_devs[idx]) | ||
364 | platform_device_unregister(cc770_isa_devs[idx]); | ||
365 | } | ||
366 | |||
367 | return err; | ||
368 | } | ||
369 | module_init(cc770_isa_init); | ||
370 | |||
371 | static void __exit cc770_isa_exit(void) | ||
372 | { | ||
373 | int idx; | ||
374 | |||
375 | platform_driver_unregister(&cc770_isa_driver); | ||
376 | for (idx = 0; idx < ARRAY_SIZE(cc770_isa_devs); idx++) { | ||
377 | if (cc770_isa_devs[idx]) | ||
378 | platform_device_unregister(cc770_isa_devs[idx]); | ||
379 | } | ||
380 | } | ||
381 | module_exit(cc770_isa_exit); | ||
diff --git a/drivers/net/can/cc770/cc770_platform.c b/drivers/net/can/cc770/cc770_platform.c deleted file mode 100644 index d0f6bfc45ae..00000000000 --- a/drivers/net/can/cc770/cc770_platform.c +++ /dev/null | |||
@@ -1,274 +0,0 @@ | |||
1 | /* | ||
2 | * Driver for CC770 and AN82527 CAN controllers on the platform bus | ||
3 | * | ||
4 | * Copyright (C) 2009, 2011 Wolfgang Grandegger <wg@grandegger.com> | ||
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 | |||
16 | /* | ||
17 | * If platform data are used you should have similar definitions | ||
18 | * in your board-specific code: | ||
19 | * | ||
20 | * static struct cc770_platform_data myboard_cc770_pdata = { | ||
21 | * .osc_freq = 16000000, | ||
22 | * .cir = 0x41, | ||
23 | * .cor = 0x20, | ||
24 | * .bcr = 0x40, | ||
25 | * }; | ||
26 | * | ||
27 | * Please see include/linux/can/platform/cc770.h for description of | ||
28 | * above fields. | ||
29 | * | ||
30 | * If the device tree is used, you need a CAN node definition in your | ||
31 | * DTS file similar to: | ||
32 | * | ||
33 | * can@3,100 { | ||
34 | * compatible = "bosch,cc770"; | ||
35 | * reg = <3 0x100 0x80>; | ||
36 | * interrupts = <2 0>; | ||
37 | * interrupt-parent = <&mpic>; | ||
38 | * bosch,external-clock-frequency = <16000000>; | ||
39 | * }; | ||
40 | * | ||
41 | * See "Documentation/devicetree/bindings/net/can/cc770.txt" for further | ||
42 | * information. | ||
43 | */ | ||
44 | |||
45 | #include <linux/kernel.h> | ||
46 | #include <linux/module.h> | ||
47 | #include <linux/interrupt.h> | ||
48 | #include <linux/netdevice.h> | ||
49 | #include <linux/delay.h> | ||
50 | #include <linux/platform_device.h> | ||
51 | #include <linux/of.h> | ||
52 | #include <linux/can.h> | ||
53 | #include <linux/can/dev.h> | ||
54 | #include <linux/can/platform/cc770.h> | ||
55 | |||
56 | #include "cc770.h" | ||
57 | |||
58 | #define DRV_NAME "cc770_platform" | ||
59 | |||
60 | MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>"); | ||
61 | MODULE_DESCRIPTION("Socket-CAN driver for CC770 on the platform bus"); | ||
62 | MODULE_LICENSE("GPL v2"); | ||
63 | MODULE_ALIAS("platform:" DRV_NAME); | ||
64 | |||
65 | #define CC770_PLATFORM_CAN_CLOCK 16000000 | ||
66 | |||
67 | static u8 cc770_platform_read_reg(const struct cc770_priv *priv, int reg) | ||
68 | { | ||
69 | return ioread8(priv->reg_base + reg); | ||
70 | } | ||
71 | |||
72 | static void cc770_platform_write_reg(const struct cc770_priv *priv, int reg, | ||
73 | u8 val) | ||
74 | { | ||
75 | iowrite8(val, priv->reg_base + reg); | ||
76 | } | ||
77 | |||
78 | static int cc770_get_of_node_data(struct platform_device *pdev, | ||
79 | struct cc770_priv *priv) | ||
80 | { | ||
81 | struct device_node *np = pdev->dev.of_node; | ||
82 | const u32 *prop; | ||
83 | int prop_size; | ||
84 | u32 clkext; | ||
85 | |||
86 | prop = of_get_property(np, "bosch,external-clock-frequency", | ||
87 | &prop_size); | ||
88 | if (prop && (prop_size == sizeof(u32))) | ||
89 | clkext = *prop; | ||
90 | else | ||
91 | clkext = CC770_PLATFORM_CAN_CLOCK; /* default */ | ||
92 | priv->can.clock.freq = clkext; | ||
93 | |||
94 | /* The system clock may not exceed 10 MHz */ | ||
95 | if (priv->can.clock.freq > 10000000) { | ||
96 | priv->cpu_interface |= CPUIF_DSC; | ||
97 | priv->can.clock.freq /= 2; | ||
98 | } | ||
99 | |||
100 | /* The memory clock may not exceed 8 MHz */ | ||
101 | if (priv->can.clock.freq > 8000000) | ||
102 | priv->cpu_interface |= CPUIF_DMC; | ||
103 | |||
104 | if (of_get_property(np, "bosch,divide-memory-clock", NULL)) | ||
105 | priv->cpu_interface |= CPUIF_DMC; | ||
106 | if (of_get_property(np, "bosch,iso-low-speed-mux", NULL)) | ||
107 | priv->cpu_interface |= CPUIF_MUX; | ||
108 | |||
109 | if (!of_get_property(np, "bosch,no-comperator-bypass", NULL)) | ||
110 | priv->bus_config |= BUSCFG_CBY; | ||
111 | if (of_get_property(np, "bosch,disconnect-rx0-input", NULL)) | ||
112 | priv->bus_config |= BUSCFG_DR0; | ||
113 | if (of_get_property(np, "bosch,disconnect-rx1-input", NULL)) | ||
114 | priv->bus_config |= BUSCFG_DR1; | ||
115 | if (of_get_property(np, "bosch,disconnect-tx1-output", NULL)) | ||
116 | priv->bus_config |= BUSCFG_DT1; | ||
117 | if (of_get_property(np, "bosch,polarity-dominant", NULL)) | ||
118 | priv->bus_config |= BUSCFG_POL; | ||
119 | |||
120 | prop = of_get_property(np, "bosch,clock-out-frequency", &prop_size); | ||
121 | if (prop && (prop_size == sizeof(u32)) && *prop > 0) { | ||
122 | u32 cdv = clkext / *prop; | ||
123 | int slew; | ||
124 | |||
125 | if (cdv > 0 && cdv < 16) { | ||
126 | priv->cpu_interface |= CPUIF_CEN; | ||
127 | priv->clkout |= (cdv - 1) & CLKOUT_CD_MASK; | ||
128 | |||
129 | prop = of_get_property(np, "bosch,slew-rate", | ||
130 | &prop_size); | ||
131 | if (prop && (prop_size == sizeof(u32))) { | ||
132 | slew = *prop; | ||
133 | } else { | ||
134 | /* Determine default slew rate */ | ||
135 | slew = (CLKOUT_SL_MASK >> | ||
136 | CLKOUT_SL_SHIFT) - | ||
137 | ((cdv * clkext - 1) / 8000000); | ||
138 | if (slew < 0) | ||
139 | slew = 0; | ||
140 | } | ||
141 | priv->clkout |= (slew << CLKOUT_SL_SHIFT) & | ||
142 | CLKOUT_SL_MASK; | ||
143 | } else { | ||
144 | dev_dbg(&pdev->dev, "invalid clock-out-frequency\n"); | ||
145 | } | ||
146 | } | ||
147 | |||
148 | return 0; | ||
149 | } | ||
150 | |||
151 | static int cc770_get_platform_data(struct platform_device *pdev, | ||
152 | struct cc770_priv *priv) | ||
153 | { | ||
154 | |||
155 | struct cc770_platform_data *pdata = pdev->dev.platform_data; | ||
156 | |||
157 | priv->can.clock.freq = pdata->osc_freq; | ||
158 | if (priv->cpu_interface & CPUIF_DSC) | ||
159 | priv->can.clock.freq /= 2; | ||
160 | priv->clkout = pdata->cor; | ||
161 | priv->bus_config = pdata->bcr; | ||
162 | priv->cpu_interface = pdata->cir; | ||
163 | |||
164 | return 0; | ||
165 | } | ||
166 | |||
167 | static int cc770_platform_probe(struct platform_device *pdev) | ||
168 | { | ||
169 | struct net_device *dev; | ||
170 | struct cc770_priv *priv; | ||
171 | struct resource *mem; | ||
172 | resource_size_t mem_size; | ||
173 | void __iomem *base; | ||
174 | int err, irq; | ||
175 | |||
176 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
177 | irq = platform_get_irq(pdev, 0); | ||
178 | if (!mem || irq <= 0) | ||
179 | return -ENODEV; | ||
180 | |||
181 | mem_size = resource_size(mem); | ||
182 | if (!request_mem_region(mem->start, mem_size, pdev->name)) | ||
183 | return -EBUSY; | ||
184 | |||
185 | base = ioremap(mem->start, mem_size); | ||
186 | if (!base) { | ||
187 | err = -ENOMEM; | ||
188 | goto exit_release_mem; | ||
189 | } | ||
190 | |||
191 | dev = alloc_cc770dev(0); | ||
192 | if (!dev) { | ||
193 | err = -ENOMEM; | ||
194 | goto exit_unmap_mem; | ||
195 | } | ||
196 | |||
197 | dev->irq = irq; | ||
198 | priv = netdev_priv(dev); | ||
199 | priv->read_reg = cc770_platform_read_reg; | ||
200 | priv->write_reg = cc770_platform_write_reg; | ||
201 | priv->irq_flags = IRQF_SHARED; | ||
202 | priv->reg_base = base; | ||
203 | |||
204 | if (pdev->dev.of_node) | ||
205 | err = cc770_get_of_node_data(pdev, priv); | ||
206 | else if (pdev->dev.platform_data) | ||
207 | err = cc770_get_platform_data(pdev, priv); | ||
208 | else | ||
209 | err = -ENODEV; | ||
210 | if (err) | ||
211 | goto exit_free_cc770; | ||
212 | |||
213 | dev_dbg(&pdev->dev, | ||
214 | "reg_base=0x%p irq=%d clock=%d cpu_interface=0x%02x " | ||
215 | "bus_config=0x%02x clkout=0x%02x\n", | ||
216 | priv->reg_base, dev->irq, priv->can.clock.freq, | ||
217 | priv->cpu_interface, priv->bus_config, priv->clkout); | ||
218 | |||
219 | dev_set_drvdata(&pdev->dev, dev); | ||
220 | SET_NETDEV_DEV(dev, &pdev->dev); | ||
221 | |||
222 | err = register_cc770dev(dev); | ||
223 | if (err) { | ||
224 | dev_err(&pdev->dev, | ||
225 | "couldn't register CC700 device (err=%d)\n", err); | ||
226 | goto exit_free_cc770; | ||
227 | } | ||
228 | |||
229 | return 0; | ||
230 | |||
231 | exit_free_cc770: | ||
232 | free_cc770dev(dev); | ||
233 | exit_unmap_mem: | ||
234 | iounmap(base); | ||
235 | exit_release_mem: | ||
236 | release_mem_region(mem->start, mem_size); | ||
237 | |||
238 | return err; | ||
239 | } | ||
240 | |||
241 | static int cc770_platform_remove(struct platform_device *pdev) | ||
242 | { | ||
243 | struct net_device *dev = dev_get_drvdata(&pdev->dev); | ||
244 | struct cc770_priv *priv = netdev_priv(dev); | ||
245 | struct resource *mem; | ||
246 | |||
247 | unregister_cc770dev(dev); | ||
248 | iounmap(priv->reg_base); | ||
249 | free_cc770dev(dev); | ||
250 | |||
251 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
252 | release_mem_region(mem->start, resource_size(mem)); | ||
253 | |||
254 | return 0; | ||
255 | } | ||
256 | |||
257 | static struct of_device_id cc770_platform_table[] = { | ||
258 | {.compatible = "bosch,cc770"}, /* CC770 from Bosch */ | ||
259 | {.compatible = "intc,82527"}, /* AN82527 from Intel CP */ | ||
260 | {}, | ||
261 | }; | ||
262 | MODULE_DEVICE_TABLE(of, cc770_platform_table); | ||
263 | |||
264 | static struct platform_driver cc770_platform_driver = { | ||
265 | .driver = { | ||
266 | .name = DRV_NAME, | ||
267 | .owner = THIS_MODULE, | ||
268 | .of_match_table = cc770_platform_table, | ||
269 | }, | ||
270 | .probe = cc770_platform_probe, | ||
271 | .remove = cc770_platform_remove, | ||
272 | }; | ||
273 | |||
274 | module_platform_driver(cc770_platform_driver); | ||
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index 8233e5ed293..9bf1116e5b5 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c | |||
@@ -33,39 +33,6 @@ MODULE_DESCRIPTION(MOD_DESC); | |||
33 | MODULE_LICENSE("GPL v2"); | 33 | MODULE_LICENSE("GPL v2"); |
34 | MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>"); | 34 | MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>"); |
35 | 35 | ||
36 | /* CAN DLC to real data length conversion helpers */ | ||
37 | |||
38 | static const u8 dlc2len[] = {0, 1, 2, 3, 4, 5, 6, 7, | ||
39 | 8, 12, 16, 20, 24, 32, 48, 64}; | ||
40 | |||
41 | /* get data length from can_dlc with sanitized can_dlc */ | ||
42 | u8 can_dlc2len(u8 can_dlc) | ||
43 | { | ||
44 | return dlc2len[can_dlc & 0x0F]; | ||
45 | } | ||
46 | EXPORT_SYMBOL_GPL(can_dlc2len); | ||
47 | |||
48 | static const u8 len2dlc[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, /* 0 - 8 */ | ||
49 | 9, 9, 9, 9, /* 9 - 12 */ | ||
50 | 10, 10, 10, 10, /* 13 - 16 */ | ||
51 | 11, 11, 11, 11, /* 17 - 20 */ | ||
52 | 12, 12, 12, 12, /* 21 - 24 */ | ||
53 | 13, 13, 13, 13, 13, 13, 13, 13, /* 25 - 32 */ | ||
54 | 14, 14, 14, 14, 14, 14, 14, 14, /* 33 - 40 */ | ||
55 | 14, 14, 14, 14, 14, 14, 14, 14, /* 41 - 48 */ | ||
56 | 15, 15, 15, 15, 15, 15, 15, 15, /* 49 - 56 */ | ||
57 | 15, 15, 15, 15, 15, 15, 15, 15}; /* 57 - 64 */ | ||
58 | |||
59 | /* map the sanitized data length to an appropriate data length code */ | ||
60 | u8 can_len2dlc(u8 len) | ||
61 | { | ||
62 | if (unlikely(len > 64)) | ||
63 | return 0xF; | ||
64 | |||
65 | return len2dlc[len]; | ||
66 | } | ||
67 | EXPORT_SYMBOL_GPL(can_len2dlc); | ||
68 | |||
69 | #ifdef CONFIG_CAN_CALC_BITTIMING | 36 | #ifdef CONFIG_CAN_CALC_BITTIMING |
70 | #define CAN_CALC_MAX_ERROR 50 /* in one-tenth of a percent */ | 37 | #define CAN_CALC_MAX_ERROR 50 /* in one-tenth of a percent */ |
71 | 38 | ||
@@ -163,13 +130,13 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt) | |||
163 | /* Error in one-tenth of a percent */ | 130 | /* Error in one-tenth of a percent */ |
164 | error = (best_error * 1000) / bt->bitrate; | 131 | error = (best_error * 1000) / bt->bitrate; |
165 | if (error > CAN_CALC_MAX_ERROR) { | 132 | if (error > CAN_CALC_MAX_ERROR) { |
166 | netdev_err(dev, | 133 | dev_err(dev->dev.parent, |
167 | "bitrate error %ld.%ld%% too high\n", | 134 | "bitrate error %ld.%ld%% too high\n", |
168 | error / 10, error % 10); | 135 | error / 10, error % 10); |
169 | return -EDOM; | 136 | return -EDOM; |
170 | } else { | 137 | } else { |
171 | netdev_warn(dev, "bitrate error %ld.%ld%%\n", | 138 | dev_warn(dev->dev.parent, "bitrate error %ld.%ld%%\n", |
172 | error / 10, error % 10); | 139 | error / 10, error % 10); |
173 | } | 140 | } |
174 | } | 141 | } |
175 | 142 | ||
@@ -183,19 +150,7 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt) | |||
183 | bt->prop_seg = tseg1 / 2; | 150 | bt->prop_seg = tseg1 / 2; |
184 | bt->phase_seg1 = tseg1 - bt->prop_seg; | 151 | bt->phase_seg1 = tseg1 - bt->prop_seg; |
185 | bt->phase_seg2 = tseg2; | 152 | bt->phase_seg2 = tseg2; |
186 | 153 | bt->sjw = 1; | |
187 | /* check for sjw user settings */ | ||
188 | if (!bt->sjw || !btc->sjw_max) | ||
189 | bt->sjw = 1; | ||
190 | else { | ||
191 | /* bt->sjw is at least 1 -> sanitize upper bound to sjw_max */ | ||
192 | if (bt->sjw > btc->sjw_max) | ||
193 | bt->sjw = btc->sjw_max; | ||
194 | /* bt->sjw must not be higher than tseg2 */ | ||
195 | if (tseg2 < bt->sjw) | ||
196 | bt->sjw = tseg2; | ||
197 | } | ||
198 | |||
199 | bt->brp = best_brp; | 154 | bt->brp = best_brp; |
200 | /* real bit-rate */ | 155 | /* real bit-rate */ |
201 | bt->bitrate = priv->clock.freq / (bt->brp * (tseg1 + tseg2 + 1)); | 156 | bt->bitrate = priv->clock.freq / (bt->brp * (tseg1 + tseg2 + 1)); |
@@ -205,7 +160,7 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt) | |||
205 | #else /* !CONFIG_CAN_CALC_BITTIMING */ | 160 | #else /* !CONFIG_CAN_CALC_BITTIMING */ |
206 | static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt) | 161 | static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt) |
207 | { | 162 | { |
208 | netdev_err(dev, "bit-timing calculation not available\n"); | 163 | dev_err(dev->dev.parent, "bit-timing calculation not available\n"); |
209 | return -EINVAL; | 164 | return -EINVAL; |
210 | } | 165 | } |
211 | #endif /* CONFIG_CAN_CALC_BITTIMING */ | 166 | #endif /* CONFIG_CAN_CALC_BITTIMING */ |
@@ -346,7 +301,8 @@ void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev, | |||
346 | priv->echo_skb[idx] = skb; | 301 | priv->echo_skb[idx] = skb; |
347 | } else { | 302 | } else { |
348 | /* locking problem with netif_stop_queue() ?? */ | 303 | /* locking problem with netif_stop_queue() ?? */ |
349 | netdev_err(dev, "%s: BUG! echo_skb is occupied!\n", __func__); | 304 | dev_err(dev->dev.parent, "%s: BUG! echo_skb is occupied!\n", |
305 | __func__); | ||
350 | kfree_skb(skb); | 306 | kfree_skb(skb); |
351 | } | 307 | } |
352 | } | 308 | } |
@@ -359,24 +315,16 @@ EXPORT_SYMBOL_GPL(can_put_echo_skb); | |||
359 | * is handled in the device driver. The driver must protect | 315 | * is handled in the device driver. The driver must protect |
360 | * access to priv->echo_skb, if necessary. | 316 | * access to priv->echo_skb, if necessary. |
361 | */ | 317 | */ |
362 | unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx) | 318 | void can_get_echo_skb(struct net_device *dev, unsigned int idx) |
363 | { | 319 | { |
364 | struct can_priv *priv = netdev_priv(dev); | 320 | struct can_priv *priv = netdev_priv(dev); |
365 | 321 | ||
366 | BUG_ON(idx >= priv->echo_skb_max); | 322 | BUG_ON(idx >= priv->echo_skb_max); |
367 | 323 | ||
368 | if (priv->echo_skb[idx]) { | 324 | if (priv->echo_skb[idx]) { |
369 | struct sk_buff *skb = priv->echo_skb[idx]; | ||
370 | struct can_frame *cf = (struct can_frame *)skb->data; | ||
371 | u8 dlc = cf->can_dlc; | ||
372 | |||
373 | netif_rx(priv->echo_skb[idx]); | 325 | netif_rx(priv->echo_skb[idx]); |
374 | priv->echo_skb[idx] = NULL; | 326 | priv->echo_skb[idx] = NULL; |
375 | |||
376 | return dlc; | ||
377 | } | 327 | } |
378 | |||
379 | return 0; | ||
380 | } | 328 | } |
381 | EXPORT_SYMBOL_GPL(can_get_echo_skb); | 329 | EXPORT_SYMBOL_GPL(can_get_echo_skb); |
382 | 330 | ||
@@ -401,7 +349,7 @@ EXPORT_SYMBOL_GPL(can_free_echo_skb); | |||
401 | /* | 349 | /* |
402 | * CAN device restart for bus-off recovery | 350 | * CAN device restart for bus-off recovery |
403 | */ | 351 | */ |
404 | static void can_restart(unsigned long data) | 352 | void can_restart(unsigned long data) |
405 | { | 353 | { |
406 | struct net_device *dev = (struct net_device *)data; | 354 | struct net_device *dev = (struct net_device *)data; |
407 | struct can_priv *priv = netdev_priv(dev); | 355 | struct can_priv *priv = netdev_priv(dev); |
@@ -432,7 +380,7 @@ static void can_restart(unsigned long data) | |||
432 | stats->rx_bytes += cf->can_dlc; | 380 | stats->rx_bytes += cf->can_dlc; |
433 | 381 | ||
434 | restart: | 382 | restart: |
435 | netdev_dbg(dev, "restarted\n"); | 383 | dev_dbg(dev->dev.parent, "restarted\n"); |
436 | priv->can_stats.restarts++; | 384 | priv->can_stats.restarts++; |
437 | 385 | ||
438 | /* Now restart the device */ | 386 | /* Now restart the device */ |
@@ -440,7 +388,7 @@ restart: | |||
440 | 388 | ||
441 | netif_carrier_on(dev); | 389 | netif_carrier_on(dev); |
442 | if (err) | 390 | if (err) |
443 | netdev_err(dev, "Error %d during restart", err); | 391 | dev_err(dev->dev.parent, "Error %d during restart", err); |
444 | } | 392 | } |
445 | 393 | ||
446 | int can_restart_now(struct net_device *dev) | 394 | int can_restart_now(struct net_device *dev) |
@@ -473,7 +421,7 @@ void can_bus_off(struct net_device *dev) | |||
473 | { | 421 | { |
474 | struct can_priv *priv = netdev_priv(dev); | 422 | struct can_priv *priv = netdev_priv(dev); |
475 | 423 | ||
476 | netdev_dbg(dev, "bus-off\n"); | 424 | dev_dbg(dev->dev.parent, "bus-off\n"); |
477 | 425 | ||
478 | netif_carrier_off(dev); | 426 | netif_carrier_off(dev); |
479 | priv->can_stats.bus_off++; | 427 | priv->can_stats.bus_off++; |
@@ -487,14 +435,14 @@ EXPORT_SYMBOL_GPL(can_bus_off); | |||
487 | static void can_setup(struct net_device *dev) | 435 | static void can_setup(struct net_device *dev) |
488 | { | 436 | { |
489 | dev->type = ARPHRD_CAN; | 437 | dev->type = ARPHRD_CAN; |
490 | dev->mtu = CAN_MTU; | 438 | dev->mtu = sizeof(struct can_frame); |
491 | dev->hard_header_len = 0; | 439 | dev->hard_header_len = 0; |
492 | dev->addr_len = 0; | 440 | dev->addr_len = 0; |
493 | dev->tx_queue_len = 10; | 441 | dev->tx_queue_len = 10; |
494 | 442 | ||
495 | /* New-style flags. */ | 443 | /* New-style flags. */ |
496 | dev->flags = IFF_NOARP; | 444 | dev->flags = IFF_NOARP; |
497 | dev->features = NETIF_F_HW_CSUM; | 445 | dev->features = NETIF_F_NO_CSUM; |
498 | } | 446 | } |
499 | 447 | ||
500 | struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf) | 448 | struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf) |
@@ -585,7 +533,7 @@ int open_candev(struct net_device *dev) | |||
585 | struct can_priv *priv = netdev_priv(dev); | 533 | struct can_priv *priv = netdev_priv(dev); |
586 | 534 | ||
587 | if (!priv->bittiming.tq && !priv->bittiming.bitrate) { | 535 | if (!priv->bittiming.tq && !priv->bittiming.bitrate) { |
588 | netdev_err(dev, "bit-timing not yet defined\n"); | 536 | dev_err(dev->dev.parent, "bit-timing not yet defined\n"); |
589 | return -EINVAL; | 537 | return -EINVAL; |
590 | } | 538 | } |
591 | 539 | ||
@@ -609,7 +557,8 @@ void close_candev(struct net_device *dev) | |||
609 | { | 557 | { |
610 | struct can_priv *priv = netdev_priv(dev); | 558 | struct can_priv *priv = netdev_priv(dev); |
611 | 559 | ||
612 | del_timer_sync(&priv->restart_timer); | 560 | if (del_timer_sync(&priv->restart_timer)) |
561 | dev_put(dev); | ||
613 | can_flush_echo_skb(dev); | 562 | can_flush_echo_skb(dev); |
614 | } | 563 | } |
615 | EXPORT_SYMBOL_GPL(close_candev); | 564 | EXPORT_SYMBOL_GPL(close_candev); |
@@ -719,19 +668,18 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev) | |||
719 | 668 | ||
720 | if (priv->do_get_state) | 669 | if (priv->do_get_state) |
721 | priv->do_get_state(dev, &state); | 670 | priv->do_get_state(dev, &state); |
722 | if (nla_put_u32(skb, IFLA_CAN_STATE, state) || | 671 | NLA_PUT_U32(skb, IFLA_CAN_STATE, state); |
723 | nla_put(skb, IFLA_CAN_CTRLMODE, sizeof(cm), &cm) || | 672 | NLA_PUT(skb, IFLA_CAN_CTRLMODE, sizeof(cm), &cm); |
724 | nla_put_u32(skb, IFLA_CAN_RESTART_MS, priv->restart_ms) || | 673 | NLA_PUT_U32(skb, IFLA_CAN_RESTART_MS, priv->restart_ms); |
725 | nla_put(skb, IFLA_CAN_BITTIMING, | 674 | NLA_PUT(skb, IFLA_CAN_BITTIMING, |
726 | sizeof(priv->bittiming), &priv->bittiming) || | 675 | sizeof(priv->bittiming), &priv->bittiming); |
727 | nla_put(skb, IFLA_CAN_CLOCK, sizeof(cm), &priv->clock) || | 676 | NLA_PUT(skb, IFLA_CAN_CLOCK, sizeof(cm), &priv->clock); |
728 | (priv->do_get_berr_counter && | 677 | if (priv->do_get_berr_counter && !priv->do_get_berr_counter(dev, &bec)) |
729 | !priv->do_get_berr_counter(dev, &bec) && | 678 | NLA_PUT(skb, IFLA_CAN_BERR_COUNTER, sizeof(bec), &bec); |
730 | nla_put(skb, IFLA_CAN_BERR_COUNTER, sizeof(bec), &bec)) || | 679 | if (priv->bittiming_const) |
731 | (priv->bittiming_const && | 680 | NLA_PUT(skb, IFLA_CAN_BITTIMING_CONST, |
732 | nla_put(skb, IFLA_CAN_BITTIMING_CONST, | 681 | sizeof(*priv->bittiming_const), priv->bittiming_const); |
733 | sizeof(*priv->bittiming_const), priv->bittiming_const))) | 682 | |
734 | goto nla_put_failure; | ||
735 | return 0; | 683 | return 0; |
736 | 684 | ||
737 | nla_put_failure: | 685 | nla_put_failure: |
@@ -747,9 +695,9 @@ static int can_fill_xstats(struct sk_buff *skb, const struct net_device *dev) | |||
747 | { | 695 | { |
748 | struct can_priv *priv = netdev_priv(dev); | 696 | struct can_priv *priv = netdev_priv(dev); |
749 | 697 | ||
750 | if (nla_put(skb, IFLA_INFO_XSTATS, | 698 | NLA_PUT(skb, IFLA_INFO_XSTATS, |
751 | sizeof(priv->can_stats), &priv->can_stats)) | 699 | sizeof(priv->can_stats), &priv->can_stats); |
752 | goto nla_put_failure; | 700 | |
753 | return 0; | 701 | return 0; |
754 | 702 | ||
755 | nla_put_failure: | 703 | nla_put_failure: |
diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index 0289a6d86f6..17678117ed6 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c | |||
@@ -33,10 +33,9 @@ | |||
33 | #include <linux/kernel.h> | 33 | #include <linux/kernel.h> |
34 | #include <linux/list.h> | 34 | #include <linux/list.h> |
35 | #include <linux/module.h> | 35 | #include <linux/module.h> |
36 | #include <linux/of.h> | ||
37 | #include <linux/of_device.h> | ||
38 | #include <linux/platform_device.h> | 36 | #include <linux/platform_device.h> |
39 | #include <linux/pinctrl/consumer.h> | 37 | |
38 | #include <mach/clock.h> | ||
40 | 39 | ||
41 | #define DRV_NAME "flexcan" | 40 | #define DRV_NAME "flexcan" |
42 | 41 | ||
@@ -120,9 +119,6 @@ | |||
120 | (FLEXCAN_ESR_TWRN_INT | FLEXCAN_ESR_RWRN_INT | FLEXCAN_ESR_BOFF_INT) | 119 | (FLEXCAN_ESR_TWRN_INT | FLEXCAN_ESR_RWRN_INT | FLEXCAN_ESR_BOFF_INT) |
121 | #define FLEXCAN_ESR_ERR_ALL \ | 120 | #define FLEXCAN_ESR_ERR_ALL \ |
122 | (FLEXCAN_ESR_ERR_BUS | FLEXCAN_ESR_ERR_STATE) | 121 | (FLEXCAN_ESR_ERR_BUS | FLEXCAN_ESR_ERR_STATE) |
123 | #define FLEXCAN_ESR_ALL_INT \ | ||
124 | (FLEXCAN_ESR_TWRN_INT | FLEXCAN_ESR_RWRN_INT | \ | ||
125 | FLEXCAN_ESR_BOFF_INT | FLEXCAN_ESR_ERR_INT) | ||
126 | 122 | ||
127 | /* FLEXCAN interrupt flag register (IFLAG) bits */ | 123 | /* FLEXCAN interrupt flag register (IFLAG) bits */ |
128 | #define FLEXCAN_TX_BUF_ID 8 | 124 | #define FLEXCAN_TX_BUF_ID 8 |
@@ -144,23 +140,6 @@ | |||
144 | 140 | ||
145 | #define FLEXCAN_MB_CODE_MASK (0xf0ffffff) | 141 | #define FLEXCAN_MB_CODE_MASK (0xf0ffffff) |
146 | 142 | ||
147 | /* | ||
148 | * FLEXCAN hardware feature flags | ||
149 | * | ||
150 | * Below is some version info we got: | ||
151 | * SOC Version IP-Version Glitch- [TR]WRN_INT | ||
152 | * Filter? connected? | ||
153 | * MX25 FlexCAN2 03.00.00.00 no no | ||
154 | * MX28 FlexCAN2 03.00.04.00 yes yes | ||
155 | * MX35 FlexCAN2 03.00.00.00 no no | ||
156 | * MX53 FlexCAN2 03.00.00.00 yes no | ||
157 | * MX6s FlexCAN3 10.00.12.00 yes yes | ||
158 | * | ||
159 | * Some SOCs do not have the RX_WARN & TX_WARN interrupt line connected. | ||
160 | */ | ||
161 | #define FLEXCAN_HAS_V10_FEATURES BIT(1) /* For core version >= 10 */ | ||
162 | #define FLEXCAN_HAS_BROKEN_ERR_STATE BIT(2) /* [TR]WRN_INT not connected */ | ||
163 | |||
164 | /* Structure of the message buffer */ | 143 | /* Structure of the message buffer */ |
165 | struct flexcan_mb { | 144 | struct flexcan_mb { |
166 | u32 can_ctrl; | 145 | u32 can_ctrl; |
@@ -183,21 +162,10 @@ struct flexcan_regs { | |||
183 | u32 imask1; /* 0x28 */ | 162 | u32 imask1; /* 0x28 */ |
184 | u32 iflag2; /* 0x2c */ | 163 | u32 iflag2; /* 0x2c */ |
185 | u32 iflag1; /* 0x30 */ | 164 | u32 iflag1; /* 0x30 */ |
186 | u32 crl2; /* 0x34 */ | 165 | u32 _reserved2[19]; |
187 | u32 esr2; /* 0x38 */ | ||
188 | u32 imeur; /* 0x3c */ | ||
189 | u32 lrfr; /* 0x40 */ | ||
190 | u32 crcr; /* 0x44 */ | ||
191 | u32 rxfgmask; /* 0x48 */ | ||
192 | u32 rxfir; /* 0x4c */ | ||
193 | u32 _reserved3[12]; | ||
194 | struct flexcan_mb cantxfg[64]; | 166 | struct flexcan_mb cantxfg[64]; |
195 | }; | 167 | }; |
196 | 168 | ||
197 | struct flexcan_devtype_data { | ||
198 | u32 features; /* hardware controller features */ | ||
199 | }; | ||
200 | |||
201 | struct flexcan_priv { | 169 | struct flexcan_priv { |
202 | struct can_priv can; | 170 | struct can_priv can; |
203 | struct net_device *dev; | 171 | struct net_device *dev; |
@@ -207,21 +175,11 @@ struct flexcan_priv { | |||
207 | u32 reg_esr; | 175 | u32 reg_esr; |
208 | u32 reg_ctrl_default; | 176 | u32 reg_ctrl_default; |
209 | 177 | ||
210 | struct clk *clk_ipg; | 178 | struct clk *clk; |
211 | struct clk *clk_per; | ||
212 | struct flexcan_platform_data *pdata; | 179 | struct flexcan_platform_data *pdata; |
213 | const struct flexcan_devtype_data *devtype_data; | ||
214 | }; | 180 | }; |
215 | 181 | ||
216 | static struct flexcan_devtype_data fsl_p1010_devtype_data = { | 182 | static struct can_bittiming_const flexcan_bittiming_const = { |
217 | .features = FLEXCAN_HAS_BROKEN_ERR_STATE, | ||
218 | }; | ||
219 | static struct flexcan_devtype_data fsl_imx28_devtype_data; | ||
220 | static struct flexcan_devtype_data fsl_imx6q_devtype_data = { | ||
221 | .features = FLEXCAN_HAS_V10_FEATURES, | ||
222 | }; | ||
223 | |||
224 | static const struct can_bittiming_const flexcan_bittiming_const = { | ||
225 | .name = DRV_NAME, | 183 | .name = DRV_NAME, |
226 | .tseg1_min = 4, | 184 | .tseg1_min = 4, |
227 | .tseg1_max = 16, | 185 | .tseg1_max = 16, |
@@ -234,31 +192,6 @@ static const struct can_bittiming_const flexcan_bittiming_const = { | |||
234 | }; | 192 | }; |
235 | 193 | ||
236 | /* | 194 | /* |
237 | * Abstract off the read/write for arm versus ppc. | ||
238 | */ | ||
239 | #if defined(__BIG_ENDIAN) | ||
240 | static inline u32 flexcan_read(void __iomem *addr) | ||
241 | { | ||
242 | return in_be32(addr); | ||
243 | } | ||
244 | |||
245 | static inline void flexcan_write(u32 val, void __iomem *addr) | ||
246 | { | ||
247 | out_be32(addr, val); | ||
248 | } | ||
249 | #else | ||
250 | static inline u32 flexcan_read(void __iomem *addr) | ||
251 | { | ||
252 | return readl(addr); | ||
253 | } | ||
254 | |||
255 | static inline void flexcan_write(u32 val, void __iomem *addr) | ||
256 | { | ||
257 | writel(val, addr); | ||
258 | } | ||
259 | #endif | ||
260 | |||
261 | /* | ||
262 | * Swtich transceiver on or off | 195 | * Swtich transceiver on or off |
263 | */ | 196 | */ |
264 | static void flexcan_transceiver_switch(const struct flexcan_priv *priv, int on) | 197 | static void flexcan_transceiver_switch(const struct flexcan_priv *priv, int on) |
@@ -279,9 +212,9 @@ static inline void flexcan_chip_enable(struct flexcan_priv *priv) | |||
279 | struct flexcan_regs __iomem *regs = priv->base; | 212 | struct flexcan_regs __iomem *regs = priv->base; |
280 | u32 reg; | 213 | u32 reg; |
281 | 214 | ||
282 | reg = flexcan_read(®s->mcr); | 215 | reg = readl(®s->mcr); |
283 | reg &= ~FLEXCAN_MCR_MDIS; | 216 | reg &= ~FLEXCAN_MCR_MDIS; |
284 | flexcan_write(reg, ®s->mcr); | 217 | writel(reg, ®s->mcr); |
285 | 218 | ||
286 | udelay(10); | 219 | udelay(10); |
287 | } | 220 | } |
@@ -291,9 +224,9 @@ static inline void flexcan_chip_disable(struct flexcan_priv *priv) | |||
291 | struct flexcan_regs __iomem *regs = priv->base; | 224 | struct flexcan_regs __iomem *regs = priv->base; |
292 | u32 reg; | 225 | u32 reg; |
293 | 226 | ||
294 | reg = flexcan_read(®s->mcr); | 227 | reg = readl(®s->mcr); |
295 | reg |= FLEXCAN_MCR_MDIS; | 228 | reg |= FLEXCAN_MCR_MDIS; |
296 | flexcan_write(reg, ®s->mcr); | 229 | writel(reg, ®s->mcr); |
297 | } | 230 | } |
298 | 231 | ||
299 | static int flexcan_get_berr_counter(const struct net_device *dev, | 232 | static int flexcan_get_berr_counter(const struct net_device *dev, |
@@ -301,7 +234,7 @@ static int flexcan_get_berr_counter(const struct net_device *dev, | |||
301 | { | 234 | { |
302 | const struct flexcan_priv *priv = netdev_priv(dev); | 235 | const struct flexcan_priv *priv = netdev_priv(dev); |
303 | struct flexcan_regs __iomem *regs = priv->base; | 236 | struct flexcan_regs __iomem *regs = priv->base; |
304 | u32 reg = flexcan_read(®s->ecr); | 237 | u32 reg = readl(®s->ecr); |
305 | 238 | ||
306 | bec->txerr = (reg >> 0) & 0xff; | 239 | bec->txerr = (reg >> 0) & 0xff; |
307 | bec->rxerr = (reg >> 8) & 0xff; | 240 | bec->rxerr = (reg >> 8) & 0xff; |
@@ -312,6 +245,7 @@ static int flexcan_get_berr_counter(const struct net_device *dev, | |||
312 | static int flexcan_start_xmit(struct sk_buff *skb, struct net_device *dev) | 245 | static int flexcan_start_xmit(struct sk_buff *skb, struct net_device *dev) |
313 | { | 246 | { |
314 | const struct flexcan_priv *priv = netdev_priv(dev); | 247 | const struct flexcan_priv *priv = netdev_priv(dev); |
248 | struct net_device_stats *stats = &dev->stats; | ||
315 | struct flexcan_regs __iomem *regs = priv->base; | 249 | struct flexcan_regs __iomem *regs = priv->base; |
316 | struct can_frame *cf = (struct can_frame *)skb->data; | 250 | struct can_frame *cf = (struct can_frame *)skb->data; |
317 | u32 can_id; | 251 | u32 can_id; |
@@ -334,17 +268,20 @@ static int flexcan_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
334 | 268 | ||
335 | if (cf->can_dlc > 0) { | 269 | if (cf->can_dlc > 0) { |
336 | u32 data = be32_to_cpup((__be32 *)&cf->data[0]); | 270 | u32 data = be32_to_cpup((__be32 *)&cf->data[0]); |
337 | flexcan_write(data, ®s->cantxfg[FLEXCAN_TX_BUF_ID].data[0]); | 271 | writel(data, ®s->cantxfg[FLEXCAN_TX_BUF_ID].data[0]); |
338 | } | 272 | } |
339 | if (cf->can_dlc > 3) { | 273 | if (cf->can_dlc > 3) { |
340 | u32 data = be32_to_cpup((__be32 *)&cf->data[4]); | 274 | u32 data = be32_to_cpup((__be32 *)&cf->data[4]); |
341 | flexcan_write(data, ®s->cantxfg[FLEXCAN_TX_BUF_ID].data[1]); | 275 | writel(data, ®s->cantxfg[FLEXCAN_TX_BUF_ID].data[1]); |
342 | } | 276 | } |
343 | 277 | ||
344 | can_put_echo_skb(skb, dev, 0); | 278 | writel(can_id, ®s->cantxfg[FLEXCAN_TX_BUF_ID].can_id); |
279 | writel(ctrl, ®s->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl); | ||
345 | 280 | ||
346 | flexcan_write(can_id, ®s->cantxfg[FLEXCAN_TX_BUF_ID].can_id); | 281 | kfree_skb(skb); |
347 | flexcan_write(ctrl, ®s->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl); | 282 | |
283 | /* tx_packets is incremented in flexcan_irq */ | ||
284 | stats->tx_bytes += cf->can_dlc; | ||
348 | 285 | ||
349 | return NETDEV_TX_OK; | 286 | return NETDEV_TX_OK; |
350 | } | 287 | } |
@@ -358,34 +295,34 @@ static void do_bus_err(struct net_device *dev, | |||
358 | cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; | 295 | cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; |
359 | 296 | ||
360 | if (reg_esr & FLEXCAN_ESR_BIT1_ERR) { | 297 | if (reg_esr & FLEXCAN_ESR_BIT1_ERR) { |
361 | netdev_dbg(dev, "BIT1_ERR irq\n"); | 298 | dev_dbg(dev->dev.parent, "BIT1_ERR irq\n"); |
362 | cf->data[2] |= CAN_ERR_PROT_BIT1; | 299 | cf->data[2] |= CAN_ERR_PROT_BIT1; |
363 | tx_errors = 1; | 300 | tx_errors = 1; |
364 | } | 301 | } |
365 | if (reg_esr & FLEXCAN_ESR_BIT0_ERR) { | 302 | if (reg_esr & FLEXCAN_ESR_BIT0_ERR) { |
366 | netdev_dbg(dev, "BIT0_ERR irq\n"); | 303 | dev_dbg(dev->dev.parent, "BIT0_ERR irq\n"); |
367 | cf->data[2] |= CAN_ERR_PROT_BIT0; | 304 | cf->data[2] |= CAN_ERR_PROT_BIT0; |
368 | tx_errors = 1; | 305 | tx_errors = 1; |
369 | } | 306 | } |
370 | if (reg_esr & FLEXCAN_ESR_ACK_ERR) { | 307 | if (reg_esr & FLEXCAN_ESR_ACK_ERR) { |
371 | netdev_dbg(dev, "ACK_ERR irq\n"); | 308 | dev_dbg(dev->dev.parent, "ACK_ERR irq\n"); |
372 | cf->can_id |= CAN_ERR_ACK; | 309 | cf->can_id |= CAN_ERR_ACK; |
373 | cf->data[3] |= CAN_ERR_PROT_LOC_ACK; | 310 | cf->data[3] |= CAN_ERR_PROT_LOC_ACK; |
374 | tx_errors = 1; | 311 | tx_errors = 1; |
375 | } | 312 | } |
376 | if (reg_esr & FLEXCAN_ESR_CRC_ERR) { | 313 | if (reg_esr & FLEXCAN_ESR_CRC_ERR) { |
377 | netdev_dbg(dev, "CRC_ERR irq\n"); | 314 | dev_dbg(dev->dev.parent, "CRC_ERR irq\n"); |
378 | cf->data[2] |= CAN_ERR_PROT_BIT; | 315 | cf->data[2] |= CAN_ERR_PROT_BIT; |
379 | cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ; | 316 | cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ; |
380 | rx_errors = 1; | 317 | rx_errors = 1; |
381 | } | 318 | } |
382 | if (reg_esr & FLEXCAN_ESR_FRM_ERR) { | 319 | if (reg_esr & FLEXCAN_ESR_FRM_ERR) { |
383 | netdev_dbg(dev, "FRM_ERR irq\n"); | 320 | dev_dbg(dev->dev.parent, "FRM_ERR irq\n"); |
384 | cf->data[2] |= CAN_ERR_PROT_FORM; | 321 | cf->data[2] |= CAN_ERR_PROT_FORM; |
385 | rx_errors = 1; | 322 | rx_errors = 1; |
386 | } | 323 | } |
387 | if (reg_esr & FLEXCAN_ESR_STF_ERR) { | 324 | if (reg_esr & FLEXCAN_ESR_STF_ERR) { |
388 | netdev_dbg(dev, "STF_ERR irq\n"); | 325 | dev_dbg(dev->dev.parent, "STF_ERR irq\n"); |
389 | cf->data[2] |= CAN_ERR_PROT_STUFF; | 326 | cf->data[2] |= CAN_ERR_PROT_STUFF; |
390 | rx_errors = 1; | 327 | rx_errors = 1; |
391 | } | 328 | } |
@@ -432,7 +369,7 @@ static void do_state(struct net_device *dev, | |||
432 | */ | 369 | */ |
433 | if (new_state >= CAN_STATE_ERROR_WARNING && | 370 | if (new_state >= CAN_STATE_ERROR_WARNING && |
434 | new_state <= CAN_STATE_BUS_OFF) { | 371 | new_state <= CAN_STATE_BUS_OFF) { |
435 | netdev_dbg(dev, "Error Warning IRQ\n"); | 372 | dev_dbg(dev->dev.parent, "Error Warning IRQ\n"); |
436 | priv->can.can_stats.error_warning++; | 373 | priv->can.can_stats.error_warning++; |
437 | 374 | ||
438 | cf->can_id |= CAN_ERR_CRTL; | 375 | cf->can_id |= CAN_ERR_CRTL; |
@@ -448,7 +385,7 @@ static void do_state(struct net_device *dev, | |||
448 | */ | 385 | */ |
449 | if (new_state >= CAN_STATE_ERROR_PASSIVE && | 386 | if (new_state >= CAN_STATE_ERROR_PASSIVE && |
450 | new_state <= CAN_STATE_BUS_OFF) { | 387 | new_state <= CAN_STATE_BUS_OFF) { |
451 | netdev_dbg(dev, "Error Passive IRQ\n"); | 388 | dev_dbg(dev->dev.parent, "Error Passive IRQ\n"); |
452 | priv->can.can_stats.error_passive++; | 389 | priv->can.can_stats.error_passive++; |
453 | 390 | ||
454 | cf->can_id |= CAN_ERR_CRTL; | 391 | cf->can_id |= CAN_ERR_CRTL; |
@@ -458,8 +395,8 @@ static void do_state(struct net_device *dev, | |||
458 | } | 395 | } |
459 | break; | 396 | break; |
460 | case CAN_STATE_BUS_OFF: | 397 | case CAN_STATE_BUS_OFF: |
461 | netdev_err(dev, "BUG! " | 398 | dev_err(dev->dev.parent, |
462 | "hardware recovered automatically from BUS_OFF\n"); | 399 | "BUG! hardware recovered automatically from BUS_OFF\n"); |
463 | break; | 400 | break; |
464 | default: | 401 | default: |
465 | break; | 402 | break; |
@@ -468,7 +405,7 @@ static void do_state(struct net_device *dev, | |||
468 | /* process state changes depending on the new state */ | 405 | /* process state changes depending on the new state */ |
469 | switch (new_state) { | 406 | switch (new_state) { |
470 | case CAN_STATE_ERROR_ACTIVE: | 407 | case CAN_STATE_ERROR_ACTIVE: |
471 | netdev_dbg(dev, "Error Active\n"); | 408 | dev_dbg(dev->dev.parent, "Error Active\n"); |
472 | cf->can_id |= CAN_ERR_PROT; | 409 | cf->can_id |= CAN_ERR_PROT; |
473 | cf->data[2] = CAN_ERR_PROT_ACTIVE; | 410 | cf->data[2] = CAN_ERR_PROT_ACTIVE; |
474 | break; | 411 | break; |
@@ -527,8 +464,8 @@ static void flexcan_read_fifo(const struct net_device *dev, | |||
527 | struct flexcan_mb __iomem *mb = ®s->cantxfg[0]; | 464 | struct flexcan_mb __iomem *mb = ®s->cantxfg[0]; |
528 | u32 reg_ctrl, reg_id; | 465 | u32 reg_ctrl, reg_id; |
529 | 466 | ||
530 | reg_ctrl = flexcan_read(&mb->can_ctrl); | 467 | reg_ctrl = readl(&mb->can_ctrl); |
531 | reg_id = flexcan_read(&mb->can_id); | 468 | reg_id = readl(&mb->can_id); |
532 | if (reg_ctrl & FLEXCAN_MB_CNT_IDE) | 469 | if (reg_ctrl & FLEXCAN_MB_CNT_IDE) |
533 | cf->can_id = ((reg_id >> 0) & CAN_EFF_MASK) | CAN_EFF_FLAG; | 470 | cf->can_id = ((reg_id >> 0) & CAN_EFF_MASK) | CAN_EFF_FLAG; |
534 | else | 471 | else |
@@ -538,12 +475,12 @@ static void flexcan_read_fifo(const struct net_device *dev, | |||
538 | cf->can_id |= CAN_RTR_FLAG; | 475 | cf->can_id |= CAN_RTR_FLAG; |
539 | cf->can_dlc = get_can_dlc((reg_ctrl >> 16) & 0xf); | 476 | cf->can_dlc = get_can_dlc((reg_ctrl >> 16) & 0xf); |
540 | 477 | ||
541 | *(__be32 *)(cf->data + 0) = cpu_to_be32(flexcan_read(&mb->data[0])); | 478 | *(__be32 *)(cf->data + 0) = cpu_to_be32(readl(&mb->data[0])); |
542 | *(__be32 *)(cf->data + 4) = cpu_to_be32(flexcan_read(&mb->data[1])); | 479 | *(__be32 *)(cf->data + 4) = cpu_to_be32(readl(&mb->data[1])); |
543 | 480 | ||
544 | /* mark as read */ | 481 | /* mark as read */ |
545 | flexcan_write(FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, ®s->iflag1); | 482 | writel(FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, ®s->iflag1); |
546 | flexcan_read(®s->timer); | 483 | readl(®s->timer); |
547 | } | 484 | } |
548 | 485 | ||
549 | static int flexcan_read_frame(struct net_device *dev) | 486 | static int flexcan_read_frame(struct net_device *dev) |
@@ -579,17 +516,17 @@ static int flexcan_poll(struct napi_struct *napi, int quota) | |||
579 | * The error bits are cleared on read, | 516 | * The error bits are cleared on read, |
580 | * use saved value from irq handler. | 517 | * use saved value from irq handler. |
581 | */ | 518 | */ |
582 | reg_esr = flexcan_read(®s->esr) | priv->reg_esr; | 519 | reg_esr = readl(®s->esr) | priv->reg_esr; |
583 | 520 | ||
584 | /* handle state changes */ | 521 | /* handle state changes */ |
585 | work_done += flexcan_poll_state(dev, reg_esr); | 522 | work_done += flexcan_poll_state(dev, reg_esr); |
586 | 523 | ||
587 | /* handle RX-FIFO */ | 524 | /* handle RX-FIFO */ |
588 | reg_iflag1 = flexcan_read(®s->iflag1); | 525 | reg_iflag1 = readl(®s->iflag1); |
589 | while (reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_AVAILABLE && | 526 | while (reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_AVAILABLE && |
590 | work_done < quota) { | 527 | work_done < quota) { |
591 | work_done += flexcan_read_frame(dev); | 528 | work_done += flexcan_read_frame(dev); |
592 | reg_iflag1 = flexcan_read(®s->iflag1); | 529 | reg_iflag1 = readl(®s->iflag1); |
593 | } | 530 | } |
594 | 531 | ||
595 | /* report bus errors */ | 532 | /* report bus errors */ |
@@ -599,8 +536,8 @@ static int flexcan_poll(struct napi_struct *napi, int quota) | |||
599 | if (work_done < quota) { | 536 | if (work_done < quota) { |
600 | napi_complete(napi); | 537 | napi_complete(napi); |
601 | /* enable IRQs */ | 538 | /* enable IRQs */ |
602 | flexcan_write(FLEXCAN_IFLAG_DEFAULT, ®s->imask1); | 539 | writel(FLEXCAN_IFLAG_DEFAULT, ®s->imask1); |
603 | flexcan_write(priv->reg_ctrl_default, ®s->ctrl); | 540 | writel(priv->reg_ctrl_default, ®s->ctrl); |
604 | } | 541 | } |
605 | 542 | ||
606 | return work_done; | 543 | return work_done; |
@@ -614,11 +551,9 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id) | |||
614 | struct flexcan_regs __iomem *regs = priv->base; | 551 | struct flexcan_regs __iomem *regs = priv->base; |
615 | u32 reg_iflag1, reg_esr; | 552 | u32 reg_iflag1, reg_esr; |
616 | 553 | ||
617 | reg_iflag1 = flexcan_read(®s->iflag1); | 554 | reg_iflag1 = readl(®s->iflag1); |
618 | reg_esr = flexcan_read(®s->esr); | 555 | reg_esr = readl(®s->esr); |
619 | /* ACK all bus error and state change IRQ sources */ | 556 | writel(FLEXCAN_ESR_ERR_INT, ®s->esr); /* ACK err IRQ */ |
620 | if (reg_esr & FLEXCAN_ESR_ALL_INT) | ||
621 | flexcan_write(reg_esr & FLEXCAN_ESR_ALL_INT, ®s->esr); | ||
622 | 557 | ||
623 | /* | 558 | /* |
624 | * schedule NAPI in case of: | 559 | * schedule NAPI in case of: |
@@ -634,25 +569,25 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id) | |||
634 | * save them for later use. | 569 | * save them for later use. |
635 | */ | 570 | */ |
636 | priv->reg_esr = reg_esr & FLEXCAN_ESR_ERR_BUS; | 571 | priv->reg_esr = reg_esr & FLEXCAN_ESR_ERR_BUS; |
637 | flexcan_write(FLEXCAN_IFLAG_DEFAULT & | 572 | writel(FLEXCAN_IFLAG_DEFAULT & ~FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, |
638 | ~FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, ®s->imask1); | 573 | ®s->imask1); |
639 | flexcan_write(priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_ALL, | 574 | writel(priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_ALL, |
640 | ®s->ctrl); | 575 | ®s->ctrl); |
641 | napi_schedule(&priv->napi); | 576 | napi_schedule(&priv->napi); |
642 | } | 577 | } |
643 | 578 | ||
644 | /* FIFO overflow */ | 579 | /* FIFO overflow */ |
645 | if (reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_OVERFLOW) { | 580 | if (reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_OVERFLOW) { |
646 | flexcan_write(FLEXCAN_IFLAG_RX_FIFO_OVERFLOW, ®s->iflag1); | 581 | writel(FLEXCAN_IFLAG_RX_FIFO_OVERFLOW, ®s->iflag1); |
647 | dev->stats.rx_over_errors++; | 582 | dev->stats.rx_over_errors++; |
648 | dev->stats.rx_errors++; | 583 | dev->stats.rx_errors++; |
649 | } | 584 | } |
650 | 585 | ||
651 | /* transmission complete interrupt */ | 586 | /* transmission complete interrupt */ |
652 | if (reg_iflag1 & (1 << FLEXCAN_TX_BUF_ID)) { | 587 | if (reg_iflag1 & (1 << FLEXCAN_TX_BUF_ID)) { |
653 | stats->tx_bytes += can_get_echo_skb(dev, 0); | 588 | /* tx_bytes is incremented in flexcan_start_xmit */ |
654 | stats->tx_packets++; | 589 | stats->tx_packets++; |
655 | flexcan_write((1 << FLEXCAN_TX_BUF_ID), ®s->iflag1); | 590 | writel((1 << FLEXCAN_TX_BUF_ID), ®s->iflag1); |
656 | netif_wake_queue(dev); | 591 | netif_wake_queue(dev); |
657 | } | 592 | } |
658 | 593 | ||
@@ -666,7 +601,7 @@ static void flexcan_set_bittiming(struct net_device *dev) | |||
666 | struct flexcan_regs __iomem *regs = priv->base; | 601 | struct flexcan_regs __iomem *regs = priv->base; |
667 | u32 reg; | 602 | u32 reg; |
668 | 603 | ||
669 | reg = flexcan_read(®s->ctrl); | 604 | reg = readl(®s->ctrl); |
670 | reg &= ~(FLEXCAN_CTRL_PRESDIV(0xff) | | 605 | reg &= ~(FLEXCAN_CTRL_PRESDIV(0xff) | |
671 | FLEXCAN_CTRL_RJW(0x3) | | 606 | FLEXCAN_CTRL_RJW(0x3) | |
672 | FLEXCAN_CTRL_PSEG1(0x7) | | 607 | FLEXCAN_CTRL_PSEG1(0x7) | |
@@ -689,12 +624,12 @@ static void flexcan_set_bittiming(struct net_device *dev) | |||
689 | if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) | 624 | if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) |
690 | reg |= FLEXCAN_CTRL_SMP; | 625 | reg |= FLEXCAN_CTRL_SMP; |
691 | 626 | ||
692 | netdev_info(dev, "writing ctrl=0x%08x\n", reg); | 627 | dev_info(dev->dev.parent, "writing ctrl=0x%08x\n", reg); |
693 | flexcan_write(reg, ®s->ctrl); | 628 | writel(reg, ®s->ctrl); |
694 | 629 | ||
695 | /* print chip status */ | 630 | /* print chip status */ |
696 | netdev_dbg(dev, "%s: mcr=0x%08x ctrl=0x%08x\n", __func__, | 631 | dev_dbg(dev->dev.parent, "%s: mcr=0x%08x ctrl=0x%08x\n", __func__, |
697 | flexcan_read(®s->mcr), flexcan_read(®s->ctrl)); | 632 | readl(®s->mcr), readl(®s->ctrl)); |
698 | } | 633 | } |
699 | 634 | ||
700 | /* | 635 | /* |
@@ -715,13 +650,14 @@ static int flexcan_chip_start(struct net_device *dev) | |||
715 | flexcan_chip_enable(priv); | 650 | flexcan_chip_enable(priv); |
716 | 651 | ||
717 | /* soft reset */ | 652 | /* soft reset */ |
718 | flexcan_write(FLEXCAN_MCR_SOFTRST, ®s->mcr); | 653 | writel(FLEXCAN_MCR_SOFTRST, ®s->mcr); |
719 | udelay(10); | 654 | udelay(10); |
720 | 655 | ||
721 | reg_mcr = flexcan_read(®s->mcr); | 656 | reg_mcr = readl(®s->mcr); |
722 | if (reg_mcr & FLEXCAN_MCR_SOFTRST) { | 657 | if (reg_mcr & FLEXCAN_MCR_SOFTRST) { |
723 | netdev_err(dev, "Failed to softreset can module (mcr=0x%08x)\n", | 658 | dev_err(dev->dev.parent, |
724 | reg_mcr); | 659 | "Failed to softreset can module (mcr=0x%08x)\n", |
660 | reg_mcr); | ||
725 | err = -ENODEV; | 661 | err = -ENODEV; |
726 | goto out; | 662 | goto out; |
727 | } | 663 | } |
@@ -737,15 +673,14 @@ static int flexcan_chip_start(struct net_device *dev) | |||
737 | * only supervisor access | 673 | * only supervisor access |
738 | * enable warning int | 674 | * enable warning int |
739 | * choose format C | 675 | * choose format C |
740 | * disable local echo | ||
741 | * | 676 | * |
742 | */ | 677 | */ |
743 | reg_mcr = flexcan_read(®s->mcr); | 678 | reg_mcr = readl(®s->mcr); |
744 | reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_FEN | FLEXCAN_MCR_HALT | | 679 | reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_FEN | FLEXCAN_MCR_HALT | |
745 | FLEXCAN_MCR_SUPV | FLEXCAN_MCR_WRN_EN | | 680 | FLEXCAN_MCR_SUPV | FLEXCAN_MCR_WRN_EN | |
746 | FLEXCAN_MCR_IDAM_C | FLEXCAN_MCR_SRX_DIS; | 681 | FLEXCAN_MCR_IDAM_C; |
747 | netdev_dbg(dev, "%s: writing mcr=0x%08x", __func__, reg_mcr); | 682 | dev_dbg(dev->dev.parent, "%s: writing mcr=0x%08x", __func__, reg_mcr); |
748 | flexcan_write(reg_mcr, ®s->mcr); | 683 | writel(reg_mcr, ®s->mcr); |
749 | 684 | ||
750 | /* | 685 | /* |
751 | * CTRL | 686 | * CTRL |
@@ -758,59 +693,51 @@ static int flexcan_chip_start(struct net_device *dev) | |||
758 | * enable tx and rx warning interrupt | 693 | * enable tx and rx warning interrupt |
759 | * enable bus off interrupt | 694 | * enable bus off interrupt |
760 | * (== FLEXCAN_CTRL_ERR_STATE) | 695 | * (== FLEXCAN_CTRL_ERR_STATE) |
696 | * | ||
697 | * _note_: we enable the "error interrupt" | ||
698 | * (FLEXCAN_CTRL_ERR_MSK), too. Otherwise we don't get any | ||
699 | * warning or bus passive interrupts. | ||
761 | */ | 700 | */ |
762 | reg_ctrl = flexcan_read(®s->ctrl); | 701 | reg_ctrl = readl(®s->ctrl); |
763 | reg_ctrl &= ~FLEXCAN_CTRL_TSYN; | 702 | reg_ctrl &= ~FLEXCAN_CTRL_TSYN; |
764 | reg_ctrl |= FLEXCAN_CTRL_BOFF_REC | FLEXCAN_CTRL_LBUF | | 703 | reg_ctrl |= FLEXCAN_CTRL_BOFF_REC | FLEXCAN_CTRL_LBUF | |
765 | FLEXCAN_CTRL_ERR_STATE; | 704 | FLEXCAN_CTRL_ERR_STATE | FLEXCAN_CTRL_ERR_MSK; |
766 | /* | ||
767 | * enable the "error interrupt" (FLEXCAN_CTRL_ERR_MSK), | ||
768 | * on most Flexcan cores, too. Otherwise we don't get | ||
769 | * any error warning or passive interrupts. | ||
770 | */ | ||
771 | if (priv->devtype_data->features & FLEXCAN_HAS_BROKEN_ERR_STATE || | ||
772 | priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) | ||
773 | reg_ctrl |= FLEXCAN_CTRL_ERR_MSK; | ||
774 | 705 | ||
775 | /* save for later use */ | 706 | /* save for later use */ |
776 | priv->reg_ctrl_default = reg_ctrl; | 707 | priv->reg_ctrl_default = reg_ctrl; |
777 | netdev_dbg(dev, "%s: writing ctrl=0x%08x", __func__, reg_ctrl); | 708 | dev_dbg(dev->dev.parent, "%s: writing ctrl=0x%08x", __func__, reg_ctrl); |
778 | flexcan_write(reg_ctrl, ®s->ctrl); | 709 | writel(reg_ctrl, ®s->ctrl); |
779 | 710 | ||
780 | for (i = 0; i < ARRAY_SIZE(regs->cantxfg); i++) { | 711 | for (i = 0; i < ARRAY_SIZE(regs->cantxfg); i++) { |
781 | flexcan_write(0, ®s->cantxfg[i].can_ctrl); | 712 | writel(0, ®s->cantxfg[i].can_ctrl); |
782 | flexcan_write(0, ®s->cantxfg[i].can_id); | 713 | writel(0, ®s->cantxfg[i].can_id); |
783 | flexcan_write(0, ®s->cantxfg[i].data[0]); | 714 | writel(0, ®s->cantxfg[i].data[0]); |
784 | flexcan_write(0, ®s->cantxfg[i].data[1]); | 715 | writel(0, ®s->cantxfg[i].data[1]); |
785 | 716 | ||
786 | /* put MB into rx queue */ | 717 | /* put MB into rx queue */ |
787 | flexcan_write(FLEXCAN_MB_CNT_CODE(0x4), | 718 | writel(FLEXCAN_MB_CNT_CODE(0x4), ®s->cantxfg[i].can_ctrl); |
788 | ®s->cantxfg[i].can_ctrl); | ||
789 | } | 719 | } |
790 | 720 | ||
791 | /* acceptance mask/acceptance code (accept everything) */ | 721 | /* acceptance mask/acceptance code (accept everything) */ |
792 | flexcan_write(0x0, ®s->rxgmask); | 722 | writel(0x0, ®s->rxgmask); |
793 | flexcan_write(0x0, ®s->rx14mask); | 723 | writel(0x0, ®s->rx14mask); |
794 | flexcan_write(0x0, ®s->rx15mask); | 724 | writel(0x0, ®s->rx15mask); |
795 | |||
796 | if (priv->devtype_data->features & FLEXCAN_HAS_V10_FEATURES) | ||
797 | flexcan_write(0x0, ®s->rxfgmask); | ||
798 | 725 | ||
799 | flexcan_transceiver_switch(priv, 1); | 726 | flexcan_transceiver_switch(priv, 1); |
800 | 727 | ||
801 | /* synchronize with the can bus */ | 728 | /* synchronize with the can bus */ |
802 | reg_mcr = flexcan_read(®s->mcr); | 729 | reg_mcr = readl(®s->mcr); |
803 | reg_mcr &= ~FLEXCAN_MCR_HALT; | 730 | reg_mcr &= ~FLEXCAN_MCR_HALT; |
804 | flexcan_write(reg_mcr, ®s->mcr); | 731 | writel(reg_mcr, ®s->mcr); |
805 | 732 | ||
806 | priv->can.state = CAN_STATE_ERROR_ACTIVE; | 733 | priv->can.state = CAN_STATE_ERROR_ACTIVE; |
807 | 734 | ||
808 | /* enable FIFO interrupts */ | 735 | /* enable FIFO interrupts */ |
809 | flexcan_write(FLEXCAN_IFLAG_DEFAULT, ®s->imask1); | 736 | writel(FLEXCAN_IFLAG_DEFAULT, ®s->imask1); |
810 | 737 | ||
811 | /* print chip status */ | 738 | /* print chip status */ |
812 | netdev_dbg(dev, "%s: reading mcr=0x%08x ctrl=0x%08x\n", __func__, | 739 | dev_dbg(dev->dev.parent, "%s: reading mcr=0x%08x ctrl=0x%08x\n", |
813 | flexcan_read(®s->mcr), flexcan_read(®s->ctrl)); | 740 | __func__, readl(®s->mcr), readl(®s->ctrl)); |
814 | 741 | ||
815 | return 0; | 742 | return 0; |
816 | 743 | ||
@@ -832,12 +759,12 @@ static void flexcan_chip_stop(struct net_device *dev) | |||
832 | u32 reg; | 759 | u32 reg; |
833 | 760 | ||
834 | /* Disable all interrupts */ | 761 | /* Disable all interrupts */ |
835 | flexcan_write(0, ®s->imask1); | 762 | writel(0, ®s->imask1); |
836 | 763 | ||
837 | /* Disable + halt module */ | 764 | /* Disable + halt module */ |
838 | reg = flexcan_read(®s->mcr); | 765 | reg = readl(®s->mcr); |
839 | reg |= FLEXCAN_MCR_MDIS | FLEXCAN_MCR_HALT; | 766 | reg |= FLEXCAN_MCR_MDIS | FLEXCAN_MCR_HALT; |
840 | flexcan_write(reg, ®s->mcr); | 767 | writel(reg, ®s->mcr); |
841 | 768 | ||
842 | flexcan_transceiver_switch(priv, 0); | 769 | flexcan_transceiver_switch(priv, 0); |
843 | priv->can.state = CAN_STATE_STOPPED; | 770 | priv->can.state = CAN_STATE_STOPPED; |
@@ -850,8 +777,7 @@ static int flexcan_open(struct net_device *dev) | |||
850 | struct flexcan_priv *priv = netdev_priv(dev); | 777 | struct flexcan_priv *priv = netdev_priv(dev); |
851 | int err; | 778 | int err; |
852 | 779 | ||
853 | clk_prepare_enable(priv->clk_ipg); | 780 | clk_enable(priv->clk); |
854 | clk_prepare_enable(priv->clk_per); | ||
855 | 781 | ||
856 | err = open_candev(dev); | 782 | err = open_candev(dev); |
857 | if (err) | 783 | if (err) |
@@ -873,8 +799,7 @@ static int flexcan_open(struct net_device *dev) | |||
873 | out_close: | 799 | out_close: |
874 | close_candev(dev); | 800 | close_candev(dev); |
875 | out: | 801 | out: |
876 | clk_disable_unprepare(priv->clk_per); | 802 | clk_disable(priv->clk); |
877 | clk_disable_unprepare(priv->clk_ipg); | ||
878 | 803 | ||
879 | return err; | 804 | return err; |
880 | } | 805 | } |
@@ -888,8 +813,7 @@ static int flexcan_close(struct net_device *dev) | |||
888 | flexcan_chip_stop(dev); | 813 | flexcan_chip_stop(dev); |
889 | 814 | ||
890 | free_irq(dev->irq, dev); | 815 | free_irq(dev->irq, dev); |
891 | clk_disable_unprepare(priv->clk_per); | 816 | clk_disable(priv->clk); |
892 | clk_disable_unprepare(priv->clk_ipg); | ||
893 | 817 | ||
894 | close_candev(dev); | 818 | close_candev(dev); |
895 | 819 | ||
@@ -922,37 +846,37 @@ static const struct net_device_ops flexcan_netdev_ops = { | |||
922 | .ndo_start_xmit = flexcan_start_xmit, | 846 | .ndo_start_xmit = flexcan_start_xmit, |
923 | }; | 847 | }; |
924 | 848 | ||
925 | static int register_flexcandev(struct net_device *dev) | 849 | static int __devinit register_flexcandev(struct net_device *dev) |
926 | { | 850 | { |
927 | struct flexcan_priv *priv = netdev_priv(dev); | 851 | struct flexcan_priv *priv = netdev_priv(dev); |
928 | struct flexcan_regs __iomem *regs = priv->base; | 852 | struct flexcan_regs __iomem *regs = priv->base; |
929 | u32 reg, err; | 853 | u32 reg, err; |
930 | 854 | ||
931 | clk_prepare_enable(priv->clk_ipg); | 855 | clk_enable(priv->clk); |
932 | clk_prepare_enable(priv->clk_per); | ||
933 | 856 | ||
934 | /* select "bus clock", chip must be disabled */ | 857 | /* select "bus clock", chip must be disabled */ |
935 | flexcan_chip_disable(priv); | 858 | flexcan_chip_disable(priv); |
936 | reg = flexcan_read(®s->ctrl); | 859 | reg = readl(®s->ctrl); |
937 | reg |= FLEXCAN_CTRL_CLK_SRC; | 860 | reg |= FLEXCAN_CTRL_CLK_SRC; |
938 | flexcan_write(reg, ®s->ctrl); | 861 | writel(reg, ®s->ctrl); |
939 | 862 | ||
940 | flexcan_chip_enable(priv); | 863 | flexcan_chip_enable(priv); |
941 | 864 | ||
942 | /* set freeze, halt and activate FIFO, restrict register access */ | 865 | /* set freeze, halt and activate FIFO, restrict register access */ |
943 | reg = flexcan_read(®s->mcr); | 866 | reg = readl(®s->mcr); |
944 | reg |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | | 867 | reg |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | |
945 | FLEXCAN_MCR_FEN | FLEXCAN_MCR_SUPV; | 868 | FLEXCAN_MCR_FEN | FLEXCAN_MCR_SUPV; |
946 | flexcan_write(reg, ®s->mcr); | 869 | writel(reg, ®s->mcr); |
947 | 870 | ||
948 | /* | 871 | /* |
949 | * Currently we only support newer versions of this core | 872 | * Currently we only support newer versions of this core |
950 | * featuring a RX FIFO. Older cores found on some Coldfire | 873 | * featuring a RX FIFO. Older cores found on some Coldfire |
951 | * derivates are not yet supported. | 874 | * derivates are not yet supported. |
952 | */ | 875 | */ |
953 | reg = flexcan_read(®s->mcr); | 876 | reg = readl(®s->mcr); |
954 | if (!(reg & FLEXCAN_MCR_FEN)) { | 877 | if (!(reg & FLEXCAN_MCR_FEN)) { |
955 | netdev_err(dev, "Could not enable RX FIFO, unsupported core\n"); | 878 | dev_err(dev->dev.parent, |
879 | "Could not enable RX FIFO, unsupported core\n"); | ||
956 | err = -ENODEV; | 880 | err = -ENODEV; |
957 | goto out; | 881 | goto out; |
958 | } | 882 | } |
@@ -962,68 +886,31 @@ static int register_flexcandev(struct net_device *dev) | |||
962 | out: | 886 | out: |
963 | /* disable core and turn off clocks */ | 887 | /* disable core and turn off clocks */ |
964 | flexcan_chip_disable(priv); | 888 | flexcan_chip_disable(priv); |
965 | clk_disable_unprepare(priv->clk_per); | 889 | clk_disable(priv->clk); |
966 | clk_disable_unprepare(priv->clk_ipg); | ||
967 | 890 | ||
968 | return err; | 891 | return err; |
969 | } | 892 | } |
970 | 893 | ||
971 | static void unregister_flexcandev(struct net_device *dev) | 894 | static void __devexit unregister_flexcandev(struct net_device *dev) |
972 | { | 895 | { |
973 | unregister_candev(dev); | 896 | unregister_candev(dev); |
974 | } | 897 | } |
975 | 898 | ||
976 | static const struct of_device_id flexcan_of_match[] = { | 899 | static int __devinit flexcan_probe(struct platform_device *pdev) |
977 | { .compatible = "fsl,p1010-flexcan", .data = &fsl_p1010_devtype_data, }, | ||
978 | { .compatible = "fsl,imx28-flexcan", .data = &fsl_imx28_devtype_data, }, | ||
979 | { .compatible = "fsl,imx6q-flexcan", .data = &fsl_imx6q_devtype_data, }, | ||
980 | { /* sentinel */ }, | ||
981 | }; | ||
982 | MODULE_DEVICE_TABLE(of, flexcan_of_match); | ||
983 | |||
984 | static const struct platform_device_id flexcan_id_table[] = { | ||
985 | { .name = "flexcan", .driver_data = (kernel_ulong_t)&fsl_p1010_devtype_data, }, | ||
986 | { /* sentinel */ }, | ||
987 | }; | ||
988 | MODULE_DEVICE_TABLE(platform, flexcan_id_table); | ||
989 | |||
990 | static int flexcan_probe(struct platform_device *pdev) | ||
991 | { | 900 | { |
992 | const struct of_device_id *of_id; | ||
993 | const struct flexcan_devtype_data *devtype_data; | ||
994 | struct net_device *dev; | 901 | struct net_device *dev; |
995 | struct flexcan_priv *priv; | 902 | struct flexcan_priv *priv; |
996 | struct resource *mem; | 903 | struct resource *mem; |
997 | struct clk *clk_ipg = NULL, *clk_per = NULL; | 904 | struct clk *clk; |
998 | struct pinctrl *pinctrl; | ||
999 | void __iomem *base; | 905 | void __iomem *base; |
1000 | resource_size_t mem_size; | 906 | resource_size_t mem_size; |
1001 | int err, irq; | 907 | int err, irq; |
1002 | u32 clock_freq = 0; | ||
1003 | |||
1004 | pinctrl = devm_pinctrl_get_select_default(&pdev->dev); | ||
1005 | if (IS_ERR(pinctrl)) | ||
1006 | return PTR_ERR(pinctrl); | ||
1007 | |||
1008 | if (pdev->dev.of_node) | ||
1009 | of_property_read_u32(pdev->dev.of_node, | ||
1010 | "clock-frequency", &clock_freq); | ||
1011 | |||
1012 | if (!clock_freq) { | ||
1013 | clk_ipg = devm_clk_get(&pdev->dev, "ipg"); | ||
1014 | if (IS_ERR(clk_ipg)) { | ||
1015 | dev_err(&pdev->dev, "no ipg clock defined\n"); | ||
1016 | err = PTR_ERR(clk_ipg); | ||
1017 | goto failed_clock; | ||
1018 | } | ||
1019 | clock_freq = clk_get_rate(clk_ipg); | ||
1020 | 908 | ||
1021 | clk_per = devm_clk_get(&pdev->dev, "per"); | 909 | clk = clk_get(&pdev->dev, NULL); |
1022 | if (IS_ERR(clk_per)) { | 910 | if (IS_ERR(clk)) { |
1023 | dev_err(&pdev->dev, "no per clock defined\n"); | 911 | dev_err(&pdev->dev, "no clock defined\n"); |
1024 | err = PTR_ERR(clk_per); | 912 | err = PTR_ERR(clk); |
1025 | goto failed_clock; | 913 | goto failed_clock; |
1026 | } | ||
1027 | } | 914 | } |
1028 | 915 | ||
1029 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 916 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
@@ -1045,29 +932,18 @@ static int flexcan_probe(struct platform_device *pdev) | |||
1045 | goto failed_map; | 932 | goto failed_map; |
1046 | } | 933 | } |
1047 | 934 | ||
1048 | dev = alloc_candev(sizeof(struct flexcan_priv), 1); | 935 | dev = alloc_candev(sizeof(struct flexcan_priv), 0); |
1049 | if (!dev) { | 936 | if (!dev) { |
1050 | err = -ENOMEM; | 937 | err = -ENOMEM; |
1051 | goto failed_alloc; | 938 | goto failed_alloc; |
1052 | } | 939 | } |
1053 | 940 | ||
1054 | of_id = of_match_device(flexcan_of_match, &pdev->dev); | ||
1055 | if (of_id) { | ||
1056 | devtype_data = of_id->data; | ||
1057 | } else if (pdev->id_entry->driver_data) { | ||
1058 | devtype_data = (struct flexcan_devtype_data *) | ||
1059 | pdev->id_entry->driver_data; | ||
1060 | } else { | ||
1061 | err = -ENODEV; | ||
1062 | goto failed_devtype; | ||
1063 | } | ||
1064 | |||
1065 | dev->netdev_ops = &flexcan_netdev_ops; | 941 | dev->netdev_ops = &flexcan_netdev_ops; |
1066 | dev->irq = irq; | 942 | dev->irq = irq; |
1067 | dev->flags |= IFF_ECHO; | 943 | dev->flags |= IFF_ECHO; /* we support local echo in hardware */ |
1068 | 944 | ||
1069 | priv = netdev_priv(dev); | 945 | priv = netdev_priv(dev); |
1070 | priv->can.clock.freq = clock_freq; | 946 | priv->can.clock.freq = clk_get_rate(clk); |
1071 | priv->can.bittiming_const = &flexcan_bittiming_const; | 947 | priv->can.bittiming_const = &flexcan_bittiming_const; |
1072 | priv->can.do_set_mode = flexcan_set_mode; | 948 | priv->can.do_set_mode = flexcan_set_mode; |
1073 | priv->can.do_get_berr_counter = flexcan_get_berr_counter; | 949 | priv->can.do_get_berr_counter = flexcan_get_berr_counter; |
@@ -1076,10 +952,8 @@ static int flexcan_probe(struct platform_device *pdev) | |||
1076 | CAN_CTRLMODE_BERR_REPORTING; | 952 | CAN_CTRLMODE_BERR_REPORTING; |
1077 | priv->base = base; | 953 | priv->base = base; |
1078 | priv->dev = dev; | 954 | priv->dev = dev; |
1079 | priv->clk_ipg = clk_ipg; | 955 | priv->clk = clk; |
1080 | priv->clk_per = clk_per; | ||
1081 | priv->pdata = pdev->dev.platform_data; | 956 | priv->pdata = pdev->dev.platform_data; |
1082 | priv->devtype_data = devtype_data; | ||
1083 | 957 | ||
1084 | netif_napi_add(dev, &priv->napi, flexcan_poll, FLEXCAN_NAPI_WEIGHT); | 958 | netif_napi_add(dev, &priv->napi, flexcan_poll, FLEXCAN_NAPI_WEIGHT); |
1085 | 959 | ||
@@ -1098,18 +972,18 @@ static int flexcan_probe(struct platform_device *pdev) | |||
1098 | return 0; | 972 | return 0; |
1099 | 973 | ||
1100 | failed_register: | 974 | failed_register: |
1101 | failed_devtype: | ||
1102 | free_candev(dev); | 975 | free_candev(dev); |
1103 | failed_alloc: | 976 | failed_alloc: |
1104 | iounmap(base); | 977 | iounmap(base); |
1105 | failed_map: | 978 | failed_map: |
1106 | release_mem_region(mem->start, mem_size); | 979 | release_mem_region(mem->start, mem_size); |
1107 | failed_get: | 980 | failed_get: |
981 | clk_put(clk); | ||
1108 | failed_clock: | 982 | failed_clock: |
1109 | return err; | 983 | return err; |
1110 | } | 984 | } |
1111 | 985 | ||
1112 | static int flexcan_remove(struct platform_device *pdev) | 986 | static int __devexit flexcan_remove(struct platform_device *pdev) |
1113 | { | 987 | { |
1114 | struct net_device *dev = platform_get_drvdata(pdev); | 988 | struct net_device *dev = platform_get_drvdata(pdev); |
1115 | struct flexcan_priv *priv = netdev_priv(dev); | 989 | struct flexcan_priv *priv = netdev_priv(dev); |
@@ -1122,61 +996,33 @@ static int flexcan_remove(struct platform_device *pdev) | |||
1122 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 996 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1123 | release_mem_region(mem->start, resource_size(mem)); | 997 | release_mem_region(mem->start, resource_size(mem)); |
1124 | 998 | ||
999 | clk_put(priv->clk); | ||
1000 | |||
1125 | free_candev(dev); | 1001 | free_candev(dev); |
1126 | 1002 | ||
1127 | return 0; | 1003 | return 0; |
1128 | } | 1004 | } |
1129 | 1005 | ||
1130 | #ifdef CONFIG_PM | 1006 | static struct platform_driver flexcan_driver = { |
1131 | static int flexcan_suspend(struct platform_device *pdev, pm_message_t state) | 1007 | .driver.name = DRV_NAME, |
1132 | { | 1008 | .probe = flexcan_probe, |
1133 | struct net_device *dev = platform_get_drvdata(pdev); | 1009 | .remove = __devexit_p(flexcan_remove), |
1134 | struct flexcan_priv *priv = netdev_priv(dev); | 1010 | }; |
1135 | |||
1136 | flexcan_chip_disable(priv); | ||
1137 | |||
1138 | if (netif_running(dev)) { | ||
1139 | netif_stop_queue(dev); | ||
1140 | netif_device_detach(dev); | ||
1141 | } | ||
1142 | priv->can.state = CAN_STATE_SLEEPING; | ||
1143 | 1011 | ||
1144 | return 0; | 1012 | static int __init flexcan_init(void) |
1013 | { | ||
1014 | pr_info("%s netdevice driver\n", DRV_NAME); | ||
1015 | return platform_driver_register(&flexcan_driver); | ||
1145 | } | 1016 | } |
1146 | 1017 | ||
1147 | static int flexcan_resume(struct platform_device *pdev) | 1018 | static void __exit flexcan_exit(void) |
1148 | { | 1019 | { |
1149 | struct net_device *dev = platform_get_drvdata(pdev); | 1020 | platform_driver_unregister(&flexcan_driver); |
1150 | struct flexcan_priv *priv = netdev_priv(dev); | 1021 | pr_info("%s: driver removed\n", DRV_NAME); |
1151 | |||
1152 | priv->can.state = CAN_STATE_ERROR_ACTIVE; | ||
1153 | if (netif_running(dev)) { | ||
1154 | netif_device_attach(dev); | ||
1155 | netif_start_queue(dev); | ||
1156 | } | ||
1157 | flexcan_chip_enable(priv); | ||
1158 | |||
1159 | return 0; | ||
1160 | } | 1022 | } |
1161 | #else | ||
1162 | #define flexcan_suspend NULL | ||
1163 | #define flexcan_resume NULL | ||
1164 | #endif | ||
1165 | |||
1166 | static struct platform_driver flexcan_driver = { | ||
1167 | .driver = { | ||
1168 | .name = DRV_NAME, | ||
1169 | .owner = THIS_MODULE, | ||
1170 | .of_match_table = flexcan_of_match, | ||
1171 | }, | ||
1172 | .probe = flexcan_probe, | ||
1173 | .remove = flexcan_remove, | ||
1174 | .suspend = flexcan_suspend, | ||
1175 | .resume = flexcan_resume, | ||
1176 | .id_table = flexcan_id_table, | ||
1177 | }; | ||
1178 | 1023 | ||
1179 | module_platform_driver(flexcan_driver); | 1024 | module_init(flexcan_init); |
1025 | module_exit(flexcan_exit); | ||
1180 | 1026 | ||
1181 | MODULE_AUTHOR("Sascha Hauer <kernel@pengutronix.de>, " | 1027 | MODULE_AUTHOR("Sascha Hauer <kernel@pengutronix.de>, " |
1182 | "Marc Kleine-Budde <kernel@pengutronix.de>"); | 1028 | "Marc Kleine-Budde <kernel@pengutronix.de>"); |
diff --git a/drivers/net/can/grcan.c b/drivers/net/can/grcan.c deleted file mode 100644 index 17fbc7a0922..00000000000 --- a/drivers/net/can/grcan.c +++ /dev/null | |||
@@ -1,1756 +0,0 @@ | |||
1 | /* | ||
2 | * Socket CAN driver for Aeroflex Gaisler GRCAN and GRHCAN. | ||
3 | * | ||
4 | * 2012 (c) Aeroflex Gaisler AB | ||
5 | * | ||
6 | * This driver supports GRCAN and GRHCAN CAN controllers available in the GRLIB | ||
7 | * VHDL IP core library. | ||
8 | * | ||
9 | * Full documentation of the GRCAN core can be found here: | ||
10 | * http://www.gaisler.com/products/grlib/grip.pdf | ||
11 | * | ||
12 | * See "Documentation/devicetree/bindings/net/can/grcan.txt" for information on | ||
13 | * open firmware properties. | ||
14 | * | ||
15 | * See "Documentation/ABI/testing/sysfs-class-net-grcan" for information on the | ||
16 | * sysfs interface. | ||
17 | * | ||
18 | * See "Documentation/kernel-parameters.txt" for information on the module | ||
19 | * parameters. | ||
20 | * | ||
21 | * This program is free software; you can redistribute it and/or modify it | ||
22 | * under the terms of the GNU General Public License as published by the | ||
23 | * Free Software Foundation; either version 2 of the License, or (at your | ||
24 | * option) any later version. | ||
25 | * | ||
26 | * Contributors: Andreas Larsson <andreas@gaisler.com> | ||
27 | */ | ||
28 | |||
29 | #include <linux/kernel.h> | ||
30 | #include <linux/module.h> | ||
31 | #include <linux/interrupt.h> | ||
32 | #include <linux/netdevice.h> | ||
33 | #include <linux/delay.h> | ||
34 | #include <linux/io.h> | ||
35 | #include <linux/can/dev.h> | ||
36 | #include <linux/spinlock.h> | ||
37 | |||
38 | #include <linux/of_platform.h> | ||
39 | #include <asm/prom.h> | ||
40 | |||
41 | #include <linux/of_irq.h> | ||
42 | |||
43 | #include <linux/dma-mapping.h> | ||
44 | |||
45 | #define DRV_NAME "grcan" | ||
46 | |||
47 | #define GRCAN_NAPI_WEIGHT 32 | ||
48 | |||
49 | #define GRCAN_RESERVE_SIZE(slot1, slot2) (((slot2) - (slot1)) / 4 - 1) | ||
50 | |||
51 | struct grcan_registers { | ||
52 | u32 conf; /* 0x00 */ | ||
53 | u32 stat; /* 0x04 */ | ||
54 | u32 ctrl; /* 0x08 */ | ||
55 | u32 __reserved1[GRCAN_RESERVE_SIZE(0x08, 0x18)]; | ||
56 | u32 smask; /* 0x18 - CanMASK */ | ||
57 | u32 scode; /* 0x1c - CanCODE */ | ||
58 | u32 __reserved2[GRCAN_RESERVE_SIZE(0x1c, 0x100)]; | ||
59 | u32 pimsr; /* 0x100 */ | ||
60 | u32 pimr; /* 0x104 */ | ||
61 | u32 pisr; /* 0x108 */ | ||
62 | u32 pir; /* 0x10C */ | ||
63 | u32 imr; /* 0x110 */ | ||
64 | u32 picr; /* 0x114 */ | ||
65 | u32 __reserved3[GRCAN_RESERVE_SIZE(0x114, 0x200)]; | ||
66 | u32 txctrl; /* 0x200 */ | ||
67 | u32 txaddr; /* 0x204 */ | ||
68 | u32 txsize; /* 0x208 */ | ||
69 | u32 txwr; /* 0x20C */ | ||
70 | u32 txrd; /* 0x210 */ | ||
71 | u32 txirq; /* 0x214 */ | ||
72 | u32 __reserved4[GRCAN_RESERVE_SIZE(0x214, 0x300)]; | ||
73 | u32 rxctrl; /* 0x300 */ | ||
74 | u32 rxaddr; /* 0x304 */ | ||
75 | u32 rxsize; /* 0x308 */ | ||
76 | u32 rxwr; /* 0x30C */ | ||
77 | u32 rxrd; /* 0x310 */ | ||
78 | u32 rxirq; /* 0x314 */ | ||
79 | u32 rxmask; /* 0x318 */ | ||
80 | u32 rxcode; /* 0x31C */ | ||
81 | }; | ||
82 | |||
83 | #define GRCAN_CONF_ABORT 0x00000001 | ||
84 | #define GRCAN_CONF_ENABLE0 0x00000002 | ||
85 | #define GRCAN_CONF_ENABLE1 0x00000004 | ||
86 | #define GRCAN_CONF_SELECT 0x00000008 | ||
87 | #define GRCAN_CONF_SILENT 0x00000010 | ||
88 | #define GRCAN_CONF_SAM 0x00000020 /* Available in some hardware */ | ||
89 | #define GRCAN_CONF_BPR 0x00000300 /* Note: not BRP */ | ||
90 | #define GRCAN_CONF_RSJ 0x00007000 | ||
91 | #define GRCAN_CONF_PS1 0x00f00000 | ||
92 | #define GRCAN_CONF_PS2 0x000f0000 | ||
93 | #define GRCAN_CONF_SCALER 0xff000000 | ||
94 | #define GRCAN_CONF_OPERATION \ | ||
95 | (GRCAN_CONF_ABORT | GRCAN_CONF_ENABLE0 | GRCAN_CONF_ENABLE1 \ | ||
96 | | GRCAN_CONF_SELECT | GRCAN_CONF_SILENT | GRCAN_CONF_SAM) | ||
97 | #define GRCAN_CONF_TIMING \ | ||
98 | (GRCAN_CONF_BPR | GRCAN_CONF_RSJ | GRCAN_CONF_PS1 \ | ||
99 | | GRCAN_CONF_PS2 | GRCAN_CONF_SCALER) | ||
100 | |||
101 | #define GRCAN_CONF_RSJ_MIN 1 | ||
102 | #define GRCAN_CONF_RSJ_MAX 4 | ||
103 | #define GRCAN_CONF_PS1_MIN 1 | ||
104 | #define GRCAN_CONF_PS1_MAX 15 | ||
105 | #define GRCAN_CONF_PS2_MIN 2 | ||
106 | #define GRCAN_CONF_PS2_MAX 8 | ||
107 | #define GRCAN_CONF_SCALER_MIN 0 | ||
108 | #define GRCAN_CONF_SCALER_MAX 255 | ||
109 | #define GRCAN_CONF_SCALER_INC 1 | ||
110 | |||
111 | #define GRCAN_CONF_BPR_BIT 8 | ||
112 | #define GRCAN_CONF_RSJ_BIT 12 | ||
113 | #define GRCAN_CONF_PS1_BIT 20 | ||
114 | #define GRCAN_CONF_PS2_BIT 16 | ||
115 | #define GRCAN_CONF_SCALER_BIT 24 | ||
116 | |||
117 | #define GRCAN_STAT_PASS 0x000001 | ||
118 | #define GRCAN_STAT_OFF 0x000002 | ||
119 | #define GRCAN_STAT_OR 0x000004 | ||
120 | #define GRCAN_STAT_AHBERR 0x000008 | ||
121 | #define GRCAN_STAT_ACTIVE 0x000010 | ||
122 | #define GRCAN_STAT_RXERRCNT 0x00ff00 | ||
123 | #define GRCAN_STAT_TXERRCNT 0xff0000 | ||
124 | |||
125 | #define GRCAN_STAT_ERRCTR_RELATED (GRCAN_STAT_PASS | GRCAN_STAT_OFF) | ||
126 | |||
127 | #define GRCAN_STAT_RXERRCNT_BIT 8 | ||
128 | #define GRCAN_STAT_TXERRCNT_BIT 16 | ||
129 | |||
130 | #define GRCAN_STAT_ERRCNT_WARNING_LIMIT 96 | ||
131 | #define GRCAN_STAT_ERRCNT_PASSIVE_LIMIT 127 | ||
132 | |||
133 | #define GRCAN_CTRL_RESET 0x2 | ||
134 | #define GRCAN_CTRL_ENABLE 0x1 | ||
135 | |||
136 | #define GRCAN_TXCTRL_ENABLE 0x1 | ||
137 | #define GRCAN_TXCTRL_ONGOING 0x2 | ||
138 | #define GRCAN_TXCTRL_SINGLE 0x4 | ||
139 | |||
140 | #define GRCAN_RXCTRL_ENABLE 0x1 | ||
141 | #define GRCAN_RXCTRL_ONGOING 0x2 | ||
142 | |||
143 | /* Relative offset of IRQ sources to AMBA Plug&Play */ | ||
144 | #define GRCAN_IRQIX_IRQ 0 | ||
145 | #define GRCAN_IRQIX_TXSYNC 1 | ||
146 | #define GRCAN_IRQIX_RXSYNC 2 | ||
147 | |||
148 | #define GRCAN_IRQ_PASS 0x00001 | ||
149 | #define GRCAN_IRQ_OFF 0x00002 | ||
150 | #define GRCAN_IRQ_OR 0x00004 | ||
151 | #define GRCAN_IRQ_RXAHBERR 0x00008 | ||
152 | #define GRCAN_IRQ_TXAHBERR 0x00010 | ||
153 | #define GRCAN_IRQ_RXIRQ 0x00020 | ||
154 | #define GRCAN_IRQ_TXIRQ 0x00040 | ||
155 | #define GRCAN_IRQ_RXFULL 0x00080 | ||
156 | #define GRCAN_IRQ_TXEMPTY 0x00100 | ||
157 | #define GRCAN_IRQ_RX 0x00200 | ||
158 | #define GRCAN_IRQ_TX 0x00400 | ||
159 | #define GRCAN_IRQ_RXSYNC 0x00800 | ||
160 | #define GRCAN_IRQ_TXSYNC 0x01000 | ||
161 | #define GRCAN_IRQ_RXERRCTR 0x02000 | ||
162 | #define GRCAN_IRQ_TXERRCTR 0x04000 | ||
163 | #define GRCAN_IRQ_RXMISS 0x08000 | ||
164 | #define GRCAN_IRQ_TXLOSS 0x10000 | ||
165 | |||
166 | #define GRCAN_IRQ_NONE 0 | ||
167 | #define GRCAN_IRQ_ALL \ | ||
168 | (GRCAN_IRQ_PASS | GRCAN_IRQ_OFF | GRCAN_IRQ_OR \ | ||
169 | | GRCAN_IRQ_RXAHBERR | GRCAN_IRQ_TXAHBERR \ | ||
170 | | GRCAN_IRQ_RXIRQ | GRCAN_IRQ_TXIRQ \ | ||
171 | | GRCAN_IRQ_RXFULL | GRCAN_IRQ_TXEMPTY \ | ||
172 | | GRCAN_IRQ_RX | GRCAN_IRQ_TX | GRCAN_IRQ_RXSYNC \ | ||
173 | | GRCAN_IRQ_TXSYNC | GRCAN_IRQ_RXERRCTR \ | ||
174 | | GRCAN_IRQ_TXERRCTR | GRCAN_IRQ_RXMISS \ | ||
175 | | GRCAN_IRQ_TXLOSS) | ||
176 | |||
177 | #define GRCAN_IRQ_ERRCTR_RELATED (GRCAN_IRQ_RXERRCTR | GRCAN_IRQ_TXERRCTR \ | ||
178 | | GRCAN_IRQ_PASS | GRCAN_IRQ_OFF) | ||
179 | #define GRCAN_IRQ_ERRORS (GRCAN_IRQ_ERRCTR_RELATED | GRCAN_IRQ_OR \ | ||
180 | | GRCAN_IRQ_TXAHBERR | GRCAN_IRQ_RXAHBERR \ | ||
181 | | GRCAN_IRQ_TXLOSS) | ||
182 | #define GRCAN_IRQ_DEFAULT (GRCAN_IRQ_RX | GRCAN_IRQ_TX | GRCAN_IRQ_ERRORS) | ||
183 | |||
184 | #define GRCAN_MSG_SIZE 16 | ||
185 | |||
186 | #define GRCAN_MSG_IDE 0x80000000 | ||
187 | #define GRCAN_MSG_RTR 0x40000000 | ||
188 | #define GRCAN_MSG_BID 0x1ffc0000 | ||
189 | #define GRCAN_MSG_EID 0x1fffffff | ||
190 | #define GRCAN_MSG_IDE_BIT 31 | ||
191 | #define GRCAN_MSG_RTR_BIT 30 | ||
192 | #define GRCAN_MSG_BID_BIT 18 | ||
193 | #define GRCAN_MSG_EID_BIT 0 | ||
194 | |||
195 | #define GRCAN_MSG_DLC 0xf0000000 | ||
196 | #define GRCAN_MSG_TXERRC 0x00ff0000 | ||
197 | #define GRCAN_MSG_RXERRC 0x0000ff00 | ||
198 | #define GRCAN_MSG_DLC_BIT 28 | ||
199 | #define GRCAN_MSG_TXERRC_BIT 16 | ||
200 | #define GRCAN_MSG_RXERRC_BIT 8 | ||
201 | #define GRCAN_MSG_AHBERR 0x00000008 | ||
202 | #define GRCAN_MSG_OR 0x00000004 | ||
203 | #define GRCAN_MSG_OFF 0x00000002 | ||
204 | #define GRCAN_MSG_PASS 0x00000001 | ||
205 | |||
206 | #define GRCAN_MSG_DATA_SLOT_INDEX(i) (2 + (i) / 4) | ||
207 | #define GRCAN_MSG_DATA_SHIFT(i) ((3 - (i) % 4) * 8) | ||
208 | |||
209 | #define GRCAN_BUFFER_ALIGNMENT 1024 | ||
210 | #define GRCAN_DEFAULT_BUFFER_SIZE 1024 | ||
211 | #define GRCAN_VALID_TR_SIZE_MASK 0x001fffc0 | ||
212 | |||
213 | #define GRCAN_INVALID_BUFFER_SIZE(s) \ | ||
214 | ((s) == 0 || ((s) & ~GRCAN_VALID_TR_SIZE_MASK)) | ||
215 | |||
216 | #if GRCAN_INVALID_BUFFER_SIZE(GRCAN_DEFAULT_BUFFER_SIZE) | ||
217 | #error "Invalid default buffer size" | ||
218 | #endif | ||
219 | |||
220 | struct grcan_dma_buffer { | ||
221 | size_t size; | ||
222 | void *buf; | ||
223 | dma_addr_t handle; | ||
224 | }; | ||
225 | |||
226 | struct grcan_dma { | ||
227 | size_t base_size; | ||
228 | void *base_buf; | ||
229 | dma_addr_t base_handle; | ||
230 | struct grcan_dma_buffer tx; | ||
231 | struct grcan_dma_buffer rx; | ||
232 | }; | ||
233 | |||
234 | /* GRCAN configuration parameters */ | ||
235 | struct grcan_device_config { | ||
236 | unsigned short enable0; | ||
237 | unsigned short enable1; | ||
238 | unsigned short select; | ||
239 | unsigned int txsize; | ||
240 | unsigned int rxsize; | ||
241 | }; | ||
242 | |||
243 | #define GRCAN_DEFAULT_DEVICE_CONFIG { \ | ||
244 | .enable0 = 0, \ | ||
245 | .enable1 = 0, \ | ||
246 | .select = 0, \ | ||
247 | .txsize = GRCAN_DEFAULT_BUFFER_SIZE, \ | ||
248 | .rxsize = GRCAN_DEFAULT_BUFFER_SIZE, \ | ||
249 | } | ||
250 | |||
251 | #define GRCAN_TXBUG_SAFE_GRLIB_VERSION 0x4100 | ||
252 | #define GRLIB_VERSION_MASK 0xffff | ||
253 | |||
254 | /* GRCAN private data structure */ | ||
255 | struct grcan_priv { | ||
256 | struct can_priv can; /* must be the first member */ | ||
257 | struct net_device *dev; | ||
258 | struct napi_struct napi; | ||
259 | |||
260 | struct grcan_registers __iomem *regs; /* ioremap'ed registers */ | ||
261 | struct grcan_device_config config; | ||
262 | struct grcan_dma dma; | ||
263 | |||
264 | struct sk_buff **echo_skb; /* We allocate this on our own */ | ||
265 | u8 *txdlc; /* Length of queued frames */ | ||
266 | |||
267 | /* The echo skb pointer, pointing into echo_skb and indicating which | ||
268 | * frames can be echoed back. See the "Notes on the tx cyclic buffer | ||
269 | * handling"-comment for grcan_start_xmit for more details. | ||
270 | */ | ||
271 | u32 eskbp; | ||
272 | |||
273 | /* Lock for controlling changes to the netif tx queue state, accesses to | ||
274 | * the echo_skb pointer eskbp and for making sure that a running reset | ||
275 | * and/or a close of the interface is done without interference from | ||
276 | * other parts of the code. | ||
277 | * | ||
278 | * The echo_skb pointer, eskbp, should only be accessed under this lock | ||
279 | * as it can be changed in several places and together with decisions on | ||
280 | * whether to wake up the tx queue. | ||
281 | * | ||
282 | * The tx queue must never be woken up if there is a running reset or | ||
283 | * close in progress. | ||
284 | * | ||
285 | * A running reset (see below on need_txbug_workaround) should never be | ||
286 | * done if the interface is closing down and several running resets | ||
287 | * should never be scheduled simultaneously. | ||
288 | */ | ||
289 | spinlock_t lock; | ||
290 | |||
291 | /* Whether a workaround is needed due to a bug in older hardware. In | ||
292 | * this case, the driver both tries to prevent the bug from being | ||
293 | * triggered and recovers, if the bug nevertheless happens, by doing a | ||
294 | * running reset. A running reset, resets the device and continues from | ||
295 | * where it were without being noticeable from outside the driver (apart | ||
296 | * from slight delays). | ||
297 | */ | ||
298 | bool need_txbug_workaround; | ||
299 | |||
300 | /* To trigger initization of running reset and to trigger running reset | ||
301 | * respectively in the case of a hanged device due to a txbug. | ||
302 | */ | ||
303 | struct timer_list hang_timer; | ||
304 | struct timer_list rr_timer; | ||
305 | |||
306 | /* To avoid waking up the netif queue and restarting timers | ||
307 | * when a reset is scheduled or when closing of the device is | ||
308 | * undergoing | ||
309 | */ | ||
310 | bool resetting; | ||
311 | bool closing; | ||
312 | }; | ||
313 | |||
314 | /* Wait time for a short wait for ongoing to clear */ | ||
315 | #define GRCAN_SHORTWAIT_USECS 10 | ||
316 | |||
317 | /* Limit on the number of transmitted bits of an eff frame according to the CAN | ||
318 | * specification: 1 bit start of frame, 32 bits arbitration field, 6 bits | ||
319 | * control field, 8 bytes data field, 16 bits crc field, 2 bits ACK field and 7 | ||
320 | * bits end of frame | ||
321 | */ | ||
322 | #define GRCAN_EFF_FRAME_MAX_BITS (1+32+6+8*8+16+2+7) | ||
323 | |||
324 | #if defined(__BIG_ENDIAN) | ||
325 | static inline u32 grcan_read_reg(u32 __iomem *reg) | ||
326 | { | ||
327 | return ioread32be(reg); | ||
328 | } | ||
329 | |||
330 | static inline void grcan_write_reg(u32 __iomem *reg, u32 val) | ||
331 | { | ||
332 | iowrite32be(val, reg); | ||
333 | } | ||
334 | #else | ||
335 | static inline u32 grcan_read_reg(u32 __iomem *reg) | ||
336 | { | ||
337 | return ioread32(reg); | ||
338 | } | ||
339 | |||
340 | static inline void grcan_write_reg(u32 __iomem *reg, u32 val) | ||
341 | { | ||
342 | iowrite32(val, reg); | ||
343 | } | ||
344 | #endif | ||
345 | |||
346 | static inline void grcan_clear_bits(u32 __iomem *reg, u32 mask) | ||
347 | { | ||
348 | grcan_write_reg(reg, grcan_read_reg(reg) & ~mask); | ||
349 | } | ||
350 | |||
351 | static inline void grcan_set_bits(u32 __iomem *reg, u32 mask) | ||
352 | { | ||
353 | grcan_write_reg(reg, grcan_read_reg(reg) | mask); | ||
354 | } | ||
355 | |||
356 | static inline u32 grcan_read_bits(u32 __iomem *reg, u32 mask) | ||
357 | { | ||
358 | return grcan_read_reg(reg) & mask; | ||
359 | } | ||
360 | |||
361 | static inline void grcan_write_bits(u32 __iomem *reg, u32 value, u32 mask) | ||
362 | { | ||
363 | u32 old = grcan_read_reg(reg); | ||
364 | |||
365 | grcan_write_reg(reg, (old & ~mask) | (value & mask)); | ||
366 | } | ||
367 | |||
368 | /* a and b should both be in [0,size] and a == b == size should not hold */ | ||
369 | static inline u32 grcan_ring_add(u32 a, u32 b, u32 size) | ||
370 | { | ||
371 | u32 sum = a + b; | ||
372 | |||
373 | if (sum < size) | ||
374 | return sum; | ||
375 | else | ||
376 | return sum - size; | ||
377 | } | ||
378 | |||
379 | /* a and b should both be in [0,size) */ | ||
380 | static inline u32 grcan_ring_sub(u32 a, u32 b, u32 size) | ||
381 | { | ||
382 | return grcan_ring_add(a, size - b, size); | ||
383 | } | ||
384 | |||
385 | /* Available slots for new transmissions */ | ||
386 | static inline u32 grcan_txspace(size_t txsize, u32 txwr, u32 eskbp) | ||
387 | { | ||
388 | u32 slots = txsize / GRCAN_MSG_SIZE - 1; | ||
389 | u32 used = grcan_ring_sub(txwr, eskbp, txsize) / GRCAN_MSG_SIZE; | ||
390 | |||
391 | return slots - used; | ||
392 | } | ||
393 | |||
394 | /* Configuration parameters that can be set via module parameters */ | ||
395 | static struct grcan_device_config grcan_module_config = | ||
396 | GRCAN_DEFAULT_DEVICE_CONFIG; | ||
397 | |||
398 | static const struct can_bittiming_const grcan_bittiming_const = { | ||
399 | .name = DRV_NAME, | ||
400 | .tseg1_min = GRCAN_CONF_PS1_MIN + 1, | ||
401 | .tseg1_max = GRCAN_CONF_PS1_MAX + 1, | ||
402 | .tseg2_min = GRCAN_CONF_PS2_MIN, | ||
403 | .tseg2_max = GRCAN_CONF_PS2_MAX, | ||
404 | .sjw_max = GRCAN_CONF_RSJ_MAX, | ||
405 | .brp_min = GRCAN_CONF_SCALER_MIN + 1, | ||
406 | .brp_max = GRCAN_CONF_SCALER_MAX + 1, | ||
407 | .brp_inc = GRCAN_CONF_SCALER_INC, | ||
408 | }; | ||
409 | |||
410 | static int grcan_set_bittiming(struct net_device *dev) | ||
411 | { | ||
412 | struct grcan_priv *priv = netdev_priv(dev); | ||
413 | struct grcan_registers __iomem *regs = priv->regs; | ||
414 | struct can_bittiming *bt = &priv->can.bittiming; | ||
415 | u32 timing = 0; | ||
416 | int bpr, rsj, ps1, ps2, scaler; | ||
417 | |||
418 | /* Should never happen - function will not be called when | ||
419 | * device is up | ||
420 | */ | ||
421 | if (grcan_read_bits(®s->ctrl, GRCAN_CTRL_ENABLE)) | ||
422 | return -EBUSY; | ||
423 | |||
424 | bpr = 0; /* Note bpr and brp are different concepts */ | ||
425 | rsj = bt->sjw; | ||
426 | ps1 = (bt->prop_seg + bt->phase_seg1) - 1; /* tseg1 - 1 */ | ||
427 | ps2 = bt->phase_seg2; | ||
428 | scaler = (bt->brp - 1); | ||
429 | netdev_dbg(dev, "Request for BPR=%d, RSJ=%d, PS1=%d, PS2=%d, SCALER=%d", | ||
430 | bpr, rsj, ps1, ps2, scaler); | ||
431 | if (!(ps1 > ps2)) { | ||
432 | netdev_err(dev, "PS1 > PS2 must hold: PS1=%d, PS2=%d\n", | ||
433 | ps1, ps2); | ||
434 | return -EINVAL; | ||
435 | } | ||
436 | if (!(ps2 >= rsj)) { | ||
437 | netdev_err(dev, "PS2 >= RSJ must hold: PS2=%d, RSJ=%d\n", | ||
438 | ps2, rsj); | ||
439 | return -EINVAL; | ||
440 | } | ||
441 | |||
442 | timing |= (bpr << GRCAN_CONF_BPR_BIT) & GRCAN_CONF_BPR; | ||
443 | timing |= (rsj << GRCAN_CONF_RSJ_BIT) & GRCAN_CONF_RSJ; | ||
444 | timing |= (ps1 << GRCAN_CONF_PS1_BIT) & GRCAN_CONF_PS1; | ||
445 | timing |= (ps2 << GRCAN_CONF_PS2_BIT) & GRCAN_CONF_PS2; | ||
446 | timing |= (scaler << GRCAN_CONF_SCALER_BIT) & GRCAN_CONF_SCALER; | ||
447 | netdev_info(dev, "setting timing=0x%x\n", timing); | ||
448 | grcan_write_bits(®s->conf, timing, GRCAN_CONF_TIMING); | ||
449 | |||
450 | return 0; | ||
451 | } | ||
452 | |||
453 | static int grcan_get_berr_counter(const struct net_device *dev, | ||
454 | struct can_berr_counter *bec) | ||
455 | { | ||
456 | struct grcan_priv *priv = netdev_priv(dev); | ||
457 | struct grcan_registers __iomem *regs = priv->regs; | ||
458 | u32 status = grcan_read_reg(®s->stat); | ||
459 | |||
460 | bec->txerr = (status & GRCAN_STAT_TXERRCNT) >> GRCAN_STAT_TXERRCNT_BIT; | ||
461 | bec->rxerr = (status & GRCAN_STAT_RXERRCNT) >> GRCAN_STAT_RXERRCNT_BIT; | ||
462 | return 0; | ||
463 | } | ||
464 | |||
465 | static int grcan_poll(struct napi_struct *napi, int budget); | ||
466 | |||
467 | /* Reset device, but keep configuration information */ | ||
468 | static void grcan_reset(struct net_device *dev) | ||
469 | { | ||
470 | struct grcan_priv *priv = netdev_priv(dev); | ||
471 | struct grcan_registers __iomem *regs = priv->regs; | ||
472 | u32 config = grcan_read_reg(®s->conf); | ||
473 | |||
474 | grcan_set_bits(®s->ctrl, GRCAN_CTRL_RESET); | ||
475 | grcan_write_reg(®s->conf, config); | ||
476 | |||
477 | priv->eskbp = grcan_read_reg(®s->txrd); | ||
478 | priv->can.state = CAN_STATE_STOPPED; | ||
479 | |||
480 | /* Turn off hardware filtering - regs->rxcode set to 0 by reset */ | ||
481 | grcan_write_reg(®s->rxmask, 0); | ||
482 | } | ||
483 | |||
484 | /* stop device without changing any configurations */ | ||
485 | static void grcan_stop_hardware(struct net_device *dev) | ||
486 | { | ||
487 | struct grcan_priv *priv = netdev_priv(dev); | ||
488 | struct grcan_registers __iomem *regs = priv->regs; | ||
489 | |||
490 | grcan_write_reg(®s->imr, GRCAN_IRQ_NONE); | ||
491 | grcan_clear_bits(®s->txctrl, GRCAN_TXCTRL_ENABLE); | ||
492 | grcan_clear_bits(®s->rxctrl, GRCAN_RXCTRL_ENABLE); | ||
493 | grcan_clear_bits(®s->ctrl, GRCAN_CTRL_ENABLE); | ||
494 | } | ||
495 | |||
496 | /* Let priv->eskbp catch up to regs->txrd and echo back the skbs if echo | ||
497 | * is true and free them otherwise. | ||
498 | * | ||
499 | * If budget is >= 0, stop after handling at most budget skbs. Otherwise, | ||
500 | * continue until priv->eskbp catches up to regs->txrd. | ||
501 | * | ||
502 | * priv->lock *must* be held when calling this function | ||
503 | */ | ||
504 | static int catch_up_echo_skb(struct net_device *dev, int budget, bool echo) | ||
505 | { | ||
506 | struct grcan_priv *priv = netdev_priv(dev); | ||
507 | struct grcan_registers __iomem *regs = priv->regs; | ||
508 | struct grcan_dma *dma = &priv->dma; | ||
509 | struct net_device_stats *stats = &dev->stats; | ||
510 | int i, work_done; | ||
511 | |||
512 | /* Updates to priv->eskbp and wake-ups of the queue needs to | ||
513 | * be atomic towards the reads of priv->eskbp and shut-downs | ||
514 | * of the queue in grcan_start_xmit. | ||
515 | */ | ||
516 | u32 txrd = grcan_read_reg(®s->txrd); | ||
517 | |||
518 | for (work_done = 0; work_done < budget || budget < 0; work_done++) { | ||
519 | if (priv->eskbp == txrd) | ||
520 | break; | ||
521 | i = priv->eskbp / GRCAN_MSG_SIZE; | ||
522 | if (echo) { | ||
523 | /* Normal echo of messages */ | ||
524 | stats->tx_packets++; | ||
525 | stats->tx_bytes += priv->txdlc[i]; | ||
526 | priv->txdlc[i] = 0; | ||
527 | can_get_echo_skb(dev, i); | ||
528 | } else { | ||
529 | /* For cleanup of untransmitted messages */ | ||
530 | can_free_echo_skb(dev, i); | ||
531 | } | ||
532 | |||
533 | priv->eskbp = grcan_ring_add(priv->eskbp, GRCAN_MSG_SIZE, | ||
534 | dma->tx.size); | ||
535 | txrd = grcan_read_reg(®s->txrd); | ||
536 | } | ||
537 | return work_done; | ||
538 | } | ||
539 | |||
540 | static void grcan_lost_one_shot_frame(struct net_device *dev) | ||
541 | { | ||
542 | struct grcan_priv *priv = netdev_priv(dev); | ||
543 | struct grcan_registers __iomem *regs = priv->regs; | ||
544 | struct grcan_dma *dma = &priv->dma; | ||
545 | u32 txrd; | ||
546 | unsigned long flags; | ||
547 | |||
548 | spin_lock_irqsave(&priv->lock, flags); | ||
549 | |||
550 | catch_up_echo_skb(dev, -1, true); | ||
551 | |||
552 | if (unlikely(grcan_read_bits(®s->txctrl, GRCAN_TXCTRL_ENABLE))) { | ||
553 | /* Should never happen */ | ||
554 | netdev_err(dev, "TXCTRL enabled at TXLOSS in one shot mode\n"); | ||
555 | } else { | ||
556 | /* By the time an GRCAN_IRQ_TXLOSS is generated in | ||
557 | * one-shot mode there is no problem in writing | ||
558 | * to TXRD even in versions of the hardware in | ||
559 | * which GRCAN_TXCTRL_ONGOING is not cleared properly | ||
560 | * in one-shot mode. | ||
561 | */ | ||
562 | |||
563 | /* Skip message and discard echo-skb */ | ||
564 | txrd = grcan_read_reg(®s->txrd); | ||
565 | txrd = grcan_ring_add(txrd, GRCAN_MSG_SIZE, dma->tx.size); | ||
566 | grcan_write_reg(®s->txrd, txrd); | ||
567 | catch_up_echo_skb(dev, -1, false); | ||
568 | |||
569 | if (!priv->resetting && !priv->closing && | ||
570 | !(priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)) { | ||
571 | netif_wake_queue(dev); | ||
572 | grcan_set_bits(®s->txctrl, GRCAN_TXCTRL_ENABLE); | ||
573 | } | ||
574 | } | ||
575 | |||
576 | spin_unlock_irqrestore(&priv->lock, flags); | ||
577 | } | ||
578 | |||
579 | static void grcan_err(struct net_device *dev, u32 sources, u32 status) | ||
580 | { | ||
581 | struct grcan_priv *priv = netdev_priv(dev); | ||
582 | struct grcan_registers __iomem *regs = priv->regs; | ||
583 | struct grcan_dma *dma = &priv->dma; | ||
584 | struct net_device_stats *stats = &dev->stats; | ||
585 | struct can_frame cf; | ||
586 | |||
587 | /* Zero potential error_frame */ | ||
588 | memset(&cf, 0, sizeof(cf)); | ||
589 | |||
590 | /* Message lost interrupt. This might be due to arbitration error, but | ||
591 | * is also triggered when there is no one else on the can bus or when | ||
592 | * there is a problem with the hardware interface or the bus itself. As | ||
593 | * arbitration errors can not be singled out, no error frames are | ||
594 | * generated reporting this event as an arbitration error. | ||
595 | */ | ||
596 | if (sources & GRCAN_IRQ_TXLOSS) { | ||
597 | /* Take care of failed one-shot transmit */ | ||
598 | if (priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT) | ||
599 | grcan_lost_one_shot_frame(dev); | ||
600 | |||
601 | /* Stop printing as soon as error passive or bus off is in | ||
602 | * effect to limit the amount of txloss debug printouts. | ||
603 | */ | ||
604 | if (!(status & GRCAN_STAT_ERRCTR_RELATED)) { | ||
605 | netdev_dbg(dev, "tx message lost\n"); | ||
606 | stats->tx_errors++; | ||
607 | } | ||
608 | } | ||
609 | |||
610 | /* Conditions dealing with the error counters. There is no interrupt for | ||
611 | * error warning, but there are interrupts for increases of the error | ||
612 | * counters. | ||
613 | */ | ||
614 | if ((sources & GRCAN_IRQ_ERRCTR_RELATED) || | ||
615 | (status & GRCAN_STAT_ERRCTR_RELATED)) { | ||
616 | enum can_state state = priv->can.state; | ||
617 | enum can_state oldstate = state; | ||
618 | u32 txerr = (status & GRCAN_STAT_TXERRCNT) | ||
619 | >> GRCAN_STAT_TXERRCNT_BIT; | ||
620 | u32 rxerr = (status & GRCAN_STAT_RXERRCNT) | ||
621 | >> GRCAN_STAT_RXERRCNT_BIT; | ||
622 | |||
623 | /* Figure out current state */ | ||
624 | if (status & GRCAN_STAT_OFF) { | ||
625 | state = CAN_STATE_BUS_OFF; | ||
626 | } else if (status & GRCAN_STAT_PASS) { | ||
627 | state = CAN_STATE_ERROR_PASSIVE; | ||
628 | } else if (txerr >= GRCAN_STAT_ERRCNT_WARNING_LIMIT || | ||
629 | rxerr >= GRCAN_STAT_ERRCNT_WARNING_LIMIT) { | ||
630 | state = CAN_STATE_ERROR_WARNING; | ||
631 | } else { | ||
632 | state = CAN_STATE_ERROR_ACTIVE; | ||
633 | } | ||
634 | |||
635 | /* Handle and report state changes */ | ||
636 | if (state != oldstate) { | ||
637 | switch (state) { | ||
638 | case CAN_STATE_BUS_OFF: | ||
639 | netdev_dbg(dev, "bus-off\n"); | ||
640 | netif_carrier_off(dev); | ||
641 | priv->can.can_stats.bus_off++; | ||
642 | |||
643 | /* Prevent the hardware from recovering from bus | ||
644 | * off on its own if restart is disabled. | ||
645 | */ | ||
646 | if (!priv->can.restart_ms) | ||
647 | grcan_stop_hardware(dev); | ||
648 | |||
649 | cf.can_id |= CAN_ERR_BUSOFF; | ||
650 | break; | ||
651 | |||
652 | case CAN_STATE_ERROR_PASSIVE: | ||
653 | netdev_dbg(dev, "Error passive condition\n"); | ||
654 | priv->can.can_stats.error_passive++; | ||
655 | |||
656 | cf.can_id |= CAN_ERR_CRTL; | ||
657 | if (txerr >= GRCAN_STAT_ERRCNT_PASSIVE_LIMIT) | ||
658 | cf.data[1] |= CAN_ERR_CRTL_TX_PASSIVE; | ||
659 | if (rxerr >= GRCAN_STAT_ERRCNT_PASSIVE_LIMIT) | ||
660 | cf.data[1] |= CAN_ERR_CRTL_RX_PASSIVE; | ||
661 | break; | ||
662 | |||
663 | case CAN_STATE_ERROR_WARNING: | ||
664 | netdev_dbg(dev, "Error warning condition\n"); | ||
665 | priv->can.can_stats.error_warning++; | ||
666 | |||
667 | cf.can_id |= CAN_ERR_CRTL; | ||
668 | if (txerr >= GRCAN_STAT_ERRCNT_WARNING_LIMIT) | ||
669 | cf.data[1] |= CAN_ERR_CRTL_TX_WARNING; | ||
670 | if (rxerr >= GRCAN_STAT_ERRCNT_WARNING_LIMIT) | ||
671 | cf.data[1] |= CAN_ERR_CRTL_RX_WARNING; | ||
672 | break; | ||
673 | |||
674 | case CAN_STATE_ERROR_ACTIVE: | ||
675 | netdev_dbg(dev, "Error active condition\n"); | ||
676 | cf.can_id |= CAN_ERR_CRTL; | ||
677 | break; | ||
678 | |||
679 | default: | ||
680 | /* There are no others at this point */ | ||
681 | break; | ||
682 | } | ||
683 | cf.data[6] = txerr; | ||
684 | cf.data[7] = rxerr; | ||
685 | priv->can.state = state; | ||
686 | } | ||
687 | |||
688 | /* Report automatic restarts */ | ||
689 | if (priv->can.restart_ms && oldstate == CAN_STATE_BUS_OFF) { | ||
690 | unsigned long flags; | ||
691 | |||
692 | cf.can_id |= CAN_ERR_RESTARTED; | ||
693 | netdev_dbg(dev, "restarted\n"); | ||
694 | priv->can.can_stats.restarts++; | ||
695 | netif_carrier_on(dev); | ||
696 | |||
697 | spin_lock_irqsave(&priv->lock, flags); | ||
698 | |||
699 | if (!priv->resetting && !priv->closing) { | ||
700 | u32 txwr = grcan_read_reg(®s->txwr); | ||
701 | |||
702 | if (grcan_txspace(dma->tx.size, txwr, | ||
703 | priv->eskbp)) | ||
704 | netif_wake_queue(dev); | ||
705 | } | ||
706 | |||
707 | spin_unlock_irqrestore(&priv->lock, flags); | ||
708 | } | ||
709 | } | ||
710 | |||
711 | /* Data overrun interrupt */ | ||
712 | if ((sources & GRCAN_IRQ_OR) || (status & GRCAN_STAT_OR)) { | ||
713 | netdev_dbg(dev, "got data overrun interrupt\n"); | ||
714 | stats->rx_over_errors++; | ||
715 | stats->rx_errors++; | ||
716 | |||
717 | cf.can_id |= CAN_ERR_CRTL; | ||
718 | cf.data[1] |= CAN_ERR_CRTL_RX_OVERFLOW; | ||
719 | } | ||
720 | |||
721 | /* AHB bus error interrupts (not CAN bus errors) - shut down the | ||
722 | * device. | ||
723 | */ | ||
724 | if (sources & (GRCAN_IRQ_TXAHBERR | GRCAN_IRQ_RXAHBERR) || | ||
725 | (status & GRCAN_STAT_AHBERR)) { | ||
726 | char *txrx = ""; | ||
727 | unsigned long flags; | ||
728 | |||
729 | if (sources & GRCAN_IRQ_TXAHBERR) { | ||
730 | txrx = "on tx "; | ||
731 | stats->tx_errors++; | ||
732 | } else if (sources & GRCAN_IRQ_RXAHBERR) { | ||
733 | txrx = "on rx "; | ||
734 | stats->rx_errors++; | ||
735 | } | ||
736 | netdev_err(dev, "Fatal AHB buss error %s- halting device\n", | ||
737 | txrx); | ||
738 | |||
739 | spin_lock_irqsave(&priv->lock, flags); | ||
740 | |||
741 | /* Prevent anything to be enabled again and halt device */ | ||
742 | priv->closing = true; | ||
743 | netif_stop_queue(dev); | ||
744 | grcan_stop_hardware(dev); | ||
745 | priv->can.state = CAN_STATE_STOPPED; | ||
746 | |||
747 | spin_unlock_irqrestore(&priv->lock, flags); | ||
748 | } | ||
749 | |||
750 | /* Pass on error frame if something to report, | ||
751 | * i.e. id contains some information | ||
752 | */ | ||
753 | if (cf.can_id) { | ||
754 | struct can_frame *skb_cf; | ||
755 | struct sk_buff *skb = alloc_can_err_skb(dev, &skb_cf); | ||
756 | |||
757 | if (skb == NULL) { | ||
758 | netdev_dbg(dev, "could not allocate error frame\n"); | ||
759 | return; | ||
760 | } | ||
761 | skb_cf->can_id |= cf.can_id; | ||
762 | memcpy(skb_cf->data, cf.data, sizeof(cf.data)); | ||
763 | |||
764 | netif_rx(skb); | ||
765 | } | ||
766 | } | ||
767 | |||
768 | static irqreturn_t grcan_interrupt(int irq, void *dev_id) | ||
769 | { | ||
770 | struct net_device *dev = dev_id; | ||
771 | struct grcan_priv *priv = netdev_priv(dev); | ||
772 | struct grcan_registers __iomem *regs = priv->regs; | ||
773 | u32 sources, status; | ||
774 | |||
775 | /* Find out the source */ | ||
776 | sources = grcan_read_reg(®s->pimsr); | ||
777 | if (!sources) | ||
778 | return IRQ_NONE; | ||
779 | grcan_write_reg(®s->picr, sources); | ||
780 | status = grcan_read_reg(®s->stat); | ||
781 | |||
782 | /* If we got TX progress, the device has not hanged, | ||
783 | * so disable the hang timer | ||
784 | */ | ||
785 | if (priv->need_txbug_workaround && | ||
786 | (sources & (GRCAN_IRQ_TX | GRCAN_IRQ_TXLOSS))) { | ||
787 | del_timer(&priv->hang_timer); | ||
788 | } | ||
789 | |||
790 | /* Frame(s) received or transmitted */ | ||
791 | if (sources & (GRCAN_IRQ_TX | GRCAN_IRQ_RX)) { | ||
792 | /* Disable tx/rx interrupts and schedule poll(). No need for | ||
793 | * locking as interference from a running reset at worst leads | ||
794 | * to an extra interrupt. | ||
795 | */ | ||
796 | grcan_clear_bits(®s->imr, GRCAN_IRQ_TX | GRCAN_IRQ_RX); | ||
797 | napi_schedule(&priv->napi); | ||
798 | } | ||
799 | |||
800 | /* (Potential) error conditions to take care of */ | ||
801 | if (sources & GRCAN_IRQ_ERRORS) | ||
802 | grcan_err(dev, sources, status); | ||
803 | |||
804 | return IRQ_HANDLED; | ||
805 | } | ||
806 | |||
807 | /* Reset device and restart operations from where they were. | ||
808 | * | ||
809 | * This assumes that RXCTRL & RXCTRL is properly disabled and that RX | ||
810 | * is not ONGOING (TX might be stuck in ONGOING due to a harwrware bug | ||
811 | * for single shot) | ||
812 | */ | ||
813 | static void grcan_running_reset(unsigned long data) | ||
814 | { | ||
815 | struct net_device *dev = (struct net_device *)data; | ||
816 | struct grcan_priv *priv = netdev_priv(dev); | ||
817 | struct grcan_registers __iomem *regs = priv->regs; | ||
818 | unsigned long flags; | ||
819 | |||
820 | /* This temporarily messes with eskbp, so we need to lock | ||
821 | * priv->lock | ||
822 | */ | ||
823 | spin_lock_irqsave(&priv->lock, flags); | ||
824 | |||
825 | priv->resetting = false; | ||
826 | del_timer(&priv->hang_timer); | ||
827 | del_timer(&priv->rr_timer); | ||
828 | |||
829 | if (!priv->closing) { | ||
830 | /* Save and reset - config register preserved by grcan_reset */ | ||
831 | u32 imr = grcan_read_reg(®s->imr); | ||
832 | |||
833 | u32 txaddr = grcan_read_reg(®s->txaddr); | ||
834 | u32 txsize = grcan_read_reg(®s->txsize); | ||
835 | u32 txwr = grcan_read_reg(®s->txwr); | ||
836 | u32 txrd = grcan_read_reg(®s->txrd); | ||
837 | u32 eskbp = priv->eskbp; | ||
838 | |||
839 | u32 rxaddr = grcan_read_reg(®s->rxaddr); | ||
840 | u32 rxsize = grcan_read_reg(®s->rxsize); | ||
841 | u32 rxwr = grcan_read_reg(®s->rxwr); | ||
842 | u32 rxrd = grcan_read_reg(®s->rxrd); | ||
843 | |||
844 | grcan_reset(dev); | ||
845 | |||
846 | /* Restore */ | ||
847 | grcan_write_reg(®s->txaddr, txaddr); | ||
848 | grcan_write_reg(®s->txsize, txsize); | ||
849 | grcan_write_reg(®s->txwr, txwr); | ||
850 | grcan_write_reg(®s->txrd, txrd); | ||
851 | priv->eskbp = eskbp; | ||
852 | |||
853 | grcan_write_reg(®s->rxaddr, rxaddr); | ||
854 | grcan_write_reg(®s->rxsize, rxsize); | ||
855 | grcan_write_reg(®s->rxwr, rxwr); | ||
856 | grcan_write_reg(®s->rxrd, rxrd); | ||
857 | |||
858 | /* Turn on device again */ | ||
859 | grcan_write_reg(®s->imr, imr); | ||
860 | priv->can.state = CAN_STATE_ERROR_ACTIVE; | ||
861 | grcan_write_reg(®s->txctrl, GRCAN_TXCTRL_ENABLE | ||
862 | | (priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT | ||
863 | ? GRCAN_TXCTRL_SINGLE : 0)); | ||
864 | grcan_write_reg(®s->rxctrl, GRCAN_RXCTRL_ENABLE); | ||
865 | grcan_write_reg(®s->ctrl, GRCAN_CTRL_ENABLE); | ||
866 | |||
867 | /* Start queue if there is size and listen-onle mode is not | ||
868 | * enabled | ||
869 | */ | ||
870 | if (grcan_txspace(priv->dma.tx.size, txwr, priv->eskbp) && | ||
871 | !(priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)) | ||
872 | netif_wake_queue(dev); | ||
873 | } | ||
874 | |||
875 | spin_unlock_irqrestore(&priv->lock, flags); | ||
876 | |||
877 | netdev_err(dev, "Device reset and restored\n"); | ||
878 | } | ||
879 | |||
880 | /* Waiting time in usecs corresponding to the transmission of three maximum | ||
881 | * sized can frames in the given bitrate (in bits/sec). Waiting for this amount | ||
882 | * of time makes sure that the can controller have time to finish sending or | ||
883 | * receiving a frame with a good margin. | ||
884 | * | ||
885 | * usecs/sec * number of frames * bits/frame / bits/sec | ||
886 | */ | ||
887 | static inline u32 grcan_ongoing_wait_usecs(__u32 bitrate) | ||
888 | { | ||
889 | return 1000000 * 3 * GRCAN_EFF_FRAME_MAX_BITS / bitrate; | ||
890 | } | ||
891 | |||
892 | /* Set timer so that it will not fire until after a period in which the can | ||
893 | * controller have a good margin to finish transmitting a frame unless it has | ||
894 | * hanged | ||
895 | */ | ||
896 | static inline void grcan_reset_timer(struct timer_list *timer, __u32 bitrate) | ||
897 | { | ||
898 | u32 wait_jiffies = usecs_to_jiffies(grcan_ongoing_wait_usecs(bitrate)); | ||
899 | |||
900 | mod_timer(timer, jiffies + wait_jiffies); | ||
901 | } | ||
902 | |||
903 | /* Disable channels and schedule a running reset */ | ||
904 | static void grcan_initiate_running_reset(unsigned long data) | ||
905 | { | ||
906 | struct net_device *dev = (struct net_device *)data; | ||
907 | struct grcan_priv *priv = netdev_priv(dev); | ||
908 | struct grcan_registers __iomem *regs = priv->regs; | ||
909 | unsigned long flags; | ||
910 | |||
911 | netdev_err(dev, "Device seems hanged - reset scheduled\n"); | ||
912 | |||
913 | spin_lock_irqsave(&priv->lock, flags); | ||
914 | |||
915 | /* The main body of this function must never be executed again | ||
916 | * until after an execution of grcan_running_reset | ||
917 | */ | ||
918 | if (!priv->resetting && !priv->closing) { | ||
919 | priv->resetting = true; | ||
920 | netif_stop_queue(dev); | ||
921 | grcan_clear_bits(®s->txctrl, GRCAN_TXCTRL_ENABLE); | ||
922 | grcan_clear_bits(®s->rxctrl, GRCAN_RXCTRL_ENABLE); | ||
923 | grcan_reset_timer(&priv->rr_timer, priv->can.bittiming.bitrate); | ||
924 | } | ||
925 | |||
926 | spin_unlock_irqrestore(&priv->lock, flags); | ||
927 | } | ||
928 | |||
929 | static void grcan_free_dma_buffers(struct net_device *dev) | ||
930 | { | ||
931 | struct grcan_priv *priv = netdev_priv(dev); | ||
932 | struct grcan_dma *dma = &priv->dma; | ||
933 | |||
934 | dma_free_coherent(&dev->dev, dma->base_size, dma->base_buf, | ||
935 | dma->base_handle); | ||
936 | memset(dma, 0, sizeof(*dma)); | ||
937 | } | ||
938 | |||
939 | static int grcan_allocate_dma_buffers(struct net_device *dev, | ||
940 | size_t tsize, size_t rsize) | ||
941 | { | ||
942 | struct grcan_priv *priv = netdev_priv(dev); | ||
943 | struct grcan_dma *dma = &priv->dma; | ||
944 | struct grcan_dma_buffer *large = rsize > tsize ? &dma->rx : &dma->tx; | ||
945 | struct grcan_dma_buffer *small = rsize > tsize ? &dma->tx : &dma->rx; | ||
946 | size_t shift; | ||
947 | |||
948 | /* Need a whole number of GRCAN_BUFFER_ALIGNMENT for the large, | ||
949 | * i.e. first buffer | ||
950 | */ | ||
951 | size_t maxs = max(tsize, rsize); | ||
952 | size_t lsize = ALIGN(maxs, GRCAN_BUFFER_ALIGNMENT); | ||
953 | |||
954 | /* Put the small buffer after that */ | ||
955 | size_t ssize = min(tsize, rsize); | ||
956 | |||
957 | /* Extra GRCAN_BUFFER_ALIGNMENT to allow for alignment */ | ||
958 | dma->base_size = lsize + ssize + GRCAN_BUFFER_ALIGNMENT; | ||
959 | dma->base_buf = dma_alloc_coherent(&dev->dev, | ||
960 | dma->base_size, | ||
961 | &dma->base_handle, | ||
962 | GFP_KERNEL); | ||
963 | |||
964 | if (!dma->base_buf) | ||
965 | return -ENOMEM; | ||
966 | |||
967 | dma->tx.size = tsize; | ||
968 | dma->rx.size = rsize; | ||
969 | |||
970 | large->handle = ALIGN(dma->base_handle, GRCAN_BUFFER_ALIGNMENT); | ||
971 | small->handle = large->handle + lsize; | ||
972 | shift = large->handle - dma->base_handle; | ||
973 | |||
974 | large->buf = dma->base_buf + shift; | ||
975 | small->buf = large->buf + lsize; | ||
976 | |||
977 | return 0; | ||
978 | } | ||
979 | |||
980 | /* priv->lock *must* be held when calling this function */ | ||
981 | static int grcan_start(struct net_device *dev) | ||
982 | { | ||
983 | struct grcan_priv *priv = netdev_priv(dev); | ||
984 | struct grcan_registers __iomem *regs = priv->regs; | ||
985 | u32 confop, txctrl; | ||
986 | |||
987 | grcan_reset(dev); | ||
988 | |||
989 | grcan_write_reg(®s->txaddr, priv->dma.tx.handle); | ||
990 | grcan_write_reg(®s->txsize, priv->dma.tx.size); | ||
991 | /* regs->txwr, regs->txrd and priv->eskbp already set to 0 by reset */ | ||
992 | |||
993 | grcan_write_reg(®s->rxaddr, priv->dma.rx.handle); | ||
994 | grcan_write_reg(®s->rxsize, priv->dma.rx.size); | ||
995 | /* regs->rxwr and regs->rxrd already set to 0 by reset */ | ||
996 | |||
997 | /* Enable interrupts */ | ||
998 | grcan_read_reg(®s->pir); | ||
999 | grcan_write_reg(®s->imr, GRCAN_IRQ_DEFAULT); | ||
1000 | |||
1001 | /* Enable interfaces, channels and device */ | ||
1002 | confop = GRCAN_CONF_ABORT | ||
1003 | | (priv->config.enable0 ? GRCAN_CONF_ENABLE0 : 0) | ||
1004 | | (priv->config.enable1 ? GRCAN_CONF_ENABLE1 : 0) | ||
1005 | | (priv->config.select ? GRCAN_CONF_SELECT : 0) | ||
1006 | | (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY ? | ||
1007 | GRCAN_CONF_SILENT : 0) | ||
1008 | | (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES ? | ||
1009 | GRCAN_CONF_SAM : 0); | ||
1010 | grcan_write_bits(®s->conf, confop, GRCAN_CONF_OPERATION); | ||
1011 | txctrl = GRCAN_TXCTRL_ENABLE | ||
1012 | | (priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT | ||
1013 | ? GRCAN_TXCTRL_SINGLE : 0); | ||
1014 | grcan_write_reg(®s->txctrl, txctrl); | ||
1015 | grcan_write_reg(®s->rxctrl, GRCAN_RXCTRL_ENABLE); | ||
1016 | grcan_write_reg(®s->ctrl, GRCAN_CTRL_ENABLE); | ||
1017 | |||
1018 | priv->can.state = CAN_STATE_ERROR_ACTIVE; | ||
1019 | |||
1020 | return 0; | ||
1021 | } | ||
1022 | |||
1023 | static int grcan_set_mode(struct net_device *dev, enum can_mode mode) | ||
1024 | { | ||
1025 | struct grcan_priv *priv = netdev_priv(dev); | ||
1026 | unsigned long flags; | ||
1027 | int err = 0; | ||
1028 | |||
1029 | if (mode == CAN_MODE_START) { | ||
1030 | /* This might be called to restart the device to recover from | ||
1031 | * bus off errors | ||
1032 | */ | ||
1033 | spin_lock_irqsave(&priv->lock, flags); | ||
1034 | if (priv->closing || priv->resetting) { | ||
1035 | err = -EBUSY; | ||
1036 | } else { | ||
1037 | netdev_info(dev, "Restarting device\n"); | ||
1038 | grcan_start(dev); | ||
1039 | if (!(priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)) | ||
1040 | netif_wake_queue(dev); | ||
1041 | } | ||
1042 | spin_unlock_irqrestore(&priv->lock, flags); | ||
1043 | return err; | ||
1044 | } | ||
1045 | return -EOPNOTSUPP; | ||
1046 | } | ||
1047 | |||
1048 | static int grcan_open(struct net_device *dev) | ||
1049 | { | ||
1050 | struct grcan_priv *priv = netdev_priv(dev); | ||
1051 | struct grcan_dma *dma = &priv->dma; | ||
1052 | unsigned long flags; | ||
1053 | int err; | ||
1054 | |||
1055 | /* Allocate memory */ | ||
1056 | err = grcan_allocate_dma_buffers(dev, priv->config.txsize, | ||
1057 | priv->config.rxsize); | ||
1058 | if (err) { | ||
1059 | netdev_err(dev, "could not allocate DMA buffers\n"); | ||
1060 | return err; | ||
1061 | } | ||
1062 | |||
1063 | priv->echo_skb = kzalloc(dma->tx.size * sizeof(*priv->echo_skb), | ||
1064 | GFP_KERNEL); | ||
1065 | if (!priv->echo_skb) { | ||
1066 | err = -ENOMEM; | ||
1067 | goto exit_free_dma_buffers; | ||
1068 | } | ||
1069 | priv->can.echo_skb_max = dma->tx.size; | ||
1070 | priv->can.echo_skb = priv->echo_skb; | ||
1071 | |||
1072 | priv->txdlc = kzalloc(dma->tx.size * sizeof(*priv->txdlc), GFP_KERNEL); | ||
1073 | if (!priv->txdlc) { | ||
1074 | err = -ENOMEM; | ||
1075 | goto exit_free_echo_skb; | ||
1076 | } | ||
1077 | |||
1078 | /* Get can device up */ | ||
1079 | err = open_candev(dev); | ||
1080 | if (err) | ||
1081 | goto exit_free_txdlc; | ||
1082 | |||
1083 | err = request_irq(dev->irq, grcan_interrupt, IRQF_SHARED, | ||
1084 | dev->name, dev); | ||
1085 | if (err) | ||
1086 | goto exit_close_candev; | ||
1087 | |||
1088 | spin_lock_irqsave(&priv->lock, flags); | ||
1089 | |||
1090 | napi_enable(&priv->napi); | ||
1091 | grcan_start(dev); | ||
1092 | if (!(priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)) | ||
1093 | netif_start_queue(dev); | ||
1094 | priv->resetting = false; | ||
1095 | priv->closing = false; | ||
1096 | |||
1097 | spin_unlock_irqrestore(&priv->lock, flags); | ||
1098 | |||
1099 | return 0; | ||
1100 | |||
1101 | exit_close_candev: | ||
1102 | close_candev(dev); | ||
1103 | exit_free_txdlc: | ||
1104 | kfree(priv->txdlc); | ||
1105 | exit_free_echo_skb: | ||
1106 | kfree(priv->echo_skb); | ||
1107 | exit_free_dma_buffers: | ||
1108 | grcan_free_dma_buffers(dev); | ||
1109 | return err; | ||
1110 | } | ||
1111 | |||
1112 | static int grcan_close(struct net_device *dev) | ||
1113 | { | ||
1114 | struct grcan_priv *priv = netdev_priv(dev); | ||
1115 | unsigned long flags; | ||
1116 | |||
1117 | napi_disable(&priv->napi); | ||
1118 | |||
1119 | spin_lock_irqsave(&priv->lock, flags); | ||
1120 | |||
1121 | priv->closing = true; | ||
1122 | if (priv->need_txbug_workaround) { | ||
1123 | del_timer_sync(&priv->hang_timer); | ||
1124 | del_timer_sync(&priv->rr_timer); | ||
1125 | } | ||
1126 | netif_stop_queue(dev); | ||
1127 | grcan_stop_hardware(dev); | ||
1128 | priv->can.state = CAN_STATE_STOPPED; | ||
1129 | |||
1130 | spin_unlock_irqrestore(&priv->lock, flags); | ||
1131 | |||
1132 | free_irq(dev->irq, dev); | ||
1133 | close_candev(dev); | ||
1134 | |||
1135 | grcan_free_dma_buffers(dev); | ||
1136 | priv->can.echo_skb_max = 0; | ||
1137 | priv->can.echo_skb = NULL; | ||
1138 | kfree(priv->echo_skb); | ||
1139 | kfree(priv->txdlc); | ||
1140 | |||
1141 | return 0; | ||
1142 | } | ||
1143 | |||
1144 | static int grcan_transmit_catch_up(struct net_device *dev, int budget) | ||
1145 | { | ||
1146 | struct grcan_priv *priv = netdev_priv(dev); | ||
1147 | unsigned long flags; | ||
1148 | int work_done; | ||
1149 | |||
1150 | spin_lock_irqsave(&priv->lock, flags); | ||
1151 | |||
1152 | work_done = catch_up_echo_skb(dev, budget, true); | ||
1153 | if (work_done) { | ||
1154 | if (!priv->resetting && !priv->closing && | ||
1155 | !(priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)) | ||
1156 | netif_wake_queue(dev); | ||
1157 | |||
1158 | /* With napi we don't get TX interrupts for a while, | ||
1159 | * so prevent a running reset while catching up | ||
1160 | */ | ||
1161 | if (priv->need_txbug_workaround) | ||
1162 | del_timer(&priv->hang_timer); | ||
1163 | } | ||
1164 | |||
1165 | spin_unlock_irqrestore(&priv->lock, flags); | ||
1166 | |||
1167 | return work_done; | ||
1168 | } | ||
1169 | |||
1170 | static int grcan_receive(struct net_device *dev, int budget) | ||
1171 | { | ||
1172 | struct grcan_priv *priv = netdev_priv(dev); | ||
1173 | struct grcan_registers __iomem *regs = priv->regs; | ||
1174 | struct grcan_dma *dma = &priv->dma; | ||
1175 | struct net_device_stats *stats = &dev->stats; | ||
1176 | struct can_frame *cf; | ||
1177 | struct sk_buff *skb; | ||
1178 | u32 wr, rd, startrd; | ||
1179 | u32 *slot; | ||
1180 | u32 i, rtr, eff, j, shift; | ||
1181 | int work_done = 0; | ||
1182 | |||
1183 | rd = grcan_read_reg(®s->rxrd); | ||
1184 | startrd = rd; | ||
1185 | for (work_done = 0; work_done < budget; work_done++) { | ||
1186 | /* Check for packet to receive */ | ||
1187 | wr = grcan_read_reg(®s->rxwr); | ||
1188 | if (rd == wr) | ||
1189 | break; | ||
1190 | |||
1191 | /* Take care of packet */ | ||
1192 | skb = alloc_can_skb(dev, &cf); | ||
1193 | if (skb == NULL) { | ||
1194 | netdev_err(dev, | ||
1195 | "dropping frame: skb allocation failed\n"); | ||
1196 | stats->rx_dropped++; | ||
1197 | continue; | ||
1198 | } | ||
1199 | |||
1200 | slot = dma->rx.buf + rd; | ||
1201 | eff = slot[0] & GRCAN_MSG_IDE; | ||
1202 | rtr = slot[0] & GRCAN_MSG_RTR; | ||
1203 | if (eff) { | ||
1204 | cf->can_id = ((slot[0] & GRCAN_MSG_EID) | ||
1205 | >> GRCAN_MSG_EID_BIT); | ||
1206 | cf->can_id |= CAN_EFF_FLAG; | ||
1207 | } else { | ||
1208 | cf->can_id = ((slot[0] & GRCAN_MSG_BID) | ||
1209 | >> GRCAN_MSG_BID_BIT); | ||
1210 | } | ||
1211 | cf->can_dlc = get_can_dlc((slot[1] & GRCAN_MSG_DLC) | ||
1212 | >> GRCAN_MSG_DLC_BIT); | ||
1213 | if (rtr) { | ||
1214 | cf->can_id |= CAN_RTR_FLAG; | ||
1215 | } else { | ||
1216 | for (i = 0; i < cf->can_dlc; i++) { | ||
1217 | j = GRCAN_MSG_DATA_SLOT_INDEX(i); | ||
1218 | shift = GRCAN_MSG_DATA_SHIFT(i); | ||
1219 | cf->data[i] = (u8)(slot[j] >> shift); | ||
1220 | } | ||
1221 | } | ||
1222 | netif_receive_skb(skb); | ||
1223 | |||
1224 | /* Update statistics and read pointer */ | ||
1225 | stats->rx_packets++; | ||
1226 | stats->rx_bytes += cf->can_dlc; | ||
1227 | rd = grcan_ring_add(rd, GRCAN_MSG_SIZE, dma->rx.size); | ||
1228 | } | ||
1229 | |||
1230 | /* Make sure everything is read before allowing hardware to | ||
1231 | * use the memory | ||
1232 | */ | ||
1233 | mb(); | ||
1234 | |||
1235 | /* Update read pointer - no need to check for ongoing */ | ||
1236 | if (likely(rd != startrd)) | ||
1237 | grcan_write_reg(®s->rxrd, rd); | ||
1238 | |||
1239 | return work_done; | ||
1240 | } | ||
1241 | |||
1242 | static int grcan_poll(struct napi_struct *napi, int budget) | ||
1243 | { | ||
1244 | struct grcan_priv *priv = container_of(napi, struct grcan_priv, napi); | ||
1245 | struct net_device *dev = priv->dev; | ||
1246 | struct grcan_registers __iomem *regs = priv->regs; | ||
1247 | unsigned long flags; | ||
1248 | int tx_work_done, rx_work_done; | ||
1249 | int rx_budget = budget / 2; | ||
1250 | int tx_budget = budget - rx_budget; | ||
1251 | |||
1252 | /* Half of the budget for receiveing messages */ | ||
1253 | rx_work_done = grcan_receive(dev, rx_budget); | ||
1254 | |||
1255 | /* Half of the budget for transmitting messages as that can trigger echo | ||
1256 | * frames being received | ||
1257 | */ | ||
1258 | tx_work_done = grcan_transmit_catch_up(dev, tx_budget); | ||
1259 | |||
1260 | if (rx_work_done < rx_budget && tx_work_done < tx_budget) { | ||
1261 | napi_complete(napi); | ||
1262 | |||
1263 | /* Guarantee no interference with a running reset that otherwise | ||
1264 | * could turn off interrupts. | ||
1265 | */ | ||
1266 | spin_lock_irqsave(&priv->lock, flags); | ||
1267 | |||
1268 | /* Enable tx and rx interrupts again. No need to check | ||
1269 | * priv->closing as napi_disable in grcan_close is waiting for | ||
1270 | * scheduled napi calls to finish. | ||
1271 | */ | ||
1272 | grcan_set_bits(®s->imr, GRCAN_IRQ_TX | GRCAN_IRQ_RX); | ||
1273 | |||
1274 | spin_unlock_irqrestore(&priv->lock, flags); | ||
1275 | } | ||
1276 | |||
1277 | return rx_work_done + tx_work_done; | ||
1278 | } | ||
1279 | |||
1280 | /* Work tx bug by waiting while for the risky situation to clear. If that fails, | ||
1281 | * drop a frame in one-shot mode or indicate a busy device otherwise. | ||
1282 | * | ||
1283 | * Returns 0 on successful wait. Otherwise it sets *netdev_tx_status to the | ||
1284 | * value that should be returned by grcan_start_xmit when aborting the xmit. | ||
1285 | */ | ||
1286 | static int grcan_txbug_workaround(struct net_device *dev, struct sk_buff *skb, | ||
1287 | u32 txwr, u32 oneshotmode, | ||
1288 | netdev_tx_t *netdev_tx_status) | ||
1289 | { | ||
1290 | struct grcan_priv *priv = netdev_priv(dev); | ||
1291 | struct grcan_registers __iomem *regs = priv->regs; | ||
1292 | struct grcan_dma *dma = &priv->dma; | ||
1293 | int i; | ||
1294 | unsigned long flags; | ||
1295 | |||
1296 | /* Wait a while for ongoing to be cleared or read pointer to catch up to | ||
1297 | * write pointer. The latter is needed due to a bug in older versions of | ||
1298 | * GRCAN in which ONGOING is not cleared properly one-shot mode when a | ||
1299 | * transmission fails. | ||
1300 | */ | ||
1301 | for (i = 0; i < GRCAN_SHORTWAIT_USECS; i++) { | ||
1302 | udelay(1); | ||
1303 | if (!grcan_read_bits(®s->txctrl, GRCAN_TXCTRL_ONGOING) || | ||
1304 | grcan_read_reg(®s->txrd) == txwr) { | ||
1305 | return 0; | ||
1306 | } | ||
1307 | } | ||
1308 | |||
1309 | /* Clean up, in case the situation was not resolved */ | ||
1310 | spin_lock_irqsave(&priv->lock, flags); | ||
1311 | if (!priv->resetting && !priv->closing) { | ||
1312 | /* Queue might have been stopped earlier in grcan_start_xmit */ | ||
1313 | if (grcan_txspace(dma->tx.size, txwr, priv->eskbp)) | ||
1314 | netif_wake_queue(dev); | ||
1315 | /* Set a timer to resolve a hanged tx controller */ | ||
1316 | if (!timer_pending(&priv->hang_timer)) | ||
1317 | grcan_reset_timer(&priv->hang_timer, | ||
1318 | priv->can.bittiming.bitrate); | ||
1319 | } | ||
1320 | spin_unlock_irqrestore(&priv->lock, flags); | ||
1321 | |||
1322 | if (oneshotmode) { | ||
1323 | /* In one-shot mode we should never end up here because | ||
1324 | * then the interrupt handler increases txrd on TXLOSS, | ||
1325 | * but it is consistent with one-shot mode to drop the | ||
1326 | * frame in this case. | ||
1327 | */ | ||
1328 | kfree_skb(skb); | ||
1329 | *netdev_tx_status = NETDEV_TX_OK; | ||
1330 | } else { | ||
1331 | /* In normal mode the socket-can transmission queue get | ||
1332 | * to keep the frame so that it can be retransmitted | ||
1333 | * later | ||
1334 | */ | ||
1335 | *netdev_tx_status = NETDEV_TX_BUSY; | ||
1336 | } | ||
1337 | return -EBUSY; | ||
1338 | } | ||
1339 | |||
1340 | /* Notes on the tx cyclic buffer handling: | ||
1341 | * | ||
1342 | * regs->txwr - the next slot for the driver to put data to be sent | ||
1343 | * regs->txrd - the next slot for the device to read data | ||
1344 | * priv->eskbp - the next slot for the driver to call can_put_echo_skb for | ||
1345 | * | ||
1346 | * grcan_start_xmit can enter more messages as long as regs->txwr does | ||
1347 | * not reach priv->eskbp (within 1 message gap) | ||
1348 | * | ||
1349 | * The device sends messages until regs->txrd reaches regs->txwr | ||
1350 | * | ||
1351 | * The interrupt calls handler calls can_put_echo_skb until | ||
1352 | * priv->eskbp reaches regs->txrd | ||
1353 | */ | ||
1354 | static netdev_tx_t grcan_start_xmit(struct sk_buff *skb, | ||
1355 | struct net_device *dev) | ||
1356 | { | ||
1357 | struct grcan_priv *priv = netdev_priv(dev); | ||
1358 | struct grcan_registers __iomem *regs = priv->regs; | ||
1359 | struct grcan_dma *dma = &priv->dma; | ||
1360 | struct can_frame *cf = (struct can_frame *)skb->data; | ||
1361 | u32 id, txwr, txrd, space, txctrl; | ||
1362 | int slotindex; | ||
1363 | u32 *slot; | ||
1364 | u32 i, rtr, eff, dlc, tmp, err; | ||
1365 | int j, shift; | ||
1366 | unsigned long flags; | ||
1367 | u32 oneshotmode = priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT; | ||
1368 | |||
1369 | if (can_dropped_invalid_skb(dev, skb)) | ||
1370 | return NETDEV_TX_OK; | ||
1371 | |||
1372 | /* Trying to transmit in silent mode will generate error interrupts, but | ||
1373 | * this should never happen - the queue should not have been started. | ||
1374 | */ | ||
1375 | if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) | ||
1376 | return NETDEV_TX_BUSY; | ||
1377 | |||
1378 | /* Reads of priv->eskbp and shut-downs of the queue needs to | ||
1379 | * be atomic towards the updates to priv->eskbp and wake-ups | ||
1380 | * of the queue in the interrupt handler. | ||
1381 | */ | ||
1382 | spin_lock_irqsave(&priv->lock, flags); | ||
1383 | |||
1384 | txwr = grcan_read_reg(®s->txwr); | ||
1385 | space = grcan_txspace(dma->tx.size, txwr, priv->eskbp); | ||
1386 | |||
1387 | slotindex = txwr / GRCAN_MSG_SIZE; | ||
1388 | slot = dma->tx.buf + txwr; | ||
1389 | |||
1390 | if (unlikely(space == 1)) | ||
1391 | netif_stop_queue(dev); | ||
1392 | |||
1393 | spin_unlock_irqrestore(&priv->lock, flags); | ||
1394 | /* End of critical section*/ | ||
1395 | |||
1396 | /* This should never happen. If circular buffer is full, the | ||
1397 | * netif_stop_queue should have been stopped already. | ||
1398 | */ | ||
1399 | if (unlikely(!space)) { | ||
1400 | netdev_err(dev, "No buffer space, but queue is non-stopped.\n"); | ||
1401 | return NETDEV_TX_BUSY; | ||
1402 | } | ||
1403 | |||
1404 | /* Convert and write CAN message to DMA buffer */ | ||
1405 | eff = cf->can_id & CAN_EFF_FLAG; | ||
1406 | rtr = cf->can_id & CAN_RTR_FLAG; | ||
1407 | id = cf->can_id & (eff ? CAN_EFF_MASK : CAN_SFF_MASK); | ||
1408 | dlc = cf->can_dlc; | ||
1409 | if (eff) | ||
1410 | tmp = (id << GRCAN_MSG_EID_BIT) & GRCAN_MSG_EID; | ||
1411 | else | ||
1412 | tmp = (id << GRCAN_MSG_BID_BIT) & GRCAN_MSG_BID; | ||
1413 | slot[0] = (eff ? GRCAN_MSG_IDE : 0) | (rtr ? GRCAN_MSG_RTR : 0) | tmp; | ||
1414 | |||
1415 | slot[1] = ((dlc << GRCAN_MSG_DLC_BIT) & GRCAN_MSG_DLC); | ||
1416 | slot[2] = 0; | ||
1417 | slot[3] = 0; | ||
1418 | for (i = 0; i < dlc; i++) { | ||
1419 | j = GRCAN_MSG_DATA_SLOT_INDEX(i); | ||
1420 | shift = GRCAN_MSG_DATA_SHIFT(i); | ||
1421 | slot[j] |= cf->data[i] << shift; | ||
1422 | } | ||
1423 | |||
1424 | /* Checking that channel has not been disabled. These cases | ||
1425 | * should never happen | ||
1426 | */ | ||
1427 | txctrl = grcan_read_reg(®s->txctrl); | ||
1428 | if (!(txctrl & GRCAN_TXCTRL_ENABLE)) | ||
1429 | netdev_err(dev, "tx channel spuriously disabled\n"); | ||
1430 | |||
1431 | if (oneshotmode && !(txctrl & GRCAN_TXCTRL_SINGLE)) | ||
1432 | netdev_err(dev, "one-shot mode spuriously disabled\n"); | ||
1433 | |||
1434 | /* Bug workaround for old version of grcan where updating txwr | ||
1435 | * in the same clock cycle as the controller updates txrd to | ||
1436 | * the current txwr could hang the can controller | ||
1437 | */ | ||
1438 | if (priv->need_txbug_workaround) { | ||
1439 | txrd = grcan_read_reg(®s->txrd); | ||
1440 | if (unlikely(grcan_ring_sub(txwr, txrd, dma->tx.size) == 1)) { | ||
1441 | netdev_tx_t txstatus; | ||
1442 | |||
1443 | err = grcan_txbug_workaround(dev, skb, txwr, | ||
1444 | oneshotmode, &txstatus); | ||
1445 | if (err) | ||
1446 | return txstatus; | ||
1447 | } | ||
1448 | } | ||
1449 | |||
1450 | /* Prepare skb for echoing. This must be after the bug workaround above | ||
1451 | * as ownership of the skb is passed on by calling can_put_echo_skb. | ||
1452 | * Returning NETDEV_TX_BUSY or accessing skb or cf after a call to | ||
1453 | * can_put_echo_skb would be an error unless other measures are | ||
1454 | * taken. | ||
1455 | */ | ||
1456 | priv->txdlc[slotindex] = cf->can_dlc; /* Store dlc for statistics */ | ||
1457 | can_put_echo_skb(skb, dev, slotindex); | ||
1458 | |||
1459 | /* Make sure everything is written before allowing hardware to | ||
1460 | * read from the memory | ||
1461 | */ | ||
1462 | wmb(); | ||
1463 | |||
1464 | /* Update write pointer to start transmission */ | ||
1465 | grcan_write_reg(®s->txwr, | ||
1466 | grcan_ring_add(txwr, GRCAN_MSG_SIZE, dma->tx.size)); | ||
1467 | |||
1468 | return NETDEV_TX_OK; | ||
1469 | } | ||
1470 | |||
1471 | /* ========== Setting up sysfs interface and module parameters ========== */ | ||
1472 | |||
1473 | #define GRCAN_NOT_BOOL(unsigned_val) ((unsigned_val) > 1) | ||
1474 | |||
1475 | #define GRCAN_MODULE_PARAM(name, mtype, valcheckf, desc) \ | ||
1476 | static void grcan_sanitize_##name(struct platform_device *pd) \ | ||
1477 | { \ | ||
1478 | struct grcan_device_config grcan_default_config \ | ||
1479 | = GRCAN_DEFAULT_DEVICE_CONFIG; \ | ||
1480 | if (valcheckf(grcan_module_config.name)) { \ | ||
1481 | dev_err(&pd->dev, \ | ||
1482 | "Invalid module parameter value for " \ | ||
1483 | #name " - setting default\n"); \ | ||
1484 | grcan_module_config.name = \ | ||
1485 | grcan_default_config.name; \ | ||
1486 | } \ | ||
1487 | } \ | ||
1488 | module_param_named(name, grcan_module_config.name, \ | ||
1489 | mtype, S_IRUGO); \ | ||
1490 | MODULE_PARM_DESC(name, desc) | ||
1491 | |||
1492 | #define GRCAN_CONFIG_ATTR(name, desc) \ | ||
1493 | static ssize_t grcan_store_##name(struct device *sdev, \ | ||
1494 | struct device_attribute *att, \ | ||
1495 | const char *buf, \ | ||
1496 | size_t count) \ | ||
1497 | { \ | ||
1498 | struct net_device *dev = to_net_dev(sdev); \ | ||
1499 | struct grcan_priv *priv = netdev_priv(dev); \ | ||
1500 | u8 val; \ | ||
1501 | int ret; \ | ||
1502 | if (dev->flags & IFF_UP) \ | ||
1503 | return -EBUSY; \ | ||
1504 | ret = kstrtou8(buf, 0, &val); \ | ||
1505 | if (ret < 0 || val > 1) \ | ||
1506 | return -EINVAL; \ | ||
1507 | priv->config.name = val; \ | ||
1508 | return count; \ | ||
1509 | } \ | ||
1510 | static ssize_t grcan_show_##name(struct device *sdev, \ | ||
1511 | struct device_attribute *att, \ | ||
1512 | char *buf) \ | ||
1513 | { \ | ||
1514 | struct net_device *dev = to_net_dev(sdev); \ | ||
1515 | struct grcan_priv *priv = netdev_priv(dev); \ | ||
1516 | return sprintf(buf, "%d\n", priv->config.name); \ | ||
1517 | } \ | ||
1518 | static DEVICE_ATTR(name, S_IRUGO | S_IWUSR, \ | ||
1519 | grcan_show_##name, \ | ||
1520 | grcan_store_##name); \ | ||
1521 | GRCAN_MODULE_PARAM(name, ushort, GRCAN_NOT_BOOL, desc) | ||
1522 | |||
1523 | /* The following configuration options are made available both via module | ||
1524 | * parameters and writable sysfs files. See the chapter about GRCAN in the | ||
1525 | * documentation for the GRLIB VHDL library for further details. | ||
1526 | */ | ||
1527 | GRCAN_CONFIG_ATTR(enable0, | ||
1528 | "Configuration of physical interface 0. Determines\n" \ | ||
1529 | "the \"Enable 0\" bit of the configuration register.\n" \ | ||
1530 | "Format: 0 | 1\nDefault: 0\n"); | ||
1531 | |||
1532 | GRCAN_CONFIG_ATTR(enable1, | ||
1533 | "Configuration of physical interface 1. Determines\n" \ | ||
1534 | "the \"Enable 1\" bit of the configuration register.\n" \ | ||
1535 | "Format: 0 | 1\nDefault: 0\n"); | ||
1536 | |||
1537 | GRCAN_CONFIG_ATTR(select, | ||
1538 | "Select which physical interface to use.\n" \ | ||
1539 | "Format: 0 | 1\nDefault: 0\n"); | ||
1540 | |||
1541 | /* The tx and rx buffer size configuration options are only available via module | ||
1542 | * parameters. | ||
1543 | */ | ||
1544 | GRCAN_MODULE_PARAM(txsize, uint, GRCAN_INVALID_BUFFER_SIZE, | ||
1545 | "Sets the size of the tx buffer.\n" \ | ||
1546 | "Format: <unsigned int> where (txsize & ~0x1fffc0) == 0\n" \ | ||
1547 | "Default: 1024\n"); | ||
1548 | GRCAN_MODULE_PARAM(rxsize, uint, GRCAN_INVALID_BUFFER_SIZE, | ||
1549 | "Sets the size of the rx buffer.\n" \ | ||
1550 | "Format: <unsigned int> where (size & ~0x1fffc0) == 0\n" \ | ||
1551 | "Default: 1024\n"); | ||
1552 | |||
1553 | /* Function that makes sure that configuration done using | ||
1554 | * module parameters are set to valid values | ||
1555 | */ | ||
1556 | static void grcan_sanitize_module_config(struct platform_device *ofdev) | ||
1557 | { | ||
1558 | grcan_sanitize_enable0(ofdev); | ||
1559 | grcan_sanitize_enable1(ofdev); | ||
1560 | grcan_sanitize_select(ofdev); | ||
1561 | grcan_sanitize_txsize(ofdev); | ||
1562 | grcan_sanitize_rxsize(ofdev); | ||
1563 | } | ||
1564 | |||
1565 | static const struct attribute *const sysfs_grcan_attrs[] = { | ||
1566 | /* Config attrs */ | ||
1567 | &dev_attr_enable0.attr, | ||
1568 | &dev_attr_enable1.attr, | ||
1569 | &dev_attr_select.attr, | ||
1570 | NULL, | ||
1571 | }; | ||
1572 | |||
1573 | static const struct attribute_group sysfs_grcan_group = { | ||
1574 | .name = "grcan", | ||
1575 | .attrs = (struct attribute **)sysfs_grcan_attrs, | ||
1576 | }; | ||
1577 | |||
1578 | /* ========== Setting up the driver ========== */ | ||
1579 | |||
1580 | static const struct net_device_ops grcan_netdev_ops = { | ||
1581 | .ndo_open = grcan_open, | ||
1582 | .ndo_stop = grcan_close, | ||
1583 | .ndo_start_xmit = grcan_start_xmit, | ||
1584 | }; | ||
1585 | |||
1586 | static int grcan_setup_netdev(struct platform_device *ofdev, | ||
1587 | void __iomem *base, | ||
1588 | int irq, u32 ambafreq, bool txbug) | ||
1589 | { | ||
1590 | struct net_device *dev; | ||
1591 | struct grcan_priv *priv; | ||
1592 | struct grcan_registers __iomem *regs; | ||
1593 | int err; | ||
1594 | |||
1595 | dev = alloc_candev(sizeof(struct grcan_priv), 0); | ||
1596 | if (!dev) | ||
1597 | return -ENOMEM; | ||
1598 | |||
1599 | dev->irq = irq; | ||
1600 | dev->flags |= IFF_ECHO; | ||
1601 | dev->netdev_ops = &grcan_netdev_ops; | ||
1602 | dev->sysfs_groups[0] = &sysfs_grcan_group; | ||
1603 | |||
1604 | priv = netdev_priv(dev); | ||
1605 | memcpy(&priv->config, &grcan_module_config, | ||
1606 | sizeof(struct grcan_device_config)); | ||
1607 | priv->dev = dev; | ||
1608 | priv->regs = base; | ||
1609 | priv->can.bittiming_const = &grcan_bittiming_const; | ||
1610 | priv->can.do_set_bittiming = grcan_set_bittiming; | ||
1611 | priv->can.do_set_mode = grcan_set_mode; | ||
1612 | priv->can.do_get_berr_counter = grcan_get_berr_counter; | ||
1613 | priv->can.clock.freq = ambafreq; | ||
1614 | priv->can.ctrlmode_supported = | ||
1615 | CAN_CTRLMODE_LISTENONLY | CAN_CTRLMODE_ONE_SHOT; | ||
1616 | priv->need_txbug_workaround = txbug; | ||
1617 | |||
1618 | /* Discover if triple sampling is supported by hardware */ | ||
1619 | regs = priv->regs; | ||
1620 | grcan_set_bits(®s->ctrl, GRCAN_CTRL_RESET); | ||
1621 | grcan_set_bits(®s->conf, GRCAN_CONF_SAM); | ||
1622 | if (grcan_read_bits(®s->conf, GRCAN_CONF_SAM)) { | ||
1623 | priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES; | ||
1624 | dev_dbg(&ofdev->dev, "Hardware supports triple-sampling\n"); | ||
1625 | } | ||
1626 | |||
1627 | spin_lock_init(&priv->lock); | ||
1628 | |||
1629 | if (priv->need_txbug_workaround) { | ||
1630 | init_timer(&priv->rr_timer); | ||
1631 | priv->rr_timer.function = grcan_running_reset; | ||
1632 | priv->rr_timer.data = (unsigned long)dev; | ||
1633 | |||
1634 | init_timer(&priv->hang_timer); | ||
1635 | priv->hang_timer.function = grcan_initiate_running_reset; | ||
1636 | priv->hang_timer.data = (unsigned long)dev; | ||
1637 | } | ||
1638 | |||
1639 | netif_napi_add(dev, &priv->napi, grcan_poll, GRCAN_NAPI_WEIGHT); | ||
1640 | |||
1641 | SET_NETDEV_DEV(dev, &ofdev->dev); | ||
1642 | dev_info(&ofdev->dev, "regs=0x%p, irq=%d, clock=%d\n", | ||
1643 | priv->regs, dev->irq, priv->can.clock.freq); | ||
1644 | |||
1645 | err = register_candev(dev); | ||
1646 | if (err) | ||
1647 | goto exit_free_candev; | ||
1648 | |||
1649 | dev_set_drvdata(&ofdev->dev, dev); | ||
1650 | |||
1651 | /* Reset device to allow bit-timing to be set. No need to call | ||
1652 | * grcan_reset at this stage. That is done in grcan_open. | ||
1653 | */ | ||
1654 | grcan_write_reg(®s->ctrl, GRCAN_CTRL_RESET); | ||
1655 | |||
1656 | return 0; | ||
1657 | exit_free_candev: | ||
1658 | free_candev(dev); | ||
1659 | return err; | ||
1660 | } | ||
1661 | |||
1662 | static int grcan_probe(struct platform_device *ofdev) | ||
1663 | { | ||
1664 | struct device_node *np = ofdev->dev.of_node; | ||
1665 | struct resource *res; | ||
1666 | u32 sysid, ambafreq; | ||
1667 | int irq, err; | ||
1668 | void __iomem *base; | ||
1669 | bool txbug = true; | ||
1670 | |||
1671 | /* Compare GRLIB version number with the first that does not | ||
1672 | * have the tx bug (see start_xmit) | ||
1673 | */ | ||
1674 | err = of_property_read_u32(np, "systemid", &sysid); | ||
1675 | if (!err && ((sysid & GRLIB_VERSION_MASK) | ||
1676 | >= GRCAN_TXBUG_SAFE_GRLIB_VERSION)) | ||
1677 | txbug = false; | ||
1678 | |||
1679 | err = of_property_read_u32(np, "freq", &ambafreq); | ||
1680 | if (err) { | ||
1681 | dev_err(&ofdev->dev, "unable to fetch \"freq\" property\n"); | ||
1682 | goto exit_error; | ||
1683 | } | ||
1684 | |||
1685 | res = platform_get_resource(ofdev, IORESOURCE_MEM, 0); | ||
1686 | base = devm_request_and_ioremap(&ofdev->dev, res); | ||
1687 | if (!base) { | ||
1688 | dev_err(&ofdev->dev, "couldn't map IO resource\n"); | ||
1689 | err = -EADDRNOTAVAIL; | ||
1690 | goto exit_error; | ||
1691 | } | ||
1692 | |||
1693 | irq = irq_of_parse_and_map(np, GRCAN_IRQIX_IRQ); | ||
1694 | if (!irq) { | ||
1695 | dev_err(&ofdev->dev, "no irq found\n"); | ||
1696 | err = -ENODEV; | ||
1697 | goto exit_error; | ||
1698 | } | ||
1699 | |||
1700 | grcan_sanitize_module_config(ofdev); | ||
1701 | |||
1702 | err = grcan_setup_netdev(ofdev, base, irq, ambafreq, txbug); | ||
1703 | if (err) | ||
1704 | goto exit_dispose_irq; | ||
1705 | |||
1706 | return 0; | ||
1707 | |||
1708 | exit_dispose_irq: | ||
1709 | irq_dispose_mapping(irq); | ||
1710 | exit_error: | ||
1711 | dev_err(&ofdev->dev, | ||
1712 | "%s socket CAN driver initialization failed with error %d\n", | ||
1713 | DRV_NAME, err); | ||
1714 | return err; | ||
1715 | } | ||
1716 | |||
1717 | static int grcan_remove(struct platform_device *ofdev) | ||
1718 | { | ||
1719 | struct net_device *dev = dev_get_drvdata(&ofdev->dev); | ||
1720 | struct grcan_priv *priv = netdev_priv(dev); | ||
1721 | |||
1722 | unregister_candev(dev); /* Will in turn call grcan_close */ | ||
1723 | |||
1724 | irq_dispose_mapping(dev->irq); | ||
1725 | dev_set_drvdata(&ofdev->dev, NULL); | ||
1726 | netif_napi_del(&priv->napi); | ||
1727 | free_candev(dev); | ||
1728 | |||
1729 | return 0; | ||
1730 | } | ||
1731 | |||
1732 | static struct of_device_id grcan_match[] = { | ||
1733 | {.name = "GAISLER_GRCAN"}, | ||
1734 | {.name = "01_03d"}, | ||
1735 | {.name = "GAISLER_GRHCAN"}, | ||
1736 | {.name = "01_034"}, | ||
1737 | {}, | ||
1738 | }; | ||
1739 | |||
1740 | MODULE_DEVICE_TABLE(of, grcan_match); | ||
1741 | |||
1742 | static struct platform_driver grcan_driver = { | ||
1743 | .driver = { | ||
1744 | .name = DRV_NAME, | ||
1745 | .owner = THIS_MODULE, | ||
1746 | .of_match_table = grcan_match, | ||
1747 | }, | ||
1748 | .probe = grcan_probe, | ||
1749 | .remove = grcan_remove, | ||
1750 | }; | ||
1751 | |||
1752 | module_platform_driver(grcan_driver); | ||
1753 | |||
1754 | MODULE_AUTHOR("Aeroflex Gaisler AB."); | ||
1755 | MODULE_DESCRIPTION("Socket CAN driver for Aeroflex Gaisler GRCAN"); | ||
1756 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/net/can/janz-ican3.c b/drivers/net/can/janz-ican3.c index c4bc1d2e203..32778d56d33 100644 --- a/drivers/net/can/janz-ican3.c +++ b/drivers/net/can/janz-ican3.c | |||
@@ -116,7 +116,6 @@ | |||
116 | #define ICAN3_BUSERR_QUOTA_MAX 255 | 116 | #define ICAN3_BUSERR_QUOTA_MAX 255 |
117 | 117 | ||
118 | /* Janz ICAN3 CAN Frame Conversion */ | 118 | /* Janz ICAN3 CAN Frame Conversion */ |
119 | #define ICAN3_SNGL 0x02 | ||
120 | #define ICAN3_ECHO 0x10 | 119 | #define ICAN3_ECHO 0x10 |
121 | #define ICAN3_EFF_RTR 0x40 | 120 | #define ICAN3_EFF_RTR 0x40 |
122 | #define ICAN3_SFF_RTR 0x10 | 121 | #define ICAN3_SFF_RTR 0x10 |
@@ -221,9 +220,6 @@ struct ican3_dev { | |||
221 | /* old and new style host interface */ | 220 | /* old and new style host interface */ |
222 | unsigned int iftype; | 221 | unsigned int iftype; |
223 | 222 | ||
224 | /* queue for echo packets */ | ||
225 | struct sk_buff_head echoq; | ||
226 | |||
227 | /* | 223 | /* |
228 | * Any function which changes the current DPM page must hold this | 224 | * Any function which changes the current DPM page must hold this |
229 | * lock while it is performing data accesses. This ensures that the | 225 | * lock while it is performing data accesses. This ensures that the |
@@ -239,6 +235,7 @@ struct ican3_dev { | |||
239 | 235 | ||
240 | /* fast host interface */ | 236 | /* fast host interface */ |
241 | unsigned int fastrx_start; | 237 | unsigned int fastrx_start; |
238 | unsigned int fastrx_int; | ||
242 | unsigned int fastrx_num; | 239 | unsigned int fastrx_num; |
243 | unsigned int fasttx_start; | 240 | unsigned int fasttx_start; |
244 | unsigned int fasttx_num; | 241 | unsigned int fasttx_num; |
@@ -365,7 +362,7 @@ static int ican3_old_send_msg(struct ican3_dev *mod, struct ican3_msg *msg) | |||
365 | * ICAN3 "new-style" Host Interface Setup | 362 | * ICAN3 "new-style" Host Interface Setup |
366 | */ | 363 | */ |
367 | 364 | ||
368 | static void ican3_init_new_host_interface(struct ican3_dev *mod) | 365 | static void __devinit ican3_init_new_host_interface(struct ican3_dev *mod) |
369 | { | 366 | { |
370 | struct ican3_new_desc desc; | 367 | struct ican3_new_desc desc; |
371 | unsigned long flags; | 368 | unsigned long flags; |
@@ -444,7 +441,7 @@ static void ican3_init_new_host_interface(struct ican3_dev *mod) | |||
444 | * ICAN3 Fast Host Interface Setup | 441 | * ICAN3 Fast Host Interface Setup |
445 | */ | 442 | */ |
446 | 443 | ||
447 | static void ican3_init_fast_host_interface(struct ican3_dev *mod) | 444 | static void __devinit ican3_init_fast_host_interface(struct ican3_dev *mod) |
448 | { | 445 | { |
449 | struct ican3_fast_desc desc; | 446 | struct ican3_fast_desc desc; |
450 | unsigned long flags; | 447 | unsigned long flags; |
@@ -457,6 +454,7 @@ static void ican3_init_fast_host_interface(struct ican3_dev *mod) | |||
457 | /* save the start recv page */ | 454 | /* save the start recv page */ |
458 | mod->fastrx_start = mod->free_page; | 455 | mod->fastrx_start = mod->free_page; |
459 | mod->fastrx_num = 0; | 456 | mod->fastrx_num = 0; |
457 | mod->fastrx_int = 0; | ||
460 | 458 | ||
461 | /* build a single fast tohost queue descriptor */ | 459 | /* build a single fast tohost queue descriptor */ |
462 | memset(&desc, 0, sizeof(desc)); | 460 | memset(&desc, 0, sizeof(desc)); |
@@ -631,7 +629,7 @@ static int ican3_recv_msg(struct ican3_dev *mod, struct ican3_msg *msg) | |||
631 | * Quick Pre-constructed Messages | 629 | * Quick Pre-constructed Messages |
632 | */ | 630 | */ |
633 | 631 | ||
634 | static int ican3_msg_connect(struct ican3_dev *mod) | 632 | static int __devinit ican3_msg_connect(struct ican3_dev *mod) |
635 | { | 633 | { |
636 | struct ican3_msg msg; | 634 | struct ican3_msg msg; |
637 | 635 | ||
@@ -642,7 +640,7 @@ static int ican3_msg_connect(struct ican3_dev *mod) | |||
642 | return ican3_send_msg(mod, &msg); | 640 | return ican3_send_msg(mod, &msg); |
643 | } | 641 | } |
644 | 642 | ||
645 | static int ican3_msg_disconnect(struct ican3_dev *mod) | 643 | static int __devexit ican3_msg_disconnect(struct ican3_dev *mod) |
646 | { | 644 | { |
647 | struct ican3_msg msg; | 645 | struct ican3_msg msg; |
648 | 646 | ||
@@ -653,7 +651,7 @@ static int ican3_msg_disconnect(struct ican3_dev *mod) | |||
653 | return ican3_send_msg(mod, &msg); | 651 | return ican3_send_msg(mod, &msg); |
654 | } | 652 | } |
655 | 653 | ||
656 | static int ican3_msg_newhostif(struct ican3_dev *mod) | 654 | static int __devinit ican3_msg_newhostif(struct ican3_dev *mod) |
657 | { | 655 | { |
658 | struct ican3_msg msg; | 656 | struct ican3_msg msg; |
659 | int ret; | 657 | int ret; |
@@ -674,7 +672,7 @@ static int ican3_msg_newhostif(struct ican3_dev *mod) | |||
674 | return 0; | 672 | return 0; |
675 | } | 673 | } |
676 | 674 | ||
677 | static int ican3_msg_fasthostif(struct ican3_dev *mod) | 675 | static int __devinit ican3_msg_fasthostif(struct ican3_dev *mod) |
678 | { | 676 | { |
679 | struct ican3_msg msg; | 677 | struct ican3_msg msg; |
680 | unsigned int addr; | 678 | unsigned int addr; |
@@ -707,7 +705,7 @@ static int ican3_msg_fasthostif(struct ican3_dev *mod) | |||
707 | * Setup the CAN filter to either accept or reject all | 705 | * Setup the CAN filter to either accept or reject all |
708 | * messages from the CAN bus. | 706 | * messages from the CAN bus. |
709 | */ | 707 | */ |
710 | static int ican3_set_id_filter(struct ican3_dev *mod, bool accept) | 708 | static int __devinit ican3_set_id_filter(struct ican3_dev *mod, bool accept) |
711 | { | 709 | { |
712 | struct ican3_msg msg; | 710 | struct ican3_msg msg; |
713 | int ret; | 711 | int ret; |
@@ -815,10 +813,10 @@ static void ican3_to_can_frame(struct ican3_dev *mod, | |||
815 | 813 | ||
816 | cf->can_id |= desc->data[0] << 3; | 814 | cf->can_id |= desc->data[0] << 3; |
817 | cf->can_id |= (desc->data[1] & 0xe0) >> 5; | 815 | cf->can_id |= (desc->data[1] & 0xe0) >> 5; |
818 | cf->can_dlc = get_can_dlc(desc->data[1] & ICAN3_CAN_DLC_MASK); | 816 | cf->can_dlc = desc->data[1] & ICAN3_CAN_DLC_MASK; |
819 | memcpy(cf->data, &desc->data[2], cf->can_dlc); | 817 | memcpy(cf->data, &desc->data[2], sizeof(cf->data)); |
820 | } else { | 818 | } else { |
821 | cf->can_dlc = get_can_dlc(desc->data[0] & ICAN3_CAN_DLC_MASK); | 819 | cf->can_dlc = desc->data[0] & ICAN3_CAN_DLC_MASK; |
822 | if (desc->data[0] & ICAN3_EFF_RTR) | 820 | if (desc->data[0] & ICAN3_EFF_RTR) |
823 | cf->can_id |= CAN_RTR_FLAG; | 821 | cf->can_id |= CAN_RTR_FLAG; |
824 | 822 | ||
@@ -833,7 +831,7 @@ static void ican3_to_can_frame(struct ican3_dev *mod, | |||
833 | cf->can_id |= desc->data[3] >> 5; /* 2-0 */ | 831 | cf->can_id |= desc->data[3] >> 5; /* 2-0 */ |
834 | } | 832 | } |
835 | 833 | ||
836 | memcpy(cf->data, &desc->data[6], cf->can_dlc); | 834 | memcpy(cf->data, &desc->data[6], sizeof(cf->data)); |
837 | } | 835 | } |
838 | } | 836 | } |
839 | 837 | ||
@@ -849,10 +847,6 @@ static void can_frame_to_ican3(struct ican3_dev *mod, | |||
849 | desc->data[0] |= cf->can_dlc; | 847 | desc->data[0] |= cf->can_dlc; |
850 | desc->data[1] |= ICAN3_ECHO; | 848 | desc->data[1] |= ICAN3_ECHO; |
851 | 849 | ||
852 | /* support single transmission (no retries) mode */ | ||
853 | if (mod->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT) | ||
854 | desc->data[1] |= ICAN3_SNGL; | ||
855 | |||
856 | if (cf->can_id & CAN_RTR_FLAG) | 850 | if (cf->can_id & CAN_RTR_FLAG) |
857 | desc->data[0] |= ICAN3_EFF_RTR; | 851 | desc->data[0] |= ICAN3_EFF_RTR; |
858 | 852 | ||
@@ -869,7 +863,7 @@ static void can_frame_to_ican3(struct ican3_dev *mod, | |||
869 | } | 863 | } |
870 | 864 | ||
871 | /* copy the data bits into the descriptor */ | 865 | /* copy the data bits into the descriptor */ |
872 | memcpy(&desc->data[6], cf->data, cf->can_dlc); | 866 | memcpy(&desc->data[6], cf->data, sizeof(cf->data)); |
873 | } | 867 | } |
874 | 868 | ||
875 | /* | 869 | /* |
@@ -915,8 +909,8 @@ static void ican3_handle_msglost(struct ican3_dev *mod, struct ican3_msg *msg) | |||
915 | if (skb) { | 909 | if (skb) { |
916 | cf->can_id |= CAN_ERR_CRTL; | 910 | cf->can_id |= CAN_ERR_CRTL; |
917 | cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; | 911 | cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; |
918 | stats->rx_over_errors++; | ||
919 | stats->rx_errors++; | 912 | stats->rx_errors++; |
913 | stats->rx_bytes += cf->can_dlc; | ||
920 | netif_rx(skb); | 914 | netif_rx(skb); |
921 | } | 915 | } |
922 | } | 916 | } |
@@ -933,7 +927,7 @@ static int ican3_handle_cevtind(struct ican3_dev *mod, struct ican3_msg *msg) | |||
933 | struct net_device *dev = mod->ndev; | 927 | struct net_device *dev = mod->ndev; |
934 | struct net_device_stats *stats = &dev->stats; | 928 | struct net_device_stats *stats = &dev->stats; |
935 | enum can_state state = mod->can.state; | 929 | enum can_state state = mod->can.state; |
936 | u8 isrc, ecc, status, rxerr, txerr; | 930 | u8 status, isrc, rxerr, txerr; |
937 | struct can_frame *cf; | 931 | struct can_frame *cf; |
938 | struct sk_buff *skb; | 932 | struct sk_buff *skb; |
939 | 933 | ||
@@ -949,53 +943,15 @@ static int ican3_handle_cevtind(struct ican3_dev *mod, struct ican3_msg *msg) | |||
949 | return -EINVAL; | 943 | return -EINVAL; |
950 | } | 944 | } |
951 | 945 | ||
946 | skb = alloc_can_err_skb(dev, &cf); | ||
947 | if (skb == NULL) | ||
948 | return -ENOMEM; | ||
949 | |||
952 | isrc = msg->data[0]; | 950 | isrc = msg->data[0]; |
953 | ecc = msg->data[2]; | ||
954 | status = msg->data[3]; | 951 | status = msg->data[3]; |
955 | rxerr = msg->data[4]; | 952 | rxerr = msg->data[4]; |
956 | txerr = msg->data[5]; | 953 | txerr = msg->data[5]; |
957 | 954 | ||
958 | /* | ||
959 | * This hardware lacks any support other than bus error messages to | ||
960 | * determine if packet transmission has failed. | ||
961 | * | ||
962 | * When TX errors happen, one echo skb needs to be dropped from the | ||
963 | * front of the queue. | ||
964 | * | ||
965 | * A small bit of code is duplicated here and below, to avoid error | ||
966 | * skb allocation when it will just be freed immediately. | ||
967 | */ | ||
968 | if (isrc == CEVTIND_BEI) { | ||
969 | int ret; | ||
970 | dev_dbg(mod->dev, "bus error interrupt\n"); | ||
971 | |||
972 | /* TX error */ | ||
973 | if (!(ecc & ECC_DIR)) { | ||
974 | kfree_skb(skb_dequeue(&mod->echoq)); | ||
975 | stats->tx_errors++; | ||
976 | } else { | ||
977 | stats->rx_errors++; | ||
978 | } | ||
979 | |||
980 | /* | ||
981 | * The controller automatically disables bus-error interrupts | ||
982 | * and therefore we must re-enable them. | ||
983 | */ | ||
984 | ret = ican3_set_buserror(mod, 1); | ||
985 | if (ret) { | ||
986 | dev_err(mod->dev, "unable to re-enable bus-error\n"); | ||
987 | return ret; | ||
988 | } | ||
989 | |||
990 | /* bus error reporting is off, return immediately */ | ||
991 | if (!(mod->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)) | ||
992 | return 0; | ||
993 | } | ||
994 | |||
995 | skb = alloc_can_err_skb(dev, &cf); | ||
996 | if (skb == NULL) | ||
997 | return -ENOMEM; | ||
998 | |||
999 | /* data overrun interrupt */ | 955 | /* data overrun interrupt */ |
1000 | if (isrc == CEVTIND_DOI || isrc == CEVTIND_LOST) { | 956 | if (isrc == CEVTIND_DOI || isrc == CEVTIND_LOST) { |
1001 | dev_dbg(mod->dev, "data overrun interrupt\n"); | 957 | dev_dbg(mod->dev, "data overrun interrupt\n"); |
@@ -1024,7 +980,11 @@ static int ican3_handle_cevtind(struct ican3_dev *mod, struct ican3_msg *msg) | |||
1024 | 980 | ||
1025 | /* bus error interrupt */ | 981 | /* bus error interrupt */ |
1026 | if (isrc == CEVTIND_BEI) { | 982 | if (isrc == CEVTIND_BEI) { |
983 | u8 ecc = msg->data[2]; | ||
984 | |||
985 | dev_dbg(mod->dev, "bus error interrupt\n"); | ||
1027 | mod->can.can_stats.bus_error++; | 986 | mod->can.can_stats.bus_error++; |
987 | stats->rx_errors++; | ||
1028 | cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; | 988 | cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; |
1029 | 989 | ||
1030 | switch (ecc & ECC_MASK) { | 990 | switch (ecc & ECC_MASK) { |
@@ -1043,7 +1003,7 @@ static int ican3_handle_cevtind(struct ican3_dev *mod, struct ican3_msg *msg) | |||
1043 | break; | 1003 | break; |
1044 | } | 1004 | } |
1045 | 1005 | ||
1046 | if (!(ecc & ECC_DIR)) | 1006 | if ((ecc & ECC_DIR) == 0) |
1047 | cf->data[2] |= CAN_ERR_PROT_TX; | 1007 | cf->data[2] |= CAN_ERR_PROT_TX; |
1048 | 1008 | ||
1049 | cf->data[6] = txerr; | 1009 | cf->data[6] = txerr; |
@@ -1070,6 +1030,8 @@ static int ican3_handle_cevtind(struct ican3_dev *mod, struct ican3_msg *msg) | |||
1070 | } | 1030 | } |
1071 | 1031 | ||
1072 | mod->can.state = state; | 1032 | mod->can.state = state; |
1033 | stats->rx_errors++; | ||
1034 | stats->rx_bytes += cf->can_dlc; | ||
1073 | netif_rx(skb); | 1035 | netif_rx(skb); |
1074 | return 0; | 1036 | return 0; |
1075 | } | 1037 | } |
@@ -1129,88 +1091,6 @@ static void ican3_handle_message(struct ican3_dev *mod, struct ican3_msg *msg) | |||
1129 | } | 1091 | } |
1130 | 1092 | ||
1131 | /* | 1093 | /* |
1132 | * The ican3 needs to store all echo skbs, and therefore cannot | ||
1133 | * use the generic infrastructure for this. | ||
1134 | */ | ||
1135 | static void ican3_put_echo_skb(struct ican3_dev *mod, struct sk_buff *skb) | ||
1136 | { | ||
1137 | struct sock *srcsk = skb->sk; | ||
1138 | |||
1139 | if (atomic_read(&skb->users) != 1) { | ||
1140 | struct sk_buff *old_skb = skb; | ||
1141 | |||
1142 | skb = skb_clone(old_skb, GFP_ATOMIC); | ||
1143 | kfree_skb(old_skb); | ||
1144 | if (!skb) | ||
1145 | return; | ||
1146 | } else { | ||
1147 | skb_orphan(skb); | ||
1148 | } | ||
1149 | |||
1150 | skb->sk = srcsk; | ||
1151 | |||
1152 | /* save this skb for tx interrupt echo handling */ | ||
1153 | skb_queue_tail(&mod->echoq, skb); | ||
1154 | } | ||
1155 | |||
1156 | static unsigned int ican3_get_echo_skb(struct ican3_dev *mod) | ||
1157 | { | ||
1158 | struct sk_buff *skb = skb_dequeue(&mod->echoq); | ||
1159 | struct can_frame *cf; | ||
1160 | u8 dlc; | ||
1161 | |||
1162 | /* this should never trigger unless there is a driver bug */ | ||
1163 | if (!skb) { | ||
1164 | netdev_err(mod->ndev, "BUG: echo skb not occupied\n"); | ||
1165 | return 0; | ||
1166 | } | ||
1167 | |||
1168 | cf = (struct can_frame *)skb->data; | ||
1169 | dlc = cf->can_dlc; | ||
1170 | |||
1171 | /* check flag whether this packet has to be looped back */ | ||
1172 | if (skb->pkt_type != PACKET_LOOPBACK) { | ||
1173 | kfree_skb(skb); | ||
1174 | return dlc; | ||
1175 | } | ||
1176 | |||
1177 | skb->protocol = htons(ETH_P_CAN); | ||
1178 | skb->pkt_type = PACKET_BROADCAST; | ||
1179 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
1180 | skb->dev = mod->ndev; | ||
1181 | netif_receive_skb(skb); | ||
1182 | return dlc; | ||
1183 | } | ||
1184 | |||
1185 | /* | ||
1186 | * Compare an skb with an existing echo skb | ||
1187 | * | ||
1188 | * This function will be used on devices which have a hardware loopback. | ||
1189 | * On these devices, this function can be used to compare a received skb | ||
1190 | * with the saved echo skbs so that the hardware echo skb can be dropped. | ||
1191 | * | ||
1192 | * Returns true if the skb's are identical, false otherwise. | ||
1193 | */ | ||
1194 | static bool ican3_echo_skb_matches(struct ican3_dev *mod, struct sk_buff *skb) | ||
1195 | { | ||
1196 | struct can_frame *cf = (struct can_frame *)skb->data; | ||
1197 | struct sk_buff *echo_skb = skb_peek(&mod->echoq); | ||
1198 | struct can_frame *echo_cf; | ||
1199 | |||
1200 | if (!echo_skb) | ||
1201 | return false; | ||
1202 | |||
1203 | echo_cf = (struct can_frame *)echo_skb->data; | ||
1204 | if (cf->can_id != echo_cf->can_id) | ||
1205 | return false; | ||
1206 | |||
1207 | if (cf->can_dlc != echo_cf->can_dlc) | ||
1208 | return false; | ||
1209 | |||
1210 | return memcmp(cf->data, echo_cf->data, cf->can_dlc) == 0; | ||
1211 | } | ||
1212 | |||
1213 | /* | ||
1214 | * Check that there is room in the TX ring to transmit another skb | 1094 | * Check that there is room in the TX ring to transmit another skb |
1215 | * | 1095 | * |
1216 | * LOCKING: must hold mod->lock | 1096 | * LOCKING: must hold mod->lock |
@@ -1220,10 +1100,6 @@ static bool ican3_txok(struct ican3_dev *mod) | |||
1220 | struct ican3_fast_desc __iomem *desc; | 1100 | struct ican3_fast_desc __iomem *desc; |
1221 | u8 control; | 1101 | u8 control; |
1222 | 1102 | ||
1223 | /* check that we have echo queue space */ | ||
1224 | if (skb_queue_len(&mod->echoq) >= ICAN3_TX_BUFFERS) | ||
1225 | return false; | ||
1226 | |||
1227 | /* copy the control bits of the descriptor */ | 1103 | /* copy the control bits of the descriptor */ |
1228 | ican3_set_page(mod, mod->fasttx_start + (mod->fasttx_num / 16)); | 1104 | ican3_set_page(mod, mod->fasttx_start + (mod->fasttx_num / 16)); |
1229 | desc = mod->dpm + ((mod->fasttx_num % 16) * sizeof(*desc)); | 1105 | desc = mod->dpm + ((mod->fasttx_num % 16) * sizeof(*desc)); |
@@ -1274,27 +1150,10 @@ static int ican3_recv_skb(struct ican3_dev *mod) | |||
1274 | /* convert the ICAN3 frame into Linux CAN format */ | 1150 | /* convert the ICAN3 frame into Linux CAN format */ |
1275 | ican3_to_can_frame(mod, &desc, cf); | 1151 | ican3_to_can_frame(mod, &desc, cf); |
1276 | 1152 | ||
1277 | /* | 1153 | /* receive the skb, update statistics */ |
1278 | * If this is an ECHO frame received from the hardware loopback | 1154 | netif_receive_skb(skb); |
1279 | * feature, use the skb saved in the ECHO stack instead. This allows | ||
1280 | * the Linux CAN core to support CAN_RAW_RECV_OWN_MSGS correctly. | ||
1281 | * | ||
1282 | * Since this is a confirmation of a successfully transmitted packet | ||
1283 | * sent from this host, update the transmit statistics. | ||
1284 | * | ||
1285 | * Also, the netdevice queue needs to be allowed to send packets again. | ||
1286 | */ | ||
1287 | if (ican3_echo_skb_matches(mod, skb)) { | ||
1288 | stats->tx_packets++; | ||
1289 | stats->tx_bytes += ican3_get_echo_skb(mod); | ||
1290 | kfree_skb(skb); | ||
1291 | goto err_noalloc; | ||
1292 | } | ||
1293 | |||
1294 | /* update statistics, receive the skb */ | ||
1295 | stats->rx_packets++; | 1155 | stats->rx_packets++; |
1296 | stats->rx_bytes += cf->can_dlc; | 1156 | stats->rx_bytes += cf->can_dlc; |
1297 | netif_receive_skb(skb); | ||
1298 | 1157 | ||
1299 | err_noalloc: | 1158 | err_noalloc: |
1300 | /* toggle the valid bit and return the descriptor to the ring */ | 1159 | /* toggle the valid bit and return the descriptor to the ring */ |
@@ -1317,13 +1176,13 @@ err_noalloc: | |||
1317 | static int ican3_napi(struct napi_struct *napi, int budget) | 1176 | static int ican3_napi(struct napi_struct *napi, int budget) |
1318 | { | 1177 | { |
1319 | struct ican3_dev *mod = container_of(napi, struct ican3_dev, napi); | 1178 | struct ican3_dev *mod = container_of(napi, struct ican3_dev, napi); |
1179 | struct ican3_msg msg; | ||
1320 | unsigned long flags; | 1180 | unsigned long flags; |
1321 | int received = 0; | 1181 | int received = 0; |
1322 | int ret; | 1182 | int ret; |
1323 | 1183 | ||
1324 | /* process all communication messages */ | 1184 | /* process all communication messages */ |
1325 | while (true) { | 1185 | while (true) { |
1326 | struct ican3_msg msg; | ||
1327 | ret = ican3_recv_msg(mod, &msg); | 1186 | ret = ican3_recv_msg(mod, &msg); |
1328 | if (ret) | 1187 | if (ret) |
1329 | break; | 1188 | break; |
@@ -1391,6 +1250,7 @@ static irqreturn_t ican3_irq(int irq, void *dev_id) | |||
1391 | */ | 1250 | */ |
1392 | static int ican3_reset_module(struct ican3_dev *mod) | 1251 | static int ican3_reset_module(struct ican3_dev *mod) |
1393 | { | 1252 | { |
1253 | u8 val = 1 << mod->num; | ||
1394 | unsigned long start; | 1254 | unsigned long start; |
1395 | u8 runold, runnew; | 1255 | u8 runold, runnew; |
1396 | 1256 | ||
@@ -1404,7 +1264,8 @@ static int ican3_reset_module(struct ican3_dev *mod) | |||
1404 | runold = ioread8(mod->dpm + TARGET_RUNNING); | 1264 | runold = ioread8(mod->dpm + TARGET_RUNNING); |
1405 | 1265 | ||
1406 | /* reset the module */ | 1266 | /* reset the module */ |
1407 | iowrite8(0x00, &mod->dpmctrl->hwreset); | 1267 | iowrite8(val, &mod->ctrl->reset_assert); |
1268 | iowrite8(val, &mod->ctrl->reset_deassert); | ||
1408 | 1269 | ||
1409 | /* wait until the module has finished resetting and is running */ | 1270 | /* wait until the module has finished resetting and is running */ |
1410 | start = jiffies; | 1271 | start = jiffies; |
@@ -1421,7 +1282,7 @@ static int ican3_reset_module(struct ican3_dev *mod) | |||
1421 | return -ETIMEDOUT; | 1282 | return -ETIMEDOUT; |
1422 | } | 1283 | } |
1423 | 1284 | ||
1424 | static void ican3_shutdown_module(struct ican3_dev *mod) | 1285 | static void __devexit ican3_shutdown_module(struct ican3_dev *mod) |
1425 | { | 1286 | { |
1426 | ican3_msg_disconnect(mod); | 1287 | ican3_msg_disconnect(mod); |
1427 | ican3_reset_module(mod); | 1288 | ican3_reset_module(mod); |
@@ -1430,7 +1291,7 @@ static void ican3_shutdown_module(struct ican3_dev *mod) | |||
1430 | /* | 1291 | /* |
1431 | * Startup an ICAN module, bringing it into fast mode | 1292 | * Startup an ICAN module, bringing it into fast mode |
1432 | */ | 1293 | */ |
1433 | static int ican3_startup_module(struct ican3_dev *mod) | 1294 | static int __devinit ican3_startup_module(struct ican3_dev *mod) |
1434 | { | 1295 | { |
1435 | int ret; | 1296 | int ret; |
1436 | 1297 | ||
@@ -1464,7 +1325,7 @@ static int ican3_startup_module(struct ican3_dev *mod) | |||
1464 | } | 1325 | } |
1465 | 1326 | ||
1466 | /* default to "bus errors enabled" */ | 1327 | /* default to "bus errors enabled" */ |
1467 | ret = ican3_set_buserror(mod, 1); | 1328 | ret = ican3_set_buserror(mod, ICAN3_BUSERR_QUOTA_MAX); |
1468 | if (ret) { | 1329 | if (ret) { |
1469 | dev_err(mod->dev, "unable to set bus-error\n"); | 1330 | dev_err(mod->dev, "unable to set bus-error\n"); |
1470 | return ret; | 1331 | return ret; |
@@ -1493,6 +1354,7 @@ static int ican3_startup_module(struct ican3_dev *mod) | |||
1493 | static int ican3_open(struct net_device *ndev) | 1354 | static int ican3_open(struct net_device *ndev) |
1494 | { | 1355 | { |
1495 | struct ican3_dev *mod = netdev_priv(ndev); | 1356 | struct ican3_dev *mod = netdev_priv(ndev); |
1357 | u8 quota; | ||
1496 | int ret; | 1358 | int ret; |
1497 | 1359 | ||
1498 | /* open the CAN layer */ | 1360 | /* open the CAN layer */ |
@@ -1502,6 +1364,19 @@ static int ican3_open(struct net_device *ndev) | |||
1502 | return ret; | 1364 | return ret; |
1503 | } | 1365 | } |
1504 | 1366 | ||
1367 | /* set the bus error generation state appropriately */ | ||
1368 | if (mod->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) | ||
1369 | quota = ICAN3_BUSERR_QUOTA_MAX; | ||
1370 | else | ||
1371 | quota = 0; | ||
1372 | |||
1373 | ret = ican3_set_buserror(mod, quota); | ||
1374 | if (ret) { | ||
1375 | dev_err(mod->dev, "unable to set bus-error\n"); | ||
1376 | close_candev(ndev); | ||
1377 | return ret; | ||
1378 | } | ||
1379 | |||
1505 | /* bring the bus online */ | 1380 | /* bring the bus online */ |
1506 | ret = ican3_set_bus_state(mod, true); | 1381 | ret = ican3_set_bus_state(mod, true); |
1507 | if (ret) { | 1382 | if (ret) { |
@@ -1533,9 +1408,6 @@ static int ican3_stop(struct net_device *ndev) | |||
1533 | return ret; | 1408 | return ret; |
1534 | } | 1409 | } |
1535 | 1410 | ||
1536 | /* drop all outstanding echo skbs */ | ||
1537 | skb_queue_purge(&mod->echoq); | ||
1538 | |||
1539 | /* close the CAN layer */ | 1411 | /* close the CAN layer */ |
1540 | close_candev(ndev); | 1412 | close_candev(ndev); |
1541 | return 0; | 1413 | return 0; |
@@ -1544,19 +1416,18 @@ static int ican3_stop(struct net_device *ndev) | |||
1544 | static int ican3_xmit(struct sk_buff *skb, struct net_device *ndev) | 1416 | static int ican3_xmit(struct sk_buff *skb, struct net_device *ndev) |
1545 | { | 1417 | { |
1546 | struct ican3_dev *mod = netdev_priv(ndev); | 1418 | struct ican3_dev *mod = netdev_priv(ndev); |
1419 | struct net_device_stats *stats = &ndev->stats; | ||
1547 | struct can_frame *cf = (struct can_frame *)skb->data; | 1420 | struct can_frame *cf = (struct can_frame *)skb->data; |
1548 | struct ican3_fast_desc desc; | 1421 | struct ican3_fast_desc desc; |
1549 | void __iomem *desc_addr; | 1422 | void __iomem *desc_addr; |
1550 | unsigned long flags; | 1423 | unsigned long flags; |
1551 | 1424 | ||
1552 | if (can_dropped_invalid_skb(ndev, skb)) | ||
1553 | return NETDEV_TX_OK; | ||
1554 | |||
1555 | spin_lock_irqsave(&mod->lock, flags); | 1425 | spin_lock_irqsave(&mod->lock, flags); |
1556 | 1426 | ||
1557 | /* check that we can actually transmit */ | 1427 | /* check that we can actually transmit */ |
1558 | if (!ican3_txok(mod)) { | 1428 | if (!ican3_txok(mod)) { |
1559 | dev_err(mod->dev, "BUG: no free descriptors\n"); | 1429 | dev_err(mod->dev, "no free descriptors, stopping queue\n"); |
1430 | netif_stop_queue(ndev); | ||
1560 | spin_unlock_irqrestore(&mod->lock, flags); | 1431 | spin_unlock_irqrestore(&mod->lock, flags); |
1561 | return NETDEV_TX_BUSY; | 1432 | return NETDEV_TX_BUSY; |
1562 | } | 1433 | } |
@@ -1571,14 +1442,6 @@ static int ican3_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
1571 | can_frame_to_ican3(mod, cf, &desc); | 1442 | can_frame_to_ican3(mod, cf, &desc); |
1572 | 1443 | ||
1573 | /* | 1444 | /* |
1574 | * This hardware doesn't have TX-done notifications, so we'll try and | ||
1575 | * emulate it the best we can using ECHO skbs. Add the skb to the ECHO | ||
1576 | * stack. Upon packet reception, check if the ECHO skb and received | ||
1577 | * skb match, and use that to wake the queue. | ||
1578 | */ | ||
1579 | ican3_put_echo_skb(mod, skb); | ||
1580 | |||
1581 | /* | ||
1582 | * the programming manual says that you must set the IVALID bit, then | 1445 | * the programming manual says that you must set the IVALID bit, then |
1583 | * interrupt, then set the valid bit. Quite weird, but it seems to be | 1446 | * interrupt, then set the valid bit. Quite weird, but it seems to be |
1584 | * required for this to work | 1447 | * required for this to work |
@@ -1596,7 +1459,19 @@ static int ican3_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
1596 | mod->fasttx_num = (desc.control & DESC_WRAP) ? 0 | 1459 | mod->fasttx_num = (desc.control & DESC_WRAP) ? 0 |
1597 | : (mod->fasttx_num + 1); | 1460 | : (mod->fasttx_num + 1); |
1598 | 1461 | ||
1599 | /* if there is no free descriptor space, stop the transmit queue */ | 1462 | /* update statistics */ |
1463 | stats->tx_packets++; | ||
1464 | stats->tx_bytes += cf->can_dlc; | ||
1465 | kfree_skb(skb); | ||
1466 | |||
1467 | /* | ||
1468 | * This hardware doesn't have TX-done notifications, so we'll try and | ||
1469 | * emulate it the best we can using ECHO skbs. Get the next TX | ||
1470 | * descriptor, and see if we have room to send. If not, stop the queue. | ||
1471 | * It will be woken when the ECHO skb for the current packet is recv'd. | ||
1472 | */ | ||
1473 | |||
1474 | /* copy the control bits of the descriptor */ | ||
1600 | if (!ican3_txok(mod)) | 1475 | if (!ican3_txok(mod)) |
1601 | netif_stop_queue(ndev); | 1476 | netif_stop_queue(ndev); |
1602 | 1477 | ||
@@ -1615,7 +1490,7 @@ static const struct net_device_ops ican3_netdev_ops = { | |||
1615 | */ | 1490 | */ |
1616 | 1491 | ||
1617 | /* This structure was stolen from drivers/net/can/sja1000/sja1000.c */ | 1492 | /* This structure was stolen from drivers/net/can/sja1000/sja1000.c */ |
1618 | static const struct can_bittiming_const ican3_bittiming_const = { | 1493 | static struct can_bittiming_const ican3_bittiming_const = { |
1619 | .name = DRV_NAME, | 1494 | .name = DRV_NAME, |
1620 | .tseg1_min = 1, | 1495 | .tseg1_min = 1, |
1621 | .tseg1_max = 16, | 1496 | .tseg1_max = 16, |
@@ -1692,7 +1567,7 @@ static int ican3_get_berr_counter(const struct net_device *ndev, | |||
1692 | return ret; | 1567 | return ret; |
1693 | 1568 | ||
1694 | ret = wait_for_completion_timeout(&mod->buserror_comp, HZ); | 1569 | ret = wait_for_completion_timeout(&mod->buserror_comp, HZ); |
1695 | if (ret == 0) { | 1570 | if (ret <= 0) { |
1696 | dev_info(mod->dev, "%s timed out\n", __func__); | 1571 | dev_info(mod->dev, "%s timed out\n", __func__); |
1697 | return -ETIMEDOUT; | 1572 | return -ETIMEDOUT; |
1698 | } | 1573 | } |
@@ -1718,7 +1593,7 @@ static ssize_t ican3_sysfs_show_term(struct device *dev, | |||
1718 | return ret; | 1593 | return ret; |
1719 | 1594 | ||
1720 | ret = wait_for_completion_timeout(&mod->termination_comp, HZ); | 1595 | ret = wait_for_completion_timeout(&mod->termination_comp, HZ); |
1721 | if (ret == 0) { | 1596 | if (ret <= 0) { |
1722 | dev_info(mod->dev, "%s timed out\n", __func__); | 1597 | dev_info(mod->dev, "%s timed out\n", __func__); |
1723 | return -ETIMEDOUT; | 1598 | return -ETIMEDOUT; |
1724 | } | 1599 | } |
@@ -1760,7 +1635,7 @@ static struct attribute_group ican3_sysfs_attr_group = { | |||
1760 | * PCI Subsystem | 1635 | * PCI Subsystem |
1761 | */ | 1636 | */ |
1762 | 1637 | ||
1763 | static int ican3_probe(struct platform_device *pdev) | 1638 | static int __devinit ican3_probe(struct platform_device *pdev) |
1764 | { | 1639 | { |
1765 | struct janz_platform_data *pdata; | 1640 | struct janz_platform_data *pdata; |
1766 | struct net_device *ndev; | 1641 | struct net_device *ndev; |
@@ -1792,7 +1667,6 @@ static int ican3_probe(struct platform_device *pdev) | |||
1792 | mod->dev = &pdev->dev; | 1667 | mod->dev = &pdev->dev; |
1793 | mod->num = pdata->modno; | 1668 | mod->num = pdata->modno; |
1794 | netif_napi_add(ndev, &mod->napi, ican3_napi, ICAN3_RX_BUFFERS); | 1669 | netif_napi_add(ndev, &mod->napi, ican3_napi, ICAN3_RX_BUFFERS); |
1795 | skb_queue_head_init(&mod->echoq); | ||
1796 | spin_lock_init(&mod->lock); | 1670 | spin_lock_init(&mod->lock); |
1797 | init_completion(&mod->termination_comp); | 1671 | init_completion(&mod->termination_comp); |
1798 | init_completion(&mod->buserror_comp); | 1672 | init_completion(&mod->buserror_comp); |
@@ -1813,8 +1687,7 @@ static int ican3_probe(struct platform_device *pdev) | |||
1813 | mod->can.do_set_mode = ican3_set_mode; | 1687 | mod->can.do_set_mode = ican3_set_mode; |
1814 | mod->can.do_get_berr_counter = ican3_get_berr_counter; | 1688 | mod->can.do_get_berr_counter = ican3_get_berr_counter; |
1815 | mod->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | 1689 | mod->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES |
1816 | | CAN_CTRLMODE_BERR_REPORTING | 1690 | | CAN_CTRLMODE_BERR_REPORTING; |
1817 | | CAN_CTRLMODE_ONE_SHOT; | ||
1818 | 1691 | ||
1819 | /* find our IRQ number */ | 1692 | /* find our IRQ number */ |
1820 | mod->irq = platform_get_irq(pdev, 0); | 1693 | mod->irq = platform_get_irq(pdev, 0); |
@@ -1898,7 +1771,7 @@ out_return: | |||
1898 | return ret; | 1771 | return ret; |
1899 | } | 1772 | } |
1900 | 1773 | ||
1901 | static int ican3_remove(struct platform_device *pdev) | 1774 | static int __devexit ican3_remove(struct platform_device *pdev) |
1902 | { | 1775 | { |
1903 | struct net_device *ndev = platform_get_drvdata(pdev); | 1776 | struct net_device *ndev = platform_get_drvdata(pdev); |
1904 | struct ican3_dev *mod = netdev_priv(ndev); | 1777 | struct ican3_dev *mod = netdev_priv(ndev); |
@@ -1927,12 +1800,23 @@ static struct platform_driver ican3_driver = { | |||
1927 | .owner = THIS_MODULE, | 1800 | .owner = THIS_MODULE, |
1928 | }, | 1801 | }, |
1929 | .probe = ican3_probe, | 1802 | .probe = ican3_probe, |
1930 | .remove = ican3_remove, | 1803 | .remove = __devexit_p(ican3_remove), |
1931 | }; | 1804 | }; |
1932 | 1805 | ||
1933 | module_platform_driver(ican3_driver); | 1806 | static int __init ican3_init(void) |
1807 | { | ||
1808 | return platform_driver_register(&ican3_driver); | ||
1809 | } | ||
1810 | |||
1811 | static void __exit ican3_exit(void) | ||
1812 | { | ||
1813 | platform_driver_unregister(&ican3_driver); | ||
1814 | } | ||
1934 | 1815 | ||
1935 | MODULE_AUTHOR("Ira W. Snyder <iws@ovro.caltech.edu>"); | 1816 | MODULE_AUTHOR("Ira W. Snyder <iws@ovro.caltech.edu>"); |
1936 | MODULE_DESCRIPTION("Janz MODULbus VMOD-ICAN3 Driver"); | 1817 | MODULE_DESCRIPTION("Janz MODULbus VMOD-ICAN3 Driver"); |
1937 | MODULE_LICENSE("GPL"); | 1818 | MODULE_LICENSE("GPL"); |
1938 | MODULE_ALIAS("platform:janz-ican3"); | 1819 | MODULE_ALIAS("platform:janz-ican3"); |
1820 | |||
1821 | module_init(ican3_init); | ||
1822 | module_exit(ican3_exit); | ||
diff --git a/drivers/net/can/mcp251x.c b/drivers/net/can/mcp251x.c index 5eaf47b8e37..330140ee266 100644 --- a/drivers/net/can/mcp251x.c +++ b/drivers/net/can/mcp251x.c | |||
@@ -83,11 +83,6 @@ | |||
83 | #define INSTRUCTION_LOAD_TXB(n) (0x40 + 2 * (n)) | 83 | #define INSTRUCTION_LOAD_TXB(n) (0x40 + 2 * (n)) |
84 | #define INSTRUCTION_READ_RXB(n) (((n) == 0) ? 0x90 : 0x94) | 84 | #define INSTRUCTION_READ_RXB(n) (((n) == 0) ? 0x90 : 0x94) |
85 | #define INSTRUCTION_RESET 0xC0 | 85 | #define INSTRUCTION_RESET 0xC0 |
86 | #define RTS_TXB0 0x01 | ||
87 | #define RTS_TXB1 0x02 | ||
88 | #define RTS_TXB2 0x04 | ||
89 | #define INSTRUCTION_RTS(n) (0x80 | ((n) & 0x07)) | ||
90 | |||
91 | 86 | ||
92 | /* MPC251x registers */ | 87 | /* MPC251x registers */ |
93 | #define CANSTAT 0x0e | 88 | #define CANSTAT 0x0e |
@@ -219,7 +214,7 @@ static int mcp251x_enable_dma; /* Enable SPI DMA. Default: 0 (Off) */ | |||
219 | module_param(mcp251x_enable_dma, int, S_IRUGO); | 214 | module_param(mcp251x_enable_dma, int, S_IRUGO); |
220 | MODULE_PARM_DESC(mcp251x_enable_dma, "Enable SPI DMA. Default: 0 (Off)"); | 215 | MODULE_PARM_DESC(mcp251x_enable_dma, "Enable SPI DMA. Default: 0 (Off)"); |
221 | 216 | ||
222 | static const struct can_bittiming_const mcp251x_bittiming_const = { | 217 | static struct can_bittiming_const mcp251x_bittiming_const = { |
223 | .name = DEVICE_NAME, | 218 | .name = DEVICE_NAME, |
224 | .tseg1_min = 3, | 219 | .tseg1_min = 3, |
225 | .tseg1_max = 16, | 220 | .tseg1_max = 16, |
@@ -402,7 +397,6 @@ static void mcp251x_hw_tx_frame(struct spi_device *spi, u8 *buf, | |||
402 | static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame, | 397 | static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame, |
403 | int tx_buf_idx) | 398 | int tx_buf_idx) |
404 | { | 399 | { |
405 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); | ||
406 | u32 sid, eid, exide, rtr; | 400 | u32 sid, eid, exide, rtr; |
407 | u8 buf[SPI_TRANSFER_BUF_LEN]; | 401 | u8 buf[SPI_TRANSFER_BUF_LEN]; |
408 | 402 | ||
@@ -424,10 +418,7 @@ static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame, | |||
424 | buf[TXBDLC_OFF] = (rtr << DLC_RTR_SHIFT) | frame->can_dlc; | 418 | buf[TXBDLC_OFF] = (rtr << DLC_RTR_SHIFT) | frame->can_dlc; |
425 | memcpy(buf + TXBDAT_OFF, frame->data, frame->can_dlc); | 419 | memcpy(buf + TXBDAT_OFF, frame->data, frame->can_dlc); |
426 | mcp251x_hw_tx_frame(spi, buf, frame->can_dlc, tx_buf_idx); | 420 | mcp251x_hw_tx_frame(spi, buf, frame->can_dlc, tx_buf_idx); |
427 | 421 | mcp251x_write_reg(spi, TXBCTRL(tx_buf_idx), TXBCTRL_TXREQ); | |
428 | /* use INSTRUCTION_RTS, to avoid "repeated frame problem" */ | ||
429 | priv->spi_tx_buf[0] = INSTRUCTION_RTS(1 << tx_buf_idx); | ||
430 | mcp251x_spi_trans(priv->spi, 1); | ||
431 | } | 422 | } |
432 | 423 | ||
433 | static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf, | 424 | static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf, |
@@ -721,7 +712,8 @@ static void mcp251x_error_skb(struct net_device *net, int can_id, int data1) | |||
721 | frame->data[1] = data1; | 712 | frame->data[1] = data1; |
722 | netif_rx_ni(skb); | 713 | netif_rx_ni(skb); |
723 | } else { | 714 | } else { |
724 | netdev_err(net, "cannot allocate error skb\n"); | 715 | dev_err(&net->dev, |
716 | "cannot allocate error skb\n"); | ||
725 | } | 717 | } |
726 | } | 718 | } |
727 | 719 | ||
@@ -981,7 +973,7 @@ static const struct net_device_ops mcp251x_netdev_ops = { | |||
981 | .ndo_start_xmit = mcp251x_hard_start_xmit, | 973 | .ndo_start_xmit = mcp251x_hard_start_xmit, |
982 | }; | 974 | }; |
983 | 975 | ||
984 | static int mcp251x_can_probe(struct spi_device *spi) | 976 | static int __devinit mcp251x_can_probe(struct spi_device *spi) |
985 | { | 977 | { |
986 | struct net_device *net; | 978 | struct net_device *net; |
987 | struct mcp251x_priv *priv; | 979 | struct mcp251x_priv *priv; |
@@ -1029,7 +1021,8 @@ static int mcp251x_can_probe(struct spi_device *spi) | |||
1029 | GFP_DMA); | 1021 | GFP_DMA); |
1030 | 1022 | ||
1031 | if (priv->spi_tx_buf) { | 1023 | if (priv->spi_tx_buf) { |
1032 | priv->spi_rx_buf = (priv->spi_tx_buf + (PAGE_SIZE / 2)); | 1024 | priv->spi_rx_buf = (u8 *)(priv->spi_tx_buf + |
1025 | (PAGE_SIZE / 2)); | ||
1033 | priv->spi_rx_dma = (dma_addr_t)(priv->spi_tx_dma + | 1026 | priv->spi_rx_dma = (dma_addr_t)(priv->spi_tx_dma + |
1034 | (PAGE_SIZE / 2)); | 1027 | (PAGE_SIZE / 2)); |
1035 | } else { | 1028 | } else { |
@@ -1100,7 +1093,7 @@ error_out: | |||
1100 | return ret; | 1093 | return ret; |
1101 | } | 1094 | } |
1102 | 1095 | ||
1103 | static int mcp251x_can_remove(struct spi_device *spi) | 1096 | static int __devexit mcp251x_can_remove(struct spi_device *spi) |
1104 | { | 1097 | { |
1105 | struct mcp251x_platform_data *pdata = spi->dev.platform_data; | 1098 | struct mcp251x_platform_data *pdata = spi->dev.platform_data; |
1106 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); | 1099 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); |
@@ -1198,7 +1191,7 @@ static struct spi_driver mcp251x_can_driver = { | |||
1198 | 1191 | ||
1199 | .id_table = mcp251x_id_table, | 1192 | .id_table = mcp251x_id_table, |
1200 | .probe = mcp251x_can_probe, | 1193 | .probe = mcp251x_can_probe, |
1201 | .remove = mcp251x_can_remove, | 1194 | .remove = __devexit_p(mcp251x_can_remove), |
1202 | .suspend = mcp251x_can_suspend, | 1195 | .suspend = mcp251x_can_suspend, |
1203 | .resume = mcp251x_can_resume, | 1196 | .resume = mcp251x_can_resume, |
1204 | }; | 1197 | }; |
diff --git a/drivers/net/can/mscan/mpc5xxx_can.c b/drivers/net/can/mscan/mpc5xxx_can.c index 668850e441d..5fedc337556 100644 --- a/drivers/net/can/mscan/mpc5xxx_can.c +++ b/drivers/net/can/mscan/mpc5xxx_can.c | |||
@@ -43,13 +43,14 @@ struct mpc5xxx_can_data { | |||
43 | }; | 43 | }; |
44 | 44 | ||
45 | #ifdef CONFIG_PPC_MPC52xx | 45 | #ifdef CONFIG_PPC_MPC52xx |
46 | static struct of_device_id mpc52xx_cdm_ids[] = { | 46 | static struct of_device_id __devinitdata mpc52xx_cdm_ids[] = { |
47 | { .compatible = "fsl,mpc5200-cdm", }, | 47 | { .compatible = "fsl,mpc5200-cdm", }, |
48 | {} | 48 | {} |
49 | }; | 49 | }; |
50 | 50 | ||
51 | static u32 mpc52xx_can_get_clock(struct platform_device *ofdev, | 51 | static u32 __devinit mpc52xx_can_get_clock(struct platform_device *ofdev, |
52 | const char *clock_name, int *mscan_clksrc) | 52 | const char *clock_name, |
53 | int *mscan_clksrc) | ||
53 | { | 54 | { |
54 | unsigned int pvr; | 55 | unsigned int pvr; |
55 | struct mpc52xx_cdm __iomem *cdm; | 56 | struct mpc52xx_cdm __iomem *cdm; |
@@ -100,8 +101,9 @@ static u32 mpc52xx_can_get_clock(struct platform_device *ofdev, | |||
100 | return freq; | 101 | return freq; |
101 | } | 102 | } |
102 | #else /* !CONFIG_PPC_MPC52xx */ | 103 | #else /* !CONFIG_PPC_MPC52xx */ |
103 | static u32 mpc52xx_can_get_clock(struct platform_device *ofdev, | 104 | static u32 __devinit mpc52xx_can_get_clock(struct platform_device *ofdev, |
104 | const char *clock_name, int *mscan_clksrc) | 105 | const char *clock_name, |
106 | int *mscan_clksrc) | ||
105 | { | 107 | { |
106 | return 0; | 108 | return 0; |
107 | } | 109 | } |
@@ -122,13 +124,14 @@ struct mpc512x_clockctl { | |||
122 | u32 mccr[4]; /* MSCAN Clk Ctrl Reg 1-3 */ | 124 | u32 mccr[4]; /* MSCAN Clk Ctrl Reg 1-3 */ |
123 | }; | 125 | }; |
124 | 126 | ||
125 | static struct of_device_id mpc512x_clock_ids[] = { | 127 | static struct of_device_id __devinitdata mpc512x_clock_ids[] = { |
126 | { .compatible = "fsl,mpc5121-clock", }, | 128 | { .compatible = "fsl,mpc5121-clock", }, |
127 | {} | 129 | {} |
128 | }; | 130 | }; |
129 | 131 | ||
130 | static u32 mpc512x_can_get_clock(struct platform_device *ofdev, | 132 | static u32 __devinit mpc512x_can_get_clock(struct platform_device *ofdev, |
131 | const char *clock_name, int *mscan_clksrc) | 133 | const char *clock_name, |
134 | int *mscan_clksrc) | ||
132 | { | 135 | { |
133 | struct mpc512x_clockctl __iomem *clockctl; | 136 | struct mpc512x_clockctl __iomem *clockctl; |
134 | struct device_node *np_clock; | 137 | struct device_node *np_clock; |
@@ -178,7 +181,7 @@ static u32 mpc512x_can_get_clock(struct platform_device *ofdev, | |||
178 | 181 | ||
179 | if (!clock_name || !strcmp(clock_name, "sys")) { | 182 | if (!clock_name || !strcmp(clock_name, "sys")) { |
180 | sys_clk = clk_get(&ofdev->dev, "sys_clk"); | 183 | sys_clk = clk_get(&ofdev->dev, "sys_clk"); |
181 | if (IS_ERR(sys_clk)) { | 184 | if (!sys_clk) { |
182 | dev_err(&ofdev->dev, "couldn't get sys_clk\n"); | 185 | dev_err(&ofdev->dev, "couldn't get sys_clk\n"); |
183 | goto exit_unmap; | 186 | goto exit_unmap; |
184 | } | 187 | } |
@@ -201,7 +204,7 @@ static u32 mpc512x_can_get_clock(struct platform_device *ofdev, | |||
201 | 204 | ||
202 | if (clocksrc < 0) { | 205 | if (clocksrc < 0) { |
203 | ref_clk = clk_get(&ofdev->dev, "ref_clk"); | 206 | ref_clk = clk_get(&ofdev->dev, "ref_clk"); |
204 | if (IS_ERR(ref_clk)) { | 207 | if (!ref_clk) { |
205 | dev_err(&ofdev->dev, "couldn't get ref_clk\n"); | 208 | dev_err(&ofdev->dev, "couldn't get ref_clk\n"); |
206 | goto exit_unmap; | 209 | goto exit_unmap; |
207 | } | 210 | } |
@@ -236,18 +239,19 @@ exit_put: | |||
236 | return freq; | 239 | return freq; |
237 | } | 240 | } |
238 | #else /* !CONFIG_PPC_MPC512x */ | 241 | #else /* !CONFIG_PPC_MPC512x */ |
239 | static u32 mpc512x_can_get_clock(struct platform_device *ofdev, | 242 | static u32 __devinit mpc512x_can_get_clock(struct platform_device *ofdev, |
240 | const char *clock_name, int *mscan_clksrc) | 243 | const char *clock_name, |
244 | int *mscan_clksrc) | ||
241 | { | 245 | { |
242 | return 0; | 246 | return 0; |
243 | } | 247 | } |
244 | #endif /* CONFIG_PPC_MPC512x */ | 248 | #endif /* CONFIG_PPC_MPC512x */ |
245 | 249 | ||
246 | static const struct of_device_id mpc5xxx_can_table[]; | 250 | static struct of_device_id mpc5xxx_can_table[]; |
247 | static int mpc5xxx_can_probe(struct platform_device *ofdev) | 251 | static int __devinit mpc5xxx_can_probe(struct platform_device *ofdev) |
248 | { | 252 | { |
249 | const struct of_device_id *match; | 253 | const struct of_device_id *match; |
250 | const struct mpc5xxx_can_data *data; | 254 | struct mpc5xxx_can_data *data; |
251 | struct device_node *np = ofdev->dev.of_node; | 255 | struct device_node *np = ofdev->dev.of_node; |
252 | struct net_device *dev; | 256 | struct net_device *dev; |
253 | struct mscan_priv *priv; | 257 | struct mscan_priv *priv; |
@@ -319,7 +323,7 @@ exit_unmap_mem: | |||
319 | return err; | 323 | return err; |
320 | } | 324 | } |
321 | 325 | ||
322 | static int mpc5xxx_can_remove(struct platform_device *ofdev) | 326 | static int __devexit mpc5xxx_can_remove(struct platform_device *ofdev) |
323 | { | 327 | { |
324 | struct net_device *dev = dev_get_drvdata(&ofdev->dev); | 328 | struct net_device *dev = dev_get_drvdata(&ofdev->dev); |
325 | struct mscan_priv *priv = netdev_priv(dev); | 329 | struct mscan_priv *priv = netdev_priv(dev); |
@@ -376,23 +380,22 @@ static int mpc5xxx_can_resume(struct platform_device *ofdev) | |||
376 | } | 380 | } |
377 | #endif | 381 | #endif |
378 | 382 | ||
379 | static const struct mpc5xxx_can_data mpc5200_can_data = { | 383 | static struct mpc5xxx_can_data __devinitdata mpc5200_can_data = { |
380 | .type = MSCAN_TYPE_MPC5200, | 384 | .type = MSCAN_TYPE_MPC5200, |
381 | .get_clock = mpc52xx_can_get_clock, | 385 | .get_clock = mpc52xx_can_get_clock, |
382 | }; | 386 | }; |
383 | 387 | ||
384 | static const struct mpc5xxx_can_data mpc5121_can_data = { | 388 | static struct mpc5xxx_can_data __devinitdata mpc5121_can_data = { |
385 | .type = MSCAN_TYPE_MPC5121, | 389 | .type = MSCAN_TYPE_MPC5121, |
386 | .get_clock = mpc512x_can_get_clock, | 390 | .get_clock = mpc512x_can_get_clock, |
387 | }; | 391 | }; |
388 | 392 | ||
389 | static const struct of_device_id mpc5xxx_can_table[] = { | 393 | static struct of_device_id __devinitdata mpc5xxx_can_table[] = { |
390 | { .compatible = "fsl,mpc5200-mscan", .data = &mpc5200_can_data, }, | 394 | { .compatible = "fsl,mpc5200-mscan", .data = &mpc5200_can_data, }, |
391 | /* Note that only MPC5121 Rev. 2 (and later) is supported */ | 395 | /* Note that only MPC5121 Rev. 2 (and later) is supported */ |
392 | { .compatible = "fsl,mpc5121-mscan", .data = &mpc5121_can_data, }, | 396 | { .compatible = "fsl,mpc5121-mscan", .data = &mpc5121_can_data, }, |
393 | {}, | 397 | {}, |
394 | }; | 398 | }; |
395 | MODULE_DEVICE_TABLE(of, mpc5xxx_can_table); | ||
396 | 399 | ||
397 | static struct platform_driver mpc5xxx_can_driver = { | 400 | static struct platform_driver mpc5xxx_can_driver = { |
398 | .driver = { | 401 | .driver = { |
@@ -401,14 +404,24 @@ static struct platform_driver mpc5xxx_can_driver = { | |||
401 | .of_match_table = mpc5xxx_can_table, | 404 | .of_match_table = mpc5xxx_can_table, |
402 | }, | 405 | }, |
403 | .probe = mpc5xxx_can_probe, | 406 | .probe = mpc5xxx_can_probe, |
404 | .remove = mpc5xxx_can_remove, | 407 | .remove = __devexit_p(mpc5xxx_can_remove), |
405 | #ifdef CONFIG_PM | 408 | #ifdef CONFIG_PM |
406 | .suspend = mpc5xxx_can_suspend, | 409 | .suspend = mpc5xxx_can_suspend, |
407 | .resume = mpc5xxx_can_resume, | 410 | .resume = mpc5xxx_can_resume, |
408 | #endif | 411 | #endif |
409 | }; | 412 | }; |
410 | 413 | ||
411 | module_platform_driver(mpc5xxx_can_driver); | 414 | static int __init mpc5xxx_can_init(void) |
415 | { | ||
416 | return platform_driver_register(&mpc5xxx_can_driver); | ||
417 | } | ||
418 | module_init(mpc5xxx_can_init); | ||
419 | |||
420 | static void __exit mpc5xxx_can_exit(void) | ||
421 | { | ||
422 | platform_driver_unregister(&mpc5xxx_can_driver); | ||
423 | }; | ||
424 | module_exit(mpc5xxx_can_exit); | ||
412 | 425 | ||
413 | MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>"); | 426 | MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>"); |
414 | MODULE_DESCRIPTION("Freescale MPC5xxx CAN driver"); | 427 | MODULE_DESCRIPTION("Freescale MPC5xxx CAN driver"); |
diff --git a/drivers/net/can/mscan/mscan.c b/drivers/net/can/mscan/mscan.c index e6b40954e20..4cc6f44c2ba 100644 --- a/drivers/net/can/mscan/mscan.c +++ b/drivers/net/can/mscan/mscan.c | |||
@@ -34,7 +34,7 @@ | |||
34 | 34 | ||
35 | #include "mscan.h" | 35 | #include "mscan.h" |
36 | 36 | ||
37 | static const struct can_bittiming_const mscan_bittiming_const = { | 37 | static struct can_bittiming_const mscan_bittiming_const = { |
38 | .name = "mscan", | 38 | .name = "mscan", |
39 | .tseg1_min = 4, | 39 | .tseg1_min = 4, |
40 | .tseg1_max = 16, | 40 | .tseg1_max = 16, |
@@ -62,7 +62,7 @@ static enum can_state state_map[] = { | |||
62 | static int mscan_set_mode(struct net_device *dev, u8 mode) | 62 | static int mscan_set_mode(struct net_device *dev, u8 mode) |
63 | { | 63 | { |
64 | struct mscan_priv *priv = netdev_priv(dev); | 64 | struct mscan_priv *priv = netdev_priv(dev); |
65 | struct mscan_regs __iomem *regs = priv->reg_base; | 65 | struct mscan_regs *regs = (struct mscan_regs *)priv->reg_base; |
66 | int ret = 0; | 66 | int ret = 0; |
67 | int i; | 67 | int i; |
68 | u8 canctl1; | 68 | u8 canctl1; |
@@ -95,9 +95,9 @@ static int mscan_set_mode(struct net_device *dev, u8 mode) | |||
95 | * any, at once. | 95 | * any, at once. |
96 | */ | 96 | */ |
97 | if (i >= MSCAN_SET_MODE_RETRIES) | 97 | if (i >= MSCAN_SET_MODE_RETRIES) |
98 | netdev_dbg(dev, | 98 | dev_dbg(dev->dev.parent, |
99 | "device failed to enter sleep mode. " | 99 | "device failed to enter sleep mode. " |
100 | "We proceed anyhow.\n"); | 100 | "We proceed anyhow.\n"); |
101 | else | 101 | else |
102 | priv->can.state = CAN_STATE_SLEEPING; | 102 | priv->can.state = CAN_STATE_SLEEPING; |
103 | } | 103 | } |
@@ -138,7 +138,7 @@ static int mscan_set_mode(struct net_device *dev, u8 mode) | |||
138 | static int mscan_start(struct net_device *dev) | 138 | static int mscan_start(struct net_device *dev) |
139 | { | 139 | { |
140 | struct mscan_priv *priv = netdev_priv(dev); | 140 | struct mscan_priv *priv = netdev_priv(dev); |
141 | struct mscan_regs __iomem *regs = priv->reg_base; | 141 | struct mscan_regs *regs = (struct mscan_regs *)priv->reg_base; |
142 | u8 canrflg; | 142 | u8 canrflg; |
143 | int err; | 143 | int err; |
144 | 144 | ||
@@ -178,7 +178,7 @@ static int mscan_restart(struct net_device *dev) | |||
178 | struct mscan_priv *priv = netdev_priv(dev); | 178 | struct mscan_priv *priv = netdev_priv(dev); |
179 | 179 | ||
180 | if (priv->type == MSCAN_TYPE_MPC5121) { | 180 | if (priv->type == MSCAN_TYPE_MPC5121) { |
181 | struct mscan_regs __iomem *regs = priv->reg_base; | 181 | struct mscan_regs *regs = (struct mscan_regs *)priv->reg_base; |
182 | 182 | ||
183 | priv->can.state = CAN_STATE_ERROR_ACTIVE; | 183 | priv->can.state = CAN_STATE_ERROR_ACTIVE; |
184 | WARN(!(in_8(®s->canmisc) & MSCAN_BOHOLD), | 184 | WARN(!(in_8(®s->canmisc) & MSCAN_BOHOLD), |
@@ -199,7 +199,7 @@ static netdev_tx_t mscan_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
199 | { | 199 | { |
200 | struct can_frame *frame = (struct can_frame *)skb->data; | 200 | struct can_frame *frame = (struct can_frame *)skb->data; |
201 | struct mscan_priv *priv = netdev_priv(dev); | 201 | struct mscan_priv *priv = netdev_priv(dev); |
202 | struct mscan_regs __iomem *regs = priv->reg_base; | 202 | struct mscan_regs *regs = (struct mscan_regs *)priv->reg_base; |
203 | int i, rtr, buf_id; | 203 | int i, rtr, buf_id; |
204 | u32 can_id; | 204 | u32 can_id; |
205 | 205 | ||
@@ -213,7 +213,7 @@ static netdev_tx_t mscan_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
213 | switch (hweight8(i)) { | 213 | switch (hweight8(i)) { |
214 | case 0: | 214 | case 0: |
215 | netif_stop_queue(dev); | 215 | netif_stop_queue(dev); |
216 | netdev_err(dev, "Tx Ring full when queue awake!\n"); | 216 | dev_err(dev->dev.parent, "Tx Ring full when queue awake!\n"); |
217 | return NETDEV_TX_BUSY; | 217 | return NETDEV_TX_BUSY; |
218 | case 1: | 218 | case 1: |
219 | /* | 219 | /* |
@@ -307,7 +307,7 @@ static enum can_state check_set_state(struct net_device *dev, u8 canrflg) | |||
307 | static void mscan_get_rx_frame(struct net_device *dev, struct can_frame *frame) | 307 | static void mscan_get_rx_frame(struct net_device *dev, struct can_frame *frame) |
308 | { | 308 | { |
309 | struct mscan_priv *priv = netdev_priv(dev); | 309 | struct mscan_priv *priv = netdev_priv(dev); |
310 | struct mscan_regs __iomem *regs = priv->reg_base; | 310 | struct mscan_regs *regs = (struct mscan_regs *)priv->reg_base; |
311 | u32 can_id; | 311 | u32 can_id; |
312 | int i; | 312 | int i; |
313 | 313 | ||
@@ -348,11 +348,11 @@ static void mscan_get_err_frame(struct net_device *dev, struct can_frame *frame, | |||
348 | u8 canrflg) | 348 | u8 canrflg) |
349 | { | 349 | { |
350 | struct mscan_priv *priv = netdev_priv(dev); | 350 | struct mscan_priv *priv = netdev_priv(dev); |
351 | struct mscan_regs __iomem *regs = priv->reg_base; | 351 | struct mscan_regs *regs = (struct mscan_regs *)priv->reg_base; |
352 | struct net_device_stats *stats = &dev->stats; | 352 | struct net_device_stats *stats = &dev->stats; |
353 | enum can_state old_state; | 353 | enum can_state old_state; |
354 | 354 | ||
355 | netdev_dbg(dev, "error interrupt (canrflg=%#x)\n", canrflg); | 355 | dev_dbg(dev->dev.parent, "error interrupt (canrflg=%#x)\n", canrflg); |
356 | frame->can_id = CAN_ERR_FLAG; | 356 | frame->can_id = CAN_ERR_FLAG; |
357 | 357 | ||
358 | if (canrflg & MSCAN_OVRIF) { | 358 | if (canrflg & MSCAN_OVRIF) { |
@@ -411,7 +411,7 @@ static int mscan_rx_poll(struct napi_struct *napi, int quota) | |||
411 | { | 411 | { |
412 | struct mscan_priv *priv = container_of(napi, struct mscan_priv, napi); | 412 | struct mscan_priv *priv = container_of(napi, struct mscan_priv, napi); |
413 | struct net_device *dev = napi->dev; | 413 | struct net_device *dev = napi->dev; |
414 | struct mscan_regs __iomem *regs = priv->reg_base; | 414 | struct mscan_regs *regs = (struct mscan_regs *)priv->reg_base; |
415 | struct net_device_stats *stats = &dev->stats; | 415 | struct net_device_stats *stats = &dev->stats; |
416 | int npackets = 0; | 416 | int npackets = 0; |
417 | int ret = 1; | 417 | int ret = 1; |
@@ -427,7 +427,7 @@ static int mscan_rx_poll(struct napi_struct *napi, int quota) | |||
427 | skb = alloc_can_skb(dev, &frame); | 427 | skb = alloc_can_skb(dev, &frame); |
428 | if (!skb) { | 428 | if (!skb) { |
429 | if (printk_ratelimit()) | 429 | if (printk_ratelimit()) |
430 | netdev_notice(dev, "packet dropped\n"); | 430 | dev_notice(dev->dev.parent, "packet dropped\n"); |
431 | stats->rx_dropped++; | 431 | stats->rx_dropped++; |
432 | out_8(®s->canrflg, canrflg); | 432 | out_8(®s->canrflg, canrflg); |
433 | continue; | 433 | continue; |
@@ -458,7 +458,7 @@ static irqreturn_t mscan_isr(int irq, void *dev_id) | |||
458 | { | 458 | { |
459 | struct net_device *dev = (struct net_device *)dev_id; | 459 | struct net_device *dev = (struct net_device *)dev_id; |
460 | struct mscan_priv *priv = netdev_priv(dev); | 460 | struct mscan_priv *priv = netdev_priv(dev); |
461 | struct mscan_regs __iomem *regs = priv->reg_base; | 461 | struct mscan_regs *regs = (struct mscan_regs *)priv->reg_base; |
462 | struct net_device_stats *stats = &dev->stats; | 462 | struct net_device_stats *stats = &dev->stats; |
463 | u8 cantier, cantflg, canrflg; | 463 | u8 cantier, cantflg, canrflg; |
464 | irqreturn_t ret = IRQ_NONE; | 464 | irqreturn_t ret = IRQ_NONE; |
@@ -517,8 +517,12 @@ static irqreturn_t mscan_isr(int irq, void *dev_id) | |||
517 | 517 | ||
518 | static int mscan_do_set_mode(struct net_device *dev, enum can_mode mode) | 518 | static int mscan_do_set_mode(struct net_device *dev, enum can_mode mode) |
519 | { | 519 | { |
520 | struct mscan_priv *priv = netdev_priv(dev); | ||
520 | int ret = 0; | 521 | int ret = 0; |
521 | 522 | ||
523 | if (!priv->open_time) | ||
524 | return -EINVAL; | ||
525 | |||
522 | switch (mode) { | 526 | switch (mode) { |
523 | case CAN_MODE_START: | 527 | case CAN_MODE_START: |
524 | ret = mscan_restart(dev); | 528 | ret = mscan_restart(dev); |
@@ -538,7 +542,7 @@ static int mscan_do_set_mode(struct net_device *dev, enum can_mode mode) | |||
538 | static int mscan_do_set_bittiming(struct net_device *dev) | 542 | static int mscan_do_set_bittiming(struct net_device *dev) |
539 | { | 543 | { |
540 | struct mscan_priv *priv = netdev_priv(dev); | 544 | struct mscan_priv *priv = netdev_priv(dev); |
541 | struct mscan_regs __iomem *regs = priv->reg_base; | 545 | struct mscan_regs *regs = (struct mscan_regs *)priv->reg_base; |
542 | struct can_bittiming *bt = &priv->can.bittiming; | 546 | struct can_bittiming *bt = &priv->can.bittiming; |
543 | u8 btr0, btr1; | 547 | u8 btr0, btr1; |
544 | 548 | ||
@@ -547,7 +551,8 @@ static int mscan_do_set_bittiming(struct net_device *dev) | |||
547 | BTR1_SET_TSEG2(bt->phase_seg2) | | 551 | BTR1_SET_TSEG2(bt->phase_seg2) | |
548 | BTR1_SET_SAM(priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES)); | 552 | BTR1_SET_SAM(priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES)); |
549 | 553 | ||
550 | netdev_info(dev, "setting BTR0=0x%02x BTR1=0x%02x\n", btr0, btr1); | 554 | dev_info(dev->dev.parent, "setting BTR0=0x%02x BTR1=0x%02x\n", |
555 | btr0, btr1); | ||
551 | 556 | ||
552 | out_8(®s->canbtr0, btr0); | 557 | out_8(®s->canbtr0, btr0); |
553 | out_8(®s->canbtr1, btr1); | 558 | out_8(®s->canbtr1, btr1); |
@@ -555,23 +560,11 @@ static int mscan_do_set_bittiming(struct net_device *dev) | |||
555 | return 0; | 560 | return 0; |
556 | } | 561 | } |
557 | 562 | ||
558 | static int mscan_get_berr_counter(const struct net_device *dev, | ||
559 | struct can_berr_counter *bec) | ||
560 | { | ||
561 | struct mscan_priv *priv = netdev_priv(dev); | ||
562 | struct mscan_regs __iomem *regs = priv->reg_base; | ||
563 | |||
564 | bec->txerr = in_8(®s->cantxerr); | ||
565 | bec->rxerr = in_8(®s->canrxerr); | ||
566 | |||
567 | return 0; | ||
568 | } | ||
569 | |||
570 | static int mscan_open(struct net_device *dev) | 563 | static int mscan_open(struct net_device *dev) |
571 | { | 564 | { |
572 | int ret; | 565 | int ret; |
573 | struct mscan_priv *priv = netdev_priv(dev); | 566 | struct mscan_priv *priv = netdev_priv(dev); |
574 | struct mscan_regs __iomem *regs = priv->reg_base; | 567 | struct mscan_regs *regs = (struct mscan_regs *)priv->reg_base; |
575 | 568 | ||
576 | /* common open */ | 569 | /* common open */ |
577 | ret = open_candev(dev); | 570 | ret = open_candev(dev); |
@@ -582,14 +575,13 @@ static int mscan_open(struct net_device *dev) | |||
582 | 575 | ||
583 | ret = request_irq(dev->irq, mscan_isr, 0, dev->name, dev); | 576 | ret = request_irq(dev->irq, mscan_isr, 0, dev->name, dev); |
584 | if (ret < 0) { | 577 | if (ret < 0) { |
585 | netdev_err(dev, "failed to attach interrupt\n"); | 578 | dev_err(dev->dev.parent, "failed to attach interrupt\n"); |
586 | goto exit_napi_disable; | 579 | goto exit_napi_disable; |
587 | } | 580 | } |
588 | 581 | ||
589 | if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) | 582 | priv->open_time = jiffies; |
590 | setbits8(®s->canctl1, MSCAN_LISTEN); | 583 | |
591 | else | 584 | clrbits8(®s->canctl1, MSCAN_LISTEN); |
592 | clrbits8(®s->canctl1, MSCAN_LISTEN); | ||
593 | 585 | ||
594 | ret = mscan_start(dev); | 586 | ret = mscan_start(dev); |
595 | if (ret) | 587 | if (ret) |
@@ -600,6 +592,7 @@ static int mscan_open(struct net_device *dev) | |||
600 | return 0; | 592 | return 0; |
601 | 593 | ||
602 | exit_free_irq: | 594 | exit_free_irq: |
595 | priv->open_time = 0; | ||
603 | free_irq(dev->irq, dev); | 596 | free_irq(dev->irq, dev); |
604 | exit_napi_disable: | 597 | exit_napi_disable: |
605 | napi_disable(&priv->napi); | 598 | napi_disable(&priv->napi); |
@@ -610,7 +603,7 @@ exit_napi_disable: | |||
610 | static int mscan_close(struct net_device *dev) | 603 | static int mscan_close(struct net_device *dev) |
611 | { | 604 | { |
612 | struct mscan_priv *priv = netdev_priv(dev); | 605 | struct mscan_priv *priv = netdev_priv(dev); |
613 | struct mscan_regs __iomem *regs = priv->reg_base; | 606 | struct mscan_regs *regs = (struct mscan_regs *)priv->reg_base; |
614 | 607 | ||
615 | netif_stop_queue(dev); | 608 | netif_stop_queue(dev); |
616 | napi_disable(&priv->napi); | 609 | napi_disable(&priv->napi); |
@@ -620,6 +613,7 @@ static int mscan_close(struct net_device *dev) | |||
620 | mscan_set_mode(dev, MSCAN_INIT_MODE); | 613 | mscan_set_mode(dev, MSCAN_INIT_MODE); |
621 | close_candev(dev); | 614 | close_candev(dev); |
622 | free_irq(dev->irq, dev); | 615 | free_irq(dev->irq, dev); |
616 | priv->open_time = 0; | ||
623 | 617 | ||
624 | return 0; | 618 | return 0; |
625 | } | 619 | } |
@@ -633,7 +627,7 @@ static const struct net_device_ops mscan_netdev_ops = { | |||
633 | int register_mscandev(struct net_device *dev, int mscan_clksrc) | 627 | int register_mscandev(struct net_device *dev, int mscan_clksrc) |
634 | { | 628 | { |
635 | struct mscan_priv *priv = netdev_priv(dev); | 629 | struct mscan_priv *priv = netdev_priv(dev); |
636 | struct mscan_regs __iomem *regs = priv->reg_base; | 630 | struct mscan_regs *regs = (struct mscan_regs *)priv->reg_base; |
637 | u8 ctl1; | 631 | u8 ctl1; |
638 | 632 | ||
639 | ctl1 = in_8(®s->canctl1); | 633 | ctl1 = in_8(®s->canctl1); |
@@ -642,10 +636,8 @@ int register_mscandev(struct net_device *dev, int mscan_clksrc) | |||
642 | else | 636 | else |
643 | ctl1 &= ~MSCAN_CLKSRC; | 637 | ctl1 &= ~MSCAN_CLKSRC; |
644 | 638 | ||
645 | if (priv->type == MSCAN_TYPE_MPC5121) { | 639 | if (priv->type == MSCAN_TYPE_MPC5121) |
646 | priv->can.do_get_berr_counter = mscan_get_berr_counter; | ||
647 | ctl1 |= MSCAN_BORM; /* bus-off recovery upon request */ | 640 | ctl1 |= MSCAN_BORM; /* bus-off recovery upon request */ |
648 | } | ||
649 | 641 | ||
650 | ctl1 |= MSCAN_CANE; | 642 | ctl1 |= MSCAN_CANE; |
651 | out_8(®s->canctl1, ctl1); | 643 | out_8(®s->canctl1, ctl1); |
@@ -672,7 +664,7 @@ int register_mscandev(struct net_device *dev, int mscan_clksrc) | |||
672 | void unregister_mscandev(struct net_device *dev) | 664 | void unregister_mscandev(struct net_device *dev) |
673 | { | 665 | { |
674 | struct mscan_priv *priv = netdev_priv(dev); | 666 | struct mscan_priv *priv = netdev_priv(dev); |
675 | struct mscan_regs __iomem *regs = priv->reg_base; | 667 | struct mscan_regs *regs = (struct mscan_regs *)priv->reg_base; |
676 | mscan_set_mode(dev, MSCAN_INIT_MODE); | 668 | mscan_set_mode(dev, MSCAN_INIT_MODE); |
677 | clrbits8(®s->canctl1, MSCAN_CANE); | 669 | clrbits8(®s->canctl1, MSCAN_CANE); |
678 | unregister_candev(dev); | 670 | unregister_candev(dev); |
@@ -698,8 +690,7 @@ struct net_device *alloc_mscandev(void) | |||
698 | priv->can.bittiming_const = &mscan_bittiming_const; | 690 | priv->can.bittiming_const = &mscan_bittiming_const; |
699 | priv->can.do_set_bittiming = mscan_do_set_bittiming; | 691 | priv->can.do_set_bittiming = mscan_do_set_bittiming; |
700 | priv->can.do_set_mode = mscan_do_set_mode; | 692 | priv->can.do_set_mode = mscan_do_set_mode; |
701 | priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | | 693 | priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES; |
702 | CAN_CTRLMODE_LISTENONLY; | ||
703 | 694 | ||
704 | for (i = 0; i < TX_QUEUE_SIZE; i++) { | 695 | for (i = 0; i < TX_QUEUE_SIZE; i++) { |
705 | priv->tx_queue[i].id = i; | 696 | priv->tx_queue[i].id = i; |
diff --git a/drivers/net/can/mscan/mscan.h b/drivers/net/can/mscan/mscan.h index af2ed8baf0a..b43e9f5d326 100644 --- a/drivers/net/can/mscan/mscan.h +++ b/drivers/net/can/mscan/mscan.h | |||
@@ -281,6 +281,7 @@ struct tx_queue_entry { | |||
281 | struct mscan_priv { | 281 | struct mscan_priv { |
282 | struct can_priv can; /* must be the first member */ | 282 | struct can_priv can; /* must be the first member */ |
283 | unsigned int type; /* MSCAN type variants */ | 283 | unsigned int type; /* MSCAN type variants */ |
284 | long open_time; | ||
284 | unsigned long flags; | 285 | unsigned long flags; |
285 | void __iomem *reg_base; /* ioremap'ed address to registers */ | 286 | void __iomem *reg_base; /* ioremap'ed address to registers */ |
286 | u8 shadow_statflg; | 287 | u8 shadow_statflg; |
diff --git a/drivers/net/can/pch_can.c b/drivers/net/can/pch_can.c index 7d1748575b1..d11fbb2b95f 100644 --- a/drivers/net/can/pch_can.c +++ b/drivers/net/can/pch_can.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) 1999 - 2010 Intel Corporation. | 2 | * Copyright (C) 1999 - 2010 Intel Corporation. |
3 | * Copyright (C) 2010 LAPIS SEMICONDUCTOR CO., LTD. | 3 | * Copyright (C) 2010 OKI SEMICONDUCTOR CO., LTD. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
@@ -66,7 +66,6 @@ | |||
66 | #define PCH_IF_CREQ_BUSY BIT(15) | 66 | #define PCH_IF_CREQ_BUSY BIT(15) |
67 | 67 | ||
68 | #define PCH_STATUS_INT 0x8000 | 68 | #define PCH_STATUS_INT 0x8000 |
69 | #define PCH_RP 0x00008000 | ||
70 | #define PCH_REC 0x00007f00 | 69 | #define PCH_REC 0x00007f00 |
71 | #define PCH_TEC 0x000000ff | 70 | #define PCH_TEC 0x000000ff |
72 | 71 | ||
@@ -184,7 +183,7 @@ struct pch_can_priv { | |||
184 | int use_msi; | 183 | int use_msi; |
185 | }; | 184 | }; |
186 | 185 | ||
187 | static const struct can_bittiming_const pch_can_bittiming_const = { | 186 | static struct can_bittiming_const pch_can_bittiming_const = { |
188 | .name = KBUILD_MODNAME, | 187 | .name = KBUILD_MODNAME, |
189 | .tseg1_min = 2, | 188 | .tseg1_min = 2, |
190 | .tseg1_max = 16, | 189 | .tseg1_max = 16, |
@@ -528,7 +527,7 @@ static void pch_can_error(struct net_device *ndev, u32 status) | |||
528 | priv->can.can_stats.error_passive++; | 527 | priv->can.can_stats.error_passive++; |
529 | state = CAN_STATE_ERROR_PASSIVE; | 528 | state = CAN_STATE_ERROR_PASSIVE; |
530 | cf->can_id |= CAN_ERR_CRTL; | 529 | cf->can_id |= CAN_ERR_CRTL; |
531 | if (errc & PCH_RP) | 530 | if (((errc & PCH_REC) >> 8) > 127) |
532 | cf->data[1] |= CAN_ERR_CRTL_RX_PASSIVE; | 531 | cf->data[1] |= CAN_ERR_CRTL_RX_PASSIVE; |
533 | if ((errc & PCH_TEC) > 127) | 532 | if ((errc & PCH_TEC) > 127) |
534 | cf->data[1] |= CAN_ERR_CRTL_TX_PASSIVE; | 533 | cf->data[1] |= CAN_ERR_CRTL_TX_PASSIVE; |
@@ -954,7 +953,7 @@ static const struct net_device_ops pch_can_netdev_ops = { | |||
954 | .ndo_start_xmit = pch_xmit, | 953 | .ndo_start_xmit = pch_xmit, |
955 | }; | 954 | }; |
956 | 955 | ||
957 | static void pch_can_remove(struct pci_dev *pdev) | 956 | static void __devexit pch_can_remove(struct pci_dev *pdev) |
958 | { | 957 | { |
959 | struct net_device *ndev = pci_get_drvdata(pdev); | 958 | struct net_device *ndev = pci_get_drvdata(pdev); |
960 | struct pch_can_priv *priv = netdev_priv(ndev); | 959 | struct pch_can_priv *priv = netdev_priv(ndev); |
@@ -1178,7 +1177,7 @@ static int pch_can_get_berr_counter(const struct net_device *dev, | |||
1178 | return 0; | 1177 | return 0; |
1179 | } | 1178 | } |
1180 | 1179 | ||
1181 | static int pch_can_probe(struct pci_dev *pdev, | 1180 | static int __devinit pch_can_probe(struct pci_dev *pdev, |
1182 | const struct pci_device_id *id) | 1181 | const struct pci_device_id *id) |
1183 | { | 1182 | { |
1184 | struct net_device *ndev; | 1183 | struct net_device *ndev; |
@@ -1269,12 +1268,22 @@ static struct pci_driver pch_can_pci_driver = { | |||
1269 | .name = "pch_can", | 1268 | .name = "pch_can", |
1270 | .id_table = pch_pci_tbl, | 1269 | .id_table = pch_pci_tbl, |
1271 | .probe = pch_can_probe, | 1270 | .probe = pch_can_probe, |
1272 | .remove = pch_can_remove, | 1271 | .remove = __devexit_p(pch_can_remove), |
1273 | .suspend = pch_can_suspend, | 1272 | .suspend = pch_can_suspend, |
1274 | .resume = pch_can_resume, | 1273 | .resume = pch_can_resume, |
1275 | }; | 1274 | }; |
1276 | 1275 | ||
1277 | module_pci_driver(pch_can_pci_driver); | 1276 | static int __init pch_can_pci_init(void) |
1277 | { | ||
1278 | return pci_register_driver(&pch_can_pci_driver); | ||
1279 | } | ||
1280 | module_init(pch_can_pci_init); | ||
1281 | |||
1282 | static void __exit pch_can_pci_exit(void) | ||
1283 | { | ||
1284 | pci_unregister_driver(&pch_can_pci_driver); | ||
1285 | } | ||
1286 | module_exit(pch_can_pci_exit); | ||
1278 | 1287 | ||
1279 | MODULE_DESCRIPTION("Intel EG20T PCH CAN(Controller Area Network) Driver"); | 1288 | MODULE_DESCRIPTION("Intel EG20T PCH CAN(Controller Area Network) Driver"); |
1280 | MODULE_LICENSE("GPL v2"); | 1289 | MODULE_LICENSE("GPL v2"); |
diff --git a/drivers/net/can/sja1000/Kconfig b/drivers/net/can/sja1000/Kconfig index 92f73c708a3..6fdc031daaa 100644 --- a/drivers/net/can/sja1000/Kconfig +++ b/drivers/net/can/sja1000/Kconfig | |||
@@ -6,6 +6,7 @@ if CAN_SJA1000 | |||
6 | 6 | ||
7 | config CAN_SJA1000_ISA | 7 | config CAN_SJA1000_ISA |
8 | tristate "ISA Bus based legacy SJA1000 driver" | 8 | tristate "ISA Bus based legacy SJA1000 driver" |
9 | depends on ISA | ||
9 | ---help--- | 10 | ---help--- |
10 | This driver adds legacy support for SJA1000 chips connected to | 11 | This driver adds legacy support for SJA1000 chips connected to |
11 | the ISA bus using I/O port, memory mapped or indirect access. | 12 | the ISA bus using I/O port, memory mapped or indirect access. |
@@ -21,20 +22,13 @@ config CAN_SJA1000_PLATFORM | |||
21 | 22 | ||
22 | config CAN_SJA1000_OF_PLATFORM | 23 | config CAN_SJA1000_OF_PLATFORM |
23 | tristate "Generic OF Platform Bus based SJA1000 driver" | 24 | tristate "Generic OF Platform Bus based SJA1000 driver" |
24 | depends on OF | 25 | depends on PPC_OF |
25 | ---help--- | 26 | ---help--- |
26 | This driver adds support for the SJA1000 chips connected to | 27 | This driver adds support for the SJA1000 chips connected to |
27 | the OpenFirmware "platform bus" found on embedded systems with | 28 | the OpenFirmware "platform bus" found on embedded systems with |
28 | OpenFirmware bindings, e.g. if you have a PowerPC based system | 29 | OpenFirmware bindings, e.g. if you have a PowerPC based system |
29 | you may want to enable this option. | 30 | you may want to enable this option. |
30 | 31 | ||
31 | config CAN_EMS_PCMCIA | ||
32 | tristate "EMS CPC-CARD Card" | ||
33 | depends on PCMCIA | ||
34 | ---help--- | ||
35 | This driver is for the one or two channel CPC-CARD cards from | ||
36 | EMS Dr. Thomas Wuensche (http://www.ems-wuensche.de). | ||
37 | |||
38 | config CAN_EMS_PCI | 32 | config CAN_EMS_PCI |
39 | tristate "EMS CPC-PCI, CPC-PCIe and CPC-104P Card" | 33 | tristate "EMS CPC-PCI, CPC-PCIe and CPC-104P Card" |
40 | depends on PCI | 34 | depends on PCI |
@@ -43,39 +37,11 @@ config CAN_EMS_PCI | |||
43 | CPC-PCIe and CPC-104P cards from EMS Dr. Thomas Wuensche | 37 | CPC-PCIe and CPC-104P cards from EMS Dr. Thomas Wuensche |
44 | (http://www.ems-wuensche.de). | 38 | (http://www.ems-wuensche.de). |
45 | 39 | ||
46 | config CAN_PEAK_PCMCIA | ||
47 | tristate "PEAK PCAN-PC Card" | ||
48 | depends on PCMCIA | ||
49 | ---help--- | ||
50 | This driver is for the PCAN-PC Card PCMCIA adapter (1 or 2 channels) | ||
51 | from PEAK-System (http://www.peak-system.com). To compile this | ||
52 | driver as a module, choose M here: the module will be called | ||
53 | peak_pcmcia. | ||
54 | |||
55 | config CAN_PEAK_PCI | ||
56 | tristate "PEAK PCAN-PCI/PCIe/miniPCI Cards" | ||
57 | depends on PCI | ||
58 | ---help--- | ||
59 | This driver is for the PCAN-PCI/PCIe/miniPCI cards | ||
60 | (1, 2, 3 or 4 channels) from PEAK-System Technik | ||
61 | (http://www.peak-system.com). | ||
62 | |||
63 | config CAN_PEAK_PCIEC | ||
64 | bool "PEAK PCAN-ExpressCard Cards" | ||
65 | depends on CAN_PEAK_PCI | ||
66 | select I2C | ||
67 | select I2C_ALGOBIT | ||
68 | default y | ||
69 | ---help--- | ||
70 | Say Y here if you want to use a PCAN-ExpressCard from PEAK-System | ||
71 | Technik. This will also automatically select I2C and I2C_ALGO | ||
72 | configuration options. | ||
73 | |||
74 | config CAN_KVASER_PCI | 40 | config CAN_KVASER_PCI |
75 | tristate "Kvaser PCIcanx and Kvaser PCIcan PCI Cards" | 41 | tristate "Kvaser PCIcanx and Kvaser PCIcan PCI Cards" |
76 | depends on PCI | 42 | depends on PCI |
77 | ---help--- | 43 | ---help--- |
78 | This driver is for the PCIcanx and PCIcan cards (1, 2 or | 44 | This driver is for the the PCIcanx and PCIcan cards (1, 2 or |
79 | 4 channel) from Kvaser (http://www.kvaser.com). | 45 | 4 channel) from Kvaser (http://www.kvaser.com). |
80 | 46 | ||
81 | config CAN_PLX_PCI | 47 | config CAN_PLX_PCI |
@@ -92,8 +58,6 @@ config CAN_PLX_PCI | |||
92 | - esd CAN-PCIe/2000 | 58 | - esd CAN-PCIe/2000 |
93 | - Marathon CAN-bus-PCI card (http://www.marathon.ru/) | 59 | - Marathon CAN-bus-PCI card (http://www.marathon.ru/) |
94 | - TEWS TECHNOLOGIES TPMC810 card (http://www.tews.com/) | 60 | - TEWS TECHNOLOGIES TPMC810 card (http://www.tews.com/) |
95 | - IXXAT Automation PC-I 04/PCI card (http://www.ixxat.com/) | ||
96 | - Connect Tech Inc. CANpro/104-Plus Opto (CRG001) card (http://www.connecttech.com) | ||
97 | 61 | ||
98 | config CAN_TSCAN1 | 62 | config CAN_TSCAN1 |
99 | tristate "TS-CAN1 PC104 boards" | 63 | tristate "TS-CAN1 PC104 boards" |
diff --git a/drivers/net/can/sja1000/Makefile b/drivers/net/can/sja1000/Makefile index b3d05cbfec3..2c591eb321c 100644 --- a/drivers/net/can/sja1000/Makefile +++ b/drivers/net/can/sja1000/Makefile | |||
@@ -6,11 +6,8 @@ obj-$(CONFIG_CAN_SJA1000) += sja1000.o | |||
6 | obj-$(CONFIG_CAN_SJA1000_ISA) += sja1000_isa.o | 6 | obj-$(CONFIG_CAN_SJA1000_ISA) += sja1000_isa.o |
7 | obj-$(CONFIG_CAN_SJA1000_PLATFORM) += sja1000_platform.o | 7 | obj-$(CONFIG_CAN_SJA1000_PLATFORM) += sja1000_platform.o |
8 | obj-$(CONFIG_CAN_SJA1000_OF_PLATFORM) += sja1000_of_platform.o | 8 | obj-$(CONFIG_CAN_SJA1000_OF_PLATFORM) += sja1000_of_platform.o |
9 | obj-$(CONFIG_CAN_EMS_PCMCIA) += ems_pcmcia.o | ||
10 | obj-$(CONFIG_CAN_EMS_PCI) += ems_pci.o | 9 | obj-$(CONFIG_CAN_EMS_PCI) += ems_pci.o |
11 | obj-$(CONFIG_CAN_KVASER_PCI) += kvaser_pci.o | 10 | obj-$(CONFIG_CAN_KVASER_PCI) += kvaser_pci.o |
12 | obj-$(CONFIG_CAN_PEAK_PCMCIA) += peak_pcmcia.o | ||
13 | obj-$(CONFIG_CAN_PEAK_PCI) += peak_pci.o | ||
14 | obj-$(CONFIG_CAN_PLX_PCI) += plx_pci.o | 11 | obj-$(CONFIG_CAN_PLX_PCI) += plx_pci.o |
15 | obj-$(CONFIG_CAN_TSCAN1) += tscan1.o | 12 | obj-$(CONFIG_CAN_TSCAN1) += tscan1.o |
16 | 13 | ||
diff --git a/drivers/net/can/sja1000/ems_pci.c b/drivers/net/can/sja1000/ems_pci.c index 036a326836b..36f4f9780c3 100644 --- a/drivers/net/can/sja1000/ems_pci.c +++ b/drivers/net/can/sja1000/ems_pci.c | |||
@@ -220,8 +220,8 @@ static void ems_pci_card_reset(struct ems_pci_card *card) | |||
220 | * Probe PCI device for EMS CAN signature and register each available | 220 | * Probe PCI device for EMS CAN signature and register each available |
221 | * CAN channel to SJA1000 Socket-CAN subsystem. | 221 | * CAN channel to SJA1000 Socket-CAN subsystem. |
222 | */ | 222 | */ |
223 | static int ems_pci_add_card(struct pci_dev *pdev, | 223 | static int __devinit ems_pci_add_card(struct pci_dev *pdev, |
224 | const struct pci_device_id *ent) | 224 | const struct pci_device_id *ent) |
225 | { | 225 | { |
226 | struct sja1000_priv *priv; | 226 | struct sja1000_priv *priv; |
227 | struct net_device *dev; | 227 | struct net_device *dev; |
@@ -371,4 +371,16 @@ static struct pci_driver ems_pci_driver = { | |||
371 | .remove = ems_pci_del_card, | 371 | .remove = ems_pci_del_card, |
372 | }; | 372 | }; |
373 | 373 | ||
374 | module_pci_driver(ems_pci_driver); | 374 | static int __init ems_pci_init(void) |
375 | { | ||
376 | return pci_register_driver(&ems_pci_driver); | ||
377 | } | ||
378 | |||
379 | static void __exit ems_pci_exit(void) | ||
380 | { | ||
381 | pci_unregister_driver(&ems_pci_driver); | ||
382 | } | ||
383 | |||
384 | module_init(ems_pci_init); | ||
385 | module_exit(ems_pci_exit); | ||
386 | |||
diff --git a/drivers/net/can/sja1000/ems_pcmcia.c b/drivers/net/can/sja1000/ems_pcmcia.c deleted file mode 100644 index 5c2f3fbbf5a..00000000000 --- a/drivers/net/can/sja1000/ems_pcmcia.c +++ /dev/null | |||
@@ -1,330 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008 Sebastian Haas (initial chardev implementation) | ||
3 | * Copyright (C) 2010 Markus Plessing <plessing@ems-wuensche.com> | ||
4 | * Rework for mainline by Oliver Hartkopp <socketcan@hartkopp.net> | ||
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 | |||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/module.h> | ||
18 | #include <linux/interrupt.h> | ||
19 | #include <linux/netdevice.h> | ||
20 | #include <linux/delay.h> | ||
21 | #include <linux/io.h> | ||
22 | #include <pcmcia/cistpl.h> | ||
23 | #include <pcmcia/ds.h> | ||
24 | #include <linux/can.h> | ||
25 | #include <linux/can/dev.h> | ||
26 | #include "sja1000.h" | ||
27 | |||
28 | #define DRV_NAME "ems_pcmcia" | ||
29 | |||
30 | MODULE_AUTHOR("Markus Plessing <plessing@ems-wuensche.com>"); | ||
31 | MODULE_DESCRIPTION("Socket-CAN driver for EMS CPC-CARD cards"); | ||
32 | MODULE_SUPPORTED_DEVICE("EMS CPC-CARD CAN card"); | ||
33 | MODULE_LICENSE("GPL v2"); | ||
34 | |||
35 | #define EMS_PCMCIA_MAX_CHAN 2 | ||
36 | |||
37 | struct ems_pcmcia_card { | ||
38 | int channels; | ||
39 | struct pcmcia_device *pcmcia_dev; | ||
40 | struct net_device *net_dev[EMS_PCMCIA_MAX_CHAN]; | ||
41 | void __iomem *base_addr; | ||
42 | }; | ||
43 | |||
44 | #define EMS_PCMCIA_CAN_CLOCK (16000000 / 2) | ||
45 | |||
46 | /* | ||
47 | * The board configuration is probably following: | ||
48 | * RX1 is connected to ground. | ||
49 | * TX1 is not connected. | ||
50 | * CLKO is not connected. | ||
51 | * Setting the OCR register to 0xDA is a good idea. | ||
52 | * This means normal output mode , push-pull and the correct polarity. | ||
53 | */ | ||
54 | #define EMS_PCMCIA_OCR (OCR_TX0_PUSHPULL | OCR_TX1_PUSHPULL) | ||
55 | |||
56 | /* | ||
57 | * In the CDR register, you should set CBP to 1. | ||
58 | * You will probably also want to set the clock divider value to 7 | ||
59 | * (meaning direct oscillator output) because the second SJA1000 chip | ||
60 | * is driven by the first one CLKOUT output. | ||
61 | */ | ||
62 | #define EMS_PCMCIA_CDR (CDR_CBP | CDR_CLKOUT_MASK) | ||
63 | #define EMS_PCMCIA_MEM_SIZE 4096 /* Size of the remapped io-memory */ | ||
64 | #define EMS_PCMCIA_CAN_BASE_OFFSET 0x100 /* Offset where controllers starts */ | ||
65 | #define EMS_PCMCIA_CAN_CTRL_SIZE 0x80 /* Memory size for each controller */ | ||
66 | |||
67 | #define EMS_CMD_RESET 0x00 /* Perform a reset of the card */ | ||
68 | #define EMS_CMD_MAP 0x03 /* Map CAN controllers into card' memory */ | ||
69 | #define EMS_CMD_UMAP 0x02 /* Unmap CAN controllers from card' memory */ | ||
70 | |||
71 | static struct pcmcia_device_id ems_pcmcia_tbl[] = { | ||
72 | PCMCIA_DEVICE_PROD_ID123("EMS_T_W", "CPC-Card", "V2.0", 0xeab1ea23, | ||
73 | 0xa338573f, 0xe4575800), | ||
74 | PCMCIA_DEVICE_NULL, | ||
75 | }; | ||
76 | |||
77 | MODULE_DEVICE_TABLE(pcmcia, ems_pcmcia_tbl); | ||
78 | |||
79 | static u8 ems_pcmcia_read_reg(const struct sja1000_priv *priv, int port) | ||
80 | { | ||
81 | return readb(priv->reg_base + port); | ||
82 | } | ||
83 | |||
84 | static void ems_pcmcia_write_reg(const struct sja1000_priv *priv, int port, | ||
85 | u8 val) | ||
86 | { | ||
87 | writeb(val, priv->reg_base + port); | ||
88 | } | ||
89 | |||
90 | static irqreturn_t ems_pcmcia_interrupt(int irq, void *dev_id) | ||
91 | { | ||
92 | struct ems_pcmcia_card *card = dev_id; | ||
93 | struct net_device *dev; | ||
94 | irqreturn_t retval = IRQ_NONE; | ||
95 | int i, again; | ||
96 | |||
97 | /* Card not present */ | ||
98 | if (readw(card->base_addr) != 0xAA55) | ||
99 | return IRQ_HANDLED; | ||
100 | |||
101 | do { | ||
102 | again = 0; | ||
103 | |||
104 | /* Check interrupt for each channel */ | ||
105 | for (i = 0; i < card->channels; i++) { | ||
106 | dev = card->net_dev[i]; | ||
107 | if (!dev) | ||
108 | continue; | ||
109 | |||
110 | if (sja1000_interrupt(irq, dev) == IRQ_HANDLED) | ||
111 | again = 1; | ||
112 | } | ||
113 | /* At least one channel handled the interrupt */ | ||
114 | if (again) | ||
115 | retval = IRQ_HANDLED; | ||
116 | |||
117 | } while (again); | ||
118 | |||
119 | return retval; | ||
120 | } | ||
121 | |||
122 | /* | ||
123 | * Check if a CAN controller is present at the specified location | ||
124 | * by trying to set 'em into the PeliCAN mode | ||
125 | */ | ||
126 | static inline int ems_pcmcia_check_chan(struct sja1000_priv *priv) | ||
127 | { | ||
128 | /* Make sure SJA1000 is in reset mode */ | ||
129 | ems_pcmcia_write_reg(priv, REG_MOD, 1); | ||
130 | ems_pcmcia_write_reg(priv, REG_CDR, CDR_PELICAN); | ||
131 | |||
132 | /* read reset-values */ | ||
133 | if (ems_pcmcia_read_reg(priv, REG_CDR) == CDR_PELICAN) | ||
134 | return 1; | ||
135 | |||
136 | return 0; | ||
137 | } | ||
138 | |||
139 | static void ems_pcmcia_del_card(struct pcmcia_device *pdev) | ||
140 | { | ||
141 | struct ems_pcmcia_card *card = pdev->priv; | ||
142 | struct net_device *dev; | ||
143 | int i; | ||
144 | |||
145 | free_irq(pdev->irq, card); | ||
146 | |||
147 | for (i = 0; i < card->channels; i++) { | ||
148 | dev = card->net_dev[i]; | ||
149 | if (!dev) | ||
150 | continue; | ||
151 | |||
152 | printk(KERN_INFO "%s: removing %s on channel #%d\n", | ||
153 | DRV_NAME, dev->name, i); | ||
154 | unregister_sja1000dev(dev); | ||
155 | free_sja1000dev(dev); | ||
156 | } | ||
157 | |||
158 | writeb(EMS_CMD_UMAP, card->base_addr); | ||
159 | iounmap(card->base_addr); | ||
160 | kfree(card); | ||
161 | |||
162 | pdev->priv = NULL; | ||
163 | } | ||
164 | |||
165 | /* | ||
166 | * Probe PCI device for EMS CAN signature and register each available | ||
167 | * CAN channel to SJA1000 Socket-CAN subsystem. | ||
168 | */ | ||
169 | static int ems_pcmcia_add_card(struct pcmcia_device *pdev, unsigned long base) | ||
170 | { | ||
171 | struct sja1000_priv *priv; | ||
172 | struct net_device *dev; | ||
173 | struct ems_pcmcia_card *card; | ||
174 | int err, i; | ||
175 | |||
176 | /* Allocating card structures to hold addresses, ... */ | ||
177 | card = kzalloc(sizeof(struct ems_pcmcia_card), GFP_KERNEL); | ||
178 | if (!card) | ||
179 | return -ENOMEM; | ||
180 | |||
181 | pdev->priv = card; | ||
182 | card->channels = 0; | ||
183 | |||
184 | card->base_addr = ioremap(base, EMS_PCMCIA_MEM_SIZE); | ||
185 | if (!card->base_addr) { | ||
186 | err = -ENOMEM; | ||
187 | goto failure_cleanup; | ||
188 | } | ||
189 | |||
190 | /* Check for unique EMS CAN signature */ | ||
191 | if (readw(card->base_addr) != 0xAA55) { | ||
192 | err = -ENODEV; | ||
193 | goto failure_cleanup; | ||
194 | } | ||
195 | |||
196 | /* Request board reset */ | ||
197 | writeb(EMS_CMD_RESET, card->base_addr); | ||
198 | |||
199 | /* Make sure CAN controllers are mapped into card's memory space */ | ||
200 | writeb(EMS_CMD_MAP, card->base_addr); | ||
201 | |||
202 | /* Detect available channels */ | ||
203 | for (i = 0; i < EMS_PCMCIA_MAX_CHAN; i++) { | ||
204 | dev = alloc_sja1000dev(0); | ||
205 | if (!dev) { | ||
206 | err = -ENOMEM; | ||
207 | goto failure_cleanup; | ||
208 | } | ||
209 | |||
210 | card->net_dev[i] = dev; | ||
211 | priv = netdev_priv(dev); | ||
212 | priv->priv = card; | ||
213 | SET_NETDEV_DEV(dev, &pdev->dev); | ||
214 | |||
215 | priv->irq_flags = IRQF_SHARED; | ||
216 | dev->irq = pdev->irq; | ||
217 | priv->reg_base = card->base_addr + EMS_PCMCIA_CAN_BASE_OFFSET + | ||
218 | (i * EMS_PCMCIA_CAN_CTRL_SIZE); | ||
219 | |||
220 | /* Check if channel is present */ | ||
221 | if (ems_pcmcia_check_chan(priv)) { | ||
222 | priv->read_reg = ems_pcmcia_read_reg; | ||
223 | priv->write_reg = ems_pcmcia_write_reg; | ||
224 | priv->can.clock.freq = EMS_PCMCIA_CAN_CLOCK; | ||
225 | priv->ocr = EMS_PCMCIA_OCR; | ||
226 | priv->cdr = EMS_PCMCIA_CDR; | ||
227 | priv->flags |= SJA1000_CUSTOM_IRQ_HANDLER; | ||
228 | |||
229 | /* Register SJA1000 device */ | ||
230 | err = register_sja1000dev(dev); | ||
231 | if (err) { | ||
232 | free_sja1000dev(dev); | ||
233 | goto failure_cleanup; | ||
234 | } | ||
235 | |||
236 | card->channels++; | ||
237 | |||
238 | printk(KERN_INFO "%s: registered %s on channel " | ||
239 | "#%d at 0x%p, irq %d\n", DRV_NAME, dev->name, | ||
240 | i, priv->reg_base, dev->irq); | ||
241 | } else | ||
242 | free_sja1000dev(dev); | ||
243 | } | ||
244 | |||
245 | err = request_irq(dev->irq, &ems_pcmcia_interrupt, IRQF_SHARED, | ||
246 | DRV_NAME, card); | ||
247 | if (!err) | ||
248 | return 0; | ||
249 | |||
250 | failure_cleanup: | ||
251 | ems_pcmcia_del_card(pdev); | ||
252 | return err; | ||
253 | } | ||
254 | |||
255 | /* | ||
256 | * Setup PCMCIA socket and probe for EMS CPC-CARD | ||
257 | */ | ||
258 | static int ems_pcmcia_probe(struct pcmcia_device *dev) | ||
259 | { | ||
260 | int csval; | ||
261 | |||
262 | /* General socket configuration */ | ||
263 | dev->config_flags |= CONF_ENABLE_IRQ; | ||
264 | dev->config_index = 1; | ||
265 | dev->config_regs = PRESENT_OPTION; | ||
266 | |||
267 | /* The io structure describes IO port mapping */ | ||
268 | dev->resource[0]->end = 16; | ||
269 | dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; | ||
270 | dev->resource[1]->end = 16; | ||
271 | dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_16; | ||
272 | dev->io_lines = 5; | ||
273 | |||
274 | /* Allocate a memory window */ | ||
275 | dev->resource[2]->flags = | ||
276 | (WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_CM | WIN_ENABLE); | ||
277 | dev->resource[2]->start = dev->resource[2]->end = 0; | ||
278 | |||
279 | csval = pcmcia_request_window(dev, dev->resource[2], 0); | ||
280 | if (csval) { | ||
281 | dev_err(&dev->dev, "pcmcia_request_window failed (err=%d)\n", | ||
282 | csval); | ||
283 | return 0; | ||
284 | } | ||
285 | |||
286 | csval = pcmcia_map_mem_page(dev, dev->resource[2], dev->config_base); | ||
287 | if (csval) { | ||
288 | dev_err(&dev->dev, "pcmcia_map_mem_page failed (err=%d)\n", | ||
289 | csval); | ||
290 | return 0; | ||
291 | } | ||
292 | |||
293 | csval = pcmcia_enable_device(dev); | ||
294 | if (csval) { | ||
295 | dev_err(&dev->dev, "pcmcia_enable_device failed (err=%d)\n", | ||
296 | csval); | ||
297 | return 0; | ||
298 | } | ||
299 | |||
300 | ems_pcmcia_add_card(dev, dev->resource[2]->start); | ||
301 | return 0; | ||
302 | } | ||
303 | |||
304 | /* | ||
305 | * Release claimed resources | ||
306 | */ | ||
307 | static void ems_pcmcia_remove(struct pcmcia_device *dev) | ||
308 | { | ||
309 | ems_pcmcia_del_card(dev); | ||
310 | pcmcia_disable_device(dev); | ||
311 | } | ||
312 | |||
313 | static struct pcmcia_driver ems_pcmcia_driver = { | ||
314 | .name = DRV_NAME, | ||
315 | .probe = ems_pcmcia_probe, | ||
316 | .remove = ems_pcmcia_remove, | ||
317 | .id_table = ems_pcmcia_tbl, | ||
318 | }; | ||
319 | |||
320 | static int __init ems_pcmcia_init(void) | ||
321 | { | ||
322 | return pcmcia_register_driver(&ems_pcmcia_driver); | ||
323 | } | ||
324 | module_init(ems_pcmcia_init); | ||
325 | |||
326 | static void __exit ems_pcmcia_exit(void) | ||
327 | { | ||
328 | pcmcia_unregister_driver(&ems_pcmcia_driver); | ||
329 | } | ||
330 | module_exit(ems_pcmcia_exit); | ||
diff --git a/drivers/net/can/sja1000/kvaser_pci.c b/drivers/net/can/sja1000/kvaser_pci.c index 37b0381f532..ed004cebd31 100644 --- a/drivers/net/can/sja1000/kvaser_pci.c +++ b/drivers/net/can/sja1000/kvaser_pci.c | |||
@@ -290,8 +290,8 @@ failure: | |||
290 | return err; | 290 | return err; |
291 | } | 291 | } |
292 | 292 | ||
293 | static int kvaser_pci_init_one(struct pci_dev *pdev, | 293 | static int __devinit kvaser_pci_init_one(struct pci_dev *pdev, |
294 | const struct pci_device_id *ent) | 294 | const struct pci_device_id *ent) |
295 | { | 295 | { |
296 | int err; | 296 | int err; |
297 | struct net_device *master_dev = NULL; | 297 | struct net_device *master_dev = NULL; |
@@ -379,7 +379,7 @@ failure: | |||
379 | 379 | ||
380 | } | 380 | } |
381 | 381 | ||
382 | static void kvaser_pci_remove_one(struct pci_dev *pdev) | 382 | static void __devexit kvaser_pci_remove_one(struct pci_dev *pdev) |
383 | { | 383 | { |
384 | struct net_device *dev = pci_get_drvdata(pdev); | 384 | struct net_device *dev = pci_get_drvdata(pdev); |
385 | 385 | ||
@@ -394,7 +394,18 @@ static struct pci_driver kvaser_pci_driver = { | |||
394 | .name = DRV_NAME, | 394 | .name = DRV_NAME, |
395 | .id_table = kvaser_pci_tbl, | 395 | .id_table = kvaser_pci_tbl, |
396 | .probe = kvaser_pci_init_one, | 396 | .probe = kvaser_pci_init_one, |
397 | .remove = kvaser_pci_remove_one, | 397 | .remove = __devexit_p(kvaser_pci_remove_one), |
398 | }; | 398 | }; |
399 | 399 | ||
400 | module_pci_driver(kvaser_pci_driver); | 400 | static int __init kvaser_pci_init(void) |
401 | { | ||
402 | return pci_register_driver(&kvaser_pci_driver); | ||
403 | } | ||
404 | |||
405 | static void __exit kvaser_pci_exit(void) | ||
406 | { | ||
407 | pci_unregister_driver(&kvaser_pci_driver); | ||
408 | } | ||
409 | |||
410 | module_init(kvaser_pci_init); | ||
411 | module_exit(kvaser_pci_exit); | ||
diff --git a/drivers/net/can/sja1000/peak_pci.c b/drivers/net/can/sja1000/peak_pci.c deleted file mode 100644 index d84888f03d9..00000000000 --- a/drivers/net/can/sja1000/peak_pci.c +++ /dev/null | |||
@@ -1,762 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007, 2011 Wolfgang Grandegger <wg@grandegger.com> | ||
3 | * Copyright (C) 2012 Stephane Grosjean <s.grosjean@peak-system.com> | ||
4 | * | ||
5 | * Derived from the PCAN project file driver/src/pcan_pci.c: | ||
6 | * | ||
7 | * Copyright (C) 2001-2006 PEAK System-Technik GmbH | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the version 2 of the GNU General Public License | ||
11 | * as published by the Free Software Foundation | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | */ | ||
18 | |||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/interrupt.h> | ||
22 | #include <linux/netdevice.h> | ||
23 | #include <linux/delay.h> | ||
24 | #include <linux/pci.h> | ||
25 | #include <linux/io.h> | ||
26 | #include <linux/i2c.h> | ||
27 | #include <linux/i2c-algo-bit.h> | ||
28 | #include <linux/can.h> | ||
29 | #include <linux/can/dev.h> | ||
30 | |||
31 | #include "sja1000.h" | ||
32 | |||
33 | MODULE_AUTHOR("Stephane Grosjean <s.grosjean@peak-system.com>"); | ||
34 | MODULE_DESCRIPTION("Socket-CAN driver for PEAK PCAN PCI family cards"); | ||
35 | MODULE_SUPPORTED_DEVICE("PEAK PCAN PCI/PCIe/PCIeC miniPCI CAN cards"); | ||
36 | MODULE_SUPPORTED_DEVICE("PEAK PCAN miniPCIe/cPCI PC/104+ PCI/104e CAN Cards"); | ||
37 | MODULE_LICENSE("GPL v2"); | ||
38 | |||
39 | #define DRV_NAME "peak_pci" | ||
40 | |||
41 | struct peak_pciec_card; | ||
42 | struct peak_pci_chan { | ||
43 | void __iomem *cfg_base; /* Common for all channels */ | ||
44 | struct net_device *prev_dev; /* Chain of network devices */ | ||
45 | u16 icr_mask; /* Interrupt mask for fast ack */ | ||
46 | struct peak_pciec_card *pciec_card; /* only for PCIeC LEDs */ | ||
47 | }; | ||
48 | |||
49 | #define PEAK_PCI_CAN_CLOCK (16000000 / 2) | ||
50 | |||
51 | #define PEAK_PCI_CDR (CDR_CBP | CDR_CLKOUT_MASK) | ||
52 | #define PEAK_PCI_OCR OCR_TX0_PUSHPULL | ||
53 | |||
54 | /* | ||
55 | * Important PITA registers | ||
56 | */ | ||
57 | #define PITA_ICR 0x00 /* Interrupt control register */ | ||
58 | #define PITA_GPIOICR 0x18 /* GPIO interface control register */ | ||
59 | #define PITA_MISC 0x1C /* Miscellaneous register */ | ||
60 | |||
61 | #define PEAK_PCI_CFG_SIZE 0x1000 /* Size of the config PCI bar */ | ||
62 | #define PEAK_PCI_CHAN_SIZE 0x0400 /* Size used by the channel */ | ||
63 | |||
64 | #define PEAK_PCI_VENDOR_ID 0x001C /* The PCI device and vendor IDs */ | ||
65 | #define PEAK_PCI_DEVICE_ID 0x0001 /* for PCI/PCIe slot cards */ | ||
66 | #define PEAK_PCIEC_DEVICE_ID 0x0002 /* for ExpressCard slot cards */ | ||
67 | #define PEAK_PCIE_DEVICE_ID 0x0003 /* for nextgen PCIe slot cards */ | ||
68 | #define PEAK_CPCI_DEVICE_ID 0x0004 /* for nextgen cPCI slot cards */ | ||
69 | #define PEAK_MPCI_DEVICE_ID 0x0005 /* for nextgen miniPCI slot cards */ | ||
70 | #define PEAK_PC_104P_DEVICE_ID 0x0006 /* PCAN-PC/104+ cards */ | ||
71 | #define PEAK_PCI_104E_DEVICE_ID 0x0007 /* PCAN-PCI/104 Express cards */ | ||
72 | #define PEAK_MPCIE_DEVICE_ID 0x0008 /* The miniPCIe slot cards */ | ||
73 | |||
74 | #define PEAK_PCI_CHAN_MAX 4 | ||
75 | |||
76 | static const u16 peak_pci_icr_masks[PEAK_PCI_CHAN_MAX] = { | ||
77 | 0x02, 0x01, 0x40, 0x80 | ||
78 | }; | ||
79 | |||
80 | static DEFINE_PCI_DEVICE_TABLE(peak_pci_tbl) = { | ||
81 | {PEAK_PCI_VENDOR_ID, PEAK_PCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
82 | {PEAK_PCI_VENDOR_ID, PEAK_PCIE_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
83 | {PEAK_PCI_VENDOR_ID, PEAK_MPCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
84 | {PEAK_PCI_VENDOR_ID, PEAK_MPCIE_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
85 | {PEAK_PCI_VENDOR_ID, PEAK_PC_104P_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
86 | {PEAK_PCI_VENDOR_ID, PEAK_PCI_104E_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
87 | {PEAK_PCI_VENDOR_ID, PEAK_CPCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
88 | #ifdef CONFIG_CAN_PEAK_PCIEC | ||
89 | {PEAK_PCI_VENDOR_ID, PEAK_PCIEC_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
90 | #endif | ||
91 | {0,} | ||
92 | }; | ||
93 | |||
94 | MODULE_DEVICE_TABLE(pci, peak_pci_tbl); | ||
95 | |||
96 | #ifdef CONFIG_CAN_PEAK_PCIEC | ||
97 | /* | ||
98 | * PCAN-ExpressCard needs I2C bit-banging configuration option. | ||
99 | */ | ||
100 | |||
101 | /* GPIOICR byte access offsets */ | ||
102 | #define PITA_GPOUT 0x18 /* GPx output value */ | ||
103 | #define PITA_GPIN 0x19 /* GPx input value */ | ||
104 | #define PITA_GPOEN 0x1A /* configure GPx as ouput pin */ | ||
105 | |||
106 | /* I2C GP bits */ | ||
107 | #define PITA_GPIN_SCL 0x01 /* Serial Clock Line */ | ||
108 | #define PITA_GPIN_SDA 0x04 /* Serial DAta line */ | ||
109 | |||
110 | #define PCA9553_1_SLAVEADDR (0xC4 >> 1) | ||
111 | |||
112 | /* PCA9553 LS0 fields values */ | ||
113 | enum { | ||
114 | PCA9553_LOW, | ||
115 | PCA9553_HIGHZ, | ||
116 | PCA9553_PWM0, | ||
117 | PCA9553_PWM1 | ||
118 | }; | ||
119 | |||
120 | /* LEDs control */ | ||
121 | #define PCA9553_ON PCA9553_LOW | ||
122 | #define PCA9553_OFF PCA9553_HIGHZ | ||
123 | #define PCA9553_SLOW PCA9553_PWM0 | ||
124 | #define PCA9553_FAST PCA9553_PWM1 | ||
125 | |||
126 | #define PCA9553_LED(c) (1 << (c)) | ||
127 | #define PCA9553_LED_STATE(s, c) ((s) << ((c) << 1)) | ||
128 | |||
129 | #define PCA9553_LED_ON(c) PCA9553_LED_STATE(PCA9553_ON, c) | ||
130 | #define PCA9553_LED_OFF(c) PCA9553_LED_STATE(PCA9553_OFF, c) | ||
131 | #define PCA9553_LED_SLOW(c) PCA9553_LED_STATE(PCA9553_SLOW, c) | ||
132 | #define PCA9553_LED_FAST(c) PCA9553_LED_STATE(PCA9553_FAST, c) | ||
133 | #define PCA9553_LED_MASK(c) PCA9553_LED_STATE(0x03, c) | ||
134 | |||
135 | #define PCA9553_LED_OFF_ALL (PCA9553_LED_OFF(0) | PCA9553_LED_OFF(1)) | ||
136 | |||
137 | #define PCA9553_LS0_INIT 0x40 /* initial value (!= from 0x00) */ | ||
138 | |||
139 | struct peak_pciec_chan { | ||
140 | struct net_device *netdev; | ||
141 | unsigned long prev_rx_bytes; | ||
142 | unsigned long prev_tx_bytes; | ||
143 | }; | ||
144 | |||
145 | struct peak_pciec_card { | ||
146 | void __iomem *cfg_base; /* Common for all channels */ | ||
147 | void __iomem *reg_base; /* first channel base address */ | ||
148 | u8 led_cache; /* leds state cache */ | ||
149 | |||
150 | /* PCIExpressCard i2c data */ | ||
151 | struct i2c_algo_bit_data i2c_bit; | ||
152 | struct i2c_adapter led_chip; | ||
153 | struct delayed_work led_work; /* led delayed work */ | ||
154 | int chan_count; | ||
155 | struct peak_pciec_chan channel[PEAK_PCI_CHAN_MAX]; | ||
156 | }; | ||
157 | |||
158 | /* "normal" pci register write callback is overloaded for leds control */ | ||
159 | static void peak_pci_write_reg(const struct sja1000_priv *priv, | ||
160 | int port, u8 val); | ||
161 | |||
162 | static inline void pita_set_scl_highz(struct peak_pciec_card *card) | ||
163 | { | ||
164 | u8 gp_outen = readb(card->cfg_base + PITA_GPOEN) & ~PITA_GPIN_SCL; | ||
165 | writeb(gp_outen, card->cfg_base + PITA_GPOEN); | ||
166 | } | ||
167 | |||
168 | static inline void pita_set_sda_highz(struct peak_pciec_card *card) | ||
169 | { | ||
170 | u8 gp_outen = readb(card->cfg_base + PITA_GPOEN) & ~PITA_GPIN_SDA; | ||
171 | writeb(gp_outen, card->cfg_base + PITA_GPOEN); | ||
172 | } | ||
173 | |||
174 | static void peak_pciec_init_pita_gpio(struct peak_pciec_card *card) | ||
175 | { | ||
176 | /* raise SCL & SDA GPIOs to high-Z */ | ||
177 | pita_set_scl_highz(card); | ||
178 | pita_set_sda_highz(card); | ||
179 | } | ||
180 | |||
181 | static void pita_setsda(void *data, int state) | ||
182 | { | ||
183 | struct peak_pciec_card *card = (struct peak_pciec_card *)data; | ||
184 | u8 gp_out, gp_outen; | ||
185 | |||
186 | /* set output sda always to 0 */ | ||
187 | gp_out = readb(card->cfg_base + PITA_GPOUT) & ~PITA_GPIN_SDA; | ||
188 | writeb(gp_out, card->cfg_base + PITA_GPOUT); | ||
189 | |||
190 | /* control output sda with GPOEN */ | ||
191 | gp_outen = readb(card->cfg_base + PITA_GPOEN); | ||
192 | if (state) | ||
193 | gp_outen &= ~PITA_GPIN_SDA; | ||
194 | else | ||
195 | gp_outen |= PITA_GPIN_SDA; | ||
196 | |||
197 | writeb(gp_outen, card->cfg_base + PITA_GPOEN); | ||
198 | } | ||
199 | |||
200 | static void pita_setscl(void *data, int state) | ||
201 | { | ||
202 | struct peak_pciec_card *card = (struct peak_pciec_card *)data; | ||
203 | u8 gp_out, gp_outen; | ||
204 | |||
205 | /* set output scl always to 0 */ | ||
206 | gp_out = readb(card->cfg_base + PITA_GPOUT) & ~PITA_GPIN_SCL; | ||
207 | writeb(gp_out, card->cfg_base + PITA_GPOUT); | ||
208 | |||
209 | /* control output scl with GPOEN */ | ||
210 | gp_outen = readb(card->cfg_base + PITA_GPOEN); | ||
211 | if (state) | ||
212 | gp_outen &= ~PITA_GPIN_SCL; | ||
213 | else | ||
214 | gp_outen |= PITA_GPIN_SCL; | ||
215 | |||
216 | writeb(gp_outen, card->cfg_base + PITA_GPOEN); | ||
217 | } | ||
218 | |||
219 | static int pita_getsda(void *data) | ||
220 | { | ||
221 | struct peak_pciec_card *card = (struct peak_pciec_card *)data; | ||
222 | |||
223 | /* set tristate */ | ||
224 | pita_set_sda_highz(card); | ||
225 | |||
226 | return (readb(card->cfg_base + PITA_GPIN) & PITA_GPIN_SDA) ? 1 : 0; | ||
227 | } | ||
228 | |||
229 | static int pita_getscl(void *data) | ||
230 | { | ||
231 | struct peak_pciec_card *card = (struct peak_pciec_card *)data; | ||
232 | |||
233 | /* set tristate */ | ||
234 | pita_set_scl_highz(card); | ||
235 | |||
236 | return (readb(card->cfg_base + PITA_GPIN) & PITA_GPIN_SCL) ? 1 : 0; | ||
237 | } | ||
238 | |||
239 | /* | ||
240 | * write commands to the LED chip though the I2C-bus of the PCAN-PCIeC | ||
241 | */ | ||
242 | static int peak_pciec_write_pca9553(struct peak_pciec_card *card, | ||
243 | u8 offset, u8 data) | ||
244 | { | ||
245 | u8 buffer[2] = { | ||
246 | offset, | ||
247 | data | ||
248 | }; | ||
249 | struct i2c_msg msg = { | ||
250 | .addr = PCA9553_1_SLAVEADDR, | ||
251 | .len = 2, | ||
252 | .buf = buffer, | ||
253 | }; | ||
254 | int ret; | ||
255 | |||
256 | /* cache led mask */ | ||
257 | if ((offset == 5) && (data == card->led_cache)) | ||
258 | return 0; | ||
259 | |||
260 | ret = i2c_transfer(&card->led_chip, &msg, 1); | ||
261 | if (ret < 0) | ||
262 | return ret; | ||
263 | |||
264 | if (offset == 5) | ||
265 | card->led_cache = data; | ||
266 | |||
267 | return 0; | ||
268 | } | ||
269 | |||
270 | /* | ||
271 | * delayed work callback used to control the LEDs | ||
272 | */ | ||
273 | static void peak_pciec_led_work(struct work_struct *work) | ||
274 | { | ||
275 | struct peak_pciec_card *card = | ||
276 | container_of(work, struct peak_pciec_card, led_work.work); | ||
277 | struct net_device *netdev; | ||
278 | u8 new_led = card->led_cache; | ||
279 | int i, up_count = 0; | ||
280 | |||
281 | /* first check what is to do */ | ||
282 | for (i = 0; i < card->chan_count; i++) { | ||
283 | /* default is: not configured */ | ||
284 | new_led &= ~PCA9553_LED_MASK(i); | ||
285 | new_led |= PCA9553_LED_ON(i); | ||
286 | |||
287 | netdev = card->channel[i].netdev; | ||
288 | if (!netdev || !(netdev->flags & IFF_UP)) | ||
289 | continue; | ||
290 | |||
291 | up_count++; | ||
292 | |||
293 | /* no activity (but configured) */ | ||
294 | new_led &= ~PCA9553_LED_MASK(i); | ||
295 | new_led |= PCA9553_LED_SLOW(i); | ||
296 | |||
297 | /* if bytes counters changed, set fast blinking led */ | ||
298 | if (netdev->stats.rx_bytes != card->channel[i].prev_rx_bytes) { | ||
299 | card->channel[i].prev_rx_bytes = netdev->stats.rx_bytes; | ||
300 | new_led &= ~PCA9553_LED_MASK(i); | ||
301 | new_led |= PCA9553_LED_FAST(i); | ||
302 | } | ||
303 | if (netdev->stats.tx_bytes != card->channel[i].prev_tx_bytes) { | ||
304 | card->channel[i].prev_tx_bytes = netdev->stats.tx_bytes; | ||
305 | new_led &= ~PCA9553_LED_MASK(i); | ||
306 | new_led |= PCA9553_LED_FAST(i); | ||
307 | } | ||
308 | } | ||
309 | |||
310 | /* check if LS0 settings changed, only update i2c if so */ | ||
311 | peak_pciec_write_pca9553(card, 5, new_led); | ||
312 | |||
313 | /* restart timer (except if no more configured channels) */ | ||
314 | if (up_count) | ||
315 | schedule_delayed_work(&card->led_work, HZ); | ||
316 | } | ||
317 | |||
318 | /* | ||
319 | * set LEDs blinking state | ||
320 | */ | ||
321 | static void peak_pciec_set_leds(struct peak_pciec_card *card, u8 led_mask, u8 s) | ||
322 | { | ||
323 | u8 new_led = card->led_cache; | ||
324 | int i; | ||
325 | |||
326 | /* first check what is to do */ | ||
327 | for (i = 0; i < card->chan_count; i++) | ||
328 | if (led_mask & PCA9553_LED(i)) { | ||
329 | new_led &= ~PCA9553_LED_MASK(i); | ||
330 | new_led |= PCA9553_LED_STATE(s, i); | ||
331 | } | ||
332 | |||
333 | /* check if LS0 settings changed, only update i2c if so */ | ||
334 | peak_pciec_write_pca9553(card, 5, new_led); | ||
335 | } | ||
336 | |||
337 | /* | ||
338 | * start one second delayed work to control LEDs | ||
339 | */ | ||
340 | static void peak_pciec_start_led_work(struct peak_pciec_card *card) | ||
341 | { | ||
342 | if (!delayed_work_pending(&card->led_work)) | ||
343 | schedule_delayed_work(&card->led_work, HZ); | ||
344 | } | ||
345 | |||
346 | /* | ||
347 | * stop LEDs delayed work | ||
348 | */ | ||
349 | static void peak_pciec_stop_led_work(struct peak_pciec_card *card) | ||
350 | { | ||
351 | cancel_delayed_work_sync(&card->led_work); | ||
352 | } | ||
353 | |||
354 | /* | ||
355 | * initialize the PCA9553 4-bit I2C-bus LED chip | ||
356 | */ | ||
357 | static int peak_pciec_init_leds(struct peak_pciec_card *card) | ||
358 | { | ||
359 | int err; | ||
360 | |||
361 | /* prescaler for frequency 0: "SLOW" = 1 Hz = "44" */ | ||
362 | err = peak_pciec_write_pca9553(card, 1, 44 / 1); | ||
363 | if (err) | ||
364 | return err; | ||
365 | |||
366 | /* duty cycle 0: 50% */ | ||
367 | err = peak_pciec_write_pca9553(card, 2, 0x80); | ||
368 | if (err) | ||
369 | return err; | ||
370 | |||
371 | /* prescaler for frequency 1: "FAST" = 5 Hz */ | ||
372 | err = peak_pciec_write_pca9553(card, 3, 44 / 5); | ||
373 | if (err) | ||
374 | return err; | ||
375 | |||
376 | /* duty cycle 1: 50% */ | ||
377 | err = peak_pciec_write_pca9553(card, 4, 0x80); | ||
378 | if (err) | ||
379 | return err; | ||
380 | |||
381 | /* switch LEDs to initial state */ | ||
382 | return peak_pciec_write_pca9553(card, 5, PCA9553_LS0_INIT); | ||
383 | } | ||
384 | |||
385 | /* | ||
386 | * restore LEDs state to off peak_pciec_leds_exit | ||
387 | */ | ||
388 | static void peak_pciec_leds_exit(struct peak_pciec_card *card) | ||
389 | { | ||
390 | /* switch LEDs to off */ | ||
391 | peak_pciec_write_pca9553(card, 5, PCA9553_LED_OFF_ALL); | ||
392 | } | ||
393 | |||
394 | /* | ||
395 | * normal write sja1000 register method overloaded to catch when controller | ||
396 | * is started or stopped, to control leds | ||
397 | */ | ||
398 | static void peak_pciec_write_reg(const struct sja1000_priv *priv, | ||
399 | int port, u8 val) | ||
400 | { | ||
401 | struct peak_pci_chan *chan = priv->priv; | ||
402 | struct peak_pciec_card *card = chan->pciec_card; | ||
403 | int c = (priv->reg_base - card->reg_base) / PEAK_PCI_CHAN_SIZE; | ||
404 | |||
405 | /* sja1000 register changes control the leds state */ | ||
406 | if (port == REG_MOD) | ||
407 | switch (val) { | ||
408 | case MOD_RM: | ||
409 | /* Reset Mode: set led on */ | ||
410 | peak_pciec_set_leds(card, PCA9553_LED(c), PCA9553_ON); | ||
411 | break; | ||
412 | case 0x00: | ||
413 | /* Normal Mode: led slow blinking and start led timer */ | ||
414 | peak_pciec_set_leds(card, PCA9553_LED(c), PCA9553_SLOW); | ||
415 | peak_pciec_start_led_work(card); | ||
416 | break; | ||
417 | default: | ||
418 | break; | ||
419 | } | ||
420 | |||
421 | /* call base function */ | ||
422 | peak_pci_write_reg(priv, port, val); | ||
423 | } | ||
424 | |||
425 | static struct i2c_algo_bit_data peak_pciec_i2c_bit_ops = { | ||
426 | .setsda = pita_setsda, | ||
427 | .setscl = pita_setscl, | ||
428 | .getsda = pita_getsda, | ||
429 | .getscl = pita_getscl, | ||
430 | .udelay = 10, | ||
431 | .timeout = HZ, | ||
432 | }; | ||
433 | |||
434 | static int peak_pciec_probe(struct pci_dev *pdev, struct net_device *dev) | ||
435 | { | ||
436 | struct sja1000_priv *priv = netdev_priv(dev); | ||
437 | struct peak_pci_chan *chan = priv->priv; | ||
438 | struct peak_pciec_card *card; | ||
439 | int err; | ||
440 | |||
441 | /* copy i2c object address from 1st channel */ | ||
442 | if (chan->prev_dev) { | ||
443 | struct sja1000_priv *prev_priv = netdev_priv(chan->prev_dev); | ||
444 | struct peak_pci_chan *prev_chan = prev_priv->priv; | ||
445 | |||
446 | card = prev_chan->pciec_card; | ||
447 | if (!card) | ||
448 | return -ENODEV; | ||
449 | |||
450 | /* channel is the first one: do the init part */ | ||
451 | } else { | ||
452 | /* create the bit banging I2C adapter structure */ | ||
453 | card = kzalloc(sizeof(struct peak_pciec_card), GFP_KERNEL); | ||
454 | if (!card) { | ||
455 | dev_err(&pdev->dev, | ||
456 | "failed allocating memory for i2c chip\n"); | ||
457 | return -ENOMEM; | ||
458 | } | ||
459 | |||
460 | card->cfg_base = chan->cfg_base; | ||
461 | card->reg_base = priv->reg_base; | ||
462 | |||
463 | card->led_chip.owner = THIS_MODULE; | ||
464 | card->led_chip.dev.parent = &pdev->dev; | ||
465 | card->led_chip.algo_data = &card->i2c_bit; | ||
466 | strncpy(card->led_chip.name, "peak_i2c", | ||
467 | sizeof(card->led_chip.name)); | ||
468 | |||
469 | card->i2c_bit = peak_pciec_i2c_bit_ops; | ||
470 | card->i2c_bit.udelay = 10; | ||
471 | card->i2c_bit.timeout = HZ; | ||
472 | card->i2c_bit.data = card; | ||
473 | |||
474 | peak_pciec_init_pita_gpio(card); | ||
475 | |||
476 | err = i2c_bit_add_bus(&card->led_chip); | ||
477 | if (err) { | ||
478 | dev_err(&pdev->dev, "i2c init failed\n"); | ||
479 | goto pciec_init_err_1; | ||
480 | } | ||
481 | |||
482 | err = peak_pciec_init_leds(card); | ||
483 | if (err) { | ||
484 | dev_err(&pdev->dev, "leds hardware init failed\n"); | ||
485 | goto pciec_init_err_2; | ||
486 | } | ||
487 | |||
488 | INIT_DELAYED_WORK(&card->led_work, peak_pciec_led_work); | ||
489 | /* PCAN-ExpressCard needs its own callback for leds */ | ||
490 | priv->write_reg = peak_pciec_write_reg; | ||
491 | } | ||
492 | |||
493 | chan->pciec_card = card; | ||
494 | card->channel[card->chan_count++].netdev = dev; | ||
495 | |||
496 | return 0; | ||
497 | |||
498 | pciec_init_err_2: | ||
499 | i2c_del_adapter(&card->led_chip); | ||
500 | |||
501 | pciec_init_err_1: | ||
502 | peak_pciec_init_pita_gpio(card); | ||
503 | kfree(card); | ||
504 | |||
505 | return err; | ||
506 | } | ||
507 | |||
508 | static void peak_pciec_remove(struct peak_pciec_card *card) | ||
509 | { | ||
510 | peak_pciec_stop_led_work(card); | ||
511 | peak_pciec_leds_exit(card); | ||
512 | i2c_del_adapter(&card->led_chip); | ||
513 | peak_pciec_init_pita_gpio(card); | ||
514 | kfree(card); | ||
515 | } | ||
516 | |||
517 | #else /* CONFIG_CAN_PEAK_PCIEC */ | ||
518 | |||
519 | /* | ||
520 | * Placebo functions when PCAN-ExpressCard support is not selected | ||
521 | */ | ||
522 | static inline int peak_pciec_probe(struct pci_dev *pdev, struct net_device *dev) | ||
523 | { | ||
524 | return -ENODEV; | ||
525 | } | ||
526 | |||
527 | static inline void peak_pciec_remove(struct peak_pciec_card *card) | ||
528 | { | ||
529 | } | ||
530 | #endif /* CONFIG_CAN_PEAK_PCIEC */ | ||
531 | |||
532 | static u8 peak_pci_read_reg(const struct sja1000_priv *priv, int port) | ||
533 | { | ||
534 | return readb(priv->reg_base + (port << 2)); | ||
535 | } | ||
536 | |||
537 | static void peak_pci_write_reg(const struct sja1000_priv *priv, | ||
538 | int port, u8 val) | ||
539 | { | ||
540 | writeb(val, priv->reg_base + (port << 2)); | ||
541 | } | ||
542 | |||
543 | static void peak_pci_post_irq(const struct sja1000_priv *priv) | ||
544 | { | ||
545 | struct peak_pci_chan *chan = priv->priv; | ||
546 | u16 icr; | ||
547 | |||
548 | /* Select and clear in PITA stored interrupt */ | ||
549 | icr = readw(chan->cfg_base + PITA_ICR); | ||
550 | if (icr & chan->icr_mask) | ||
551 | writew(chan->icr_mask, chan->cfg_base + PITA_ICR); | ||
552 | } | ||
553 | |||
554 | static int peak_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
555 | { | ||
556 | struct sja1000_priv *priv; | ||
557 | struct peak_pci_chan *chan; | ||
558 | struct net_device *dev; | ||
559 | void __iomem *cfg_base, *reg_base; | ||
560 | u16 sub_sys_id, icr; | ||
561 | int i, err, channels; | ||
562 | |||
563 | err = pci_enable_device(pdev); | ||
564 | if (err) | ||
565 | return err; | ||
566 | |||
567 | err = pci_request_regions(pdev, DRV_NAME); | ||
568 | if (err) | ||
569 | goto failure_disable_pci; | ||
570 | |||
571 | err = pci_read_config_word(pdev, 0x2e, &sub_sys_id); | ||
572 | if (err) | ||
573 | goto failure_release_regions; | ||
574 | |||
575 | dev_dbg(&pdev->dev, "probing device %04x:%04x:%04x\n", | ||
576 | pdev->vendor, pdev->device, sub_sys_id); | ||
577 | |||
578 | err = pci_write_config_word(pdev, 0x44, 0); | ||
579 | if (err) | ||
580 | goto failure_release_regions; | ||
581 | |||
582 | if (sub_sys_id >= 12) | ||
583 | channels = 4; | ||
584 | else if (sub_sys_id >= 10) | ||
585 | channels = 3; | ||
586 | else if (sub_sys_id >= 4) | ||
587 | channels = 2; | ||
588 | else | ||
589 | channels = 1; | ||
590 | |||
591 | cfg_base = pci_iomap(pdev, 0, PEAK_PCI_CFG_SIZE); | ||
592 | if (!cfg_base) { | ||
593 | dev_err(&pdev->dev, "failed to map PCI resource #0\n"); | ||
594 | err = -ENOMEM; | ||
595 | goto failure_release_regions; | ||
596 | } | ||
597 | |||
598 | reg_base = pci_iomap(pdev, 1, PEAK_PCI_CHAN_SIZE * channels); | ||
599 | if (!reg_base) { | ||
600 | dev_err(&pdev->dev, "failed to map PCI resource #1\n"); | ||
601 | err = -ENOMEM; | ||
602 | goto failure_unmap_cfg_base; | ||
603 | } | ||
604 | |||
605 | /* Set GPIO control register */ | ||
606 | writew(0x0005, cfg_base + PITA_GPIOICR + 2); | ||
607 | /* Enable all channels of this card */ | ||
608 | writeb(0x00, cfg_base + PITA_GPIOICR); | ||
609 | /* Toggle reset */ | ||
610 | writeb(0x05, cfg_base + PITA_MISC + 3); | ||
611 | mdelay(5); | ||
612 | /* Leave parport mux mode */ | ||
613 | writeb(0x04, cfg_base + PITA_MISC + 3); | ||
614 | |||
615 | icr = readw(cfg_base + PITA_ICR + 2); | ||
616 | |||
617 | for (i = 0; i < channels; i++) { | ||
618 | dev = alloc_sja1000dev(sizeof(struct peak_pci_chan)); | ||
619 | if (!dev) { | ||
620 | err = -ENOMEM; | ||
621 | goto failure_remove_channels; | ||
622 | } | ||
623 | |||
624 | priv = netdev_priv(dev); | ||
625 | chan = priv->priv; | ||
626 | |||
627 | chan->cfg_base = cfg_base; | ||
628 | priv->reg_base = reg_base + i * PEAK_PCI_CHAN_SIZE; | ||
629 | |||
630 | priv->read_reg = peak_pci_read_reg; | ||
631 | priv->write_reg = peak_pci_write_reg; | ||
632 | priv->post_irq = peak_pci_post_irq; | ||
633 | |||
634 | priv->can.clock.freq = PEAK_PCI_CAN_CLOCK; | ||
635 | priv->ocr = PEAK_PCI_OCR; | ||
636 | priv->cdr = PEAK_PCI_CDR; | ||
637 | /* Neither a slave nor a single device distributes the clock */ | ||
638 | if (channels == 1 || i > 0) | ||
639 | priv->cdr |= CDR_CLK_OFF; | ||
640 | |||
641 | /* Setup interrupt handling */ | ||
642 | priv->irq_flags = IRQF_SHARED; | ||
643 | dev->irq = pdev->irq; | ||
644 | |||
645 | chan->icr_mask = peak_pci_icr_masks[i]; | ||
646 | icr |= chan->icr_mask; | ||
647 | |||
648 | SET_NETDEV_DEV(dev, &pdev->dev); | ||
649 | |||
650 | /* Create chain of SJA1000 devices */ | ||
651 | chan->prev_dev = pci_get_drvdata(pdev); | ||
652 | pci_set_drvdata(pdev, dev); | ||
653 | |||
654 | /* | ||
655 | * PCAN-ExpressCard needs some additional i2c init. | ||
656 | * This must be done *before* register_sja1000dev() but | ||
657 | * *after* devices linkage | ||
658 | */ | ||
659 | if (pdev->device == PEAK_PCIEC_DEVICE_ID) { | ||
660 | err = peak_pciec_probe(pdev, dev); | ||
661 | if (err) { | ||
662 | dev_err(&pdev->dev, | ||
663 | "failed to probe device (err %d)\n", | ||
664 | err); | ||
665 | goto failure_free_dev; | ||
666 | } | ||
667 | } | ||
668 | |||
669 | err = register_sja1000dev(dev); | ||
670 | if (err) { | ||
671 | dev_err(&pdev->dev, "failed to register device\n"); | ||
672 | goto failure_free_dev; | ||
673 | } | ||
674 | |||
675 | dev_info(&pdev->dev, | ||
676 | "%s at reg_base=0x%p cfg_base=0x%p irq=%d\n", | ||
677 | dev->name, priv->reg_base, chan->cfg_base, dev->irq); | ||
678 | } | ||
679 | |||
680 | /* Enable interrupts */ | ||
681 | writew(icr, cfg_base + PITA_ICR + 2); | ||
682 | |||
683 | return 0; | ||
684 | |||
685 | failure_free_dev: | ||
686 | pci_set_drvdata(pdev, chan->prev_dev); | ||
687 | free_sja1000dev(dev); | ||
688 | |||
689 | failure_remove_channels: | ||
690 | /* Disable interrupts */ | ||
691 | writew(0x0, cfg_base + PITA_ICR + 2); | ||
692 | |||
693 | chan = NULL; | ||
694 | for (dev = pci_get_drvdata(pdev); dev; dev = chan->prev_dev) { | ||
695 | unregister_sja1000dev(dev); | ||
696 | free_sja1000dev(dev); | ||
697 | priv = netdev_priv(dev); | ||
698 | chan = priv->priv; | ||
699 | } | ||
700 | |||
701 | /* free any PCIeC resources too */ | ||
702 | if (chan && chan->pciec_card) | ||
703 | peak_pciec_remove(chan->pciec_card); | ||
704 | |||
705 | pci_iounmap(pdev, reg_base); | ||
706 | |||
707 | failure_unmap_cfg_base: | ||
708 | pci_iounmap(pdev, cfg_base); | ||
709 | |||
710 | failure_release_regions: | ||
711 | pci_release_regions(pdev); | ||
712 | |||
713 | failure_disable_pci: | ||
714 | pci_disable_device(pdev); | ||
715 | |||
716 | return err; | ||
717 | } | ||
718 | |||
719 | static void peak_pci_remove(struct pci_dev *pdev) | ||
720 | { | ||
721 | struct net_device *dev = pci_get_drvdata(pdev); /* Last device */ | ||
722 | struct sja1000_priv *priv = netdev_priv(dev); | ||
723 | struct peak_pci_chan *chan = priv->priv; | ||
724 | void __iomem *cfg_base = chan->cfg_base; | ||
725 | void __iomem *reg_base = priv->reg_base; | ||
726 | |||
727 | /* Disable interrupts */ | ||
728 | writew(0x0, cfg_base + PITA_ICR + 2); | ||
729 | |||
730 | /* Loop over all registered devices */ | ||
731 | while (1) { | ||
732 | dev_info(&pdev->dev, "removing device %s\n", dev->name); | ||
733 | unregister_sja1000dev(dev); | ||
734 | free_sja1000dev(dev); | ||
735 | dev = chan->prev_dev; | ||
736 | |||
737 | if (!dev) { | ||
738 | /* do that only for first channel */ | ||
739 | if (chan->pciec_card) | ||
740 | peak_pciec_remove(chan->pciec_card); | ||
741 | break; | ||
742 | } | ||
743 | priv = netdev_priv(dev); | ||
744 | chan = priv->priv; | ||
745 | } | ||
746 | |||
747 | pci_iounmap(pdev, reg_base); | ||
748 | pci_iounmap(pdev, cfg_base); | ||
749 | pci_release_regions(pdev); | ||
750 | pci_disable_device(pdev); | ||
751 | |||
752 | pci_set_drvdata(pdev, NULL); | ||
753 | } | ||
754 | |||
755 | static struct pci_driver peak_pci_driver = { | ||
756 | .name = DRV_NAME, | ||
757 | .id_table = peak_pci_tbl, | ||
758 | .probe = peak_pci_probe, | ||
759 | .remove = peak_pci_remove, | ||
760 | }; | ||
761 | |||
762 | module_pci_driver(peak_pci_driver); | ||
diff --git a/drivers/net/can/sja1000/peak_pcmcia.c b/drivers/net/can/sja1000/peak_pcmcia.c deleted file mode 100644 index f1175142b0a..00000000000 --- a/drivers/net/can/sja1000/peak_pcmcia.c +++ /dev/null | |||
@@ -1,755 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2010-2012 Stephane Grosjean <s.grosjean@peak-system.com> | ||
3 | * | ||
4 | * CAN driver for PEAK-System PCAN-PC Card | ||
5 | * Derived from the PCAN project file driver/src/pcan_pccard.c | ||
6 | * Copyright (C) 2006-2010 PEAK System-Technik GmbH | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the version 2 of the GNU General Public License | ||
10 | * as published by the Free Software Foundation | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | */ | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/module.h> | ||
19 | #include <linux/interrupt.h> | ||
20 | #include <linux/netdevice.h> | ||
21 | #include <linux/delay.h> | ||
22 | #include <linux/timer.h> | ||
23 | #include <linux/io.h> | ||
24 | #include <pcmcia/cistpl.h> | ||
25 | #include <pcmcia/ds.h> | ||
26 | #include <linux/can.h> | ||
27 | #include <linux/can/dev.h> | ||
28 | #include "sja1000.h" | ||
29 | |||
30 | MODULE_AUTHOR("Stephane Grosjean <s.grosjean@peak-system.com>"); | ||
31 | MODULE_DESCRIPTION("CAN driver for PEAK-System PCAN-PC Cards"); | ||
32 | MODULE_LICENSE("GPL v2"); | ||
33 | MODULE_SUPPORTED_DEVICE("PEAK PCAN-PC Card"); | ||
34 | |||
35 | /* PEAK-System PCMCIA driver name */ | ||
36 | #define PCC_NAME "peak_pcmcia" | ||
37 | |||
38 | #define PCC_CHAN_MAX 2 | ||
39 | |||
40 | #define PCC_CAN_CLOCK (16000000 / 2) | ||
41 | |||
42 | #define PCC_MANF_ID 0x0377 | ||
43 | #define PCC_CARD_ID 0x0001 | ||
44 | |||
45 | #define PCC_CHAN_SIZE 0x20 | ||
46 | #define PCC_CHAN_OFF(c) ((c) * PCC_CHAN_SIZE) | ||
47 | #define PCC_COMN_OFF (PCC_CHAN_OFF(PCC_CHAN_MAX)) | ||
48 | #define PCC_COMN_SIZE 0x40 | ||
49 | |||
50 | /* common area registers */ | ||
51 | #define PCC_CCR 0x00 | ||
52 | #define PCC_CSR 0x02 | ||
53 | #define PCC_CPR 0x04 | ||
54 | #define PCC_SPI_DIR 0x06 | ||
55 | #define PCC_SPI_DOR 0x08 | ||
56 | #define PCC_SPI_ADR 0x0a | ||
57 | #define PCC_SPI_IR 0x0c | ||
58 | #define PCC_FW_MAJOR 0x10 | ||
59 | #define PCC_FW_MINOR 0x12 | ||
60 | |||
61 | /* CCR bits */ | ||
62 | #define PCC_CCR_CLK_16 0x00 | ||
63 | #define PCC_CCR_CLK_10 0x01 | ||
64 | #define PCC_CCR_CLK_21 0x02 | ||
65 | #define PCC_CCR_CLK_8 0x03 | ||
66 | #define PCC_CCR_CLK_MASK PCC_CCR_CLK_8 | ||
67 | |||
68 | #define PCC_CCR_RST_CHAN(c) (0x01 << ((c) + 2)) | ||
69 | #define PCC_CCR_RST_ALL (PCC_CCR_RST_CHAN(0) | PCC_CCR_RST_CHAN(1)) | ||
70 | #define PCC_CCR_RST_MASK PCC_CCR_RST_ALL | ||
71 | |||
72 | /* led selection bits */ | ||
73 | #define PCC_LED(c) (1 << (c)) | ||
74 | #define PCC_LED_ALL (PCC_LED(0) | PCC_LED(1)) | ||
75 | |||
76 | /* led state value */ | ||
77 | #define PCC_LED_ON 0x00 | ||
78 | #define PCC_LED_FAST 0x01 | ||
79 | #define PCC_LED_SLOW 0x02 | ||
80 | #define PCC_LED_OFF 0x03 | ||
81 | |||
82 | #define PCC_CCR_LED_CHAN(s, c) ((s) << (((c) + 2) << 1)) | ||
83 | |||
84 | #define PCC_CCR_LED_ON_CHAN(c) PCC_CCR_LED_CHAN(PCC_LED_ON, c) | ||
85 | #define PCC_CCR_LED_FAST_CHAN(c) PCC_CCR_LED_CHAN(PCC_LED_FAST, c) | ||
86 | #define PCC_CCR_LED_SLOW_CHAN(c) PCC_CCR_LED_CHAN(PCC_LED_SLOW, c) | ||
87 | #define PCC_CCR_LED_OFF_CHAN(c) PCC_CCR_LED_CHAN(PCC_LED_OFF, c) | ||
88 | #define PCC_CCR_LED_MASK_CHAN(c) PCC_CCR_LED_OFF_CHAN(c) | ||
89 | #define PCC_CCR_LED_OFF_ALL (PCC_CCR_LED_OFF_CHAN(0) | \ | ||
90 | PCC_CCR_LED_OFF_CHAN(1)) | ||
91 | #define PCC_CCR_LED_MASK PCC_CCR_LED_OFF_ALL | ||
92 | |||
93 | #define PCC_CCR_INIT (PCC_CCR_CLK_16 | PCC_CCR_RST_ALL | PCC_CCR_LED_OFF_ALL) | ||
94 | |||
95 | /* CSR bits */ | ||
96 | #define PCC_CSR_SPI_BUSY 0x04 | ||
97 | |||
98 | /* time waiting for SPI busy (prevent from infinite loop) */ | ||
99 | #define PCC_SPI_MAX_BUSY_WAIT_MS 3 | ||
100 | |||
101 | /* max count of reading the SPI status register waiting for a change */ | ||
102 | /* (prevent from infinite loop) */ | ||
103 | #define PCC_WRITE_MAX_LOOP 1000 | ||
104 | |||
105 | /* max nb of int handled by that isr in one shot (prevent from infinite loop) */ | ||
106 | #define PCC_ISR_MAX_LOOP 10 | ||
107 | |||
108 | /* EEPROM chip instruction set */ | ||
109 | /* note: EEPROM Read/Write instructions include A8 bit */ | ||
110 | #define PCC_EEP_WRITE(a) (0x02 | (((a) & 0x100) >> 5)) | ||
111 | #define PCC_EEP_READ(a) (0x03 | (((a) & 0x100) >> 5)) | ||
112 | #define PCC_EEP_WRDI 0x04 /* EEPROM Write Disable */ | ||
113 | #define PCC_EEP_RDSR 0x05 /* EEPROM Read Status Register */ | ||
114 | #define PCC_EEP_WREN 0x06 /* EEPROM Write Enable */ | ||
115 | |||
116 | /* EEPROM Status Register bits */ | ||
117 | #define PCC_EEP_SR_WEN 0x02 /* EEPROM SR Write Enable bit */ | ||
118 | #define PCC_EEP_SR_WIP 0x01 /* EEPROM SR Write In Progress bit */ | ||
119 | |||
120 | /* | ||
121 | * The board configuration is probably following: | ||
122 | * RX1 is connected to ground. | ||
123 | * TX1 is not connected. | ||
124 | * CLKO is not connected. | ||
125 | * Setting the OCR register to 0xDA is a good idea. | ||
126 | * This means normal output mode, push-pull and the correct polarity. | ||
127 | */ | ||
128 | #define PCC_OCR (OCR_TX0_PUSHPULL | OCR_TX1_PUSHPULL) | ||
129 | |||
130 | /* | ||
131 | * In the CDR register, you should set CBP to 1. | ||
132 | * You will probably also want to set the clock divider value to 7 | ||
133 | * (meaning direct oscillator output) because the second SJA1000 chip | ||
134 | * is driven by the first one CLKOUT output. | ||
135 | */ | ||
136 | #define PCC_CDR (CDR_CBP | CDR_CLKOUT_MASK) | ||
137 | |||
138 | struct pcan_channel { | ||
139 | struct net_device *netdev; | ||
140 | unsigned long prev_rx_bytes; | ||
141 | unsigned long prev_tx_bytes; | ||
142 | }; | ||
143 | |||
144 | /* PCAN-PC Card private structure */ | ||
145 | struct pcan_pccard { | ||
146 | struct pcmcia_device *pdev; | ||
147 | int chan_count; | ||
148 | struct pcan_channel channel[PCC_CHAN_MAX]; | ||
149 | u8 ccr; | ||
150 | u8 fw_major; | ||
151 | u8 fw_minor; | ||
152 | void __iomem *ioport_addr; | ||
153 | struct timer_list led_timer; | ||
154 | }; | ||
155 | |||
156 | static struct pcmcia_device_id pcan_table[] = { | ||
157 | PCMCIA_DEVICE_MANF_CARD(PCC_MANF_ID, PCC_CARD_ID), | ||
158 | PCMCIA_DEVICE_NULL, | ||
159 | }; | ||
160 | |||
161 | MODULE_DEVICE_TABLE(pcmcia, pcan_table); | ||
162 | |||
163 | static void pcan_set_leds(struct pcan_pccard *card, u8 mask, u8 state); | ||
164 | |||
165 | /* | ||
166 | * start timer which controls leds state | ||
167 | */ | ||
168 | static void pcan_start_led_timer(struct pcan_pccard *card) | ||
169 | { | ||
170 | if (!timer_pending(&card->led_timer)) | ||
171 | mod_timer(&card->led_timer, jiffies + HZ); | ||
172 | } | ||
173 | |||
174 | /* | ||
175 | * stop the timer which controls leds state | ||
176 | */ | ||
177 | static void pcan_stop_led_timer(struct pcan_pccard *card) | ||
178 | { | ||
179 | del_timer_sync(&card->led_timer); | ||
180 | } | ||
181 | |||
182 | /* | ||
183 | * read a sja1000 register | ||
184 | */ | ||
185 | static u8 pcan_read_canreg(const struct sja1000_priv *priv, int port) | ||
186 | { | ||
187 | return ioread8(priv->reg_base + port); | ||
188 | } | ||
189 | |||
190 | /* | ||
191 | * write a sja1000 register | ||
192 | */ | ||
193 | static void pcan_write_canreg(const struct sja1000_priv *priv, int port, u8 v) | ||
194 | { | ||
195 | struct pcan_pccard *card = priv->priv; | ||
196 | int c = (priv->reg_base - card->ioport_addr) / PCC_CHAN_SIZE; | ||
197 | |||
198 | /* sja1000 register changes control the leds state */ | ||
199 | if (port == REG_MOD) | ||
200 | switch (v) { | ||
201 | case MOD_RM: | ||
202 | /* Reset Mode: set led on */ | ||
203 | pcan_set_leds(card, PCC_LED(c), PCC_LED_ON); | ||
204 | break; | ||
205 | case 0x00: | ||
206 | /* Normal Mode: led slow blinking and start led timer */ | ||
207 | pcan_set_leds(card, PCC_LED(c), PCC_LED_SLOW); | ||
208 | pcan_start_led_timer(card); | ||
209 | break; | ||
210 | default: | ||
211 | break; | ||
212 | } | ||
213 | |||
214 | iowrite8(v, priv->reg_base + port); | ||
215 | } | ||
216 | |||
217 | /* | ||
218 | * read a register from the common area | ||
219 | */ | ||
220 | static u8 pcan_read_reg(struct pcan_pccard *card, int port) | ||
221 | { | ||
222 | return ioread8(card->ioport_addr + PCC_COMN_OFF + port); | ||
223 | } | ||
224 | |||
225 | /* | ||
226 | * write a register into the common area | ||
227 | */ | ||
228 | static void pcan_write_reg(struct pcan_pccard *card, int port, u8 v) | ||
229 | { | ||
230 | /* cache ccr value */ | ||
231 | if (port == PCC_CCR) { | ||
232 | if (card->ccr == v) | ||
233 | return; | ||
234 | card->ccr = v; | ||
235 | } | ||
236 | |||
237 | iowrite8(v, card->ioport_addr + PCC_COMN_OFF + port); | ||
238 | } | ||
239 | |||
240 | /* | ||
241 | * check whether the card is present by checking its fw version numbers | ||
242 | * against values read at probing time. | ||
243 | */ | ||
244 | static inline int pcan_pccard_present(struct pcan_pccard *card) | ||
245 | { | ||
246 | return ((pcan_read_reg(card, PCC_FW_MAJOR) == card->fw_major) && | ||
247 | (pcan_read_reg(card, PCC_FW_MINOR) == card->fw_minor)); | ||
248 | } | ||
249 | |||
250 | /* | ||
251 | * wait for SPI engine while it is busy | ||
252 | */ | ||
253 | static int pcan_wait_spi_busy(struct pcan_pccard *card) | ||
254 | { | ||
255 | unsigned long timeout = jiffies + | ||
256 | msecs_to_jiffies(PCC_SPI_MAX_BUSY_WAIT_MS) + 1; | ||
257 | |||
258 | /* be sure to read status at least once after sleeping */ | ||
259 | while (pcan_read_reg(card, PCC_CSR) & PCC_CSR_SPI_BUSY) { | ||
260 | if (time_after(jiffies, timeout)) | ||
261 | return -EBUSY; | ||
262 | schedule(); | ||
263 | } | ||
264 | |||
265 | return 0; | ||
266 | } | ||
267 | |||
268 | /* | ||
269 | * write data in device eeprom | ||
270 | */ | ||
271 | static int pcan_write_eeprom(struct pcan_pccard *card, u16 addr, u8 v) | ||
272 | { | ||
273 | u8 status; | ||
274 | int err, i; | ||
275 | |||
276 | /* write instruction enabling write */ | ||
277 | pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_WREN); | ||
278 | err = pcan_wait_spi_busy(card); | ||
279 | if (err) | ||
280 | goto we_spi_err; | ||
281 | |||
282 | /* wait until write enabled */ | ||
283 | for (i = 0; i < PCC_WRITE_MAX_LOOP; i++) { | ||
284 | /* write instruction reading the status register */ | ||
285 | pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_RDSR); | ||
286 | err = pcan_wait_spi_busy(card); | ||
287 | if (err) | ||
288 | goto we_spi_err; | ||
289 | |||
290 | /* get status register value and check write enable bit */ | ||
291 | status = pcan_read_reg(card, PCC_SPI_DIR); | ||
292 | if (status & PCC_EEP_SR_WEN) | ||
293 | break; | ||
294 | } | ||
295 | |||
296 | if (i >= PCC_WRITE_MAX_LOOP) { | ||
297 | dev_err(&card->pdev->dev, | ||
298 | "stop waiting to be allowed to write in eeprom\n"); | ||
299 | return -EIO; | ||
300 | } | ||
301 | |||
302 | /* set address and data */ | ||
303 | pcan_write_reg(card, PCC_SPI_ADR, addr & 0xff); | ||
304 | pcan_write_reg(card, PCC_SPI_DOR, v); | ||
305 | |||
306 | /* | ||
307 | * write instruction with bit[3] set according to address value: | ||
308 | * if addr refers to upper half of the memory array: bit[3] = 1 | ||
309 | */ | ||
310 | pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_WRITE(addr)); | ||
311 | err = pcan_wait_spi_busy(card); | ||
312 | if (err) | ||
313 | goto we_spi_err; | ||
314 | |||
315 | /* wait while write in progress */ | ||
316 | for (i = 0; i < PCC_WRITE_MAX_LOOP; i++) { | ||
317 | /* write instruction reading the status register */ | ||
318 | pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_RDSR); | ||
319 | err = pcan_wait_spi_busy(card); | ||
320 | if (err) | ||
321 | goto we_spi_err; | ||
322 | |||
323 | /* get status register value and check write in progress bit */ | ||
324 | status = pcan_read_reg(card, PCC_SPI_DIR); | ||
325 | if (!(status & PCC_EEP_SR_WIP)) | ||
326 | break; | ||
327 | } | ||
328 | |||
329 | if (i >= PCC_WRITE_MAX_LOOP) { | ||
330 | dev_err(&card->pdev->dev, | ||
331 | "stop waiting for write in eeprom to complete\n"); | ||
332 | return -EIO; | ||
333 | } | ||
334 | |||
335 | /* write instruction disabling write */ | ||
336 | pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_WRDI); | ||
337 | err = pcan_wait_spi_busy(card); | ||
338 | if (err) | ||
339 | goto we_spi_err; | ||
340 | |||
341 | return 0; | ||
342 | |||
343 | we_spi_err: | ||
344 | dev_err(&card->pdev->dev, | ||
345 | "stop waiting (spi engine always busy) err %d\n", err); | ||
346 | |||
347 | return err; | ||
348 | } | ||
349 | |||
350 | static void pcan_set_leds(struct pcan_pccard *card, u8 led_mask, u8 state) | ||
351 | { | ||
352 | u8 ccr = card->ccr; | ||
353 | int i; | ||
354 | |||
355 | for (i = 0; i < card->chan_count; i++) | ||
356 | if (led_mask & PCC_LED(i)) { | ||
357 | /* clear corresponding led bits in ccr */ | ||
358 | ccr &= ~PCC_CCR_LED_MASK_CHAN(i); | ||
359 | /* then set new bits */ | ||
360 | ccr |= PCC_CCR_LED_CHAN(state, i); | ||
361 | } | ||
362 | |||
363 | /* real write only if something has changed in ccr */ | ||
364 | pcan_write_reg(card, PCC_CCR, ccr); | ||
365 | } | ||
366 | |||
367 | /* | ||
368 | * enable/disable CAN connectors power | ||
369 | */ | ||
370 | static inline void pcan_set_can_power(struct pcan_pccard *card, int onoff) | ||
371 | { | ||
372 | int err; | ||
373 | |||
374 | err = pcan_write_eeprom(card, 0, !!onoff); | ||
375 | if (err) | ||
376 | dev_err(&card->pdev->dev, | ||
377 | "failed setting power %s to can connectors (err %d)\n", | ||
378 | (onoff) ? "on" : "off", err); | ||
379 | } | ||
380 | |||
381 | /* | ||
382 | * set leds state according to channel activity | ||
383 | */ | ||
384 | static void pcan_led_timer(unsigned long arg) | ||
385 | { | ||
386 | struct pcan_pccard *card = (struct pcan_pccard *)arg; | ||
387 | struct net_device *netdev; | ||
388 | int i, up_count = 0; | ||
389 | u8 ccr; | ||
390 | |||
391 | ccr = card->ccr; | ||
392 | for (i = 0; i < card->chan_count; i++) { | ||
393 | /* default is: not configured */ | ||
394 | ccr &= ~PCC_CCR_LED_MASK_CHAN(i); | ||
395 | ccr |= PCC_CCR_LED_ON_CHAN(i); | ||
396 | |||
397 | netdev = card->channel[i].netdev; | ||
398 | if (!netdev || !(netdev->flags & IFF_UP)) | ||
399 | continue; | ||
400 | |||
401 | up_count++; | ||
402 | |||
403 | /* no activity (but configured) */ | ||
404 | ccr &= ~PCC_CCR_LED_MASK_CHAN(i); | ||
405 | ccr |= PCC_CCR_LED_SLOW_CHAN(i); | ||
406 | |||
407 | /* if bytes counters changed, set fast blinking led */ | ||
408 | if (netdev->stats.rx_bytes != card->channel[i].prev_rx_bytes) { | ||
409 | card->channel[i].prev_rx_bytes = netdev->stats.rx_bytes; | ||
410 | ccr &= ~PCC_CCR_LED_MASK_CHAN(i); | ||
411 | ccr |= PCC_CCR_LED_FAST_CHAN(i); | ||
412 | } | ||
413 | if (netdev->stats.tx_bytes != card->channel[i].prev_tx_bytes) { | ||
414 | card->channel[i].prev_tx_bytes = netdev->stats.tx_bytes; | ||
415 | ccr &= ~PCC_CCR_LED_MASK_CHAN(i); | ||
416 | ccr |= PCC_CCR_LED_FAST_CHAN(i); | ||
417 | } | ||
418 | } | ||
419 | |||
420 | /* write the new leds state */ | ||
421 | pcan_write_reg(card, PCC_CCR, ccr); | ||
422 | |||
423 | /* restart timer (except if no more configured channels) */ | ||
424 | if (up_count) | ||
425 | mod_timer(&card->led_timer, jiffies + HZ); | ||
426 | } | ||
427 | |||
428 | /* | ||
429 | * interrupt service routine | ||
430 | */ | ||
431 | static irqreturn_t pcan_isr(int irq, void *dev_id) | ||
432 | { | ||
433 | struct pcan_pccard *card = dev_id; | ||
434 | int irq_handled; | ||
435 | |||
436 | /* prevent from infinite loop */ | ||
437 | for (irq_handled = 0; irq_handled < PCC_ISR_MAX_LOOP; irq_handled++) { | ||
438 | /* handle shared interrupt and next loop */ | ||
439 | int nothing_to_handle = 1; | ||
440 | int i; | ||
441 | |||
442 | /* check interrupt for each channel */ | ||
443 | for (i = 0; i < card->chan_count; i++) { | ||
444 | struct net_device *netdev; | ||
445 | |||
446 | /* | ||
447 | * check whether the card is present before calling | ||
448 | * sja1000_interrupt() to speed up hotplug detection | ||
449 | */ | ||
450 | if (!pcan_pccard_present(card)) { | ||
451 | /* card unplugged during isr */ | ||
452 | return IRQ_NONE; | ||
453 | } | ||
454 | |||
455 | /* | ||
456 | * should check whether all or SJA1000_MAX_IRQ | ||
457 | * interrupts have been handled: loop again to be sure. | ||
458 | */ | ||
459 | netdev = card->channel[i].netdev; | ||
460 | if (netdev && | ||
461 | sja1000_interrupt(irq, netdev) == IRQ_HANDLED) | ||
462 | nothing_to_handle = 0; | ||
463 | } | ||
464 | |||
465 | if (nothing_to_handle) | ||
466 | break; | ||
467 | } | ||
468 | |||
469 | return (irq_handled) ? IRQ_HANDLED : IRQ_NONE; | ||
470 | } | ||
471 | |||
472 | /* | ||
473 | * free all resources used by the channels and switch off leds and can power | ||
474 | */ | ||
475 | static void pcan_free_channels(struct pcan_pccard *card) | ||
476 | { | ||
477 | int i; | ||
478 | u8 led_mask = 0; | ||
479 | |||
480 | for (i = 0; i < card->chan_count; i++) { | ||
481 | struct net_device *netdev; | ||
482 | char name[IFNAMSIZ]; | ||
483 | |||
484 | led_mask |= PCC_LED(i); | ||
485 | |||
486 | netdev = card->channel[i].netdev; | ||
487 | if (!netdev) | ||
488 | continue; | ||
489 | |||
490 | strncpy(name, netdev->name, IFNAMSIZ); | ||
491 | |||
492 | unregister_sja1000dev(netdev); | ||
493 | |||
494 | free_sja1000dev(netdev); | ||
495 | |||
496 | dev_info(&card->pdev->dev, "%s removed\n", name); | ||
497 | } | ||
498 | |||
499 | /* do it only if device not removed */ | ||
500 | if (pcan_pccard_present(card)) { | ||
501 | pcan_set_leds(card, led_mask, PCC_LED_OFF); | ||
502 | pcan_set_can_power(card, 0); | ||
503 | } | ||
504 | } | ||
505 | |||
506 | /* | ||
507 | * check if a CAN controller is present at the specified location | ||
508 | */ | ||
509 | static inline int pcan_channel_present(struct sja1000_priv *priv) | ||
510 | { | ||
511 | /* make sure SJA1000 is in reset mode */ | ||
512 | pcan_write_canreg(priv, REG_MOD, 1); | ||
513 | pcan_write_canreg(priv, REG_CDR, CDR_PELICAN); | ||
514 | |||
515 | /* read reset-values */ | ||
516 | if (pcan_read_canreg(priv, REG_CDR) == CDR_PELICAN) | ||
517 | return 1; | ||
518 | |||
519 | return 0; | ||
520 | } | ||
521 | |||
522 | static int pcan_add_channels(struct pcan_pccard *card) | ||
523 | { | ||
524 | struct pcmcia_device *pdev = card->pdev; | ||
525 | int i, err = 0; | ||
526 | u8 ccr = PCC_CCR_INIT; | ||
527 | |||
528 | /* init common registers (reset channels and leds off) */ | ||
529 | card->ccr = ~ccr; | ||
530 | pcan_write_reg(card, PCC_CCR, ccr); | ||
531 | |||
532 | /* wait 2ms before unresetting channels */ | ||
533 | mdelay(2); | ||
534 | |||
535 | ccr &= ~PCC_CCR_RST_ALL; | ||
536 | pcan_write_reg(card, PCC_CCR, ccr); | ||
537 | |||
538 | /* create one network device per channel detected */ | ||
539 | for (i = 0; i < ARRAY_SIZE(card->channel); i++) { | ||
540 | struct net_device *netdev; | ||
541 | struct sja1000_priv *priv; | ||
542 | |||
543 | netdev = alloc_sja1000dev(0); | ||
544 | if (!netdev) { | ||
545 | err = -ENOMEM; | ||
546 | break; | ||
547 | } | ||
548 | |||
549 | /* update linkages */ | ||
550 | priv = netdev_priv(netdev); | ||
551 | priv->priv = card; | ||
552 | SET_NETDEV_DEV(netdev, &pdev->dev); | ||
553 | |||
554 | priv->irq_flags = IRQF_SHARED; | ||
555 | netdev->irq = pdev->irq; | ||
556 | priv->reg_base = card->ioport_addr + PCC_CHAN_OFF(i); | ||
557 | |||
558 | /* check if channel is present */ | ||
559 | if (!pcan_channel_present(priv)) { | ||
560 | dev_err(&pdev->dev, "channel %d not present\n", i); | ||
561 | free_sja1000dev(netdev); | ||
562 | continue; | ||
563 | } | ||
564 | |||
565 | priv->read_reg = pcan_read_canreg; | ||
566 | priv->write_reg = pcan_write_canreg; | ||
567 | priv->can.clock.freq = PCC_CAN_CLOCK; | ||
568 | priv->ocr = PCC_OCR; | ||
569 | priv->cdr = PCC_CDR; | ||
570 | |||
571 | /* Neither a slave device distributes the clock */ | ||
572 | if (i > 0) | ||
573 | priv->cdr |= CDR_CLK_OFF; | ||
574 | |||
575 | priv->flags |= SJA1000_CUSTOM_IRQ_HANDLER; | ||
576 | |||
577 | /* register SJA1000 device */ | ||
578 | err = register_sja1000dev(netdev); | ||
579 | if (err) { | ||
580 | free_sja1000dev(netdev); | ||
581 | continue; | ||
582 | } | ||
583 | |||
584 | card->channel[i].netdev = netdev; | ||
585 | card->chan_count++; | ||
586 | |||
587 | /* set corresponding led on in the new ccr */ | ||
588 | ccr &= ~PCC_CCR_LED_OFF_CHAN(i); | ||
589 | |||
590 | dev_info(&pdev->dev, | ||
591 | "%s on channel %d at 0x%p irq %d\n", | ||
592 | netdev->name, i, priv->reg_base, pdev->irq); | ||
593 | } | ||
594 | |||
595 | /* write new ccr (change leds state) */ | ||
596 | pcan_write_reg(card, PCC_CCR, ccr); | ||
597 | |||
598 | return err; | ||
599 | } | ||
600 | |||
601 | static int pcan_conf_check(struct pcmcia_device *pdev, void *priv_data) | ||
602 | { | ||
603 | pdev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; | ||
604 | pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; /* only */ | ||
605 | pdev->io_lines = 10; | ||
606 | |||
607 | /* This reserves IO space but doesn't actually enable it */ | ||
608 | return pcmcia_request_io(pdev); | ||
609 | } | ||
610 | |||
611 | /* | ||
612 | * free all resources used by the device | ||
613 | */ | ||
614 | static void pcan_free(struct pcmcia_device *pdev) | ||
615 | { | ||
616 | struct pcan_pccard *card = pdev->priv; | ||
617 | |||
618 | if (!card) | ||
619 | return; | ||
620 | |||
621 | free_irq(pdev->irq, card); | ||
622 | pcan_stop_led_timer(card); | ||
623 | |||
624 | pcan_free_channels(card); | ||
625 | |||
626 | ioport_unmap(card->ioport_addr); | ||
627 | |||
628 | kfree(card); | ||
629 | pdev->priv = NULL; | ||
630 | } | ||
631 | |||
632 | /* | ||
633 | * setup PCMCIA socket and probe for PEAK-System PC-CARD | ||
634 | */ | ||
635 | static int pcan_probe(struct pcmcia_device *pdev) | ||
636 | { | ||
637 | struct pcan_pccard *card; | ||
638 | int err; | ||
639 | |||
640 | pdev->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO; | ||
641 | |||
642 | err = pcmcia_loop_config(pdev, pcan_conf_check, NULL); | ||
643 | if (err) { | ||
644 | dev_err(&pdev->dev, "pcmcia_loop_config() error %d\n", err); | ||
645 | goto probe_err_1; | ||
646 | } | ||
647 | |||
648 | if (!pdev->irq) { | ||
649 | dev_err(&pdev->dev, "no irq assigned\n"); | ||
650 | err = -ENODEV; | ||
651 | goto probe_err_1; | ||
652 | } | ||
653 | |||
654 | err = pcmcia_enable_device(pdev); | ||
655 | if (err) { | ||
656 | dev_err(&pdev->dev, "pcmcia_enable_device failed err=%d\n", | ||
657 | err); | ||
658 | goto probe_err_1; | ||
659 | } | ||
660 | |||
661 | card = kzalloc(sizeof(struct pcan_pccard), GFP_KERNEL); | ||
662 | if (!card) { | ||
663 | dev_err(&pdev->dev, "couldn't allocate card memory\n"); | ||
664 | err = -ENOMEM; | ||
665 | goto probe_err_2; | ||
666 | } | ||
667 | |||
668 | card->pdev = pdev; | ||
669 | pdev->priv = card; | ||
670 | |||
671 | /* sja1000 api uses iomem */ | ||
672 | card->ioport_addr = ioport_map(pdev->resource[0]->start, | ||
673 | resource_size(pdev->resource[0])); | ||
674 | if (!card->ioport_addr) { | ||
675 | dev_err(&pdev->dev, "couldn't map io port into io memory\n"); | ||
676 | err = -ENOMEM; | ||
677 | goto probe_err_3; | ||
678 | } | ||
679 | card->fw_major = pcan_read_reg(card, PCC_FW_MAJOR); | ||
680 | card->fw_minor = pcan_read_reg(card, PCC_FW_MINOR); | ||
681 | |||
682 | /* display board name and firware version */ | ||
683 | dev_info(&pdev->dev, "PEAK-System pcmcia card %s fw %d.%d\n", | ||
684 | pdev->prod_id[1] ? pdev->prod_id[1] : "PCAN-PC Card", | ||
685 | card->fw_major, card->fw_minor); | ||
686 | |||
687 | /* detect available channels */ | ||
688 | pcan_add_channels(card); | ||
689 | if (!card->chan_count) { | ||
690 | err = -ENOMEM; | ||
691 | goto probe_err_4; | ||
692 | } | ||
693 | |||
694 | /* init the timer which controls the leds */ | ||
695 | init_timer(&card->led_timer); | ||
696 | card->led_timer.function = pcan_led_timer; | ||
697 | card->led_timer.data = (unsigned long)card; | ||
698 | |||
699 | /* request the given irq */ | ||
700 | err = request_irq(pdev->irq, &pcan_isr, IRQF_SHARED, PCC_NAME, card); | ||
701 | if (err) { | ||
702 | dev_err(&pdev->dev, "couldn't request irq%d\n", pdev->irq); | ||
703 | goto probe_err_5; | ||
704 | } | ||
705 | |||
706 | /* power on the connectors */ | ||
707 | pcan_set_can_power(card, 1); | ||
708 | |||
709 | return 0; | ||
710 | |||
711 | probe_err_5: | ||
712 | /* unregister can devices from network */ | ||
713 | pcan_free_channels(card); | ||
714 | |||
715 | probe_err_4: | ||
716 | ioport_unmap(card->ioport_addr); | ||
717 | |||
718 | probe_err_3: | ||
719 | kfree(card); | ||
720 | pdev->priv = NULL; | ||
721 | |||
722 | probe_err_2: | ||
723 | pcmcia_disable_device(pdev); | ||
724 | |||
725 | probe_err_1: | ||
726 | return err; | ||
727 | } | ||
728 | |||
729 | /* | ||
730 | * release claimed resources | ||
731 | */ | ||
732 | static void pcan_remove(struct pcmcia_device *pdev) | ||
733 | { | ||
734 | pcan_free(pdev); | ||
735 | pcmcia_disable_device(pdev); | ||
736 | } | ||
737 | |||
738 | static struct pcmcia_driver pcan_driver = { | ||
739 | .name = PCC_NAME, | ||
740 | .probe = pcan_probe, | ||
741 | .remove = pcan_remove, | ||
742 | .id_table = pcan_table, | ||
743 | }; | ||
744 | |||
745 | static int __init pcan_init(void) | ||
746 | { | ||
747 | return pcmcia_register_driver(&pcan_driver); | ||
748 | } | ||
749 | module_init(pcan_init); | ||
750 | |||
751 | static void __exit pcan_exit(void) | ||
752 | { | ||
753 | pcmcia_unregister_driver(&pcan_driver); | ||
754 | } | ||
755 | module_exit(pcan_exit); | ||
diff --git a/drivers/net/can/sja1000/plx_pci.c b/drivers/net/can/sja1000/plx_pci.c index 11d1062a944..c7f3d4ea116 100644 --- a/drivers/net/can/sja1000/plx_pci.c +++ b/drivers/net/can/sja1000/plx_pci.c | |||
@@ -43,9 +43,7 @@ MODULE_SUPPORTED_DEVICE("Adlink PCI-7841/cPCI-7841, " | |||
43 | "TEWS TECHNOLOGIES TPMC810, " | 43 | "TEWS TECHNOLOGIES TPMC810, " |
44 | "esd CAN-PCI/CPCI/PCI104/200, " | 44 | "esd CAN-PCI/CPCI/PCI104/200, " |
45 | "esd CAN-PCI/PMC/266, " | 45 | "esd CAN-PCI/PMC/266, " |
46 | "esd CAN-PCIe/2000, " | 46 | "esd CAN-PCIe/2000") |
47 | "Connect Tech Inc. CANpro/104-Plus Opto (CRG001), " | ||
48 | "IXXAT PC-I 04/PCI") | ||
49 | MODULE_LICENSE("GPL v2"); | 47 | MODULE_LICENSE("GPL v2"); |
50 | 48 | ||
51 | #define PLX_PCI_MAX_CHAN 2 | 49 | #define PLX_PCI_MAX_CHAN 2 |
@@ -123,18 +121,11 @@ struct plx_pci_card { | |||
123 | #define ESD_PCI_SUB_SYS_ID_PCIE2000 0x0200 | 121 | #define ESD_PCI_SUB_SYS_ID_PCIE2000 0x0200 |
124 | #define ESD_PCI_SUB_SYS_ID_PCI104200 0x0501 | 122 | #define ESD_PCI_SUB_SYS_ID_PCI104200 0x0501 |
125 | 123 | ||
126 | #define IXXAT_PCI_VENDOR_ID 0x10b5 | ||
127 | #define IXXAT_PCI_DEVICE_ID 0x9050 | ||
128 | #define IXXAT_PCI_SUB_SYS_ID 0x2540 | ||
129 | |||
130 | #define MARATHON_PCI_DEVICE_ID 0x2715 | 124 | #define MARATHON_PCI_DEVICE_ID 0x2715 |
131 | 125 | ||
132 | #define TEWS_PCI_VENDOR_ID 0x1498 | 126 | #define TEWS_PCI_VENDOR_ID 0x1498 |
133 | #define TEWS_PCI_DEVICE_ID_TMPC810 0x032A | 127 | #define TEWS_PCI_DEVICE_ID_TMPC810 0x032A |
134 | 128 | ||
135 | #define CTI_PCI_VENDOR_ID 0x12c4 | ||
136 | #define CTI_PCI_DEVICE_ID_CRG001 0x0900 | ||
137 | |||
138 | static void plx_pci_reset_common(struct pci_dev *pdev); | 129 | static void plx_pci_reset_common(struct pci_dev *pdev); |
139 | static void plx_pci_reset_marathon(struct pci_dev *pdev); | 130 | static void plx_pci_reset_marathon(struct pci_dev *pdev); |
140 | static void plx9056_pci_reset_common(struct pci_dev *pdev); | 131 | static void plx9056_pci_reset_common(struct pci_dev *pdev); |
@@ -162,7 +153,7 @@ struct plx_pci_card_info { | |||
162 | void (*reset_func)(struct pci_dev *pdev); | 153 | void (*reset_func)(struct pci_dev *pdev); |
163 | }; | 154 | }; |
164 | 155 | ||
165 | static struct plx_pci_card_info plx_pci_card_info_adlink = { | 156 | static struct plx_pci_card_info plx_pci_card_info_adlink __devinitdata = { |
166 | "Adlink PCI-7841/cPCI-7841", 2, | 157 | "Adlink PCI-7841/cPCI-7841", 2, |
167 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | 158 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, |
168 | {1, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x80, 0x80} }, | 159 | {1, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x80, 0x80} }, |
@@ -170,7 +161,7 @@ static struct plx_pci_card_info plx_pci_card_info_adlink = { | |||
170 | /* based on PLX9052 */ | 161 | /* based on PLX9052 */ |
171 | }; | 162 | }; |
172 | 163 | ||
173 | static struct plx_pci_card_info plx_pci_card_info_adlink_se = { | 164 | static struct plx_pci_card_info plx_pci_card_info_adlink_se __devinitdata = { |
174 | "Adlink PCI-7841/cPCI-7841 SE", 2, | 165 | "Adlink PCI-7841/cPCI-7841 SE", 2, |
175 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | 166 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, |
176 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x80, 0x80} }, | 167 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x80, 0x80} }, |
@@ -178,7 +169,7 @@ static struct plx_pci_card_info plx_pci_card_info_adlink_se = { | |||
178 | /* based on PLX9052 */ | 169 | /* based on PLX9052 */ |
179 | }; | 170 | }; |
180 | 171 | ||
181 | static struct plx_pci_card_info plx_pci_card_info_esd200 = { | 172 | static struct plx_pci_card_info plx_pci_card_info_esd200 __devinitdata = { |
182 | "esd CAN-PCI/CPCI/PCI104/200", 2, | 173 | "esd CAN-PCI/CPCI/PCI104/200", 2, |
183 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | 174 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, |
184 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x100, 0x80} }, | 175 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x100, 0x80} }, |
@@ -186,7 +177,7 @@ static struct plx_pci_card_info plx_pci_card_info_esd200 = { | |||
186 | /* based on PLX9030/9050 */ | 177 | /* based on PLX9030/9050 */ |
187 | }; | 178 | }; |
188 | 179 | ||
189 | static struct plx_pci_card_info plx_pci_card_info_esd266 = { | 180 | static struct plx_pci_card_info plx_pci_card_info_esd266 __devinitdata = { |
190 | "esd CAN-PCI/PMC/266", 2, | 181 | "esd CAN-PCI/PMC/266", 2, |
191 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | 182 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, |
192 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x100, 0x80} }, | 183 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x100, 0x80} }, |
@@ -194,7 +185,7 @@ static struct plx_pci_card_info plx_pci_card_info_esd266 = { | |||
194 | /* based on PLX9056 */ | 185 | /* based on PLX9056 */ |
195 | }; | 186 | }; |
196 | 187 | ||
197 | static struct plx_pci_card_info plx_pci_card_info_esd2000 = { | 188 | static struct plx_pci_card_info plx_pci_card_info_esd2000 __devinitdata = { |
198 | "esd CAN-PCIe/2000", 2, | 189 | "esd CAN-PCIe/2000", 2, |
199 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | 190 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, |
200 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x100, 0x80} }, | 191 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x100, 0x80} }, |
@@ -202,15 +193,7 @@ static struct plx_pci_card_info plx_pci_card_info_esd2000 = { | |||
202 | /* based on PEX8311 */ | 193 | /* based on PEX8311 */ |
203 | }; | 194 | }; |
204 | 195 | ||
205 | static struct plx_pci_card_info plx_pci_card_info_ixxat = { | 196 | static struct plx_pci_card_info plx_pci_card_info_marathon __devinitdata = { |
206 | "IXXAT PC-I 04/PCI", 2, | ||
207 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | ||
208 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x200, 0x80} }, | ||
209 | &plx_pci_reset_common | ||
210 | /* based on PLX9050 */ | ||
211 | }; | ||
212 | |||
213 | static struct plx_pci_card_info plx_pci_card_info_marathon = { | ||
214 | "Marathon CAN-bus-PCI", 2, | 197 | "Marathon CAN-bus-PCI", 2, |
215 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | 198 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, |
216 | {0, 0x00, 0x00}, { {2, 0x00, 0x00}, {4, 0x00, 0x00} }, | 199 | {0, 0x00, 0x00}, { {2, 0x00, 0x00}, {4, 0x00, 0x00} }, |
@@ -218,7 +201,7 @@ static struct plx_pci_card_info plx_pci_card_info_marathon = { | |||
218 | /* based on PLX9052 */ | 201 | /* based on PLX9052 */ |
219 | }; | 202 | }; |
220 | 203 | ||
221 | static struct plx_pci_card_info plx_pci_card_info_tews = { | 204 | static struct plx_pci_card_info plx_pci_card_info_tews __devinitdata = { |
222 | "TEWS TECHNOLOGIES TPMC810", 2, | 205 | "TEWS TECHNOLOGIES TPMC810", 2, |
223 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | 206 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, |
224 | {0, 0x00, 0x00}, { {2, 0x000, 0x80}, {2, 0x100, 0x80} }, | 207 | {0, 0x00, 0x00}, { {2, 0x000, 0x80}, {2, 0x100, 0x80} }, |
@@ -226,14 +209,6 @@ static struct plx_pci_card_info plx_pci_card_info_tews = { | |||
226 | /* based on PLX9030 */ | 209 | /* based on PLX9030 */ |
227 | }; | 210 | }; |
228 | 211 | ||
229 | static struct plx_pci_card_info plx_pci_card_info_cti = { | ||
230 | "Connect Tech Inc. CANpro/104-Plus Opto (CRG001)", 2, | ||
231 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | ||
232 | {0, 0x00, 0x00}, { {2, 0x000, 0x80}, {2, 0x100, 0x80} }, | ||
233 | &plx_pci_reset_common | ||
234 | /* based on PLX9030 */ | ||
235 | }; | ||
236 | |||
237 | static DEFINE_PCI_DEVICE_TABLE(plx_pci_tbl) = { | 212 | static DEFINE_PCI_DEVICE_TABLE(plx_pci_tbl) = { |
238 | { | 213 | { |
239 | /* Adlink PCI-7841/cPCI-7841 */ | 214 | /* Adlink PCI-7841/cPCI-7841 */ |
@@ -292,13 +267,6 @@ static DEFINE_PCI_DEVICE_TABLE(plx_pci_tbl) = { | |||
292 | (kernel_ulong_t)&plx_pci_card_info_esd2000 | 267 | (kernel_ulong_t)&plx_pci_card_info_esd2000 |
293 | }, | 268 | }, |
294 | { | 269 | { |
295 | /* IXXAT PC-I 04/PCI card */ | ||
296 | IXXAT_PCI_VENDOR_ID, IXXAT_PCI_DEVICE_ID, | ||
297 | PCI_ANY_ID, IXXAT_PCI_SUB_SYS_ID, | ||
298 | 0, 0, | ||
299 | (kernel_ulong_t)&plx_pci_card_info_ixxat | ||
300 | }, | ||
301 | { | ||
302 | /* Marathon CAN-bus-PCI card */ | 270 | /* Marathon CAN-bus-PCI card */ |
303 | PCI_VENDOR_ID_PLX, MARATHON_PCI_DEVICE_ID, | 271 | PCI_VENDOR_ID_PLX, MARATHON_PCI_DEVICE_ID, |
304 | PCI_ANY_ID, PCI_ANY_ID, | 272 | PCI_ANY_ID, PCI_ANY_ID, |
@@ -312,13 +280,6 @@ static DEFINE_PCI_DEVICE_TABLE(plx_pci_tbl) = { | |||
312 | 0, 0, | 280 | 0, 0, |
313 | (kernel_ulong_t)&plx_pci_card_info_tews | 281 | (kernel_ulong_t)&plx_pci_card_info_tews |
314 | }, | 282 | }, |
315 | { | ||
316 | /* Connect Tech Inc. CANpro/104-Plus Opto (CRG001) card */ | ||
317 | PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030, | ||
318 | CTI_PCI_VENDOR_ID, CTI_PCI_DEVICE_ID_CRG001, | ||
319 | 0, 0, | ||
320 | (kernel_ulong_t)&plx_pci_card_info_cti | ||
321 | }, | ||
322 | { 0,} | 283 | { 0,} |
323 | }; | 284 | }; |
324 | MODULE_DEVICE_TABLE(pci, plx_pci_tbl); | 285 | MODULE_DEVICE_TABLE(pci, plx_pci_tbl); |
@@ -484,8 +445,8 @@ static void plx_pci_del_card(struct pci_dev *pdev) | |||
484 | * Probe PLX90xx based device for the SJA1000 chips and register each | 445 | * Probe PLX90xx based device for the SJA1000 chips and register each |
485 | * available CAN channel to SJA1000 Socket-CAN subsystem. | 446 | * available CAN channel to SJA1000 Socket-CAN subsystem. |
486 | */ | 447 | */ |
487 | static int plx_pci_add_card(struct pci_dev *pdev, | 448 | static int __devinit plx_pci_add_card(struct pci_dev *pdev, |
488 | const struct pci_device_id *ent) | 449 | const struct pci_device_id *ent) |
489 | { | 450 | { |
490 | struct sja1000_priv *priv; | 451 | struct sja1000_priv *priv; |
491 | struct net_device *dev; | 452 | struct net_device *dev; |
@@ -628,4 +589,15 @@ static struct pci_driver plx_pci_driver = { | |||
628 | .remove = plx_pci_del_card, | 589 | .remove = plx_pci_del_card, |
629 | }; | 590 | }; |
630 | 591 | ||
631 | module_pci_driver(plx_pci_driver); | 592 | static int __init plx_pci_init(void) |
593 | { | ||
594 | return pci_register_driver(&plx_pci_driver); | ||
595 | } | ||
596 | |||
597 | static void __exit plx_pci_exit(void) | ||
598 | { | ||
599 | pci_unregister_driver(&plx_pci_driver); | ||
600 | } | ||
601 | |||
602 | module_init(plx_pci_init); | ||
603 | module_exit(plx_pci_exit); | ||
diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c index 83ee11eca0e..f501bba1fc6 100644 --- a/drivers/net/can/sja1000/sja1000.c +++ b/drivers/net/can/sja1000/sja1000.c | |||
@@ -40,6 +40,8 @@ | |||
40 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | 40 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH |
41 | * DAMAGE. | 41 | * DAMAGE. |
42 | * | 42 | * |
43 | * Send feedback to <socketcan-users@lists.berlios.de> | ||
44 | * | ||
43 | */ | 45 | */ |
44 | 46 | ||
45 | #include <linux/module.h> | 47 | #include <linux/module.h> |
@@ -69,7 +71,7 @@ MODULE_AUTHOR("Oliver Hartkopp <oliver.hartkopp@volkswagen.de>"); | |||
69 | MODULE_LICENSE("Dual BSD/GPL"); | 71 | MODULE_LICENSE("Dual BSD/GPL"); |
70 | MODULE_DESCRIPTION(DRV_NAME "CAN netdevice driver"); | 72 | MODULE_DESCRIPTION(DRV_NAME "CAN netdevice driver"); |
71 | 73 | ||
72 | static const struct can_bittiming_const sja1000_bittiming_const = { | 74 | static struct can_bittiming_const sja1000_bittiming_const = { |
73 | .name = DRV_NAME, | 75 | .name = DRV_NAME, |
74 | .tseg1_min = 1, | 76 | .tseg1_min = 1, |
75 | .tseg1_max = 16, | 77 | .tseg1_max = 16, |
@@ -95,16 +97,11 @@ static void sja1000_write_cmdreg(struct sja1000_priv *priv, u8 val) | |||
95 | spin_unlock_irqrestore(&priv->cmdreg_lock, flags); | 97 | spin_unlock_irqrestore(&priv->cmdreg_lock, flags); |
96 | } | 98 | } |
97 | 99 | ||
98 | static int sja1000_is_absent(struct sja1000_priv *priv) | ||
99 | { | ||
100 | return (priv->read_reg(priv, REG_MOD) == 0xFF); | ||
101 | } | ||
102 | |||
103 | static int sja1000_probe_chip(struct net_device *dev) | 100 | static int sja1000_probe_chip(struct net_device *dev) |
104 | { | 101 | { |
105 | struct sja1000_priv *priv = netdev_priv(dev); | 102 | struct sja1000_priv *priv = netdev_priv(dev); |
106 | 103 | ||
107 | if (priv->reg_base && sja1000_is_absent(priv)) { | 104 | if (priv->reg_base && (priv->read_reg(priv, 0) == 0xFF)) { |
108 | printk(KERN_INFO "%s: probing @0x%lX failed\n", | 105 | printk(KERN_INFO "%s: probing @0x%lX failed\n", |
109 | DRV_NAME, dev->base_addr); | 106 | DRV_NAME, dev->base_addr); |
110 | return 0; | 107 | return 0; |
@@ -133,7 +130,7 @@ static void set_reset_mode(struct net_device *dev) | |||
133 | status = priv->read_reg(priv, REG_MOD); | 130 | status = priv->read_reg(priv, REG_MOD); |
134 | } | 131 | } |
135 | 132 | ||
136 | netdev_err(dev, "setting SJA1000 into reset mode failed!\n"); | 133 | dev_err(dev->dev.parent, "setting SJA1000 into reset mode failed!\n"); |
137 | } | 134 | } |
138 | 135 | ||
139 | static void set_normal_mode(struct net_device *dev) | 136 | static void set_normal_mode(struct net_device *dev) |
@@ -156,17 +153,12 @@ static void set_normal_mode(struct net_device *dev) | |||
156 | } | 153 | } |
157 | 154 | ||
158 | /* set chip to normal mode */ | 155 | /* set chip to normal mode */ |
159 | if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) | 156 | priv->write_reg(priv, REG_MOD, 0x00); |
160 | priv->write_reg(priv, REG_MOD, MOD_LOM); | ||
161 | else | ||
162 | priv->write_reg(priv, REG_MOD, 0x00); | ||
163 | |||
164 | udelay(10); | 157 | udelay(10); |
165 | |||
166 | status = priv->read_reg(priv, REG_MOD); | 158 | status = priv->read_reg(priv, REG_MOD); |
167 | } | 159 | } |
168 | 160 | ||
169 | netdev_err(dev, "setting SJA1000 into normal mode failed!\n"); | 161 | dev_err(dev->dev.parent, "setting SJA1000 into normal mode failed!\n"); |
170 | } | 162 | } |
171 | 163 | ||
172 | static void sja1000_start(struct net_device *dev) | 164 | static void sja1000_start(struct net_device *dev) |
@@ -188,6 +180,11 @@ static void sja1000_start(struct net_device *dev) | |||
188 | 180 | ||
189 | static int sja1000_set_mode(struct net_device *dev, enum can_mode mode) | 181 | static int sja1000_set_mode(struct net_device *dev, enum can_mode mode) |
190 | { | 182 | { |
183 | struct sja1000_priv *priv = netdev_priv(dev); | ||
184 | |||
185 | if (!priv->open_time) | ||
186 | return -EINVAL; | ||
187 | |||
191 | switch (mode) { | 188 | switch (mode) { |
192 | case CAN_MODE_START: | 189 | case CAN_MODE_START: |
193 | sja1000_start(dev); | 190 | sja1000_start(dev); |
@@ -214,7 +211,8 @@ static int sja1000_set_bittiming(struct net_device *dev) | |||
214 | if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) | 211 | if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) |
215 | btr1 |= 0x80; | 212 | btr1 |= 0x80; |
216 | 213 | ||
217 | netdev_info(dev, "setting BTR0=0x%02x BTR1=0x%02x\n", btr0, btr1); | 214 | dev_info(dev->dev.parent, |
215 | "setting BTR0=0x%02x BTR1=0x%02x\n", btr0, btr1); | ||
218 | 216 | ||
219 | priv->write_reg(priv, REG_BTR0, btr0); | 217 | priv->write_reg(priv, REG_BTR0, btr0); |
220 | priv->write_reg(priv, REG_BTR1, btr1); | 218 | priv->write_reg(priv, REG_BTR1, btr1); |
@@ -310,10 +308,7 @@ static netdev_tx_t sja1000_start_xmit(struct sk_buff *skb, | |||
310 | 308 | ||
311 | can_put_echo_skb(skb, dev, 0); | 309 | can_put_echo_skb(skb, dev, 0); |
312 | 310 | ||
313 | if (priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT) | 311 | sja1000_write_cmdreg(priv, CMD_TR); |
314 | sja1000_write_cmdreg(priv, CMD_TR | CMD_AT); | ||
315 | else | ||
316 | sja1000_write_cmdreg(priv, CMD_TR); | ||
317 | 312 | ||
318 | return NETDEV_TX_OK; | 313 | return NETDEV_TX_OK; |
319 | } | 314 | } |
@@ -385,7 +380,7 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status) | |||
385 | 380 | ||
386 | if (isrc & IRQ_DOI) { | 381 | if (isrc & IRQ_DOI) { |
387 | /* data overrun interrupt */ | 382 | /* data overrun interrupt */ |
388 | netdev_dbg(dev, "data overrun interrupt\n"); | 383 | dev_dbg(dev->dev.parent, "data overrun interrupt\n"); |
389 | cf->can_id |= CAN_ERR_CRTL; | 384 | cf->can_id |= CAN_ERR_CRTL; |
390 | cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; | 385 | cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; |
391 | stats->rx_over_errors++; | 386 | stats->rx_over_errors++; |
@@ -395,7 +390,7 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status) | |||
395 | 390 | ||
396 | if (isrc & IRQ_EI) { | 391 | if (isrc & IRQ_EI) { |
397 | /* error warning interrupt */ | 392 | /* error warning interrupt */ |
398 | netdev_dbg(dev, "error warning interrupt\n"); | 393 | dev_dbg(dev->dev.parent, "error warning interrupt\n"); |
399 | 394 | ||
400 | if (status & SR_BS) { | 395 | if (status & SR_BS) { |
401 | state = CAN_STATE_BUS_OFF; | 396 | state = CAN_STATE_BUS_OFF; |
@@ -436,7 +431,7 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status) | |||
436 | } | 431 | } |
437 | if (isrc & IRQ_EPI) { | 432 | if (isrc & IRQ_EPI) { |
438 | /* error passive interrupt */ | 433 | /* error passive interrupt */ |
439 | netdev_dbg(dev, "error passive interrupt\n"); | 434 | dev_dbg(dev->dev.parent, "error passive interrupt\n"); |
440 | if (status & SR_ES) | 435 | if (status & SR_ES) |
441 | state = CAN_STATE_ERROR_PASSIVE; | 436 | state = CAN_STATE_ERROR_PASSIVE; |
442 | else | 437 | else |
@@ -444,7 +439,7 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status) | |||
444 | } | 439 | } |
445 | if (isrc & IRQ_ALI) { | 440 | if (isrc & IRQ_ALI) { |
446 | /* arbitration lost interrupt */ | 441 | /* arbitration lost interrupt */ |
447 | netdev_dbg(dev, "arbitration lost interrupt\n"); | 442 | dev_dbg(dev->dev.parent, "arbitration lost interrupt\n"); |
448 | alc = priv->read_reg(priv, REG_ALC); | 443 | alc = priv->read_reg(priv, REG_ALC); |
449 | priv->can.can_stats.arbitration_lost++; | 444 | priv->can.can_stats.arbitration_lost++; |
450 | stats->tx_errors++; | 445 | stats->tx_errors++; |
@@ -500,26 +495,15 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id) | |||
500 | while ((isrc = priv->read_reg(priv, REG_IR)) && (n < SJA1000_MAX_IRQ)) { | 495 | while ((isrc = priv->read_reg(priv, REG_IR)) && (n < SJA1000_MAX_IRQ)) { |
501 | n++; | 496 | n++; |
502 | status = priv->read_reg(priv, REG_SR); | 497 | status = priv->read_reg(priv, REG_SR); |
503 | /* check for absent controller due to hw unplug */ | ||
504 | if (status == 0xFF && sja1000_is_absent(priv)) | ||
505 | return IRQ_NONE; | ||
506 | 498 | ||
507 | if (isrc & IRQ_WUI) | 499 | if (isrc & IRQ_WUI) |
508 | netdev_warn(dev, "wakeup interrupt\n"); | 500 | dev_warn(dev->dev.parent, "wakeup interrupt\n"); |
509 | 501 | ||
510 | if (isrc & IRQ_TI) { | 502 | if (isrc & IRQ_TI) { |
511 | /* transmission buffer released */ | 503 | /* transmission complete interrupt */ |
512 | if (priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT && | 504 | stats->tx_bytes += priv->read_reg(priv, REG_FI) & 0xf; |
513 | !(status & SR_TCS)) { | 505 | stats->tx_packets++; |
514 | stats->tx_errors++; | 506 | can_get_echo_skb(dev, 0); |
515 | can_free_echo_skb(dev, 0); | ||
516 | } else { | ||
517 | /* transmission complete */ | ||
518 | stats->tx_bytes += | ||
519 | priv->read_reg(priv, REG_FI) & 0xf; | ||
520 | stats->tx_packets++; | ||
521 | can_get_echo_skb(dev, 0); | ||
522 | } | ||
523 | netif_wake_queue(dev); | 507 | netif_wake_queue(dev); |
524 | } | 508 | } |
525 | if (isrc & IRQ_RI) { | 509 | if (isrc & IRQ_RI) { |
@@ -527,9 +511,6 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id) | |||
527 | while (status & SR_RBS) { | 511 | while (status & SR_RBS) { |
528 | sja1000_rx(dev); | 512 | sja1000_rx(dev); |
529 | status = priv->read_reg(priv, REG_SR); | 513 | status = priv->read_reg(priv, REG_SR); |
530 | /* check for absent controller */ | ||
531 | if (status == 0xFF && sja1000_is_absent(priv)) | ||
532 | return IRQ_NONE; | ||
533 | } | 514 | } |
534 | } | 515 | } |
535 | if (isrc & (IRQ_DOI | IRQ_EI | IRQ_BEI | IRQ_EPI | IRQ_ALI)) { | 516 | if (isrc & (IRQ_DOI | IRQ_EI | IRQ_BEI | IRQ_EPI | IRQ_ALI)) { |
@@ -543,7 +524,7 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id) | |||
543 | priv->post_irq(priv); | 524 | priv->post_irq(priv); |
544 | 525 | ||
545 | if (n >= SJA1000_MAX_IRQ) | 526 | if (n >= SJA1000_MAX_IRQ) |
546 | netdev_dbg(dev, "%d messages handled in ISR", n); | 527 | dev_dbg(dev->dev.parent, "%d messages handled in ISR", n); |
547 | 528 | ||
548 | return (n) ? IRQ_HANDLED : IRQ_NONE; | 529 | return (n) ? IRQ_HANDLED : IRQ_NONE; |
549 | } | 530 | } |
@@ -574,6 +555,7 @@ static int sja1000_open(struct net_device *dev) | |||
574 | 555 | ||
575 | /* init and start chi */ | 556 | /* init and start chi */ |
576 | sja1000_start(dev); | 557 | sja1000_start(dev); |
558 | priv->open_time = jiffies; | ||
577 | 559 | ||
578 | netif_start_queue(dev); | 560 | netif_start_queue(dev); |
579 | 561 | ||
@@ -592,6 +574,8 @@ static int sja1000_close(struct net_device *dev) | |||
592 | 574 | ||
593 | close_candev(dev); | 575 | close_candev(dev); |
594 | 576 | ||
577 | priv->open_time = 0; | ||
578 | |||
595 | return 0; | 579 | return 0; |
596 | } | 580 | } |
597 | 581 | ||
@@ -613,8 +597,7 @@ struct net_device *alloc_sja1000dev(int sizeof_priv) | |||
613 | priv->can.do_set_mode = sja1000_set_mode; | 597 | priv->can.do_set_mode = sja1000_set_mode; |
614 | priv->can.do_get_berr_counter = sja1000_get_berr_counter; | 598 | priv->can.do_get_berr_counter = sja1000_get_berr_counter; |
615 | priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | | 599 | priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | |
616 | CAN_CTRLMODE_BERR_REPORTING | CAN_CTRLMODE_LISTENONLY | | 600 | CAN_CTRLMODE_BERR_REPORTING; |
617 | CAN_CTRLMODE_ONE_SHOT; | ||
618 | 601 | ||
619 | spin_lock_init(&priv->cmdreg_lock); | 602 | spin_lock_init(&priv->cmdreg_lock); |
620 | 603 | ||
diff --git a/drivers/net/can/sja1000/sja1000.h b/drivers/net/can/sja1000/sja1000.h index afa99847a51..78bd4ecac14 100644 --- a/drivers/net/can/sja1000/sja1000.h +++ b/drivers/net/can/sja1000/sja1000.h | |||
@@ -40,6 +40,8 @@ | |||
40 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | 40 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH |
41 | * DAMAGE. | 41 | * DAMAGE. |
42 | * | 42 | * |
43 | * Send feedback to <socketcan-users@lists.berlios.de> | ||
44 | * | ||
43 | */ | 45 | */ |
44 | 46 | ||
45 | #ifndef SJA1000_DEV_H | 47 | #ifndef SJA1000_DEV_H |
@@ -152,6 +154,7 @@ | |||
152 | */ | 154 | */ |
153 | struct sja1000_priv { | 155 | struct sja1000_priv { |
154 | struct can_priv can; /* must be the first member */ | 156 | struct can_priv can; /* must be the first member */ |
157 | int open_time; | ||
155 | struct sk_buff *echo_skb; | 158 | struct sk_buff *echo_skb; |
156 | 159 | ||
157 | /* the lower-layer is responsible for appropriate locking */ | 160 | /* the lower-layer is responsible for appropriate locking */ |
diff --git a/drivers/net/can/sja1000/sja1000_isa.c b/drivers/net/can/sja1000/sja1000_isa.c index 5c8da466148..496223e9e2f 100644 --- a/drivers/net/can/sja1000/sja1000_isa.c +++ b/drivers/net/can/sja1000/sja1000_isa.c | |||
@@ -17,7 +17,7 @@ | |||
17 | 17 | ||
18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/platform_device.h> | 20 | #include <linux/isa.h> |
21 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
22 | #include <linux/netdevice.h> | 22 | #include <linux/netdevice.h> |
23 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
@@ -42,11 +42,11 @@ MODULE_LICENSE("GPL v2"); | |||
42 | 42 | ||
43 | static unsigned long port[MAXDEV]; | 43 | static unsigned long port[MAXDEV]; |
44 | static unsigned long mem[MAXDEV]; | 44 | static unsigned long mem[MAXDEV]; |
45 | static int irq[MAXDEV]; | 45 | static int __devinitdata irq[MAXDEV]; |
46 | static int clk[MAXDEV]; | 46 | static int __devinitdata clk[MAXDEV]; |
47 | static unsigned char cdr[MAXDEV] = {[0 ... (MAXDEV - 1)] = 0xff}; | 47 | static char __devinitdata cdr[MAXDEV] = {[0 ... (MAXDEV - 1)] = -1}; |
48 | static unsigned char ocr[MAXDEV] = {[0 ... (MAXDEV - 1)] = 0xff}; | 48 | static char __devinitdata ocr[MAXDEV] = {[0 ... (MAXDEV - 1)] = -1}; |
49 | static int indirect[MAXDEV] = {[0 ... (MAXDEV - 1)] = -1}; | 49 | static char __devinitdata indirect[MAXDEV] = {[0 ... (MAXDEV - 1)] = -1}; |
50 | 50 | ||
51 | module_param_array(port, ulong, NULL, S_IRUGO); | 51 | module_param_array(port, ulong, NULL, S_IRUGO); |
52 | MODULE_PARM_DESC(port, "I/O port number"); | 52 | MODULE_PARM_DESC(port, "I/O port number"); |
@@ -54,7 +54,7 @@ MODULE_PARM_DESC(port, "I/O port number"); | |||
54 | module_param_array(mem, ulong, NULL, S_IRUGO); | 54 | module_param_array(mem, ulong, NULL, S_IRUGO); |
55 | MODULE_PARM_DESC(mem, "I/O memory address"); | 55 | MODULE_PARM_DESC(mem, "I/O memory address"); |
56 | 56 | ||
57 | module_param_array(indirect, int, NULL, S_IRUGO); | 57 | module_param_array(indirect, byte, NULL, S_IRUGO); |
58 | MODULE_PARM_DESC(indirect, "Indirect access via address and data port"); | 58 | MODULE_PARM_DESC(indirect, "Indirect access via address and data port"); |
59 | 59 | ||
60 | module_param_array(irq, int, NULL, S_IRUGO); | 60 | module_param_array(irq, int, NULL, S_IRUGO); |
@@ -75,8 +75,6 @@ MODULE_PARM_DESC(ocr, "Output control register " | |||
75 | #define SJA1000_IOSIZE 0x20 | 75 | #define SJA1000_IOSIZE 0x20 |
76 | #define SJA1000_IOSIZE_INDIRECT 0x02 | 76 | #define SJA1000_IOSIZE_INDIRECT 0x02 |
77 | 77 | ||
78 | static struct platform_device *sja1000_isa_devs[MAXDEV]; | ||
79 | |||
80 | static u8 sja1000_isa_mem_read_reg(const struct sja1000_priv *priv, int reg) | 78 | static u8 sja1000_isa_mem_read_reg(const struct sja1000_priv *priv, int reg) |
81 | { | 79 | { |
82 | return readb(priv->reg_base + reg); | 80 | return readb(priv->reg_base + reg); |
@@ -117,18 +115,26 @@ static void sja1000_isa_port_write_reg_indirect(const struct sja1000_priv *priv, | |||
117 | outb(val, base + 1); | 115 | outb(val, base + 1); |
118 | } | 116 | } |
119 | 117 | ||
120 | static int sja1000_isa_probe(struct platform_device *pdev) | 118 | static int __devinit sja1000_isa_match(struct device *pdev, unsigned int idx) |
119 | { | ||
120 | if (port[idx] || mem[idx]) { | ||
121 | if (irq[idx]) | ||
122 | return 1; | ||
123 | } else if (idx) | ||
124 | return 0; | ||
125 | |||
126 | dev_err(pdev, "insufficient parameters supplied\n"); | ||
127 | return 0; | ||
128 | } | ||
129 | |||
130 | static int __devinit sja1000_isa_probe(struct device *pdev, unsigned int idx) | ||
121 | { | 131 | { |
122 | struct net_device *dev; | 132 | struct net_device *dev; |
123 | struct sja1000_priv *priv; | 133 | struct sja1000_priv *priv; |
124 | void __iomem *base = NULL; | 134 | void __iomem *base = NULL; |
125 | int iosize = SJA1000_IOSIZE; | 135 | int iosize = SJA1000_IOSIZE; |
126 | int idx = pdev->id; | ||
127 | int err; | 136 | int err; |
128 | 137 | ||
129 | dev_dbg(&pdev->dev, "probing idx=%d: port=%#lx, mem=%#lx, irq=%d\n", | ||
130 | idx, port[idx], mem[idx], irq[idx]); | ||
131 | |||
132 | if (mem[idx]) { | 138 | if (mem[idx]) { |
133 | if (!request_mem_region(mem[idx], iosize, DRV_NAME)) { | 139 | if (!request_mem_region(mem[idx], iosize, DRV_NAME)) { |
134 | err = -EBUSY; | 140 | err = -EBUSY; |
@@ -183,31 +189,31 @@ static int sja1000_isa_probe(struct platform_device *pdev) | |||
183 | else | 189 | else |
184 | priv->can.clock.freq = CLK_DEFAULT / 2; | 190 | priv->can.clock.freq = CLK_DEFAULT / 2; |
185 | 191 | ||
186 | if (ocr[idx] != 0xff) | 192 | if (ocr[idx] != -1) |
187 | priv->ocr = ocr[idx]; | 193 | priv->ocr = ocr[idx] & 0xff; |
188 | else if (ocr[0] != 0xff) | 194 | else if (ocr[0] != -1) |
189 | priv->ocr = ocr[0]; | 195 | priv->ocr = ocr[0] & 0xff; |
190 | else | 196 | else |
191 | priv->ocr = OCR_DEFAULT; | 197 | priv->ocr = OCR_DEFAULT; |
192 | 198 | ||
193 | if (cdr[idx] != 0xff) | 199 | if (cdr[idx] != -1) |
194 | priv->cdr = cdr[idx]; | 200 | priv->cdr = cdr[idx] & 0xff; |
195 | else if (cdr[0] != 0xff) | 201 | else if (cdr[0] != -1) |
196 | priv->cdr = cdr[0]; | 202 | priv->cdr = cdr[0] & 0xff; |
197 | else | 203 | else |
198 | priv->cdr = CDR_DEFAULT; | 204 | priv->cdr = CDR_DEFAULT; |
199 | 205 | ||
200 | dev_set_drvdata(&pdev->dev, dev); | 206 | dev_set_drvdata(pdev, dev); |
201 | SET_NETDEV_DEV(dev, &pdev->dev); | 207 | SET_NETDEV_DEV(dev, pdev); |
202 | 208 | ||
203 | err = register_sja1000dev(dev); | 209 | err = register_sja1000dev(dev); |
204 | if (err) { | 210 | if (err) { |
205 | dev_err(&pdev->dev, "registering %s failed (err=%d)\n", | 211 | dev_err(pdev, "registering %s failed (err=%d)\n", |
206 | DRV_NAME, err); | 212 | DRV_NAME, err); |
207 | goto exit_unmap; | 213 | goto exit_unmap; |
208 | } | 214 | } |
209 | 215 | ||
210 | dev_info(&pdev->dev, "%s device registered (reg_base=0x%p, irq=%d)\n", | 216 | dev_info(pdev, "%s device registered (reg_base=0x%p, irq=%d)\n", |
211 | DRV_NAME, priv->reg_base, dev->irq); | 217 | DRV_NAME, priv->reg_base, dev->irq); |
212 | return 0; | 218 | return 0; |
213 | 219 | ||
@@ -223,14 +229,13 @@ static int sja1000_isa_probe(struct platform_device *pdev) | |||
223 | return err; | 229 | return err; |
224 | } | 230 | } |
225 | 231 | ||
226 | static int sja1000_isa_remove(struct platform_device *pdev) | 232 | static int __devexit sja1000_isa_remove(struct device *pdev, unsigned int idx) |
227 | { | 233 | { |
228 | struct net_device *dev = dev_get_drvdata(&pdev->dev); | 234 | struct net_device *dev = dev_get_drvdata(pdev); |
229 | struct sja1000_priv *priv = netdev_priv(dev); | 235 | struct sja1000_priv *priv = netdev_priv(dev); |
230 | int idx = pdev->id; | ||
231 | 236 | ||
232 | unregister_sja1000dev(dev); | 237 | unregister_sja1000dev(dev); |
233 | dev_set_drvdata(&pdev->dev, NULL); | 238 | dev_set_drvdata(pdev, NULL); |
234 | 239 | ||
235 | if (mem[idx]) { | 240 | if (mem[idx]) { |
236 | iounmap(priv->reg_base); | 241 | iounmap(priv->reg_base); |
@@ -246,70 +251,29 @@ static int sja1000_isa_remove(struct platform_device *pdev) | |||
246 | return 0; | 251 | return 0; |
247 | } | 252 | } |
248 | 253 | ||
249 | static struct platform_driver sja1000_isa_driver = { | 254 | static struct isa_driver sja1000_isa_driver = { |
255 | .match = sja1000_isa_match, | ||
250 | .probe = sja1000_isa_probe, | 256 | .probe = sja1000_isa_probe, |
251 | .remove = sja1000_isa_remove, | 257 | .remove = __devexit_p(sja1000_isa_remove), |
252 | .driver = { | 258 | .driver = { |
253 | .name = DRV_NAME, | 259 | .name = DRV_NAME, |
254 | .owner = THIS_MODULE, | ||
255 | }, | 260 | }, |
256 | }; | 261 | }; |
257 | 262 | ||
258 | static int __init sja1000_isa_init(void) | 263 | static int __init sja1000_isa_init(void) |
259 | { | 264 | { |
260 | int idx, err; | 265 | int err = isa_register_driver(&sja1000_isa_driver, MAXDEV); |
261 | |||
262 | for (idx = 0; idx < MAXDEV; idx++) { | ||
263 | if ((port[idx] || mem[idx]) && irq[idx]) { | ||
264 | sja1000_isa_devs[idx] = | ||
265 | platform_device_alloc(DRV_NAME, idx); | ||
266 | if (!sja1000_isa_devs[idx]) { | ||
267 | err = -ENOMEM; | ||
268 | goto exit_free_devices; | ||
269 | } | ||
270 | err = platform_device_add(sja1000_isa_devs[idx]); | ||
271 | if (err) { | ||
272 | platform_device_put(sja1000_isa_devs[idx]); | ||
273 | goto exit_free_devices; | ||
274 | } | ||
275 | pr_debug("%s: platform device %d: port=%#lx, mem=%#lx, " | ||
276 | "irq=%d\n", | ||
277 | DRV_NAME, idx, port[idx], mem[idx], irq[idx]); | ||
278 | } else if (idx == 0 || port[idx] || mem[idx]) { | ||
279 | pr_err("%s: insufficient parameters supplied\n", | ||
280 | DRV_NAME); | ||
281 | err = -EINVAL; | ||
282 | goto exit_free_devices; | ||
283 | } | ||
284 | } | ||
285 | |||
286 | err = platform_driver_register(&sja1000_isa_driver); | ||
287 | if (err) | ||
288 | goto exit_free_devices; | ||
289 | |||
290 | pr_info("Legacy %s driver for max. %d devices registered\n", | ||
291 | DRV_NAME, MAXDEV); | ||
292 | |||
293 | return 0; | ||
294 | |||
295 | exit_free_devices: | ||
296 | while (--idx >= 0) { | ||
297 | if (sja1000_isa_devs[idx]) | ||
298 | platform_device_unregister(sja1000_isa_devs[idx]); | ||
299 | } | ||
300 | 266 | ||
267 | if (!err) | ||
268 | printk(KERN_INFO | ||
269 | "Legacy %s driver for max. %d devices registered\n", | ||
270 | DRV_NAME, MAXDEV); | ||
301 | return err; | 271 | return err; |
302 | } | 272 | } |
303 | 273 | ||
304 | static void __exit sja1000_isa_exit(void) | 274 | static void __exit sja1000_isa_exit(void) |
305 | { | 275 | { |
306 | int idx; | 276 | isa_unregister_driver(&sja1000_isa_driver); |
307 | |||
308 | platform_driver_unregister(&sja1000_isa_driver); | ||
309 | for (idx = 0; idx < MAXDEV; idx++) { | ||
310 | if (sja1000_isa_devs[idx]) | ||
311 | platform_device_unregister(sja1000_isa_devs[idx]); | ||
312 | } | ||
313 | } | 277 | } |
314 | 278 | ||
315 | module_init(sja1000_isa_init); | 279 | module_init(sja1000_isa_init); |
diff --git a/drivers/net/can/sja1000/sja1000_of_platform.c b/drivers/net/can/sja1000/sja1000_of_platform.c index 6433b81256c..cee6ba2b8b5 100644 --- a/drivers/net/can/sja1000/sja1000_of_platform.c +++ b/drivers/net/can/sja1000/sja1000_of_platform.c | |||
@@ -29,7 +29,7 @@ | |||
29 | * nxp,external-clock-frequency = <16000000>; | 29 | * nxp,external-clock-frequency = <16000000>; |
30 | * }; | 30 | * }; |
31 | * | 31 | * |
32 | * See "Documentation/devicetree/bindings/net/can/sja1000.txt" for further | 32 | * See "Documentation/powerpc/dts-bindings/can/sja1000.txt" for further |
33 | * information. | 33 | * information. |
34 | */ | 34 | */ |
35 | 35 | ||
@@ -42,8 +42,6 @@ | |||
42 | #include <linux/can/dev.h> | 42 | #include <linux/can/dev.h> |
43 | 43 | ||
44 | #include <linux/of_platform.h> | 44 | #include <linux/of_platform.h> |
45 | #include <linux/of_address.h> | ||
46 | #include <linux/of_irq.h> | ||
47 | #include <asm/prom.h> | 45 | #include <asm/prom.h> |
48 | 46 | ||
49 | #include "sja1000.h" | 47 | #include "sja1000.h" |
@@ -61,16 +59,16 @@ MODULE_LICENSE("GPL v2"); | |||
61 | 59 | ||
62 | static u8 sja1000_ofp_read_reg(const struct sja1000_priv *priv, int reg) | 60 | static u8 sja1000_ofp_read_reg(const struct sja1000_priv *priv, int reg) |
63 | { | 61 | { |
64 | return ioread8(priv->reg_base + reg); | 62 | return in_8(priv->reg_base + reg); |
65 | } | 63 | } |
66 | 64 | ||
67 | static void sja1000_ofp_write_reg(const struct sja1000_priv *priv, | 65 | static void sja1000_ofp_write_reg(const struct sja1000_priv *priv, |
68 | int reg, u8 val) | 66 | int reg, u8 val) |
69 | { | 67 | { |
70 | iowrite8(val, priv->reg_base + reg); | 68 | out_8(priv->reg_base + reg, val); |
71 | } | 69 | } |
72 | 70 | ||
73 | static int sja1000_ofp_remove(struct platform_device *ofdev) | 71 | static int __devexit sja1000_ofp_remove(struct platform_device *ofdev) |
74 | { | 72 | { |
75 | struct net_device *dev = dev_get_drvdata(&ofdev->dev); | 73 | struct net_device *dev = dev_get_drvdata(&ofdev->dev); |
76 | struct sja1000_priv *priv = netdev_priv(dev); | 74 | struct sja1000_priv *priv = netdev_priv(dev); |
@@ -90,7 +88,7 @@ static int sja1000_ofp_remove(struct platform_device *ofdev) | |||
90 | return 0; | 88 | return 0; |
91 | } | 89 | } |
92 | 90 | ||
93 | static int sja1000_ofp_probe(struct platform_device *ofdev) | 91 | static int __devinit sja1000_ofp_probe(struct platform_device *ofdev) |
94 | { | 92 | { |
95 | struct device_node *np = ofdev->dev.of_node; | 93 | struct device_node *np = ofdev->dev.of_node; |
96 | struct net_device *dev; | 94 | struct net_device *dev; |
@@ -121,7 +119,7 @@ static int sja1000_ofp_probe(struct platform_device *ofdev) | |||
121 | } | 119 | } |
122 | 120 | ||
123 | irq = irq_of_parse_and_map(np, 0); | 121 | irq = irq_of_parse_and_map(np, 0); |
124 | if (irq == 0) { | 122 | if (irq == NO_IRQ) { |
125 | dev_err(&ofdev->dev, "no irq found\n"); | 123 | dev_err(&ofdev->dev, "no irq found\n"); |
126 | err = -ENODEV; | 124 | err = -ENODEV; |
127 | goto exit_unmap_mem; | 125 | goto exit_unmap_mem; |
@@ -206,7 +204,7 @@ exit_release_mem: | |||
206 | return err; | 204 | return err; |
207 | } | 205 | } |
208 | 206 | ||
209 | static struct of_device_id sja1000_ofp_table[] = { | 207 | static struct of_device_id __devinitdata sja1000_ofp_table[] = { |
210 | {.compatible = "nxp,sja1000"}, | 208 | {.compatible = "nxp,sja1000"}, |
211 | {}, | 209 | {}, |
212 | }; | 210 | }; |
@@ -219,7 +217,17 @@ static struct platform_driver sja1000_ofp_driver = { | |||
219 | .of_match_table = sja1000_ofp_table, | 217 | .of_match_table = sja1000_ofp_table, |
220 | }, | 218 | }, |
221 | .probe = sja1000_ofp_probe, | 219 | .probe = sja1000_ofp_probe, |
222 | .remove = sja1000_ofp_remove, | 220 | .remove = __devexit_p(sja1000_ofp_remove), |
223 | }; | 221 | }; |
224 | 222 | ||
225 | module_platform_driver(sja1000_ofp_driver); | 223 | static int __init sja1000_ofp_init(void) |
224 | { | ||
225 | return platform_driver_register(&sja1000_ofp_driver); | ||
226 | } | ||
227 | module_init(sja1000_ofp_init); | ||
228 | |||
229 | static void __exit sja1000_ofp_exit(void) | ||
230 | { | ||
231 | return platform_driver_unregister(&sja1000_ofp_driver); | ||
232 | }; | ||
233 | module_exit(sja1000_ofp_exit); | ||
diff --git a/drivers/net/can/sja1000/sja1000_platform.c b/drivers/net/can/sja1000/sja1000_platform.c index 21619bb5b86..d9fadc489b3 100644 --- a/drivers/net/can/sja1000/sja1000_platform.c +++ b/drivers/net/can/sja1000/sja1000_platform.c | |||
@@ -34,7 +34,6 @@ | |||
34 | 34 | ||
35 | MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>"); | 35 | MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>"); |
36 | MODULE_DESCRIPTION("Socket-CAN driver for SJA1000 on the platform bus"); | 36 | MODULE_DESCRIPTION("Socket-CAN driver for SJA1000 on the platform bus"); |
37 | MODULE_ALIAS("platform:" DRV_NAME); | ||
38 | MODULE_LICENSE("GPL v2"); | 37 | MODULE_LICENSE("GPL v2"); |
39 | 38 | ||
40 | static u8 sp_read_reg8(const struct sja1000_priv *priv, int reg) | 39 | static u8 sp_read_reg8(const struct sja1000_priv *priv, int reg) |
@@ -110,9 +109,7 @@ static int sp_probe(struct platform_device *pdev) | |||
110 | priv = netdev_priv(dev); | 109 | priv = netdev_priv(dev); |
111 | 110 | ||
112 | dev->irq = res_irq->start; | 111 | dev->irq = res_irq->start; |
113 | priv->irq_flags = res_irq->flags & IRQF_TRIGGER_MASK; | 112 | priv->irq_flags = res_irq->flags & (IRQF_TRIGGER_MASK | IRQF_SHARED); |
114 | if (res_irq->flags & IORESOURCE_IRQ_SHAREABLE) | ||
115 | priv->irq_flags |= IRQF_SHARED; | ||
116 | priv->reg_base = addr; | 113 | priv->reg_base = addr; |
117 | /* The CAN clock frequency is half the oscillator clock frequency */ | 114 | /* The CAN clock frequency is half the oscillator clock frequency */ |
118 | priv->can.clock.freq = pdata->osc_freq / 2; | 115 | priv->can.clock.freq = pdata->osc_freq / 2; |
@@ -188,4 +185,15 @@ static struct platform_driver sp_driver = { | |||
188 | }, | 185 | }, |
189 | }; | 186 | }; |
190 | 187 | ||
191 | module_platform_driver(sp_driver); | 188 | static int __init sp_init(void) |
189 | { | ||
190 | return platform_driver_register(&sp_driver); | ||
191 | } | ||
192 | |||
193 | static void __exit sp_exit(void) | ||
194 | { | ||
195 | platform_driver_unregister(&sp_driver); | ||
196 | } | ||
197 | |||
198 | module_init(sp_init); | ||
199 | module_exit(sp_exit); | ||
diff --git a/drivers/net/can/sja1000/tscan1.c b/drivers/net/can/sja1000/tscan1.c index 76513dd780c..9756099a883 100644 --- a/drivers/net/can/sja1000/tscan1.c +++ b/drivers/net/can/sja1000/tscan1.c | |||
@@ -71,7 +71,7 @@ MODULE_LICENSE("GPL"); | |||
71 | #define TSCAN1_SJA1000_XTAL 16000000 | 71 | #define TSCAN1_SJA1000_XTAL 16000000 |
72 | 72 | ||
73 | /* SJA1000 IO base addresses */ | 73 | /* SJA1000 IO base addresses */ |
74 | static const unsigned short tscan1_sja1000_addresses[] = { | 74 | static const unsigned short tscan1_sja1000_addresses[] __devinitconst = { |
75 | 0x100, 0x120, 0x180, 0x1a0, 0x200, 0x240, 0x280, 0x320 | 75 | 0x100, 0x120, 0x180, 0x1a0, 0x200, 0x240, 0x280, 0x320 |
76 | }; | 76 | }; |
77 | 77 | ||
@@ -88,7 +88,7 @@ static void tscan1_write(const struct sja1000_priv *priv, int reg, u8 val) | |||
88 | } | 88 | } |
89 | 89 | ||
90 | /* Probe for a TS-CAN1 board with JP2:JP1 jumper setting ID */ | 90 | /* Probe for a TS-CAN1 board with JP2:JP1 jumper setting ID */ |
91 | static int tscan1_probe(struct device *dev, unsigned id) | 91 | static int __devinit tscan1_probe(struct device *dev, unsigned id) |
92 | { | 92 | { |
93 | struct net_device *netdev; | 93 | struct net_device *netdev; |
94 | struct sja1000_priv *priv; | 94 | struct sja1000_priv *priv; |
@@ -171,7 +171,7 @@ static int tscan1_probe(struct device *dev, unsigned id) | |||
171 | return -ENXIO; | 171 | return -ENXIO; |
172 | } | 172 | } |
173 | 173 | ||
174 | static int tscan1_remove(struct device *dev, unsigned id /*unused*/) | 174 | static int __devexit tscan1_remove(struct device *dev, unsigned id /*unused*/) |
175 | { | 175 | { |
176 | struct net_device *netdev; | 176 | struct net_device *netdev; |
177 | struct sja1000_priv *priv; | 177 | struct sja1000_priv *priv; |
@@ -197,7 +197,7 @@ static int tscan1_remove(struct device *dev, unsigned id /*unused*/) | |||
197 | 197 | ||
198 | static struct isa_driver tscan1_isa_driver = { | 198 | static struct isa_driver tscan1_isa_driver = { |
199 | .probe = tscan1_probe, | 199 | .probe = tscan1_probe, |
200 | .remove = tscan1_remove, | 200 | .remove = __devexit_p(tscan1_remove), |
201 | .driver = { | 201 | .driver = { |
202 | .name = "tscan1", | 202 | .name = "tscan1", |
203 | }, | 203 | }, |
diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index adc3708d882..4b70b7e8bde 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * slcan.c - serial line CAN interface driver (using tty line discipline) | 2 | * slcan.c - serial line CAN interface driver (using tty line discipline) |
3 | * | 3 | * |
4 | * This file is derived from linux/drivers/net/slip/slip.c | 4 | * This file is derived from linux/drivers/net/slip.c |
5 | * | 5 | * |
6 | * slip.c Authors : Laurence Culhane <loz@holmes.demon.co.uk> | 6 | * slip.c Authors : Laurence Culhane <loz@holmes.demon.co.uk> |
7 | * Fred N. van Kempen <waltje@uwalt.nl.mugnet.org> | 7 | * Fred N. van Kempen <waltje@uwalt.nl.mugnet.org> |
@@ -35,11 +35,14 @@ | |||
35 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | 35 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH |
36 | * DAMAGE. | 36 | * DAMAGE. |
37 | * | 37 | * |
38 | * Send feedback to <socketcan-users@lists.berlios.de> | ||
39 | * | ||
38 | */ | 40 | */ |
39 | 41 | ||
40 | #include <linux/module.h> | 42 | #include <linux/module.h> |
41 | #include <linux/moduleparam.h> | 43 | #include <linux/moduleparam.h> |
42 | 44 | ||
45 | #include <asm/system.h> | ||
43 | #include <linux/uaccess.h> | 46 | #include <linux/uaccess.h> |
44 | #include <linux/bitops.h> | 47 | #include <linux/bitops.h> |
45 | #include <linux/string.h> | 48 | #include <linux/string.h> |
@@ -56,7 +59,7 @@ | |||
56 | #include <linux/kernel.h> | 59 | #include <linux/kernel.h> |
57 | #include <linux/can.h> | 60 | #include <linux/can.h> |
58 | 61 | ||
59 | static __initconst const char banner[] = | 62 | static __initdata const char banner[] = |
60 | KERN_INFO "slcan: serial line CAN interface driver\n"; | 63 | KERN_INFO "slcan: serial line CAN interface driver\n"; |
61 | 64 | ||
62 | MODULE_ALIAS_LDISC(N_SLCAN); | 65 | MODULE_ALIAS_LDISC(N_SLCAN); |
@@ -386,7 +389,7 @@ static void slc_setup(struct net_device *dev) | |||
386 | 389 | ||
387 | /* New-style flags. */ | 390 | /* New-style flags. */ |
388 | dev->flags = IFF_NOARP; | 391 | dev->flags = IFF_NOARP; |
389 | dev->features = NETIF_F_HW_CSUM; | 392 | dev->features = NETIF_F_NO_CSUM; |
390 | } | 393 | } |
391 | 394 | ||
392 | /****************************************** | 395 | /****************************************** |
@@ -638,8 +641,10 @@ static int __init slcan_init(void) | |||
638 | printk(KERN_INFO "slcan: %d dynamic interface channels.\n", maxdev); | 641 | printk(KERN_INFO "slcan: %d dynamic interface channels.\n", maxdev); |
639 | 642 | ||
640 | slcan_devs = kzalloc(sizeof(struct net_device *)*maxdev, GFP_KERNEL); | 643 | slcan_devs = kzalloc(sizeof(struct net_device *)*maxdev, GFP_KERNEL); |
641 | if (!slcan_devs) | 644 | if (!slcan_devs) { |
645 | printk(KERN_ERR "slcan: can't allocate slcan device array!\n"); | ||
642 | return -ENOMEM; | 646 | return -ENOMEM; |
647 | } | ||
643 | 648 | ||
644 | /* Fill in our line protocol discipline, and register it */ | 649 | /* Fill in our line protocol discipline, and register it */ |
645 | status = tty_register_ldisc(N_SLCAN, &slc_ldisc); | 650 | status = tty_register_ldisc(N_SLCAN, &slc_ldisc); |
diff --git a/drivers/net/can/softing/softing_cs.c b/drivers/net/can/softing/softing_cs.c index c2c0a5bb0b2..c0e1b1eb87a 100644 --- a/drivers/net/can/softing/softing_cs.c +++ b/drivers/net/can/softing/softing_cs.c | |||
@@ -159,7 +159,7 @@ MODULE_FIRMWARE(fw_dir "bcard2.bin"); | |||
159 | MODULE_FIRMWARE(fw_dir "ldcard2.bin"); | 159 | MODULE_FIRMWARE(fw_dir "ldcard2.bin"); |
160 | MODULE_FIRMWARE(fw_dir "cancrd2.bin"); | 160 | MODULE_FIRMWARE(fw_dir "cancrd2.bin"); |
161 | 161 | ||
162 | static const struct softing_platform_data | 162 | static __devinit const struct softing_platform_data |
163 | *softingcs_find_platform_data(unsigned int manf, unsigned int prod) | 163 | *softingcs_find_platform_data(unsigned int manf, unsigned int prod) |
164 | { | 164 | { |
165 | const struct softing_platform_data *lp; | 165 | const struct softing_platform_data *lp; |
@@ -193,7 +193,8 @@ static int softingcs_enable_irq(struct platform_device *pdev, int v) | |||
193 | /* | 193 | /* |
194 | * pcmcia check | 194 | * pcmcia check |
195 | */ | 195 | */ |
196 | static int softingcs_probe_config(struct pcmcia_device *pcmcia, void *priv_data) | 196 | static __devinit int softingcs_probe_config(struct pcmcia_device *pcmcia, |
197 | void *priv_data) | ||
197 | { | 198 | { |
198 | struct softing_platform_data *pdat = priv_data; | 199 | struct softing_platform_data *pdat = priv_data; |
199 | struct resource *pres; | 200 | struct resource *pres; |
@@ -214,7 +215,7 @@ static int softingcs_probe_config(struct pcmcia_device *pcmcia, void *priv_data) | |||
214 | return pcmcia_request_window(pcmcia, pres, memspeed); | 215 | return pcmcia_request_window(pcmcia, pres, memspeed); |
215 | } | 216 | } |
216 | 217 | ||
217 | static void softingcs_remove(struct pcmcia_device *pcmcia) | 218 | static __devexit void softingcs_remove(struct pcmcia_device *pcmcia) |
218 | { | 219 | { |
219 | struct platform_device *pdev = pcmcia->priv; | 220 | struct platform_device *pdev = pcmcia->priv; |
220 | 221 | ||
@@ -234,7 +235,7 @@ static void softingcs_pdev_release(struct device *dev) | |||
234 | kfree(pdev); | 235 | kfree(pdev); |
235 | } | 236 | } |
236 | 237 | ||
237 | static int softingcs_probe(struct pcmcia_device *pcmcia) | 238 | static __devinit int softingcs_probe(struct pcmcia_device *pcmcia) |
238 | { | 239 | { |
239 | int ret; | 240 | int ret; |
240 | struct platform_device *pdev; | 241 | struct platform_device *pdev; |
@@ -337,7 +338,7 @@ static struct pcmcia_driver softingcs_driver = { | |||
337 | .name = "softingcs", | 338 | .name = "softingcs", |
338 | .id_table = softingcs_ids, | 339 | .id_table = softingcs_ids, |
339 | .probe = softingcs_probe, | 340 | .probe = softingcs_probe, |
340 | .remove = softingcs_remove, | 341 | .remove = __devexit_p(softingcs_remove), |
341 | }; | 342 | }; |
342 | 343 | ||
343 | static int __init softingcs_start(void) | 344 | static int __init softingcs_start(void) |
diff --git a/drivers/net/can/softing/softing_fw.c b/drivers/net/can/softing/softing_fw.c index b595d3422b9..31059617567 100644 --- a/drivers/net/can/softing/softing_fw.c +++ b/drivers/net/can/softing/softing_fw.c | |||
@@ -150,7 +150,7 @@ int softing_load_fw(const char *file, struct softing *card, | |||
150 | const uint8_t *mem, *end, *dat; | 150 | const uint8_t *mem, *end, *dat; |
151 | uint16_t type, len; | 151 | uint16_t type, len; |
152 | uint32_t addr; | 152 | uint32_t addr; |
153 | uint8_t *buf = NULL, *new_buf; | 153 | uint8_t *buf = NULL; |
154 | int buflen = 0; | 154 | int buflen = 0; |
155 | int8_t type_end = 0; | 155 | int8_t type_end = 0; |
156 | 156 | ||
@@ -199,12 +199,11 @@ int softing_load_fw(const char *file, struct softing *card, | |||
199 | if (len > buflen) { | 199 | if (len > buflen) { |
200 | /* align buflen */ | 200 | /* align buflen */ |
201 | buflen = (len + (1024-1)) & ~(1024-1); | 201 | buflen = (len + (1024-1)) & ~(1024-1); |
202 | new_buf = krealloc(buf, buflen, GFP_KERNEL); | 202 | buf = krealloc(buf, buflen, GFP_KERNEL); |
203 | if (!new_buf) { | 203 | if (!buf) { |
204 | ret = -ENOMEM; | 204 | ret = -ENOMEM; |
205 | goto failed; | 205 | goto failed; |
206 | } | 206 | } |
207 | buf = new_buf; | ||
208 | } | 207 | } |
209 | /* verify record data */ | 208 | /* verify record data */ |
210 | memcpy_fromio(buf, &dpram[addr + offset], len); | 209 | memcpy_fromio(buf, &dpram[addr + offset], len); |
diff --git a/drivers/net/can/softing/softing_main.c b/drivers/net/can/softing/softing_main.c index 3a2b45601ec..09a8b86cf1a 100644 --- a/drivers/net/can/softing/softing_main.c +++ b/drivers/net/can/softing/softing_main.c | |||
@@ -478,7 +478,7 @@ static void softing_card_shutdown(struct softing *card) | |||
478 | mutex_unlock(&card->fw.lock); | 478 | mutex_unlock(&card->fw.lock); |
479 | } | 479 | } |
480 | 480 | ||
481 | static int softing_card_boot(struct softing *card) | 481 | static __devinit int softing_card_boot(struct softing *card) |
482 | { | 482 | { |
483 | int ret, j; | 483 | int ret, j; |
484 | static const uint8_t stream[] = { | 484 | static const uint8_t stream[] = { |
@@ -645,8 +645,8 @@ static const struct can_bittiming_const softing_btr_const = { | |||
645 | }; | 645 | }; |
646 | 646 | ||
647 | 647 | ||
648 | static struct net_device *softing_netdev_create(struct softing *card, | 648 | static __devinit struct net_device *softing_netdev_create(struct softing *card, |
649 | uint16_t chip_id) | 649 | uint16_t chip_id) |
650 | { | 650 | { |
651 | struct net_device *netdev; | 651 | struct net_device *netdev; |
652 | struct softing_priv *priv; | 652 | struct softing_priv *priv; |
@@ -676,7 +676,7 @@ static struct net_device *softing_netdev_create(struct softing *card, | |||
676 | return netdev; | 676 | return netdev; |
677 | } | 677 | } |
678 | 678 | ||
679 | static int softing_netdev_register(struct net_device *netdev) | 679 | static __devinit int softing_netdev_register(struct net_device *netdev) |
680 | { | 680 | { |
681 | int ret; | 681 | int ret; |
682 | 682 | ||
@@ -745,7 +745,7 @@ static const struct attribute_group softing_pdev_group = { | |||
745 | /* | 745 | /* |
746 | * platform driver | 746 | * platform driver |
747 | */ | 747 | */ |
748 | static int softing_pdev_remove(struct platform_device *pdev) | 748 | static __devexit int softing_pdev_remove(struct platform_device *pdev) |
749 | { | 749 | { |
750 | struct softing *card = platform_get_drvdata(pdev); | 750 | struct softing *card = platform_get_drvdata(pdev); |
751 | int j; | 751 | int j; |
@@ -766,7 +766,7 @@ static int softing_pdev_remove(struct platform_device *pdev) | |||
766 | return 0; | 766 | return 0; |
767 | } | 767 | } |
768 | 768 | ||
769 | static int softing_pdev_probe(struct platform_device *pdev) | 769 | static __devinit int softing_pdev_probe(struct platform_device *pdev) |
770 | { | 770 | { |
771 | const struct softing_platform_data *pdat = pdev->dev.platform_data; | 771 | const struct softing_platform_data *pdat = pdev->dev.platform_data; |
772 | struct softing *card; | 772 | struct softing *card; |
@@ -826,12 +826,12 @@ static int softing_pdev_probe(struct platform_device *pdev) | |||
826 | goto sysfs_failed; | 826 | goto sysfs_failed; |
827 | } | 827 | } |
828 | 828 | ||
829 | ret = -ENOMEM; | ||
829 | for (j = 0; j < ARRAY_SIZE(card->net); ++j) { | 830 | for (j = 0; j < ARRAY_SIZE(card->net); ++j) { |
830 | card->net[j] = netdev = | 831 | card->net[j] = netdev = |
831 | softing_netdev_create(card, card->id.chip[j]); | 832 | softing_netdev_create(card, card->id.chip[j]); |
832 | if (!netdev) { | 833 | if (!netdev) { |
833 | dev_alert(&pdev->dev, "failed to make can[%i]", j); | 834 | dev_alert(&pdev->dev, "failed to make can[%i]", j); |
834 | ret = -ENOMEM; | ||
835 | goto netdev_failed; | 835 | goto netdev_failed; |
836 | } | 836 | } |
837 | priv = netdev_priv(card->net[j]); | 837 | priv = netdev_priv(card->net[j]); |
@@ -871,12 +871,24 @@ static struct platform_driver softing_driver = { | |||
871 | .owner = THIS_MODULE, | 871 | .owner = THIS_MODULE, |
872 | }, | 872 | }, |
873 | .probe = softing_pdev_probe, | 873 | .probe = softing_pdev_probe, |
874 | .remove = softing_pdev_remove, | 874 | .remove = __devexit_p(softing_pdev_remove), |
875 | }; | 875 | }; |
876 | 876 | ||
877 | module_platform_driver(softing_driver); | ||
878 | |||
879 | MODULE_ALIAS("platform:softing"); | 877 | MODULE_ALIAS("platform:softing"); |
878 | |||
879 | static int __init softing_start(void) | ||
880 | { | ||
881 | return platform_driver_register(&softing_driver); | ||
882 | } | ||
883 | |||
884 | static void __exit softing_stop(void) | ||
885 | { | ||
886 | platform_driver_unregister(&softing_driver); | ||
887 | } | ||
888 | |||
889 | module_init(softing_start); | ||
890 | module_exit(softing_stop); | ||
891 | |||
880 | MODULE_DESCRIPTION("Softing DPRAM CAN driver"); | 892 | MODULE_DESCRIPTION("Softing DPRAM CAN driver"); |
881 | MODULE_AUTHOR("Kurt Van Dijck <kurt.van.dijck@eia.be>"); | 893 | MODULE_AUTHOR("Kurt Van Dijck <kurt.van.dijck@eia.be>"); |
882 | MODULE_LICENSE("GPL v2"); | 894 | MODULE_LICENSE("GPL v2"); |
diff --git a/drivers/net/can/ti_hecc.c b/drivers/net/can/ti_hecc.c index f898c636372..2adc294f512 100644 --- a/drivers/net/can/ti_hecc.c +++ b/drivers/net/can/ti_hecc.c | |||
@@ -196,7 +196,7 @@ MODULE_VERSION(HECC_MODULE_VERSION); | |||
196 | #define HECC_CANGIM_SIL BIT(2) /* system interrupts to int line 1 */ | 196 | #define HECC_CANGIM_SIL BIT(2) /* system interrupts to int line 1 */ |
197 | 197 | ||
198 | /* CAN Bittiming constants as per HECC specs */ | 198 | /* CAN Bittiming constants as per HECC specs */ |
199 | static const struct can_bittiming_const ti_hecc_bittiming_const = { | 199 | static struct can_bittiming_const ti_hecc_bittiming_const = { |
200 | .name = DRV_NAME, | 200 | .name = DRV_NAME, |
201 | .tseg1_min = 1, | 201 | .tseg1_min = 1, |
202 | .tseg1_max = 16, | 202 | .tseg1_max = 16, |
@@ -306,7 +306,7 @@ static int ti_hecc_set_btc(struct ti_hecc_priv *priv) | |||
306 | if (bit_timing->brp > 4) | 306 | if (bit_timing->brp > 4) |
307 | can_btc |= HECC_CANBTC_SAM; | 307 | can_btc |= HECC_CANBTC_SAM; |
308 | else | 308 | else |
309 | netdev_warn(priv->ndev, "WARN: Triple" | 309 | dev_warn(priv->ndev->dev.parent, "WARN: Triple" \ |
310 | "sampling not set due to h/w limitations"); | 310 | "sampling not set due to h/w limitations"); |
311 | } | 311 | } |
312 | can_btc |= ((bit_timing->sjw - 1) & 0x3) << 8; | 312 | can_btc |= ((bit_timing->sjw - 1) & 0x3) << 8; |
@@ -315,7 +315,7 @@ static int ti_hecc_set_btc(struct ti_hecc_priv *priv) | |||
315 | /* ERM being set to 0 by default meaning resync at falling edge */ | 315 | /* ERM being set to 0 by default meaning resync at falling edge */ |
316 | 316 | ||
317 | hecc_write(priv, HECC_CANBTC, can_btc); | 317 | hecc_write(priv, HECC_CANBTC, can_btc); |
318 | netdev_info(priv->ndev, "setting CANBTC=%#x\n", can_btc); | 318 | dev_info(priv->ndev->dev.parent, "setting CANBTC=%#x\n", can_btc); |
319 | 319 | ||
320 | return 0; | 320 | return 0; |
321 | } | 321 | } |
@@ -332,7 +332,7 @@ static void ti_hecc_reset(struct net_device *ndev) | |||
332 | u32 cnt; | 332 | u32 cnt; |
333 | struct ti_hecc_priv *priv = netdev_priv(ndev); | 333 | struct ti_hecc_priv *priv = netdev_priv(ndev); |
334 | 334 | ||
335 | netdev_dbg(ndev, "resetting hecc ...\n"); | 335 | dev_dbg(ndev->dev.parent, "resetting hecc ...\n"); |
336 | hecc_set_bit(priv, HECC_CANMC, HECC_CANMC_SRES); | 336 | hecc_set_bit(priv, HECC_CANMC, HECC_CANMC_SRES); |
337 | 337 | ||
338 | /* Set change control request and wait till enabled */ | 338 | /* Set change control request and wait till enabled */ |
@@ -458,17 +458,6 @@ static int ti_hecc_do_set_mode(struct net_device *ndev, enum can_mode mode) | |||
458 | return ret; | 458 | return ret; |
459 | } | 459 | } |
460 | 460 | ||
461 | static int ti_hecc_get_berr_counter(const struct net_device *ndev, | ||
462 | struct can_berr_counter *bec) | ||
463 | { | ||
464 | struct ti_hecc_priv *priv = netdev_priv(ndev); | ||
465 | |||
466 | bec->txerr = hecc_read(priv, HECC_CANTEC); | ||
467 | bec->rxerr = hecc_read(priv, HECC_CANREC); | ||
468 | |||
469 | return 0; | ||
470 | } | ||
471 | |||
472 | /* | 461 | /* |
473 | * ti_hecc_xmit: HECC Transmit | 462 | * ti_hecc_xmit: HECC Transmit |
474 | * | 463 | * |
@@ -507,7 +496,7 @@ static netdev_tx_t ti_hecc_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
507 | if (unlikely(hecc_read(priv, HECC_CANME) & mbx_mask)) { | 496 | if (unlikely(hecc_read(priv, HECC_CANME) & mbx_mask)) { |
508 | spin_unlock_irqrestore(&priv->mbx_lock, flags); | 497 | spin_unlock_irqrestore(&priv->mbx_lock, flags); |
509 | netif_stop_queue(ndev); | 498 | netif_stop_queue(ndev); |
510 | netdev_err(priv->ndev, | 499 | dev_err(priv->ndev->dev.parent, |
511 | "BUG: TX mbx not ready tx_head=%08X, tx_tail=%08X\n", | 500 | "BUG: TX mbx not ready tx_head=%08X, tx_tail=%08X\n", |
512 | priv->tx_head, priv->tx_tail); | 501 | priv->tx_head, priv->tx_tail); |
513 | return NETDEV_TX_BUSY; | 502 | return NETDEV_TX_BUSY; |
@@ -561,7 +550,7 @@ static int ti_hecc_rx_pkt(struct ti_hecc_priv *priv, int mbxno) | |||
561 | skb = alloc_can_skb(priv->ndev, &cf); | 550 | skb = alloc_can_skb(priv->ndev, &cf); |
562 | if (!skb) { | 551 | if (!skb) { |
563 | if (printk_ratelimit()) | 552 | if (printk_ratelimit()) |
564 | netdev_err(priv->ndev, | 553 | dev_err(priv->ndev->dev.parent, |
565 | "ti_hecc_rx_pkt: alloc_can_skb() failed\n"); | 554 | "ti_hecc_rx_pkt: alloc_can_skb() failed\n"); |
566 | return -ENOMEM; | 555 | return -ENOMEM; |
567 | } | 556 | } |
@@ -679,7 +668,7 @@ static int ti_hecc_error(struct net_device *ndev, int int_status, | |||
679 | skb = alloc_can_err_skb(ndev, &cf); | 668 | skb = alloc_can_err_skb(ndev, &cf); |
680 | if (!skb) { | 669 | if (!skb) { |
681 | if (printk_ratelimit()) | 670 | if (printk_ratelimit()) |
682 | netdev_err(priv->ndev, | 671 | dev_err(priv->ndev->dev.parent, |
683 | "ti_hecc_error: alloc_can_err_skb() failed\n"); | 672 | "ti_hecc_error: alloc_can_err_skb() failed\n"); |
684 | return -ENOMEM; | 673 | return -ENOMEM; |
685 | } | 674 | } |
@@ -695,7 +684,7 @@ static int ti_hecc_error(struct net_device *ndev, int int_status, | |||
695 | cf->data[1] |= CAN_ERR_CRTL_RX_WARNING; | 684 | cf->data[1] |= CAN_ERR_CRTL_RX_WARNING; |
696 | } | 685 | } |
697 | hecc_set_bit(priv, HECC_CANES, HECC_CANES_EW); | 686 | hecc_set_bit(priv, HECC_CANES, HECC_CANES_EW); |
698 | netdev_dbg(priv->ndev, "Error Warning interrupt\n"); | 687 | dev_dbg(priv->ndev->dev.parent, "Error Warning interrupt\n"); |
699 | hecc_clear_bit(priv, HECC_CANMC, HECC_CANMC_CCR); | 688 | hecc_clear_bit(priv, HECC_CANMC, HECC_CANMC_CCR); |
700 | } | 689 | } |
701 | 690 | ||
@@ -710,7 +699,7 @@ static int ti_hecc_error(struct net_device *ndev, int int_status, | |||
710 | cf->data[1] |= CAN_ERR_CRTL_RX_PASSIVE; | 699 | cf->data[1] |= CAN_ERR_CRTL_RX_PASSIVE; |
711 | } | 700 | } |
712 | hecc_set_bit(priv, HECC_CANES, HECC_CANES_EP); | 701 | hecc_set_bit(priv, HECC_CANES, HECC_CANES_EP); |
713 | netdev_dbg(priv->ndev, "Error passive interrupt\n"); | 702 | dev_dbg(priv->ndev->dev.parent, "Error passive interrupt\n"); |
714 | hecc_clear_bit(priv, HECC_CANMC, HECC_CANMC_CCR); | 703 | hecc_clear_bit(priv, HECC_CANMC, HECC_CANMC_CCR); |
715 | } | 704 | } |
716 | 705 | ||
@@ -756,10 +745,9 @@ static int ti_hecc_error(struct net_device *ndev, int int_status, | |||
756 | } | 745 | } |
757 | } | 746 | } |
758 | 747 | ||
759 | netif_rx(skb); | 748 | netif_receive_skb(skb); |
760 | stats->rx_packets++; | 749 | stats->rx_packets++; |
761 | stats->rx_bytes += cf->can_dlc; | 750 | stats->rx_bytes += cf->can_dlc; |
762 | |||
763 | return 0; | 751 | return 0; |
764 | } | 752 | } |
765 | 753 | ||
@@ -836,7 +824,7 @@ static int ti_hecc_open(struct net_device *ndev) | |||
836 | err = request_irq(ndev->irq, ti_hecc_interrupt, IRQF_SHARED, | 824 | err = request_irq(ndev->irq, ti_hecc_interrupt, IRQF_SHARED, |
837 | ndev->name, ndev); | 825 | ndev->name, ndev); |
838 | if (err) { | 826 | if (err) { |
839 | netdev_err(ndev, "error requesting interrupt\n"); | 827 | dev_err(ndev->dev.parent, "error requesting interrupt\n"); |
840 | return err; | 828 | return err; |
841 | } | 829 | } |
842 | 830 | ||
@@ -845,7 +833,7 @@ static int ti_hecc_open(struct net_device *ndev) | |||
845 | /* Open common can device */ | 833 | /* Open common can device */ |
846 | err = open_candev(ndev); | 834 | err = open_candev(ndev); |
847 | if (err) { | 835 | if (err) { |
848 | netdev_err(ndev, "open_candev() failed %d\n", err); | 836 | dev_err(ndev->dev.parent, "open_candev() failed %d\n", err); |
849 | ti_hecc_transceiver_switch(priv, 0); | 837 | ti_hecc_transceiver_switch(priv, 0); |
850 | free_irq(ndev->irq, ndev); | 838 | free_irq(ndev->irq, ndev); |
851 | return err; | 839 | return err; |
@@ -934,7 +922,6 @@ static int ti_hecc_probe(struct platform_device *pdev) | |||
934 | priv->can.bittiming_const = &ti_hecc_bittiming_const; | 922 | priv->can.bittiming_const = &ti_hecc_bittiming_const; |
935 | priv->can.do_set_mode = ti_hecc_do_set_mode; | 923 | priv->can.do_set_mode = ti_hecc_do_set_mode; |
936 | priv->can.do_get_state = ti_hecc_get_state; | 924 | priv->can.do_get_state = ti_hecc_get_state; |
937 | priv->can.do_get_berr_counter = ti_hecc_get_berr_counter; | ||
938 | priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES; | 925 | priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES; |
939 | 926 | ||
940 | spin_lock_init(&priv->mbx_lock); | 927 | spin_lock_init(&priv->mbx_lock); |
@@ -978,18 +965,18 @@ probe_exit: | |||
978 | return err; | 965 | return err; |
979 | } | 966 | } |
980 | 967 | ||
981 | static int ti_hecc_remove(struct platform_device *pdev) | 968 | static int __devexit ti_hecc_remove(struct platform_device *pdev) |
982 | { | 969 | { |
983 | struct resource *res; | 970 | struct resource *res; |
984 | struct net_device *ndev = platform_get_drvdata(pdev); | 971 | struct net_device *ndev = platform_get_drvdata(pdev); |
985 | struct ti_hecc_priv *priv = netdev_priv(ndev); | 972 | struct ti_hecc_priv *priv = netdev_priv(ndev); |
986 | 973 | ||
987 | unregister_candev(ndev); | ||
988 | clk_disable(priv->clk); | 974 | clk_disable(priv->clk); |
989 | clk_put(priv->clk); | 975 | clk_put(priv->clk); |
990 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 976 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
991 | iounmap(priv->base); | 977 | iounmap(priv->base); |
992 | release_mem_region(res->start, resource_size(res)); | 978 | release_mem_region(res->start, resource_size(res)); |
979 | unregister_candev(ndev); | ||
993 | free_candev(ndev); | 980 | free_candev(ndev); |
994 | platform_set_drvdata(pdev, NULL); | 981 | platform_set_drvdata(pdev, NULL); |
995 | 982 | ||
@@ -1045,14 +1032,26 @@ static struct platform_driver ti_hecc_driver = { | |||
1045 | .owner = THIS_MODULE, | 1032 | .owner = THIS_MODULE, |
1046 | }, | 1033 | }, |
1047 | .probe = ti_hecc_probe, | 1034 | .probe = ti_hecc_probe, |
1048 | .remove = ti_hecc_remove, | 1035 | .remove = __devexit_p(ti_hecc_remove), |
1049 | .suspend = ti_hecc_suspend, | 1036 | .suspend = ti_hecc_suspend, |
1050 | .resume = ti_hecc_resume, | 1037 | .resume = ti_hecc_resume, |
1051 | }; | 1038 | }; |
1052 | 1039 | ||
1053 | module_platform_driver(ti_hecc_driver); | 1040 | static int __init ti_hecc_init_driver(void) |
1041 | { | ||
1042 | printk(KERN_INFO DRV_DESC "\n"); | ||
1043 | return platform_driver_register(&ti_hecc_driver); | ||
1044 | } | ||
1045 | |||
1046 | static void __exit ti_hecc_exit_driver(void) | ||
1047 | { | ||
1048 | printk(KERN_INFO DRV_DESC " unloaded\n"); | ||
1049 | platform_driver_unregister(&ti_hecc_driver); | ||
1050 | } | ||
1051 | |||
1052 | module_exit(ti_hecc_exit_driver); | ||
1053 | module_init(ti_hecc_init_driver); | ||
1054 | 1054 | ||
1055 | MODULE_AUTHOR("Anant Gole <anantgole@ti.com>"); | 1055 | MODULE_AUTHOR("Anant Gole <anantgole@ti.com>"); |
1056 | MODULE_LICENSE("GPL v2"); | 1056 | MODULE_LICENSE("GPL v2"); |
1057 | MODULE_DESCRIPTION(DRV_DESC); | 1057 | MODULE_DESCRIPTION(DRV_DESC); |
1058 | MODULE_ALIAS("platform:" DRV_NAME); | ||
diff --git a/drivers/net/can/usb/Kconfig b/drivers/net/can/usb/Kconfig index a4e4bee3571..04525495b15 100644 --- a/drivers/net/can/usb/Kconfig +++ b/drivers/net/can/usb/Kconfig | |||
@@ -13,39 +13,4 @@ config CAN_ESD_USB2 | |||
13 | This driver supports the CAN-USB/2 interface | 13 | This driver supports the CAN-USB/2 interface |
14 | from esd electronic system design gmbh (http://www.esd.eu). | 14 | from esd electronic system design gmbh (http://www.esd.eu). |
15 | 15 | ||
16 | config CAN_KVASER_USB | ||
17 | tristate "Kvaser CAN/USB interface" | ||
18 | ---help--- | ||
19 | This driver adds support for Kvaser CAN/USB devices like Kvaser | ||
20 | Leaf Light. | ||
21 | |||
22 | The driver gives support for the following devices: | ||
23 | - Kvaser Leaf Light | ||
24 | - Kvaser Leaf Professional HS | ||
25 | - Kvaser Leaf SemiPro HS | ||
26 | - Kvaser Leaf Professional LS | ||
27 | - Kvaser Leaf Professional SWC | ||
28 | - Kvaser Leaf Professional LIN | ||
29 | - Kvaser Leaf SemiPro LS | ||
30 | - Kvaser Leaf SemiPro SWC | ||
31 | - Kvaser Memorator II HS/HS | ||
32 | - Kvaser USBcan Professional HS/HS | ||
33 | - Kvaser Leaf Light GI | ||
34 | - Kvaser Leaf Professional HS (OBD-II connector) | ||
35 | - Kvaser Memorator Professional HS/LS | ||
36 | - Kvaser Leaf Light "China" | ||
37 | - Kvaser BlackBird SemiPro | ||
38 | - Kvaser USBcan R | ||
39 | |||
40 | If unsure, say N. | ||
41 | |||
42 | To compile this driver as a module, choose M here: the | ||
43 | module will be called kvaser_usb. | ||
44 | |||
45 | config CAN_PEAK_USB | ||
46 | tristate "PEAK PCAN-USB/USB Pro interfaces" | ||
47 | ---help--- | ||
48 | This driver supports the PCAN-USB and PCAN-USB Pro adapters | ||
49 | from PEAK-System Technik (http://www.peak-system.com). | ||
50 | |||
51 | endmenu | 16 | endmenu |
diff --git a/drivers/net/can/usb/Makefile b/drivers/net/can/usb/Makefile index 80a2ee41fd6..fce3cf11719 100644 --- a/drivers/net/can/usb/Makefile +++ b/drivers/net/can/usb/Makefile | |||
@@ -4,7 +4,5 @@ | |||
4 | 4 | ||
5 | obj-$(CONFIG_CAN_EMS_USB) += ems_usb.o | 5 | obj-$(CONFIG_CAN_EMS_USB) += ems_usb.o |
6 | obj-$(CONFIG_CAN_ESD_USB2) += esd_usb2.o | 6 | obj-$(CONFIG_CAN_ESD_USB2) += esd_usb2.o |
7 | obj-$(CONFIG_CAN_KVASER_USB) += kvaser_usb.o | ||
8 | obj-$(CONFIG_CAN_PEAK_USB) += peak_usb/ | ||
9 | 7 | ||
10 | ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG | 8 | ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG |
diff --git a/drivers/net/can/usb/ems_usb.c b/drivers/net/can/usb/ems_usb.c index c69f0b72b35..a72c7bfb409 100644 --- a/drivers/net/can/usb/ems_usb.c +++ b/drivers/net/can/usb/ems_usb.c | |||
@@ -245,6 +245,7 @@ struct ems_tx_urb_context { | |||
245 | 245 | ||
246 | struct ems_usb { | 246 | struct ems_usb { |
247 | struct can_priv can; /* must be the first member */ | 247 | struct can_priv can; /* must be the first member */ |
248 | int open_time; | ||
248 | 249 | ||
249 | struct sk_buff *echo_skb[MAX_TX_URBS]; | 250 | struct sk_buff *echo_skb[MAX_TX_URBS]; |
250 | 251 | ||
@@ -287,7 +288,8 @@ static void ems_usb_read_interrupt_callback(struct urb *urb) | |||
287 | return; | 288 | return; |
288 | 289 | ||
289 | default: | 290 | default: |
290 | netdev_info(netdev, "Rx interrupt aborted %d\n", urb->status); | 291 | dev_info(netdev->dev.parent, "Rx interrupt aborted %d\n", |
292 | urb->status); | ||
291 | break; | 293 | break; |
292 | } | 294 | } |
293 | 295 | ||
@@ -296,7 +298,8 @@ static void ems_usb_read_interrupt_callback(struct urb *urb) | |||
296 | if (err == -ENODEV) | 298 | if (err == -ENODEV) |
297 | netif_device_detach(netdev); | 299 | netif_device_detach(netdev); |
298 | else if (err) | 300 | else if (err) |
299 | netdev_err(netdev, "failed resubmitting intr urb: %d\n", err); | 301 | dev_err(netdev->dev.parent, |
302 | "failed resubmitting intr urb: %d\n", err); | ||
300 | } | 303 | } |
301 | 304 | ||
302 | static void ems_usb_rx_can_msg(struct ems_usb *dev, struct ems_cpc_msg *msg) | 305 | static void ems_usb_rx_can_msg(struct ems_usb *dev, struct ems_cpc_msg *msg) |
@@ -428,7 +431,8 @@ static void ems_usb_read_bulk_callback(struct urb *urb) | |||
428 | return; | 431 | return; |
429 | 432 | ||
430 | default: | 433 | default: |
431 | netdev_info(netdev, "Rx URB aborted (%d)\n", urb->status); | 434 | dev_info(netdev->dev.parent, "Rx URB aborted (%d)\n", |
435 | urb->status); | ||
432 | goto resubmit_urb; | 436 | goto resubmit_urb; |
433 | } | 437 | } |
434 | 438 | ||
@@ -473,7 +477,7 @@ static void ems_usb_read_bulk_callback(struct urb *urb) | |||
473 | msg_count--; | 477 | msg_count--; |
474 | 478 | ||
475 | if (start > urb->transfer_buffer_length) { | 479 | if (start > urb->transfer_buffer_length) { |
476 | netdev_err(netdev, "format error\n"); | 480 | dev_err(netdev->dev.parent, "format error\n"); |
477 | break; | 481 | break; |
478 | } | 482 | } |
479 | } | 483 | } |
@@ -489,8 +493,8 @@ resubmit_urb: | |||
489 | if (retval == -ENODEV) | 493 | if (retval == -ENODEV) |
490 | netif_device_detach(netdev); | 494 | netif_device_detach(netdev); |
491 | else if (retval) | 495 | else if (retval) |
492 | netdev_err(netdev, | 496 | dev_err(netdev->dev.parent, |
493 | "failed resubmitting read bulk urb: %d\n", retval); | 497 | "failed resubmitting read bulk urb: %d\n", retval); |
494 | } | 498 | } |
495 | 499 | ||
496 | /* | 500 | /* |
@@ -517,7 +521,8 @@ static void ems_usb_write_bulk_callback(struct urb *urb) | |||
517 | return; | 521 | return; |
518 | 522 | ||
519 | if (urb->status) | 523 | if (urb->status) |
520 | netdev_info(netdev, "Tx URB aborted (%d)\n", urb->status); | 524 | dev_info(netdev->dev.parent, "Tx URB aborted (%d)\n", |
525 | urb->status); | ||
521 | 526 | ||
522 | netdev->trans_start = jiffies; | 527 | netdev->trans_start = jiffies; |
523 | 528 | ||
@@ -600,18 +605,18 @@ static int ems_usb_start(struct ems_usb *dev) | |||
600 | /* create a URB, and a buffer for it */ | 605 | /* create a URB, and a buffer for it */ |
601 | urb = usb_alloc_urb(0, GFP_KERNEL); | 606 | urb = usb_alloc_urb(0, GFP_KERNEL); |
602 | if (!urb) { | 607 | if (!urb) { |
603 | netdev_err(netdev, "No memory left for URBs\n"); | 608 | dev_err(netdev->dev.parent, |
604 | err = -ENOMEM; | 609 | "No memory left for URBs\n"); |
605 | break; | 610 | return -ENOMEM; |
606 | } | 611 | } |
607 | 612 | ||
608 | buf = usb_alloc_coherent(dev->udev, RX_BUFFER_SIZE, GFP_KERNEL, | 613 | buf = usb_alloc_coherent(dev->udev, RX_BUFFER_SIZE, GFP_KERNEL, |
609 | &urb->transfer_dma); | 614 | &urb->transfer_dma); |
610 | if (!buf) { | 615 | if (!buf) { |
611 | netdev_err(netdev, "No memory left for USB buffer\n"); | 616 | dev_err(netdev->dev.parent, |
617 | "No memory left for USB buffer\n"); | ||
612 | usb_free_urb(urb); | 618 | usb_free_urb(urb); |
613 | err = -ENOMEM; | 619 | return -ENOMEM; |
614 | break; | ||
615 | } | 620 | } |
616 | 621 | ||
617 | usb_fill_bulk_urb(urb, dev->udev, usb_rcvbulkpipe(dev->udev, 2), | 622 | usb_fill_bulk_urb(urb, dev->udev, usb_rcvbulkpipe(dev->udev, 2), |
@@ -622,6 +627,9 @@ static int ems_usb_start(struct ems_usb *dev) | |||
622 | 627 | ||
623 | err = usb_submit_urb(urb, GFP_KERNEL); | 628 | err = usb_submit_urb(urb, GFP_KERNEL); |
624 | if (err) { | 629 | if (err) { |
630 | if (err == -ENODEV) | ||
631 | netif_device_detach(dev->netdev); | ||
632 | |||
625 | usb_unanchor_urb(urb); | 633 | usb_unanchor_urb(urb); |
626 | usb_free_coherent(dev->udev, RX_BUFFER_SIZE, buf, | 634 | usb_free_coherent(dev->udev, RX_BUFFER_SIZE, buf, |
627 | urb->transfer_dma); | 635 | urb->transfer_dma); |
@@ -634,13 +642,13 @@ static int ems_usb_start(struct ems_usb *dev) | |||
634 | 642 | ||
635 | /* Did we submit any URBs */ | 643 | /* Did we submit any URBs */ |
636 | if (i == 0) { | 644 | if (i == 0) { |
637 | netdev_warn(netdev, "couldn't setup read URBs\n"); | 645 | dev_warn(netdev->dev.parent, "couldn't setup read URBs\n"); |
638 | return err; | 646 | return err; |
639 | } | 647 | } |
640 | 648 | ||
641 | /* Warn if we've couldn't transmit all the URBs */ | 649 | /* Warn if we've couldn't transmit all the URBs */ |
642 | if (i < MAX_RX_URBS) | 650 | if (i < MAX_RX_URBS) |
643 | netdev_warn(netdev, "rx performance may be slow\n"); | 651 | dev_warn(netdev->dev.parent, "rx performance may be slow\n"); |
644 | 652 | ||
645 | /* Setup and start interrupt URB */ | 653 | /* Setup and start interrupt URB */ |
646 | usb_fill_int_urb(dev->intr_urb, dev->udev, | 654 | usb_fill_int_urb(dev->intr_urb, dev->udev, |
@@ -651,7 +659,11 @@ static int ems_usb_start(struct ems_usb *dev) | |||
651 | 659 | ||
652 | err = usb_submit_urb(dev->intr_urb, GFP_KERNEL); | 660 | err = usb_submit_urb(dev->intr_urb, GFP_KERNEL); |
653 | if (err) { | 661 | if (err) { |
654 | netdev_warn(netdev, "intr URB submit failed: %d\n", err); | 662 | if (err == -ENODEV) |
663 | netif_device_detach(dev->netdev); | ||
664 | |||
665 | dev_warn(netdev->dev.parent, "intr URB submit failed: %d\n", | ||
666 | err); | ||
655 | 667 | ||
656 | return err; | 668 | return err; |
657 | } | 669 | } |
@@ -680,7 +692,10 @@ static int ems_usb_start(struct ems_usb *dev) | |||
680 | return 0; | 692 | return 0; |
681 | 693 | ||
682 | failed: | 694 | failed: |
683 | netdev_warn(netdev, "couldn't submit control: %d\n", err); | 695 | if (err == -ENODEV) |
696 | netif_device_detach(dev->netdev); | ||
697 | |||
698 | dev_warn(netdev->dev.parent, "couldn't submit control: %d\n", err); | ||
684 | 699 | ||
685 | return err; | 700 | return err; |
686 | } | 701 | } |
@@ -720,13 +735,15 @@ static int ems_usb_open(struct net_device *netdev) | |||
720 | if (err == -ENODEV) | 735 | if (err == -ENODEV) |
721 | netif_device_detach(dev->netdev); | 736 | netif_device_detach(dev->netdev); |
722 | 737 | ||
723 | netdev_warn(netdev, "couldn't start device: %d\n", err); | 738 | dev_warn(netdev->dev.parent, "couldn't start device: %d\n", |
739 | err); | ||
724 | 740 | ||
725 | close_candev(netdev); | 741 | close_candev(netdev); |
726 | 742 | ||
727 | return err; | 743 | return err; |
728 | } | 744 | } |
729 | 745 | ||
746 | dev->open_time = jiffies; | ||
730 | 747 | ||
731 | netif_start_queue(netdev); | 748 | netif_start_queue(netdev); |
732 | 749 | ||
@@ -752,13 +769,13 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne | |||
752 | /* create a URB, and a buffer for it, and copy the data to the URB */ | 769 | /* create a URB, and a buffer for it, and copy the data to the URB */ |
753 | urb = usb_alloc_urb(0, GFP_ATOMIC); | 770 | urb = usb_alloc_urb(0, GFP_ATOMIC); |
754 | if (!urb) { | 771 | if (!urb) { |
755 | netdev_err(netdev, "No memory left for URBs\n"); | 772 | dev_err(netdev->dev.parent, "No memory left for URBs\n"); |
756 | goto nomem; | 773 | goto nomem; |
757 | } | 774 | } |
758 | 775 | ||
759 | buf = usb_alloc_coherent(dev->udev, size, GFP_ATOMIC, &urb->transfer_dma); | 776 | buf = usb_alloc_coherent(dev->udev, size, GFP_ATOMIC, &urb->transfer_dma); |
760 | if (!buf) { | 777 | if (!buf) { |
761 | netdev_err(netdev, "No memory left for USB buffer\n"); | 778 | dev_err(netdev->dev.parent, "No memory left for USB buffer\n"); |
762 | usb_free_urb(urb); | 779 | usb_free_urb(urb); |
763 | goto nomem; | 780 | goto nomem; |
764 | } | 781 | } |
@@ -801,7 +818,7 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne | |||
801 | usb_unanchor_urb(urb); | 818 | usb_unanchor_urb(urb); |
802 | usb_free_coherent(dev->udev, size, buf, urb->transfer_dma); | 819 | usb_free_coherent(dev->udev, size, buf, urb->transfer_dma); |
803 | 820 | ||
804 | netdev_warn(netdev, "couldn't find free context\n"); | 821 | dev_warn(netdev->dev.parent, "couldn't find free context\n"); |
805 | 822 | ||
806 | return NETDEV_TX_BUSY; | 823 | return NETDEV_TX_BUSY; |
807 | } | 824 | } |
@@ -832,7 +849,7 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne | |||
832 | if (err == -ENODEV) { | 849 | if (err == -ENODEV) { |
833 | netif_device_detach(netdev); | 850 | netif_device_detach(netdev); |
834 | } else { | 851 | } else { |
835 | netdev_warn(netdev, "failed tx_urb %d\n", err); | 852 | dev_warn(netdev->dev.parent, "failed tx_urb %d\n", err); |
836 | 853 | ||
837 | stats->tx_dropped++; | 854 | stats->tx_dropped++; |
838 | } | 855 | } |
@@ -872,10 +889,12 @@ static int ems_usb_close(struct net_device *netdev) | |||
872 | 889 | ||
873 | /* Set CAN controller to reset mode */ | 890 | /* Set CAN controller to reset mode */ |
874 | if (ems_usb_write_mode(dev, SJA1000_MOD_RM)) | 891 | if (ems_usb_write_mode(dev, SJA1000_MOD_RM)) |
875 | netdev_warn(netdev, "couldn't stop device"); | 892 | dev_warn(netdev->dev.parent, "couldn't stop device"); |
876 | 893 | ||
877 | close_candev(netdev); | 894 | close_candev(netdev); |
878 | 895 | ||
896 | dev->open_time = 0; | ||
897 | |||
879 | return 0; | 898 | return 0; |
880 | } | 899 | } |
881 | 900 | ||
@@ -885,7 +904,7 @@ static const struct net_device_ops ems_usb_netdev_ops = { | |||
885 | .ndo_start_xmit = ems_usb_start_xmit, | 904 | .ndo_start_xmit = ems_usb_start_xmit, |
886 | }; | 905 | }; |
887 | 906 | ||
888 | static const struct can_bittiming_const ems_usb_bittiming_const = { | 907 | static struct can_bittiming_const ems_usb_bittiming_const = { |
889 | .name = "ems_usb", | 908 | .name = "ems_usb", |
890 | .tseg1_min = 1, | 909 | .tseg1_min = 1, |
891 | .tseg1_max = 16, | 910 | .tseg1_max = 16, |
@@ -901,10 +920,13 @@ static int ems_usb_set_mode(struct net_device *netdev, enum can_mode mode) | |||
901 | { | 920 | { |
902 | struct ems_usb *dev = netdev_priv(netdev); | 921 | struct ems_usb *dev = netdev_priv(netdev); |
903 | 922 | ||
923 | if (!dev->open_time) | ||
924 | return -EINVAL; | ||
925 | |||
904 | switch (mode) { | 926 | switch (mode) { |
905 | case CAN_MODE_START: | 927 | case CAN_MODE_START: |
906 | if (ems_usb_write_mode(dev, SJA1000_MOD_NORMAL)) | 928 | if (ems_usb_write_mode(dev, SJA1000_MOD_NORMAL)) |
907 | netdev_warn(netdev, "couldn't start device"); | 929 | dev_warn(netdev->dev.parent, "couldn't start device"); |
908 | 930 | ||
909 | if (netif_queue_stopped(netdev)) | 931 | if (netif_queue_stopped(netdev)) |
910 | netif_wake_queue(netdev); | 932 | netif_wake_queue(netdev); |
@@ -929,7 +951,8 @@ static int ems_usb_set_bittiming(struct net_device *netdev) | |||
929 | if (dev->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) | 951 | if (dev->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) |
930 | btr1 |= 0x80; | 952 | btr1 |= 0x80; |
931 | 953 | ||
932 | netdev_info(netdev, "setting BTR0=0x%02x BTR1=0x%02x\n", btr0, btr1); | 954 | dev_info(netdev->dev.parent, "setting BTR0=0x%02x BTR1=0x%02x\n", |
955 | btr0, btr1); | ||
933 | 956 | ||
934 | dev->active_params.msg.can_params.cc_params.sja1000.btr0 = btr0; | 957 | dev->active_params.msg.can_params.cc_params.sja1000.btr0 = btr0; |
935 | dev->active_params.msg.can_params.cc_params.sja1000.btr1 = btr1; | 958 | dev->active_params.msg.can_params.cc_params.sja1000.btr1 = btr1; |
@@ -1034,13 +1057,15 @@ static int ems_usb_probe(struct usb_interface *intf, | |||
1034 | 1057 | ||
1035 | err = ems_usb_command_msg(dev, &dev->active_params); | 1058 | err = ems_usb_command_msg(dev, &dev->active_params); |
1036 | if (err) { | 1059 | if (err) { |
1037 | netdev_err(netdev, "couldn't initialize controller: %d\n", err); | 1060 | dev_err(netdev->dev.parent, |
1061 | "couldn't initialize controller: %d\n", err); | ||
1038 | goto cleanup_tx_msg_buffer; | 1062 | goto cleanup_tx_msg_buffer; |
1039 | } | 1063 | } |
1040 | 1064 | ||
1041 | err = register_candev(netdev); | 1065 | err = register_candev(netdev); |
1042 | if (err) { | 1066 | if (err) { |
1043 | netdev_err(netdev, "couldn't register CAN device: %d\n", err); | 1067 | dev_err(netdev->dev.parent, |
1068 | "couldn't register CAN device: %d\n", err); | ||
1044 | goto cleanup_tx_msg_buffer; | 1069 | goto cleanup_tx_msg_buffer; |
1045 | } | 1070 | } |
1046 | 1071 | ||
@@ -1090,4 +1115,28 @@ static struct usb_driver ems_usb_driver = { | |||
1090 | .id_table = ems_usb_table, | 1115 | .id_table = ems_usb_table, |
1091 | }; | 1116 | }; |
1092 | 1117 | ||
1093 | module_usb_driver(ems_usb_driver); | 1118 | static int __init ems_usb_init(void) |
1119 | { | ||
1120 | int err; | ||
1121 | |||
1122 | printk(KERN_INFO "CPC-USB kernel driver loaded\n"); | ||
1123 | |||
1124 | /* register this driver with the USB subsystem */ | ||
1125 | err = usb_register(&ems_usb_driver); | ||
1126 | |||
1127 | if (err) { | ||
1128 | err("usb_register failed. Error number %d\n", err); | ||
1129 | return err; | ||
1130 | } | ||
1131 | |||
1132 | return 0; | ||
1133 | } | ||
1134 | |||
1135 | static void __exit ems_usb_exit(void) | ||
1136 | { | ||
1137 | /* deregister this driver with the USB subsystem */ | ||
1138 | usb_deregister(&ems_usb_driver); | ||
1139 | } | ||
1140 | |||
1141 | module_init(ems_usb_init); | ||
1142 | module_exit(ems_usb_exit); | ||
diff --git a/drivers/net/can/usb/esd_usb2.c b/drivers/net/can/usb/esd_usb2.c index 9b74d1e3ad4..eb8b0e60028 100644 --- a/drivers/net/can/usb/esd_usb2.c +++ b/drivers/net/can/usb/esd_usb2.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * CAN driver for esd CAN-USB/2 and CAN-USB/Micro | 2 | * CAN driver for esd CAN-USB/2 |
3 | * | 3 | * |
4 | * Copyright (C) 2010-2012 Matthias Fuchs <matthias.fuchs@esd.eu>, esd gmbh | 4 | * Copyright (C) 2010 Matthias Fuchs <matthias.fuchs@esd.eu>, esd gmbh |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify it | 6 | * This program is free software; you can redistribute it and/or modify it |
7 | * under the terms of the GNU General Public License as published | 7 | * under the terms of the GNU General Public License as published |
@@ -28,16 +28,14 @@ | |||
28 | #include <linux/can/error.h> | 28 | #include <linux/can/error.h> |
29 | 29 | ||
30 | MODULE_AUTHOR("Matthias Fuchs <matthias.fuchs@esd.eu>"); | 30 | MODULE_AUTHOR("Matthias Fuchs <matthias.fuchs@esd.eu>"); |
31 | MODULE_DESCRIPTION("CAN driver for esd CAN-USB/2 and CAN-USB/Micro interfaces"); | 31 | MODULE_DESCRIPTION("CAN driver for esd CAN-USB/2 interfaces"); |
32 | MODULE_LICENSE("GPL v2"); | 32 | MODULE_LICENSE("GPL v2"); |
33 | 33 | ||
34 | /* Define these values to match your devices */ | 34 | /* Define these values to match your devices */ |
35 | #define USB_ESDGMBH_VENDOR_ID 0x0ab4 | 35 | #define USB_ESDGMBH_VENDOR_ID 0x0ab4 |
36 | #define USB_CANUSB2_PRODUCT_ID 0x0010 | 36 | #define USB_CANUSB2_PRODUCT_ID 0x0010 |
37 | #define USB_CANUSBM_PRODUCT_ID 0x0011 | ||
38 | 37 | ||
39 | #define ESD_USB2_CAN_CLOCK 60000000 | 38 | #define ESD_USB2_CAN_CLOCK 60000000 |
40 | #define ESD_USBM_CAN_CLOCK 36000000 | ||
41 | #define ESD_USB2_MAX_NETS 2 | 39 | #define ESD_USB2_MAX_NETS 2 |
42 | 40 | ||
43 | /* USB2 commands */ | 41 | /* USB2 commands */ |
@@ -71,7 +69,6 @@ MODULE_LICENSE("GPL v2"); | |||
71 | #define ESD_USB2_TSEG2_SHIFT 20 | 69 | #define ESD_USB2_TSEG2_SHIFT 20 |
72 | #define ESD_USB2_SJW_MAX 4 | 70 | #define ESD_USB2_SJW_MAX 4 |
73 | #define ESD_USB2_SJW_SHIFT 14 | 71 | #define ESD_USB2_SJW_SHIFT 14 |
74 | #define ESD_USBM_SJW_SHIFT 24 | ||
75 | #define ESD_USB2_BRP_MIN 1 | 72 | #define ESD_USB2_BRP_MIN 1 |
76 | #define ESD_USB2_BRP_MAX 1024 | 73 | #define ESD_USB2_BRP_MAX 1024 |
77 | #define ESD_USB2_BRP_INC 1 | 74 | #define ESD_USB2_BRP_INC 1 |
@@ -186,7 +183,6 @@ struct __attribute__ ((packed)) esd_usb2_msg { | |||
186 | 183 | ||
187 | static struct usb_device_id esd_usb2_table[] = { | 184 | static struct usb_device_id esd_usb2_table[] = { |
188 | {USB_DEVICE(USB_ESDGMBH_VENDOR_ID, USB_CANUSB2_PRODUCT_ID)}, | 185 | {USB_DEVICE(USB_ESDGMBH_VENDOR_ID, USB_CANUSB2_PRODUCT_ID)}, |
189 | {USB_DEVICE(USB_ESDGMBH_VENDOR_ID, USB_CANUSBM_PRODUCT_ID)}, | ||
190 | {} | 186 | {} |
191 | }; | 187 | }; |
192 | MODULE_DEVICE_TABLE(usb, esd_usb2_table); | 188 | MODULE_DEVICE_TABLE(usb, esd_usb2_table); |
@@ -217,6 +213,7 @@ struct esd_usb2_net_priv { | |||
217 | struct usb_anchor tx_submitted; | 213 | struct usb_anchor tx_submitted; |
218 | struct esd_tx_urb_context tx_contexts[MAX_TX_URBS]; | 214 | struct esd_tx_urb_context tx_contexts[MAX_TX_URBS]; |
219 | 215 | ||
216 | int open_time; | ||
220 | struct esd_usb2 *usb2; | 217 | struct esd_usb2 *usb2; |
221 | struct net_device *netdev; | 218 | struct net_device *netdev; |
222 | int index; | 219 | int index; |
@@ -473,7 +470,8 @@ static void esd_usb2_write_bulk_callback(struct urb *urb) | |||
473 | return; | 470 | return; |
474 | 471 | ||
475 | if (urb->status) | 472 | if (urb->status) |
476 | netdev_info(netdev, "Tx URB aborted (%d)\n", urb->status); | 473 | dev_info(netdev->dev.parent, "Tx URB aborted (%d)\n", |
474 | urb->status); | ||
477 | 475 | ||
478 | netdev->trans_start = jiffies; | 476 | netdev->trans_start = jiffies; |
479 | } | 477 | } |
@@ -653,7 +651,7 @@ failed: | |||
653 | if (err == -ENODEV) | 651 | if (err == -ENODEV) |
654 | netif_device_detach(netdev); | 652 | netif_device_detach(netdev); |
655 | 653 | ||
656 | netdev_err(netdev, "couldn't start device: %d\n", err); | 654 | dev_err(netdev->dev.parent, "couldn't start device: %d\n", err); |
657 | 655 | ||
658 | return err; | 656 | return err; |
659 | } | 657 | } |
@@ -689,11 +687,14 @@ static int esd_usb2_open(struct net_device *netdev) | |||
689 | /* finally start device */ | 687 | /* finally start device */ |
690 | err = esd_usb2_start(priv); | 688 | err = esd_usb2_start(priv); |
691 | if (err) { | 689 | if (err) { |
692 | netdev_warn(netdev, "couldn't start device: %d\n", err); | 690 | dev_warn(netdev->dev.parent, |
691 | "couldn't start device: %d\n", err); | ||
693 | close_candev(netdev); | 692 | close_candev(netdev); |
694 | return err; | 693 | return err; |
695 | } | 694 | } |
696 | 695 | ||
696 | priv->open_time = jiffies; | ||
697 | |||
697 | netif_start_queue(netdev); | 698 | netif_start_queue(netdev); |
698 | 699 | ||
699 | return 0; | 700 | return 0; |
@@ -720,7 +721,7 @@ static netdev_tx_t esd_usb2_start_xmit(struct sk_buff *skb, | |||
720 | /* create a URB, and a buffer for it, and copy the data to the URB */ | 721 | /* create a URB, and a buffer for it, and copy the data to the URB */ |
721 | urb = usb_alloc_urb(0, GFP_ATOMIC); | 722 | urb = usb_alloc_urb(0, GFP_ATOMIC); |
722 | if (!urb) { | 723 | if (!urb) { |
723 | netdev_err(netdev, "No memory left for URBs\n"); | 724 | dev_err(netdev->dev.parent, "No memory left for URBs\n"); |
724 | stats->tx_dropped++; | 725 | stats->tx_dropped++; |
725 | dev_kfree_skb(skb); | 726 | dev_kfree_skb(skb); |
726 | goto nourbmem; | 727 | goto nourbmem; |
@@ -729,7 +730,7 @@ static netdev_tx_t esd_usb2_start_xmit(struct sk_buff *skb, | |||
729 | buf = usb_alloc_coherent(dev->udev, size, GFP_ATOMIC, | 730 | buf = usb_alloc_coherent(dev->udev, size, GFP_ATOMIC, |
730 | &urb->transfer_dma); | 731 | &urb->transfer_dma); |
731 | if (!buf) { | 732 | if (!buf) { |
732 | netdev_err(netdev, "No memory left for USB buffer\n"); | 733 | dev_err(netdev->dev.parent, "No memory left for USB buffer\n"); |
733 | stats->tx_dropped++; | 734 | stats->tx_dropped++; |
734 | dev_kfree_skb(skb); | 735 | dev_kfree_skb(skb); |
735 | goto nobufmem; | 736 | goto nobufmem; |
@@ -765,7 +766,7 @@ static netdev_tx_t esd_usb2_start_xmit(struct sk_buff *skb, | |||
765 | * This may never happen. | 766 | * This may never happen. |
766 | */ | 767 | */ |
767 | if (!context) { | 768 | if (!context) { |
768 | netdev_warn(netdev, "couldn't find free context\n"); | 769 | dev_warn(netdev->dev.parent, "couldn't find free context\n"); |
769 | ret = NETDEV_TX_BUSY; | 770 | ret = NETDEV_TX_BUSY; |
770 | goto releasebuf; | 771 | goto releasebuf; |
771 | } | 772 | } |
@@ -805,7 +806,7 @@ static netdev_tx_t esd_usb2_start_xmit(struct sk_buff *skb, | |||
805 | if (err == -ENODEV) | 806 | if (err == -ENODEV) |
806 | netif_device_detach(netdev); | 807 | netif_device_detach(netdev); |
807 | else | 808 | else |
808 | netdev_warn(netdev, "failed tx_urb %d\n", err); | 809 | dev_warn(netdev->dev.parent, "failed tx_urb %d\n", err); |
809 | 810 | ||
810 | goto releasebuf; | 811 | goto releasebuf; |
811 | } | 812 | } |
@@ -844,7 +845,7 @@ static int esd_usb2_close(struct net_device *netdev) | |||
844 | for (i = 0; i <= ESD_MAX_ID_SEGMENT; i++) | 845 | for (i = 0; i <= ESD_MAX_ID_SEGMENT; i++) |
845 | msg.msg.filter.mask[i] = 0; | 846 | msg.msg.filter.mask[i] = 0; |
846 | if (esd_usb2_send_msg(priv->usb2, &msg) < 0) | 847 | if (esd_usb2_send_msg(priv->usb2, &msg) < 0) |
847 | netdev_err(netdev, "sending idadd message failed\n"); | 848 | dev_err(netdev->dev.parent, "sending idadd message failed\n"); |
848 | 849 | ||
849 | /* set CAN controller to reset mode */ | 850 | /* set CAN controller to reset mode */ |
850 | msg.msg.hdr.len = 2; | 851 | msg.msg.hdr.len = 2; |
@@ -853,7 +854,7 @@ static int esd_usb2_close(struct net_device *netdev) | |||
853 | msg.msg.setbaud.rsvd = 0; | 854 | msg.msg.setbaud.rsvd = 0; |
854 | msg.msg.setbaud.baud = cpu_to_le32(ESD_USB2_NO_BAUDRATE); | 855 | msg.msg.setbaud.baud = cpu_to_le32(ESD_USB2_NO_BAUDRATE); |
855 | if (esd_usb2_send_msg(priv->usb2, &msg) < 0) | 856 | if (esd_usb2_send_msg(priv->usb2, &msg) < 0) |
856 | netdev_err(netdev, "sending setbaud message failed\n"); | 857 | dev_err(netdev->dev.parent, "sending setbaud message failed\n"); |
857 | 858 | ||
858 | priv->can.state = CAN_STATE_STOPPED; | 859 | priv->can.state = CAN_STATE_STOPPED; |
859 | 860 | ||
@@ -861,6 +862,8 @@ static int esd_usb2_close(struct net_device *netdev) | |||
861 | 862 | ||
862 | close_candev(netdev); | 863 | close_candev(netdev); |
863 | 864 | ||
865 | priv->open_time = 0; | ||
866 | |||
864 | return 0; | 867 | return 0; |
865 | } | 868 | } |
866 | 869 | ||
@@ -870,7 +873,7 @@ static const struct net_device_ops esd_usb2_netdev_ops = { | |||
870 | .ndo_start_xmit = esd_usb2_start_xmit, | 873 | .ndo_start_xmit = esd_usb2_start_xmit, |
871 | }; | 874 | }; |
872 | 875 | ||
873 | static const struct can_bittiming_const esd_usb2_bittiming_const = { | 876 | static struct can_bittiming_const esd_usb2_bittiming_const = { |
874 | .name = "esd_usb2", | 877 | .name = "esd_usb2", |
875 | .tseg1_min = ESD_USB2_TSEG1_MIN, | 878 | .tseg1_min = ESD_USB2_TSEG1_MIN, |
876 | .tseg1_max = ESD_USB2_TSEG1_MAX, | 879 | .tseg1_max = ESD_USB2_TSEG1_MAX, |
@@ -888,22 +891,11 @@ static int esd_usb2_set_bittiming(struct net_device *netdev) | |||
888 | struct can_bittiming *bt = &priv->can.bittiming; | 891 | struct can_bittiming *bt = &priv->can.bittiming; |
889 | struct esd_usb2_msg msg; | 892 | struct esd_usb2_msg msg; |
890 | u32 canbtr; | 893 | u32 canbtr; |
891 | int sjw_shift; | ||
892 | 894 | ||
893 | canbtr = ESD_USB2_UBR; | 895 | canbtr = ESD_USB2_UBR; |
894 | if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) | ||
895 | canbtr |= ESD_USB2_LOM; | ||
896 | |||
897 | canbtr |= (bt->brp - 1) & (ESD_USB2_BRP_MAX - 1); | 896 | canbtr |= (bt->brp - 1) & (ESD_USB2_BRP_MAX - 1); |
898 | |||
899 | if (le16_to_cpu(priv->usb2->udev->descriptor.idProduct) == | ||
900 | USB_CANUSBM_PRODUCT_ID) | ||
901 | sjw_shift = ESD_USBM_SJW_SHIFT; | ||
902 | else | ||
903 | sjw_shift = ESD_USB2_SJW_SHIFT; | ||
904 | |||
905 | canbtr |= ((bt->sjw - 1) & (ESD_USB2_SJW_MAX - 1)) | 897 | canbtr |= ((bt->sjw - 1) & (ESD_USB2_SJW_MAX - 1)) |
906 | << sjw_shift; | 898 | << ESD_USB2_SJW_SHIFT; |
907 | canbtr |= ((bt->prop_seg + bt->phase_seg1 - 1) | 899 | canbtr |= ((bt->prop_seg + bt->phase_seg1 - 1) |
908 | & (ESD_USB2_TSEG1_MAX - 1)) | 900 | & (ESD_USB2_TSEG1_MAX - 1)) |
909 | << ESD_USB2_TSEG1_SHIFT; | 901 | << ESD_USB2_TSEG1_SHIFT; |
@@ -918,7 +910,7 @@ static int esd_usb2_set_bittiming(struct net_device *netdev) | |||
918 | msg.msg.setbaud.rsvd = 0; | 910 | msg.msg.setbaud.rsvd = 0; |
919 | msg.msg.setbaud.baud = cpu_to_le32(canbtr); | 911 | msg.msg.setbaud.baud = cpu_to_le32(canbtr); |
920 | 912 | ||
921 | netdev_info(netdev, "setting BTR=%#x\n", canbtr); | 913 | dev_info(netdev->dev.parent, "setting BTR=%#x\n", canbtr); |
922 | 914 | ||
923 | return esd_usb2_send_msg(priv->usb2, &msg); | 915 | return esd_usb2_send_msg(priv->usb2, &msg); |
924 | } | 916 | } |
@@ -936,6 +928,11 @@ static int esd_usb2_get_berr_counter(const struct net_device *netdev, | |||
936 | 928 | ||
937 | static int esd_usb2_set_mode(struct net_device *netdev, enum can_mode mode) | 929 | static int esd_usb2_set_mode(struct net_device *netdev, enum can_mode mode) |
938 | { | 930 | { |
931 | struct esd_usb2_net_priv *priv = netdev_priv(netdev); | ||
932 | |||
933 | if (!priv->open_time) | ||
934 | return -EINVAL; | ||
935 | |||
939 | switch (mode) { | 936 | switch (mode) { |
940 | case CAN_MODE_START: | 937 | case CAN_MODE_START: |
941 | netif_wake_queue(netdev); | 938 | netif_wake_queue(netdev); |
@@ -976,20 +973,12 @@ static int esd_usb2_probe_one_net(struct usb_interface *intf, int index) | |||
976 | priv->index = index; | 973 | priv->index = index; |
977 | 974 | ||
978 | priv->can.state = CAN_STATE_STOPPED; | 975 | priv->can.state = CAN_STATE_STOPPED; |
979 | priv->can.ctrlmode_supported = CAN_CTRLMODE_LISTENONLY; | 976 | priv->can.clock.freq = ESD_USB2_CAN_CLOCK; |
980 | |||
981 | if (le16_to_cpu(dev->udev->descriptor.idProduct) == | ||
982 | USB_CANUSBM_PRODUCT_ID) | ||
983 | priv->can.clock.freq = ESD_USBM_CAN_CLOCK; | ||
984 | else { | ||
985 | priv->can.clock.freq = ESD_USB2_CAN_CLOCK; | ||
986 | priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES; | ||
987 | } | ||
988 | |||
989 | priv->can.bittiming_const = &esd_usb2_bittiming_const; | 977 | priv->can.bittiming_const = &esd_usb2_bittiming_const; |
990 | priv->can.do_set_bittiming = esd_usb2_set_bittiming; | 978 | priv->can.do_set_bittiming = esd_usb2_set_bittiming; |
991 | priv->can.do_set_mode = esd_usb2_set_mode; | 979 | priv->can.do_set_mode = esd_usb2_set_mode; |
992 | priv->can.do_get_berr_counter = esd_usb2_get_berr_counter; | 980 | priv->can.do_get_berr_counter = esd_usb2_get_berr_counter; |
981 | priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES; | ||
993 | 982 | ||
994 | netdev->flags |= IFF_ECHO; /* we support local echo */ | 983 | netdev->flags |= IFF_ECHO; /* we support local echo */ |
995 | 984 | ||
@@ -999,14 +988,15 @@ static int esd_usb2_probe_one_net(struct usb_interface *intf, int index) | |||
999 | 988 | ||
1000 | err = register_candev(netdev); | 989 | err = register_candev(netdev); |
1001 | if (err) { | 990 | if (err) { |
1002 | dev_err(&intf->dev, "couldn't register CAN device: %d\n", err); | 991 | dev_err(&intf->dev, |
992 | "couldn't register CAN device: %d\n", err); | ||
1003 | free_candev(netdev); | 993 | free_candev(netdev); |
1004 | err = -ENOMEM; | 994 | err = -ENOMEM; |
1005 | goto done; | 995 | goto done; |
1006 | } | 996 | } |
1007 | 997 | ||
1008 | dev->nets[index] = priv; | 998 | dev->nets[index] = priv; |
1009 | netdev_info(netdev, "device %s registered\n", netdev->name); | 999 | dev_info(netdev->dev.parent, "device %s registered\n", netdev->name); |
1010 | 1000 | ||
1011 | done: | 1001 | done: |
1012 | return err; | 1002 | return err; |
@@ -1118,4 +1108,25 @@ static struct usb_driver esd_usb2_driver = { | |||
1118 | .id_table = esd_usb2_table, | 1108 | .id_table = esd_usb2_table, |
1119 | }; | 1109 | }; |
1120 | 1110 | ||
1121 | module_usb_driver(esd_usb2_driver); | 1111 | static int __init esd_usb2_init(void) |
1112 | { | ||
1113 | int err; | ||
1114 | |||
1115 | /* register this driver with the USB subsystem */ | ||
1116 | err = usb_register(&esd_usb2_driver); | ||
1117 | |||
1118 | if (err) { | ||
1119 | err("usb_register failed. Error number %d\n", err); | ||
1120 | return err; | ||
1121 | } | ||
1122 | |||
1123 | return 0; | ||
1124 | } | ||
1125 | module_init(esd_usb2_init); | ||
1126 | |||
1127 | static void __exit esd_usb2_exit(void) | ||
1128 | { | ||
1129 | /* deregister this driver with the USB subsystem */ | ||
1130 | usb_deregister(&esd_usb2_driver); | ||
1131 | } | ||
1132 | module_exit(esd_usb2_exit); | ||
diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c deleted file mode 100644 index 5b58a4d8739..00000000000 --- a/drivers/net/can/usb/kvaser_usb.c +++ /dev/null | |||
@@ -1,1627 +0,0 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or | ||
3 | * modify it under the terms of the GNU General Public License as | ||
4 | * published by the Free Software Foundation version 2. | ||
5 | * | ||
6 | * Parts of this driver are based on the following: | ||
7 | * - Kvaser linux leaf driver (version 4.78) | ||
8 | * - CAN driver for esd CAN-USB/2 | ||
9 | * | ||
10 | * Copyright (C) 2002-2006 KVASER AB, Sweden. All rights reserved. | ||
11 | * Copyright (C) 2010 Matthias Fuchs <matthias.fuchs@esd.eu>, esd gmbh | ||
12 | * Copyright (C) 2012 Olivier Sobrie <olivier@sobrie.be> | ||
13 | */ | ||
14 | |||
15 | #include <linux/init.h> | ||
16 | #include <linux/completion.h> | ||
17 | #include <linux/module.h> | ||
18 | #include <linux/netdevice.h> | ||
19 | #include <linux/usb.h> | ||
20 | |||
21 | #include <linux/can.h> | ||
22 | #include <linux/can/dev.h> | ||
23 | #include <linux/can/error.h> | ||
24 | |||
25 | #define MAX_TX_URBS 16 | ||
26 | #define MAX_RX_URBS 4 | ||
27 | #define START_TIMEOUT 1000 /* msecs */ | ||
28 | #define STOP_TIMEOUT 1000 /* msecs */ | ||
29 | #define USB_SEND_TIMEOUT 1000 /* msecs */ | ||
30 | #define USB_RECV_TIMEOUT 1000 /* msecs */ | ||
31 | #define RX_BUFFER_SIZE 3072 | ||
32 | #define CAN_USB_CLOCK 8000000 | ||
33 | #define MAX_NET_DEVICES 3 | ||
34 | |||
35 | /* Kvaser USB devices */ | ||
36 | #define KVASER_VENDOR_ID 0x0bfd | ||
37 | #define USB_LEAF_DEVEL_PRODUCT_ID 10 | ||
38 | #define USB_LEAF_LITE_PRODUCT_ID 11 | ||
39 | #define USB_LEAF_PRO_PRODUCT_ID 12 | ||
40 | #define USB_LEAF_SPRO_PRODUCT_ID 14 | ||
41 | #define USB_LEAF_PRO_LS_PRODUCT_ID 15 | ||
42 | #define USB_LEAF_PRO_SWC_PRODUCT_ID 16 | ||
43 | #define USB_LEAF_PRO_LIN_PRODUCT_ID 17 | ||
44 | #define USB_LEAF_SPRO_LS_PRODUCT_ID 18 | ||
45 | #define USB_LEAF_SPRO_SWC_PRODUCT_ID 19 | ||
46 | #define USB_MEMO2_DEVEL_PRODUCT_ID 22 | ||
47 | #define USB_MEMO2_HSHS_PRODUCT_ID 23 | ||
48 | #define USB_UPRO_HSHS_PRODUCT_ID 24 | ||
49 | #define USB_LEAF_LITE_GI_PRODUCT_ID 25 | ||
50 | #define USB_LEAF_PRO_OBDII_PRODUCT_ID 26 | ||
51 | #define USB_MEMO2_HSLS_PRODUCT_ID 27 | ||
52 | #define USB_LEAF_LITE_CH_PRODUCT_ID 28 | ||
53 | #define USB_BLACKBIRD_SPRO_PRODUCT_ID 29 | ||
54 | #define USB_OEM_MERCURY_PRODUCT_ID 34 | ||
55 | #define USB_OEM_LEAF_PRODUCT_ID 35 | ||
56 | #define USB_CAN_R_PRODUCT_ID 39 | ||
57 | |||
58 | /* USB devices features */ | ||
59 | #define KVASER_HAS_SILENT_MODE BIT(0) | ||
60 | #define KVASER_HAS_TXRX_ERRORS BIT(1) | ||
61 | |||
62 | /* Message header size */ | ||
63 | #define MSG_HEADER_LEN 2 | ||
64 | |||
65 | /* Can message flags */ | ||
66 | #define MSG_FLAG_ERROR_FRAME BIT(0) | ||
67 | #define MSG_FLAG_OVERRUN BIT(1) | ||
68 | #define MSG_FLAG_NERR BIT(2) | ||
69 | #define MSG_FLAG_WAKEUP BIT(3) | ||
70 | #define MSG_FLAG_REMOTE_FRAME BIT(4) | ||
71 | #define MSG_FLAG_RESERVED BIT(5) | ||
72 | #define MSG_FLAG_TX_ACK BIT(6) | ||
73 | #define MSG_FLAG_TX_REQUEST BIT(7) | ||
74 | |||
75 | /* Can states */ | ||
76 | #define M16C_STATE_BUS_RESET BIT(0) | ||
77 | #define M16C_STATE_BUS_ERROR BIT(4) | ||
78 | #define M16C_STATE_BUS_PASSIVE BIT(5) | ||
79 | #define M16C_STATE_BUS_OFF BIT(6) | ||
80 | |||
81 | /* Can msg ids */ | ||
82 | #define CMD_RX_STD_MESSAGE 12 | ||
83 | #define CMD_TX_STD_MESSAGE 13 | ||
84 | #define CMD_RX_EXT_MESSAGE 14 | ||
85 | #define CMD_TX_EXT_MESSAGE 15 | ||
86 | #define CMD_SET_BUS_PARAMS 16 | ||
87 | #define CMD_GET_BUS_PARAMS 17 | ||
88 | #define CMD_GET_BUS_PARAMS_REPLY 18 | ||
89 | #define CMD_GET_CHIP_STATE 19 | ||
90 | #define CMD_CHIP_STATE_EVENT 20 | ||
91 | #define CMD_SET_CTRL_MODE 21 | ||
92 | #define CMD_GET_CTRL_MODE 22 | ||
93 | #define CMD_GET_CTRL_MODE_REPLY 23 | ||
94 | #define CMD_RESET_CHIP 24 | ||
95 | #define CMD_RESET_CARD 25 | ||
96 | #define CMD_START_CHIP 26 | ||
97 | #define CMD_START_CHIP_REPLY 27 | ||
98 | #define CMD_STOP_CHIP 28 | ||
99 | #define CMD_STOP_CHIP_REPLY 29 | ||
100 | #define CMD_GET_CARD_INFO2 32 | ||
101 | #define CMD_GET_CARD_INFO 34 | ||
102 | #define CMD_GET_CARD_INFO_REPLY 35 | ||
103 | #define CMD_GET_SOFTWARE_INFO 38 | ||
104 | #define CMD_GET_SOFTWARE_INFO_REPLY 39 | ||
105 | #define CMD_ERROR_EVENT 45 | ||
106 | #define CMD_FLUSH_QUEUE 48 | ||
107 | #define CMD_RESET_ERROR_COUNTER 49 | ||
108 | #define CMD_TX_ACKNOWLEDGE 50 | ||
109 | #define CMD_CAN_ERROR_EVENT 51 | ||
110 | #define CMD_USB_THROTTLE 77 | ||
111 | #define CMD_LOG_MESSAGE 106 | ||
112 | |||
113 | /* error factors */ | ||
114 | #define M16C_EF_ACKE BIT(0) | ||
115 | #define M16C_EF_CRCE BIT(1) | ||
116 | #define M16C_EF_FORME BIT(2) | ||
117 | #define M16C_EF_STFE BIT(3) | ||
118 | #define M16C_EF_BITE0 BIT(4) | ||
119 | #define M16C_EF_BITE1 BIT(5) | ||
120 | #define M16C_EF_RCVE BIT(6) | ||
121 | #define M16C_EF_TRE BIT(7) | ||
122 | |||
123 | /* bittiming parameters */ | ||
124 | #define KVASER_USB_TSEG1_MIN 1 | ||
125 | #define KVASER_USB_TSEG1_MAX 16 | ||
126 | #define KVASER_USB_TSEG2_MIN 1 | ||
127 | #define KVASER_USB_TSEG2_MAX 8 | ||
128 | #define KVASER_USB_SJW_MAX 4 | ||
129 | #define KVASER_USB_BRP_MIN 1 | ||
130 | #define KVASER_USB_BRP_MAX 64 | ||
131 | #define KVASER_USB_BRP_INC 1 | ||
132 | |||
133 | /* ctrl modes */ | ||
134 | #define KVASER_CTRL_MODE_NORMAL 1 | ||
135 | #define KVASER_CTRL_MODE_SILENT 2 | ||
136 | #define KVASER_CTRL_MODE_SELFRECEPTION 3 | ||
137 | #define KVASER_CTRL_MODE_OFF 4 | ||
138 | |||
139 | struct kvaser_msg_simple { | ||
140 | u8 tid; | ||
141 | u8 channel; | ||
142 | } __packed; | ||
143 | |||
144 | struct kvaser_msg_cardinfo { | ||
145 | u8 tid; | ||
146 | u8 nchannels; | ||
147 | __le32 serial_number; | ||
148 | __le32 padding; | ||
149 | __le32 clock_resolution; | ||
150 | __le32 mfgdate; | ||
151 | u8 ean[8]; | ||
152 | u8 hw_revision; | ||
153 | u8 usb_hs_mode; | ||
154 | __le16 padding2; | ||
155 | } __packed; | ||
156 | |||
157 | struct kvaser_msg_cardinfo2 { | ||
158 | u8 tid; | ||
159 | u8 channel; | ||
160 | u8 pcb_id[24]; | ||
161 | __le32 oem_unlock_code; | ||
162 | } __packed; | ||
163 | |||
164 | struct kvaser_msg_softinfo { | ||
165 | u8 tid; | ||
166 | u8 channel; | ||
167 | __le32 sw_options; | ||
168 | __le32 fw_version; | ||
169 | __le16 max_outstanding_tx; | ||
170 | __le16 padding[9]; | ||
171 | } __packed; | ||
172 | |||
173 | struct kvaser_msg_busparams { | ||
174 | u8 tid; | ||
175 | u8 channel; | ||
176 | __le32 bitrate; | ||
177 | u8 tseg1; | ||
178 | u8 tseg2; | ||
179 | u8 sjw; | ||
180 | u8 no_samp; | ||
181 | } __packed; | ||
182 | |||
183 | struct kvaser_msg_tx_can { | ||
184 | u8 channel; | ||
185 | u8 tid; | ||
186 | u8 msg[14]; | ||
187 | u8 padding; | ||
188 | u8 flags; | ||
189 | } __packed; | ||
190 | |||
191 | struct kvaser_msg_rx_can { | ||
192 | u8 channel; | ||
193 | u8 flag; | ||
194 | __le16 time[3]; | ||
195 | u8 msg[14]; | ||
196 | } __packed; | ||
197 | |||
198 | struct kvaser_msg_chip_state_event { | ||
199 | u8 tid; | ||
200 | u8 channel; | ||
201 | __le16 time[3]; | ||
202 | u8 tx_errors_count; | ||
203 | u8 rx_errors_count; | ||
204 | u8 status; | ||
205 | u8 padding[3]; | ||
206 | } __packed; | ||
207 | |||
208 | struct kvaser_msg_tx_acknowledge { | ||
209 | u8 channel; | ||
210 | u8 tid; | ||
211 | __le16 time[3]; | ||
212 | u8 flags; | ||
213 | u8 time_offset; | ||
214 | } __packed; | ||
215 | |||
216 | struct kvaser_msg_error_event { | ||
217 | u8 tid; | ||
218 | u8 flags; | ||
219 | __le16 time[3]; | ||
220 | u8 channel; | ||
221 | u8 padding; | ||
222 | u8 tx_errors_count; | ||
223 | u8 rx_errors_count; | ||
224 | u8 status; | ||
225 | u8 error_factor; | ||
226 | } __packed; | ||
227 | |||
228 | struct kvaser_msg_ctrl_mode { | ||
229 | u8 tid; | ||
230 | u8 channel; | ||
231 | u8 ctrl_mode; | ||
232 | u8 padding[3]; | ||
233 | } __packed; | ||
234 | |||
235 | struct kvaser_msg_flush_queue { | ||
236 | u8 tid; | ||
237 | u8 channel; | ||
238 | u8 flags; | ||
239 | u8 padding[3]; | ||
240 | } __packed; | ||
241 | |||
242 | struct kvaser_msg_log_message { | ||
243 | u8 channel; | ||
244 | u8 flags; | ||
245 | __le16 time[3]; | ||
246 | u8 dlc; | ||
247 | u8 time_offset; | ||
248 | __le32 id; | ||
249 | u8 data[8]; | ||
250 | } __packed; | ||
251 | |||
252 | struct kvaser_msg { | ||
253 | u8 len; | ||
254 | u8 id; | ||
255 | union { | ||
256 | struct kvaser_msg_simple simple; | ||
257 | struct kvaser_msg_cardinfo cardinfo; | ||
258 | struct kvaser_msg_cardinfo2 cardinfo2; | ||
259 | struct kvaser_msg_softinfo softinfo; | ||
260 | struct kvaser_msg_busparams busparams; | ||
261 | struct kvaser_msg_tx_can tx_can; | ||
262 | struct kvaser_msg_rx_can rx_can; | ||
263 | struct kvaser_msg_chip_state_event chip_state_event; | ||
264 | struct kvaser_msg_tx_acknowledge tx_acknowledge; | ||
265 | struct kvaser_msg_error_event error_event; | ||
266 | struct kvaser_msg_ctrl_mode ctrl_mode; | ||
267 | struct kvaser_msg_flush_queue flush_queue; | ||
268 | struct kvaser_msg_log_message log_message; | ||
269 | } u; | ||
270 | } __packed; | ||
271 | |||
272 | struct kvaser_usb_tx_urb_context { | ||
273 | struct kvaser_usb_net_priv *priv; | ||
274 | u32 echo_index; | ||
275 | int dlc; | ||
276 | }; | ||
277 | |||
278 | struct kvaser_usb { | ||
279 | struct usb_device *udev; | ||
280 | struct kvaser_usb_net_priv *nets[MAX_NET_DEVICES]; | ||
281 | |||
282 | struct usb_endpoint_descriptor *bulk_in, *bulk_out; | ||
283 | struct usb_anchor rx_submitted; | ||
284 | |||
285 | u32 fw_version; | ||
286 | unsigned int nchannels; | ||
287 | |||
288 | bool rxinitdone; | ||
289 | void *rxbuf[MAX_RX_URBS]; | ||
290 | dma_addr_t rxbuf_dma[MAX_RX_URBS]; | ||
291 | }; | ||
292 | |||
293 | struct kvaser_usb_net_priv { | ||
294 | struct can_priv can; | ||
295 | |||
296 | atomic_t active_tx_urbs; | ||
297 | struct usb_anchor tx_submitted; | ||
298 | struct kvaser_usb_tx_urb_context tx_contexts[MAX_TX_URBS]; | ||
299 | |||
300 | struct completion start_comp, stop_comp; | ||
301 | |||
302 | struct kvaser_usb *dev; | ||
303 | struct net_device *netdev; | ||
304 | int channel; | ||
305 | |||
306 | struct can_berr_counter bec; | ||
307 | }; | ||
308 | |||
309 | static const struct usb_device_id kvaser_usb_table[] = { | ||
310 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_DEVEL_PRODUCT_ID) }, | ||
311 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_PRODUCT_ID) }, | ||
312 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_PRODUCT_ID), | ||
313 | .driver_info = KVASER_HAS_TXRX_ERRORS | | ||
314 | KVASER_HAS_SILENT_MODE }, | ||
315 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_PRODUCT_ID), | ||
316 | .driver_info = KVASER_HAS_TXRX_ERRORS | | ||
317 | KVASER_HAS_SILENT_MODE }, | ||
318 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_LS_PRODUCT_ID), | ||
319 | .driver_info = KVASER_HAS_TXRX_ERRORS | | ||
320 | KVASER_HAS_SILENT_MODE }, | ||
321 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_SWC_PRODUCT_ID), | ||
322 | .driver_info = KVASER_HAS_TXRX_ERRORS | | ||
323 | KVASER_HAS_SILENT_MODE }, | ||
324 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_LIN_PRODUCT_ID), | ||
325 | .driver_info = KVASER_HAS_TXRX_ERRORS | | ||
326 | KVASER_HAS_SILENT_MODE }, | ||
327 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_LS_PRODUCT_ID), | ||
328 | .driver_info = KVASER_HAS_TXRX_ERRORS | | ||
329 | KVASER_HAS_SILENT_MODE }, | ||
330 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_SWC_PRODUCT_ID), | ||
331 | .driver_info = KVASER_HAS_TXRX_ERRORS | | ||
332 | KVASER_HAS_SILENT_MODE }, | ||
333 | { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_DEVEL_PRODUCT_ID), | ||
334 | .driver_info = KVASER_HAS_TXRX_ERRORS | | ||
335 | KVASER_HAS_SILENT_MODE }, | ||
336 | { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_HSHS_PRODUCT_ID), | ||
337 | .driver_info = KVASER_HAS_TXRX_ERRORS | | ||
338 | KVASER_HAS_SILENT_MODE }, | ||
339 | { USB_DEVICE(KVASER_VENDOR_ID, USB_UPRO_HSHS_PRODUCT_ID), | ||
340 | .driver_info = KVASER_HAS_TXRX_ERRORS }, | ||
341 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_GI_PRODUCT_ID) }, | ||
342 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_OBDII_PRODUCT_ID), | ||
343 | .driver_info = KVASER_HAS_TXRX_ERRORS | | ||
344 | KVASER_HAS_SILENT_MODE }, | ||
345 | { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_HSLS_PRODUCT_ID), | ||
346 | .driver_info = KVASER_HAS_TXRX_ERRORS }, | ||
347 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_CH_PRODUCT_ID), | ||
348 | .driver_info = KVASER_HAS_TXRX_ERRORS }, | ||
349 | { USB_DEVICE(KVASER_VENDOR_ID, USB_BLACKBIRD_SPRO_PRODUCT_ID), | ||
350 | .driver_info = KVASER_HAS_TXRX_ERRORS }, | ||
351 | { USB_DEVICE(KVASER_VENDOR_ID, USB_OEM_MERCURY_PRODUCT_ID), | ||
352 | .driver_info = KVASER_HAS_TXRX_ERRORS }, | ||
353 | { USB_DEVICE(KVASER_VENDOR_ID, USB_OEM_LEAF_PRODUCT_ID), | ||
354 | .driver_info = KVASER_HAS_TXRX_ERRORS }, | ||
355 | { USB_DEVICE(KVASER_VENDOR_ID, USB_CAN_R_PRODUCT_ID), | ||
356 | .driver_info = KVASER_HAS_TXRX_ERRORS }, | ||
357 | { } | ||
358 | }; | ||
359 | MODULE_DEVICE_TABLE(usb, kvaser_usb_table); | ||
360 | |||
361 | static inline int kvaser_usb_send_msg(const struct kvaser_usb *dev, | ||
362 | struct kvaser_msg *msg) | ||
363 | { | ||
364 | int actual_len; | ||
365 | |||
366 | return usb_bulk_msg(dev->udev, | ||
367 | usb_sndbulkpipe(dev->udev, | ||
368 | dev->bulk_out->bEndpointAddress), | ||
369 | msg, msg->len, &actual_len, | ||
370 | USB_SEND_TIMEOUT); | ||
371 | } | ||
372 | |||
373 | static int kvaser_usb_wait_msg(const struct kvaser_usb *dev, u8 id, | ||
374 | struct kvaser_msg *msg) | ||
375 | { | ||
376 | struct kvaser_msg *tmp; | ||
377 | void *buf; | ||
378 | int actual_len; | ||
379 | int err; | ||
380 | int pos = 0; | ||
381 | |||
382 | buf = kzalloc(RX_BUFFER_SIZE, GFP_KERNEL); | ||
383 | if (!buf) | ||
384 | return -ENOMEM; | ||
385 | |||
386 | err = usb_bulk_msg(dev->udev, | ||
387 | usb_rcvbulkpipe(dev->udev, | ||
388 | dev->bulk_in->bEndpointAddress), | ||
389 | buf, RX_BUFFER_SIZE, &actual_len, | ||
390 | USB_RECV_TIMEOUT); | ||
391 | if (err < 0) | ||
392 | goto end; | ||
393 | |||
394 | while (pos <= actual_len - MSG_HEADER_LEN) { | ||
395 | tmp = buf + pos; | ||
396 | |||
397 | if (!tmp->len) | ||
398 | break; | ||
399 | |||
400 | if (pos + tmp->len > actual_len) { | ||
401 | dev_err(dev->udev->dev.parent, "Format error\n"); | ||
402 | break; | ||
403 | } | ||
404 | |||
405 | if (tmp->id == id) { | ||
406 | memcpy(msg, tmp, tmp->len); | ||
407 | goto end; | ||
408 | } | ||
409 | |||
410 | pos += tmp->len; | ||
411 | } | ||
412 | |||
413 | err = -EINVAL; | ||
414 | |||
415 | end: | ||
416 | kfree(buf); | ||
417 | |||
418 | return err; | ||
419 | } | ||
420 | |||
421 | static int kvaser_usb_send_simple_msg(const struct kvaser_usb *dev, | ||
422 | u8 msg_id, int channel) | ||
423 | { | ||
424 | struct kvaser_msg *msg; | ||
425 | int rc; | ||
426 | |||
427 | msg = kmalloc(sizeof(*msg), GFP_KERNEL); | ||
428 | if (!msg) | ||
429 | return -ENOMEM; | ||
430 | |||
431 | msg->id = msg_id; | ||
432 | msg->len = MSG_HEADER_LEN + sizeof(struct kvaser_msg_simple); | ||
433 | msg->u.simple.channel = channel; | ||
434 | msg->u.simple.tid = 0xff; | ||
435 | |||
436 | rc = kvaser_usb_send_msg(dev, msg); | ||
437 | |||
438 | kfree(msg); | ||
439 | return rc; | ||
440 | } | ||
441 | |||
442 | static int kvaser_usb_get_software_info(struct kvaser_usb *dev) | ||
443 | { | ||
444 | struct kvaser_msg msg; | ||
445 | int err; | ||
446 | |||
447 | err = kvaser_usb_send_simple_msg(dev, CMD_GET_SOFTWARE_INFO, 0); | ||
448 | if (err) | ||
449 | return err; | ||
450 | |||
451 | err = kvaser_usb_wait_msg(dev, CMD_GET_SOFTWARE_INFO_REPLY, &msg); | ||
452 | if (err) | ||
453 | return err; | ||
454 | |||
455 | dev->fw_version = le32_to_cpu(msg.u.softinfo.fw_version); | ||
456 | |||
457 | return 0; | ||
458 | } | ||
459 | |||
460 | static int kvaser_usb_get_card_info(struct kvaser_usb *dev) | ||
461 | { | ||
462 | struct kvaser_msg msg; | ||
463 | int err; | ||
464 | |||
465 | err = kvaser_usb_send_simple_msg(dev, CMD_GET_CARD_INFO, 0); | ||
466 | if (err) | ||
467 | return err; | ||
468 | |||
469 | err = kvaser_usb_wait_msg(dev, CMD_GET_CARD_INFO_REPLY, &msg); | ||
470 | if (err) | ||
471 | return err; | ||
472 | |||
473 | dev->nchannels = msg.u.cardinfo.nchannels; | ||
474 | |||
475 | return 0; | ||
476 | } | ||
477 | |||
478 | static void kvaser_usb_tx_acknowledge(const struct kvaser_usb *dev, | ||
479 | const struct kvaser_msg *msg) | ||
480 | { | ||
481 | struct net_device_stats *stats; | ||
482 | struct kvaser_usb_tx_urb_context *context; | ||
483 | struct kvaser_usb_net_priv *priv; | ||
484 | struct sk_buff *skb; | ||
485 | struct can_frame *cf; | ||
486 | u8 channel = msg->u.tx_acknowledge.channel; | ||
487 | u8 tid = msg->u.tx_acknowledge.tid; | ||
488 | |||
489 | if (channel >= dev->nchannels) { | ||
490 | dev_err(dev->udev->dev.parent, | ||
491 | "Invalid channel number (%d)\n", channel); | ||
492 | return; | ||
493 | } | ||
494 | |||
495 | priv = dev->nets[channel]; | ||
496 | |||
497 | if (!netif_device_present(priv->netdev)) | ||
498 | return; | ||
499 | |||
500 | stats = &priv->netdev->stats; | ||
501 | |||
502 | context = &priv->tx_contexts[tid % MAX_TX_URBS]; | ||
503 | |||
504 | /* Sometimes the state change doesn't come after a bus-off event */ | ||
505 | if (priv->can.restart_ms && | ||
506 | (priv->can.state >= CAN_STATE_BUS_OFF)) { | ||
507 | skb = alloc_can_err_skb(priv->netdev, &cf); | ||
508 | if (skb) { | ||
509 | cf->can_id |= CAN_ERR_RESTARTED; | ||
510 | netif_rx(skb); | ||
511 | |||
512 | stats->rx_packets++; | ||
513 | stats->rx_bytes += cf->can_dlc; | ||
514 | } else { | ||
515 | netdev_err(priv->netdev, | ||
516 | "No memory left for err_skb\n"); | ||
517 | } | ||
518 | |||
519 | priv->can.can_stats.restarts++; | ||
520 | netif_carrier_on(priv->netdev); | ||
521 | |||
522 | priv->can.state = CAN_STATE_ERROR_ACTIVE; | ||
523 | } | ||
524 | |||
525 | stats->tx_packets++; | ||
526 | stats->tx_bytes += context->dlc; | ||
527 | can_get_echo_skb(priv->netdev, context->echo_index); | ||
528 | |||
529 | context->echo_index = MAX_TX_URBS; | ||
530 | atomic_dec(&priv->active_tx_urbs); | ||
531 | |||
532 | netif_wake_queue(priv->netdev); | ||
533 | } | ||
534 | |||
535 | static void kvaser_usb_simple_msg_callback(struct urb *urb) | ||
536 | { | ||
537 | struct net_device *netdev = urb->context; | ||
538 | |||
539 | kfree(urb->transfer_buffer); | ||
540 | |||
541 | if (urb->status) | ||
542 | netdev_warn(netdev, "urb status received: %d\n", | ||
543 | urb->status); | ||
544 | } | ||
545 | |||
546 | static int kvaser_usb_simple_msg_async(struct kvaser_usb_net_priv *priv, | ||
547 | u8 msg_id) | ||
548 | { | ||
549 | struct kvaser_usb *dev = priv->dev; | ||
550 | struct net_device *netdev = priv->netdev; | ||
551 | struct kvaser_msg *msg; | ||
552 | struct urb *urb; | ||
553 | void *buf; | ||
554 | int err; | ||
555 | |||
556 | urb = usb_alloc_urb(0, GFP_ATOMIC); | ||
557 | if (!urb) { | ||
558 | netdev_err(netdev, "No memory left for URBs\n"); | ||
559 | return -ENOMEM; | ||
560 | } | ||
561 | |||
562 | buf = kmalloc(sizeof(struct kvaser_msg), GFP_ATOMIC); | ||
563 | if (!buf) { | ||
564 | netdev_err(netdev, "No memory left for USB buffer\n"); | ||
565 | usb_free_urb(urb); | ||
566 | return -ENOMEM; | ||
567 | } | ||
568 | |||
569 | msg = (struct kvaser_msg *)buf; | ||
570 | msg->len = MSG_HEADER_LEN + sizeof(struct kvaser_msg_simple); | ||
571 | msg->id = msg_id; | ||
572 | msg->u.simple.channel = priv->channel; | ||
573 | |||
574 | usb_fill_bulk_urb(urb, dev->udev, | ||
575 | usb_sndbulkpipe(dev->udev, | ||
576 | dev->bulk_out->bEndpointAddress), | ||
577 | buf, msg->len, | ||
578 | kvaser_usb_simple_msg_callback, priv); | ||
579 | usb_anchor_urb(urb, &priv->tx_submitted); | ||
580 | |||
581 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
582 | if (err) { | ||
583 | netdev_err(netdev, "Error transmitting URB\n"); | ||
584 | usb_unanchor_urb(urb); | ||
585 | usb_free_urb(urb); | ||
586 | kfree(buf); | ||
587 | return err; | ||
588 | } | ||
589 | |||
590 | usb_free_urb(urb); | ||
591 | |||
592 | return 0; | ||
593 | } | ||
594 | |||
595 | static void kvaser_usb_unlink_tx_urbs(struct kvaser_usb_net_priv *priv) | ||
596 | { | ||
597 | int i; | ||
598 | |||
599 | usb_kill_anchored_urbs(&priv->tx_submitted); | ||
600 | atomic_set(&priv->active_tx_urbs, 0); | ||
601 | |||
602 | for (i = 0; i < MAX_TX_URBS; i++) | ||
603 | priv->tx_contexts[i].echo_index = MAX_TX_URBS; | ||
604 | } | ||
605 | |||
606 | static void kvaser_usb_rx_error(const struct kvaser_usb *dev, | ||
607 | const struct kvaser_msg *msg) | ||
608 | { | ||
609 | struct can_frame *cf; | ||
610 | struct sk_buff *skb; | ||
611 | struct net_device_stats *stats; | ||
612 | struct kvaser_usb_net_priv *priv; | ||
613 | unsigned int new_state; | ||
614 | u8 channel, status, txerr, rxerr, error_factor; | ||
615 | |||
616 | switch (msg->id) { | ||
617 | case CMD_CAN_ERROR_EVENT: | ||
618 | channel = msg->u.error_event.channel; | ||
619 | status = msg->u.error_event.status; | ||
620 | txerr = msg->u.error_event.tx_errors_count; | ||
621 | rxerr = msg->u.error_event.rx_errors_count; | ||
622 | error_factor = msg->u.error_event.error_factor; | ||
623 | break; | ||
624 | case CMD_LOG_MESSAGE: | ||
625 | channel = msg->u.log_message.channel; | ||
626 | status = msg->u.log_message.data[0]; | ||
627 | txerr = msg->u.log_message.data[2]; | ||
628 | rxerr = msg->u.log_message.data[3]; | ||
629 | error_factor = msg->u.log_message.data[1]; | ||
630 | break; | ||
631 | case CMD_CHIP_STATE_EVENT: | ||
632 | channel = msg->u.chip_state_event.channel; | ||
633 | status = msg->u.chip_state_event.status; | ||
634 | txerr = msg->u.chip_state_event.tx_errors_count; | ||
635 | rxerr = msg->u.chip_state_event.rx_errors_count; | ||
636 | error_factor = 0; | ||
637 | break; | ||
638 | default: | ||
639 | dev_err(dev->udev->dev.parent, "Invalid msg id (%d)\n", | ||
640 | msg->id); | ||
641 | return; | ||
642 | } | ||
643 | |||
644 | if (channel >= dev->nchannels) { | ||
645 | dev_err(dev->udev->dev.parent, | ||
646 | "Invalid channel number (%d)\n", channel); | ||
647 | return; | ||
648 | } | ||
649 | |||
650 | priv = dev->nets[channel]; | ||
651 | stats = &priv->netdev->stats; | ||
652 | |||
653 | if (status & M16C_STATE_BUS_RESET) { | ||
654 | kvaser_usb_unlink_tx_urbs(priv); | ||
655 | return; | ||
656 | } | ||
657 | |||
658 | skb = alloc_can_err_skb(priv->netdev, &cf); | ||
659 | if (!skb) { | ||
660 | stats->rx_dropped++; | ||
661 | return; | ||
662 | } | ||
663 | |||
664 | new_state = priv->can.state; | ||
665 | |||
666 | netdev_dbg(priv->netdev, "Error status: 0x%02x\n", status); | ||
667 | |||
668 | if (status & M16C_STATE_BUS_OFF) { | ||
669 | cf->can_id |= CAN_ERR_BUSOFF; | ||
670 | |||
671 | priv->can.can_stats.bus_off++; | ||
672 | if (!priv->can.restart_ms) | ||
673 | kvaser_usb_simple_msg_async(priv, CMD_STOP_CHIP); | ||
674 | |||
675 | netif_carrier_off(priv->netdev); | ||
676 | |||
677 | new_state = CAN_STATE_BUS_OFF; | ||
678 | } else if (status & M16C_STATE_BUS_PASSIVE) { | ||
679 | if (priv->can.state != CAN_STATE_ERROR_PASSIVE) { | ||
680 | cf->can_id |= CAN_ERR_CRTL; | ||
681 | |||
682 | if (txerr || rxerr) | ||
683 | cf->data[1] = (txerr > rxerr) | ||
684 | ? CAN_ERR_CRTL_TX_PASSIVE | ||
685 | : CAN_ERR_CRTL_RX_PASSIVE; | ||
686 | else | ||
687 | cf->data[1] = CAN_ERR_CRTL_TX_PASSIVE | | ||
688 | CAN_ERR_CRTL_RX_PASSIVE; | ||
689 | |||
690 | priv->can.can_stats.error_passive++; | ||
691 | } | ||
692 | |||
693 | new_state = CAN_STATE_ERROR_PASSIVE; | ||
694 | } | ||
695 | |||
696 | if (status == M16C_STATE_BUS_ERROR) { | ||
697 | if ((priv->can.state < CAN_STATE_ERROR_WARNING) && | ||
698 | ((txerr >= 96) || (rxerr >= 96))) { | ||
699 | cf->can_id |= CAN_ERR_CRTL; | ||
700 | cf->data[1] = (txerr > rxerr) | ||
701 | ? CAN_ERR_CRTL_TX_WARNING | ||
702 | : CAN_ERR_CRTL_RX_WARNING; | ||
703 | |||
704 | priv->can.can_stats.error_warning++; | ||
705 | new_state = CAN_STATE_ERROR_WARNING; | ||
706 | } else if (priv->can.state > CAN_STATE_ERROR_ACTIVE) { | ||
707 | cf->can_id |= CAN_ERR_PROT; | ||
708 | cf->data[2] = CAN_ERR_PROT_ACTIVE; | ||
709 | |||
710 | new_state = CAN_STATE_ERROR_ACTIVE; | ||
711 | } | ||
712 | } | ||
713 | |||
714 | if (!status) { | ||
715 | cf->can_id |= CAN_ERR_PROT; | ||
716 | cf->data[2] = CAN_ERR_PROT_ACTIVE; | ||
717 | |||
718 | new_state = CAN_STATE_ERROR_ACTIVE; | ||
719 | } | ||
720 | |||
721 | if (priv->can.restart_ms && | ||
722 | (priv->can.state >= CAN_STATE_BUS_OFF) && | ||
723 | (new_state < CAN_STATE_BUS_OFF)) { | ||
724 | cf->can_id |= CAN_ERR_RESTARTED; | ||
725 | netif_carrier_on(priv->netdev); | ||
726 | |||
727 | priv->can.can_stats.restarts++; | ||
728 | } | ||
729 | |||
730 | if (error_factor) { | ||
731 | priv->can.can_stats.bus_error++; | ||
732 | stats->rx_errors++; | ||
733 | |||
734 | cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_PROT; | ||
735 | |||
736 | if (error_factor & M16C_EF_ACKE) | ||
737 | cf->data[3] |= (CAN_ERR_PROT_LOC_ACK); | ||
738 | if (error_factor & M16C_EF_CRCE) | ||
739 | cf->data[3] |= (CAN_ERR_PROT_LOC_CRC_SEQ | | ||
740 | CAN_ERR_PROT_LOC_CRC_DEL); | ||
741 | if (error_factor & M16C_EF_FORME) | ||
742 | cf->data[2] |= CAN_ERR_PROT_FORM; | ||
743 | if (error_factor & M16C_EF_STFE) | ||
744 | cf->data[2] |= CAN_ERR_PROT_STUFF; | ||
745 | if (error_factor & M16C_EF_BITE0) | ||
746 | cf->data[2] |= CAN_ERR_PROT_BIT0; | ||
747 | if (error_factor & M16C_EF_BITE1) | ||
748 | cf->data[2] |= CAN_ERR_PROT_BIT1; | ||
749 | if (error_factor & M16C_EF_TRE) | ||
750 | cf->data[2] |= CAN_ERR_PROT_TX; | ||
751 | } | ||
752 | |||
753 | cf->data[6] = txerr; | ||
754 | cf->data[7] = rxerr; | ||
755 | |||
756 | priv->bec.txerr = txerr; | ||
757 | priv->bec.rxerr = rxerr; | ||
758 | |||
759 | priv->can.state = new_state; | ||
760 | |||
761 | netif_rx(skb); | ||
762 | |||
763 | stats->rx_packets++; | ||
764 | stats->rx_bytes += cf->can_dlc; | ||
765 | } | ||
766 | |||
767 | static void kvaser_usb_rx_can_err(const struct kvaser_usb_net_priv *priv, | ||
768 | const struct kvaser_msg *msg) | ||
769 | { | ||
770 | struct can_frame *cf; | ||
771 | struct sk_buff *skb; | ||
772 | struct net_device_stats *stats = &priv->netdev->stats; | ||
773 | |||
774 | if (msg->u.rx_can.flag & (MSG_FLAG_ERROR_FRAME | | ||
775 | MSG_FLAG_NERR)) { | ||
776 | netdev_err(priv->netdev, "Unknow error (flags: 0x%02x)\n", | ||
777 | msg->u.rx_can.flag); | ||
778 | |||
779 | stats->rx_errors++; | ||
780 | return; | ||
781 | } | ||
782 | |||
783 | if (msg->u.rx_can.flag & MSG_FLAG_OVERRUN) { | ||
784 | skb = alloc_can_err_skb(priv->netdev, &cf); | ||
785 | if (!skb) { | ||
786 | stats->rx_dropped++; | ||
787 | return; | ||
788 | } | ||
789 | |||
790 | cf->can_id |= CAN_ERR_CRTL; | ||
791 | cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; | ||
792 | |||
793 | stats->rx_over_errors++; | ||
794 | stats->rx_errors++; | ||
795 | |||
796 | netif_rx(skb); | ||
797 | |||
798 | stats->rx_packets++; | ||
799 | stats->rx_bytes += cf->can_dlc; | ||
800 | } | ||
801 | } | ||
802 | |||
803 | static void kvaser_usb_rx_can_msg(const struct kvaser_usb *dev, | ||
804 | const struct kvaser_msg *msg) | ||
805 | { | ||
806 | struct kvaser_usb_net_priv *priv; | ||
807 | struct can_frame *cf; | ||
808 | struct sk_buff *skb; | ||
809 | struct net_device_stats *stats; | ||
810 | u8 channel = msg->u.rx_can.channel; | ||
811 | |||
812 | if (channel >= dev->nchannels) { | ||
813 | dev_err(dev->udev->dev.parent, | ||
814 | "Invalid channel number (%d)\n", channel); | ||
815 | return; | ||
816 | } | ||
817 | |||
818 | priv = dev->nets[channel]; | ||
819 | stats = &priv->netdev->stats; | ||
820 | |||
821 | if (msg->u.rx_can.flag & (MSG_FLAG_ERROR_FRAME | MSG_FLAG_NERR | | ||
822 | MSG_FLAG_OVERRUN)) { | ||
823 | kvaser_usb_rx_can_err(priv, msg); | ||
824 | return; | ||
825 | } else if (msg->u.rx_can.flag & ~MSG_FLAG_REMOTE_FRAME) { | ||
826 | netdev_warn(priv->netdev, | ||
827 | "Unhandled frame (flags: 0x%02x)", | ||
828 | msg->u.rx_can.flag); | ||
829 | return; | ||
830 | } | ||
831 | |||
832 | skb = alloc_can_skb(priv->netdev, &cf); | ||
833 | if (!skb) { | ||
834 | stats->tx_dropped++; | ||
835 | return; | ||
836 | } | ||
837 | |||
838 | cf->can_id = ((msg->u.rx_can.msg[0] & 0x1f) << 6) | | ||
839 | (msg->u.rx_can.msg[1] & 0x3f); | ||
840 | cf->can_dlc = get_can_dlc(msg->u.rx_can.msg[5]); | ||
841 | |||
842 | if (msg->id == CMD_RX_EXT_MESSAGE) { | ||
843 | cf->can_id <<= 18; | ||
844 | cf->can_id |= ((msg->u.rx_can.msg[2] & 0x0f) << 14) | | ||
845 | ((msg->u.rx_can.msg[3] & 0xff) << 6) | | ||
846 | (msg->u.rx_can.msg[4] & 0x3f); | ||
847 | cf->can_id |= CAN_EFF_FLAG; | ||
848 | } | ||
849 | |||
850 | if (msg->u.rx_can.flag & MSG_FLAG_REMOTE_FRAME) | ||
851 | cf->can_id |= CAN_RTR_FLAG; | ||
852 | else | ||
853 | memcpy(cf->data, &msg->u.rx_can.msg[6], cf->can_dlc); | ||
854 | |||
855 | netif_rx(skb); | ||
856 | |||
857 | stats->rx_packets++; | ||
858 | stats->rx_bytes += cf->can_dlc; | ||
859 | } | ||
860 | |||
861 | static void kvaser_usb_start_chip_reply(const struct kvaser_usb *dev, | ||
862 | const struct kvaser_msg *msg) | ||
863 | { | ||
864 | struct kvaser_usb_net_priv *priv; | ||
865 | u8 channel = msg->u.simple.channel; | ||
866 | |||
867 | if (channel >= dev->nchannels) { | ||
868 | dev_err(dev->udev->dev.parent, | ||
869 | "Invalid channel number (%d)\n", channel); | ||
870 | return; | ||
871 | } | ||
872 | |||
873 | priv = dev->nets[channel]; | ||
874 | |||
875 | if (completion_done(&priv->start_comp) && | ||
876 | netif_queue_stopped(priv->netdev)) { | ||
877 | netif_wake_queue(priv->netdev); | ||
878 | } else { | ||
879 | netif_start_queue(priv->netdev); | ||
880 | complete(&priv->start_comp); | ||
881 | } | ||
882 | } | ||
883 | |||
884 | static void kvaser_usb_stop_chip_reply(const struct kvaser_usb *dev, | ||
885 | const struct kvaser_msg *msg) | ||
886 | { | ||
887 | struct kvaser_usb_net_priv *priv; | ||
888 | u8 channel = msg->u.simple.channel; | ||
889 | |||
890 | if (channel >= dev->nchannels) { | ||
891 | dev_err(dev->udev->dev.parent, | ||
892 | "Invalid channel number (%d)\n", channel); | ||
893 | return; | ||
894 | } | ||
895 | |||
896 | priv = dev->nets[channel]; | ||
897 | |||
898 | complete(&priv->stop_comp); | ||
899 | } | ||
900 | |||
901 | static void kvaser_usb_handle_message(const struct kvaser_usb *dev, | ||
902 | const struct kvaser_msg *msg) | ||
903 | { | ||
904 | switch (msg->id) { | ||
905 | case CMD_START_CHIP_REPLY: | ||
906 | kvaser_usb_start_chip_reply(dev, msg); | ||
907 | break; | ||
908 | |||
909 | case CMD_STOP_CHIP_REPLY: | ||
910 | kvaser_usb_stop_chip_reply(dev, msg); | ||
911 | break; | ||
912 | |||
913 | case CMD_RX_STD_MESSAGE: | ||
914 | case CMD_RX_EXT_MESSAGE: | ||
915 | kvaser_usb_rx_can_msg(dev, msg); | ||
916 | break; | ||
917 | |||
918 | case CMD_CHIP_STATE_EVENT: | ||
919 | case CMD_CAN_ERROR_EVENT: | ||
920 | kvaser_usb_rx_error(dev, msg); | ||
921 | break; | ||
922 | |||
923 | case CMD_LOG_MESSAGE: | ||
924 | if (msg->u.log_message.flags & MSG_FLAG_ERROR_FRAME) | ||
925 | kvaser_usb_rx_error(dev, msg); | ||
926 | break; | ||
927 | |||
928 | case CMD_TX_ACKNOWLEDGE: | ||
929 | kvaser_usb_tx_acknowledge(dev, msg); | ||
930 | break; | ||
931 | |||
932 | default: | ||
933 | dev_warn(dev->udev->dev.parent, | ||
934 | "Unhandled message (%d)\n", msg->id); | ||
935 | break; | ||
936 | } | ||
937 | } | ||
938 | |||
939 | static void kvaser_usb_read_bulk_callback(struct urb *urb) | ||
940 | { | ||
941 | struct kvaser_usb *dev = urb->context; | ||
942 | struct kvaser_msg *msg; | ||
943 | int pos = 0; | ||
944 | int err, i; | ||
945 | |||
946 | switch (urb->status) { | ||
947 | case 0: | ||
948 | break; | ||
949 | case -ENOENT: | ||
950 | case -ESHUTDOWN: | ||
951 | return; | ||
952 | default: | ||
953 | dev_info(dev->udev->dev.parent, "Rx URB aborted (%d)\n", | ||
954 | urb->status); | ||
955 | goto resubmit_urb; | ||
956 | } | ||
957 | |||
958 | while (pos <= urb->actual_length - MSG_HEADER_LEN) { | ||
959 | msg = urb->transfer_buffer + pos; | ||
960 | |||
961 | if (!msg->len) | ||
962 | break; | ||
963 | |||
964 | if (pos + msg->len > urb->actual_length) { | ||
965 | dev_err(dev->udev->dev.parent, "Format error\n"); | ||
966 | break; | ||
967 | } | ||
968 | |||
969 | kvaser_usb_handle_message(dev, msg); | ||
970 | |||
971 | pos += msg->len; | ||
972 | } | ||
973 | |||
974 | resubmit_urb: | ||
975 | usb_fill_bulk_urb(urb, dev->udev, | ||
976 | usb_rcvbulkpipe(dev->udev, | ||
977 | dev->bulk_in->bEndpointAddress), | ||
978 | urb->transfer_buffer, RX_BUFFER_SIZE, | ||
979 | kvaser_usb_read_bulk_callback, dev); | ||
980 | |||
981 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
982 | if (err == -ENODEV) { | ||
983 | for (i = 0; i < dev->nchannels; i++) { | ||
984 | if (!dev->nets[i]) | ||
985 | continue; | ||
986 | |||
987 | netif_device_detach(dev->nets[i]->netdev); | ||
988 | } | ||
989 | } else if (err) { | ||
990 | dev_err(dev->udev->dev.parent, | ||
991 | "Failed resubmitting read bulk urb: %d\n", err); | ||
992 | } | ||
993 | |||
994 | return; | ||
995 | } | ||
996 | |||
997 | static int kvaser_usb_setup_rx_urbs(struct kvaser_usb *dev) | ||
998 | { | ||
999 | int i, err = 0; | ||
1000 | |||
1001 | if (dev->rxinitdone) | ||
1002 | return 0; | ||
1003 | |||
1004 | for (i = 0; i < MAX_RX_URBS; i++) { | ||
1005 | struct urb *urb = NULL; | ||
1006 | u8 *buf = NULL; | ||
1007 | dma_addr_t buf_dma; | ||
1008 | |||
1009 | urb = usb_alloc_urb(0, GFP_KERNEL); | ||
1010 | if (!urb) { | ||
1011 | dev_warn(dev->udev->dev.parent, | ||
1012 | "No memory left for URBs\n"); | ||
1013 | err = -ENOMEM; | ||
1014 | break; | ||
1015 | } | ||
1016 | |||
1017 | buf = usb_alloc_coherent(dev->udev, RX_BUFFER_SIZE, | ||
1018 | GFP_KERNEL, &buf_dma); | ||
1019 | if (!buf) { | ||
1020 | dev_warn(dev->udev->dev.parent, | ||
1021 | "No memory left for USB buffer\n"); | ||
1022 | usb_free_urb(urb); | ||
1023 | err = -ENOMEM; | ||
1024 | break; | ||
1025 | } | ||
1026 | |||
1027 | usb_fill_bulk_urb(urb, dev->udev, | ||
1028 | usb_rcvbulkpipe(dev->udev, | ||
1029 | dev->bulk_in->bEndpointAddress), | ||
1030 | buf, RX_BUFFER_SIZE, | ||
1031 | kvaser_usb_read_bulk_callback, | ||
1032 | dev); | ||
1033 | urb->transfer_dma = buf_dma; | ||
1034 | urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | ||
1035 | usb_anchor_urb(urb, &dev->rx_submitted); | ||
1036 | |||
1037 | err = usb_submit_urb(urb, GFP_KERNEL); | ||
1038 | if (err) { | ||
1039 | usb_unanchor_urb(urb); | ||
1040 | usb_free_coherent(dev->udev, RX_BUFFER_SIZE, buf, | ||
1041 | buf_dma); | ||
1042 | usb_free_urb(urb); | ||
1043 | break; | ||
1044 | } | ||
1045 | |||
1046 | dev->rxbuf[i] = buf; | ||
1047 | dev->rxbuf_dma[i] = buf_dma; | ||
1048 | |||
1049 | usb_free_urb(urb); | ||
1050 | } | ||
1051 | |||
1052 | if (i == 0) { | ||
1053 | dev_warn(dev->udev->dev.parent, | ||
1054 | "Cannot setup read URBs, error %d\n", err); | ||
1055 | return err; | ||
1056 | } else if (i < MAX_RX_URBS) { | ||
1057 | dev_warn(dev->udev->dev.parent, | ||
1058 | "RX performances may be slow\n"); | ||
1059 | } | ||
1060 | |||
1061 | dev->rxinitdone = true; | ||
1062 | |||
1063 | return 0; | ||
1064 | } | ||
1065 | |||
1066 | static int kvaser_usb_set_opt_mode(const struct kvaser_usb_net_priv *priv) | ||
1067 | { | ||
1068 | struct kvaser_msg *msg; | ||
1069 | int rc; | ||
1070 | |||
1071 | msg = kmalloc(sizeof(*msg), GFP_KERNEL); | ||
1072 | if (!msg) | ||
1073 | return -ENOMEM; | ||
1074 | |||
1075 | msg->id = CMD_SET_CTRL_MODE; | ||
1076 | msg->len = MSG_HEADER_LEN + sizeof(struct kvaser_msg_ctrl_mode); | ||
1077 | msg->u.ctrl_mode.tid = 0xff; | ||
1078 | msg->u.ctrl_mode.channel = priv->channel; | ||
1079 | |||
1080 | if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) | ||
1081 | msg->u.ctrl_mode.ctrl_mode = KVASER_CTRL_MODE_SILENT; | ||
1082 | else | ||
1083 | msg->u.ctrl_mode.ctrl_mode = KVASER_CTRL_MODE_NORMAL; | ||
1084 | |||
1085 | rc = kvaser_usb_send_msg(priv->dev, msg); | ||
1086 | |||
1087 | kfree(msg); | ||
1088 | return rc; | ||
1089 | } | ||
1090 | |||
1091 | static int kvaser_usb_start_chip(struct kvaser_usb_net_priv *priv) | ||
1092 | { | ||
1093 | int err; | ||
1094 | |||
1095 | init_completion(&priv->start_comp); | ||
1096 | |||
1097 | err = kvaser_usb_send_simple_msg(priv->dev, CMD_START_CHIP, | ||
1098 | priv->channel); | ||
1099 | if (err) | ||
1100 | return err; | ||
1101 | |||
1102 | if (!wait_for_completion_timeout(&priv->start_comp, | ||
1103 | msecs_to_jiffies(START_TIMEOUT))) | ||
1104 | return -ETIMEDOUT; | ||
1105 | |||
1106 | return 0; | ||
1107 | } | ||
1108 | |||
1109 | static int kvaser_usb_open(struct net_device *netdev) | ||
1110 | { | ||
1111 | struct kvaser_usb_net_priv *priv = netdev_priv(netdev); | ||
1112 | struct kvaser_usb *dev = priv->dev; | ||
1113 | int err; | ||
1114 | |||
1115 | err = open_candev(netdev); | ||
1116 | if (err) | ||
1117 | return err; | ||
1118 | |||
1119 | err = kvaser_usb_setup_rx_urbs(dev); | ||
1120 | if (err) | ||
1121 | goto error; | ||
1122 | |||
1123 | err = kvaser_usb_set_opt_mode(priv); | ||
1124 | if (err) | ||
1125 | goto error; | ||
1126 | |||
1127 | err = kvaser_usb_start_chip(priv); | ||
1128 | if (err) { | ||
1129 | netdev_warn(netdev, "Cannot start device, error %d\n", err); | ||
1130 | goto error; | ||
1131 | } | ||
1132 | |||
1133 | priv->can.state = CAN_STATE_ERROR_ACTIVE; | ||
1134 | |||
1135 | return 0; | ||
1136 | |||
1137 | error: | ||
1138 | close_candev(netdev); | ||
1139 | return err; | ||
1140 | } | ||
1141 | |||
1142 | static void kvaser_usb_unlink_all_urbs(struct kvaser_usb *dev) | ||
1143 | { | ||
1144 | int i; | ||
1145 | |||
1146 | usb_kill_anchored_urbs(&dev->rx_submitted); | ||
1147 | |||
1148 | for (i = 0; i < MAX_RX_URBS; i++) | ||
1149 | usb_free_coherent(dev->udev, RX_BUFFER_SIZE, | ||
1150 | dev->rxbuf[i], | ||
1151 | dev->rxbuf_dma[i]); | ||
1152 | |||
1153 | for (i = 0; i < MAX_NET_DEVICES; i++) { | ||
1154 | struct kvaser_usb_net_priv *priv = dev->nets[i]; | ||
1155 | |||
1156 | if (priv) | ||
1157 | kvaser_usb_unlink_tx_urbs(priv); | ||
1158 | } | ||
1159 | } | ||
1160 | |||
1161 | static int kvaser_usb_stop_chip(struct kvaser_usb_net_priv *priv) | ||
1162 | { | ||
1163 | int err; | ||
1164 | |||
1165 | init_completion(&priv->stop_comp); | ||
1166 | |||
1167 | err = kvaser_usb_send_simple_msg(priv->dev, CMD_STOP_CHIP, | ||
1168 | priv->channel); | ||
1169 | if (err) | ||
1170 | return err; | ||
1171 | |||
1172 | if (!wait_for_completion_timeout(&priv->stop_comp, | ||
1173 | msecs_to_jiffies(STOP_TIMEOUT))) | ||
1174 | return -ETIMEDOUT; | ||
1175 | |||
1176 | return 0; | ||
1177 | } | ||
1178 | |||
1179 | static int kvaser_usb_flush_queue(struct kvaser_usb_net_priv *priv) | ||
1180 | { | ||
1181 | struct kvaser_msg *msg; | ||
1182 | int rc; | ||
1183 | |||
1184 | msg = kmalloc(sizeof(*msg), GFP_KERNEL); | ||
1185 | if (!msg) | ||
1186 | return -ENOMEM; | ||
1187 | |||
1188 | msg->id = CMD_FLUSH_QUEUE; | ||
1189 | msg->len = MSG_HEADER_LEN + sizeof(struct kvaser_msg_flush_queue); | ||
1190 | msg->u.flush_queue.channel = priv->channel; | ||
1191 | msg->u.flush_queue.flags = 0x00; | ||
1192 | |||
1193 | rc = kvaser_usb_send_msg(priv->dev, msg); | ||
1194 | |||
1195 | kfree(msg); | ||
1196 | return rc; | ||
1197 | } | ||
1198 | |||
1199 | static int kvaser_usb_close(struct net_device *netdev) | ||
1200 | { | ||
1201 | struct kvaser_usb_net_priv *priv = netdev_priv(netdev); | ||
1202 | struct kvaser_usb *dev = priv->dev; | ||
1203 | int err; | ||
1204 | |||
1205 | netif_stop_queue(netdev); | ||
1206 | |||
1207 | err = kvaser_usb_flush_queue(priv); | ||
1208 | if (err) | ||
1209 | netdev_warn(netdev, "Cannot flush queue, error %d\n", err); | ||
1210 | |||
1211 | if (kvaser_usb_send_simple_msg(dev, CMD_RESET_CHIP, priv->channel)) | ||
1212 | netdev_warn(netdev, "Cannot reset card, error %d\n", err); | ||
1213 | |||
1214 | err = kvaser_usb_stop_chip(priv); | ||
1215 | if (err) | ||
1216 | netdev_warn(netdev, "Cannot stop device, error %d\n", err); | ||
1217 | |||
1218 | priv->can.state = CAN_STATE_STOPPED; | ||
1219 | close_candev(priv->netdev); | ||
1220 | |||
1221 | return 0; | ||
1222 | } | ||
1223 | |||
1224 | static void kvaser_usb_write_bulk_callback(struct urb *urb) | ||
1225 | { | ||
1226 | struct kvaser_usb_tx_urb_context *context = urb->context; | ||
1227 | struct kvaser_usb_net_priv *priv; | ||
1228 | struct net_device *netdev; | ||
1229 | |||
1230 | if (WARN_ON(!context)) | ||
1231 | return; | ||
1232 | |||
1233 | priv = context->priv; | ||
1234 | netdev = priv->netdev; | ||
1235 | |||
1236 | kfree(urb->transfer_buffer); | ||
1237 | |||
1238 | if (!netif_device_present(netdev)) | ||
1239 | return; | ||
1240 | |||
1241 | if (urb->status) | ||
1242 | netdev_info(netdev, "Tx URB aborted (%d)\n", urb->status); | ||
1243 | } | ||
1244 | |||
1245 | static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | ||
1246 | struct net_device *netdev) | ||
1247 | { | ||
1248 | struct kvaser_usb_net_priv *priv = netdev_priv(netdev); | ||
1249 | struct kvaser_usb *dev = priv->dev; | ||
1250 | struct net_device_stats *stats = &netdev->stats; | ||
1251 | struct can_frame *cf = (struct can_frame *)skb->data; | ||
1252 | struct kvaser_usb_tx_urb_context *context = NULL; | ||
1253 | struct urb *urb; | ||
1254 | void *buf; | ||
1255 | struct kvaser_msg *msg; | ||
1256 | int i, err; | ||
1257 | int ret = NETDEV_TX_OK; | ||
1258 | |||
1259 | if (can_dropped_invalid_skb(netdev, skb)) | ||
1260 | return NETDEV_TX_OK; | ||
1261 | |||
1262 | urb = usb_alloc_urb(0, GFP_ATOMIC); | ||
1263 | if (!urb) { | ||
1264 | netdev_err(netdev, "No memory left for URBs\n"); | ||
1265 | stats->tx_dropped++; | ||
1266 | goto nourbmem; | ||
1267 | } | ||
1268 | |||
1269 | buf = kmalloc(sizeof(struct kvaser_msg), GFP_ATOMIC); | ||
1270 | if (!buf) { | ||
1271 | netdev_err(netdev, "No memory left for USB buffer\n"); | ||
1272 | stats->tx_dropped++; | ||
1273 | goto nobufmem; | ||
1274 | } | ||
1275 | |||
1276 | msg = buf; | ||
1277 | msg->len = MSG_HEADER_LEN + sizeof(struct kvaser_msg_tx_can); | ||
1278 | msg->u.tx_can.flags = 0; | ||
1279 | msg->u.tx_can.channel = priv->channel; | ||
1280 | |||
1281 | if (cf->can_id & CAN_EFF_FLAG) { | ||
1282 | msg->id = CMD_TX_EXT_MESSAGE; | ||
1283 | msg->u.tx_can.msg[0] = (cf->can_id >> 24) & 0x1f; | ||
1284 | msg->u.tx_can.msg[1] = (cf->can_id >> 18) & 0x3f; | ||
1285 | msg->u.tx_can.msg[2] = (cf->can_id >> 14) & 0x0f; | ||
1286 | msg->u.tx_can.msg[3] = (cf->can_id >> 6) & 0xff; | ||
1287 | msg->u.tx_can.msg[4] = cf->can_id & 0x3f; | ||
1288 | } else { | ||
1289 | msg->id = CMD_TX_STD_MESSAGE; | ||
1290 | msg->u.tx_can.msg[0] = (cf->can_id >> 6) & 0x1f; | ||
1291 | msg->u.tx_can.msg[1] = cf->can_id & 0x3f; | ||
1292 | } | ||
1293 | |||
1294 | msg->u.tx_can.msg[5] = cf->can_dlc; | ||
1295 | memcpy(&msg->u.tx_can.msg[6], cf->data, cf->can_dlc); | ||
1296 | |||
1297 | if (cf->can_id & CAN_RTR_FLAG) | ||
1298 | msg->u.tx_can.flags |= MSG_FLAG_REMOTE_FRAME; | ||
1299 | |||
1300 | for (i = 0; i < ARRAY_SIZE(priv->tx_contexts); i++) { | ||
1301 | if (priv->tx_contexts[i].echo_index == MAX_TX_URBS) { | ||
1302 | context = &priv->tx_contexts[i]; | ||
1303 | break; | ||
1304 | } | ||
1305 | } | ||
1306 | |||
1307 | if (!context) { | ||
1308 | netdev_warn(netdev, "cannot find free context\n"); | ||
1309 | ret = NETDEV_TX_BUSY; | ||
1310 | goto releasebuf; | ||
1311 | } | ||
1312 | |||
1313 | context->priv = priv; | ||
1314 | context->echo_index = i; | ||
1315 | context->dlc = cf->can_dlc; | ||
1316 | |||
1317 | msg->u.tx_can.tid = context->echo_index; | ||
1318 | |||
1319 | usb_fill_bulk_urb(urb, dev->udev, | ||
1320 | usb_sndbulkpipe(dev->udev, | ||
1321 | dev->bulk_out->bEndpointAddress), | ||
1322 | buf, msg->len, | ||
1323 | kvaser_usb_write_bulk_callback, context); | ||
1324 | usb_anchor_urb(urb, &priv->tx_submitted); | ||
1325 | |||
1326 | can_put_echo_skb(skb, netdev, context->echo_index); | ||
1327 | |||
1328 | atomic_inc(&priv->active_tx_urbs); | ||
1329 | |||
1330 | if (atomic_read(&priv->active_tx_urbs) >= MAX_TX_URBS) | ||
1331 | netif_stop_queue(netdev); | ||
1332 | |||
1333 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
1334 | if (unlikely(err)) { | ||
1335 | can_free_echo_skb(netdev, context->echo_index); | ||
1336 | |||
1337 | skb = NULL; /* set to NULL to avoid double free in | ||
1338 | * dev_kfree_skb(skb) */ | ||
1339 | |||
1340 | atomic_dec(&priv->active_tx_urbs); | ||
1341 | usb_unanchor_urb(urb); | ||
1342 | |||
1343 | stats->tx_dropped++; | ||
1344 | |||
1345 | if (err == -ENODEV) | ||
1346 | netif_device_detach(netdev); | ||
1347 | else | ||
1348 | netdev_warn(netdev, "Failed tx_urb %d\n", err); | ||
1349 | |||
1350 | goto releasebuf; | ||
1351 | } | ||
1352 | |||
1353 | usb_free_urb(urb); | ||
1354 | |||
1355 | return NETDEV_TX_OK; | ||
1356 | |||
1357 | releasebuf: | ||
1358 | kfree(buf); | ||
1359 | nobufmem: | ||
1360 | usb_free_urb(urb); | ||
1361 | nourbmem: | ||
1362 | dev_kfree_skb(skb); | ||
1363 | return ret; | ||
1364 | } | ||
1365 | |||
1366 | static const struct net_device_ops kvaser_usb_netdev_ops = { | ||
1367 | .ndo_open = kvaser_usb_open, | ||
1368 | .ndo_stop = kvaser_usb_close, | ||
1369 | .ndo_start_xmit = kvaser_usb_start_xmit, | ||
1370 | }; | ||
1371 | |||
1372 | static const struct can_bittiming_const kvaser_usb_bittiming_const = { | ||
1373 | .name = "kvaser_usb", | ||
1374 | .tseg1_min = KVASER_USB_TSEG1_MIN, | ||
1375 | .tseg1_max = KVASER_USB_TSEG1_MAX, | ||
1376 | .tseg2_min = KVASER_USB_TSEG2_MIN, | ||
1377 | .tseg2_max = KVASER_USB_TSEG2_MAX, | ||
1378 | .sjw_max = KVASER_USB_SJW_MAX, | ||
1379 | .brp_min = KVASER_USB_BRP_MIN, | ||
1380 | .brp_max = KVASER_USB_BRP_MAX, | ||
1381 | .brp_inc = KVASER_USB_BRP_INC, | ||
1382 | }; | ||
1383 | |||
1384 | static int kvaser_usb_set_bittiming(struct net_device *netdev) | ||
1385 | { | ||
1386 | struct kvaser_usb_net_priv *priv = netdev_priv(netdev); | ||
1387 | struct can_bittiming *bt = &priv->can.bittiming; | ||
1388 | struct kvaser_usb *dev = priv->dev; | ||
1389 | struct kvaser_msg *msg; | ||
1390 | int rc; | ||
1391 | |||
1392 | msg = kmalloc(sizeof(*msg), GFP_KERNEL); | ||
1393 | if (!msg) | ||
1394 | return -ENOMEM; | ||
1395 | |||
1396 | msg->id = CMD_SET_BUS_PARAMS; | ||
1397 | msg->len = MSG_HEADER_LEN + sizeof(struct kvaser_msg_busparams); | ||
1398 | msg->u.busparams.channel = priv->channel; | ||
1399 | msg->u.busparams.tid = 0xff; | ||
1400 | msg->u.busparams.bitrate = cpu_to_le32(bt->bitrate); | ||
1401 | msg->u.busparams.sjw = bt->sjw; | ||
1402 | msg->u.busparams.tseg1 = bt->prop_seg + bt->phase_seg1; | ||
1403 | msg->u.busparams.tseg2 = bt->phase_seg2; | ||
1404 | |||
1405 | if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) | ||
1406 | msg->u.busparams.no_samp = 3; | ||
1407 | else | ||
1408 | msg->u.busparams.no_samp = 1; | ||
1409 | |||
1410 | rc = kvaser_usb_send_msg(dev, msg); | ||
1411 | |||
1412 | kfree(msg); | ||
1413 | return rc; | ||
1414 | } | ||
1415 | |||
1416 | static int kvaser_usb_set_mode(struct net_device *netdev, | ||
1417 | enum can_mode mode) | ||
1418 | { | ||
1419 | struct kvaser_usb_net_priv *priv = netdev_priv(netdev); | ||
1420 | int err; | ||
1421 | |||
1422 | switch (mode) { | ||
1423 | case CAN_MODE_START: | ||
1424 | err = kvaser_usb_simple_msg_async(priv, CMD_START_CHIP); | ||
1425 | if (err) | ||
1426 | return err; | ||
1427 | break; | ||
1428 | default: | ||
1429 | return -EOPNOTSUPP; | ||
1430 | } | ||
1431 | |||
1432 | return 0; | ||
1433 | } | ||
1434 | |||
1435 | static int kvaser_usb_get_berr_counter(const struct net_device *netdev, | ||
1436 | struct can_berr_counter *bec) | ||
1437 | { | ||
1438 | struct kvaser_usb_net_priv *priv = netdev_priv(netdev); | ||
1439 | |||
1440 | *bec = priv->bec; | ||
1441 | |||
1442 | return 0; | ||
1443 | } | ||
1444 | |||
1445 | static void kvaser_usb_remove_interfaces(struct kvaser_usb *dev) | ||
1446 | { | ||
1447 | int i; | ||
1448 | |||
1449 | for (i = 0; i < dev->nchannels; i++) { | ||
1450 | if (!dev->nets[i]) | ||
1451 | continue; | ||
1452 | |||
1453 | unregister_netdev(dev->nets[i]->netdev); | ||
1454 | } | ||
1455 | |||
1456 | kvaser_usb_unlink_all_urbs(dev); | ||
1457 | |||
1458 | for (i = 0; i < dev->nchannels; i++) { | ||
1459 | if (!dev->nets[i]) | ||
1460 | continue; | ||
1461 | |||
1462 | free_candev(dev->nets[i]->netdev); | ||
1463 | } | ||
1464 | } | ||
1465 | |||
1466 | static int kvaser_usb_init_one(struct usb_interface *intf, | ||
1467 | const struct usb_device_id *id, int channel) | ||
1468 | { | ||
1469 | struct kvaser_usb *dev = usb_get_intfdata(intf); | ||
1470 | struct net_device *netdev; | ||
1471 | struct kvaser_usb_net_priv *priv; | ||
1472 | int i, err; | ||
1473 | |||
1474 | netdev = alloc_candev(sizeof(*priv), MAX_TX_URBS); | ||
1475 | if (!netdev) { | ||
1476 | dev_err(&intf->dev, "Cannot alloc candev\n"); | ||
1477 | return -ENOMEM; | ||
1478 | } | ||
1479 | |||
1480 | priv = netdev_priv(netdev); | ||
1481 | |||
1482 | init_completion(&priv->start_comp); | ||
1483 | init_completion(&priv->stop_comp); | ||
1484 | |||
1485 | init_usb_anchor(&priv->tx_submitted); | ||
1486 | atomic_set(&priv->active_tx_urbs, 0); | ||
1487 | |||
1488 | for (i = 0; i < ARRAY_SIZE(priv->tx_contexts); i++) | ||
1489 | priv->tx_contexts[i].echo_index = MAX_TX_URBS; | ||
1490 | |||
1491 | priv->dev = dev; | ||
1492 | priv->netdev = netdev; | ||
1493 | priv->channel = channel; | ||
1494 | |||
1495 | priv->can.state = CAN_STATE_STOPPED; | ||
1496 | priv->can.clock.freq = CAN_USB_CLOCK; | ||
1497 | priv->can.bittiming_const = &kvaser_usb_bittiming_const; | ||
1498 | priv->can.do_set_bittiming = kvaser_usb_set_bittiming; | ||
1499 | priv->can.do_set_mode = kvaser_usb_set_mode; | ||
1500 | if (id->driver_info & KVASER_HAS_TXRX_ERRORS) | ||
1501 | priv->can.do_get_berr_counter = kvaser_usb_get_berr_counter; | ||
1502 | priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES; | ||
1503 | if (id->driver_info & KVASER_HAS_SILENT_MODE) | ||
1504 | priv->can.ctrlmode_supported |= CAN_CTRLMODE_LISTENONLY; | ||
1505 | |||
1506 | netdev->flags |= IFF_ECHO; | ||
1507 | |||
1508 | netdev->netdev_ops = &kvaser_usb_netdev_ops; | ||
1509 | |||
1510 | SET_NETDEV_DEV(netdev, &intf->dev); | ||
1511 | |||
1512 | dev->nets[channel] = priv; | ||
1513 | |||
1514 | err = register_candev(netdev); | ||
1515 | if (err) { | ||
1516 | dev_err(&intf->dev, "Failed to register can device\n"); | ||
1517 | free_candev(netdev); | ||
1518 | dev->nets[channel] = NULL; | ||
1519 | return err; | ||
1520 | } | ||
1521 | |||
1522 | netdev_dbg(netdev, "device registered\n"); | ||
1523 | |||
1524 | return 0; | ||
1525 | } | ||
1526 | |||
1527 | static void kvaser_usb_get_endpoints(const struct usb_interface *intf, | ||
1528 | struct usb_endpoint_descriptor **in, | ||
1529 | struct usb_endpoint_descriptor **out) | ||
1530 | { | ||
1531 | const struct usb_host_interface *iface_desc; | ||
1532 | struct usb_endpoint_descriptor *endpoint; | ||
1533 | int i; | ||
1534 | |||
1535 | iface_desc = &intf->altsetting[0]; | ||
1536 | |||
1537 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | ||
1538 | endpoint = &iface_desc->endpoint[i].desc; | ||
1539 | |||
1540 | if (usb_endpoint_is_bulk_in(endpoint)) | ||
1541 | *in = endpoint; | ||
1542 | |||
1543 | if (usb_endpoint_is_bulk_out(endpoint)) | ||
1544 | *out = endpoint; | ||
1545 | } | ||
1546 | } | ||
1547 | |||
1548 | static int kvaser_usb_probe(struct usb_interface *intf, | ||
1549 | const struct usb_device_id *id) | ||
1550 | { | ||
1551 | struct kvaser_usb *dev; | ||
1552 | int err = -ENOMEM; | ||
1553 | int i; | ||
1554 | |||
1555 | dev = devm_kzalloc(&intf->dev, sizeof(*dev), GFP_KERNEL); | ||
1556 | if (!dev) | ||
1557 | return -ENOMEM; | ||
1558 | |||
1559 | kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out); | ||
1560 | if (!dev->bulk_in || !dev->bulk_out) { | ||
1561 | dev_err(&intf->dev, "Cannot get usb endpoint(s)"); | ||
1562 | return err; | ||
1563 | } | ||
1564 | |||
1565 | dev->udev = interface_to_usbdev(intf); | ||
1566 | |||
1567 | init_usb_anchor(&dev->rx_submitted); | ||
1568 | |||
1569 | usb_set_intfdata(intf, dev); | ||
1570 | |||
1571 | for (i = 0; i < MAX_NET_DEVICES; i++) | ||
1572 | kvaser_usb_send_simple_msg(dev, CMD_RESET_CHIP, i); | ||
1573 | |||
1574 | err = kvaser_usb_get_software_info(dev); | ||
1575 | if (err) { | ||
1576 | dev_err(&intf->dev, | ||
1577 | "Cannot get software infos, error %d\n", err); | ||
1578 | return err; | ||
1579 | } | ||
1580 | |||
1581 | err = kvaser_usb_get_card_info(dev); | ||
1582 | if (err) { | ||
1583 | dev_err(&intf->dev, | ||
1584 | "Cannot get card infos, error %d\n", err); | ||
1585 | return err; | ||
1586 | } | ||
1587 | |||
1588 | dev_dbg(&intf->dev, "Firmware version: %d.%d.%d\n", | ||
1589 | ((dev->fw_version >> 24) & 0xff), | ||
1590 | ((dev->fw_version >> 16) & 0xff), | ||
1591 | (dev->fw_version & 0xffff)); | ||
1592 | |||
1593 | for (i = 0; i < dev->nchannels; i++) { | ||
1594 | err = kvaser_usb_init_one(intf, id, i); | ||
1595 | if (err) { | ||
1596 | kvaser_usb_remove_interfaces(dev); | ||
1597 | return err; | ||
1598 | } | ||
1599 | } | ||
1600 | |||
1601 | return 0; | ||
1602 | } | ||
1603 | |||
1604 | static void kvaser_usb_disconnect(struct usb_interface *intf) | ||
1605 | { | ||
1606 | struct kvaser_usb *dev = usb_get_intfdata(intf); | ||
1607 | |||
1608 | usb_set_intfdata(intf, NULL); | ||
1609 | |||
1610 | if (!dev) | ||
1611 | return; | ||
1612 | |||
1613 | kvaser_usb_remove_interfaces(dev); | ||
1614 | } | ||
1615 | |||
1616 | static struct usb_driver kvaser_usb_driver = { | ||
1617 | .name = "kvaser_usb", | ||
1618 | .probe = kvaser_usb_probe, | ||
1619 | .disconnect = kvaser_usb_disconnect, | ||
1620 | .id_table = kvaser_usb_table, | ||
1621 | }; | ||
1622 | |||
1623 | module_usb_driver(kvaser_usb_driver); | ||
1624 | |||
1625 | MODULE_AUTHOR("Olivier Sobrie <olivier@sobrie.be>"); | ||
1626 | MODULE_DESCRIPTION("CAN driver for Kvaser CAN/USB devices"); | ||
1627 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/net/can/usb/peak_usb/Makefile b/drivers/net/can/usb/peak_usb/Makefile deleted file mode 100644 index 1aefbc88d64..00000000000 --- a/drivers/net/can/usb/peak_usb/Makefile +++ /dev/null | |||
@@ -1,2 +0,0 @@ | |||
1 | obj-$(CONFIG_CAN_PEAK_USB) += peak_usb.o | ||
2 | peak_usb-y = pcan_usb_core.o pcan_usb.o pcan_usb_pro.o | ||
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb.c b/drivers/net/can/usb/peak_usb/pcan_usb.c deleted file mode 100644 index 25723d8ee20..00000000000 --- a/drivers/net/can/usb/peak_usb/pcan_usb.c +++ /dev/null | |||
@@ -1,903 +0,0 @@ | |||
1 | /* | ||
2 | * CAN driver for PEAK System PCAN-USB adapter | ||
3 | * Derived from the PCAN project file driver/src/pcan_usb.c | ||
4 | * | ||
5 | * Copyright (C) 2003-2010 PEAK System-Technik GmbH | ||
6 | * Copyright (C) 2011-2012 Stephane Grosjean <s.grosjean@peak-system.com> | ||
7 | * | ||
8 | * Many thanks to Klaus Hitschler <klaus.hitschler@gmx.de> | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify it | ||
11 | * under the terms of the GNU General Public License as published | ||
12 | * by the Free Software Foundation; version 2 of the License. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, but | ||
15 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
17 | * General Public License for more details. | ||
18 | */ | ||
19 | #include <linux/netdevice.h> | ||
20 | #include <linux/usb.h> | ||
21 | #include <linux/module.h> | ||
22 | |||
23 | #include <linux/can.h> | ||
24 | #include <linux/can/dev.h> | ||
25 | #include <linux/can/error.h> | ||
26 | |||
27 | #include "pcan_usb_core.h" | ||
28 | |||
29 | MODULE_SUPPORTED_DEVICE("PEAK-System PCAN-USB adapter"); | ||
30 | |||
31 | /* PCAN-USB Endpoints */ | ||
32 | #define PCAN_USB_EP_CMDOUT 1 | ||
33 | #define PCAN_USB_EP_CMDIN (PCAN_USB_EP_CMDOUT | USB_DIR_IN) | ||
34 | #define PCAN_USB_EP_MSGOUT 2 | ||
35 | #define PCAN_USB_EP_MSGIN (PCAN_USB_EP_MSGOUT | USB_DIR_IN) | ||
36 | |||
37 | /* PCAN-USB command struct */ | ||
38 | #define PCAN_USB_CMD_FUNC 0 | ||
39 | #define PCAN_USB_CMD_NUM 1 | ||
40 | #define PCAN_USB_CMD_ARGS 2 | ||
41 | #define PCAN_USB_CMD_ARGS_LEN 14 | ||
42 | #define PCAN_USB_CMD_LEN (PCAN_USB_CMD_ARGS + \ | ||
43 | PCAN_USB_CMD_ARGS_LEN) | ||
44 | |||
45 | /* PCAN-USB command timeout (ms.) */ | ||
46 | #define PCAN_USB_COMMAND_TIMEOUT 1000 | ||
47 | |||
48 | /* PCAN-USB startup timeout (ms.) */ | ||
49 | #define PCAN_USB_STARTUP_TIMEOUT 10 | ||
50 | |||
51 | /* PCAN-USB rx/tx buffers size */ | ||
52 | #define PCAN_USB_RX_BUFFER_SIZE 64 | ||
53 | #define PCAN_USB_TX_BUFFER_SIZE 64 | ||
54 | |||
55 | #define PCAN_USB_MSG_HEADER_LEN 2 | ||
56 | |||
57 | /* PCAN-USB adapter internal clock (MHz) */ | ||
58 | #define PCAN_USB_CRYSTAL_HZ 16000000 | ||
59 | |||
60 | /* PCAN-USB USB message record status/len field */ | ||
61 | #define PCAN_USB_STATUSLEN_TIMESTAMP (1 << 7) | ||
62 | #define PCAN_USB_STATUSLEN_INTERNAL (1 << 6) | ||
63 | #define PCAN_USB_STATUSLEN_EXT_ID (1 << 5) | ||
64 | #define PCAN_USB_STATUSLEN_RTR (1 << 4) | ||
65 | #define PCAN_USB_STATUSLEN_DLC (0xf) | ||
66 | |||
67 | /* PCAN-USB error flags */ | ||
68 | #define PCAN_USB_ERROR_TXFULL 0x01 | ||
69 | #define PCAN_USB_ERROR_RXQOVR 0x02 | ||
70 | #define PCAN_USB_ERROR_BUS_LIGHT 0x04 | ||
71 | #define PCAN_USB_ERROR_BUS_HEAVY 0x08 | ||
72 | #define PCAN_USB_ERROR_BUS_OFF 0x10 | ||
73 | #define PCAN_USB_ERROR_RXQEMPTY 0x20 | ||
74 | #define PCAN_USB_ERROR_QOVR 0x40 | ||
75 | #define PCAN_USB_ERROR_TXQFULL 0x80 | ||
76 | |||
77 | /* SJA1000 modes */ | ||
78 | #define SJA1000_MODE_NORMAL 0x00 | ||
79 | #define SJA1000_MODE_INIT 0x01 | ||
80 | |||
81 | /* | ||
82 | * tick duration = 42.666 us => | ||
83 | * (tick_number * 44739243) >> 20 ~ (tick_number * 42666) / 1000 | ||
84 | * accuracy = 10^-7 | ||
85 | */ | ||
86 | #define PCAN_USB_TS_DIV_SHIFTER 20 | ||
87 | #define PCAN_USB_TS_US_PER_TICK 44739243 | ||
88 | |||
89 | /* PCAN-USB messages record types */ | ||
90 | #define PCAN_USB_REC_ERROR 1 | ||
91 | #define PCAN_USB_REC_ANALOG 2 | ||
92 | #define PCAN_USB_REC_BUSLOAD 3 | ||
93 | #define PCAN_USB_REC_TS 4 | ||
94 | #define PCAN_USB_REC_BUSEVT 5 | ||
95 | |||
96 | /* private to PCAN-USB adapter */ | ||
97 | struct pcan_usb { | ||
98 | struct peak_usb_device dev; | ||
99 | struct peak_time_ref time_ref; | ||
100 | struct timer_list restart_timer; | ||
101 | }; | ||
102 | |||
103 | /* incoming message context for decoding */ | ||
104 | struct pcan_usb_msg_context { | ||
105 | u16 ts16; | ||
106 | u8 prev_ts8; | ||
107 | u8 *ptr; | ||
108 | u8 *end; | ||
109 | u8 rec_cnt; | ||
110 | u8 rec_idx; | ||
111 | u8 rec_data_idx; | ||
112 | struct net_device *netdev; | ||
113 | struct pcan_usb *pdev; | ||
114 | }; | ||
115 | |||
116 | /* | ||
117 | * send a command | ||
118 | */ | ||
119 | static int pcan_usb_send_cmd(struct peak_usb_device *dev, u8 f, u8 n, u8 *p) | ||
120 | { | ||
121 | int err; | ||
122 | int actual_length; | ||
123 | |||
124 | /* usb device unregistered? */ | ||
125 | if (!(dev->state & PCAN_USB_STATE_CONNECTED)) | ||
126 | return 0; | ||
127 | |||
128 | dev->cmd_buf[PCAN_USB_CMD_FUNC] = f; | ||
129 | dev->cmd_buf[PCAN_USB_CMD_NUM] = n; | ||
130 | |||
131 | if (p) | ||
132 | memcpy(dev->cmd_buf + PCAN_USB_CMD_ARGS, | ||
133 | p, PCAN_USB_CMD_ARGS_LEN); | ||
134 | |||
135 | err = usb_bulk_msg(dev->udev, | ||
136 | usb_sndbulkpipe(dev->udev, PCAN_USB_EP_CMDOUT), | ||
137 | dev->cmd_buf, PCAN_USB_CMD_LEN, &actual_length, | ||
138 | PCAN_USB_COMMAND_TIMEOUT); | ||
139 | if (err) | ||
140 | netdev_err(dev->netdev, | ||
141 | "sending cmd f=0x%x n=0x%x failure: %d\n", | ||
142 | f, n, err); | ||
143 | return err; | ||
144 | } | ||
145 | |||
146 | /* | ||
147 | * send a command then wait for its response | ||
148 | */ | ||
149 | static int pcan_usb_wait_rsp(struct peak_usb_device *dev, u8 f, u8 n, u8 *p) | ||
150 | { | ||
151 | int err; | ||
152 | int actual_length; | ||
153 | |||
154 | /* usb device unregistered? */ | ||
155 | if (!(dev->state & PCAN_USB_STATE_CONNECTED)) | ||
156 | return 0; | ||
157 | |||
158 | /* first, send command */ | ||
159 | err = pcan_usb_send_cmd(dev, f, n, NULL); | ||
160 | if (err) | ||
161 | return err; | ||
162 | |||
163 | err = usb_bulk_msg(dev->udev, | ||
164 | usb_rcvbulkpipe(dev->udev, PCAN_USB_EP_CMDIN), | ||
165 | dev->cmd_buf, PCAN_USB_CMD_LEN, &actual_length, | ||
166 | PCAN_USB_COMMAND_TIMEOUT); | ||
167 | if (err) | ||
168 | netdev_err(dev->netdev, | ||
169 | "waiting rsp f=0x%x n=0x%x failure: %d\n", f, n, err); | ||
170 | else if (p) | ||
171 | memcpy(p, dev->cmd_buf + PCAN_USB_CMD_ARGS, | ||
172 | PCAN_USB_CMD_ARGS_LEN); | ||
173 | |||
174 | return err; | ||
175 | } | ||
176 | |||
177 | static int pcan_usb_set_sja1000(struct peak_usb_device *dev, u8 mode) | ||
178 | { | ||
179 | u8 args[PCAN_USB_CMD_ARGS_LEN] = { | ||
180 | [1] = mode, | ||
181 | }; | ||
182 | |||
183 | return pcan_usb_send_cmd(dev, 9, 2, args); | ||
184 | } | ||
185 | |||
186 | static int pcan_usb_set_bus(struct peak_usb_device *dev, u8 onoff) | ||
187 | { | ||
188 | u8 args[PCAN_USB_CMD_ARGS_LEN] = { | ||
189 | [0] = !!onoff, | ||
190 | }; | ||
191 | |||
192 | return pcan_usb_send_cmd(dev, 3, 2, args); | ||
193 | } | ||
194 | |||
195 | static int pcan_usb_set_silent(struct peak_usb_device *dev, u8 onoff) | ||
196 | { | ||
197 | u8 args[PCAN_USB_CMD_ARGS_LEN] = { | ||
198 | [0] = !!onoff, | ||
199 | }; | ||
200 | |||
201 | return pcan_usb_send_cmd(dev, 3, 3, args); | ||
202 | } | ||
203 | |||
204 | static int pcan_usb_set_ext_vcc(struct peak_usb_device *dev, u8 onoff) | ||
205 | { | ||
206 | u8 args[PCAN_USB_CMD_ARGS_LEN] = { | ||
207 | [0] = !!onoff, | ||
208 | }; | ||
209 | |||
210 | return pcan_usb_send_cmd(dev, 10, 2, args); | ||
211 | } | ||
212 | |||
213 | /* | ||
214 | * set bittiming value to can | ||
215 | */ | ||
216 | static int pcan_usb_set_bittiming(struct peak_usb_device *dev, | ||
217 | struct can_bittiming *bt) | ||
218 | { | ||
219 | u8 args[PCAN_USB_CMD_ARGS_LEN]; | ||
220 | u8 btr0, btr1; | ||
221 | |||
222 | btr0 = ((bt->brp - 1) & 0x3f) | (((bt->sjw - 1) & 0x3) << 6); | ||
223 | btr1 = ((bt->prop_seg + bt->phase_seg1 - 1) & 0xf) | | ||
224 | (((bt->phase_seg2 - 1) & 0x7) << 4); | ||
225 | if (dev->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) | ||
226 | btr1 |= 0x80; | ||
227 | |||
228 | netdev_info(dev->netdev, "setting BTR0=0x%02x BTR1=0x%02x\n", | ||
229 | btr0, btr1); | ||
230 | |||
231 | args[0] = btr1; | ||
232 | args[1] = btr0; | ||
233 | |||
234 | return pcan_usb_send_cmd(dev, 1, 2, args); | ||
235 | } | ||
236 | |||
237 | /* | ||
238 | * init/reset can | ||
239 | */ | ||
240 | static int pcan_usb_write_mode(struct peak_usb_device *dev, u8 onoff) | ||
241 | { | ||
242 | int err; | ||
243 | |||
244 | err = pcan_usb_set_bus(dev, onoff); | ||
245 | if (err) | ||
246 | return err; | ||
247 | |||
248 | if (!onoff) { | ||
249 | err = pcan_usb_set_sja1000(dev, SJA1000_MODE_INIT); | ||
250 | } else { | ||
251 | /* the PCAN-USB needs time to init */ | ||
252 | set_current_state(TASK_INTERRUPTIBLE); | ||
253 | schedule_timeout(msecs_to_jiffies(PCAN_USB_STARTUP_TIMEOUT)); | ||
254 | } | ||
255 | |||
256 | return err; | ||
257 | } | ||
258 | |||
259 | /* | ||
260 | * handle end of waiting for the device to reset | ||
261 | */ | ||
262 | static void pcan_usb_restart(unsigned long arg) | ||
263 | { | ||
264 | /* notify candev and netdev */ | ||
265 | peak_usb_restart_complete((struct peak_usb_device *)arg); | ||
266 | } | ||
267 | |||
268 | /* | ||
269 | * handle the submission of the restart urb | ||
270 | */ | ||
271 | static void pcan_usb_restart_pending(struct urb *urb) | ||
272 | { | ||
273 | struct pcan_usb *pdev = urb->context; | ||
274 | |||
275 | /* the PCAN-USB needs time to restart */ | ||
276 | mod_timer(&pdev->restart_timer, | ||
277 | jiffies + msecs_to_jiffies(PCAN_USB_STARTUP_TIMEOUT)); | ||
278 | |||
279 | /* can delete usb resources */ | ||
280 | peak_usb_async_complete(urb); | ||
281 | } | ||
282 | |||
283 | /* | ||
284 | * handle asynchronous restart | ||
285 | */ | ||
286 | static int pcan_usb_restart_async(struct peak_usb_device *dev, struct urb *urb, | ||
287 | u8 *buf) | ||
288 | { | ||
289 | struct pcan_usb *pdev = container_of(dev, struct pcan_usb, dev); | ||
290 | |||
291 | if (timer_pending(&pdev->restart_timer)) | ||
292 | return -EBUSY; | ||
293 | |||
294 | /* set bus on */ | ||
295 | buf[PCAN_USB_CMD_FUNC] = 3; | ||
296 | buf[PCAN_USB_CMD_NUM] = 2; | ||
297 | buf[PCAN_USB_CMD_ARGS] = 1; | ||
298 | |||
299 | usb_fill_bulk_urb(urb, dev->udev, | ||
300 | usb_sndbulkpipe(dev->udev, PCAN_USB_EP_CMDOUT), | ||
301 | buf, PCAN_USB_CMD_LEN, | ||
302 | pcan_usb_restart_pending, pdev); | ||
303 | |||
304 | return usb_submit_urb(urb, GFP_ATOMIC); | ||
305 | } | ||
306 | |||
307 | /* | ||
308 | * read serial number from device | ||
309 | */ | ||
310 | static int pcan_usb_get_serial(struct peak_usb_device *dev, u32 *serial_number) | ||
311 | { | ||
312 | u8 args[PCAN_USB_CMD_ARGS_LEN]; | ||
313 | int err; | ||
314 | |||
315 | err = pcan_usb_wait_rsp(dev, 6, 1, args); | ||
316 | if (err) { | ||
317 | netdev_err(dev->netdev, "getting serial failure: %d\n", err); | ||
318 | } else if (serial_number) { | ||
319 | u32 tmp32; | ||
320 | |||
321 | memcpy(&tmp32, args, 4); | ||
322 | *serial_number = le32_to_cpu(tmp32); | ||
323 | } | ||
324 | |||
325 | return err; | ||
326 | } | ||
327 | |||
328 | /* | ||
329 | * read device id from device | ||
330 | */ | ||
331 | static int pcan_usb_get_device_id(struct peak_usb_device *dev, u32 *device_id) | ||
332 | { | ||
333 | u8 args[PCAN_USB_CMD_ARGS_LEN]; | ||
334 | int err; | ||
335 | |||
336 | err = pcan_usb_wait_rsp(dev, 4, 1, args); | ||
337 | if (err) | ||
338 | netdev_err(dev->netdev, "getting device id failure: %d\n", err); | ||
339 | else if (device_id) | ||
340 | *device_id = args[0]; | ||
341 | |||
342 | return err; | ||
343 | } | ||
344 | |||
345 | /* | ||
346 | * update current time ref with received timestamp | ||
347 | */ | ||
348 | static int pcan_usb_update_ts(struct pcan_usb_msg_context *mc) | ||
349 | { | ||
350 | u16 tmp16; | ||
351 | |||
352 | if ((mc->ptr+2) > mc->end) | ||
353 | return -EINVAL; | ||
354 | |||
355 | memcpy(&tmp16, mc->ptr, 2); | ||
356 | |||
357 | mc->ts16 = le16_to_cpu(tmp16); | ||
358 | |||
359 | if (mc->rec_idx > 0) | ||
360 | peak_usb_update_ts_now(&mc->pdev->time_ref, mc->ts16); | ||
361 | else | ||
362 | peak_usb_set_ts_now(&mc->pdev->time_ref, mc->ts16); | ||
363 | |||
364 | return 0; | ||
365 | } | ||
366 | |||
367 | /* | ||
368 | * decode received timestamp | ||
369 | */ | ||
370 | static int pcan_usb_decode_ts(struct pcan_usb_msg_context *mc, u8 first_packet) | ||
371 | { | ||
372 | /* only 1st packet supplies a word timestamp */ | ||
373 | if (first_packet) { | ||
374 | u16 tmp16; | ||
375 | |||
376 | if ((mc->ptr + 2) > mc->end) | ||
377 | return -EINVAL; | ||
378 | |||
379 | memcpy(&tmp16, mc->ptr, 2); | ||
380 | mc->ptr += 2; | ||
381 | |||
382 | mc->ts16 = le16_to_cpu(tmp16); | ||
383 | mc->prev_ts8 = mc->ts16 & 0x00ff; | ||
384 | } else { | ||
385 | u8 ts8; | ||
386 | |||
387 | if ((mc->ptr + 1) > mc->end) | ||
388 | return -EINVAL; | ||
389 | |||
390 | ts8 = *mc->ptr++; | ||
391 | |||
392 | if (ts8 < mc->prev_ts8) | ||
393 | mc->ts16 += 0x100; | ||
394 | |||
395 | mc->ts16 &= 0xff00; | ||
396 | mc->ts16 |= ts8; | ||
397 | mc->prev_ts8 = ts8; | ||
398 | } | ||
399 | |||
400 | return 0; | ||
401 | } | ||
402 | |||
403 | static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n, | ||
404 | u8 status_len) | ||
405 | { | ||
406 | struct sk_buff *skb; | ||
407 | struct can_frame *cf; | ||
408 | struct timeval tv; | ||
409 | enum can_state new_state; | ||
410 | |||
411 | /* ignore this error until 1st ts received */ | ||
412 | if (n == PCAN_USB_ERROR_QOVR) | ||
413 | if (!mc->pdev->time_ref.tick_count) | ||
414 | return 0; | ||
415 | |||
416 | new_state = mc->pdev->dev.can.state; | ||
417 | |||
418 | switch (mc->pdev->dev.can.state) { | ||
419 | case CAN_STATE_ERROR_ACTIVE: | ||
420 | if (n & PCAN_USB_ERROR_BUS_LIGHT) { | ||
421 | new_state = CAN_STATE_ERROR_WARNING; | ||
422 | break; | ||
423 | } | ||
424 | |||
425 | case CAN_STATE_ERROR_WARNING: | ||
426 | if (n & PCAN_USB_ERROR_BUS_HEAVY) { | ||
427 | new_state = CAN_STATE_ERROR_PASSIVE; | ||
428 | break; | ||
429 | } | ||
430 | if (n & PCAN_USB_ERROR_BUS_OFF) { | ||
431 | new_state = CAN_STATE_BUS_OFF; | ||
432 | break; | ||
433 | } | ||
434 | if (n & (PCAN_USB_ERROR_RXQOVR | PCAN_USB_ERROR_QOVR)) { | ||
435 | /* | ||
436 | * trick to bypass next comparison and process other | ||
437 | * errors | ||
438 | */ | ||
439 | new_state = CAN_STATE_MAX; | ||
440 | break; | ||
441 | } | ||
442 | if ((n & PCAN_USB_ERROR_BUS_LIGHT) == 0) { | ||
443 | /* no error (back to active state) */ | ||
444 | mc->pdev->dev.can.state = CAN_STATE_ERROR_ACTIVE; | ||
445 | return 0; | ||
446 | } | ||
447 | break; | ||
448 | |||
449 | case CAN_STATE_ERROR_PASSIVE: | ||
450 | if (n & PCAN_USB_ERROR_BUS_OFF) { | ||
451 | new_state = CAN_STATE_BUS_OFF; | ||
452 | break; | ||
453 | } | ||
454 | if (n & PCAN_USB_ERROR_BUS_LIGHT) { | ||
455 | new_state = CAN_STATE_ERROR_WARNING; | ||
456 | break; | ||
457 | } | ||
458 | if (n & (PCAN_USB_ERROR_RXQOVR | PCAN_USB_ERROR_QOVR)) { | ||
459 | /* | ||
460 | * trick to bypass next comparison and process other | ||
461 | * errors | ||
462 | */ | ||
463 | new_state = CAN_STATE_MAX; | ||
464 | break; | ||
465 | } | ||
466 | |||
467 | if ((n & PCAN_USB_ERROR_BUS_HEAVY) == 0) { | ||
468 | /* no error (back to active state) */ | ||
469 | mc->pdev->dev.can.state = CAN_STATE_ERROR_ACTIVE; | ||
470 | return 0; | ||
471 | } | ||
472 | break; | ||
473 | |||
474 | default: | ||
475 | /* do nothing waiting for restart */ | ||
476 | return 0; | ||
477 | } | ||
478 | |||
479 | /* donot post any error if current state didn't change */ | ||
480 | if (mc->pdev->dev.can.state == new_state) | ||
481 | return 0; | ||
482 | |||
483 | /* allocate an skb to store the error frame */ | ||
484 | skb = alloc_can_err_skb(mc->netdev, &cf); | ||
485 | if (!skb) | ||
486 | return -ENOMEM; | ||
487 | |||
488 | switch (new_state) { | ||
489 | case CAN_STATE_BUS_OFF: | ||
490 | cf->can_id |= CAN_ERR_BUSOFF; | ||
491 | can_bus_off(mc->netdev); | ||
492 | break; | ||
493 | |||
494 | case CAN_STATE_ERROR_PASSIVE: | ||
495 | cf->can_id |= CAN_ERR_CRTL; | ||
496 | cf->data[1] |= CAN_ERR_CRTL_TX_PASSIVE | | ||
497 | CAN_ERR_CRTL_RX_PASSIVE; | ||
498 | mc->pdev->dev.can.can_stats.error_passive++; | ||
499 | break; | ||
500 | |||
501 | case CAN_STATE_ERROR_WARNING: | ||
502 | cf->can_id |= CAN_ERR_CRTL; | ||
503 | cf->data[1] |= CAN_ERR_CRTL_TX_WARNING | | ||
504 | CAN_ERR_CRTL_RX_WARNING; | ||
505 | mc->pdev->dev.can.can_stats.error_warning++; | ||
506 | break; | ||
507 | |||
508 | default: | ||
509 | /* CAN_STATE_MAX (trick to handle other errors) */ | ||
510 | cf->can_id |= CAN_ERR_CRTL; | ||
511 | cf->data[1] |= CAN_ERR_CRTL_RX_OVERFLOW; | ||
512 | mc->netdev->stats.rx_over_errors++; | ||
513 | mc->netdev->stats.rx_errors++; | ||
514 | |||
515 | new_state = mc->pdev->dev.can.state; | ||
516 | break; | ||
517 | } | ||
518 | |||
519 | mc->pdev->dev.can.state = new_state; | ||
520 | |||
521 | if (status_len & PCAN_USB_STATUSLEN_TIMESTAMP) { | ||
522 | struct skb_shared_hwtstamps *hwts = skb_hwtstamps(skb); | ||
523 | |||
524 | peak_usb_get_ts_tv(&mc->pdev->time_ref, mc->ts16, &tv); | ||
525 | hwts->hwtstamp = timeval_to_ktime(tv); | ||
526 | } | ||
527 | |||
528 | netif_rx(skb); | ||
529 | mc->netdev->stats.rx_packets++; | ||
530 | mc->netdev->stats.rx_bytes += cf->can_dlc; | ||
531 | |||
532 | return 0; | ||
533 | } | ||
534 | |||
535 | /* | ||
536 | * decode non-data usb message | ||
537 | */ | ||
538 | static int pcan_usb_decode_status(struct pcan_usb_msg_context *mc, | ||
539 | u8 status_len) | ||
540 | { | ||
541 | u8 rec_len = status_len & PCAN_USB_STATUSLEN_DLC; | ||
542 | u8 f, n; | ||
543 | int err; | ||
544 | |||
545 | /* check whether function and number can be read */ | ||
546 | if ((mc->ptr + 2) > mc->end) | ||
547 | return -EINVAL; | ||
548 | |||
549 | f = mc->ptr[PCAN_USB_CMD_FUNC]; | ||
550 | n = mc->ptr[PCAN_USB_CMD_NUM]; | ||
551 | mc->ptr += PCAN_USB_CMD_ARGS; | ||
552 | |||
553 | if (status_len & PCAN_USB_STATUSLEN_TIMESTAMP) { | ||
554 | int err = pcan_usb_decode_ts(mc, !mc->rec_idx); | ||
555 | |||
556 | if (err) | ||
557 | return err; | ||
558 | } | ||
559 | |||
560 | switch (f) { | ||
561 | case PCAN_USB_REC_ERROR: | ||
562 | err = pcan_usb_decode_error(mc, n, status_len); | ||
563 | if (err) | ||
564 | return err; | ||
565 | break; | ||
566 | |||
567 | case PCAN_USB_REC_ANALOG: | ||
568 | /* analog values (ignored) */ | ||
569 | rec_len = 2; | ||
570 | break; | ||
571 | |||
572 | case PCAN_USB_REC_BUSLOAD: | ||
573 | /* bus load (ignored) */ | ||
574 | rec_len = 1; | ||
575 | break; | ||
576 | |||
577 | case PCAN_USB_REC_TS: | ||
578 | /* only timestamp */ | ||
579 | if (pcan_usb_update_ts(mc)) | ||
580 | return -EINVAL; | ||
581 | break; | ||
582 | |||
583 | case PCAN_USB_REC_BUSEVT: | ||
584 | /* error frame/bus event */ | ||
585 | if (n & PCAN_USB_ERROR_TXQFULL) | ||
586 | netdev_dbg(mc->netdev, "device Tx queue full)\n"); | ||
587 | break; | ||
588 | default: | ||
589 | netdev_err(mc->netdev, "unexpected function %u\n", f); | ||
590 | break; | ||
591 | } | ||
592 | |||
593 | if ((mc->ptr + rec_len) > mc->end) | ||
594 | return -EINVAL; | ||
595 | |||
596 | mc->ptr += rec_len; | ||
597 | |||
598 | return 0; | ||
599 | } | ||
600 | |||
601 | /* | ||
602 | * decode data usb message | ||
603 | */ | ||
604 | static int pcan_usb_decode_data(struct pcan_usb_msg_context *mc, u8 status_len) | ||
605 | { | ||
606 | u8 rec_len = status_len & PCAN_USB_STATUSLEN_DLC; | ||
607 | struct sk_buff *skb; | ||
608 | struct can_frame *cf; | ||
609 | struct timeval tv; | ||
610 | struct skb_shared_hwtstamps *hwts; | ||
611 | |||
612 | skb = alloc_can_skb(mc->netdev, &cf); | ||
613 | if (!skb) | ||
614 | return -ENOMEM; | ||
615 | |||
616 | if (status_len & PCAN_USB_STATUSLEN_EXT_ID) { | ||
617 | u32 tmp32; | ||
618 | |||
619 | if ((mc->ptr + 4) > mc->end) | ||
620 | goto decode_failed; | ||
621 | |||
622 | memcpy(&tmp32, mc->ptr, 4); | ||
623 | mc->ptr += 4; | ||
624 | |||
625 | cf->can_id = le32_to_cpu(tmp32 >> 3) | CAN_EFF_FLAG; | ||
626 | } else { | ||
627 | u16 tmp16; | ||
628 | |||
629 | if ((mc->ptr + 2) > mc->end) | ||
630 | goto decode_failed; | ||
631 | |||
632 | memcpy(&tmp16, mc->ptr, 2); | ||
633 | mc->ptr += 2; | ||
634 | |||
635 | cf->can_id = le16_to_cpu(tmp16 >> 5); | ||
636 | } | ||
637 | |||
638 | cf->can_dlc = get_can_dlc(rec_len); | ||
639 | |||
640 | /* first data packet timestamp is a word */ | ||
641 | if (pcan_usb_decode_ts(mc, !mc->rec_data_idx)) | ||
642 | goto decode_failed; | ||
643 | |||
644 | /* read data */ | ||
645 | memset(cf->data, 0x0, sizeof(cf->data)); | ||
646 | if (status_len & PCAN_USB_STATUSLEN_RTR) { | ||
647 | cf->can_id |= CAN_RTR_FLAG; | ||
648 | } else { | ||
649 | if ((mc->ptr + rec_len) > mc->end) | ||
650 | goto decode_failed; | ||
651 | |||
652 | memcpy(cf->data, mc->ptr, rec_len); | ||
653 | mc->ptr += rec_len; | ||
654 | } | ||
655 | |||
656 | /* convert timestamp into kernel time */ | ||
657 | peak_usb_get_ts_tv(&mc->pdev->time_ref, mc->ts16, &tv); | ||
658 | hwts = skb_hwtstamps(skb); | ||
659 | hwts->hwtstamp = timeval_to_ktime(tv); | ||
660 | |||
661 | /* push the skb */ | ||
662 | netif_rx(skb); | ||
663 | |||
664 | /* update statistics */ | ||
665 | mc->netdev->stats.rx_packets++; | ||
666 | mc->netdev->stats.rx_bytes += cf->can_dlc; | ||
667 | |||
668 | return 0; | ||
669 | |||
670 | decode_failed: | ||
671 | dev_kfree_skb(skb); | ||
672 | return -EINVAL; | ||
673 | } | ||
674 | |||
675 | /* | ||
676 | * process incoming message | ||
677 | */ | ||
678 | static int pcan_usb_decode_msg(struct peak_usb_device *dev, u8 *ibuf, u32 lbuf) | ||
679 | { | ||
680 | struct pcan_usb_msg_context mc = { | ||
681 | .rec_cnt = ibuf[1], | ||
682 | .ptr = ibuf + PCAN_USB_MSG_HEADER_LEN, | ||
683 | .end = ibuf + lbuf, | ||
684 | .netdev = dev->netdev, | ||
685 | .pdev = container_of(dev, struct pcan_usb, dev), | ||
686 | }; | ||
687 | int err; | ||
688 | |||
689 | for (err = 0; mc.rec_idx < mc.rec_cnt && !err; mc.rec_idx++) { | ||
690 | u8 sl = *mc.ptr++; | ||
691 | |||
692 | /* handle status and error frames here */ | ||
693 | if (sl & PCAN_USB_STATUSLEN_INTERNAL) { | ||
694 | err = pcan_usb_decode_status(&mc, sl); | ||
695 | /* handle normal can frames here */ | ||
696 | } else { | ||
697 | err = pcan_usb_decode_data(&mc, sl); | ||
698 | mc.rec_data_idx++; | ||
699 | } | ||
700 | } | ||
701 | |||
702 | return err; | ||
703 | } | ||
704 | |||
705 | /* | ||
706 | * process any incoming buffer | ||
707 | */ | ||
708 | static int pcan_usb_decode_buf(struct peak_usb_device *dev, struct urb *urb) | ||
709 | { | ||
710 | int err = 0; | ||
711 | |||
712 | if (urb->actual_length > PCAN_USB_MSG_HEADER_LEN) { | ||
713 | err = pcan_usb_decode_msg(dev, urb->transfer_buffer, | ||
714 | urb->actual_length); | ||
715 | |||
716 | } else if (urb->actual_length > 0) { | ||
717 | netdev_err(dev->netdev, "usb message length error (%u)\n", | ||
718 | urb->actual_length); | ||
719 | err = -EINVAL; | ||
720 | } | ||
721 | |||
722 | return err; | ||
723 | } | ||
724 | |||
725 | /* | ||
726 | * process outgoing packet | ||
727 | */ | ||
728 | static int pcan_usb_encode_msg(struct peak_usb_device *dev, struct sk_buff *skb, | ||
729 | u8 *obuf, size_t *size) | ||
730 | { | ||
731 | struct net_device *netdev = dev->netdev; | ||
732 | struct net_device_stats *stats = &netdev->stats; | ||
733 | struct can_frame *cf = (struct can_frame *)skb->data; | ||
734 | u8 *pc; | ||
735 | |||
736 | obuf[0] = 2; | ||
737 | obuf[1] = 1; | ||
738 | |||
739 | pc = obuf + PCAN_USB_MSG_HEADER_LEN; | ||
740 | |||
741 | /* status/len byte */ | ||
742 | *pc = cf->can_dlc; | ||
743 | if (cf->can_id & CAN_RTR_FLAG) | ||
744 | *pc |= PCAN_USB_STATUSLEN_RTR; | ||
745 | |||
746 | /* can id */ | ||
747 | if (cf->can_id & CAN_EFF_FLAG) { | ||
748 | __le32 tmp32 = cpu_to_le32((cf->can_id & CAN_ERR_MASK) << 3); | ||
749 | |||
750 | *pc |= PCAN_USB_STATUSLEN_EXT_ID; | ||
751 | memcpy(++pc, &tmp32, 4); | ||
752 | pc += 4; | ||
753 | } else { | ||
754 | __le16 tmp16 = cpu_to_le16((cf->can_id & CAN_ERR_MASK) << 5); | ||
755 | |||
756 | memcpy(++pc, &tmp16, 2); | ||
757 | pc += 2; | ||
758 | } | ||
759 | |||
760 | /* can data */ | ||
761 | if (!(cf->can_id & CAN_RTR_FLAG)) { | ||
762 | memcpy(pc, cf->data, cf->can_dlc); | ||
763 | pc += cf->can_dlc; | ||
764 | } | ||
765 | |||
766 | obuf[(*size)-1] = (u8)(stats->tx_packets & 0xff); | ||
767 | |||
768 | return 0; | ||
769 | } | ||
770 | |||
771 | /* | ||
772 | * start interface | ||
773 | */ | ||
774 | static int pcan_usb_start(struct peak_usb_device *dev) | ||
775 | { | ||
776 | struct pcan_usb *pdev = container_of(dev, struct pcan_usb, dev); | ||
777 | |||
778 | /* number of bits used in timestamps read from adapter struct */ | ||
779 | peak_usb_init_time_ref(&pdev->time_ref, &pcan_usb); | ||
780 | |||
781 | /* if revision greater than 3, can put silent mode on/off */ | ||
782 | if (dev->device_rev > 3) { | ||
783 | int err; | ||
784 | |||
785 | err = pcan_usb_set_silent(dev, | ||
786 | dev->can.ctrlmode & CAN_CTRLMODE_LISTENONLY); | ||
787 | if (err) | ||
788 | return err; | ||
789 | } | ||
790 | |||
791 | return pcan_usb_set_ext_vcc(dev, 0); | ||
792 | } | ||
793 | |||
794 | static int pcan_usb_init(struct peak_usb_device *dev) | ||
795 | { | ||
796 | struct pcan_usb *pdev = container_of(dev, struct pcan_usb, dev); | ||
797 | u32 serial_number; | ||
798 | int err; | ||
799 | |||
800 | /* initialize a timer needed to wait for hardware restart */ | ||
801 | init_timer(&pdev->restart_timer); | ||
802 | pdev->restart_timer.function = pcan_usb_restart; | ||
803 | pdev->restart_timer.data = (unsigned long)dev; | ||
804 | |||
805 | /* | ||
806 | * explicit use of dev_xxx() instead of netdev_xxx() here: | ||
807 | * information displayed are related to the device itself, not | ||
808 | * to the canx netdevice. | ||
809 | */ | ||
810 | err = pcan_usb_get_serial(dev, &serial_number); | ||
811 | if (err) { | ||
812 | dev_err(dev->netdev->dev.parent, | ||
813 | "unable to read %s serial number (err %d)\n", | ||
814 | pcan_usb.name, err); | ||
815 | return err; | ||
816 | } | ||
817 | |||
818 | dev_info(dev->netdev->dev.parent, | ||
819 | "PEAK-System %s adapter hwrev %u serial %08X (%u channel)\n", | ||
820 | pcan_usb.name, dev->device_rev, serial_number, | ||
821 | pcan_usb.ctrl_count); | ||
822 | |||
823 | return 0; | ||
824 | } | ||
825 | |||
826 | /* | ||
827 | * probe function for new PCAN-USB usb interface | ||
828 | */ | ||
829 | static int pcan_usb_probe(struct usb_interface *intf) | ||
830 | { | ||
831 | struct usb_host_interface *if_desc; | ||
832 | int i; | ||
833 | |||
834 | if_desc = intf->altsetting; | ||
835 | |||
836 | /* check interface endpoint addresses */ | ||
837 | for (i = 0; i < if_desc->desc.bNumEndpoints; i++) { | ||
838 | struct usb_endpoint_descriptor *ep = &if_desc->endpoint[i].desc; | ||
839 | |||
840 | switch (ep->bEndpointAddress) { | ||
841 | case PCAN_USB_EP_CMDOUT: | ||
842 | case PCAN_USB_EP_CMDIN: | ||
843 | case PCAN_USB_EP_MSGOUT: | ||
844 | case PCAN_USB_EP_MSGIN: | ||
845 | break; | ||
846 | default: | ||
847 | return -ENODEV; | ||
848 | } | ||
849 | } | ||
850 | |||
851 | return 0; | ||
852 | } | ||
853 | |||
854 | /* | ||
855 | * describe the PCAN-USB adapter | ||
856 | */ | ||
857 | struct peak_usb_adapter pcan_usb = { | ||
858 | .name = "PCAN-USB", | ||
859 | .device_id = PCAN_USB_PRODUCT_ID, | ||
860 | .ctrl_count = 1, | ||
861 | .clock = { | ||
862 | .freq = PCAN_USB_CRYSTAL_HZ / 2 , | ||
863 | }, | ||
864 | .bittiming_const = { | ||
865 | .name = "pcan_usb", | ||
866 | .tseg1_min = 1, | ||
867 | .tseg1_max = 16, | ||
868 | .tseg2_min = 1, | ||
869 | .tseg2_max = 8, | ||
870 | .sjw_max = 4, | ||
871 | .brp_min = 1, | ||
872 | .brp_max = 64, | ||
873 | .brp_inc = 1, | ||
874 | }, | ||
875 | |||
876 | /* size of device private data */ | ||
877 | .sizeof_dev_private = sizeof(struct pcan_usb), | ||
878 | |||
879 | /* timestamps usage */ | ||
880 | .ts_used_bits = 16, | ||
881 | .ts_period = 24575, /* calibration period in ts. */ | ||
882 | .us_per_ts_scale = PCAN_USB_TS_US_PER_TICK, /* us=(ts*scale) */ | ||
883 | .us_per_ts_shift = PCAN_USB_TS_DIV_SHIFTER, /* >> shift */ | ||
884 | |||
885 | /* give here messages in/out endpoints */ | ||
886 | .ep_msg_in = PCAN_USB_EP_MSGIN, | ||
887 | .ep_msg_out = {PCAN_USB_EP_MSGOUT}, | ||
888 | |||
889 | /* size of rx/tx usb buffers */ | ||
890 | .rx_buffer_size = PCAN_USB_RX_BUFFER_SIZE, | ||
891 | .tx_buffer_size = PCAN_USB_TX_BUFFER_SIZE, | ||
892 | |||
893 | /* device callbacks */ | ||
894 | .intf_probe = pcan_usb_probe, | ||
895 | .dev_init = pcan_usb_init, | ||
896 | .dev_set_bus = pcan_usb_write_mode, | ||
897 | .dev_set_bittiming = pcan_usb_set_bittiming, | ||
898 | .dev_get_device_id = pcan_usb_get_device_id, | ||
899 | .dev_decode_buf = pcan_usb_decode_buf, | ||
900 | .dev_encode_msg = pcan_usb_encode_msg, | ||
901 | .dev_start = pcan_usb_start, | ||
902 | .dev_restart_async = pcan_usb_restart_async, | ||
903 | }; | ||
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_core.c b/drivers/net/can/usb/peak_usb/pcan_usb_core.c deleted file mode 100644 index d9290ea788e..00000000000 --- a/drivers/net/can/usb/peak_usb/pcan_usb_core.c +++ /dev/null | |||
@@ -1,946 +0,0 @@ | |||
1 | /* | ||
2 | * CAN driver for PEAK System USB adapters | ||
3 | * Derived from the PCAN project file driver/src/pcan_usb_core.c | ||
4 | * | ||
5 | * Copyright (C) 2003-2010 PEAK System-Technik GmbH | ||
6 | * Copyright (C) 2010-2012 Stephane Grosjean <s.grosjean@peak-system.com> | ||
7 | * | ||
8 | * Many thanks to Klaus Hitschler <klaus.hitschler@gmx.de> | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify it | ||
11 | * under the terms of the GNU General Public License as published | ||
12 | * by the Free Software Foundation; version 2 of the License. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, but | ||
15 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
17 | * General Public License for more details. | ||
18 | */ | ||
19 | #include <linux/init.h> | ||
20 | #include <linux/signal.h> | ||
21 | #include <linux/slab.h> | ||
22 | #include <linux/module.h> | ||
23 | #include <linux/netdevice.h> | ||
24 | #include <linux/usb.h> | ||
25 | |||
26 | #include <linux/can.h> | ||
27 | #include <linux/can/dev.h> | ||
28 | #include <linux/can/error.h> | ||
29 | |||
30 | #include "pcan_usb_core.h" | ||
31 | |||
32 | MODULE_AUTHOR("Stephane Grosjean <s.grosjean@peak-system.com>"); | ||
33 | MODULE_DESCRIPTION("CAN driver for PEAK-System USB adapters"); | ||
34 | MODULE_LICENSE("GPL v2"); | ||
35 | |||
36 | /* Table of devices that work with this driver */ | ||
37 | static struct usb_device_id peak_usb_table[] = { | ||
38 | {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USB_PRODUCT_ID)}, | ||
39 | {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBPRO_PRODUCT_ID)}, | ||
40 | {} /* Terminating entry */ | ||
41 | }; | ||
42 | |||
43 | MODULE_DEVICE_TABLE(usb, peak_usb_table); | ||
44 | |||
45 | /* List of supported PCAN-USB adapters (NULL terminated list) */ | ||
46 | static struct peak_usb_adapter *peak_usb_adapters_list[] = { | ||
47 | &pcan_usb, | ||
48 | &pcan_usb_pro, | ||
49 | NULL, | ||
50 | }; | ||
51 | |||
52 | /* | ||
53 | * dump memory | ||
54 | */ | ||
55 | #define DUMP_WIDTH 16 | ||
56 | void pcan_dump_mem(char *prompt, void *p, int l) | ||
57 | { | ||
58 | pr_info("%s dumping %s (%d bytes):\n", | ||
59 | PCAN_USB_DRIVER_NAME, prompt ? prompt : "memory", l); | ||
60 | print_hex_dump(KERN_INFO, PCAN_USB_DRIVER_NAME " ", DUMP_PREFIX_NONE, | ||
61 | DUMP_WIDTH, 1, p, l, false); | ||
62 | } | ||
63 | |||
64 | /* | ||
65 | * initialize a time_ref object with usb adapter own settings | ||
66 | */ | ||
67 | void peak_usb_init_time_ref(struct peak_time_ref *time_ref, | ||
68 | struct peak_usb_adapter *adapter) | ||
69 | { | ||
70 | if (time_ref) { | ||
71 | memset(time_ref, 0, sizeof(struct peak_time_ref)); | ||
72 | time_ref->adapter = adapter; | ||
73 | } | ||
74 | } | ||
75 | |||
76 | static void peak_usb_add_us(struct timeval *tv, u32 delta_us) | ||
77 | { | ||
78 | /* number of s. to add to final time */ | ||
79 | u32 delta_s = delta_us / 1000000; | ||
80 | |||
81 | delta_us -= delta_s * 1000000; | ||
82 | |||
83 | tv->tv_usec += delta_us; | ||
84 | if (tv->tv_usec >= 1000000) { | ||
85 | tv->tv_usec -= 1000000; | ||
86 | delta_s++; | ||
87 | } | ||
88 | tv->tv_sec += delta_s; | ||
89 | } | ||
90 | |||
91 | /* | ||
92 | * sometimes, another now may be more recent than current one... | ||
93 | */ | ||
94 | void peak_usb_update_ts_now(struct peak_time_ref *time_ref, u32 ts_now) | ||
95 | { | ||
96 | time_ref->ts_dev_2 = ts_now; | ||
97 | |||
98 | /* should wait at least two passes before computing */ | ||
99 | if (time_ref->tv_host.tv_sec > 0) { | ||
100 | u32 delta_ts = time_ref->ts_dev_2 - time_ref->ts_dev_1; | ||
101 | |||
102 | if (time_ref->ts_dev_2 < time_ref->ts_dev_1) | ||
103 | delta_ts &= (1 << time_ref->adapter->ts_used_bits) - 1; | ||
104 | |||
105 | time_ref->ts_total += delta_ts; | ||
106 | } | ||
107 | } | ||
108 | |||
109 | /* | ||
110 | * register device timestamp as now | ||
111 | */ | ||
112 | void peak_usb_set_ts_now(struct peak_time_ref *time_ref, u32 ts_now) | ||
113 | { | ||
114 | if (time_ref->tv_host_0.tv_sec == 0) { | ||
115 | /* use monotonic clock to correctly compute further deltas */ | ||
116 | time_ref->tv_host_0 = ktime_to_timeval(ktime_get()); | ||
117 | time_ref->tv_host.tv_sec = 0; | ||
118 | } else { | ||
119 | /* | ||
120 | * delta_us should not be >= 2^32 => delta_s should be < 4294 | ||
121 | * handle 32-bits wrapping here: if count of s. reaches 4200, | ||
122 | * reset counters and change time base | ||
123 | */ | ||
124 | if (time_ref->tv_host.tv_sec != 0) { | ||
125 | u32 delta_s = time_ref->tv_host.tv_sec | ||
126 | - time_ref->tv_host_0.tv_sec; | ||
127 | if (delta_s > 4200) { | ||
128 | time_ref->tv_host_0 = time_ref->tv_host; | ||
129 | time_ref->ts_total = 0; | ||
130 | } | ||
131 | } | ||
132 | |||
133 | time_ref->tv_host = ktime_to_timeval(ktime_get()); | ||
134 | time_ref->tick_count++; | ||
135 | } | ||
136 | |||
137 | time_ref->ts_dev_1 = time_ref->ts_dev_2; | ||
138 | peak_usb_update_ts_now(time_ref, ts_now); | ||
139 | } | ||
140 | |||
141 | /* | ||
142 | * compute timeval according to current ts and time_ref data | ||
143 | */ | ||
144 | void peak_usb_get_ts_tv(struct peak_time_ref *time_ref, u32 ts, | ||
145 | struct timeval *tv) | ||
146 | { | ||
147 | /* protect from getting timeval before setting now */ | ||
148 | if (time_ref->tv_host.tv_sec > 0) { | ||
149 | u64 delta_us; | ||
150 | |||
151 | delta_us = ts - time_ref->ts_dev_2; | ||
152 | if (ts < time_ref->ts_dev_2) | ||
153 | delta_us &= (1 << time_ref->adapter->ts_used_bits) - 1; | ||
154 | |||
155 | delta_us += time_ref->ts_total; | ||
156 | |||
157 | delta_us *= time_ref->adapter->us_per_ts_scale; | ||
158 | delta_us >>= time_ref->adapter->us_per_ts_shift; | ||
159 | |||
160 | *tv = time_ref->tv_host_0; | ||
161 | peak_usb_add_us(tv, (u32)delta_us); | ||
162 | } else { | ||
163 | *tv = ktime_to_timeval(ktime_get()); | ||
164 | } | ||
165 | } | ||
166 | |||
167 | /* | ||
168 | * callback for bulk Rx urb | ||
169 | */ | ||
170 | static void peak_usb_read_bulk_callback(struct urb *urb) | ||
171 | { | ||
172 | struct peak_usb_device *dev = urb->context; | ||
173 | struct net_device *netdev; | ||
174 | int err; | ||
175 | |||
176 | netdev = dev->netdev; | ||
177 | |||
178 | if (!netif_device_present(netdev)) | ||
179 | return; | ||
180 | |||
181 | /* check reception status */ | ||
182 | switch (urb->status) { | ||
183 | case 0: | ||
184 | /* success */ | ||
185 | break; | ||
186 | |||
187 | case -EILSEQ: | ||
188 | case -ENOENT: | ||
189 | case -ECONNRESET: | ||
190 | case -ESHUTDOWN: | ||
191 | return; | ||
192 | |||
193 | default: | ||
194 | if (net_ratelimit()) | ||
195 | netdev_err(netdev, | ||
196 | "Rx urb aborted (%d)\n", urb->status); | ||
197 | goto resubmit_urb; | ||
198 | } | ||
199 | |||
200 | /* protect from any incoming empty msgs */ | ||
201 | if ((urb->actual_length > 0) && (dev->adapter->dev_decode_buf)) { | ||
202 | /* handle these kinds of msgs only if _start callback called */ | ||
203 | if (dev->state & PCAN_USB_STATE_STARTED) { | ||
204 | err = dev->adapter->dev_decode_buf(dev, urb); | ||
205 | if (err) | ||
206 | pcan_dump_mem("received usb message", | ||
207 | urb->transfer_buffer, | ||
208 | urb->transfer_buffer_length); | ||
209 | } | ||
210 | } | ||
211 | |||
212 | resubmit_urb: | ||
213 | usb_fill_bulk_urb(urb, dev->udev, | ||
214 | usb_rcvbulkpipe(dev->udev, dev->ep_msg_in), | ||
215 | urb->transfer_buffer, dev->adapter->rx_buffer_size, | ||
216 | peak_usb_read_bulk_callback, dev); | ||
217 | |||
218 | usb_anchor_urb(urb, &dev->rx_submitted); | ||
219 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
220 | if (!err) | ||
221 | return; | ||
222 | |||
223 | usb_unanchor_urb(urb); | ||
224 | |||
225 | if (err == -ENODEV) | ||
226 | netif_device_detach(netdev); | ||
227 | else | ||
228 | netdev_err(netdev, "failed resubmitting read bulk urb: %d\n", | ||
229 | err); | ||
230 | } | ||
231 | |||
232 | /* | ||
233 | * callback for bulk Tx urb | ||
234 | */ | ||
235 | static void peak_usb_write_bulk_callback(struct urb *urb) | ||
236 | { | ||
237 | struct peak_tx_urb_context *context = urb->context; | ||
238 | struct peak_usb_device *dev; | ||
239 | struct net_device *netdev; | ||
240 | |||
241 | BUG_ON(!context); | ||
242 | |||
243 | dev = context->dev; | ||
244 | netdev = dev->netdev; | ||
245 | |||
246 | atomic_dec(&dev->active_tx_urbs); | ||
247 | |||
248 | if (!netif_device_present(netdev)) | ||
249 | return; | ||
250 | |||
251 | /* check tx status */ | ||
252 | switch (urb->status) { | ||
253 | case 0: | ||
254 | /* transmission complete */ | ||
255 | netdev->stats.tx_packets++; | ||
256 | netdev->stats.tx_bytes += context->dlc; | ||
257 | |||
258 | /* prevent tx timeout */ | ||
259 | netdev->trans_start = jiffies; | ||
260 | break; | ||
261 | |||
262 | default: | ||
263 | if (net_ratelimit()) | ||
264 | netdev_err(netdev, "Tx urb aborted (%d)\n", | ||
265 | urb->status); | ||
266 | case -EPROTO: | ||
267 | case -ENOENT: | ||
268 | case -ECONNRESET: | ||
269 | case -ESHUTDOWN: | ||
270 | |||
271 | break; | ||
272 | } | ||
273 | |||
274 | /* should always release echo skb and corresponding context */ | ||
275 | can_get_echo_skb(netdev, context->echo_index); | ||
276 | context->echo_index = PCAN_USB_MAX_TX_URBS; | ||
277 | |||
278 | /* do wakeup tx queue in case of success only */ | ||
279 | if (!urb->status) | ||
280 | netif_wake_queue(netdev); | ||
281 | } | ||
282 | |||
283 | /* | ||
284 | * called by netdev to send one skb on the CAN interface. | ||
285 | */ | ||
286 | static netdev_tx_t peak_usb_ndo_start_xmit(struct sk_buff *skb, | ||
287 | struct net_device *netdev) | ||
288 | { | ||
289 | struct peak_usb_device *dev = netdev_priv(netdev); | ||
290 | struct peak_tx_urb_context *context = NULL; | ||
291 | struct net_device_stats *stats = &netdev->stats; | ||
292 | struct can_frame *cf = (struct can_frame *)skb->data; | ||
293 | struct urb *urb; | ||
294 | u8 *obuf; | ||
295 | int i, err; | ||
296 | size_t size = dev->adapter->tx_buffer_size; | ||
297 | |||
298 | if (can_dropped_invalid_skb(netdev, skb)) | ||
299 | return NETDEV_TX_OK; | ||
300 | |||
301 | for (i = 0; i < PCAN_USB_MAX_TX_URBS; i++) | ||
302 | if (dev->tx_contexts[i].echo_index == PCAN_USB_MAX_TX_URBS) { | ||
303 | context = dev->tx_contexts + i; | ||
304 | break; | ||
305 | } | ||
306 | |||
307 | if (!context) { | ||
308 | /* should not occur except during restart */ | ||
309 | return NETDEV_TX_BUSY; | ||
310 | } | ||
311 | |||
312 | urb = context->urb; | ||
313 | obuf = urb->transfer_buffer; | ||
314 | |||
315 | err = dev->adapter->dev_encode_msg(dev, skb, obuf, &size); | ||
316 | if (err) { | ||
317 | if (net_ratelimit()) | ||
318 | netdev_err(netdev, "packet dropped\n"); | ||
319 | dev_kfree_skb(skb); | ||
320 | stats->tx_dropped++; | ||
321 | return NETDEV_TX_OK; | ||
322 | } | ||
323 | |||
324 | context->echo_index = i; | ||
325 | context->dlc = cf->can_dlc; | ||
326 | |||
327 | usb_anchor_urb(urb, &dev->tx_submitted); | ||
328 | |||
329 | can_put_echo_skb(skb, netdev, context->echo_index); | ||
330 | |||
331 | atomic_inc(&dev->active_tx_urbs); | ||
332 | |||
333 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
334 | if (err) { | ||
335 | can_free_echo_skb(netdev, context->echo_index); | ||
336 | |||
337 | usb_unanchor_urb(urb); | ||
338 | |||
339 | /* this context is not used in fact */ | ||
340 | context->echo_index = PCAN_USB_MAX_TX_URBS; | ||
341 | |||
342 | atomic_dec(&dev->active_tx_urbs); | ||
343 | |||
344 | switch (err) { | ||
345 | case -ENODEV: | ||
346 | netif_device_detach(netdev); | ||
347 | break; | ||
348 | default: | ||
349 | netdev_warn(netdev, "tx urb submitting failed err=%d\n", | ||
350 | err); | ||
351 | case -ENOENT: | ||
352 | /* cable unplugged */ | ||
353 | stats->tx_dropped++; | ||
354 | } | ||
355 | } else { | ||
356 | netdev->trans_start = jiffies; | ||
357 | |||
358 | /* slow down tx path */ | ||
359 | if (atomic_read(&dev->active_tx_urbs) >= PCAN_USB_MAX_TX_URBS) | ||
360 | netif_stop_queue(netdev); | ||
361 | } | ||
362 | |||
363 | return NETDEV_TX_OK; | ||
364 | } | ||
365 | |||
366 | /* | ||
367 | * start the CAN interface. | ||
368 | * Rx and Tx urbs are allocated here. Rx urbs are submitted here. | ||
369 | */ | ||
370 | static int peak_usb_start(struct peak_usb_device *dev) | ||
371 | { | ||
372 | struct net_device *netdev = dev->netdev; | ||
373 | int err, i; | ||
374 | |||
375 | for (i = 0; i < PCAN_USB_MAX_RX_URBS; i++) { | ||
376 | struct urb *urb; | ||
377 | u8 *buf; | ||
378 | |||
379 | /* create a URB, and a buffer for it, to receive usb messages */ | ||
380 | urb = usb_alloc_urb(0, GFP_KERNEL); | ||
381 | if (!urb) { | ||
382 | netdev_err(netdev, "No memory left for URBs\n"); | ||
383 | err = -ENOMEM; | ||
384 | break; | ||
385 | } | ||
386 | |||
387 | buf = kmalloc(dev->adapter->rx_buffer_size, GFP_KERNEL); | ||
388 | if (!buf) { | ||
389 | netdev_err(netdev, "No memory left for USB buffer\n"); | ||
390 | usb_free_urb(urb); | ||
391 | err = -ENOMEM; | ||
392 | break; | ||
393 | } | ||
394 | |||
395 | usb_fill_bulk_urb(urb, dev->udev, | ||
396 | usb_rcvbulkpipe(dev->udev, dev->ep_msg_in), | ||
397 | buf, dev->adapter->rx_buffer_size, | ||
398 | peak_usb_read_bulk_callback, dev); | ||
399 | |||
400 | /* ask last usb_free_urb() to also kfree() transfer_buffer */ | ||
401 | urb->transfer_flags |= URB_FREE_BUFFER; | ||
402 | usb_anchor_urb(urb, &dev->rx_submitted); | ||
403 | |||
404 | err = usb_submit_urb(urb, GFP_KERNEL); | ||
405 | if (err) { | ||
406 | if (err == -ENODEV) | ||
407 | netif_device_detach(dev->netdev); | ||
408 | |||
409 | usb_unanchor_urb(urb); | ||
410 | kfree(buf); | ||
411 | usb_free_urb(urb); | ||
412 | break; | ||
413 | } | ||
414 | |||
415 | /* drop reference, USB core will take care of freeing it */ | ||
416 | usb_free_urb(urb); | ||
417 | } | ||
418 | |||
419 | /* did we submit any URBs? Warn if we was not able to submit all urbs */ | ||
420 | if (i < PCAN_USB_MAX_RX_URBS) { | ||
421 | if (i == 0) { | ||
422 | netdev_err(netdev, "couldn't setup any rx URB\n"); | ||
423 | return err; | ||
424 | } | ||
425 | |||
426 | netdev_warn(netdev, "rx performance may be slow\n"); | ||
427 | } | ||
428 | |||
429 | /* pre-alloc tx buffers and corresponding urbs */ | ||
430 | for (i = 0; i < PCAN_USB_MAX_TX_URBS; i++) { | ||
431 | struct peak_tx_urb_context *context; | ||
432 | struct urb *urb; | ||
433 | u8 *buf; | ||
434 | |||
435 | /* create a URB and a buffer for it, to transmit usb messages */ | ||
436 | urb = usb_alloc_urb(0, GFP_KERNEL); | ||
437 | if (!urb) { | ||
438 | netdev_err(netdev, "No memory left for URBs\n"); | ||
439 | err = -ENOMEM; | ||
440 | break; | ||
441 | } | ||
442 | |||
443 | buf = kmalloc(dev->adapter->tx_buffer_size, GFP_KERNEL); | ||
444 | if (!buf) { | ||
445 | netdev_err(netdev, "No memory left for USB buffer\n"); | ||
446 | usb_free_urb(urb); | ||
447 | err = -ENOMEM; | ||
448 | break; | ||
449 | } | ||
450 | |||
451 | context = dev->tx_contexts + i; | ||
452 | context->dev = dev; | ||
453 | context->urb = urb; | ||
454 | |||
455 | usb_fill_bulk_urb(urb, dev->udev, | ||
456 | usb_sndbulkpipe(dev->udev, dev->ep_msg_out), | ||
457 | buf, dev->adapter->tx_buffer_size, | ||
458 | peak_usb_write_bulk_callback, context); | ||
459 | |||
460 | /* ask last usb_free_urb() to also kfree() transfer_buffer */ | ||
461 | urb->transfer_flags |= URB_FREE_BUFFER; | ||
462 | } | ||
463 | |||
464 | /* warn if we were not able to allocate enough tx contexts */ | ||
465 | if (i < PCAN_USB_MAX_TX_URBS) { | ||
466 | if (i == 0) { | ||
467 | netdev_err(netdev, "couldn't setup any tx URB\n"); | ||
468 | return err; | ||
469 | } | ||
470 | |||
471 | netdev_warn(netdev, "tx performance may be slow\n"); | ||
472 | } | ||
473 | |||
474 | if (dev->adapter->dev_start) { | ||
475 | err = dev->adapter->dev_start(dev); | ||
476 | if (err) | ||
477 | goto failed; | ||
478 | } | ||
479 | |||
480 | dev->state |= PCAN_USB_STATE_STARTED; | ||
481 | |||
482 | /* can set bus on now */ | ||
483 | if (dev->adapter->dev_set_bus) { | ||
484 | err = dev->adapter->dev_set_bus(dev, 1); | ||
485 | if (err) | ||
486 | goto failed; | ||
487 | } | ||
488 | |||
489 | dev->can.state = CAN_STATE_ERROR_ACTIVE; | ||
490 | |||
491 | return 0; | ||
492 | |||
493 | failed: | ||
494 | if (err == -ENODEV) | ||
495 | netif_device_detach(dev->netdev); | ||
496 | |||
497 | netdev_warn(netdev, "couldn't submit control: %d\n", err); | ||
498 | |||
499 | return err; | ||
500 | } | ||
501 | |||
502 | /* | ||
503 | * called by netdev to open the corresponding CAN interface. | ||
504 | */ | ||
505 | static int peak_usb_ndo_open(struct net_device *netdev) | ||
506 | { | ||
507 | struct peak_usb_device *dev = netdev_priv(netdev); | ||
508 | int err; | ||
509 | |||
510 | /* common open */ | ||
511 | err = open_candev(netdev); | ||
512 | if (err) | ||
513 | return err; | ||
514 | |||
515 | /* finally start device */ | ||
516 | err = peak_usb_start(dev); | ||
517 | if (err) { | ||
518 | netdev_err(netdev, "couldn't start device: %d\n", err); | ||
519 | close_candev(netdev); | ||
520 | return err; | ||
521 | } | ||
522 | |||
523 | netif_start_queue(netdev); | ||
524 | |||
525 | return 0; | ||
526 | } | ||
527 | |||
528 | /* | ||
529 | * unlink in-flight Rx and Tx urbs and free their memory. | ||
530 | */ | ||
531 | static void peak_usb_unlink_all_urbs(struct peak_usb_device *dev) | ||
532 | { | ||
533 | int i; | ||
534 | |||
535 | /* free all Rx (submitted) urbs */ | ||
536 | usb_kill_anchored_urbs(&dev->rx_submitted); | ||
537 | |||
538 | /* free unsubmitted Tx urbs first */ | ||
539 | for (i = 0; i < PCAN_USB_MAX_TX_URBS; i++) { | ||
540 | struct urb *urb = dev->tx_contexts[i].urb; | ||
541 | |||
542 | if (!urb || | ||
543 | dev->tx_contexts[i].echo_index != PCAN_USB_MAX_TX_URBS) { | ||
544 | /* | ||
545 | * this urb is already released or always submitted, | ||
546 | * let usb core free by itself | ||
547 | */ | ||
548 | continue; | ||
549 | } | ||
550 | |||
551 | usb_free_urb(urb); | ||
552 | dev->tx_contexts[i].urb = NULL; | ||
553 | } | ||
554 | |||
555 | /* then free all submitted Tx urbs */ | ||
556 | usb_kill_anchored_urbs(&dev->tx_submitted); | ||
557 | atomic_set(&dev->active_tx_urbs, 0); | ||
558 | } | ||
559 | |||
560 | /* | ||
561 | * called by netdev to close the corresponding CAN interface. | ||
562 | */ | ||
563 | static int peak_usb_ndo_stop(struct net_device *netdev) | ||
564 | { | ||
565 | struct peak_usb_device *dev = netdev_priv(netdev); | ||
566 | |||
567 | dev->state &= ~PCAN_USB_STATE_STARTED; | ||
568 | netif_stop_queue(netdev); | ||
569 | |||
570 | /* unlink all pending urbs and free used memory */ | ||
571 | peak_usb_unlink_all_urbs(dev); | ||
572 | |||
573 | if (dev->adapter->dev_stop) | ||
574 | dev->adapter->dev_stop(dev); | ||
575 | |||
576 | close_candev(netdev); | ||
577 | |||
578 | dev->can.state = CAN_STATE_STOPPED; | ||
579 | |||
580 | /* can set bus off now */ | ||
581 | if (dev->adapter->dev_set_bus) { | ||
582 | int err = dev->adapter->dev_set_bus(dev, 0); | ||
583 | if (err) | ||
584 | return err; | ||
585 | } | ||
586 | |||
587 | return 0; | ||
588 | } | ||
589 | |||
590 | /* | ||
591 | * handle end of waiting for the device to reset | ||
592 | */ | ||
593 | void peak_usb_restart_complete(struct peak_usb_device *dev) | ||
594 | { | ||
595 | /* finally MUST update can state */ | ||
596 | dev->can.state = CAN_STATE_ERROR_ACTIVE; | ||
597 | |||
598 | /* netdev queue can be awaken now */ | ||
599 | netif_wake_queue(dev->netdev); | ||
600 | } | ||
601 | |||
602 | void peak_usb_async_complete(struct urb *urb) | ||
603 | { | ||
604 | kfree(urb->transfer_buffer); | ||
605 | usb_free_urb(urb); | ||
606 | } | ||
607 | |||
608 | /* | ||
609 | * device (auto-)restart mechanism runs in a timer context => | ||
610 | * MUST handle restart with asynchronous usb transfers | ||
611 | */ | ||
612 | static int peak_usb_restart(struct peak_usb_device *dev) | ||
613 | { | ||
614 | struct urb *urb; | ||
615 | int err; | ||
616 | u8 *buf; | ||
617 | |||
618 | /* | ||
619 | * if device doesn't define any asynchronous restart handler, simply | ||
620 | * wake the netdev queue up | ||
621 | */ | ||
622 | if (!dev->adapter->dev_restart_async) { | ||
623 | peak_usb_restart_complete(dev); | ||
624 | return 0; | ||
625 | } | ||
626 | |||
627 | /* first allocate a urb to handle the asynchronous steps */ | ||
628 | urb = usb_alloc_urb(0, GFP_ATOMIC); | ||
629 | if (!urb) { | ||
630 | netdev_err(dev->netdev, "no memory left for urb\n"); | ||
631 | return -ENOMEM; | ||
632 | } | ||
633 | |||
634 | /* also allocate enough space for the commands to send */ | ||
635 | buf = kmalloc(PCAN_USB_MAX_CMD_LEN, GFP_ATOMIC); | ||
636 | if (!buf) { | ||
637 | netdev_err(dev->netdev, "no memory left for async cmd\n"); | ||
638 | usb_free_urb(urb); | ||
639 | return -ENOMEM; | ||
640 | } | ||
641 | |||
642 | /* call the device specific handler for the restart */ | ||
643 | err = dev->adapter->dev_restart_async(dev, urb, buf); | ||
644 | if (!err) | ||
645 | return 0; | ||
646 | |||
647 | kfree(buf); | ||
648 | usb_free_urb(urb); | ||
649 | |||
650 | return err; | ||
651 | } | ||
652 | |||
653 | /* | ||
654 | * candev callback used to change CAN mode. | ||
655 | * Warning: this is called from a timer context! | ||
656 | */ | ||
657 | static int peak_usb_set_mode(struct net_device *netdev, enum can_mode mode) | ||
658 | { | ||
659 | struct peak_usb_device *dev = netdev_priv(netdev); | ||
660 | int err = 0; | ||
661 | |||
662 | switch (mode) { | ||
663 | case CAN_MODE_START: | ||
664 | err = peak_usb_restart(dev); | ||
665 | if (err) | ||
666 | netdev_err(netdev, "couldn't start device (err %d)\n", | ||
667 | err); | ||
668 | break; | ||
669 | |||
670 | default: | ||
671 | return -EOPNOTSUPP; | ||
672 | } | ||
673 | |||
674 | return err; | ||
675 | } | ||
676 | |||
677 | /* | ||
678 | * candev callback used to set device bitrate. | ||
679 | */ | ||
680 | static int peak_usb_set_bittiming(struct net_device *netdev) | ||
681 | { | ||
682 | struct peak_usb_device *dev = netdev_priv(netdev); | ||
683 | struct can_bittiming *bt = &dev->can.bittiming; | ||
684 | |||
685 | if (dev->adapter->dev_set_bittiming) { | ||
686 | int err = dev->adapter->dev_set_bittiming(dev, bt); | ||
687 | |||
688 | if (err) | ||
689 | netdev_info(netdev, "couldn't set bitrate (err %d)\n", | ||
690 | err); | ||
691 | return err; | ||
692 | } | ||
693 | |||
694 | return 0; | ||
695 | } | ||
696 | |||
697 | static const struct net_device_ops peak_usb_netdev_ops = { | ||
698 | .ndo_open = peak_usb_ndo_open, | ||
699 | .ndo_stop = peak_usb_ndo_stop, | ||
700 | .ndo_start_xmit = peak_usb_ndo_start_xmit, | ||
701 | }; | ||
702 | |||
703 | /* | ||
704 | * create one device which is attached to CAN controller #ctrl_idx of the | ||
705 | * usb adapter. | ||
706 | */ | ||
707 | static int peak_usb_create_dev(struct peak_usb_adapter *peak_usb_adapter, | ||
708 | struct usb_interface *intf, int ctrl_idx) | ||
709 | { | ||
710 | struct usb_device *usb_dev = interface_to_usbdev(intf); | ||
711 | int sizeof_candev = peak_usb_adapter->sizeof_dev_private; | ||
712 | struct peak_usb_device *dev; | ||
713 | struct net_device *netdev; | ||
714 | int i, err; | ||
715 | u16 tmp16; | ||
716 | |||
717 | if (sizeof_candev < sizeof(struct peak_usb_device)) | ||
718 | sizeof_candev = sizeof(struct peak_usb_device); | ||
719 | |||
720 | netdev = alloc_candev(sizeof_candev, PCAN_USB_MAX_TX_URBS); | ||
721 | if (!netdev) { | ||
722 | dev_err(&intf->dev, "%s: couldn't alloc candev\n", | ||
723 | PCAN_USB_DRIVER_NAME); | ||
724 | return -ENOMEM; | ||
725 | } | ||
726 | |||
727 | dev = netdev_priv(netdev); | ||
728 | |||
729 | /* allocate a buffer large enough to send commands */ | ||
730 | dev->cmd_buf = kmalloc(PCAN_USB_MAX_CMD_LEN, GFP_KERNEL); | ||
731 | if (!dev->cmd_buf) { | ||
732 | dev_err(&intf->dev, "%s: couldn't alloc cmd buffer\n", | ||
733 | PCAN_USB_DRIVER_NAME); | ||
734 | err = -ENOMEM; | ||
735 | goto lbl_set_intf_data; | ||
736 | } | ||
737 | |||
738 | dev->udev = usb_dev; | ||
739 | dev->netdev = netdev; | ||
740 | dev->adapter = peak_usb_adapter; | ||
741 | dev->ctrl_idx = ctrl_idx; | ||
742 | dev->state = PCAN_USB_STATE_CONNECTED; | ||
743 | |||
744 | dev->ep_msg_in = peak_usb_adapter->ep_msg_in; | ||
745 | dev->ep_msg_out = peak_usb_adapter->ep_msg_out[ctrl_idx]; | ||
746 | |||
747 | dev->can.clock = peak_usb_adapter->clock; | ||
748 | dev->can.bittiming_const = &peak_usb_adapter->bittiming_const; | ||
749 | dev->can.do_set_bittiming = peak_usb_set_bittiming; | ||
750 | dev->can.do_set_mode = peak_usb_set_mode; | ||
751 | dev->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | | ||
752 | CAN_CTRLMODE_LISTENONLY; | ||
753 | |||
754 | netdev->netdev_ops = &peak_usb_netdev_ops; | ||
755 | |||
756 | netdev->flags |= IFF_ECHO; /* we support local echo */ | ||
757 | |||
758 | init_usb_anchor(&dev->rx_submitted); | ||
759 | |||
760 | init_usb_anchor(&dev->tx_submitted); | ||
761 | atomic_set(&dev->active_tx_urbs, 0); | ||
762 | |||
763 | for (i = 0; i < PCAN_USB_MAX_TX_URBS; i++) | ||
764 | dev->tx_contexts[i].echo_index = PCAN_USB_MAX_TX_URBS; | ||
765 | |||
766 | dev->prev_siblings = usb_get_intfdata(intf); | ||
767 | usb_set_intfdata(intf, dev); | ||
768 | |||
769 | SET_NETDEV_DEV(netdev, &intf->dev); | ||
770 | |||
771 | err = register_candev(netdev); | ||
772 | if (err) { | ||
773 | dev_err(&intf->dev, "couldn't register CAN device: %d\n", err); | ||
774 | goto lbl_free_cmd_buf; | ||
775 | } | ||
776 | |||
777 | if (dev->prev_siblings) | ||
778 | (dev->prev_siblings)->next_siblings = dev; | ||
779 | |||
780 | /* keep hw revision into the netdevice */ | ||
781 | tmp16 = le16_to_cpu(usb_dev->descriptor.bcdDevice); | ||
782 | dev->device_rev = tmp16 >> 8; | ||
783 | |||
784 | if (dev->adapter->dev_init) { | ||
785 | err = dev->adapter->dev_init(dev); | ||
786 | if (err) | ||
787 | goto lbl_free_cmd_buf; | ||
788 | } | ||
789 | |||
790 | /* set bus off */ | ||
791 | if (dev->adapter->dev_set_bus) { | ||
792 | err = dev->adapter->dev_set_bus(dev, 0); | ||
793 | if (err) | ||
794 | goto lbl_free_cmd_buf; | ||
795 | } | ||
796 | |||
797 | /* get device number early */ | ||
798 | if (dev->adapter->dev_get_device_id) | ||
799 | dev->adapter->dev_get_device_id(dev, &dev->device_number); | ||
800 | |||
801 | netdev_info(netdev, "attached to %s channel %u (device %u)\n", | ||
802 | peak_usb_adapter->name, ctrl_idx, dev->device_number); | ||
803 | |||
804 | return 0; | ||
805 | |||
806 | lbl_free_cmd_buf: | ||
807 | kfree(dev->cmd_buf); | ||
808 | |||
809 | lbl_set_intf_data: | ||
810 | usb_set_intfdata(intf, dev->prev_siblings); | ||
811 | free_candev(netdev); | ||
812 | |||
813 | return err; | ||
814 | } | ||
815 | |||
816 | /* | ||
817 | * called by the usb core when the device is unplugged from the system | ||
818 | */ | ||
819 | static void peak_usb_disconnect(struct usb_interface *intf) | ||
820 | { | ||
821 | struct peak_usb_device *dev; | ||
822 | |||
823 | /* unregister as many netdev devices as siblings */ | ||
824 | for (dev = usb_get_intfdata(intf); dev; dev = dev->prev_siblings) { | ||
825 | struct net_device *netdev = dev->netdev; | ||
826 | char name[IFNAMSIZ]; | ||
827 | |||
828 | dev->state &= ~PCAN_USB_STATE_CONNECTED; | ||
829 | strncpy(name, netdev->name, IFNAMSIZ); | ||
830 | |||
831 | unregister_netdev(netdev); | ||
832 | free_candev(netdev); | ||
833 | |||
834 | kfree(dev->cmd_buf); | ||
835 | dev->next_siblings = NULL; | ||
836 | if (dev->adapter->dev_free) | ||
837 | dev->adapter->dev_free(dev); | ||
838 | |||
839 | dev_info(&intf->dev, "%s removed\n", name); | ||
840 | } | ||
841 | |||
842 | usb_set_intfdata(intf, NULL); | ||
843 | } | ||
844 | |||
845 | /* | ||
846 | * probe function for new PEAK-System devices | ||
847 | */ | ||
848 | static int peak_usb_probe(struct usb_interface *intf, | ||
849 | const struct usb_device_id *id) | ||
850 | { | ||
851 | struct usb_device *usb_dev = interface_to_usbdev(intf); | ||
852 | struct peak_usb_adapter *peak_usb_adapter, **pp; | ||
853 | int i, err = -ENOMEM; | ||
854 | |||
855 | usb_dev = interface_to_usbdev(intf); | ||
856 | |||
857 | /* get corresponding PCAN-USB adapter */ | ||
858 | for (pp = peak_usb_adapters_list; *pp; pp++) | ||
859 | if ((*pp)->device_id == usb_dev->descriptor.idProduct) | ||
860 | break; | ||
861 | |||
862 | peak_usb_adapter = *pp; | ||
863 | if (!peak_usb_adapter) { | ||
864 | /* should never come except device_id bad usage in this file */ | ||
865 | pr_err("%s: didn't find device id. 0x%x in devices list\n", | ||
866 | PCAN_USB_DRIVER_NAME, usb_dev->descriptor.idProduct); | ||
867 | return -ENODEV; | ||
868 | } | ||
869 | |||
870 | /* got corresponding adapter: check if it handles current interface */ | ||
871 | if (peak_usb_adapter->intf_probe) { | ||
872 | err = peak_usb_adapter->intf_probe(intf); | ||
873 | if (err) | ||
874 | return err; | ||
875 | } | ||
876 | |||
877 | for (i = 0; i < peak_usb_adapter->ctrl_count; i++) { | ||
878 | err = peak_usb_create_dev(peak_usb_adapter, intf, i); | ||
879 | if (err) { | ||
880 | /* deregister already created devices */ | ||
881 | peak_usb_disconnect(intf); | ||
882 | break; | ||
883 | } | ||
884 | } | ||
885 | |||
886 | return err; | ||
887 | } | ||
888 | |||
889 | /* usb specific object needed to register this driver with the usb subsystem */ | ||
890 | static struct usb_driver peak_usb_driver = { | ||
891 | .name = PCAN_USB_DRIVER_NAME, | ||
892 | .disconnect = peak_usb_disconnect, | ||
893 | .probe = peak_usb_probe, | ||
894 | .id_table = peak_usb_table, | ||
895 | }; | ||
896 | |||
897 | static int __init peak_usb_init(void) | ||
898 | { | ||
899 | int err; | ||
900 | |||
901 | /* register this driver with the USB subsystem */ | ||
902 | err = usb_register(&peak_usb_driver); | ||
903 | if (err) | ||
904 | pr_err("%s: usb_register failed (err %d)\n", | ||
905 | PCAN_USB_DRIVER_NAME, err); | ||
906 | |||
907 | return err; | ||
908 | } | ||
909 | |||
910 | static int peak_usb_do_device_exit(struct device *d, void *arg) | ||
911 | { | ||
912 | struct usb_interface *intf = to_usb_interface(d); | ||
913 | struct peak_usb_device *dev; | ||
914 | |||
915 | /* stop as many netdev devices as siblings */ | ||
916 | for (dev = usb_get_intfdata(intf); dev; dev = dev->prev_siblings) { | ||
917 | struct net_device *netdev = dev->netdev; | ||
918 | |||
919 | if (netif_device_present(netdev)) | ||
920 | if (dev->adapter->dev_exit) | ||
921 | dev->adapter->dev_exit(dev); | ||
922 | } | ||
923 | |||
924 | return 0; | ||
925 | } | ||
926 | |||
927 | static void __exit peak_usb_exit(void) | ||
928 | { | ||
929 | int err; | ||
930 | |||
931 | /* last chance do send any synchronous commands here */ | ||
932 | err = driver_for_each_device(&peak_usb_driver.drvwrap.driver, NULL, | ||
933 | NULL, peak_usb_do_device_exit); | ||
934 | if (err) | ||
935 | pr_err("%s: failed to stop all can devices (err %d)\n", | ||
936 | PCAN_USB_DRIVER_NAME, err); | ||
937 | |||
938 | /* deregister this driver with the USB subsystem */ | ||
939 | usb_deregister(&peak_usb_driver); | ||
940 | |||
941 | pr_info("%s: PCAN-USB interfaces driver unloaded\n", | ||
942 | PCAN_USB_DRIVER_NAME); | ||
943 | } | ||
944 | |||
945 | module_init(peak_usb_init); | ||
946 | module_exit(peak_usb_exit); | ||
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_core.h b/drivers/net/can/usb/peak_usb/pcan_usb_core.h deleted file mode 100644 index 073b47ff8ee..00000000000 --- a/drivers/net/can/usb/peak_usb/pcan_usb_core.h +++ /dev/null | |||
@@ -1,145 +0,0 @@ | |||
1 | /* | ||
2 | * CAN driver for PEAK System USB adapters | ||
3 | * Derived from the PCAN project file driver/src/pcan_usb_core.c | ||
4 | * | ||
5 | * Copyright (C) 2003-2010 PEAK System-Technik GmbH | ||
6 | * Copyright (C) 2010-2012 Stephane Grosjean <s.grosjean@peak-system.com> | ||
7 | * | ||
8 | * Many thanks to Klaus Hitschler <klaus.hitschler@gmx.de> | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify it | ||
11 | * under the terms of the GNU General Public License as published | ||
12 | * by the Free Software Foundation; version 2 of the License. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, but | ||
15 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
17 | * General Public License for more details. | ||
18 | */ | ||
19 | #ifndef PCAN_USB_CORE_H | ||
20 | #define PCAN_USB_CORE_H | ||
21 | |||
22 | /* PEAK-System vendor id. */ | ||
23 | #define PCAN_USB_VENDOR_ID 0x0c72 | ||
24 | |||
25 | /* supported device ids. */ | ||
26 | #define PCAN_USB_PRODUCT_ID 0x000c | ||
27 | #define PCAN_USBPRO_PRODUCT_ID 0x000d | ||
28 | |||
29 | #define PCAN_USB_DRIVER_NAME "peak_usb" | ||
30 | |||
31 | /* number of urbs that are submitted for rx/tx per channel */ | ||
32 | #define PCAN_USB_MAX_RX_URBS 4 | ||
33 | #define PCAN_USB_MAX_TX_URBS 10 | ||
34 | |||
35 | /* usb adapters maximum channels per usb interface */ | ||
36 | #define PCAN_USB_MAX_CHANNEL 2 | ||
37 | |||
38 | /* maximum length of the usb commands sent to/received from the devices */ | ||
39 | #define PCAN_USB_MAX_CMD_LEN 32 | ||
40 | |||
41 | struct peak_usb_device; | ||
42 | |||
43 | /* PEAK-System USB adapter descriptor */ | ||
44 | struct peak_usb_adapter { | ||
45 | char *name; | ||
46 | u32 device_id; | ||
47 | struct can_clock clock; | ||
48 | const struct can_bittiming_const bittiming_const; | ||
49 | unsigned int ctrl_count; | ||
50 | |||
51 | int (*intf_probe)(struct usb_interface *intf); | ||
52 | |||
53 | int (*dev_init)(struct peak_usb_device *dev); | ||
54 | void (*dev_exit)(struct peak_usb_device *dev); | ||
55 | void (*dev_free)(struct peak_usb_device *dev); | ||
56 | int (*dev_open)(struct peak_usb_device *dev); | ||
57 | int (*dev_close)(struct peak_usb_device *dev); | ||
58 | int (*dev_set_bittiming)(struct peak_usb_device *dev, | ||
59 | struct can_bittiming *bt); | ||
60 | int (*dev_set_bus)(struct peak_usb_device *dev, u8 onoff); | ||
61 | int (*dev_get_device_id)(struct peak_usb_device *dev, u32 *device_id); | ||
62 | int (*dev_decode_buf)(struct peak_usb_device *dev, struct urb *urb); | ||
63 | int (*dev_encode_msg)(struct peak_usb_device *dev, struct sk_buff *skb, | ||
64 | u8 *obuf, size_t *size); | ||
65 | int (*dev_start)(struct peak_usb_device *dev); | ||
66 | int (*dev_stop)(struct peak_usb_device *dev); | ||
67 | int (*dev_restart_async)(struct peak_usb_device *dev, struct urb *urb, | ||
68 | u8 *buf); | ||
69 | u8 ep_msg_in; | ||
70 | u8 ep_msg_out[PCAN_USB_MAX_CHANNEL]; | ||
71 | u8 ts_used_bits; | ||
72 | u32 ts_period; | ||
73 | u8 us_per_ts_shift; | ||
74 | u32 us_per_ts_scale; | ||
75 | |||
76 | int rx_buffer_size; | ||
77 | int tx_buffer_size; | ||
78 | int sizeof_dev_private; | ||
79 | }; | ||
80 | |||
81 | extern struct peak_usb_adapter pcan_usb; | ||
82 | extern struct peak_usb_adapter pcan_usb_pro; | ||
83 | |||
84 | struct peak_time_ref { | ||
85 | struct timeval tv_host_0, tv_host; | ||
86 | u32 ts_dev_1, ts_dev_2; | ||
87 | u64 ts_total; | ||
88 | u32 tick_count; | ||
89 | struct peak_usb_adapter *adapter; | ||
90 | }; | ||
91 | |||
92 | struct peak_tx_urb_context { | ||
93 | struct peak_usb_device *dev; | ||
94 | u32 echo_index; | ||
95 | u8 dlc; | ||
96 | struct urb *urb; | ||
97 | }; | ||
98 | |||
99 | #define PCAN_USB_STATE_CONNECTED 0x00000001 | ||
100 | #define PCAN_USB_STATE_STARTED 0x00000002 | ||
101 | |||
102 | /* PEAK-System USB device */ | ||
103 | struct peak_usb_device { | ||
104 | struct can_priv can; | ||
105 | struct peak_usb_adapter *adapter; | ||
106 | unsigned int ctrl_idx; | ||
107 | u32 state; | ||
108 | |||
109 | struct sk_buff *echo_skb[PCAN_USB_MAX_TX_URBS]; | ||
110 | |||
111 | struct usb_device *udev; | ||
112 | struct net_device *netdev; | ||
113 | |||
114 | atomic_t active_tx_urbs; | ||
115 | struct usb_anchor tx_submitted; | ||
116 | struct peak_tx_urb_context tx_contexts[PCAN_USB_MAX_TX_URBS]; | ||
117 | |||
118 | u8 *cmd_buf; | ||
119 | struct usb_anchor rx_submitted; | ||
120 | |||
121 | u32 device_number; | ||
122 | u8 device_rev; | ||
123 | |||
124 | u8 ep_msg_in; | ||
125 | u8 ep_msg_out; | ||
126 | |||
127 | u16 bus_load; | ||
128 | |||
129 | struct peak_usb_device *prev_siblings; | ||
130 | struct peak_usb_device *next_siblings; | ||
131 | }; | ||
132 | |||
133 | void pcan_dump_mem(char *prompt, void *p, int l); | ||
134 | |||
135 | /* common timestamp management */ | ||
136 | void peak_usb_init_time_ref(struct peak_time_ref *time_ref, | ||
137 | struct peak_usb_adapter *adapter); | ||
138 | void peak_usb_update_ts_now(struct peak_time_ref *time_ref, u32 ts_now); | ||
139 | void peak_usb_set_ts_now(struct peak_time_ref *time_ref, u32 ts_now); | ||
140 | void peak_usb_get_ts_tv(struct peak_time_ref *time_ref, u32 ts, | ||
141 | struct timeval *tv); | ||
142 | |||
143 | void peak_usb_async_complete(struct urb *urb); | ||
144 | void peak_usb_restart_complete(struct peak_usb_device *dev); | ||
145 | #endif | ||
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c deleted file mode 100644 index 30d79bfa5b1..00000000000 --- a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c +++ /dev/null | |||
@@ -1,1042 +0,0 @@ | |||
1 | /* | ||
2 | * CAN driver for PEAK System PCAN-USB Pro adapter | ||
3 | * Derived from the PCAN project file driver/src/pcan_usbpro.c | ||
4 | * | ||
5 | * Copyright (C) 2003-2011 PEAK System-Technik GmbH | ||
6 | * Copyright (C) 2011-2012 Stephane Grosjean <s.grosjean@peak-system.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published | ||
10 | * by the Free Software Foundation; version 2 of the License. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | */ | ||
17 | #include <linux/netdevice.h> | ||
18 | #include <linux/usb.h> | ||
19 | #include <linux/module.h> | ||
20 | |||
21 | #include <linux/can.h> | ||
22 | #include <linux/can/dev.h> | ||
23 | #include <linux/can/error.h> | ||
24 | |||
25 | #include "pcan_usb_core.h" | ||
26 | #include "pcan_usb_pro.h" | ||
27 | |||
28 | MODULE_SUPPORTED_DEVICE("PEAK-System PCAN-USB Pro adapter"); | ||
29 | |||
30 | /* PCAN-USB Pro Endpoints */ | ||
31 | #define PCAN_USBPRO_EP_CMDOUT 1 | ||
32 | #define PCAN_USBPRO_EP_CMDIN (PCAN_USBPRO_EP_CMDOUT | USB_DIR_IN) | ||
33 | #define PCAN_USBPRO_EP_MSGOUT_0 2 | ||
34 | #define PCAN_USBPRO_EP_MSGIN (PCAN_USBPRO_EP_MSGOUT_0 | USB_DIR_IN) | ||
35 | #define PCAN_USBPRO_EP_MSGOUT_1 3 | ||
36 | #define PCAN_USBPRO_EP_UNUSED (PCAN_USBPRO_EP_MSGOUT_1 | USB_DIR_IN) | ||
37 | |||
38 | #define PCAN_USBPRO_CHANNEL_COUNT 2 | ||
39 | |||
40 | /* PCAN-USB Pro adapter internal clock (MHz) */ | ||
41 | #define PCAN_USBPRO_CRYSTAL_HZ 56000000 | ||
42 | |||
43 | /* PCAN-USB Pro command timeout (ms.) */ | ||
44 | #define PCAN_USBPRO_COMMAND_TIMEOUT 1000 | ||
45 | |||
46 | /* PCAN-USB Pro rx/tx buffers size */ | ||
47 | #define PCAN_USBPRO_RX_BUFFER_SIZE 1024 | ||
48 | #define PCAN_USBPRO_TX_BUFFER_SIZE 64 | ||
49 | |||
50 | #define PCAN_USBPRO_MSG_HEADER_LEN 4 | ||
51 | |||
52 | /* some commands responses need to be re-submitted */ | ||
53 | #define PCAN_USBPRO_RSP_SUBMIT_MAX 2 | ||
54 | |||
55 | #define PCAN_USBPRO_RTR 0x01 | ||
56 | #define PCAN_USBPRO_EXT 0x02 | ||
57 | |||
58 | #define PCAN_USBPRO_CMD_BUFFER_SIZE 512 | ||
59 | |||
60 | /* handle device specific info used by the netdevices */ | ||
61 | struct pcan_usb_pro_interface { | ||
62 | struct peak_usb_device *dev[PCAN_USBPRO_CHANNEL_COUNT]; | ||
63 | struct peak_time_ref time_ref; | ||
64 | int cm_ignore_count; | ||
65 | int dev_opened_count; | ||
66 | }; | ||
67 | |||
68 | /* device information */ | ||
69 | struct pcan_usb_pro_device { | ||
70 | struct peak_usb_device dev; | ||
71 | struct pcan_usb_pro_interface *usb_if; | ||
72 | u32 cached_ccbt; | ||
73 | }; | ||
74 | |||
75 | /* internal structure used to handle messages sent to bulk urb */ | ||
76 | struct pcan_usb_pro_msg { | ||
77 | u8 *rec_ptr; | ||
78 | int rec_buffer_size; | ||
79 | int rec_buffer_len; | ||
80 | union { | ||
81 | u16 *rec_cnt_rd; | ||
82 | u32 *rec_cnt; | ||
83 | u8 *rec_buffer; | ||
84 | } u; | ||
85 | }; | ||
86 | |||
87 | /* records sizes table indexed on message id. (8-bits value) */ | ||
88 | static u16 pcan_usb_pro_sizeof_rec[256] = { | ||
89 | [PCAN_USBPRO_SETBTR] = sizeof(struct pcan_usb_pro_btr), | ||
90 | [PCAN_USBPRO_SETBUSACT] = sizeof(struct pcan_usb_pro_busact), | ||
91 | [PCAN_USBPRO_SETSILENT] = sizeof(struct pcan_usb_pro_silent), | ||
92 | [PCAN_USBPRO_SETFILTR] = sizeof(struct pcan_usb_pro_filter), | ||
93 | [PCAN_USBPRO_SETTS] = sizeof(struct pcan_usb_pro_setts), | ||
94 | [PCAN_USBPRO_GETDEVID] = sizeof(struct pcan_usb_pro_devid), | ||
95 | [PCAN_USBPRO_SETLED] = sizeof(struct pcan_usb_pro_setled), | ||
96 | [PCAN_USBPRO_RXMSG8] = sizeof(struct pcan_usb_pro_rxmsg), | ||
97 | [PCAN_USBPRO_RXMSG4] = sizeof(struct pcan_usb_pro_rxmsg) - 4, | ||
98 | [PCAN_USBPRO_RXMSG0] = sizeof(struct pcan_usb_pro_rxmsg) - 8, | ||
99 | [PCAN_USBPRO_RXRTR] = sizeof(struct pcan_usb_pro_rxmsg) - 8, | ||
100 | [PCAN_USBPRO_RXSTATUS] = sizeof(struct pcan_usb_pro_rxstatus), | ||
101 | [PCAN_USBPRO_RXTS] = sizeof(struct pcan_usb_pro_rxts), | ||
102 | [PCAN_USBPRO_TXMSG8] = sizeof(struct pcan_usb_pro_txmsg), | ||
103 | [PCAN_USBPRO_TXMSG4] = sizeof(struct pcan_usb_pro_txmsg) - 4, | ||
104 | [PCAN_USBPRO_TXMSG0] = sizeof(struct pcan_usb_pro_txmsg) - 8, | ||
105 | }; | ||
106 | |||
107 | /* | ||
108 | * initialize PCAN-USB Pro message data structure | ||
109 | */ | ||
110 | static u8 *pcan_msg_init(struct pcan_usb_pro_msg *pm, void *buffer_addr, | ||
111 | int buffer_size) | ||
112 | { | ||
113 | if (buffer_size < PCAN_USBPRO_MSG_HEADER_LEN) | ||
114 | return NULL; | ||
115 | |||
116 | pm->u.rec_buffer = (u8 *)buffer_addr; | ||
117 | pm->rec_buffer_size = pm->rec_buffer_len = buffer_size; | ||
118 | pm->rec_ptr = pm->u.rec_buffer + PCAN_USBPRO_MSG_HEADER_LEN; | ||
119 | |||
120 | return pm->rec_ptr; | ||
121 | } | ||
122 | |||
123 | static u8 *pcan_msg_init_empty(struct pcan_usb_pro_msg *pm, | ||
124 | void *buffer_addr, int buffer_size) | ||
125 | { | ||
126 | u8 *pr = pcan_msg_init(pm, buffer_addr, buffer_size); | ||
127 | |||
128 | if (pr) { | ||
129 | pm->rec_buffer_len = PCAN_USBPRO_MSG_HEADER_LEN; | ||
130 | *pm->u.rec_cnt = 0; | ||
131 | } | ||
132 | return pr; | ||
133 | } | ||
134 | |||
135 | /* | ||
136 | * add one record to a message being built | ||
137 | */ | ||
138 | static int pcan_msg_add_rec(struct pcan_usb_pro_msg *pm, u8 id, ...) | ||
139 | { | ||
140 | int len, i; | ||
141 | u8 *pc; | ||
142 | va_list ap; | ||
143 | |||
144 | va_start(ap, id); | ||
145 | |||
146 | pc = pm->rec_ptr + 1; | ||
147 | |||
148 | i = 0; | ||
149 | switch (id) { | ||
150 | case PCAN_USBPRO_TXMSG8: | ||
151 | i += 4; | ||
152 | case PCAN_USBPRO_TXMSG4: | ||
153 | i += 4; | ||
154 | case PCAN_USBPRO_TXMSG0: | ||
155 | *pc++ = va_arg(ap, int); | ||
156 | *pc++ = va_arg(ap, int); | ||
157 | *pc++ = va_arg(ap, int); | ||
158 | *(u32 *)pc = cpu_to_le32(va_arg(ap, u32)); | ||
159 | pc += 4; | ||
160 | memcpy(pc, va_arg(ap, int *), i); | ||
161 | pc += i; | ||
162 | break; | ||
163 | |||
164 | case PCAN_USBPRO_SETBTR: | ||
165 | case PCAN_USBPRO_GETDEVID: | ||
166 | *pc++ = va_arg(ap, int); | ||
167 | pc += 2; | ||
168 | *(u32 *)pc = cpu_to_le32(va_arg(ap, u32)); | ||
169 | pc += 4; | ||
170 | break; | ||
171 | |||
172 | case PCAN_USBPRO_SETFILTR: | ||
173 | case PCAN_USBPRO_SETBUSACT: | ||
174 | case PCAN_USBPRO_SETSILENT: | ||
175 | *pc++ = va_arg(ap, int); | ||
176 | *(u16 *)pc = cpu_to_le16(va_arg(ap, int)); | ||
177 | pc += 2; | ||
178 | break; | ||
179 | |||
180 | case PCAN_USBPRO_SETLED: | ||
181 | *pc++ = va_arg(ap, int); | ||
182 | *(u16 *)pc = cpu_to_le16(va_arg(ap, int)); | ||
183 | pc += 2; | ||
184 | *(u32 *)pc = cpu_to_le32(va_arg(ap, u32)); | ||
185 | pc += 4; | ||
186 | break; | ||
187 | |||
188 | case PCAN_USBPRO_SETTS: | ||
189 | pc++; | ||
190 | *(u16 *)pc = cpu_to_le16(va_arg(ap, int)); | ||
191 | pc += 2; | ||
192 | break; | ||
193 | |||
194 | default: | ||
195 | pr_err("%s: %s(): unknown data type %02Xh (%d)\n", | ||
196 | PCAN_USB_DRIVER_NAME, __func__, id, id); | ||
197 | pc--; | ||
198 | break; | ||
199 | } | ||
200 | |||
201 | len = pc - pm->rec_ptr; | ||
202 | if (len > 0) { | ||
203 | *pm->u.rec_cnt = cpu_to_le32(*pm->u.rec_cnt+1); | ||
204 | *pm->rec_ptr = id; | ||
205 | |||
206 | pm->rec_ptr = pc; | ||
207 | pm->rec_buffer_len += len; | ||
208 | } | ||
209 | |||
210 | va_end(ap); | ||
211 | |||
212 | return len; | ||
213 | } | ||
214 | |||
215 | /* | ||
216 | * send PCAN-USB Pro command synchronously | ||
217 | */ | ||
218 | static int pcan_usb_pro_send_cmd(struct peak_usb_device *dev, | ||
219 | struct pcan_usb_pro_msg *pum) | ||
220 | { | ||
221 | int actual_length; | ||
222 | int err; | ||
223 | |||
224 | /* usb device unregistered? */ | ||
225 | if (!(dev->state & PCAN_USB_STATE_CONNECTED)) | ||
226 | return 0; | ||
227 | |||
228 | err = usb_bulk_msg(dev->udev, | ||
229 | usb_sndbulkpipe(dev->udev, PCAN_USBPRO_EP_CMDOUT), | ||
230 | pum->u.rec_buffer, pum->rec_buffer_len, | ||
231 | &actual_length, PCAN_USBPRO_COMMAND_TIMEOUT); | ||
232 | if (err) | ||
233 | netdev_err(dev->netdev, "sending command failure: %d\n", err); | ||
234 | |||
235 | return err; | ||
236 | } | ||
237 | |||
238 | /* | ||
239 | * wait for PCAN-USB Pro command response | ||
240 | */ | ||
241 | static int pcan_usb_pro_wait_rsp(struct peak_usb_device *dev, | ||
242 | struct pcan_usb_pro_msg *pum) | ||
243 | { | ||
244 | u8 req_data_type, req_channel; | ||
245 | int actual_length; | ||
246 | int i, err = 0; | ||
247 | |||
248 | /* usb device unregistered? */ | ||
249 | if (!(dev->state & PCAN_USB_STATE_CONNECTED)) | ||
250 | return 0; | ||
251 | |||
252 | req_data_type = pum->u.rec_buffer[4]; | ||
253 | req_channel = pum->u.rec_buffer[5]; | ||
254 | |||
255 | *pum->u.rec_cnt = 0; | ||
256 | for (i = 0; !err && i < PCAN_USBPRO_RSP_SUBMIT_MAX; i++) { | ||
257 | struct pcan_usb_pro_msg rsp; | ||
258 | union pcan_usb_pro_rec *pr; | ||
259 | u32 r, rec_cnt; | ||
260 | u16 rec_len; | ||
261 | u8 *pc; | ||
262 | |||
263 | err = usb_bulk_msg(dev->udev, | ||
264 | usb_rcvbulkpipe(dev->udev, PCAN_USBPRO_EP_CMDIN), | ||
265 | pum->u.rec_buffer, pum->rec_buffer_len, | ||
266 | &actual_length, PCAN_USBPRO_COMMAND_TIMEOUT); | ||
267 | if (err) { | ||
268 | netdev_err(dev->netdev, "waiting rsp error %d\n", err); | ||
269 | break; | ||
270 | } | ||
271 | |||
272 | if (actual_length == 0) | ||
273 | continue; | ||
274 | |||
275 | err = -EBADMSG; | ||
276 | if (actual_length < PCAN_USBPRO_MSG_HEADER_LEN) { | ||
277 | netdev_err(dev->netdev, | ||
278 | "got abnormal too small rsp (len=%d)\n", | ||
279 | actual_length); | ||
280 | break; | ||
281 | } | ||
282 | |||
283 | pc = pcan_msg_init(&rsp, pum->u.rec_buffer, | ||
284 | actual_length); | ||
285 | |||
286 | rec_cnt = le32_to_cpu(*rsp.u.rec_cnt); | ||
287 | |||
288 | /* loop on records stored into message */ | ||
289 | for (r = 0; r < rec_cnt; r++) { | ||
290 | pr = (union pcan_usb_pro_rec *)pc; | ||
291 | rec_len = pcan_usb_pro_sizeof_rec[pr->data_type]; | ||
292 | if (!rec_len) { | ||
293 | netdev_err(dev->netdev, | ||
294 | "got unprocessed record in msg\n"); | ||
295 | pcan_dump_mem("rcvd rsp msg", pum->u.rec_buffer, | ||
296 | actual_length); | ||
297 | break; | ||
298 | } | ||
299 | |||
300 | /* check if response corresponds to request */ | ||
301 | if (pr->data_type != req_data_type) | ||
302 | netdev_err(dev->netdev, | ||
303 | "got unwanted rsp %xh: ignored\n", | ||
304 | pr->data_type); | ||
305 | |||
306 | /* check if channel in response corresponds too */ | ||
307 | else if ((req_channel != 0xff) && \ | ||
308 | (pr->bus_act.channel != req_channel)) | ||
309 | netdev_err(dev->netdev, | ||
310 | "got rsp %xh but on chan%u: ignored\n", | ||
311 | req_data_type, pr->bus_act.channel); | ||
312 | |||
313 | /* got the response */ | ||
314 | else | ||
315 | return 0; | ||
316 | |||
317 | /* otherwise, go on with next record in message */ | ||
318 | pc += rec_len; | ||
319 | } | ||
320 | } | ||
321 | |||
322 | return (i >= PCAN_USBPRO_RSP_SUBMIT_MAX) ? -ERANGE : err; | ||
323 | } | ||
324 | |||
325 | static int pcan_usb_pro_send_req(struct peak_usb_device *dev, int req_id, | ||
326 | int req_value, void *req_addr, int req_size) | ||
327 | { | ||
328 | int err; | ||
329 | u8 req_type; | ||
330 | unsigned int p; | ||
331 | |||
332 | /* usb device unregistered? */ | ||
333 | if (!(dev->state & PCAN_USB_STATE_CONNECTED)) | ||
334 | return 0; | ||
335 | |||
336 | memset(req_addr, '\0', req_size); | ||
337 | |||
338 | req_type = USB_TYPE_VENDOR | USB_RECIP_OTHER; | ||
339 | |||
340 | switch (req_id) { | ||
341 | case PCAN_USBPRO_REQ_FCT: | ||
342 | p = usb_sndctrlpipe(dev->udev, 0); | ||
343 | break; | ||
344 | |||
345 | default: | ||
346 | p = usb_rcvctrlpipe(dev->udev, 0); | ||
347 | req_type |= USB_DIR_IN; | ||
348 | break; | ||
349 | } | ||
350 | |||
351 | err = usb_control_msg(dev->udev, p, req_id, req_type, req_value, 0, | ||
352 | req_addr, req_size, 2 * USB_CTRL_GET_TIMEOUT); | ||
353 | if (err < 0) { | ||
354 | netdev_info(dev->netdev, | ||
355 | "unable to request usb[type=%d value=%d] err=%d\n", | ||
356 | req_id, req_value, err); | ||
357 | return err; | ||
358 | } | ||
359 | |||
360 | return 0; | ||
361 | } | ||
362 | |||
363 | static int pcan_usb_pro_set_ts(struct peak_usb_device *dev, u16 onoff) | ||
364 | { | ||
365 | struct pcan_usb_pro_msg um; | ||
366 | |||
367 | pcan_msg_init_empty(&um, dev->cmd_buf, PCAN_USB_MAX_CMD_LEN); | ||
368 | pcan_msg_add_rec(&um, PCAN_USBPRO_SETTS, onoff); | ||
369 | |||
370 | return pcan_usb_pro_send_cmd(dev, &um); | ||
371 | } | ||
372 | |||
373 | static int pcan_usb_pro_set_bitrate(struct peak_usb_device *dev, u32 ccbt) | ||
374 | { | ||
375 | struct pcan_usb_pro_device *pdev = | ||
376 | container_of(dev, struct pcan_usb_pro_device, dev); | ||
377 | struct pcan_usb_pro_msg um; | ||
378 | |||
379 | pcan_msg_init_empty(&um, dev->cmd_buf, PCAN_USB_MAX_CMD_LEN); | ||
380 | pcan_msg_add_rec(&um, PCAN_USBPRO_SETBTR, dev->ctrl_idx, ccbt); | ||
381 | |||
382 | /* cache the CCBT value to reuse it before next buson */ | ||
383 | pdev->cached_ccbt = ccbt; | ||
384 | |||
385 | return pcan_usb_pro_send_cmd(dev, &um); | ||
386 | } | ||
387 | |||
388 | static int pcan_usb_pro_set_bus(struct peak_usb_device *dev, u8 onoff) | ||
389 | { | ||
390 | struct pcan_usb_pro_msg um; | ||
391 | |||
392 | /* if bus=on, be sure the bitrate being set before! */ | ||
393 | if (onoff) { | ||
394 | struct pcan_usb_pro_device *pdev = | ||
395 | container_of(dev, struct pcan_usb_pro_device, dev); | ||
396 | |||
397 | pcan_usb_pro_set_bitrate(dev, pdev->cached_ccbt); | ||
398 | } | ||
399 | |||
400 | pcan_msg_init_empty(&um, dev->cmd_buf, PCAN_USB_MAX_CMD_LEN); | ||
401 | pcan_msg_add_rec(&um, PCAN_USBPRO_SETBUSACT, dev->ctrl_idx, onoff); | ||
402 | |||
403 | return pcan_usb_pro_send_cmd(dev, &um); | ||
404 | } | ||
405 | |||
406 | static int pcan_usb_pro_set_silent(struct peak_usb_device *dev, u8 onoff) | ||
407 | { | ||
408 | struct pcan_usb_pro_msg um; | ||
409 | |||
410 | pcan_msg_init_empty(&um, dev->cmd_buf, PCAN_USB_MAX_CMD_LEN); | ||
411 | pcan_msg_add_rec(&um, PCAN_USBPRO_SETSILENT, dev->ctrl_idx, onoff); | ||
412 | |||
413 | return pcan_usb_pro_send_cmd(dev, &um); | ||
414 | } | ||
415 | |||
416 | static int pcan_usb_pro_set_filter(struct peak_usb_device *dev, u16 filter_mode) | ||
417 | { | ||
418 | struct pcan_usb_pro_msg um; | ||
419 | |||
420 | pcan_msg_init_empty(&um, dev->cmd_buf, PCAN_USB_MAX_CMD_LEN); | ||
421 | pcan_msg_add_rec(&um, PCAN_USBPRO_SETFILTR, dev->ctrl_idx, filter_mode); | ||
422 | |||
423 | return pcan_usb_pro_send_cmd(dev, &um); | ||
424 | } | ||
425 | |||
426 | static int pcan_usb_pro_set_led(struct peak_usb_device *dev, u8 mode, | ||
427 | u32 timeout) | ||
428 | { | ||
429 | struct pcan_usb_pro_msg um; | ||
430 | |||
431 | pcan_msg_init_empty(&um, dev->cmd_buf, PCAN_USB_MAX_CMD_LEN); | ||
432 | pcan_msg_add_rec(&um, PCAN_USBPRO_SETLED, dev->ctrl_idx, mode, timeout); | ||
433 | |||
434 | return pcan_usb_pro_send_cmd(dev, &um); | ||
435 | } | ||
436 | |||
437 | static int pcan_usb_pro_get_device_id(struct peak_usb_device *dev, | ||
438 | u32 *device_id) | ||
439 | { | ||
440 | struct pcan_usb_pro_devid *pdn; | ||
441 | struct pcan_usb_pro_msg um; | ||
442 | int err; | ||
443 | u8 *pc; | ||
444 | |||
445 | pc = pcan_msg_init_empty(&um, dev->cmd_buf, PCAN_USB_MAX_CMD_LEN); | ||
446 | pcan_msg_add_rec(&um, PCAN_USBPRO_GETDEVID, dev->ctrl_idx); | ||
447 | |||
448 | err = pcan_usb_pro_send_cmd(dev, &um); | ||
449 | if (err) | ||
450 | return err; | ||
451 | |||
452 | err = pcan_usb_pro_wait_rsp(dev, &um); | ||
453 | if (err) | ||
454 | return err; | ||
455 | |||
456 | pdn = (struct pcan_usb_pro_devid *)pc; | ||
457 | if (device_id) | ||
458 | *device_id = le32_to_cpu(pdn->serial_num); | ||
459 | |||
460 | return err; | ||
461 | } | ||
462 | |||
463 | static int pcan_usb_pro_set_bittiming(struct peak_usb_device *dev, | ||
464 | struct can_bittiming *bt) | ||
465 | { | ||
466 | u32 ccbt; | ||
467 | |||
468 | ccbt = (dev->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) ? 0x00800000 : 0; | ||
469 | ccbt |= (bt->sjw - 1) << 24; | ||
470 | ccbt |= (bt->phase_seg2 - 1) << 20; | ||
471 | ccbt |= (bt->prop_seg + bt->phase_seg1 - 1) << 16; /* = tseg1 */ | ||
472 | ccbt |= bt->brp - 1; | ||
473 | |||
474 | netdev_info(dev->netdev, "setting ccbt=0x%08x\n", ccbt); | ||
475 | |||
476 | return pcan_usb_pro_set_bitrate(dev, ccbt); | ||
477 | } | ||
478 | |||
479 | static void pcan_usb_pro_restart_complete(struct urb *urb) | ||
480 | { | ||
481 | /* can delete usb resources */ | ||
482 | peak_usb_async_complete(urb); | ||
483 | |||
484 | /* notify candev and netdev */ | ||
485 | peak_usb_restart_complete(urb->context); | ||
486 | } | ||
487 | |||
488 | /* | ||
489 | * handle restart but in asynchronously way | ||
490 | */ | ||
491 | static int pcan_usb_pro_restart_async(struct peak_usb_device *dev, | ||
492 | struct urb *urb, u8 *buf) | ||
493 | { | ||
494 | struct pcan_usb_pro_msg um; | ||
495 | |||
496 | pcan_msg_init_empty(&um, buf, PCAN_USB_MAX_CMD_LEN); | ||
497 | pcan_msg_add_rec(&um, PCAN_USBPRO_SETBUSACT, dev->ctrl_idx, 1); | ||
498 | |||
499 | usb_fill_bulk_urb(urb, dev->udev, | ||
500 | usb_sndbulkpipe(dev->udev, PCAN_USBPRO_EP_CMDOUT), | ||
501 | buf, PCAN_USB_MAX_CMD_LEN, | ||
502 | pcan_usb_pro_restart_complete, dev); | ||
503 | |||
504 | return usb_submit_urb(urb, GFP_ATOMIC); | ||
505 | } | ||
506 | |||
507 | static void pcan_usb_pro_drv_loaded(struct peak_usb_device *dev, int loaded) | ||
508 | { | ||
509 | u8 buffer[16]; | ||
510 | |||
511 | buffer[0] = 0; | ||
512 | buffer[1] = !!loaded; | ||
513 | |||
514 | pcan_usb_pro_send_req(dev, PCAN_USBPRO_REQ_FCT, | ||
515 | PCAN_USBPRO_FCT_DRVLD, buffer, sizeof(buffer)); | ||
516 | } | ||
517 | |||
518 | static inline | ||
519 | struct pcan_usb_pro_interface *pcan_usb_pro_dev_if(struct peak_usb_device *dev) | ||
520 | { | ||
521 | struct pcan_usb_pro_device *pdev = | ||
522 | container_of(dev, struct pcan_usb_pro_device, dev); | ||
523 | return pdev->usb_if; | ||
524 | } | ||
525 | |||
526 | static int pcan_usb_pro_handle_canmsg(struct pcan_usb_pro_interface *usb_if, | ||
527 | struct pcan_usb_pro_rxmsg *rx) | ||
528 | { | ||
529 | const unsigned int ctrl_idx = (rx->len >> 4) & 0x0f; | ||
530 | struct peak_usb_device *dev = usb_if->dev[ctrl_idx]; | ||
531 | struct net_device *netdev = dev->netdev; | ||
532 | struct can_frame *can_frame; | ||
533 | struct sk_buff *skb; | ||
534 | struct timeval tv; | ||
535 | struct skb_shared_hwtstamps *hwts; | ||
536 | |||
537 | skb = alloc_can_skb(netdev, &can_frame); | ||
538 | if (!skb) | ||
539 | return -ENOMEM; | ||
540 | |||
541 | can_frame->can_id = le32_to_cpu(rx->id); | ||
542 | can_frame->can_dlc = rx->len & 0x0f; | ||
543 | |||
544 | if (rx->flags & PCAN_USBPRO_EXT) | ||
545 | can_frame->can_id |= CAN_EFF_FLAG; | ||
546 | |||
547 | if (rx->flags & PCAN_USBPRO_RTR) | ||
548 | can_frame->can_id |= CAN_RTR_FLAG; | ||
549 | else | ||
550 | memcpy(can_frame->data, rx->data, can_frame->can_dlc); | ||
551 | |||
552 | peak_usb_get_ts_tv(&usb_if->time_ref, le32_to_cpu(rx->ts32), &tv); | ||
553 | hwts = skb_hwtstamps(skb); | ||
554 | hwts->hwtstamp = timeval_to_ktime(tv); | ||
555 | |||
556 | netif_rx(skb); | ||
557 | netdev->stats.rx_packets++; | ||
558 | netdev->stats.rx_bytes += can_frame->can_dlc; | ||
559 | |||
560 | return 0; | ||
561 | } | ||
562 | |||
563 | static int pcan_usb_pro_handle_error(struct pcan_usb_pro_interface *usb_if, | ||
564 | struct pcan_usb_pro_rxstatus *er) | ||
565 | { | ||
566 | const u32 raw_status = le32_to_cpu(er->status); | ||
567 | const unsigned int ctrl_idx = (er->channel >> 4) & 0x0f; | ||
568 | struct peak_usb_device *dev = usb_if->dev[ctrl_idx]; | ||
569 | struct net_device *netdev = dev->netdev; | ||
570 | struct can_frame *can_frame; | ||
571 | enum can_state new_state = CAN_STATE_ERROR_ACTIVE; | ||
572 | u8 err_mask = 0; | ||
573 | struct sk_buff *skb; | ||
574 | struct timeval tv; | ||
575 | struct skb_shared_hwtstamps *hwts; | ||
576 | |||
577 | /* nothing should be sent while in BUS_OFF state */ | ||
578 | if (dev->can.state == CAN_STATE_BUS_OFF) | ||
579 | return 0; | ||
580 | |||
581 | if (!raw_status) { | ||
582 | /* no error bit (back to active state) */ | ||
583 | dev->can.state = CAN_STATE_ERROR_ACTIVE; | ||
584 | return 0; | ||
585 | } | ||
586 | |||
587 | if (raw_status & (PCAN_USBPRO_STATUS_OVERRUN | | ||
588 | PCAN_USBPRO_STATUS_QOVERRUN)) { | ||
589 | /* trick to bypass next comparison and process other errors */ | ||
590 | new_state = CAN_STATE_MAX; | ||
591 | } | ||
592 | |||
593 | if (raw_status & PCAN_USBPRO_STATUS_BUS) { | ||
594 | new_state = CAN_STATE_BUS_OFF; | ||
595 | } else if (raw_status & PCAN_USBPRO_STATUS_ERROR) { | ||
596 | u32 rx_err_cnt = (le32_to_cpu(er->err_frm) & 0x00ff0000) >> 16; | ||
597 | u32 tx_err_cnt = (le32_to_cpu(er->err_frm) & 0xff000000) >> 24; | ||
598 | |||
599 | if (rx_err_cnt > 127) | ||
600 | err_mask |= CAN_ERR_CRTL_RX_PASSIVE; | ||
601 | else if (rx_err_cnt > 96) | ||
602 | err_mask |= CAN_ERR_CRTL_RX_WARNING; | ||
603 | |||
604 | if (tx_err_cnt > 127) | ||
605 | err_mask |= CAN_ERR_CRTL_TX_PASSIVE; | ||
606 | else if (tx_err_cnt > 96) | ||
607 | err_mask |= CAN_ERR_CRTL_TX_WARNING; | ||
608 | |||
609 | if (err_mask & (CAN_ERR_CRTL_RX_WARNING | | ||
610 | CAN_ERR_CRTL_TX_WARNING)) | ||
611 | new_state = CAN_STATE_ERROR_WARNING; | ||
612 | else if (err_mask & (CAN_ERR_CRTL_RX_PASSIVE | | ||
613 | CAN_ERR_CRTL_TX_PASSIVE)) | ||
614 | new_state = CAN_STATE_ERROR_PASSIVE; | ||
615 | } | ||
616 | |||
617 | /* donot post any error if current state didn't change */ | ||
618 | if (dev->can.state == new_state) | ||
619 | return 0; | ||
620 | |||
621 | /* allocate an skb to store the error frame */ | ||
622 | skb = alloc_can_err_skb(netdev, &can_frame); | ||
623 | if (!skb) | ||
624 | return -ENOMEM; | ||
625 | |||
626 | switch (new_state) { | ||
627 | case CAN_STATE_BUS_OFF: | ||
628 | can_frame->can_id |= CAN_ERR_BUSOFF; | ||
629 | can_bus_off(netdev); | ||
630 | break; | ||
631 | |||
632 | case CAN_STATE_ERROR_PASSIVE: | ||
633 | can_frame->can_id |= CAN_ERR_CRTL; | ||
634 | can_frame->data[1] |= err_mask; | ||
635 | dev->can.can_stats.error_passive++; | ||
636 | break; | ||
637 | |||
638 | case CAN_STATE_ERROR_WARNING: | ||
639 | can_frame->can_id |= CAN_ERR_CRTL; | ||
640 | can_frame->data[1] |= err_mask; | ||
641 | dev->can.can_stats.error_warning++; | ||
642 | break; | ||
643 | |||
644 | case CAN_STATE_ERROR_ACTIVE: | ||
645 | break; | ||
646 | |||
647 | default: | ||
648 | /* CAN_STATE_MAX (trick to handle other errors) */ | ||
649 | if (raw_status & PCAN_USBPRO_STATUS_OVERRUN) { | ||
650 | can_frame->can_id |= CAN_ERR_PROT; | ||
651 | can_frame->data[2] |= CAN_ERR_PROT_OVERLOAD; | ||
652 | netdev->stats.rx_over_errors++; | ||
653 | netdev->stats.rx_errors++; | ||
654 | } | ||
655 | |||
656 | if (raw_status & PCAN_USBPRO_STATUS_QOVERRUN) { | ||
657 | can_frame->can_id |= CAN_ERR_CRTL; | ||
658 | can_frame->data[1] |= CAN_ERR_CRTL_RX_OVERFLOW; | ||
659 | netdev->stats.rx_over_errors++; | ||
660 | netdev->stats.rx_errors++; | ||
661 | } | ||
662 | |||
663 | new_state = CAN_STATE_ERROR_ACTIVE; | ||
664 | break; | ||
665 | } | ||
666 | |||
667 | dev->can.state = new_state; | ||
668 | |||
669 | peak_usb_get_ts_tv(&usb_if->time_ref, le32_to_cpu(er->ts32), &tv); | ||
670 | hwts = skb_hwtstamps(skb); | ||
671 | hwts->hwtstamp = timeval_to_ktime(tv); | ||
672 | netif_rx(skb); | ||
673 | netdev->stats.rx_packets++; | ||
674 | netdev->stats.rx_bytes += can_frame->can_dlc; | ||
675 | |||
676 | return 0; | ||
677 | } | ||
678 | |||
679 | static void pcan_usb_pro_handle_ts(struct pcan_usb_pro_interface *usb_if, | ||
680 | struct pcan_usb_pro_rxts *ts) | ||
681 | { | ||
682 | /* should wait until clock is stabilized */ | ||
683 | if (usb_if->cm_ignore_count > 0) | ||
684 | usb_if->cm_ignore_count--; | ||
685 | else | ||
686 | peak_usb_set_ts_now(&usb_if->time_ref, | ||
687 | le32_to_cpu(ts->ts64[1])); | ||
688 | } | ||
689 | |||
690 | /* | ||
691 | * callback for bulk IN urb | ||
692 | */ | ||
693 | static int pcan_usb_pro_decode_buf(struct peak_usb_device *dev, struct urb *urb) | ||
694 | { | ||
695 | struct pcan_usb_pro_interface *usb_if = pcan_usb_pro_dev_if(dev); | ||
696 | struct net_device *netdev = dev->netdev; | ||
697 | struct pcan_usb_pro_msg usb_msg; | ||
698 | u8 *rec_ptr, *msg_end; | ||
699 | u16 rec_cnt; | ||
700 | int err = 0; | ||
701 | |||
702 | rec_ptr = pcan_msg_init(&usb_msg, urb->transfer_buffer, | ||
703 | urb->actual_length); | ||
704 | if (!rec_ptr) { | ||
705 | netdev_err(netdev, "bad msg hdr len %d\n", urb->actual_length); | ||
706 | return -EINVAL; | ||
707 | } | ||
708 | |||
709 | /* loop reading all the records from the incoming message */ | ||
710 | msg_end = urb->transfer_buffer + urb->actual_length; | ||
711 | rec_cnt = le16_to_cpu(*usb_msg.u.rec_cnt_rd); | ||
712 | for (; rec_cnt > 0; rec_cnt--) { | ||
713 | union pcan_usb_pro_rec *pr = (union pcan_usb_pro_rec *)rec_ptr; | ||
714 | u16 sizeof_rec = pcan_usb_pro_sizeof_rec[pr->data_type]; | ||
715 | |||
716 | if (!sizeof_rec) { | ||
717 | netdev_err(netdev, | ||
718 | "got unsupported rec in usb msg:\n"); | ||
719 | err = -ENOTSUPP; | ||
720 | break; | ||
721 | } | ||
722 | |||
723 | /* check if the record goes out of current packet */ | ||
724 | if (rec_ptr + sizeof_rec > msg_end) { | ||
725 | netdev_err(netdev, | ||
726 | "got frag rec: should inc usb rx buf size\n"); | ||
727 | err = -EBADMSG; | ||
728 | break; | ||
729 | } | ||
730 | |||
731 | switch (pr->data_type) { | ||
732 | case PCAN_USBPRO_RXMSG8: | ||
733 | case PCAN_USBPRO_RXMSG4: | ||
734 | case PCAN_USBPRO_RXMSG0: | ||
735 | case PCAN_USBPRO_RXRTR: | ||
736 | err = pcan_usb_pro_handle_canmsg(usb_if, &pr->rx_msg); | ||
737 | if (err < 0) | ||
738 | goto fail; | ||
739 | break; | ||
740 | |||
741 | case PCAN_USBPRO_RXSTATUS: | ||
742 | err = pcan_usb_pro_handle_error(usb_if, &pr->rx_status); | ||
743 | if (err < 0) | ||
744 | goto fail; | ||
745 | break; | ||
746 | |||
747 | case PCAN_USBPRO_RXTS: | ||
748 | pcan_usb_pro_handle_ts(usb_if, &pr->rx_ts); | ||
749 | break; | ||
750 | |||
751 | default: | ||
752 | netdev_err(netdev, | ||
753 | "unhandled rec type 0x%02x (%d): ignored\n", | ||
754 | pr->data_type, pr->data_type); | ||
755 | break; | ||
756 | } | ||
757 | |||
758 | rec_ptr += sizeof_rec; | ||
759 | } | ||
760 | |||
761 | fail: | ||
762 | if (err) | ||
763 | pcan_dump_mem("received msg", | ||
764 | urb->transfer_buffer, urb->actual_length); | ||
765 | |||
766 | return err; | ||
767 | } | ||
768 | |||
769 | static int pcan_usb_pro_encode_msg(struct peak_usb_device *dev, | ||
770 | struct sk_buff *skb, u8 *obuf, size_t *size) | ||
771 | { | ||
772 | struct can_frame *cf = (struct can_frame *)skb->data; | ||
773 | u8 data_type, len, flags; | ||
774 | struct pcan_usb_pro_msg usb_msg; | ||
775 | |||
776 | pcan_msg_init_empty(&usb_msg, obuf, *size); | ||
777 | |||
778 | if ((cf->can_id & CAN_RTR_FLAG) || (cf->can_dlc == 0)) | ||
779 | data_type = PCAN_USBPRO_TXMSG0; | ||
780 | else if (cf->can_dlc <= 4) | ||
781 | data_type = PCAN_USBPRO_TXMSG4; | ||
782 | else | ||
783 | data_type = PCAN_USBPRO_TXMSG8; | ||
784 | |||
785 | len = (dev->ctrl_idx << 4) | (cf->can_dlc & 0x0f); | ||
786 | |||
787 | flags = 0; | ||
788 | if (cf->can_id & CAN_EFF_FLAG) | ||
789 | flags |= 0x02; | ||
790 | if (cf->can_id & CAN_RTR_FLAG) | ||
791 | flags |= 0x01; | ||
792 | |||
793 | pcan_msg_add_rec(&usb_msg, data_type, 0, flags, len, cf->can_id, | ||
794 | cf->data); | ||
795 | |||
796 | *size = usb_msg.rec_buffer_len; | ||
797 | |||
798 | return 0; | ||
799 | } | ||
800 | |||
801 | static int pcan_usb_pro_start(struct peak_usb_device *dev) | ||
802 | { | ||
803 | struct pcan_usb_pro_device *pdev = | ||
804 | container_of(dev, struct pcan_usb_pro_device, dev); | ||
805 | int err; | ||
806 | |||
807 | err = pcan_usb_pro_set_silent(dev, | ||
808 | dev->can.ctrlmode & CAN_CTRLMODE_LISTENONLY); | ||
809 | if (err) | ||
810 | return err; | ||
811 | |||
812 | /* filter mode: 0-> All OFF; 1->bypass */ | ||
813 | err = pcan_usb_pro_set_filter(dev, 1); | ||
814 | if (err) | ||
815 | return err; | ||
816 | |||
817 | /* opening first device: */ | ||
818 | if (pdev->usb_if->dev_opened_count == 0) { | ||
819 | /* reset time_ref */ | ||
820 | peak_usb_init_time_ref(&pdev->usb_if->time_ref, &pcan_usb_pro); | ||
821 | |||
822 | /* ask device to send ts messages */ | ||
823 | err = pcan_usb_pro_set_ts(dev, 1); | ||
824 | } | ||
825 | |||
826 | pdev->usb_if->dev_opened_count++; | ||
827 | |||
828 | return err; | ||
829 | } | ||
830 | |||
831 | /* | ||
832 | * stop interface | ||
833 | * (last chance before set bus off) | ||
834 | */ | ||
835 | static int pcan_usb_pro_stop(struct peak_usb_device *dev) | ||
836 | { | ||
837 | struct pcan_usb_pro_device *pdev = | ||
838 | container_of(dev, struct pcan_usb_pro_device, dev); | ||
839 | |||
840 | /* turn off ts msgs for that interface if no other dev opened */ | ||
841 | if (pdev->usb_if->dev_opened_count == 1) | ||
842 | pcan_usb_pro_set_ts(dev, 0); | ||
843 | |||
844 | pdev->usb_if->dev_opened_count--; | ||
845 | |||
846 | return 0; | ||
847 | } | ||
848 | |||
849 | /* | ||
850 | * called when probing to initialize a device object. | ||
851 | */ | ||
852 | static int pcan_usb_pro_init(struct peak_usb_device *dev) | ||
853 | { | ||
854 | struct pcan_usb_pro_interface *usb_if; | ||
855 | struct pcan_usb_pro_device *pdev = | ||
856 | container_of(dev, struct pcan_usb_pro_device, dev); | ||
857 | |||
858 | /* do this for 1st channel only */ | ||
859 | if (!dev->prev_siblings) { | ||
860 | struct pcan_usb_pro_fwinfo fi; | ||
861 | struct pcan_usb_pro_blinfo bi; | ||
862 | int err; | ||
863 | |||
864 | /* allocate netdevices common structure attached to first one */ | ||
865 | usb_if = kzalloc(sizeof(struct pcan_usb_pro_interface), | ||
866 | GFP_KERNEL); | ||
867 | if (!usb_if) | ||
868 | return -ENOMEM; | ||
869 | |||
870 | /* number of ts msgs to ignore before taking one into account */ | ||
871 | usb_if->cm_ignore_count = 5; | ||
872 | |||
873 | /* | ||
874 | * explicit use of dev_xxx() instead of netdev_xxx() here: | ||
875 | * information displayed are related to the device itself, not | ||
876 | * to the canx netdevices. | ||
877 | */ | ||
878 | err = pcan_usb_pro_send_req(dev, PCAN_USBPRO_REQ_INFO, | ||
879 | PCAN_USBPRO_INFO_FW, | ||
880 | &fi, sizeof(fi)); | ||
881 | if (err) { | ||
882 | kfree(usb_if); | ||
883 | dev_err(dev->netdev->dev.parent, | ||
884 | "unable to read %s firmware info (err %d)\n", | ||
885 | pcan_usb_pro.name, err); | ||
886 | return err; | ||
887 | } | ||
888 | |||
889 | err = pcan_usb_pro_send_req(dev, PCAN_USBPRO_REQ_INFO, | ||
890 | PCAN_USBPRO_INFO_BL, | ||
891 | &bi, sizeof(bi)); | ||
892 | if (err) { | ||
893 | kfree(usb_if); | ||
894 | dev_err(dev->netdev->dev.parent, | ||
895 | "unable to read %s bootloader info (err %d)\n", | ||
896 | pcan_usb_pro.name, err); | ||
897 | return err; | ||
898 | } | ||
899 | |||
900 | dev_info(dev->netdev->dev.parent, | ||
901 | "PEAK-System %s hwrev %u serial %08X.%08X (%u channels)\n", | ||
902 | pcan_usb_pro.name, | ||
903 | bi.hw_rev, bi.serial_num_hi, bi.serial_num_lo, | ||
904 | pcan_usb_pro.ctrl_count); | ||
905 | |||
906 | /* tell the device the can driver is running */ | ||
907 | pcan_usb_pro_drv_loaded(dev, 1); | ||
908 | } else { | ||
909 | usb_if = pcan_usb_pro_dev_if(dev->prev_siblings); | ||
910 | } | ||
911 | |||
912 | pdev->usb_if = usb_if; | ||
913 | usb_if->dev[dev->ctrl_idx] = dev; | ||
914 | |||
915 | /* set LED in default state (end of init phase) */ | ||
916 | pcan_usb_pro_set_led(dev, 0, 1); | ||
917 | |||
918 | return 0; | ||
919 | } | ||
920 | |||
921 | static void pcan_usb_pro_exit(struct peak_usb_device *dev) | ||
922 | { | ||
923 | struct pcan_usb_pro_device *pdev = | ||
924 | container_of(dev, struct pcan_usb_pro_device, dev); | ||
925 | |||
926 | /* | ||
927 | * when rmmod called before unplug and if down, should reset things | ||
928 | * before leaving | ||
929 | */ | ||
930 | if (dev->can.state != CAN_STATE_STOPPED) { | ||
931 | /* set bus off on the corresponding channel */ | ||
932 | pcan_usb_pro_set_bus(dev, 0); | ||
933 | } | ||
934 | |||
935 | /* if channel #0 (only) */ | ||
936 | if (dev->ctrl_idx == 0) { | ||
937 | /* turn off calibration message if any device were opened */ | ||
938 | if (pdev->usb_if->dev_opened_count > 0) | ||
939 | pcan_usb_pro_set_ts(dev, 0); | ||
940 | |||
941 | /* tell the PCAN-USB Pro device the driver is being unloaded */ | ||
942 | pcan_usb_pro_drv_loaded(dev, 0); | ||
943 | } | ||
944 | } | ||
945 | |||
946 | /* | ||
947 | * called when PCAN-USB Pro adapter is unplugged | ||
948 | */ | ||
949 | static void pcan_usb_pro_free(struct peak_usb_device *dev) | ||
950 | { | ||
951 | /* last device: can free pcan_usb_pro_interface object now */ | ||
952 | if (!dev->prev_siblings && !dev->next_siblings) | ||
953 | kfree(pcan_usb_pro_dev_if(dev)); | ||
954 | } | ||
955 | |||
956 | /* | ||
957 | * probe function for new PCAN-USB Pro usb interface | ||
958 | */ | ||
959 | static int pcan_usb_pro_probe(struct usb_interface *intf) | ||
960 | { | ||
961 | struct usb_host_interface *if_desc; | ||
962 | int i; | ||
963 | |||
964 | if_desc = intf->altsetting; | ||
965 | |||
966 | /* check interface endpoint addresses */ | ||
967 | for (i = 0; i < if_desc->desc.bNumEndpoints; i++) { | ||
968 | struct usb_endpoint_descriptor *ep = &if_desc->endpoint[i].desc; | ||
969 | |||
970 | /* | ||
971 | * below is the list of valid ep addreses. Any other ep address | ||
972 | * is considered as not-CAN interface address => no dev created | ||
973 | */ | ||
974 | switch (ep->bEndpointAddress) { | ||
975 | case PCAN_USBPRO_EP_CMDOUT: | ||
976 | case PCAN_USBPRO_EP_CMDIN: | ||
977 | case PCAN_USBPRO_EP_MSGOUT_0: | ||
978 | case PCAN_USBPRO_EP_MSGOUT_1: | ||
979 | case PCAN_USBPRO_EP_MSGIN: | ||
980 | case PCAN_USBPRO_EP_UNUSED: | ||
981 | break; | ||
982 | default: | ||
983 | return -ENODEV; | ||
984 | } | ||
985 | } | ||
986 | |||
987 | return 0; | ||
988 | } | ||
989 | |||
990 | /* | ||
991 | * describe the PCAN-USB Pro adapter | ||
992 | */ | ||
993 | struct peak_usb_adapter pcan_usb_pro = { | ||
994 | .name = "PCAN-USB Pro", | ||
995 | .device_id = PCAN_USBPRO_PRODUCT_ID, | ||
996 | .ctrl_count = PCAN_USBPRO_CHANNEL_COUNT, | ||
997 | .clock = { | ||
998 | .freq = PCAN_USBPRO_CRYSTAL_HZ, | ||
999 | }, | ||
1000 | .bittiming_const = { | ||
1001 | .name = "pcan_usb_pro", | ||
1002 | .tseg1_min = 1, | ||
1003 | .tseg1_max = 16, | ||
1004 | .tseg2_min = 1, | ||
1005 | .tseg2_max = 8, | ||
1006 | .sjw_max = 4, | ||
1007 | .brp_min = 1, | ||
1008 | .brp_max = 1024, | ||
1009 | .brp_inc = 1, | ||
1010 | }, | ||
1011 | |||
1012 | /* size of device private data */ | ||
1013 | .sizeof_dev_private = sizeof(struct pcan_usb_pro_device), | ||
1014 | |||
1015 | /* timestamps usage */ | ||
1016 | .ts_used_bits = 32, | ||
1017 | .ts_period = 1000000, /* calibration period in ts. */ | ||
1018 | .us_per_ts_scale = 1, /* us = (ts * scale) >> shift */ | ||
1019 | .us_per_ts_shift = 0, | ||
1020 | |||
1021 | /* give here messages in/out endpoints */ | ||
1022 | .ep_msg_in = PCAN_USBPRO_EP_MSGIN, | ||
1023 | .ep_msg_out = {PCAN_USBPRO_EP_MSGOUT_0, PCAN_USBPRO_EP_MSGOUT_1}, | ||
1024 | |||
1025 | /* size of rx/tx usb buffers */ | ||
1026 | .rx_buffer_size = PCAN_USBPRO_RX_BUFFER_SIZE, | ||
1027 | .tx_buffer_size = PCAN_USBPRO_TX_BUFFER_SIZE, | ||
1028 | |||
1029 | /* device callbacks */ | ||
1030 | .intf_probe = pcan_usb_pro_probe, | ||
1031 | .dev_init = pcan_usb_pro_init, | ||
1032 | .dev_exit = pcan_usb_pro_exit, | ||
1033 | .dev_free = pcan_usb_pro_free, | ||
1034 | .dev_set_bus = pcan_usb_pro_set_bus, | ||
1035 | .dev_set_bittiming = pcan_usb_pro_set_bittiming, | ||
1036 | .dev_get_device_id = pcan_usb_pro_get_device_id, | ||
1037 | .dev_decode_buf = pcan_usb_pro_decode_buf, | ||
1038 | .dev_encode_msg = pcan_usb_pro_encode_msg, | ||
1039 | .dev_start = pcan_usb_pro_start, | ||
1040 | .dev_stop = pcan_usb_pro_stop, | ||
1041 | .dev_restart_async = pcan_usb_pro_restart_async, | ||
1042 | }; | ||
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_pro.h b/drivers/net/can/usb/peak_usb/pcan_usb_pro.h deleted file mode 100644 index a869918c562..00000000000 --- a/drivers/net/can/usb/peak_usb/pcan_usb_pro.h +++ /dev/null | |||
@@ -1,178 +0,0 @@ | |||
1 | /* | ||
2 | * CAN driver for PEAK System PCAN-USB Pro adapter | ||
3 | * Derived from the PCAN project file driver/src/pcan_usbpro_fw.h | ||
4 | * | ||
5 | * Copyright (C) 2003-2011 PEAK System-Technik GmbH | ||
6 | * Copyright (C) 2011-2012 Stephane Grosjean <s.grosjean@peak-system.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published | ||
10 | * by the Free Software Foundation; version 2 of the License. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | */ | ||
17 | #ifndef PCAN_USB_PRO_H | ||
18 | #define PCAN_USB_PRO_H | ||
19 | |||
20 | /* | ||
21 | * USB Vendor request data types | ||
22 | */ | ||
23 | #define PCAN_USBPRO_REQ_INFO 0 | ||
24 | #define PCAN_USBPRO_REQ_FCT 2 | ||
25 | |||
26 | /* Vendor Request value for XXX_INFO */ | ||
27 | #define PCAN_USBPRO_INFO_BL 0 | ||
28 | #define PCAN_USBPRO_INFO_FW 1 | ||
29 | |||
30 | /* Vendor Request value for XXX_FCT */ | ||
31 | #define PCAN_USBPRO_FCT_DRVLD 5 /* tell device driver is loaded */ | ||
32 | |||
33 | /* PCAN_USBPRO_INFO_BL vendor request record type */ | ||
34 | struct __packed pcan_usb_pro_blinfo { | ||
35 | u32 ctrl_type; | ||
36 | u8 version[4]; | ||
37 | u8 day; | ||
38 | u8 month; | ||
39 | u8 year; | ||
40 | u8 dummy; | ||
41 | u32 serial_num_hi; | ||
42 | u32 serial_num_lo; | ||
43 | u32 hw_type; | ||
44 | u32 hw_rev; | ||
45 | }; | ||
46 | |||
47 | /* PCAN_USBPRO_INFO_FW vendor request record type */ | ||
48 | struct __packed pcan_usb_pro_fwinfo { | ||
49 | u32 ctrl_type; | ||
50 | u8 version[4]; | ||
51 | u8 day; | ||
52 | u8 month; | ||
53 | u8 year; | ||
54 | u8 dummy; | ||
55 | u32 fw_type; | ||
56 | }; | ||
57 | |||
58 | /* | ||
59 | * USB Command record types | ||
60 | */ | ||
61 | #define PCAN_USBPRO_SETBTR 0x02 | ||
62 | #define PCAN_USBPRO_SETBUSACT 0x04 | ||
63 | #define PCAN_USBPRO_SETSILENT 0x05 | ||
64 | #define PCAN_USBPRO_SETFILTR 0x0a | ||
65 | #define PCAN_USBPRO_SETTS 0x10 | ||
66 | #define PCAN_USBPRO_GETDEVID 0x12 | ||
67 | #define PCAN_USBPRO_SETLED 0x1C | ||
68 | #define PCAN_USBPRO_RXMSG8 0x80 | ||
69 | #define PCAN_USBPRO_RXMSG4 0x81 | ||
70 | #define PCAN_USBPRO_RXMSG0 0x82 | ||
71 | #define PCAN_USBPRO_RXRTR 0x83 | ||
72 | #define PCAN_USBPRO_RXSTATUS 0x84 | ||
73 | #define PCAN_USBPRO_RXTS 0x85 | ||
74 | #define PCAN_USBPRO_TXMSG8 0x41 | ||
75 | #define PCAN_USBPRO_TXMSG4 0x42 | ||
76 | #define PCAN_USBPRO_TXMSG0 0x43 | ||
77 | |||
78 | /* record structures */ | ||
79 | struct __packed pcan_usb_pro_btr { | ||
80 | u8 data_type; | ||
81 | u8 channel; | ||
82 | u16 dummy; | ||
83 | u32 CCBT; | ||
84 | }; | ||
85 | |||
86 | struct __packed pcan_usb_pro_busact { | ||
87 | u8 data_type; | ||
88 | u8 channel; | ||
89 | u16 onoff; | ||
90 | }; | ||
91 | |||
92 | struct __packed pcan_usb_pro_silent { | ||
93 | u8 data_type; | ||
94 | u8 channel; | ||
95 | u16 onoff; | ||
96 | }; | ||
97 | |||
98 | struct __packed pcan_usb_pro_filter { | ||
99 | u8 data_type; | ||
100 | u8 dummy; | ||
101 | u16 filter_mode; | ||
102 | }; | ||
103 | |||
104 | struct __packed pcan_usb_pro_setts { | ||
105 | u8 data_type; | ||
106 | u8 dummy; | ||
107 | u16 mode; | ||
108 | }; | ||
109 | |||
110 | struct __packed pcan_usb_pro_devid { | ||
111 | u8 data_type; | ||
112 | u8 channel; | ||
113 | u16 dummy; | ||
114 | u32 serial_num; | ||
115 | }; | ||
116 | |||
117 | struct __packed pcan_usb_pro_setled { | ||
118 | u8 data_type; | ||
119 | u8 channel; | ||
120 | u16 mode; | ||
121 | u32 timeout; | ||
122 | }; | ||
123 | |||
124 | struct __packed pcan_usb_pro_rxmsg { | ||
125 | u8 data_type; | ||
126 | u8 client; | ||
127 | u8 flags; | ||
128 | u8 len; | ||
129 | u32 ts32; | ||
130 | u32 id; | ||
131 | |||
132 | u8 data[8]; | ||
133 | }; | ||
134 | |||
135 | #define PCAN_USBPRO_STATUS_ERROR 0x0001 | ||
136 | #define PCAN_USBPRO_STATUS_BUS 0x0002 | ||
137 | #define PCAN_USBPRO_STATUS_OVERRUN 0x0004 | ||
138 | #define PCAN_USBPRO_STATUS_QOVERRUN 0x0008 | ||
139 | |||
140 | struct __packed pcan_usb_pro_rxstatus { | ||
141 | u8 data_type; | ||
142 | u8 channel; | ||
143 | u16 status; | ||
144 | u32 ts32; | ||
145 | u32 err_frm; | ||
146 | }; | ||
147 | |||
148 | struct __packed pcan_usb_pro_rxts { | ||
149 | u8 data_type; | ||
150 | u8 dummy[3]; | ||
151 | u32 ts64[2]; | ||
152 | }; | ||
153 | |||
154 | struct __packed pcan_usb_pro_txmsg { | ||
155 | u8 data_type; | ||
156 | u8 client; | ||
157 | u8 flags; | ||
158 | u8 len; | ||
159 | u32 id; | ||
160 | u8 data[8]; | ||
161 | }; | ||
162 | |||
163 | union pcan_usb_pro_rec { | ||
164 | u8 data_type; | ||
165 | struct pcan_usb_pro_btr btr; | ||
166 | struct pcan_usb_pro_busact bus_act; | ||
167 | struct pcan_usb_pro_silent silent_mode; | ||
168 | struct pcan_usb_pro_filter filter_mode; | ||
169 | struct pcan_usb_pro_setts ts; | ||
170 | struct pcan_usb_pro_devid dev_id; | ||
171 | struct pcan_usb_pro_setled set_led; | ||
172 | struct pcan_usb_pro_rxmsg rx_msg; | ||
173 | struct pcan_usb_pro_rxstatus rx_status; | ||
174 | struct pcan_usb_pro_rxts rx_ts; | ||
175 | struct pcan_usb_pro_txmsg tx_msg; | ||
176 | }; | ||
177 | |||
178 | #endif | ||
diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c index 0a2a5ee79a1..a30b8f480f6 100644 --- a/drivers/net/can/vcan.c +++ b/drivers/net/can/vcan.c | |||
@@ -37,6 +37,8 @@ | |||
37 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | 37 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH |
38 | * DAMAGE. | 38 | * DAMAGE. |
39 | * | 39 | * |
40 | * Send feedback to <socketcan-users@lists.berlios.de> | ||
41 | * | ||
40 | */ | 42 | */ |
41 | 43 | ||
42 | #include <linux/module.h> | 44 | #include <linux/module.h> |
@@ -49,7 +51,7 @@ | |||
49 | #include <linux/slab.h> | 51 | #include <linux/slab.h> |
50 | #include <net/rtnetlink.h> | 52 | #include <net/rtnetlink.h> |
51 | 53 | ||
52 | static __initconst const char banner[] = | 54 | static __initdata const char banner[] = |
53 | KERN_INFO "vcan: Virtual CAN interface driver\n"; | 55 | KERN_INFO "vcan: Virtual CAN interface driver\n"; |
54 | 56 | ||
55 | MODULE_DESCRIPTION("virtual CAN interface"); | 57 | MODULE_DESCRIPTION("virtual CAN interface"); |
@@ -63,19 +65,20 @@ MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>"); | |||
63 | * See Documentation/networking/can.txt for details. | 65 | * See Documentation/networking/can.txt for details. |
64 | */ | 66 | */ |
65 | 67 | ||
66 | static bool echo; /* echo testing. Default: 0 (Off) */ | 68 | static int echo; /* echo testing. Default: 0 (Off) */ |
67 | module_param(echo, bool, S_IRUGO); | 69 | module_param(echo, bool, S_IRUGO); |
68 | MODULE_PARM_DESC(echo, "Echo sent frames (for testing). Default: 0 (Off)"); | 70 | MODULE_PARM_DESC(echo, "Echo sent frames (for testing). Default: 0 (Off)"); |
69 | 71 | ||
70 | 72 | ||
71 | static void vcan_rx(struct sk_buff *skb, struct net_device *dev) | 73 | static void vcan_rx(struct sk_buff *skb, struct net_device *dev) |
72 | { | 74 | { |
73 | struct canfd_frame *cfd = (struct canfd_frame *)skb->data; | 75 | struct can_frame *cf = (struct can_frame *)skb->data; |
74 | struct net_device_stats *stats = &dev->stats; | 76 | struct net_device_stats *stats = &dev->stats; |
75 | 77 | ||
76 | stats->rx_packets++; | 78 | stats->rx_packets++; |
77 | stats->rx_bytes += cfd->len; | 79 | stats->rx_bytes += cf->can_dlc; |
78 | 80 | ||
81 | skb->protocol = htons(ETH_P_CAN); | ||
79 | skb->pkt_type = PACKET_BROADCAST; | 82 | skb->pkt_type = PACKET_BROADCAST; |
80 | skb->dev = dev; | 83 | skb->dev = dev; |
81 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 84 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
@@ -85,7 +88,7 @@ static void vcan_rx(struct sk_buff *skb, struct net_device *dev) | |||
85 | 88 | ||
86 | static netdev_tx_t vcan_tx(struct sk_buff *skb, struct net_device *dev) | 89 | static netdev_tx_t vcan_tx(struct sk_buff *skb, struct net_device *dev) |
87 | { | 90 | { |
88 | struct canfd_frame *cfd = (struct canfd_frame *)skb->data; | 91 | struct can_frame *cf = (struct can_frame *)skb->data; |
89 | struct net_device_stats *stats = &dev->stats; | 92 | struct net_device_stats *stats = &dev->stats; |
90 | int loop; | 93 | int loop; |
91 | 94 | ||
@@ -93,7 +96,7 @@ static netdev_tx_t vcan_tx(struct sk_buff *skb, struct net_device *dev) | |||
93 | return NETDEV_TX_OK; | 96 | return NETDEV_TX_OK; |
94 | 97 | ||
95 | stats->tx_packets++; | 98 | stats->tx_packets++; |
96 | stats->tx_bytes += cfd->len; | 99 | stats->tx_bytes += cf->can_dlc; |
97 | 100 | ||
98 | /* set flag whether this packet has to be looped back */ | 101 | /* set flag whether this packet has to be looped back */ |
99 | loop = skb->pkt_type == PACKET_LOOPBACK; | 102 | loop = skb->pkt_type == PACKET_LOOPBACK; |
@@ -107,7 +110,7 @@ static netdev_tx_t vcan_tx(struct sk_buff *skb, struct net_device *dev) | |||
107 | * CAN core already did the echo for us | 110 | * CAN core already did the echo for us |
108 | */ | 111 | */ |
109 | stats->rx_packets++; | 112 | stats->rx_packets++; |
110 | stats->rx_bytes += cfd->len; | 113 | stats->rx_bytes += cf->can_dlc; |
111 | } | 114 | } |
112 | kfree_skb(skb); | 115 | kfree_skb(skb); |
113 | return NETDEV_TX_OK; | 116 | return NETDEV_TX_OK; |
@@ -132,28 +135,14 @@ static netdev_tx_t vcan_tx(struct sk_buff *skb, struct net_device *dev) | |||
132 | return NETDEV_TX_OK; | 135 | return NETDEV_TX_OK; |
133 | } | 136 | } |
134 | 137 | ||
135 | static int vcan_change_mtu(struct net_device *dev, int new_mtu) | ||
136 | { | ||
137 | /* Do not allow changing the MTU while running */ | ||
138 | if (dev->flags & IFF_UP) | ||
139 | return -EBUSY; | ||
140 | |||
141 | if (new_mtu != CAN_MTU && new_mtu != CANFD_MTU) | ||
142 | return -EINVAL; | ||
143 | |||
144 | dev->mtu = new_mtu; | ||
145 | return 0; | ||
146 | } | ||
147 | |||
148 | static const struct net_device_ops vcan_netdev_ops = { | 138 | static const struct net_device_ops vcan_netdev_ops = { |
149 | .ndo_start_xmit = vcan_tx, | 139 | .ndo_start_xmit = vcan_tx, |
150 | .ndo_change_mtu = vcan_change_mtu, | ||
151 | }; | 140 | }; |
152 | 141 | ||
153 | static void vcan_setup(struct net_device *dev) | 142 | static void vcan_setup(struct net_device *dev) |
154 | { | 143 | { |
155 | dev->type = ARPHRD_CAN; | 144 | dev->type = ARPHRD_CAN; |
156 | dev->mtu = CAN_MTU; | 145 | dev->mtu = sizeof(struct can_frame); |
157 | dev->hard_header_len = 0; | 146 | dev->hard_header_len = 0; |
158 | dev->addr_len = 0; | 147 | dev->addr_len = 0; |
159 | dev->tx_queue_len = 0; | 148 | dev->tx_queue_len = 0; |