Merge branch 'for-davem' of git://gitorious.org/linux-can/linux-can-next
Marc Kleine-Budde says: ==================== this pull request is for net-next, for the v3.8 release cycle. Muhammad Ghias added support another board to the plx_pci sja1000 driver. Matthias Fuchs improved the esd_usb2 driver with listen-only mode and CAN-USB/Micro support. Andreas Larsson contributed a driver for the GRHCAN CAN IP-Core ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
7213dde6c9
10 changed files with 1898 additions and 8 deletions
35
Documentation/ABI/testing/sysfs-class-net-grcan
Normal file
35
Documentation/ABI/testing/sysfs-class-net-grcan
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
|
||||||
|
What: /sys/class/net/<iface>/grcan/enable0
|
||||||
|
Date: October 2012
|
||||||
|
KernelVersion: 3.8
|
||||||
|
Contact: Andreas Larsson <andreas@gaisler.com>
|
||||||
|
Description:
|
||||||
|
Hardware configuration of physical interface 0. This file reads
|
||||||
|
and writes the "Enable 0" bit of the configuration register.
|
||||||
|
Possible values: 0 or 1. See the GRCAN chapter of the GRLIB IP
|
||||||
|
core library documentation for details. The default value is 0
|
||||||
|
or set by the module parameter grcan.enable0 and can be read at
|
||||||
|
/sys/module/grcan/parameters/enable0.
|
||||||
|
|
||||||
|
What: /sys/class/net/<iface>/grcan/enable1
|
||||||
|
Date: October 2012
|
||||||
|
KernelVersion: 3.8
|
||||||
|
Contact: Andreas Larsson <andreas@gaisler.com>
|
||||||
|
Description:
|
||||||
|
Hardware configuration of physical interface 1. This file reads
|
||||||
|
and writes the "Enable 1" bit of the configuration register.
|
||||||
|
Possible values: 0 or 1. See the GRCAN chapter of the GRLIB IP
|
||||||
|
core library documentation for details. The default value is 0
|
||||||
|
or set by the module parameter grcan.enable1 and can be read at
|
||||||
|
/sys/module/grcan/parameters/enable1.
|
||||||
|
|
||||||
|
What: /sys/class/net/<iface>/grcan/select
|
||||||
|
Date: October 2012
|
||||||
|
KernelVersion: 3.8
|
||||||
|
Contact: Andreas Larsson <andreas@gaisler.com>
|
||||||
|
Description:
|
||||||
|
Configuration of which physical interface to be used. Possible
|
||||||
|
values: 0 or 1. See the GRCAN chapter of the GRLIB IP core
|
||||||
|
library documentation for details. The default value is 0 or is
|
||||||
|
set by the module parameter grcan.select and can be read at
|
||||||
|
/sys/module/grcan/parameters/select.
|
28
Documentation/devicetree/bindings/net/can/grcan.txt
Normal file
28
Documentation/devicetree/bindings/net/can/grcan.txt
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
Aeroflex Gaisler GRCAN and GRHCAN CAN controllers.
|
||||||
|
|
||||||
|
The GRCAN and CRHCAN CAN controllers are available in the GRLIB VHDL IP core
|
||||||
|
library.
|
||||||
|
|
||||||
|
Note: These properties are built from the AMBA plug&play in a Leon SPARC system
|
||||||
|
(the ordinary environment for GRCAN and GRHCAN). There are no dts files for
|
||||||
|
sparc.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- name : Should be "GAISLER_GRCAN", "01_03d", "GAISLER_GRHCAN" or "01_034"
|
||||||
|
|
||||||
|
- reg : Address and length of the register set for the device
|
||||||
|
|
||||||
|
- freq : Frequency of the external oscillator clock in Hz (the frequency of
|
||||||
|
the amba bus in the ordinary case)
|
||||||
|
|
||||||
|
- interrupts : Interrupt number for this device
|
||||||
|
|
||||||
|
Optional properties:
|
||||||
|
|
||||||
|
- systemid : If not present or if the value of the least significant 16 bits
|
||||||
|
of this 32-bit property is smaller than GRCAN_TXBUG_SAFE_GRLIB_VERSION
|
||||||
|
a bug workaround is activated.
|
||||||
|
|
||||||
|
For further information look in the documentation for the GLIB IP core library:
|
||||||
|
http://www.gaisler.com/products/grlib/grip.pdf
|
|
@ -905,6 +905,24 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||||
gpt [EFI] Forces disk with valid GPT signature but
|
gpt [EFI] Forces disk with valid GPT signature but
|
||||||
invalid Protective MBR to be treated as GPT.
|
invalid Protective MBR to be treated as GPT.
|
||||||
|
|
||||||
|
grcan.enable0= [HW] Configuration of physical interface 0. Determines
|
||||||
|
the "Enable 0" bit of the configuration register.
|
||||||
|
Format: 0 | 1
|
||||||
|
Default: 0
|
||||||
|
grcan.enable1= [HW] Configuration of physical interface 1. Determines
|
||||||
|
the "Enable 0" bit of the configuration register.
|
||||||
|
Format: 0 | 1
|
||||||
|
Default: 0
|
||||||
|
grcan.select= [HW] Select which physical interface to use.
|
||||||
|
Format: 0 | 1
|
||||||
|
Default: 0
|
||||||
|
grcan.txsize= [HW] Sets the size of the tx buffer.
|
||||||
|
Format: <unsigned int> such that (txsize & ~0x1fffc0) == 0.
|
||||||
|
Default: 1024
|
||||||
|
grcan.rxsize= [HW] Sets the size of the rx buffer.
|
||||||
|
Format: <unsigned int> such that (rxsize & ~0x1fffc0) == 0.
|
||||||
|
Default: 1024
|
||||||
|
|
||||||
hashdist= [KNL,NUMA] Large hashes allocated during boot
|
hashdist= [KNL,NUMA] Large hashes allocated during boot
|
||||||
are distributed across NUMA nodes. Defaults on
|
are distributed across NUMA nodes. Defaults on
|
||||||
for 64-bit NUMA, off otherwise.
|
for 64-bit NUMA, off otherwise.
|
||||||
|
|
|
@ -110,6 +110,15 @@ config PCH_CAN
|
||||||
is an IOH for x86 embedded processor (Intel Atom E6xx series).
|
is an IOH for x86 embedded processor (Intel Atom E6xx series).
|
||||||
This driver can access CAN bus.
|
This driver can access CAN bus.
|
||||||
|
|
||||||
|
config CAN_GRCAN
|
||||||
|
tristate "Aeroflex Gaisler GRCAN and GRHCAN CAN devices"
|
||||||
|
depends on CAN_DEV && OF
|
||||||
|
---help---
|
||||||
|
Say Y here if you want to use Aeroflex Gaisler GRCAN or GRHCAN.
|
||||||
|
Note that the driver supports little endian, even though little
|
||||||
|
endian syntheses of the cores would need some modifications on
|
||||||
|
the hardware level to work.
|
||||||
|
|
||||||
source "drivers/net/can/mscan/Kconfig"
|
source "drivers/net/can/mscan/Kconfig"
|
||||||
|
|
||||||
source "drivers/net/can/sja1000/Kconfig"
|
source "drivers/net/can/sja1000/Kconfig"
|
||||||
|
|
|
@ -22,5 +22,6 @@ obj-$(CONFIG_CAN_BFIN) += bfin_can.o
|
||||||
obj-$(CONFIG_CAN_JANZ_ICAN3) += janz-ican3.o
|
obj-$(CONFIG_CAN_JANZ_ICAN3) += janz-ican3.o
|
||||||
obj-$(CONFIG_CAN_FLEXCAN) += flexcan.o
|
obj-$(CONFIG_CAN_FLEXCAN) += flexcan.o
|
||||||
obj-$(CONFIG_PCH_CAN) += pch_can.o
|
obj-$(CONFIG_PCH_CAN) += pch_can.o
|
||||||
|
obj-$(CONFIG_CAN_GRCAN) += grcan.o
|
||||||
|
|
||||||
ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG
|
ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG
|
||||||
|
|
1756
drivers/net/can/grcan.c
Normal file
1756
drivers/net/can/grcan.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -1692,7 +1692,7 @@ static int ican3_get_berr_counter(const struct net_device *ndev,
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = wait_for_completion_timeout(&mod->buserror_comp, HZ);
|
ret = wait_for_completion_timeout(&mod->buserror_comp, HZ);
|
||||||
if (ret <= 0) {
|
if (ret == 0) {
|
||||||
dev_info(mod->dev, "%s timed out\n", __func__);
|
dev_info(mod->dev, "%s timed out\n", __func__);
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
@ -1718,7 +1718,7 @@ static ssize_t ican3_sysfs_show_term(struct device *dev,
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = wait_for_completion_timeout(&mod->termination_comp, HZ);
|
ret = wait_for_completion_timeout(&mod->termination_comp, HZ);
|
||||||
if (ret <= 0) {
|
if (ret == 0) {
|
||||||
dev_info(mod->dev, "%s timed out\n", __func__);
|
dev_info(mod->dev, "%s timed out\n", __func__);
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,6 +93,7 @@ config CAN_PLX_PCI
|
||||||
- Marathon CAN-bus-PCI card (http://www.marathon.ru/)
|
- Marathon CAN-bus-PCI card (http://www.marathon.ru/)
|
||||||
- TEWS TECHNOLOGIES TPMC810 card (http://www.tews.com/)
|
- TEWS TECHNOLOGIES TPMC810 card (http://www.tews.com/)
|
||||||
- IXXAT Automation PC-I 04/PCI card (http://www.ixxat.com/)
|
- IXXAT Automation PC-I 04/PCI card (http://www.ixxat.com/)
|
||||||
|
- Connect Tech Inc. CANpro/104-Plus Opto (CRG001) card (http://www.connecttech.com)
|
||||||
|
|
||||||
config CAN_TSCAN1
|
config CAN_TSCAN1
|
||||||
tristate "TS-CAN1 PC104 boards"
|
tristate "TS-CAN1 PC104 boards"
|
||||||
|
|
|
@ -44,6 +44,7 @@ MODULE_SUPPORTED_DEVICE("Adlink PCI-7841/cPCI-7841, "
|
||||||
"esd CAN-PCI/CPCI/PCI104/200, "
|
"esd CAN-PCI/CPCI/PCI104/200, "
|
||||||
"esd CAN-PCI/PMC/266, "
|
"esd CAN-PCI/PMC/266, "
|
||||||
"esd CAN-PCIe/2000, "
|
"esd CAN-PCIe/2000, "
|
||||||
|
"Connect Tech Inc. CANpro/104-Plus Opto (CRG001), "
|
||||||
"IXXAT PC-I 04/PCI")
|
"IXXAT PC-I 04/PCI")
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
|
|
||||||
|
@ -131,6 +132,9 @@ struct plx_pci_card {
|
||||||
#define TEWS_PCI_VENDOR_ID 0x1498
|
#define TEWS_PCI_VENDOR_ID 0x1498
|
||||||
#define TEWS_PCI_DEVICE_ID_TMPC810 0x032A
|
#define TEWS_PCI_DEVICE_ID_TMPC810 0x032A
|
||||||
|
|
||||||
|
#define CTI_PCI_VENDOR_ID 0x12c4
|
||||||
|
#define CTI_PCI_DEVICE_ID_CRG001 0x0900
|
||||||
|
|
||||||
static void plx_pci_reset_common(struct pci_dev *pdev);
|
static void plx_pci_reset_common(struct pci_dev *pdev);
|
||||||
static void plx_pci_reset_marathon(struct pci_dev *pdev);
|
static void plx_pci_reset_marathon(struct pci_dev *pdev);
|
||||||
static void plx9056_pci_reset_common(struct pci_dev *pdev);
|
static void plx9056_pci_reset_common(struct pci_dev *pdev);
|
||||||
|
@ -222,6 +226,14 @@ static struct plx_pci_card_info plx_pci_card_info_tews __devinitdata = {
|
||||||
/* based on PLX9030 */
|
/* based on PLX9030 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct plx_pci_card_info plx_pci_card_info_cti __devinitdata = {
|
||||||
|
"Connect Tech Inc. CANpro/104-Plus Opto (CRG001)", 2,
|
||||||
|
PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR,
|
||||||
|
{0, 0x00, 0x00}, { {2, 0x000, 0x80}, {2, 0x100, 0x80} },
|
||||||
|
&plx_pci_reset_common
|
||||||
|
/* based on PLX9030 */
|
||||||
|
};
|
||||||
|
|
||||||
static DEFINE_PCI_DEVICE_TABLE(plx_pci_tbl) = {
|
static DEFINE_PCI_DEVICE_TABLE(plx_pci_tbl) = {
|
||||||
{
|
{
|
||||||
/* Adlink PCI-7841/cPCI-7841 */
|
/* Adlink PCI-7841/cPCI-7841 */
|
||||||
|
@ -300,6 +312,13 @@ static DEFINE_PCI_DEVICE_TABLE(plx_pci_tbl) = {
|
||||||
0, 0,
|
0, 0,
|
||||||
(kernel_ulong_t)&plx_pci_card_info_tews
|
(kernel_ulong_t)&plx_pci_card_info_tews
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
/* Connect Tech Inc. CANpro/104-Plus Opto (CRG001) card */
|
||||||
|
PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030,
|
||||||
|
CTI_PCI_VENDOR_ID, CTI_PCI_DEVICE_ID_CRG001,
|
||||||
|
0, 0,
|
||||||
|
(kernel_ulong_t)&plx_pci_card_info_cti
|
||||||
|
},
|
||||||
{ 0,}
|
{ 0,}
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(pci, plx_pci_tbl);
|
MODULE_DEVICE_TABLE(pci, plx_pci_tbl);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* CAN driver for esd CAN-USB/2
|
* CAN driver for esd CAN-USB/2 and CAN-USB/Micro
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010 Matthias Fuchs <matthias.fuchs@esd.eu>, esd gmbh
|
* Copyright (C) 2010-2012 Matthias Fuchs <matthias.fuchs@esd.eu>, esd gmbh
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License as published
|
* under the terms of the GNU General Public License as published
|
||||||
|
@ -28,14 +28,16 @@
|
||||||
#include <linux/can/error.h>
|
#include <linux/can/error.h>
|
||||||
|
|
||||||
MODULE_AUTHOR("Matthias Fuchs <matthias.fuchs@esd.eu>");
|
MODULE_AUTHOR("Matthias Fuchs <matthias.fuchs@esd.eu>");
|
||||||
MODULE_DESCRIPTION("CAN driver for esd CAN-USB/2 interfaces");
|
MODULE_DESCRIPTION("CAN driver for esd CAN-USB/2 and CAN-USB/Micro interfaces");
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
|
|
||||||
/* Define these values to match your devices */
|
/* Define these values to match your devices */
|
||||||
#define USB_ESDGMBH_VENDOR_ID 0x0ab4
|
#define USB_ESDGMBH_VENDOR_ID 0x0ab4
|
||||||
#define USB_CANUSB2_PRODUCT_ID 0x0010
|
#define USB_CANUSB2_PRODUCT_ID 0x0010
|
||||||
|
#define USB_CANUSBM_PRODUCT_ID 0x0011
|
||||||
|
|
||||||
#define ESD_USB2_CAN_CLOCK 60000000
|
#define ESD_USB2_CAN_CLOCK 60000000
|
||||||
|
#define ESD_USBM_CAN_CLOCK 36000000
|
||||||
#define ESD_USB2_MAX_NETS 2
|
#define ESD_USB2_MAX_NETS 2
|
||||||
|
|
||||||
/* USB2 commands */
|
/* USB2 commands */
|
||||||
|
@ -69,6 +71,7 @@ MODULE_LICENSE("GPL v2");
|
||||||
#define ESD_USB2_TSEG2_SHIFT 20
|
#define ESD_USB2_TSEG2_SHIFT 20
|
||||||
#define ESD_USB2_SJW_MAX 4
|
#define ESD_USB2_SJW_MAX 4
|
||||||
#define ESD_USB2_SJW_SHIFT 14
|
#define ESD_USB2_SJW_SHIFT 14
|
||||||
|
#define ESD_USBM_SJW_SHIFT 24
|
||||||
#define ESD_USB2_BRP_MIN 1
|
#define ESD_USB2_BRP_MIN 1
|
||||||
#define ESD_USB2_BRP_MAX 1024
|
#define ESD_USB2_BRP_MAX 1024
|
||||||
#define ESD_USB2_BRP_INC 1
|
#define ESD_USB2_BRP_INC 1
|
||||||
|
@ -183,6 +186,7 @@ struct __attribute__ ((packed)) esd_usb2_msg {
|
||||||
|
|
||||||
static struct usb_device_id esd_usb2_table[] = {
|
static struct usb_device_id esd_usb2_table[] = {
|
||||||
{USB_DEVICE(USB_ESDGMBH_VENDOR_ID, USB_CANUSB2_PRODUCT_ID)},
|
{USB_DEVICE(USB_ESDGMBH_VENDOR_ID, USB_CANUSB2_PRODUCT_ID)},
|
||||||
|
{USB_DEVICE(USB_ESDGMBH_VENDOR_ID, USB_CANUSBM_PRODUCT_ID)},
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(usb, esd_usb2_table);
|
MODULE_DEVICE_TABLE(usb, esd_usb2_table);
|
||||||
|
@ -889,11 +893,22 @@ static int esd_usb2_set_bittiming(struct net_device *netdev)
|
||||||
struct can_bittiming *bt = &priv->can.bittiming;
|
struct can_bittiming *bt = &priv->can.bittiming;
|
||||||
struct esd_usb2_msg msg;
|
struct esd_usb2_msg msg;
|
||||||
u32 canbtr;
|
u32 canbtr;
|
||||||
|
int sjw_shift;
|
||||||
|
|
||||||
canbtr = ESD_USB2_UBR;
|
canbtr = ESD_USB2_UBR;
|
||||||
|
if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
|
||||||
|
canbtr |= ESD_USB2_LOM;
|
||||||
|
|
||||||
canbtr |= (bt->brp - 1) & (ESD_USB2_BRP_MAX - 1);
|
canbtr |= (bt->brp - 1) & (ESD_USB2_BRP_MAX - 1);
|
||||||
|
|
||||||
|
if (le16_to_cpu(priv->usb2->udev->descriptor.idProduct) ==
|
||||||
|
USB_CANUSBM_PRODUCT_ID)
|
||||||
|
sjw_shift = ESD_USBM_SJW_SHIFT;
|
||||||
|
else
|
||||||
|
sjw_shift = ESD_USB2_SJW_SHIFT;
|
||||||
|
|
||||||
canbtr |= ((bt->sjw - 1) & (ESD_USB2_SJW_MAX - 1))
|
canbtr |= ((bt->sjw - 1) & (ESD_USB2_SJW_MAX - 1))
|
||||||
<< ESD_USB2_SJW_SHIFT;
|
<< sjw_shift;
|
||||||
canbtr |= ((bt->prop_seg + bt->phase_seg1 - 1)
|
canbtr |= ((bt->prop_seg + bt->phase_seg1 - 1)
|
||||||
& (ESD_USB2_TSEG1_MAX - 1))
|
& (ESD_USB2_TSEG1_MAX - 1))
|
||||||
<< ESD_USB2_TSEG1_SHIFT;
|
<< ESD_USB2_TSEG1_SHIFT;
|
||||||
|
@ -971,12 +986,20 @@ static int esd_usb2_probe_one_net(struct usb_interface *intf, int index)
|
||||||
priv->index = index;
|
priv->index = index;
|
||||||
|
|
||||||
priv->can.state = CAN_STATE_STOPPED;
|
priv->can.state = CAN_STATE_STOPPED;
|
||||||
priv->can.clock.freq = ESD_USB2_CAN_CLOCK;
|
priv->can.ctrlmode_supported = CAN_CTRLMODE_LISTENONLY;
|
||||||
|
|
||||||
|
if (le16_to_cpu(dev->udev->descriptor.idProduct) ==
|
||||||
|
USB_CANUSBM_PRODUCT_ID)
|
||||||
|
priv->can.clock.freq = ESD_USBM_CAN_CLOCK;
|
||||||
|
else {
|
||||||
|
priv->can.clock.freq = ESD_USB2_CAN_CLOCK;
|
||||||
|
priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES;
|
||||||
|
}
|
||||||
|
|
||||||
priv->can.bittiming_const = &esd_usb2_bittiming_const;
|
priv->can.bittiming_const = &esd_usb2_bittiming_const;
|
||||||
priv->can.do_set_bittiming = esd_usb2_set_bittiming;
|
priv->can.do_set_bittiming = esd_usb2_set_bittiming;
|
||||||
priv->can.do_set_mode = esd_usb2_set_mode;
|
priv->can.do_set_mode = esd_usb2_set_mode;
|
||||||
priv->can.do_get_berr_counter = esd_usb2_get_berr_counter;
|
priv->can.do_get_berr_counter = esd_usb2_get_berr_counter;
|
||||||
priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES;
|
|
||||||
|
|
||||||
netdev->flags |= IFF_ECHO; /* we support local echo */
|
netdev->flags |= IFF_ECHO; /* we support local echo */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue