forked from Minki/linux
linux-can-fixes-for-4.11-20170425
-----BEGIN PGP SIGNATURE----- iQFHBAABCgAxFiEE4bay/IylYqM/npjQHv7KIOw4HPYFAlj/PI0THG1rbEBwZW5n dXRyb25peC5kZQAKCRAe/sog7Dgc9ntrCADToD6OAE2/vEPgxrLFSEqEPS4vzXkL 6RObZRDYj0FrOo+Xkq9G8V+AKKJHH04CasQ0+XV0mCeVsx9GZTByllU8Sbej+sjO SXlU9ZuhJGJEBCpFPqfjwGIxpCcRUF7BFxcBQgzOVY68m4fLHPMXSS0FS14r0B6M GLk7nEGBUteYDDVCoWMNBt5VkIP6DXLfdvhTtj9R+BJmEwKZrXU3F6/Z5K686zf9 xAL01tn4rgLHhtWyxDTlVQ8CREZ+4YQAasi6usgLhNWTEpfCQaD22cyClM1pCV2s HloB4DpOF507saJrmEz9n1BlnYXV1jqRkRHOB9UO0OvJR3Ta1XP5DOgp =mnla -----END PGP SIGNATURE----- Merge tag 'linux-can-fixes-for-4.11-20170425' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can Marc Kleine-Budde says: ==================== pull-request: can 2017-04-25 this is a pull request of three patches for net/master. There are two patches by Stephane Grosjean for that add a new variant to the PCAN-Chip USB driver. The other patch is by Maksim Salau, which swtiches the memory for USB transfers from heap to stack. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
fccb4422d0
@ -72,6 +72,8 @@ config CAN_PEAK_USB
|
||||
PCAN-USB Pro dual CAN 2.0b channels USB adapter
|
||||
PCAN-USB FD single CAN-FD channel USB adapter
|
||||
PCAN-USB Pro FD dual CAN-FD channels USB adapter
|
||||
PCAN-Chip USB CAN-FD to USB stamp module
|
||||
PCAN-USB X6 6 CAN-FD channels USB adapter
|
||||
|
||||
(see also http://www.peak-system.com).
|
||||
|
||||
|
@ -739,13 +739,18 @@ static const struct net_device_ops gs_usb_netdev_ops = {
|
||||
static int gs_usb_set_identify(struct net_device *netdev, bool do_identify)
|
||||
{
|
||||
struct gs_can *dev = netdev_priv(netdev);
|
||||
struct gs_identify_mode imode;
|
||||
struct gs_identify_mode *imode;
|
||||
int rc;
|
||||
|
||||
imode = kmalloc(sizeof(*imode), GFP_KERNEL);
|
||||
|
||||
if (!imode)
|
||||
return -ENOMEM;
|
||||
|
||||
if (do_identify)
|
||||
imode.mode = GS_CAN_IDENTIFY_ON;
|
||||
imode->mode = GS_CAN_IDENTIFY_ON;
|
||||
else
|
||||
imode.mode = GS_CAN_IDENTIFY_OFF;
|
||||
imode->mode = GS_CAN_IDENTIFY_OFF;
|
||||
|
||||
rc = usb_control_msg(interface_to_usbdev(dev->iface),
|
||||
usb_sndctrlpipe(interface_to_usbdev(dev->iface),
|
||||
@ -755,10 +760,12 @@ static int gs_usb_set_identify(struct net_device *netdev, bool do_identify)
|
||||
USB_RECIP_INTERFACE,
|
||||
dev->channel,
|
||||
0,
|
||||
&imode,
|
||||
sizeof(imode),
|
||||
imode,
|
||||
sizeof(*imode),
|
||||
100);
|
||||
|
||||
kfree(imode);
|
||||
|
||||
return (rc > 0) ? 0 : rc;
|
||||
}
|
||||
|
||||
|
@ -39,6 +39,7 @@ static struct usb_device_id peak_usb_table[] = {
|
||||
{USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBPRO_PRODUCT_ID)},
|
||||
{USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBFD_PRODUCT_ID)},
|
||||
{USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBPROFD_PRODUCT_ID)},
|
||||
{USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBCHIP_PRODUCT_ID)},
|
||||
{USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBX6_PRODUCT_ID)},
|
||||
{} /* Terminating entry */
|
||||
};
|
||||
@ -51,6 +52,7 @@ static const struct peak_usb_adapter *const peak_usb_adapters_list[] = {
|
||||
&pcan_usb_pro,
|
||||
&pcan_usb_fd,
|
||||
&pcan_usb_pro_fd,
|
||||
&pcan_usb_chip,
|
||||
&pcan_usb_x6,
|
||||
};
|
||||
|
||||
|
@ -27,6 +27,7 @@
|
||||
#define PCAN_USBPRO_PRODUCT_ID 0x000d
|
||||
#define PCAN_USBPROFD_PRODUCT_ID 0x0011
|
||||
#define PCAN_USBFD_PRODUCT_ID 0x0012
|
||||
#define PCAN_USBCHIP_PRODUCT_ID 0x0013
|
||||
#define PCAN_USBX6_PRODUCT_ID 0x0014
|
||||
|
||||
#define PCAN_USB_DRIVER_NAME "peak_usb"
|
||||
@ -90,6 +91,7 @@ struct peak_usb_adapter {
|
||||
extern const struct peak_usb_adapter pcan_usb;
|
||||
extern const struct peak_usb_adapter pcan_usb_pro;
|
||||
extern const struct peak_usb_adapter pcan_usb_fd;
|
||||
extern const struct peak_usb_adapter pcan_usb_chip;
|
||||
extern const struct peak_usb_adapter pcan_usb_pro_fd;
|
||||
extern const struct peak_usb_adapter pcan_usb_x6;
|
||||
|
||||
|
@ -1061,6 +1061,78 @@ const struct peak_usb_adapter pcan_usb_fd = {
|
||||
.do_get_berr_counter = pcan_usb_fd_get_berr_counter,
|
||||
};
|
||||
|
||||
/* describes the PCAN-CHIP USB */
|
||||
static const struct can_bittiming_const pcan_usb_chip_const = {
|
||||
.name = "pcan_chip_usb",
|
||||
.tseg1_min = 1,
|
||||
.tseg1_max = (1 << PUCAN_TSLOW_TSGEG1_BITS),
|
||||
.tseg2_min = 1,
|
||||
.tseg2_max = (1 << PUCAN_TSLOW_TSGEG2_BITS),
|
||||
.sjw_max = (1 << PUCAN_TSLOW_SJW_BITS),
|
||||
.brp_min = 1,
|
||||
.brp_max = (1 << PUCAN_TSLOW_BRP_BITS),
|
||||
.brp_inc = 1,
|
||||
};
|
||||
|
||||
static const struct can_bittiming_const pcan_usb_chip_data_const = {
|
||||
.name = "pcan_chip_usb",
|
||||
.tseg1_min = 1,
|
||||
.tseg1_max = (1 << PUCAN_TFAST_TSGEG1_BITS),
|
||||
.tseg2_min = 1,
|
||||
.tseg2_max = (1 << PUCAN_TFAST_TSGEG2_BITS),
|
||||
.sjw_max = (1 << PUCAN_TFAST_SJW_BITS),
|
||||
.brp_min = 1,
|
||||
.brp_max = (1 << PUCAN_TFAST_BRP_BITS),
|
||||
.brp_inc = 1,
|
||||
};
|
||||
|
||||
const struct peak_usb_adapter pcan_usb_chip = {
|
||||
.name = "PCAN-Chip USB",
|
||||
.device_id = PCAN_USBCHIP_PRODUCT_ID,
|
||||
.ctrl_count = PCAN_USBFD_CHANNEL_COUNT,
|
||||
.ctrlmode_supported = CAN_CTRLMODE_FD |
|
||||
CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY,
|
||||
.clock = {
|
||||
.freq = PCAN_UFD_CRYSTAL_HZ,
|
||||
},
|
||||
.bittiming_const = &pcan_usb_chip_const,
|
||||
.data_bittiming_const = &pcan_usb_chip_data_const,
|
||||
|
||||
/* size of device private data */
|
||||
.sizeof_dev_private = sizeof(struct pcan_usb_fd_device),
|
||||
|
||||
/* timestamps usage */
|
||||
.ts_used_bits = 32,
|
||||
.ts_period = 1000000, /* calibration period in ts. */
|
||||
.us_per_ts_scale = 1, /* us = (ts * scale) >> shift */
|
||||
.us_per_ts_shift = 0,
|
||||
|
||||
/* give here messages in/out endpoints */
|
||||
.ep_msg_in = PCAN_USBPRO_EP_MSGIN,
|
||||
.ep_msg_out = {PCAN_USBPRO_EP_MSGOUT_0},
|
||||
|
||||
/* size of rx/tx usb buffers */
|
||||
.rx_buffer_size = PCAN_UFD_RX_BUFFER_SIZE,
|
||||
.tx_buffer_size = PCAN_UFD_TX_BUFFER_SIZE,
|
||||
|
||||
/* device callbacks */
|
||||
.intf_probe = pcan_usb_pro_probe, /* same as PCAN-USB Pro */
|
||||
.dev_init = pcan_usb_fd_init,
|
||||
|
||||
.dev_exit = pcan_usb_fd_exit,
|
||||
.dev_free = pcan_usb_fd_free,
|
||||
.dev_set_bus = pcan_usb_fd_set_bus,
|
||||
.dev_set_bittiming = pcan_usb_fd_set_bittiming_slow,
|
||||
.dev_set_data_bittiming = pcan_usb_fd_set_bittiming_fast,
|
||||
.dev_decode_buf = pcan_usb_fd_decode_buf,
|
||||
.dev_start = pcan_usb_fd_start,
|
||||
.dev_stop = pcan_usb_fd_stop,
|
||||
.dev_restart_async = pcan_usb_fd_restart_async,
|
||||
.dev_encode_msg = pcan_usb_fd_encode_msg,
|
||||
|
||||
.do_get_berr_counter = pcan_usb_fd_get_berr_counter,
|
||||
};
|
||||
|
||||
/* describes the PCAN-USB Pro FD adapter */
|
||||
static const struct can_bittiming_const pcan_usb_pro_fd_const = {
|
||||
.name = "pcan_usb_pro_fd",
|
||||
|
Loading…
Reference in New Issue
Block a user