Skip to content

Commit bdec419

Browse files
committed
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller: "Just a pile of random fixes, including: 1) Do not apply TSO limits to non-TSO packets, fix from Herbert Xu. 2) MDI{,X} eeprom check in e100 driver is reversed, from John W. Linville. 3) Missing error return assignments in several ethernet drivers, from Julia Lawall. 4) Altera TSE device doesn't come back up after ifconfig down/up sequence, fix from Kostya Belezko. 5) Add more cases to the check for whether the qmi_wwan device has a bogus MAC address and needs to be assigned a random one. From Kristian Evensen. 6) Fix interrupt hangs in CPSW, from Felipe Balbi. 7) Implement ndo_features_check in r8152 so that the stack doesn't feed GSO packets which are outside of the chip's capabilities. From Hayes Wang" * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (26 commits) qla3xxx: don't allow never end busy loop xen-netback: fixing the propagation of the transmit shaper timeout r8152: support ndo_features_check batman-adv: fix potential TT client + orig-node memory leak batman-adv: fix multicast counter when purging originators batman-adv: fix counter for multicast supporting nodes batman-adv: fix lock class for decoding hash in network-coding.c batman-adv: fix delayed foreign originator recognition batman-adv: fix and simplify condition when bonding should be used Revert "mac80211: Fix accounting of the tailroom-needed counter" net: ethernet: cpsw: fix hangs with interrupts enic: free all rq buffs when allocation fails qmi_wwan: Set random MAC on devices with buggy fw openvswitch: Consistently include VLAN header in flow and port stats. tcp: Do not apply TSO segment limit to non-TSO packets Altera TSE: Add missing phydev net/mlx4_core: Fix error flow in mlx4_init_hca() net/mlx4_core: Correcly update the mtt's offset in the MR re-reg flow qlcnic: Fix return value in qlcnic_probe() net: axienet: fix error return code ...
2 parents 0adc180 + 2abad79 commit bdec419

File tree

27 files changed

+105
-71
lines changed

27 files changed

+105
-71
lines changed

drivers/net/ethernet/allwinner/sun4i-emac.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -850,8 +850,10 @@ static int emac_probe(struct platform_device *pdev)
850850
}
851851

852852
db->clk = devm_clk_get(&pdev->dev, NULL);
853-
if (IS_ERR(db->clk))
853+
if (IS_ERR(db->clk)) {
854+
ret = PTR_ERR(db->clk);
854855
goto out;
856+
}
855857

856858
clk_prepare_enable(db->clk);
857859

drivers/net/ethernet/altera/altera_tse_main.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,10 +1170,6 @@ static int tse_open(struct net_device *dev)
11701170
init_error:
11711171
free_skbufs(dev);
11721172
alloc_skbuf_error:
1173-
if (priv->phydev) {
1174-
phy_disconnect(priv->phydev);
1175-
priv->phydev = NULL;
1176-
}
11771173
phy_error:
11781174
return ret;
11791175
}
@@ -1186,12 +1182,9 @@ static int tse_shutdown(struct net_device *dev)
11861182
int ret;
11871183
unsigned long int flags;
11881184

1189-
/* Stop and disconnect the PHY */
1190-
if (priv->phydev) {
1185+
/* Stop the PHY */
1186+
if (priv->phydev)
11911187
phy_stop(priv->phydev);
1192-
phy_disconnect(priv->phydev);
1193-
priv->phydev = NULL;
1194-
}
11951188

11961189
netif_stop_queue(dev);
11971190
napi_disable(&priv->napi);
@@ -1525,6 +1518,10 @@ static int altera_tse_probe(struct platform_device *pdev)
15251518
static int altera_tse_remove(struct platform_device *pdev)
15261519
{
15271520
struct net_device *ndev = platform_get_drvdata(pdev);
1521+
struct altera_tse_private *priv = netdev_priv(ndev);
1522+
1523+
if (priv->phydev)
1524+
phy_disconnect(priv->phydev);
15281525

15291526
platform_set_drvdata(pdev, NULL);
15301527
altera_tse_mdio_destroy(ndev);

drivers/net/ethernet/cisco/enic/enic_main.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1616,7 +1616,7 @@ static int enic_open(struct net_device *netdev)
16161616
if (vnic_rq_desc_used(&enic->rq[i]) == 0) {
16171617
netdev_err(netdev, "Unable to alloc receive buffers\n");
16181618
err = -ENOMEM;
1619-
goto err_out_notify_unset;
1619+
goto err_out_free_rq;
16201620
}
16211621
}
16221622

@@ -1649,7 +1649,9 @@ static int enic_open(struct net_device *netdev)
16491649

16501650
return 0;
16511651

1652-
err_out_notify_unset:
1652+
err_out_free_rq:
1653+
for (i = 0; i < enic->rq_count; i++)
1654+
vnic_rq_clean(&enic->rq[i], enic_free_rq_buf);
16531655
enic_dev_notify_unset(enic);
16541656
err_out_free_intr:
16551657
enic_free_intr(enic);

drivers/net/ethernet/intel/e100.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1543,7 +1543,7 @@ static int e100_phy_init(struct nic *nic)
15431543
mdio_write(netdev, nic->mii.phy_id, MII_BMCR, bmcr);
15441544
} else if ((nic->mac >= mac_82550_D102) || ((nic->flags & ich) &&
15451545
(mdio_read(netdev, nic->mii.phy_id, MII_TPISTATUS) & 0x8000) &&
1546-
!(nic->eeprom[eeprom_cnfg_mdix] & eeprom_mdix_enabled))) {
1546+
(nic->eeprom[eeprom_cnfg_mdix] & eeprom_mdix_enabled))) {
15471547
/* enable/disable MDI/MDI-X auto-switching. */
15481548
mdio_write(netdev, nic->mii.phy_id, MII_NCONFIG,
15491549
nic->mii.force_media ? 0 : NCONFIG_AUTO_SWITCH);

drivers/net/ethernet/intel/i40e/i40e_debugfs.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -829,7 +829,7 @@ static void i40e_dbg_dump_desc(int cnt, int vsi_seid, int ring_id, int desc_n,
829829
if (desc_n >= ring->count || desc_n < 0) {
830830
dev_info(&pf->pdev->dev,
831831
"descriptor %d not found\n", desc_n);
832-
return;
832+
goto out;
833833
}
834834
if (!is_rx_ring) {
835835
txd = I40E_TX_DESC(ring, desc_n);
@@ -855,6 +855,8 @@ static void i40e_dbg_dump_desc(int cnt, int vsi_seid, int ring_id, int desc_n,
855855
} else {
856856
dev_info(&pf->pdev->dev, "dump desc rx/tx <vsi_seid> <ring_id> [<desc_n>]\n");
857857
}
858+
859+
out:
858860
kfree(ring);
859861
}
860862

drivers/net/ethernet/intel/igb/e1000_82575.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1125,7 +1125,7 @@ static s32 igb_acquire_swfw_sync_82575(struct e1000_hw *hw, u16 mask)
11251125
u32 swmask = mask;
11261126
u32 fwmask = mask << 16;
11271127
s32 ret_val = 0;
1128-
s32 i = 0, timeout = 200; /* FIXME: find real value to use here */
1128+
s32 i = 0, timeout = 200;
11291129

11301130
while (i < timeout) {
11311131
if (igb_get_hw_semaphore(hw)) {

drivers/net/ethernet/mellanox/mlx4/main.c

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1829,7 +1829,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
18291829
err = mlx4_dev_cap(dev, &dev_cap);
18301830
if (err) {
18311831
mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting\n");
1832-
goto err_stop_fw;
1832+
return err;
18331833
}
18341834

18351835
choose_steering_mode(dev, &dev_cap);
@@ -1860,7 +1860,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
18601860
&init_hca);
18611861
if ((long long) icm_size < 0) {
18621862
err = icm_size;
1863-
goto err_stop_fw;
1863+
return err;
18641864
}
18651865

18661866
dev->caps.max_fmr_maps = (1 << (32 - ilog2(dev->caps.num_mpts))) - 1;
@@ -1874,7 +1874,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
18741874

18751875
err = mlx4_init_icm(dev, &dev_cap, &init_hca, icm_size);
18761876
if (err)
1877-
goto err_stop_fw;
1877+
return err;
18781878

18791879
err = mlx4_INIT_HCA(dev, &init_hca);
18801880
if (err) {
@@ -1886,7 +1886,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
18861886
err = mlx4_query_func(dev, &dev_cap);
18871887
if (err < 0) {
18881888
mlx4_err(dev, "QUERY_FUNC command failed, aborting.\n");
1889-
goto err_stop_fw;
1889+
goto err_close;
18901890
} else if (err & MLX4_QUERY_FUNC_NUM_SYS_EQS) {
18911891
dev->caps.num_eqs = dev_cap.max_eqs;
18921892
dev->caps.reserved_eqs = dev_cap.reserved_eqs;
@@ -2006,11 +2006,6 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
20062006
if (!mlx4_is_slave(dev))
20072007
mlx4_free_icms(dev);
20082008

2009-
err_stop_fw:
2010-
if (!mlx4_is_slave(dev)) {
2011-
mlx4_UNMAP_FA(dev);
2012-
mlx4_free_icm(dev, priv->fw.fw_icm, 0);
2013-
}
20142009
return err;
20152010
}
20162011

drivers/net/ethernet/mellanox/mlx4/mr.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,7 @@ EXPORT_SYMBOL_GPL(mlx4_mr_free);
584584
void mlx4_mr_rereg_mem_cleanup(struct mlx4_dev *dev, struct mlx4_mr *mr)
585585
{
586586
mlx4_mtt_cleanup(dev, &mr->mtt);
587+
mr->mtt.order = -1;
587588
}
588589
EXPORT_SYMBOL_GPL(mlx4_mr_rereg_mem_cleanup);
589590

@@ -593,14 +594,14 @@ int mlx4_mr_rereg_mem_write(struct mlx4_dev *dev, struct mlx4_mr *mr,
593594
{
594595
int err;
595596

596-
mpt_entry->start = cpu_to_be64(iova);
597-
mpt_entry->length = cpu_to_be64(size);
598-
mpt_entry->entity_size = cpu_to_be32(page_shift);
599-
600597
err = mlx4_mtt_init(dev, npages, page_shift, &mr->mtt);
601598
if (err)
602599
return err;
603600

601+
mpt_entry->start = cpu_to_be64(mr->iova);
602+
mpt_entry->length = cpu_to_be64(mr->size);
603+
mpt_entry->entity_size = cpu_to_be32(mr->mtt.page_shift);
604+
604605
mpt_entry->pd_flags &= cpu_to_be32(MLX4_MPT_PD_MASK |
605606
MLX4_MPT_PD_FLAG_EN_INV);
606607
mpt_entry->flags &= cpu_to_be32(MLX4_MPT_FLAG_FREE |

drivers/net/ethernet/myricom/myri10ge/myri10ge.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4033,8 +4033,10 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
40334033
(void)pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
40344034
mgp->cmd = dma_alloc_coherent(&pdev->dev, sizeof(*mgp->cmd),
40354035
&mgp->cmd_bus, GFP_KERNEL);
4036-
if (mgp->cmd == NULL)
4036+
if (!mgp->cmd) {
4037+
status = -ENOMEM;
40374038
goto abort_with_enabled;
4039+
}
40384040

40394041
mgp->board_span = pci_resource_len(pdev, 0);
40404042
mgp->iomem_base = pci_resource_start(pdev, 0);

drivers/net/ethernet/qlogic/qla3xxx.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,7 @@ static int ql_wait_for_drvr_lock(struct ql3_adapter *qdev)
146146
{
147147
int i = 0;
148148

149-
while (i < 10) {
150-
if (i)
151-
ssleep(1);
152-
149+
do {
153150
if (ql_sem_lock(qdev,
154151
QL_DRVR_SEM_MASK,
155152
(QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index)
@@ -158,7 +155,8 @@ static int ql_wait_for_drvr_lock(struct ql3_adapter *qdev)
158155
"driver lock acquired\n");
159156
return 1;
160157
}
161-
}
158+
ssleep(1);
159+
} while (++i < 10);
162160

163161
netdev_err(qdev->ndev, "Timed out waiting for driver lock...\n");
164162
return 0;

drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2605,6 +2605,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
26052605
} else {
26062606
dev_err(&pdev->dev,
26072607
"%s: failed. Please Reboot\n", __func__);
2608+
err = -ENODEV;
26082609
goto err_out_free_hw;
26092610
}
26102611

drivers/net/ethernet/ti/cpsw.c

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -757,6 +757,14 @@ static void cpsw_rx_handler(void *token, int len, int status)
757757
static irqreturn_t cpsw_interrupt(int irq, void *dev_id)
758758
{
759759
struct cpsw_priv *priv = dev_id;
760+
int value = irq - priv->irqs_table[0];
761+
762+
/* NOTICE: Ending IRQ here. The trick with the 'value' variable above
763+
* is to make sure we will always write the correct value to the EOI
764+
* register. Namely 0 for RX_THRESH Interrupt, 1 for RX Interrupt, 2
765+
* for TX Interrupt and 3 for MISC Interrupt.
766+
*/
767+
cpdma_ctlr_eoi(priv->dma, value);
760768

761769
cpsw_intr_disable(priv);
762770
if (priv->irq_enabled == true) {
@@ -786,16 +794,13 @@ static int cpsw_poll(struct napi_struct *napi, int budget)
786794
int num_tx, num_rx;
787795

788796
num_tx = cpdma_chan_process(priv->txch, 128);
789-
if (num_tx)
790-
cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
791797

792798
num_rx = cpdma_chan_process(priv->rxch, budget);
793799
if (num_rx < budget) {
794800
struct cpsw_priv *prim_cpsw;
795801

796802
napi_complete(napi);
797803
cpsw_intr_enable(priv);
798-
cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
799804
prim_cpsw = cpsw_get_slave_priv(priv, 0);
800805
if (prim_cpsw->irq_enabled == false) {
801806
prim_cpsw->irq_enabled = true;
@@ -1310,8 +1315,6 @@ static int cpsw_ndo_open(struct net_device *ndev)
13101315
napi_enable(&priv->napi);
13111316
cpdma_ctlr_start(priv->dma);
13121317
cpsw_intr_enable(priv);
1313-
cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
1314-
cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
13151318

13161319
prim_cpsw = cpsw_get_slave_priv(priv, 0);
13171320
if (prim_cpsw->irq_enabled == false) {
@@ -1578,9 +1581,6 @@ static void cpsw_ndo_tx_timeout(struct net_device *ndev)
15781581
cpdma_chan_start(priv->txch);
15791582
cpdma_ctlr_int_ctrl(priv->dma, true);
15801583
cpsw_intr_enable(priv);
1581-
cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
1582-
cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
1583-
15841584
}
15851585

15861586
static int cpsw_ndo_set_mac_address(struct net_device *ndev, void *p)
@@ -1620,9 +1620,6 @@ static void cpsw_ndo_poll_controller(struct net_device *ndev)
16201620
cpsw_interrupt(ndev->irq, priv);
16211621
cpdma_ctlr_int_ctrl(priv->dma, true);
16221622
cpsw_intr_enable(priv);
1623-
cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
1624-
cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
1625-
16261623
}
16271624
#endif
16281625

drivers/net/ethernet/xilinx/ll_temac_main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,6 +1043,7 @@ static int temac_of_probe(struct platform_device *op)
10431043
lp->regs = of_iomap(op->dev.of_node, 0);
10441044
if (!lp->regs) {
10451045
dev_err(&op->dev, "could not map temac regs.\n");
1046+
rc = -ENOMEM;
10461047
goto nodev;
10471048
}
10481049

@@ -1062,6 +1063,7 @@ static int temac_of_probe(struct platform_device *op)
10621063
np = of_parse_phandle(op->dev.of_node, "llink-connected", 0);
10631064
if (!np) {
10641065
dev_err(&op->dev, "could not find DMA node\n");
1066+
rc = -ENODEV;
10651067
goto err_iounmap;
10661068
}
10671069

drivers/net/ethernet/xilinx/xilinx_axienet_main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,6 +1501,7 @@ static int axienet_of_probe(struct platform_device *op)
15011501
lp->regs = of_iomap(op->dev.of_node, 0);
15021502
if (!lp->regs) {
15031503
dev_err(&op->dev, "could not map Axi Ethernet regs.\n");
1504+
ret = -ENOMEM;
15041505
goto nodev;
15051506
}
15061507
/* Setup checksum offload, but default to off if not specified */
@@ -1563,6 +1564,7 @@ static int axienet_of_probe(struct platform_device *op)
15631564
np = of_parse_phandle(op->dev.of_node, "axistream-connected", 0);
15641565
if (!np) {
15651566
dev_err(&op->dev, "could not find DMA node\n");
1567+
ret = -ENODEV;
15661568
goto err_iounmap;
15671569
}
15681570
lp->dma_regs = of_iomap(np, 0);

drivers/net/ethernet/xilinx/xilinx_emaclite.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,6 +1109,7 @@ static int xemaclite_of_probe(struct platform_device *ofdev)
11091109
res = platform_get_resource(ofdev, IORESOURCE_IRQ, 0);
11101110
if (!res) {
11111111
dev_err(dev, "no IRQ found\n");
1112+
rc = -ENXIO;
11121113
goto error;
11131114
}
11141115

drivers/net/usb/qmi_wwan.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ struct qmi_wwan_state {
5656
/* default ethernet address used by the modem */
5757
static const u8 default_modem_addr[ETH_ALEN] = {0x02, 0x50, 0xf3};
5858

59+
static const u8 buggy_fw_addr[ETH_ALEN] = {0x00, 0xa0, 0xc6, 0x00, 0x00, 0x00};
60+
5961
/* Make up an ethernet header if the packet doesn't have one.
6062
*
6163
* A firmware bug common among several devices cause them to send raw
@@ -332,10 +334,12 @@ static int qmi_wwan_bind(struct usbnet *dev, struct usb_interface *intf)
332334
usb_driver_release_interface(driver, info->data);
333335
}
334336

335-
/* Never use the same address on both ends of the link, even
336-
* if the buggy firmware told us to.
337+
/* Never use the same address on both ends of the link, even if the
338+
* buggy firmware told us to. Or, if device is assigned the well-known
339+
* buggy firmware MAC address, replace it with a random address,
337340
*/
338-
if (ether_addr_equal(dev->net->dev_addr, default_modem_addr))
341+
if (ether_addr_equal(dev->net->dev_addr, default_modem_addr) ||
342+
ether_addr_equal(dev->net->dev_addr, buggy_fw_addr))
339343
eth_hw_addr_random(dev->net);
340344

341345
/* make MAC addr easily distinguishable from an IP header */

drivers/net/usb/r8152.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1897,6 +1897,22 @@ static void _rtl8152_set_rx_mode(struct net_device *netdev)
18971897
netif_wake_queue(netdev);
18981898
}
18991899

1900+
static netdev_features_t
1901+
rtl8152_features_check(struct sk_buff *skb, struct net_device *dev,
1902+
netdev_features_t features)
1903+
{
1904+
u32 mss = skb_shinfo(skb)->gso_size;
1905+
int max_offset = mss ? GTTCPHO_MAX : TCPHO_MAX;
1906+
int offset = skb_transport_offset(skb);
1907+
1908+
if ((mss || skb->ip_summed == CHECKSUM_PARTIAL) && offset > max_offset)
1909+
features &= ~(NETIF_F_ALL_CSUM | NETIF_F_GSO_MASK);
1910+
else if ((skb->len + sizeof(struct tx_desc)) > agg_buf_sz)
1911+
features &= ~NETIF_F_GSO_MASK;
1912+
1913+
return features;
1914+
}
1915+
19001916
static netdev_tx_t rtl8152_start_xmit(struct sk_buff *skb,
19011917
struct net_device *netdev)
19021918
{
@@ -3706,6 +3722,7 @@ static const struct net_device_ops rtl8152_netdev_ops = {
37063722
.ndo_set_mac_address = rtl8152_set_mac_address,
37073723
.ndo_change_mtu = rtl8152_change_mtu,
37083724
.ndo_validate_addr = eth_validate_addr,
3725+
.ndo_features_check = rtl8152_features_check,
37093726
};
37103727

37113728
static void r8152b_get_version(struct r8152 *tp)

drivers/net/xen-netback/xenbus.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,7 @@ static void connect(struct backend_info *be)
737737
}
738738

739739
queue->remaining_credit = credit_bytes;
740+
queue->credit_usec = credit_usec;
740741

741742
err = connect_rings(be, queue);
742743
if (err) {

0 commit comments

Comments
 (0)