Commit ddecab1a authored by David S. Miller's avatar David S. Miller

Merge tag 'linux-can-fixes-for-3.18-20141118' of git://gitorious.org/linux-can/linux-can

Marc Kleine-Budde says:

====================
pull-request: can 2014-11-18

this is a pull request of 17 patches for net/master for the v3.18 release
cycle.

The last patch of this pull request ("can: m_can: update to support CAN FD
features") adds, as the description says, a new feature to the m_can driver. As
the m_can driver has been added in v3.18 there is no risk of causing a
regression. Give me a note if this is not okay and I'll create a new pull
request without it.

There is a patch for the CAN infrastructure by Thomas Körper which fixes
calling kfree_skb() from interrupt context. Roman Fietze fixes a typo also in
the infrastructure. A patch by Dong Aisheng adds a generic helper function to
tell if a skb is normal CAN or CAN-FD frame. Alexey Khoroshilov of the Linux
Driver Verification project fixes a memory leak in the esd_usb2 driver. Two
patches by Sudip Mukherjee remove unused variables and fixe the signess of a
variable. Three patches by me add the missing .ndo_change_mtu callback to the
xilinx_can, rcar_can and gs_usb driver.

The remaining patches improve the m_can driver: David Cohen adds the missing
CONFIG_HAS_IOMEM dependency. Dong Aisheng provides 6 bugfix patches (most
important: missing RAM init, sleep in NAPI poll, dlc in RTR). While the last of
his patches adds CAN FD support to the driver.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 9737c6ab 80646733
...@@ -110,7 +110,7 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt, ...@@ -110,7 +110,7 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt,
long rate; long rate;
u64 v64; u64 v64;
/* Use CIA recommended sample points */ /* Use CiA recommended sample points */
if (bt->sample_point) { if (bt->sample_point) {
sampl_pt = bt->sample_point; sampl_pt = bt->sample_point;
} else { } else {
...@@ -382,7 +382,7 @@ void can_free_echo_skb(struct net_device *dev, unsigned int idx) ...@@ -382,7 +382,7 @@ void can_free_echo_skb(struct net_device *dev, unsigned int idx)
BUG_ON(idx >= priv->echo_skb_max); BUG_ON(idx >= priv->echo_skb_max);
if (priv->echo_skb[idx]) { if (priv->echo_skb[idx]) {
kfree_skb(priv->echo_skb[idx]); dev_kfree_skb_any(priv->echo_skb[idx]);
priv->echo_skb[idx] = NULL; priv->echo_skb[idx] = NULL;
} }
} }
......
config CAN_M_CAN config CAN_M_CAN
depends on HAS_IOMEM
tristate "Bosch M_CAN devices" tristate "Bosch M_CAN devices"
---help--- ---help---
Say Y here if you want to support for Bosch M_CAN controller. Say Y here if you want to support for Bosch M_CAN controller.
This diff is collapsed.
...@@ -628,6 +628,7 @@ static const struct net_device_ops rcar_can_netdev_ops = { ...@@ -628,6 +628,7 @@ static const struct net_device_ops rcar_can_netdev_ops = {
.ndo_open = rcar_can_open, .ndo_open = rcar_can_open,
.ndo_stop = rcar_can_close, .ndo_stop = rcar_can_close,
.ndo_start_xmit = rcar_can_start_xmit, .ndo_start_xmit = rcar_can_start_xmit,
.ndo_change_mtu = can_change_mtu,
}; };
static void rcar_can_rx_pkt(struct rcar_can_priv *priv) static void rcar_can_rx_pkt(struct rcar_can_priv *priv)
......
...@@ -214,7 +214,7 @@ static int kvaser_pci_add_chan(struct pci_dev *pdev, int channel, ...@@ -214,7 +214,7 @@ static int kvaser_pci_add_chan(struct pci_dev *pdev, int channel,
struct net_device *dev; struct net_device *dev;
struct sja1000_priv *priv; struct sja1000_priv *priv;
struct kvaser_pci *board; struct kvaser_pci *board;
int err, init_step; int err;
dev = alloc_sja1000dev(sizeof(struct kvaser_pci)); dev = alloc_sja1000dev(sizeof(struct kvaser_pci));
if (dev == NULL) if (dev == NULL)
...@@ -235,7 +235,6 @@ static int kvaser_pci_add_chan(struct pci_dev *pdev, int channel, ...@@ -235,7 +235,6 @@ static int kvaser_pci_add_chan(struct pci_dev *pdev, int channel,
if (channel == 0) { if (channel == 0) {
board->xilinx_ver = board->xilinx_ver =
ioread8(board->res_addr + XILINX_VERINT) >> 4; ioread8(board->res_addr + XILINX_VERINT) >> 4;
init_step = 2;
/* Assert PTADR# - we're in passive mode so the other bits are /* Assert PTADR# - we're in passive mode so the other bits are
not important */ not important */
...@@ -264,8 +263,6 @@ static int kvaser_pci_add_chan(struct pci_dev *pdev, int channel, ...@@ -264,8 +263,6 @@ static int kvaser_pci_add_chan(struct pci_dev *pdev, int channel,
priv->irq_flags = IRQF_SHARED; priv->irq_flags = IRQF_SHARED;
dev->irq = pdev->irq; dev->irq = pdev->irq;
init_step = 4;
dev_info(&pdev->dev, "reg_base=%p conf_addr=%p irq=%d\n", dev_info(&pdev->dev, "reg_base=%p conf_addr=%p irq=%d\n",
priv->reg_base, board->conf_addr, dev->irq); priv->reg_base, board->conf_addr, dev->irq);
......
...@@ -434,10 +434,9 @@ static void ems_usb_read_bulk_callback(struct urb *urb) ...@@ -434,10 +434,9 @@ static void ems_usb_read_bulk_callback(struct urb *urb)
if (urb->actual_length > CPC_HEADER_SIZE) { if (urb->actual_length > CPC_HEADER_SIZE) {
struct ems_cpc_msg *msg; struct ems_cpc_msg *msg;
u8 *ibuf = urb->transfer_buffer; u8 *ibuf = urb->transfer_buffer;
u8 msg_count, again, start; u8 msg_count, start;
msg_count = ibuf[0] & ~0x80; msg_count = ibuf[0] & ~0x80;
again = ibuf[0] & 0x80;
start = CPC_HEADER_SIZE; start = CPC_HEADER_SIZE;
......
...@@ -464,7 +464,6 @@ static void esd_usb2_write_bulk_callback(struct urb *urb) ...@@ -464,7 +464,6 @@ static void esd_usb2_write_bulk_callback(struct urb *urb)
{ {
struct esd_tx_urb_context *context = urb->context; struct esd_tx_urb_context *context = urb->context;
struct esd_usb2_net_priv *priv; struct esd_usb2_net_priv *priv;
struct esd_usb2 *dev;
struct net_device *netdev; struct net_device *netdev;
size_t size = sizeof(struct esd_usb2_msg); size_t size = sizeof(struct esd_usb2_msg);
...@@ -472,7 +471,6 @@ static void esd_usb2_write_bulk_callback(struct urb *urb) ...@@ -472,7 +471,6 @@ static void esd_usb2_write_bulk_callback(struct urb *urb)
priv = context->priv; priv = context->priv;
netdev = priv->netdev; netdev = priv->netdev;
dev = priv->usb2;
/* free up our allocated buffer */ /* free up our allocated buffer */
usb_free_coherent(urb->dev, size, usb_free_coherent(urb->dev, size,
...@@ -1143,6 +1141,7 @@ static void esd_usb2_disconnect(struct usb_interface *intf) ...@@ -1143,6 +1141,7 @@ static void esd_usb2_disconnect(struct usb_interface *intf)
} }
} }
unlink_all_urbs(dev); unlink_all_urbs(dev);
kfree(dev);
} }
} }
......
...@@ -718,6 +718,7 @@ static const struct net_device_ops gs_usb_netdev_ops = { ...@@ -718,6 +718,7 @@ static const struct net_device_ops gs_usb_netdev_ops = {
.ndo_open = gs_can_open, .ndo_open = gs_can_open,
.ndo_stop = gs_can_close, .ndo_stop = gs_can_close,
.ndo_start_xmit = gs_can_start_xmit, .ndo_start_xmit = gs_can_start_xmit,
.ndo_change_mtu = can_change_mtu,
}; };
static struct gs_can *gs_make_candev(unsigned int channel, struct usb_interface *intf) static struct gs_can *gs_make_candev(unsigned int channel, struct usb_interface *intf)
......
...@@ -300,7 +300,8 @@ static int xcan_set_bittiming(struct net_device *ndev) ...@@ -300,7 +300,8 @@ static int xcan_set_bittiming(struct net_device *ndev)
static int xcan_chip_start(struct net_device *ndev) static int xcan_chip_start(struct net_device *ndev)
{ {
struct xcan_priv *priv = netdev_priv(ndev); struct xcan_priv *priv = netdev_priv(ndev);
u32 err, reg_msr, reg_sr_mask; u32 reg_msr, reg_sr_mask;
int err;
unsigned long timeout; unsigned long timeout;
/* Check if it is in reset mode */ /* Check if it is in reset mode */
...@@ -961,6 +962,7 @@ static const struct net_device_ops xcan_netdev_ops = { ...@@ -961,6 +962,7 @@ static const struct net_device_ops xcan_netdev_ops = {
.ndo_open = xcan_open, .ndo_open = xcan_open,
.ndo_stop = xcan_close, .ndo_stop = xcan_close,
.ndo_start_xmit = xcan_start_xmit, .ndo_start_xmit = xcan_start_xmit,
.ndo_change_mtu = can_change_mtu,
}; };
/** /**
......
...@@ -99,6 +99,12 @@ static inline int can_dropped_invalid_skb(struct net_device *dev, ...@@ -99,6 +99,12 @@ static inline int can_dropped_invalid_skb(struct net_device *dev,
return 1; return 1;
} }
static inline bool can_is_canfd_skb(const struct sk_buff *skb)
{
/* the CAN specific type of skb is identified by its data length */
return skb->len == CANFD_MTU;
}
/* get data length from can_dlc with sanitized can_dlc */ /* get data length from can_dlc with sanitized can_dlc */
u8 can_dlc2len(u8 can_dlc); u8 can_dlc2len(u8 can_dlc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment