Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cee9f6d0 authored by David S. Miller's avatar David S. Miller
Browse files

Merge tag 'linux-can-fixes-for-4.2-20150712' of...

Merge tag 'linux-can-fixes-for-4.2-20150712' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can



Marc Kleine-Budde says:

====================
pull-request: can 2015-07-12

this is a pull request of 8 patchs for net/master.

Sergei Shtylyov contributes 5 patches for the rcar_can driver, fixing the IRQ
check and several info and error messages. There are two patches by J.D.
Schroeder and Roger Quadros for the c_can driver and dra7x-evm device tree,
which precent a glitch in the DCAN1 pinmux. Oliver Hartkopp provides a better
approach to make the CAN skbs unique, the timestamp is replaced by a counter.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 76b63da9 d3b58c47
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -686,7 +686,8 @@


&dcan1 {
&dcan1 {
	status = "ok";
	status = "ok";
	pinctrl-names = "default", "sleep";
	pinctrl-names = "default", "sleep", "active";
	pinctrl-0 = <&dcan1_pins_default>;
	pinctrl-0 = <&dcan1_pins_sleep>;
	pinctrl-1 = <&dcan1_pins_sleep>;
	pinctrl-1 = <&dcan1_pins_sleep>;
	pinctrl-2 = <&dcan1_pins_default>;
};
};
+3 −2
Original line number Original line Diff line number Diff line
@@ -587,9 +587,10 @@


&dcan1 {
&dcan1 {
	status = "ok";
	status = "ok";
	pinctrl-names = "default", "sleep";
	pinctrl-names = "default", "sleep", "active";
	pinctrl-0 = <&dcan1_pins_default>;
	pinctrl-0 = <&dcan1_pins_sleep>;
	pinctrl-1 = <&dcan1_pins_sleep>;
	pinctrl-1 = <&dcan1_pins_sleep>;
	pinctrl-2 = <&dcan1_pins_default>;
};
};


&qspi {
&qspi {
+8 −2
Original line number Original line Diff line number Diff line
@@ -592,6 +592,7 @@ static int c_can_start(struct net_device *dev)
{
{
	struct c_can_priv *priv = netdev_priv(dev);
	struct c_can_priv *priv = netdev_priv(dev);
	int err;
	int err;
	struct pinctrl *p;


	/* basic c_can configuration */
	/* basic c_can configuration */
	err = c_can_chip_config(dev);
	err = c_can_chip_config(dev);
@@ -604,8 +605,13 @@ static int c_can_start(struct net_device *dev)


	priv->can.state = CAN_STATE_ERROR_ACTIVE;
	priv->can.state = CAN_STATE_ERROR_ACTIVE;


	/* activate pins */
	/* Attempt to use "active" if available else use "default" */
	pinctrl_pm_select_default_state(dev->dev.parent);
	p = pinctrl_get_select(priv->device, "active");
	if (!IS_ERR(p))
		pinctrl_put(p);
	else
		pinctrl_pm_select_default_state(priv->device);

	return 0;
	return 0;
}
}


+2 −5
Original line number Original line Diff line number Diff line
@@ -440,9 +440,6 @@ unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx)
		struct can_frame *cf = (struct can_frame *)skb->data;
		struct can_frame *cf = (struct can_frame *)skb->data;
		u8 dlc = cf->can_dlc;
		u8 dlc = cf->can_dlc;


		if (!(skb->tstamp.tv64))
			__net_timestamp(skb);

		netif_rx(priv->echo_skb[idx]);
		netif_rx(priv->echo_skb[idx]);
		priv->echo_skb[idx] = NULL;
		priv->echo_skb[idx] = NULL;


@@ -578,7 +575,6 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf)
	if (unlikely(!skb))
	if (unlikely(!skb))
		return NULL;
		return NULL;


	__net_timestamp(skb);
	skb->protocol = htons(ETH_P_CAN);
	skb->protocol = htons(ETH_P_CAN);
	skb->pkt_type = PACKET_BROADCAST;
	skb->pkt_type = PACKET_BROADCAST;
	skb->ip_summed = CHECKSUM_UNNECESSARY;
	skb->ip_summed = CHECKSUM_UNNECESSARY;
@@ -589,6 +585,7 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf)


	can_skb_reserve(skb);
	can_skb_reserve(skb);
	can_skb_prv(skb)->ifindex = dev->ifindex;
	can_skb_prv(skb)->ifindex = dev->ifindex;
	can_skb_prv(skb)->skbcnt = 0;


	*cf = (struct can_frame *)skb_put(skb, sizeof(struct can_frame));
	*cf = (struct can_frame *)skb_put(skb, sizeof(struct can_frame));
	memset(*cf, 0, sizeof(struct can_frame));
	memset(*cf, 0, sizeof(struct can_frame));
@@ -607,7 +604,6 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev,
	if (unlikely(!skb))
	if (unlikely(!skb))
		return NULL;
		return NULL;


	__net_timestamp(skb);
	skb->protocol = htons(ETH_P_CANFD);
	skb->protocol = htons(ETH_P_CANFD);
	skb->pkt_type = PACKET_BROADCAST;
	skb->pkt_type = PACKET_BROADCAST;
	skb->ip_summed = CHECKSUM_UNNECESSARY;
	skb->ip_summed = CHECKSUM_UNNECESSARY;
@@ -618,6 +614,7 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev,


	can_skb_reserve(skb);
	can_skb_reserve(skb);
	can_skb_prv(skb)->ifindex = dev->ifindex;
	can_skb_prv(skb)->ifindex = dev->ifindex;
	can_skb_prv(skb)->skbcnt = 0;


	*cfd = (struct canfd_frame *)skb_put(skb, sizeof(struct canfd_frame));
	*cfd = (struct canfd_frame *)skb_put(skb, sizeof(struct canfd_frame));
	memset(*cfd, 0, sizeof(struct canfd_frame));
	memset(*cfd, 0, sizeof(struct canfd_frame));
+10 −6
Original line number Original line Diff line number Diff line
@@ -508,7 +508,8 @@ static int rcar_can_open(struct net_device *ndev)


	err = clk_prepare_enable(priv->clk);
	err = clk_prepare_enable(priv->clk);
	if (err) {
	if (err) {
		netdev_err(ndev, "failed to enable periperal clock, error %d\n",
		netdev_err(ndev,
			   "failed to enable peripheral clock, error %d\n",
			   err);
			   err);
		goto out;
		goto out;
	}
	}
@@ -526,7 +527,8 @@ static int rcar_can_open(struct net_device *ndev)
	napi_enable(&priv->napi);
	napi_enable(&priv->napi);
	err = request_irq(ndev->irq, rcar_can_interrupt, 0, ndev->name, ndev);
	err = request_irq(ndev->irq, rcar_can_interrupt, 0, ndev->name, ndev);
	if (err) {
	if (err) {
		netdev_err(ndev, "error requesting interrupt %x\n", ndev->irq);
		netdev_err(ndev, "request_irq(%d) failed, error %d\n",
			   ndev->irq, err);
		goto out_close;
		goto out_close;
	}
	}
	can_led_event(ndev, CAN_LED_EVENT_OPEN);
	can_led_event(ndev, CAN_LED_EVENT_OPEN);
@@ -758,8 +760,9 @@ static int rcar_can_probe(struct platform_device *pdev)
	}
	}


	irq = platform_get_irq(pdev, 0);
	irq = platform_get_irq(pdev, 0);
	if (!irq) {
	if (irq < 0) {
		dev_err(&pdev->dev, "No IRQ resource\n");
		dev_err(&pdev->dev, "No IRQ resource\n");
		err = irq;
		goto fail;
		goto fail;
	}
	}


@@ -782,7 +785,8 @@ static int rcar_can_probe(struct platform_device *pdev)
	priv->clk = devm_clk_get(&pdev->dev, "clkp1");
	priv->clk = devm_clk_get(&pdev->dev, "clkp1");
	if (IS_ERR(priv->clk)) {
	if (IS_ERR(priv->clk)) {
		err = PTR_ERR(priv->clk);
		err = PTR_ERR(priv->clk);
		dev_err(&pdev->dev, "cannot get peripheral clock: %d\n", err);
		dev_err(&pdev->dev, "cannot get peripheral clock, error %d\n",
			err);
		goto fail_clk;
		goto fail_clk;
	}
	}


@@ -794,7 +798,7 @@ static int rcar_can_probe(struct platform_device *pdev)
	priv->can_clk = devm_clk_get(&pdev->dev, clock_names[clock_select]);
	priv->can_clk = devm_clk_get(&pdev->dev, clock_names[clock_select]);
	if (IS_ERR(priv->can_clk)) {
	if (IS_ERR(priv->can_clk)) {
		err = PTR_ERR(priv->can_clk);
		err = PTR_ERR(priv->can_clk);
		dev_err(&pdev->dev, "cannot get CAN clock: %d\n", err);
		dev_err(&pdev->dev, "cannot get CAN clock, error %d\n", err);
		goto fail_clk;
		goto fail_clk;
	}
	}


@@ -823,7 +827,7 @@ static int rcar_can_probe(struct platform_device *pdev)


	devm_can_led_init(ndev);
	devm_can_led_init(ndev);


	dev_info(&pdev->dev, "device registered (reg_base=%p, irq=%u)\n",
	dev_info(&pdev->dev, "device registered (regs @ %p, IRQ%d)\n",
		 priv->regs, ndev->irq);
		 priv->regs, ndev->irq);


	return 0;
	return 0;
Loading