Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Just minor overlapping changes in the conflicts here. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -1249,6 +1249,8 @@ int register_candev(struct net_device *dev)
|
||||
return -EINVAL;
|
||||
|
||||
dev->rtnl_link_ops = &can_link_ops;
|
||||
netif_carrier_off(dev);
|
||||
|
||||
return register_netdev(dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(register_candev);
|
||||
|
@@ -404,9 +404,10 @@ static void flexcan_enable_wakeup_irq(struct flexcan_priv *priv, bool enable)
|
||||
priv->write(reg_mcr, ®s->mcr);
|
||||
}
|
||||
|
||||
static inline void flexcan_enter_stop_mode(struct flexcan_priv *priv)
|
||||
static inline int flexcan_enter_stop_mode(struct flexcan_priv *priv)
|
||||
{
|
||||
struct flexcan_regs __iomem *regs = priv->regs;
|
||||
unsigned int ackval;
|
||||
u32 reg_mcr;
|
||||
|
||||
reg_mcr = priv->read(®s->mcr);
|
||||
@@ -416,20 +417,37 @@ static inline void flexcan_enter_stop_mode(struct flexcan_priv *priv)
|
||||
/* enable stop request */
|
||||
regmap_update_bits(priv->stm.gpr, priv->stm.req_gpr,
|
||||
1 << priv->stm.req_bit, 1 << priv->stm.req_bit);
|
||||
|
||||
/* get stop acknowledgment */
|
||||
if (regmap_read_poll_timeout(priv->stm.gpr, priv->stm.ack_gpr,
|
||||
ackval, ackval & (1 << priv->stm.ack_bit),
|
||||
0, FLEXCAN_TIMEOUT_US))
|
||||
return -ETIMEDOUT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void flexcan_exit_stop_mode(struct flexcan_priv *priv)
|
||||
static inline int flexcan_exit_stop_mode(struct flexcan_priv *priv)
|
||||
{
|
||||
struct flexcan_regs __iomem *regs = priv->regs;
|
||||
unsigned int ackval;
|
||||
u32 reg_mcr;
|
||||
|
||||
/* remove stop request */
|
||||
regmap_update_bits(priv->stm.gpr, priv->stm.req_gpr,
|
||||
1 << priv->stm.req_bit, 0);
|
||||
|
||||
/* get stop acknowledgment */
|
||||
if (regmap_read_poll_timeout(priv->stm.gpr, priv->stm.ack_gpr,
|
||||
ackval, !(ackval & (1 << priv->stm.ack_bit)),
|
||||
0, FLEXCAN_TIMEOUT_US))
|
||||
return -ETIMEDOUT;
|
||||
|
||||
reg_mcr = priv->read(®s->mcr);
|
||||
reg_mcr &= ~FLEXCAN_MCR_SLF_WAK;
|
||||
priv->write(reg_mcr, ®s->mcr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void flexcan_error_irq_enable(const struct flexcan_priv *priv)
|
||||
@@ -1455,10 +1473,10 @@ static int flexcan_setup_stop_mode(struct platform_device *pdev)
|
||||
|
||||
priv = netdev_priv(dev);
|
||||
priv->stm.gpr = syscon_node_to_regmap(gpr_np);
|
||||
of_node_put(gpr_np);
|
||||
if (IS_ERR(priv->stm.gpr)) {
|
||||
dev_dbg(&pdev->dev, "could not find gpr regmap\n");
|
||||
return PTR_ERR(priv->stm.gpr);
|
||||
ret = PTR_ERR(priv->stm.gpr);
|
||||
goto out_put_node;
|
||||
}
|
||||
|
||||
priv->stm.req_gpr = out_val[1];
|
||||
@@ -1477,6 +1495,10 @@ static int flexcan_setup_stop_mode(struct platform_device *pdev)
|
||||
device_set_wakeup_enable(&pdev->dev, true);
|
||||
|
||||
return 0;
|
||||
|
||||
out_put_node:
|
||||
of_node_put(gpr_np);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct of_device_id flexcan_of_match[] = {
|
||||
@@ -1644,7 +1666,9 @@ static int __maybe_unused flexcan_suspend(struct device *device)
|
||||
*/
|
||||
if (device_may_wakeup(device)) {
|
||||
enable_irq_wake(dev->irq);
|
||||
flexcan_enter_stop_mode(priv);
|
||||
err = flexcan_enter_stop_mode(priv);
|
||||
if (err)
|
||||
return err;
|
||||
} else {
|
||||
err = flexcan_chip_disable(priv);
|
||||
if (err)
|
||||
@@ -1717,10 +1741,13 @@ static int __maybe_unused flexcan_noirq_resume(struct device *device)
|
||||
{
|
||||
struct net_device *dev = dev_get_drvdata(device);
|
||||
struct flexcan_priv *priv = netdev_priv(dev);
|
||||
int err;
|
||||
|
||||
if (netif_running(dev) && device_may_wakeup(device)) {
|
||||
flexcan_enable_wakeup_irq(priv, false);
|
||||
flexcan_exit_stop_mode(priv);
|
||||
err = flexcan_exit_stop_mode(priv);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@@ -1508,10 +1508,11 @@ static int rcar_canfd_rx_poll(struct napi_struct *napi, int quota)
|
||||
|
||||
/* All packets processed */
|
||||
if (num_pkts < quota) {
|
||||
napi_complete_done(napi, num_pkts);
|
||||
/* Enable Rx FIFO interrupts */
|
||||
rcar_canfd_set_bit(priv->base, RCANFD_RFCC(ridx),
|
||||
RCANFD_RFCC_RFIE);
|
||||
if (napi_complete_done(napi, num_pkts)) {
|
||||
/* Enable Rx FIFO interrupts */
|
||||
rcar_canfd_set_bit(priv->base, RCANFD_RFCC(ridx),
|
||||
RCANFD_RFCC_RFIE);
|
||||
}
|
||||
}
|
||||
return num_pkts;
|
||||
}
|
||||
|
@@ -479,7 +479,7 @@ static void pcan_free_channels(struct pcan_pccard *card)
|
||||
if (!netdev)
|
||||
continue;
|
||||
|
||||
strncpy(name, netdev->name, IFNAMSIZ);
|
||||
strlcpy(name, netdev->name, IFNAMSIZ);
|
||||
|
||||
unregister_sja1000dev(netdev);
|
||||
|
||||
|
@@ -664,17 +664,6 @@ static int mcp251x_power_enable(struct regulator *reg, int enable)
|
||||
return regulator_disable(reg);
|
||||
}
|
||||
|
||||
static void mcp251x_open_clean(struct net_device *net)
|
||||
{
|
||||
struct mcp251x_priv *priv = netdev_priv(net);
|
||||
struct spi_device *spi = priv->spi;
|
||||
|
||||
free_irq(spi->irq, priv);
|
||||
mcp251x_hw_sleep(spi);
|
||||
mcp251x_power_enable(priv->transceiver, 0);
|
||||
close_candev(net);
|
||||
}
|
||||
|
||||
static int mcp251x_stop(struct net_device *net)
|
||||
{
|
||||
struct mcp251x_priv *priv = netdev_priv(net);
|
||||
@@ -941,37 +930,43 @@ static int mcp251x_open(struct net_device *net)
|
||||
flags | IRQF_ONESHOT, DEVICE_NAME, priv);
|
||||
if (ret) {
|
||||
dev_err(&spi->dev, "failed to acquire irq %d\n", spi->irq);
|
||||
mcp251x_power_enable(priv->transceiver, 0);
|
||||
close_candev(net);
|
||||
goto open_unlock;
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
priv->wq = alloc_workqueue("mcp251x_wq", WQ_FREEZABLE | WQ_MEM_RECLAIM,
|
||||
0);
|
||||
if (!priv->wq) {
|
||||
ret = -ENOMEM;
|
||||
goto out_clean;
|
||||
}
|
||||
INIT_WORK(&priv->tx_work, mcp251x_tx_work_handler);
|
||||
INIT_WORK(&priv->restart_work, mcp251x_restart_work_handler);
|
||||
|
||||
ret = mcp251x_hw_reset(spi);
|
||||
if (ret) {
|
||||
mcp251x_open_clean(net);
|
||||
goto open_unlock;
|
||||
}
|
||||
if (ret)
|
||||
goto out_free_wq;
|
||||
ret = mcp251x_setup(net, spi);
|
||||
if (ret) {
|
||||
mcp251x_open_clean(net);
|
||||
goto open_unlock;
|
||||
}
|
||||
if (ret)
|
||||
goto out_free_wq;
|
||||
ret = mcp251x_set_normal_mode(spi);
|
||||
if (ret) {
|
||||
mcp251x_open_clean(net);
|
||||
goto open_unlock;
|
||||
}
|
||||
if (ret)
|
||||
goto out_free_wq;
|
||||
|
||||
can_led_event(net, CAN_LED_EVENT_OPEN);
|
||||
|
||||
netif_wake_queue(net);
|
||||
mutex_unlock(&priv->mcp_lock);
|
||||
|
||||
open_unlock:
|
||||
return 0;
|
||||
|
||||
out_free_wq:
|
||||
destroy_workqueue(priv->wq);
|
||||
out_clean:
|
||||
free_irq(spi->irq, priv);
|
||||
mcp251x_hw_sleep(spi);
|
||||
out_close:
|
||||
mcp251x_power_enable(priv->transceiver, 0);
|
||||
close_candev(net);
|
||||
mutex_unlock(&priv->mcp_lock);
|
||||
return ret;
|
||||
}
|
||||
|
@@ -568,16 +568,16 @@ static int peak_usb_ndo_stop(struct net_device *netdev)
|
||||
dev->state &= ~PCAN_USB_STATE_STARTED;
|
||||
netif_stop_queue(netdev);
|
||||
|
||||
close_candev(netdev);
|
||||
|
||||
dev->can.state = CAN_STATE_STOPPED;
|
||||
|
||||
/* unlink all pending urbs and free used memory */
|
||||
peak_usb_unlink_all_urbs(dev);
|
||||
|
||||
if (dev->adapter->dev_stop)
|
||||
dev->adapter->dev_stop(dev);
|
||||
|
||||
close_candev(netdev);
|
||||
|
||||
dev->can.state = CAN_STATE_STOPPED;
|
||||
|
||||
/* can set bus off now */
|
||||
if (dev->adapter->dev_set_bus) {
|
||||
int err = dev->adapter->dev_set_bus(dev, 0);
|
||||
@@ -855,7 +855,7 @@ static void peak_usb_disconnect(struct usb_interface *intf)
|
||||
|
||||
dev_prev_siblings = dev->prev_siblings;
|
||||
dev->state &= ~PCAN_USB_STATE_CONNECTED;
|
||||
strncpy(name, netdev->name, IFNAMSIZ);
|
||||
strlcpy(name, netdev->name, IFNAMSIZ);
|
||||
|
||||
unregister_netdev(netdev);
|
||||
|
||||
|
@@ -841,7 +841,7 @@ static int pcan_usb_fd_init(struct peak_usb_device *dev)
|
||||
goto err_out;
|
||||
|
||||
/* allocate command buffer once for all for the interface */
|
||||
pdev->cmd_buffer_addr = kmalloc(PCAN_UFD_CMD_BUFFER_SIZE,
|
||||
pdev->cmd_buffer_addr = kzalloc(PCAN_UFD_CMD_BUFFER_SIZE,
|
||||
GFP_KERNEL);
|
||||
if (!pdev->cmd_buffer_addr)
|
||||
goto err_out_1;
|
||||
|
@@ -494,7 +494,7 @@ static int pcan_usb_pro_drv_loaded(struct peak_usb_device *dev, int loaded)
|
||||
u8 *buffer;
|
||||
int err;
|
||||
|
||||
buffer = kmalloc(PCAN_USBPRO_FCT_DRVLD_REQ_LEN, GFP_KERNEL);
|
||||
buffer = kzalloc(PCAN_USBPRO_FCT_DRVLD_REQ_LEN, GFP_KERNEL);
|
||||
if (!buffer)
|
||||
return -ENOMEM;
|
||||
|
||||
|
Reference in New Issue
Block a user