mirror of
https://github.com/t2linux/kernel.git
synced 2026-04-30 13:48:59 -07:00
Merge tag 'net-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Jakub Kicinski:
"Networking fixes for 5.10-rc5, including fixes from the WiFi
(mac80211), can and bpf (including the strncpy_from_user fix).
Current release - regressions:
- mac80211: fix memory leak of filtered powersave frames
- mac80211: free sta in sta_info_insert_finish() on errors to avoid
sleeping in atomic context
- netlabel: fix an uninitialized variable warning added in -rc4
Previous release - regressions:
- vsock: forward all packets to the host when no H2G is registered,
un-breaking AWS Nitro Enclaves
- net: Exempt multicast addresses from five-second neighbor lifetime
requirement, decreasing the chances neighbor tables fill up
- net/tls: fix corrupted data in recvmsg
- qed: fix ILT configuration of SRC block
- can: m_can: process interrupt only when not runtime suspended
Previous release - always broken:
- page_frag: Recover from memory pressure by not recycling pages
allocating from the reserves
- strncpy_from_user: Mask out bytes after NUL terminator
- ip_tunnels: Set tunnel option flag only when tunnel metadata is
present, always setting it confuses Open vSwitch
- bpf, sockmap:
- Fix partial copy_page_to_iter so progress can still be made
- Fix socket memory accounting and obeying SO_RCVBUF
- net: Have netpoll bring-up DSA management interface
- net: bridge: add missing counters to ndo_get_stats64 callback
- tcp: brr: only postpone PROBE_RTT if RTT is < current min_rtt
- enetc: Workaround MDIO register access HW bug
- net/ncsi: move netlink family registration to a subsystem init,
instead of tying it to driver probe
- net: ftgmac100: unregister NC-SI when removing driver to avoid
crash
- lan743x:
- prevent interrupt storm on open
- fix freeing skbs in the wrong context
- net/mlx5e: Fix socket refcount leak on kTLS RX resync
- net: dsa: mv88e6xxx: Avoid VLAN database corruption on 6097
- fix 21 unset return codes and other mistakes on error paths, mostly
detected by the Hulk Robot"
* tag 'net-5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (115 commits)
fail_function: Remove a redundant mutex unlock
selftest/bpf: Test bpf_probe_read_user_str() strips trailing bytes after NUL
lib/strncpy_from_user.c: Mask out bytes after NUL terminator.
net/smc: fix direct access to ib_gid_addr->ndev in smc_ib_determine_gid()
net/smc: fix matching of existing link groups
ipv6: Remove dependency of ipv6_frag_thdr_truncated on ipv6 module
libbpf: Fix VERSIONED_SYM_COUNT number parsing
net/mlx4_core: Fix init_hca fields offset
atm: nicstar: Unmap DMA on send error
page_frag: Recover from memory pressure
net: dsa: mv88e6xxx: Wait for EEPROM done after HW reset
mlxsw: core: Use variable timeout for EMAD retries
mlxsw: Fix firmware flashing
net: Have netpoll bring-up DSA management interface
atl1e: fix error return code in atl1e_probe()
atl1c: fix error return code in atl1c_probe()
ah6: fix error return code in ah6_input()
net: usb: qmi_wwan: Set DTR quirk for MR400
can: m_can: process interrupt only when not runtime suspended
can: flexcan: flexcan_chip_start(): fix erroneous flexcan_transceiver_enable() during bus-off recovery
...
This commit is contained in:
+13
-14
@@ -3233,10 +3233,10 @@ F: drivers/iio/accel/bma400*
|
||||
BPF (Safe dynamic programs and tools)
|
||||
M: Alexei Starovoitov <ast@kernel.org>
|
||||
M: Daniel Borkmann <daniel@iogearbox.net>
|
||||
M: Andrii Nakryiko <andrii@kernel.org>
|
||||
R: Martin KaFai Lau <kafai@fb.com>
|
||||
R: Song Liu <songliubraving@fb.com>
|
||||
R: Yonghong Song <yhs@fb.com>
|
||||
R: Andrii Nakryiko <andrii@kernel.org>
|
||||
R: John Fastabend <john.fastabend@gmail.com>
|
||||
R: KP Singh <kpsingh@chromium.org>
|
||||
L: netdev@vger.kernel.org
|
||||
@@ -4700,7 +4700,7 @@ T: git git://linuxtv.org/anttip/media_tree.git
|
||||
F: drivers/media/dvb-frontends/cxd2820r*
|
||||
|
||||
CXGB3 ETHERNET DRIVER (CXGB3)
|
||||
M: Vishal Kulkarni <vishal@chelsio.com>
|
||||
M: Raju Rangoju <rajur@chelsio.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://www.chelsio.com
|
||||
@@ -4732,7 +4732,7 @@ W: http://www.chelsio.com
|
||||
F: drivers/net/ethernet/chelsio/inline_crypto/
|
||||
|
||||
CXGB4 ETHERNET DRIVER (CXGB4)
|
||||
M: Vishal Kulkarni <vishal@chelsio.com>
|
||||
M: Raju Rangoju <rajur@chelsio.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://www.chelsio.com
|
||||
@@ -4754,7 +4754,7 @@ F: drivers/infiniband/hw/cxgb4/
|
||||
F: include/uapi/rdma/cxgb4-abi.h
|
||||
|
||||
CXGB4VF ETHERNET DRIVER (CXGB4VF)
|
||||
M: Vishal Kulkarni <vishal@gmail.com>
|
||||
M: Raju Rangoju <rajur@chelsio.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://www.chelsio.com
|
||||
@@ -9833,13 +9833,6 @@ S: Maintained
|
||||
F: arch/mips/lantiq
|
||||
F: drivers/soc/lantiq
|
||||
|
||||
LAPB module
|
||||
L: linux-x25@vger.kernel.org
|
||||
S: Orphan
|
||||
F: Documentation/networking/lapb-module.rst
|
||||
F: include/*/lapb.h
|
||||
F: net/lapb/
|
||||
|
||||
LASI 53c700 driver for PARISC
|
||||
M: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
@@ -18991,12 +18984,18 @@ L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
N: axp[128]
|
||||
|
||||
X.25 NETWORK LAYER
|
||||
M: Andrew Hendry <andrew.hendry@gmail.com>
|
||||
X.25 STACK
|
||||
M: Martin Schiller <ms@dev.tdt.de>
|
||||
L: linux-x25@vger.kernel.org
|
||||
S: Odd Fixes
|
||||
S: Maintained
|
||||
F: Documentation/networking/lapb-module.rst
|
||||
F: Documentation/networking/x25*
|
||||
F: drivers/net/wan/hdlc_x25.c
|
||||
F: drivers/net/wan/lapbether.c
|
||||
F: include/*/lapb.h
|
||||
F: include/net/x25*
|
||||
F: include/uapi/linux/x25.h
|
||||
F: net/lapb/
|
||||
F: net/x25/
|
||||
|
||||
X86 ARCHITECTURE (32-BIT AND 64-BIT)
|
||||
|
||||
@@ -1706,6 +1706,8 @@ static int ns_send(struct atm_vcc *vcc, struct sk_buff *skb)
|
||||
|
||||
if (push_scqe(card, vc, scq, &scqe, skb) != 0) {
|
||||
atomic_inc(&vcc->stats->tx_err);
|
||||
dma_unmap_single(&card->pcidev->dev, NS_PRV_DMA(skb), skb->len,
|
||||
DMA_TO_DEVICE);
|
||||
dev_kfree_skb_any(skb);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -592,7 +592,7 @@ static void can_restart(struct net_device *dev)
|
||||
|
||||
cf->can_id |= CAN_ERR_RESTARTED;
|
||||
|
||||
netif_rx(skb);
|
||||
netif_rx_ni(skb);
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->can_dlc;
|
||||
|
||||
+16
-12
@@ -728,8 +728,10 @@ static int flexcan_get_berr_counter(const struct net_device *dev,
|
||||
int err;
|
||||
|
||||
err = pm_runtime_get_sync(priv->dev);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
pm_runtime_put_noidle(priv->dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = __flexcan_get_berr_counter(dev, bec);
|
||||
|
||||
@@ -1565,14 +1567,10 @@ static int flexcan_chip_start(struct net_device *dev)
|
||||
priv->write(reg_ctrl2, ®s->ctrl2);
|
||||
}
|
||||
|
||||
err = flexcan_transceiver_enable(priv);
|
||||
if (err)
|
||||
goto out_chip_disable;
|
||||
|
||||
/* synchronize with the can bus */
|
||||
err = flexcan_chip_unfreeze(priv);
|
||||
if (err)
|
||||
goto out_transceiver_disable;
|
||||
goto out_chip_disable;
|
||||
|
||||
priv->can.state = CAN_STATE_ERROR_ACTIVE;
|
||||
|
||||
@@ -1590,8 +1588,6 @@ static int flexcan_chip_start(struct net_device *dev)
|
||||
|
||||
return 0;
|
||||
|
||||
out_transceiver_disable:
|
||||
flexcan_transceiver_disable(priv);
|
||||
out_chip_disable:
|
||||
flexcan_chip_disable(priv);
|
||||
return err;
|
||||
@@ -1621,7 +1617,6 @@ static int __flexcan_chip_stop(struct net_device *dev, bool disable_on_error)
|
||||
priv->write(priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_ALL,
|
||||
®s->ctrl);
|
||||
|
||||
flexcan_transceiver_disable(priv);
|
||||
priv->can.state = CAN_STATE_STOPPED;
|
||||
|
||||
return 0;
|
||||
@@ -1654,17 +1649,23 @@ static int flexcan_open(struct net_device *dev)
|
||||
}
|
||||
|
||||
err = pm_runtime_get_sync(priv->dev);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
pm_runtime_put_noidle(priv->dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = open_candev(dev);
|
||||
if (err)
|
||||
goto out_runtime_put;
|
||||
|
||||
err = request_irq(dev->irq, flexcan_irq, IRQF_SHARED, dev->name, dev);
|
||||
err = flexcan_transceiver_enable(priv);
|
||||
if (err)
|
||||
goto out_close;
|
||||
|
||||
err = request_irq(dev->irq, flexcan_irq, IRQF_SHARED, dev->name, dev);
|
||||
if (err)
|
||||
goto out_transceiver_disable;
|
||||
|
||||
if (priv->can.ctrlmode & CAN_CTRLMODE_FD)
|
||||
priv->mb_size = sizeof(struct flexcan_mb) + CANFD_MAX_DLEN;
|
||||
else
|
||||
@@ -1716,6 +1717,8 @@ static int flexcan_open(struct net_device *dev)
|
||||
can_rx_offload_del(&priv->offload);
|
||||
out_free_irq:
|
||||
free_irq(dev->irq, dev);
|
||||
out_transceiver_disable:
|
||||
flexcan_transceiver_disable(priv);
|
||||
out_close:
|
||||
close_candev(dev);
|
||||
out_runtime_put:
|
||||
@@ -1734,6 +1737,7 @@ static int flexcan_close(struct net_device *dev)
|
||||
|
||||
can_rx_offload_del(&priv->offload);
|
||||
free_irq(dev->irq, dev);
|
||||
flexcan_transceiver_disable(priv);
|
||||
|
||||
close_candev(dev);
|
||||
pm_runtime_put(priv->dev);
|
||||
@@ -1852,7 +1856,7 @@ static int flexcan_setup_stop_mode(struct platform_device *pdev)
|
||||
return -EINVAL;
|
||||
|
||||
/* stop mode property format is:
|
||||
* <&gpr req_gpr>.
|
||||
* <&gpr req_gpr req_bit>.
|
||||
*/
|
||||
ret = of_property_read_u32_array(np, "fsl,stop-mode", out_val,
|
||||
ARRAY_SIZE(out_val));
|
||||
|
||||
@@ -287,12 +287,12 @@ struct kvaser_pciefd_tx_packet {
|
||||
static const struct can_bittiming_const kvaser_pciefd_bittiming_const = {
|
||||
.name = KVASER_PCIEFD_DRV_NAME,
|
||||
.tseg1_min = 1,
|
||||
.tseg1_max = 255,
|
||||
.tseg1_max = 512,
|
||||
.tseg2_min = 1,
|
||||
.tseg2_max = 32,
|
||||
.sjw_max = 16,
|
||||
.brp_min = 1,
|
||||
.brp_max = 4096,
|
||||
.brp_max = 8192,
|
||||
.brp_inc = 1,
|
||||
};
|
||||
|
||||
|
||||
@@ -16,7 +16,8 @@ config CAN_M_CAN_PLATFORM
|
||||
|
||||
config CAN_M_CAN_TCAN4X5X
|
||||
depends on CAN_M_CAN
|
||||
depends on REGMAP_SPI
|
||||
depends on SPI
|
||||
select REGMAP_SPI
|
||||
tristate "TCAN4X5X M_CAN device"
|
||||
help
|
||||
Say Y here if you want support for Texas Instruments TCAN4x5x
|
||||
|
||||
@@ -665,7 +665,7 @@ static int m_can_handle_state_change(struct net_device *dev,
|
||||
unsigned int ecr;
|
||||
|
||||
switch (new_state) {
|
||||
case CAN_STATE_ERROR_ACTIVE:
|
||||
case CAN_STATE_ERROR_WARNING:
|
||||
/* error warning state */
|
||||
cdev->can.can_stats.error_warning++;
|
||||
cdev->can.state = CAN_STATE_ERROR_WARNING;
|
||||
@@ -694,7 +694,7 @@ static int m_can_handle_state_change(struct net_device *dev,
|
||||
__m_can_get_berr_counter(dev, &bec);
|
||||
|
||||
switch (new_state) {
|
||||
case CAN_STATE_ERROR_ACTIVE:
|
||||
case CAN_STATE_ERROR_WARNING:
|
||||
/* error warning state */
|
||||
cf->can_id |= CAN_ERR_CRTL;
|
||||
cf->data[1] = (bec.txerr > bec.rxerr) ?
|
||||
@@ -956,6 +956,8 @@ static irqreturn_t m_can_isr(int irq, void *dev_id)
|
||||
struct net_device_stats *stats = &dev->stats;
|
||||
u32 ir;
|
||||
|
||||
if (pm_runtime_suspended(cdev->dev))
|
||||
return IRQ_NONE;
|
||||
ir = m_can_read(cdev, M_CAN_IR);
|
||||
if (!ir)
|
||||
return IRQ_NONE;
|
||||
@@ -1414,6 +1416,9 @@ static void m_can_stop(struct net_device *dev)
|
||||
/* disable all interrupts */
|
||||
m_can_disable_all_interrupts(cdev);
|
||||
|
||||
/* Set init mode to disengage from the network */
|
||||
m_can_config_endisable(cdev, true);
|
||||
|
||||
/* set the state as STOPPED */
|
||||
cdev->can.state = CAN_STATE_STOPPED;
|
||||
}
|
||||
@@ -1812,6 +1817,12 @@ out:
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(m_can_class_allocate_dev);
|
||||
|
||||
void m_can_class_free_dev(struct net_device *net)
|
||||
{
|
||||
free_candev(net);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(m_can_class_free_dev);
|
||||
|
||||
int m_can_class_register(struct m_can_classdev *m_can_dev)
|
||||
{
|
||||
int ret;
|
||||
@@ -1850,7 +1861,6 @@ pm_runtime_fail:
|
||||
if (ret) {
|
||||
if (m_can_dev->pm_clock_support)
|
||||
pm_runtime_disable(m_can_dev->dev);
|
||||
free_candev(m_can_dev->net);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -1908,8 +1918,6 @@ void m_can_class_unregister(struct m_can_classdev *m_can_dev)
|
||||
unregister_candev(m_can_dev->net);
|
||||
|
||||
m_can_clk_stop(m_can_dev);
|
||||
|
||||
free_candev(m_can_dev->net);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(m_can_class_unregister);
|
||||
|
||||
|
||||
@@ -99,6 +99,7 @@ struct m_can_classdev {
|
||||
};
|
||||
|
||||
struct m_can_classdev *m_can_class_allocate_dev(struct device *dev);
|
||||
void m_can_class_free_dev(struct net_device *net);
|
||||
int m_can_class_register(struct m_can_classdev *cdev);
|
||||
void m_can_class_unregister(struct m_can_classdev *cdev);
|
||||
int m_can_class_get_clocks(struct m_can_classdev *cdev);
|
||||
|
||||
@@ -67,32 +67,36 @@ static int m_can_plat_probe(struct platform_device *pdev)
|
||||
return -ENOMEM;
|
||||
|
||||
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
if (!priv) {
|
||||
ret = -ENOMEM;
|
||||
goto probe_fail;
|
||||
}
|
||||
|
||||
mcan_class->device_data = priv;
|
||||
|
||||
m_can_class_get_clocks(mcan_class);
|
||||
ret = m_can_class_get_clocks(mcan_class);
|
||||
if (ret)
|
||||
goto probe_fail;
|
||||
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "m_can");
|
||||
addr = devm_ioremap_resource(&pdev->dev, res);
|
||||
irq = platform_get_irq_byname(pdev, "int0");
|
||||
if (IS_ERR(addr) || irq < 0) {
|
||||
ret = -EINVAL;
|
||||
goto failed_ret;
|
||||
goto probe_fail;
|
||||
}
|
||||
|
||||
/* message ram could be shared */
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "message_ram");
|
||||
if (!res) {
|
||||
ret = -ENODEV;
|
||||
goto failed_ret;
|
||||
goto probe_fail;
|
||||
}
|
||||
|
||||
mram_addr = devm_ioremap(&pdev->dev, res->start, resource_size(res));
|
||||
if (!mram_addr) {
|
||||
ret = -ENOMEM;
|
||||
goto failed_ret;
|
||||
goto probe_fail;
|
||||
}
|
||||
|
||||
priv->base = addr;
|
||||
@@ -111,9 +115,10 @@ static int m_can_plat_probe(struct platform_device *pdev)
|
||||
|
||||
m_can_init_ram(mcan_class);
|
||||
|
||||
ret = m_can_class_register(mcan_class);
|
||||
return m_can_class_register(mcan_class);
|
||||
|
||||
failed_ret:
|
||||
probe_fail:
|
||||
m_can_class_free_dev(mcan_class->net);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -134,6 +139,8 @@ static int m_can_plat_remove(struct platform_device *pdev)
|
||||
|
||||
m_can_class_unregister(mcan_class);
|
||||
|
||||
m_can_class_free_dev(mcan_class->net);
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -440,14 +440,18 @@ static int tcan4x5x_can_probe(struct spi_device *spi)
|
||||
return -ENOMEM;
|
||||
|
||||
priv = devm_kzalloc(&spi->dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
if (!priv) {
|
||||
ret = -ENOMEM;
|
||||
goto out_m_can_class_free_dev;
|
||||
}
|
||||
|
||||
priv->power = devm_regulator_get_optional(&spi->dev, "vsup");
|
||||
if (PTR_ERR(priv->power) == -EPROBE_DEFER)
|
||||
return -EPROBE_DEFER;
|
||||
else
|
||||
if (PTR_ERR(priv->power) == -EPROBE_DEFER) {
|
||||
ret = -EPROBE_DEFER;
|
||||
goto out_m_can_class_free_dev;
|
||||
} else {
|
||||
priv->power = NULL;
|
||||
}
|
||||
|
||||
mcan_class->device_data = priv;
|
||||
|
||||
@@ -460,8 +464,10 @@ static int tcan4x5x_can_probe(struct spi_device *spi)
|
||||
}
|
||||
|
||||
/* Sanity check */
|
||||
if (freq < 20000000 || freq > TCAN4X5X_EXT_CLK_DEF)
|
||||
return -ERANGE;
|
||||
if (freq < 20000000 || freq > TCAN4X5X_EXT_CLK_DEF) {
|
||||
ret = -ERANGE;
|
||||
goto out_m_can_class_free_dev;
|
||||
}
|
||||
|
||||
priv->reg_offset = TCAN4X5X_MCAN_OFFSET;
|
||||
priv->mram_start = TCAN4X5X_MRAM_START;
|
||||
@@ -487,6 +493,10 @@ static int tcan4x5x_can_probe(struct spi_device *spi)
|
||||
|
||||
priv->regmap = devm_regmap_init(&spi->dev, &tcan4x5x_bus,
|
||||
&spi->dev, &tcan4x5x_regmap);
|
||||
if (IS_ERR(priv->regmap)) {
|
||||
ret = PTR_ERR(priv->regmap);
|
||||
goto out_clk;
|
||||
}
|
||||
|
||||
ret = tcan4x5x_power_enable(priv->power, 1);
|
||||
if (ret)
|
||||
@@ -514,8 +524,10 @@ out_clk:
|
||||
clk_disable_unprepare(mcan_class->cclk);
|
||||
clk_disable_unprepare(mcan_class->hclk);
|
||||
}
|
||||
|
||||
out_m_can_class_free_dev:
|
||||
m_can_class_free_dev(mcan_class->net);
|
||||
dev_err(&spi->dev, "Probe failed, err=%d\n", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -523,9 +535,11 @@ static int tcan4x5x_can_remove(struct spi_device *spi)
|
||||
{
|
||||
struct tcan4x5x_priv *priv = spi_get_drvdata(spi);
|
||||
|
||||
m_can_class_unregister(priv->mcan_dev);
|
||||
|
||||
tcan4x5x_power_enable(priv->power, 0);
|
||||
|
||||
m_can_class_unregister(priv->mcan_dev);
|
||||
m_can_class_free_dev(priv->mcan_dev->net);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -881,7 +881,8 @@ static int ti_hecc_probe(struct platform_device *pdev)
|
||||
priv->base = devm_platform_ioremap_resource_byname(pdev, "hecc");
|
||||
if (IS_ERR(priv->base)) {
|
||||
dev_err(&pdev->dev, "hecc ioremap failed\n");
|
||||
return PTR_ERR(priv->base);
|
||||
err = PTR_ERR(priv->base);
|
||||
goto probe_exit_candev;
|
||||
}
|
||||
|
||||
/* handle hecc-ram memory */
|
||||
@@ -889,20 +890,22 @@ static int ti_hecc_probe(struct platform_device *pdev)
|
||||
"hecc-ram");
|
||||
if (IS_ERR(priv->hecc_ram)) {
|
||||
dev_err(&pdev->dev, "hecc-ram ioremap failed\n");
|
||||
return PTR_ERR(priv->hecc_ram);
|
||||
err = PTR_ERR(priv->hecc_ram);
|
||||
goto probe_exit_candev;
|
||||
}
|
||||
|
||||
/* handle mbx memory */
|
||||
priv->mbx = devm_platform_ioremap_resource_byname(pdev, "mbx");
|
||||
if (IS_ERR(priv->mbx)) {
|
||||
dev_err(&pdev->dev, "mbx ioremap failed\n");
|
||||
return PTR_ERR(priv->mbx);
|
||||
err = PTR_ERR(priv->mbx);
|
||||
goto probe_exit_candev;
|
||||
}
|
||||
|
||||
irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||
if (!irq) {
|
||||
dev_err(&pdev->dev, "No irq resource\n");
|
||||
goto probe_exit;
|
||||
goto probe_exit_candev;
|
||||
}
|
||||
|
||||
priv->ndev = ndev;
|
||||
@@ -966,7 +969,7 @@ probe_exit_release_clk:
|
||||
clk_put(priv->clk);
|
||||
probe_exit_candev:
|
||||
free_candev(ndev);
|
||||
probe_exit:
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -367,7 +367,7 @@ static const struct can_bittiming_const kvaser_usb_hydra_kcan_bittiming_c = {
|
||||
.tseg2_max = 32,
|
||||
.sjw_max = 16,
|
||||
.brp_min = 1,
|
||||
.brp_max = 4096,
|
||||
.brp_max = 8192,
|
||||
.brp_inc = 1,
|
||||
};
|
||||
|
||||
|
||||
@@ -326,8 +326,6 @@ static netdev_tx_t mcba_usb_start_xmit(struct sk_buff *skb,
|
||||
if (!ctx)
|
||||
return NETDEV_TX_BUSY;
|
||||
|
||||
can_put_echo_skb(skb, priv->netdev, ctx->ndx);
|
||||
|
||||
if (cf->can_id & CAN_EFF_FLAG) {
|
||||
/* SIDH | SIDL | EIDH | EIDL
|
||||
* 28 - 21 | 20 19 18 x x x 17 16 | 15 - 8 | 7 - 0
|
||||
@@ -357,6 +355,8 @@ static netdev_tx_t mcba_usb_start_xmit(struct sk_buff *skb,
|
||||
if (cf->can_id & CAN_RTR_FLAG)
|
||||
usb_msg.dlc |= MCBA_DLC_RTR_MASK;
|
||||
|
||||
can_put_echo_skb(skb, priv->netdev, ctx->ndx);
|
||||
|
||||
err = mcba_usb_xmit(priv, (struct mcba_usb_msg *)&usb_msg, ctx);
|
||||
if (err)
|
||||
goto xmit_failed;
|
||||
|
||||
@@ -156,7 +156,7 @@ void peak_usb_get_ts_time(struct peak_time_ref *time_ref, u32 ts, ktime_t *time)
|
||||
if (time_ref->ts_dev_1 < time_ref->ts_dev_2) {
|
||||
/* case when event time (tsw) wraps */
|
||||
if (ts < time_ref->ts_dev_1)
|
||||
delta_ts = 1 << time_ref->adapter->ts_used_bits;
|
||||
delta_ts = BIT_ULL(time_ref->adapter->ts_used_bits);
|
||||
|
||||
/* Otherwise, sync time counter (ts_dev_2) has wrapped:
|
||||
* handle case when event time (tsn) hasn't.
|
||||
@@ -168,7 +168,7 @@ void peak_usb_get_ts_time(struct peak_time_ref *time_ref, u32 ts, ktime_t *time)
|
||||
* tsn ts
|
||||
*/
|
||||
} else if (time_ref->ts_dev_1 < ts) {
|
||||
delta_ts = -(1 << time_ref->adapter->ts_used_bits);
|
||||
delta_ts = -BIT_ULL(time_ref->adapter->ts_used_bits);
|
||||
}
|
||||
|
||||
/* add delay between last sync and event timestamps */
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/if_bridge.h>
|
||||
@@ -1837,6 +1838,16 @@ static int gswip_gphy_fw_list(struct gswip_priv *priv,
|
||||
i++;
|
||||
}
|
||||
|
||||
/* The standalone PHY11G requires 300ms to be fully
|
||||
* initialized and ready for any MDIO communication after being
|
||||
* taken out of reset. For the SoC-internal GPHY variant there
|
||||
* is no (known) documentation for the minimum time after a
|
||||
* reset. Use the same value as for the standalone variant as
|
||||
* some users have reported internal PHYs not being detected
|
||||
* without any delay.
|
||||
*/
|
||||
msleep(300);
|
||||
|
||||
return 0;
|
||||
|
||||
remove_gphy:
|
||||
|
||||
@@ -2297,6 +2297,8 @@ static void mv88e6xxx_hardware_reset(struct mv88e6xxx_chip *chip)
|
||||
usleep_range(10000, 20000);
|
||||
gpiod_set_value_cansleep(gpiod, 0);
|
||||
usleep_range(10000, 20000);
|
||||
|
||||
mv88e6xxx_g1_wait_eeprom_done(chip);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -75,6 +75,37 @@ static int mv88e6xxx_g1_wait_init_ready(struct mv88e6xxx_chip *chip)
|
||||
return mv88e6xxx_g1_wait_bit(chip, MV88E6XXX_G1_STS, bit, 1);
|
||||
}
|
||||
|
||||
void mv88e6xxx_g1_wait_eeprom_done(struct mv88e6xxx_chip *chip)
|
||||
{
|
||||
const unsigned long timeout = jiffies + 1 * HZ;
|
||||
u16 val;
|
||||
int err;
|
||||
|
||||
/* Wait up to 1 second for the switch to finish reading the
|
||||
* EEPROM.
|
||||
*/
|
||||
while (time_before(jiffies, timeout)) {
|
||||
err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_STS, &val);
|
||||
if (err) {
|
||||
dev_err(chip->dev, "Error reading status");
|
||||
return;
|
||||
}
|
||||
|
||||
/* If the switch is still resetting, it may not
|
||||
* respond on the bus, and so MDIO read returns
|
||||
* 0xffff. Differentiate between that, and waiting for
|
||||
* the EEPROM to be done by bit 0 being set.
|
||||
*/
|
||||
if (val != 0xffff &&
|
||||
val & BIT(MV88E6XXX_G1_STS_IRQ_EEPROM_DONE))
|
||||
return;
|
||||
|
||||
usleep_range(1000, 2000);
|
||||
}
|
||||
|
||||
dev_err(chip->dev, "Timeout waiting for EEPROM done");
|
||||
}
|
||||
|
||||
/* Offset 0x01: Switch MAC Address Register Bytes 0 & 1
|
||||
* Offset 0x02: Switch MAC Address Register Bytes 2 & 3
|
||||
* Offset 0x03: Switch MAC Address Register Bytes 4 & 5
|
||||
|
||||
@@ -278,6 +278,7 @@ int mv88e6xxx_g1_set_switch_mac(struct mv88e6xxx_chip *chip, u8 *addr);
|
||||
int mv88e6185_g1_reset(struct mv88e6xxx_chip *chip);
|
||||
int mv88e6352_g1_reset(struct mv88e6xxx_chip *chip);
|
||||
int mv88e6250_g1_reset(struct mv88e6xxx_chip *chip);
|
||||
void mv88e6xxx_g1_wait_eeprom_done(struct mv88e6xxx_chip *chip);
|
||||
|
||||
int mv88e6185_g1_ppu_enable(struct mv88e6xxx_chip *chip);
|
||||
int mv88e6185_g1_ppu_disable(struct mv88e6xxx_chip *chip);
|
||||
|
||||
@@ -125,11 +125,9 @@ static int mv88e6xxx_g1_vtu_vid_write(struct mv88e6xxx_chip *chip,
|
||||
* Offset 0x08: VTU/STU Data Register 2
|
||||
* Offset 0x09: VTU/STU Data Register 3
|
||||
*/
|
||||
|
||||
static int mv88e6185_g1_vtu_data_read(struct mv88e6xxx_chip *chip,
|
||||
struct mv88e6xxx_vtu_entry *entry)
|
||||
static int mv88e6185_g1_vtu_stu_data_read(struct mv88e6xxx_chip *chip,
|
||||
u16 *regs)
|
||||
{
|
||||
u16 regs[3];
|
||||
int i;
|
||||
|
||||
/* Read all 3 VTU/STU Data registers */
|
||||
@@ -142,12 +140,45 @@ static int mv88e6185_g1_vtu_data_read(struct mv88e6xxx_chip *chip,
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Extract MemberTag and PortState data */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mv88e6185_g1_vtu_data_read(struct mv88e6xxx_chip *chip,
|
||||
struct mv88e6xxx_vtu_entry *entry)
|
||||
{
|
||||
u16 regs[3];
|
||||
int err;
|
||||
int i;
|
||||
|
||||
err = mv88e6185_g1_vtu_stu_data_read(chip, regs);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Extract MemberTag data */
|
||||
for (i = 0; i < mv88e6xxx_num_ports(chip); ++i) {
|
||||
unsigned int member_offset = (i % 4) * 4;
|
||||
unsigned int state_offset = member_offset + 2;
|
||||
|
||||
entry->member[i] = (regs[i / 4] >> member_offset) & 0x3;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mv88e6185_g1_stu_data_read(struct mv88e6xxx_chip *chip,
|
||||
struct mv88e6xxx_vtu_entry *entry)
|
||||
{
|
||||
u16 regs[3];
|
||||
int err;
|
||||
int i;
|
||||
|
||||
err = mv88e6185_g1_vtu_stu_data_read(chip, regs);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Extract PortState data */
|
||||
for (i = 0; i < mv88e6xxx_num_ports(chip); ++i) {
|
||||
unsigned int state_offset = (i % 4) * 4 + 2;
|
||||
|
||||
entry->state[i] = (regs[i / 4] >> state_offset) & 0x3;
|
||||
}
|
||||
|
||||
@@ -349,6 +380,10 @@ int mv88e6185_g1_vtu_getnext(struct mv88e6xxx_chip *chip,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mv88e6185_g1_stu_data_read(chip, entry);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* VTU DBNum[3:0] are located in VTU Operation 3:0
|
||||
* VTU DBNum[7:4] are located in VTU Operation 11:8
|
||||
*/
|
||||
@@ -374,11 +409,6 @@ int mv88e6352_g1_vtu_getnext(struct mv88e6xxx_chip *chip,
|
||||
return err;
|
||||
|
||||
if (entry->valid) {
|
||||
/* Fetch (and mask) VLAN PortState data from the STU */
|
||||
err = mv88e6xxx_g1_vtu_stu_get(chip, entry);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mv88e6185_g1_vtu_data_read(chip, entry);
|
||||
if (err)
|
||||
return err;
|
||||
@@ -386,6 +416,15 @@ int mv88e6352_g1_vtu_getnext(struct mv88e6xxx_chip *chip,
|
||||
err = mv88e6xxx_g1_vtu_fid_read(chip, entry);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Fetch VLAN PortState data from the STU */
|
||||
err = mv88e6xxx_g1_vtu_stu_get(chip, entry);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mv88e6185_g1_stu_data_read(chip, entry);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -2543,8 +2543,8 @@ static int atl1c_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
* various kernel subsystems to support the mechanics required by a
|
||||
* fixed-high-32-bit system.
|
||||
*/
|
||||
if ((dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)) != 0) ||
|
||||
(dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)) != 0)) {
|
||||
err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "No usable DMA configuration,aborting\n");
|
||||
goto err_dma;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user