diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/cadence/Kconfig | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/chelsio/cxgb4/l2t.c | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/chelsio/cxgb4/t4_hw.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 17 | ||||
-rw-r--r-- | drivers/net/ethernet/marvell/mvneta.c | 41 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/main.c | 181 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c | 21 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 33 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c | 10 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c | 31 | ||||
-rw-r--r-- | drivers/net/ieee802154/at86rf230.c | 10 | ||||
-rw-r--r-- | drivers/net/vxlan.c | 4 | ||||
-rw-r--r-- | drivers/net/wan/cosa.c | 4 |
18 files changed, 221 insertions, 152 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2.c b/drivers/net/ethernet/broadcom/bnx2.c index a8efb18e42fa..0ab83708b6a1 100644 --- a/drivers/net/ethernet/broadcom/bnx2.c +++ b/drivers/net/ethernet/broadcom/bnx2.c | |||
@@ -8627,6 +8627,7 @@ bnx2_remove_one(struct pci_dev *pdev) | |||
8627 | pci_disable_device(pdev); | 8627 | pci_disable_device(pdev); |
8628 | } | 8628 | } |
8629 | 8629 | ||
8630 | #ifdef CONFIG_PM_SLEEP | ||
8630 | static int | 8631 | static int |
8631 | bnx2_suspend(struct device *device) | 8632 | bnx2_suspend(struct device *device) |
8632 | { | 8633 | { |
@@ -8665,7 +8666,6 @@ bnx2_resume(struct device *device) | |||
8665 | return 0; | 8666 | return 0; |
8666 | } | 8667 | } |
8667 | 8668 | ||
8668 | #ifdef CONFIG_PM_SLEEP | ||
8669 | static SIMPLE_DEV_PM_OPS(bnx2_pm_ops, bnx2_suspend, bnx2_resume); | 8669 | static SIMPLE_DEV_PM_OPS(bnx2_pm_ops, bnx2_suspend, bnx2_resume); |
8670 | #define BNX2_PM_OPS (&bnx2_pm_ops) | 8670 | #define BNX2_PM_OPS (&bnx2_pm_ops) |
8671 | 8671 | ||
diff --git a/drivers/net/ethernet/cadence/Kconfig b/drivers/net/ethernet/cadence/Kconfig index 751d5c7b312d..7e49c43b7af3 100644 --- a/drivers/net/ethernet/cadence/Kconfig +++ b/drivers/net/ethernet/cadence/Kconfig | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | config NET_CADENCE | 5 | config NET_CADENCE |
6 | bool "Cadence devices" | 6 | bool "Cadence devices" |
7 | depends on HAS_IOMEM | 7 | depends on HAS_IOMEM && (ARM || AVR32 || COMPILE_TEST) |
8 | default y | 8 | default y |
9 | ---help--- | 9 | ---help--- |
10 | If you have a network (Ethernet) card belonging to this class, say Y. | 10 | If you have a network (Ethernet) card belonging to this class, say Y. |
@@ -22,7 +22,7 @@ if NET_CADENCE | |||
22 | 22 | ||
23 | config ARM_AT91_ETHER | 23 | config ARM_AT91_ETHER |
24 | tristate "AT91RM9200 Ethernet support" | 24 | tristate "AT91RM9200 Ethernet support" |
25 | depends on HAS_DMA | 25 | depends on HAS_DMA && (ARCH_AT91RM9200 || COMPILE_TEST) |
26 | select MACB | 26 | select MACB |
27 | ---help--- | 27 | ---help--- |
28 | If you wish to compile a kernel for the AT91RM9200 and enable | 28 | If you wish to compile a kernel for the AT91RM9200 and enable |
@@ -30,7 +30,7 @@ config ARM_AT91_ETHER | |||
30 | 30 | ||
31 | config MACB | 31 | config MACB |
32 | tristate "Cadence MACB/GEM support" | 32 | tristate "Cadence MACB/GEM support" |
33 | depends on HAS_DMA | 33 | depends on HAS_DMA && (PLATFORM_AT32AP || ARCH_AT91 || ARCH_PICOXCELL || ARCH_ZYNQ || COMPILE_TEST) |
34 | select PHYLIB | 34 | select PHYLIB |
35 | ---help--- | 35 | ---help--- |
36 | The Cadence MACB ethernet interface is found on many Atmel AT32 and | 36 | The Cadence MACB ethernet interface is found on many Atmel AT32 and |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/l2t.c b/drivers/net/ethernet/chelsio/cxgb4/l2t.c index 81e8402a74b4..8a96572fdde0 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/l2t.c +++ b/drivers/net/ethernet/chelsio/cxgb4/l2t.c | |||
@@ -154,7 +154,7 @@ static int write_l2e(struct adapter *adap, struct l2t_entry *e, int sync) | |||
154 | req->params = htons(L2T_W_PORT(e->lport) | L2T_W_NOREPLY(!sync)); | 154 | req->params = htons(L2T_W_PORT(e->lport) | L2T_W_NOREPLY(!sync)); |
155 | req->l2t_idx = htons(e->idx); | 155 | req->l2t_idx = htons(e->idx); |
156 | req->vlan = htons(e->vlan); | 156 | req->vlan = htons(e->vlan); |
157 | if (e->neigh) | 157 | if (e->neigh && !(e->neigh->dev->flags & IFF_LOOPBACK)) |
158 | memcpy(e->dmac, e->neigh->ha, sizeof(e->dmac)); | 158 | memcpy(e->dmac, e->neigh->ha, sizeof(e->dmac)); |
159 | memcpy(req->dst_mac, e->dmac, sizeof(req->dst_mac)); | 159 | memcpy(req->dst_mac, e->dmac, sizeof(req->dst_mac)); |
160 | 160 | ||
@@ -394,6 +394,8 @@ struct l2t_entry *cxgb4_l2t_get(struct l2t_data *d, struct neighbour *neigh, | |||
394 | if (e) { | 394 | if (e) { |
395 | spin_lock(&e->lock); /* avoid race with t4_l2t_free */ | 395 | spin_lock(&e->lock); /* avoid race with t4_l2t_free */ |
396 | e->state = L2T_STATE_RESOLVING; | 396 | e->state = L2T_STATE_RESOLVING; |
397 | if (neigh->dev->flags & IFF_LOOPBACK) | ||
398 | memcpy(e->dmac, physdev->dev_addr, sizeof(e->dmac)); | ||
397 | memcpy(e->addr, addr, addr_len); | 399 | memcpy(e->addr, addr, addr_len); |
398 | e->ifindex = ifidx; | 400 | e->ifindex = ifidx; |
399 | e->hash = hash; | 401 | e->hash = hash; |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c index fb2fe65903c2..bba67681aeaa 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c +++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c | |||
@@ -682,7 +682,7 @@ enum { | |||
682 | SF_RD_ID = 0x9f, /* read ID */ | 682 | SF_RD_ID = 0x9f, /* read ID */ |
683 | SF_ERASE_SECTOR = 0xd8, /* erase sector */ | 683 | SF_ERASE_SECTOR = 0xd8, /* erase sector */ |
684 | 684 | ||
685 | FW_MAX_SIZE = 512 * 1024, | 685 | FW_MAX_SIZE = 16 * SF_SEC_SIZE, |
686 | }; | 686 | }; |
687 | 687 | ||
688 | /** | 688 | /** |
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index 8ccaa2520dc3..97db5a7179df 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h | |||
@@ -374,6 +374,7 @@ enum vf_state { | |||
374 | #define BE_FLAGS_NAPI_ENABLED (1 << 9) | 374 | #define BE_FLAGS_NAPI_ENABLED (1 << 9) |
375 | #define BE_FLAGS_QNQ_ASYNC_EVT_RCVD (1 << 11) | 375 | #define BE_FLAGS_QNQ_ASYNC_EVT_RCVD (1 << 11) |
376 | #define BE_FLAGS_VXLAN_OFFLOADS (1 << 12) | 376 | #define BE_FLAGS_VXLAN_OFFLOADS (1 << 12) |
377 | #define BE_FLAGS_SETUP_DONE (1 << 13) | ||
377 | 378 | ||
378 | #define BE_UC_PMAC_COUNT 30 | 379 | #define BE_UC_PMAC_COUNT 30 |
379 | #define BE_VF_UC_PMAC_COUNT 2 | 380 | #define BE_VF_UC_PMAC_COUNT 2 |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 3e6df47b6973..a18645407d21 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -2033,11 +2033,13 @@ static void be_tx_compl_clean(struct be_adapter *adapter) | |||
2033 | bool dummy_wrb; | 2033 | bool dummy_wrb; |
2034 | int i, pending_txqs; | 2034 | int i, pending_txqs; |
2035 | 2035 | ||
2036 | /* Wait for a max of 200ms for all the tx-completions to arrive. */ | 2036 | /* Stop polling for compls when HW has been silent for 10ms */ |
2037 | do { | 2037 | do { |
2038 | pending_txqs = adapter->num_tx_qs; | 2038 | pending_txqs = adapter->num_tx_qs; |
2039 | 2039 | ||
2040 | for_all_tx_queues(adapter, txo, i) { | 2040 | for_all_tx_queues(adapter, txo, i) { |
2041 | cmpl = 0; | ||
2042 | num_wrbs = 0; | ||
2041 | txq = &txo->q; | 2043 | txq = &txo->q; |
2042 | while ((txcp = be_tx_compl_get(&txo->cq))) { | 2044 | while ((txcp = be_tx_compl_get(&txo->cq))) { |
2043 | end_idx = | 2045 | end_idx = |
@@ -2050,14 +2052,13 @@ static void be_tx_compl_clean(struct be_adapter *adapter) | |||
2050 | if (cmpl) { | 2052 | if (cmpl) { |
2051 | be_cq_notify(adapter, txo->cq.id, false, cmpl); | 2053 | be_cq_notify(adapter, txo->cq.id, false, cmpl); |
2052 | atomic_sub(num_wrbs, &txq->used); | 2054 | atomic_sub(num_wrbs, &txq->used); |
2053 | cmpl = 0; | 2055 | timeo = 0; |
2054 | num_wrbs = 0; | ||
2055 | } | 2056 | } |
2056 | if (atomic_read(&txq->used) == 0) | 2057 | if (atomic_read(&txq->used) == 0) |
2057 | pending_txqs--; | 2058 | pending_txqs--; |
2058 | } | 2059 | } |
2059 | 2060 | ||
2060 | if (pending_txqs == 0 || ++timeo > 200) | 2061 | if (pending_txqs == 0 || ++timeo > 10 || be_hw_error(adapter)) |
2061 | break; | 2062 | break; |
2062 | 2063 | ||
2063 | mdelay(1); | 2064 | mdelay(1); |
@@ -2725,6 +2726,12 @@ static int be_close(struct net_device *netdev) | |||
2725 | struct be_eq_obj *eqo; | 2726 | struct be_eq_obj *eqo; |
2726 | int i; | 2727 | int i; |
2727 | 2728 | ||
2729 | /* This protection is needed as be_close() may be called even when the | ||
2730 | * adapter is in cleared state (after eeh perm failure) | ||
2731 | */ | ||
2732 | if (!(adapter->flags & BE_FLAGS_SETUP_DONE)) | ||
2733 | return 0; | ||
2734 | |||
2728 | be_roce_dev_close(adapter); | 2735 | be_roce_dev_close(adapter); |
2729 | 2736 | ||
2730 | if (adapter->flags & BE_FLAGS_NAPI_ENABLED) { | 2737 | if (adapter->flags & BE_FLAGS_NAPI_ENABLED) { |
@@ -3055,6 +3062,7 @@ static int be_clear(struct be_adapter *adapter) | |||
3055 | be_clear_queues(adapter); | 3062 | be_clear_queues(adapter); |
3056 | 3063 | ||
3057 | be_msix_disable(adapter); | 3064 | be_msix_disable(adapter); |
3065 | adapter->flags &= ~BE_FLAGS_SETUP_DONE; | ||
3058 | return 0; | 3066 | return 0; |
3059 | } | 3067 | } |
3060 | 3068 | ||
@@ -3559,6 +3567,7 @@ static int be_setup(struct be_adapter *adapter) | |||
3559 | adapter->phy.fc_autoneg = 1; | 3567 | adapter->phy.fc_autoneg = 1; |
3560 | 3568 | ||
3561 | be_schedule_worker(adapter); | 3569 | be_schedule_worker(adapter); |
3570 | adapter->flags |= BE_FLAGS_SETUP_DONE; | ||
3562 | return 0; | 3571 | return 0; |
3563 | err: | 3572 | err: |
3564 | be_clear(adapter); | 3573 | be_clear(adapter); |
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c index d04b1c3c9b85..b248bcbdae63 100644 --- a/drivers/net/ethernet/marvell/mvneta.c +++ b/drivers/net/ethernet/marvell/mvneta.c | |||
@@ -89,9 +89,8 @@ | |||
89 | #define MVNETA_TX_IN_PRGRS BIT(1) | 89 | #define MVNETA_TX_IN_PRGRS BIT(1) |
90 | #define MVNETA_TX_FIFO_EMPTY BIT(8) | 90 | #define MVNETA_TX_FIFO_EMPTY BIT(8) |
91 | #define MVNETA_RX_MIN_FRAME_SIZE 0x247c | 91 | #define MVNETA_RX_MIN_FRAME_SIZE 0x247c |
92 | #define MVNETA_SERDES_CFG 0x24A0 | 92 | #define MVNETA_SGMII_SERDES_CFG 0x24A0 |
93 | #define MVNETA_SGMII_SERDES_PROTO 0x0cc7 | 93 | #define MVNETA_SGMII_SERDES_PROTO 0x0cc7 |
94 | #define MVNETA_RGMII_SERDES_PROTO 0x0667 | ||
95 | #define MVNETA_TYPE_PRIO 0x24bc | 94 | #define MVNETA_TYPE_PRIO 0x24bc |
96 | #define MVNETA_FORCE_UNI BIT(21) | 95 | #define MVNETA_FORCE_UNI BIT(21) |
97 | #define MVNETA_TXQ_CMD_1 0x24e4 | 96 | #define MVNETA_TXQ_CMD_1 0x24e4 |
@@ -712,6 +711,35 @@ static void mvneta_rxq_bm_disable(struct mvneta_port *pp, | |||
712 | mvreg_write(pp, MVNETA_RXQ_CONFIG_REG(rxq->id), val); | 711 | mvreg_write(pp, MVNETA_RXQ_CONFIG_REG(rxq->id), val); |
713 | } | 712 | } |
714 | 713 | ||
714 | |||
715 | |||
716 | /* Sets the RGMII Enable bit (RGMIIEn) in port MAC control register */ | ||
717 | static void mvneta_gmac_rgmii_set(struct mvneta_port *pp, int enable) | ||
718 | { | ||
719 | u32 val; | ||
720 | |||
721 | val = mvreg_read(pp, MVNETA_GMAC_CTRL_2); | ||
722 | |||
723 | if (enable) | ||
724 | val |= MVNETA_GMAC2_PORT_RGMII; | ||
725 | else | ||
726 | val &= ~MVNETA_GMAC2_PORT_RGMII; | ||
727 | |||
728 | mvreg_write(pp, MVNETA_GMAC_CTRL_2, val); | ||
729 | } | ||
730 | |||
731 | /* Config SGMII port */ | ||
732 | static void mvneta_port_sgmii_config(struct mvneta_port *pp) | ||
733 | { | ||
734 | u32 val; | ||
735 | |||
736 | val = mvreg_read(pp, MVNETA_GMAC_CTRL_2); | ||
737 | val |= MVNETA_GMAC2_PCS_ENABLE; | ||
738 | mvreg_write(pp, MVNETA_GMAC_CTRL_2, val); | ||
739 | |||
740 | mvreg_write(pp, MVNETA_SGMII_SERDES_CFG, MVNETA_SGMII_SERDES_PROTO); | ||
741 | } | ||
742 | |||
715 | /* Start the Ethernet port RX and TX activity */ | 743 | /* Start the Ethernet port RX and TX activity */ |
716 | static void mvneta_port_up(struct mvneta_port *pp) | 744 | static void mvneta_port_up(struct mvneta_port *pp) |
717 | { | 745 | { |
@@ -2729,15 +2757,12 @@ static void mvneta_port_power_up(struct mvneta_port *pp, int phy_mode) | |||
2729 | mvreg_write(pp, MVNETA_UNIT_INTR_CAUSE, 0); | 2757 | mvreg_write(pp, MVNETA_UNIT_INTR_CAUSE, 0); |
2730 | 2758 | ||
2731 | if (phy_mode == PHY_INTERFACE_MODE_SGMII) | 2759 | if (phy_mode == PHY_INTERFACE_MODE_SGMII) |
2732 | mvreg_write(pp, MVNETA_SERDES_CFG, MVNETA_SGMII_SERDES_PROTO); | 2760 | mvneta_port_sgmii_config(pp); |
2733 | else | ||
2734 | mvreg_write(pp, MVNETA_SERDES_CFG, MVNETA_RGMII_SERDES_PROTO); | ||
2735 | 2761 | ||
2736 | val = mvreg_read(pp, MVNETA_GMAC_CTRL_2); | 2762 | mvneta_gmac_rgmii_set(pp, 1); |
2737 | |||
2738 | val |= MVNETA_GMAC2_PCS_ENABLE | MVNETA_GMAC2_PORT_RGMII; | ||
2739 | 2763 | ||
2740 | /* Cancel Port Reset */ | 2764 | /* Cancel Port Reset */ |
2765 | val = mvreg_read(pp, MVNETA_GMAC_CTRL_2); | ||
2741 | val &= ~MVNETA_GMAC2_PORT_RESET; | 2766 | val &= ~MVNETA_GMAC2_PORT_RESET; |
2742 | mvreg_write(pp, MVNETA_GMAC_CTRL_2, val); | 2767 | mvreg_write(pp, MVNETA_GMAC_CTRL_2, val); |
2743 | 2768 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index f0ae95f66ceb..cef267e24f9c 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
@@ -2301,13 +2301,8 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data) | |||
2301 | /* Allow large DMA segments, up to the firmware limit of 1 GB */ | 2301 | /* Allow large DMA segments, up to the firmware limit of 1 GB */ |
2302 | dma_set_max_seg_size(&pdev->dev, 1024 * 1024 * 1024); | 2302 | dma_set_max_seg_size(&pdev->dev, 1024 * 1024 * 1024); |
2303 | 2303 | ||
2304 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); | 2304 | dev = pci_get_drvdata(pdev); |
2305 | if (!priv) { | 2305 | priv = mlx4_priv(dev); |
2306 | err = -ENOMEM; | ||
2307 | goto err_release_regions; | ||
2308 | } | ||
2309 | |||
2310 | dev = &priv->dev; | ||
2311 | dev->pdev = pdev; | 2306 | dev->pdev = pdev; |
2312 | INIT_LIST_HEAD(&priv->ctx_list); | 2307 | INIT_LIST_HEAD(&priv->ctx_list); |
2313 | spin_lock_init(&priv->ctx_lock); | 2308 | spin_lock_init(&priv->ctx_lock); |
@@ -2374,10 +2369,10 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data) | |||
2374 | } else { | 2369 | } else { |
2375 | atomic_inc(&pf_loading); | 2370 | atomic_inc(&pf_loading); |
2376 | err = pci_enable_sriov(pdev, total_vfs); | 2371 | err = pci_enable_sriov(pdev, total_vfs); |
2377 | atomic_dec(&pf_loading); | ||
2378 | if (err) { | 2372 | if (err) { |
2379 | mlx4_err(dev, "Failed to enable SR-IOV, continuing without SR-IOV (err = %d).\n", | 2373 | mlx4_err(dev, "Failed to enable SR-IOV, continuing without SR-IOV (err = %d).\n", |
2380 | err); | 2374 | err); |
2375 | atomic_dec(&pf_loading); | ||
2381 | err = 0; | 2376 | err = 0; |
2382 | } else { | 2377 | } else { |
2383 | mlx4_warn(dev, "Running in master mode\n"); | 2378 | mlx4_warn(dev, "Running in master mode\n"); |
@@ -2535,8 +2530,10 @@ slave_start: | |||
2535 | mlx4_sense_init(dev); | 2530 | mlx4_sense_init(dev); |
2536 | mlx4_start_sense(dev); | 2531 | mlx4_start_sense(dev); |
2537 | 2532 | ||
2538 | priv->pci_dev_data = pci_dev_data; | 2533 | priv->removed = 0; |
2539 | pci_set_drvdata(pdev, dev); | 2534 | |
2535 | if (mlx4_is_master(dev) && dev->num_vfs) | ||
2536 | atomic_dec(&pf_loading); | ||
2540 | 2537 | ||
2541 | return 0; | 2538 | return 0; |
2542 | 2539 | ||
@@ -2588,6 +2585,9 @@ err_rel_own: | |||
2588 | if (!mlx4_is_slave(dev)) | 2585 | if (!mlx4_is_slave(dev)) |
2589 | mlx4_free_ownership(dev); | 2586 | mlx4_free_ownership(dev); |
2590 | 2587 | ||
2588 | if (mlx4_is_master(dev) && dev->num_vfs) | ||
2589 | atomic_dec(&pf_loading); | ||
2590 | |||
2591 | kfree(priv->dev.dev_vfs); | 2591 | kfree(priv->dev.dev_vfs); |
2592 | 2592 | ||
2593 | err_free_dev: | 2593 | err_free_dev: |
@@ -2604,85 +2604,110 @@ err_disable_pdev: | |||
2604 | 2604 | ||
2605 | static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id) | 2605 | static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id) |
2606 | { | 2606 | { |
2607 | struct mlx4_priv *priv; | ||
2608 | struct mlx4_dev *dev; | ||
2609 | |||
2607 | printk_once(KERN_INFO "%s", mlx4_version); | 2610 | printk_once(KERN_INFO "%s", mlx4_version); |
2608 | 2611 | ||
2612 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); | ||
2613 | if (!priv) | ||
2614 | return -ENOMEM; | ||
2615 | |||
2616 | dev = &priv->dev; | ||
2617 | pci_set_drvdata(pdev, dev); | ||
2618 | priv->pci_dev_data = id->driver_data; | ||
2619 | |||
2609 | return __mlx4_init_one(pdev, id->driver_data); | 2620 | return __mlx4_init_one(pdev, id->driver_data); |
2610 | } | 2621 | } |
2611 | 2622 | ||
2612 | static void mlx4_remove_one(struct pci_dev *pdev) | 2623 | static void __mlx4_remove_one(struct pci_dev *pdev) |
2613 | { | 2624 | { |
2614 | struct mlx4_dev *dev = pci_get_drvdata(pdev); | 2625 | struct mlx4_dev *dev = pci_get_drvdata(pdev); |
2615 | struct mlx4_priv *priv = mlx4_priv(dev); | 2626 | struct mlx4_priv *priv = mlx4_priv(dev); |
2627 | int pci_dev_data; | ||
2616 | int p; | 2628 | int p; |
2617 | 2629 | ||
2618 | if (dev) { | 2630 | if (priv->removed) |
2619 | /* in SRIOV it is not allowed to unload the pf's | 2631 | return; |
2620 | * driver while there are alive vf's */ | ||
2621 | if (mlx4_is_master(dev)) { | ||
2622 | if (mlx4_how_many_lives_vf(dev)) | ||
2623 | printk(KERN_ERR "Removing PF when there are assigned VF's !!!\n"); | ||
2624 | } | ||
2625 | mlx4_stop_sense(dev); | ||
2626 | mlx4_unregister_device(dev); | ||
2627 | 2632 | ||
2628 | for (p = 1; p <= dev->caps.num_ports; p++) { | 2633 | pci_dev_data = priv->pci_dev_data; |
2629 | mlx4_cleanup_port_info(&priv->port[p]); | ||
2630 | mlx4_CLOSE_PORT(dev, p); | ||
2631 | } | ||
2632 | 2634 | ||
2633 | if (mlx4_is_master(dev)) | 2635 | /* in SRIOV it is not allowed to unload the pf's |
2634 | mlx4_free_resource_tracker(dev, | 2636 | * driver while there are alive vf's */ |
2635 | RES_TR_FREE_SLAVES_ONLY); | 2637 | if (mlx4_is_master(dev) && mlx4_how_many_lives_vf(dev)) |
2636 | 2638 | printk(KERN_ERR "Removing PF when there are assigned VF's !!!\n"); | |
2637 | mlx4_cleanup_counters_table(dev); | 2639 | mlx4_stop_sense(dev); |
2638 | mlx4_cleanup_qp_table(dev); | 2640 | mlx4_unregister_device(dev); |
2639 | mlx4_cleanup_srq_table(dev); | ||
2640 | mlx4_cleanup_cq_table(dev); | ||
2641 | mlx4_cmd_use_polling(dev); | ||
2642 | mlx4_cleanup_eq_table(dev); | ||
2643 | mlx4_cleanup_mcg_table(dev); | ||
2644 | mlx4_cleanup_mr_table(dev); | ||
2645 | mlx4_cleanup_xrcd_table(dev); | ||
2646 | mlx4_cleanup_pd_table(dev); | ||
2647 | 2641 | ||
2648 | if (mlx4_is_master(dev)) | 2642 | for (p = 1; p <= dev->caps.num_ports; p++) { |
2649 | mlx4_free_resource_tracker(dev, | 2643 | mlx4_cleanup_port_info(&priv->port[p]); |
2650 | RES_TR_FREE_STRUCTS_ONLY); | 2644 | mlx4_CLOSE_PORT(dev, p); |
2651 | 2645 | } | |
2652 | iounmap(priv->kar); | ||
2653 | mlx4_uar_free(dev, &priv->driver_uar); | ||
2654 | mlx4_cleanup_uar_table(dev); | ||
2655 | if (!mlx4_is_slave(dev)) | ||
2656 | mlx4_clear_steering(dev); | ||
2657 | mlx4_free_eq_table(dev); | ||
2658 | if (mlx4_is_master(dev)) | ||
2659 | mlx4_multi_func_cleanup(dev); | ||
2660 | mlx4_close_hca(dev); | ||
2661 | if (mlx4_is_slave(dev)) | ||
2662 | mlx4_multi_func_cleanup(dev); | ||
2663 | mlx4_cmd_cleanup(dev); | ||
2664 | |||
2665 | if (dev->flags & MLX4_FLAG_MSI_X) | ||
2666 | pci_disable_msix(pdev); | ||
2667 | if (dev->flags & MLX4_FLAG_SRIOV) { | ||
2668 | mlx4_warn(dev, "Disabling SR-IOV\n"); | ||
2669 | pci_disable_sriov(pdev); | ||
2670 | } | ||
2671 | 2646 | ||
2672 | if (!mlx4_is_slave(dev)) | 2647 | if (mlx4_is_master(dev)) |
2673 | mlx4_free_ownership(dev); | 2648 | mlx4_free_resource_tracker(dev, |
2649 | RES_TR_FREE_SLAVES_ONLY); | ||
2674 | 2650 | ||
2675 | kfree(dev->caps.qp0_tunnel); | 2651 | mlx4_cleanup_counters_table(dev); |
2676 | kfree(dev->caps.qp0_proxy); | 2652 | mlx4_cleanup_qp_table(dev); |
2677 | kfree(dev->caps.qp1_tunnel); | 2653 | mlx4_cleanup_srq_table(dev); |
2678 | kfree(dev->caps.qp1_proxy); | 2654 | mlx4_cleanup_cq_table(dev); |
2679 | kfree(dev->dev_vfs); | 2655 | mlx4_cmd_use_polling(dev); |
2656 | mlx4_cleanup_eq_table(dev); | ||
2657 | mlx4_cleanup_mcg_table(dev); | ||
2658 | mlx4_cleanup_mr_table(dev); | ||
2659 | mlx4_cleanup_xrcd_table(dev); | ||
2660 | mlx4_cleanup_pd_table(dev); | ||
2680 | 2661 | ||
2681 | kfree(priv); | 2662 | if (mlx4_is_master(dev)) |
2682 | pci_release_regions(pdev); | 2663 | mlx4_free_resource_tracker(dev, |
2683 | pci_disable_device(pdev); | 2664 | RES_TR_FREE_STRUCTS_ONLY); |
2684 | pci_set_drvdata(pdev, NULL); | 2665 | |
2666 | iounmap(priv->kar); | ||
2667 | mlx4_uar_free(dev, &priv->driver_uar); | ||
2668 | mlx4_cleanup_uar_table(dev); | ||
2669 | if (!mlx4_is_slave(dev)) | ||
2670 | mlx4_clear_steering(dev); | ||
2671 | mlx4_free_eq_table(dev); | ||
2672 | if (mlx4_is_master(dev)) | ||
2673 | mlx4_multi_func_cleanup(dev); | ||
2674 | mlx4_close_hca(dev); | ||
2675 | if (mlx4_is_slave(dev)) | ||
2676 | mlx4_multi_func_cleanup(dev); | ||
2677 | mlx4_cmd_cleanup(dev); | ||
2678 | |||
2679 | if (dev->flags & MLX4_FLAG_MSI_X) | ||
2680 | pci_disable_msix(pdev); | ||
2681 | if (dev->flags & MLX4_FLAG_SRIOV) { | ||
2682 | mlx4_warn(dev, "Disabling SR-IOV\n"); | ||
2683 | pci_disable_sriov(pdev); | ||
2684 | dev->num_vfs = 0; | ||
2685 | } | 2685 | } |
2686 | |||
2687 | if (!mlx4_is_slave(dev)) | ||
2688 | mlx4_free_ownership(dev); | ||
2689 | |||
2690 | kfree(dev->caps.qp0_tunnel); | ||
2691 | kfree(dev->caps.qp0_proxy); | ||
2692 | kfree(dev->caps.qp1_tunnel); | ||
2693 | kfree(dev->caps.qp1_proxy); | ||
2694 | kfree(dev->dev_vfs); | ||
2695 | |||
2696 | pci_release_regions(pdev); | ||
2697 | pci_disable_device(pdev); | ||
2698 | memset(priv, 0, sizeof(*priv)); | ||
2699 | priv->pci_dev_data = pci_dev_data; | ||
2700 | priv->removed = 1; | ||
2701 | } | ||
2702 | |||
2703 | static void mlx4_remove_one(struct pci_dev *pdev) | ||
2704 | { | ||
2705 | struct mlx4_dev *dev = pci_get_drvdata(pdev); | ||
2706 | struct mlx4_priv *priv = mlx4_priv(dev); | ||
2707 | |||
2708 | __mlx4_remove_one(pdev); | ||
2709 | kfree(priv); | ||
2710 | pci_set_drvdata(pdev, NULL); | ||
2686 | } | 2711 | } |
2687 | 2712 | ||
2688 | int mlx4_restart_one(struct pci_dev *pdev) | 2713 | int mlx4_restart_one(struct pci_dev *pdev) |
@@ -2692,7 +2717,7 @@ int mlx4_restart_one(struct pci_dev *pdev) | |||
2692 | int pci_dev_data; | 2717 | int pci_dev_data; |
2693 | 2718 | ||
2694 | pci_dev_data = priv->pci_dev_data; | 2719 | pci_dev_data = priv->pci_dev_data; |
2695 | mlx4_remove_one(pdev); | 2720 | __mlx4_remove_one(pdev); |
2696 | return __mlx4_init_one(pdev, pci_dev_data); | 2721 | return __mlx4_init_one(pdev, pci_dev_data); |
2697 | } | 2722 | } |
2698 | 2723 | ||
@@ -2747,7 +2772,7 @@ MODULE_DEVICE_TABLE(pci, mlx4_pci_table); | |||
2747 | static pci_ers_result_t mlx4_pci_err_detected(struct pci_dev *pdev, | 2772 | static pci_ers_result_t mlx4_pci_err_detected(struct pci_dev *pdev, |
2748 | pci_channel_state_t state) | 2773 | pci_channel_state_t state) |
2749 | { | 2774 | { |
2750 | mlx4_remove_one(pdev); | 2775 | __mlx4_remove_one(pdev); |
2751 | 2776 | ||
2752 | return state == pci_channel_io_perm_failure ? | 2777 | return state == pci_channel_io_perm_failure ? |
2753 | PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_NEED_RESET; | 2778 | PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_NEED_RESET; |
@@ -2755,11 +2780,11 @@ static pci_ers_result_t mlx4_pci_err_detected(struct pci_dev *pdev, | |||
2755 | 2780 | ||
2756 | static pci_ers_result_t mlx4_pci_slot_reset(struct pci_dev *pdev) | 2781 | static pci_ers_result_t mlx4_pci_slot_reset(struct pci_dev *pdev) |
2757 | { | 2782 | { |
2758 | const struct pci_device_id *id; | 2783 | struct mlx4_dev *dev = pci_get_drvdata(pdev); |
2759 | int ret; | 2784 | struct mlx4_priv *priv = mlx4_priv(dev); |
2785 | int ret; | ||
2760 | 2786 | ||
2761 | id = pci_match_id(mlx4_pci_table, pdev); | 2787 | ret = __mlx4_init_one(pdev, priv->pci_dev_data); |
2762 | ret = __mlx4_init_one(pdev, id->driver_data); | ||
2763 | 2788 | ||
2764 | return ret ? PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_RECOVERED; | 2789 | return ret ? PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_RECOVERED; |
2765 | } | 2790 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h index cf8be41abb36..f9c465101963 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h | |||
@@ -800,6 +800,7 @@ struct mlx4_priv { | |||
800 | spinlock_t ctx_lock; | 800 | spinlock_t ctx_lock; |
801 | 801 | ||
802 | int pci_dev_data; | 802 | int pci_dev_data; |
803 | int removed; | ||
803 | 804 | ||
804 | struct list_head pgdir_list; | 805 | struct list_head pgdir_list; |
805 | struct mutex pgdir_mutex; | 806 | struct mutex pgdir_mutex; |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c index b48737dcd3c5..ba20c721ee97 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c | |||
@@ -2139,8 +2139,6 @@ static int qlcnic_83xx_get_nic_configuration(struct qlcnic_adapter *adapter) | |||
2139 | ahw->max_mac_filters = nic_info.max_mac_filters; | 2139 | ahw->max_mac_filters = nic_info.max_mac_filters; |
2140 | ahw->max_mtu = nic_info.max_mtu; | 2140 | ahw->max_mtu = nic_info.max_mtu; |
2141 | 2141 | ||
2142 | adapter->max_tx_rings = ahw->max_tx_ques; | ||
2143 | adapter->max_sds_rings = ahw->max_rx_ques; | ||
2144 | /* eSwitch capability indicates vNIC mode. | 2142 | /* eSwitch capability indicates vNIC mode. |
2145 | * vNIC and SRIOV are mutually exclusive operational modes. | 2143 | * vNIC and SRIOV are mutually exclusive operational modes. |
2146 | * If SR-IOV capability is detected, SR-IOV physical function | 2144 | * If SR-IOV capability is detected, SR-IOV physical function |
@@ -2161,6 +2159,7 @@ static int qlcnic_83xx_get_nic_configuration(struct qlcnic_adapter *adapter) | |||
2161 | int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter) | 2159 | int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter) |
2162 | { | 2160 | { |
2163 | struct qlcnic_hardware_context *ahw = adapter->ahw; | 2161 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
2162 | u16 max_sds_rings, max_tx_rings; | ||
2164 | int ret; | 2163 | int ret; |
2165 | 2164 | ||
2166 | ret = qlcnic_83xx_get_nic_configuration(adapter); | 2165 | ret = qlcnic_83xx_get_nic_configuration(adapter); |
@@ -2173,18 +2172,21 @@ int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter) | |||
2173 | if (qlcnic_83xx_config_vnic_opmode(adapter)) | 2172 | if (qlcnic_83xx_config_vnic_opmode(adapter)) |
2174 | return -EIO; | 2173 | return -EIO; |
2175 | 2174 | ||
2176 | adapter->max_sds_rings = QLCNIC_MAX_VNIC_SDS_RINGS; | 2175 | max_sds_rings = QLCNIC_MAX_VNIC_SDS_RINGS; |
2177 | adapter->max_tx_rings = QLCNIC_MAX_VNIC_TX_RINGS; | 2176 | max_tx_rings = QLCNIC_MAX_VNIC_TX_RINGS; |
2178 | } else if (ret == QLC_83XX_DEFAULT_OPMODE) { | 2177 | } else if (ret == QLC_83XX_DEFAULT_OPMODE) { |
2179 | ahw->nic_mode = QLCNIC_DEFAULT_MODE; | 2178 | ahw->nic_mode = QLCNIC_DEFAULT_MODE; |
2180 | adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver; | 2179 | adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver; |
2181 | ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry; | 2180 | ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry; |
2182 | adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS; | 2181 | max_sds_rings = QLCNIC_MAX_SDS_RINGS; |
2183 | adapter->max_tx_rings = QLCNIC_MAX_TX_RINGS; | 2182 | max_tx_rings = QLCNIC_MAX_TX_RINGS; |
2184 | } else { | 2183 | } else { |
2185 | return -EIO; | 2184 | return -EIO; |
2186 | } | 2185 | } |
2187 | 2186 | ||
2187 | adapter->max_sds_rings = min(ahw->max_rx_ques, max_sds_rings); | ||
2188 | adapter->max_tx_rings = min(ahw->max_tx_ques, max_tx_rings); | ||
2189 | |||
2188 | return 0; | 2190 | return 0; |
2189 | } | 2191 | } |
2190 | 2192 | ||
@@ -2348,15 +2350,16 @@ int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac) | |||
2348 | goto disable_intr; | 2350 | goto disable_intr; |
2349 | } | 2351 | } |
2350 | 2352 | ||
2353 | INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work); | ||
2354 | |||
2351 | err = qlcnic_83xx_setup_mbx_intr(adapter); | 2355 | err = qlcnic_83xx_setup_mbx_intr(adapter); |
2352 | if (err) | 2356 | if (err) |
2353 | goto disable_mbx_intr; | 2357 | goto disable_mbx_intr; |
2354 | 2358 | ||
2355 | qlcnic_83xx_clear_function_resources(adapter); | 2359 | qlcnic_83xx_clear_function_resources(adapter); |
2356 | 2360 | qlcnic_dcb_enable(adapter->dcb); | |
2357 | INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work); | ||
2358 | |||
2359 | qlcnic_83xx_initialize_nic(adapter, 1); | 2361 | qlcnic_83xx_initialize_nic(adapter, 1); |
2362 | qlcnic_dcb_get_info(adapter->dcb); | ||
2360 | 2363 | ||
2361 | /* Configure default, SR-IOV or Virtual NIC mode of operation */ | 2364 | /* Configure default, SR-IOV or Virtual NIC mode of operation */ |
2362 | err = qlcnic_83xx_configure_opmode(adapter); | 2365 | err = qlcnic_83xx_configure_opmode(adapter); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c index 64dcbf33d8f0..c1e11f5715b0 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c | |||
@@ -883,8 +883,6 @@ int qlcnic_82xx_get_nic_info(struct qlcnic_adapter *adapter, | |||
883 | npar_info->max_rx_ques = le16_to_cpu(nic_info->max_rx_ques); | 883 | npar_info->max_rx_ques = le16_to_cpu(nic_info->max_rx_ques); |
884 | npar_info->capabilities = le32_to_cpu(nic_info->capabilities); | 884 | npar_info->capabilities = le32_to_cpu(nic_info->capabilities); |
885 | npar_info->max_mtu = le16_to_cpu(nic_info->max_mtu); | 885 | npar_info->max_mtu = le16_to_cpu(nic_info->max_mtu); |
886 | adapter->max_tx_rings = npar_info->max_tx_ques; | ||
887 | adapter->max_sds_rings = npar_info->max_rx_ques; | ||
888 | } | 886 | } |
889 | 887 | ||
890 | qlcnic_free_mbx_args(&cmd); | 888 | qlcnic_free_mbx_args(&cmd); |
@@ -1356,6 +1354,7 @@ int qlcnic_config_switch_port(struct qlcnic_adapter *adapter, | |||
1356 | arg2 &= ~BIT_3; | 1354 | arg2 &= ~BIT_3; |
1357 | break; | 1355 | break; |
1358 | case QLCNIC_ADD_VLAN: | 1356 | case QLCNIC_ADD_VLAN: |
1357 | arg1 &= ~(0x0ffff << 16); | ||
1359 | arg1 |= (BIT_2 | BIT_5); | 1358 | arg1 |= (BIT_2 | BIT_5); |
1360 | arg1 |= (esw_cfg->vlan_id << 16); | 1359 | arg1 |= (esw_cfg->vlan_id << 16); |
1361 | break; | 1360 | break; |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c index 7d4f54912bad..a51fe18f09a8 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c | |||
@@ -330,8 +330,6 @@ static int __qlcnic_dcb_attach(struct qlcnic_dcb *dcb) | |||
330 | goto out_free_cfg; | 330 | goto out_free_cfg; |
331 | } | 331 | } |
332 | 332 | ||
333 | qlcnic_dcb_get_info(dcb); | ||
334 | |||
335 | return 0; | 333 | return 0; |
336 | out_free_cfg: | 334 | out_free_cfg: |
337 | kfree(dcb->cfg); | 335 | kfree(dcb->cfg); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c index 309d05640883..dbf75393f758 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | |||
@@ -670,7 +670,7 @@ int qlcnic_setup_tss_rss_intr(struct qlcnic_adapter *adapter) | |||
670 | else | 670 | else |
671 | num_msix += adapter->drv_tx_rings; | 671 | num_msix += adapter->drv_tx_rings; |
672 | 672 | ||
673 | if (adapter->drv_rss_rings > 0) | 673 | if (adapter->drv_rss_rings > 0) |
674 | num_msix += adapter->drv_rss_rings; | 674 | num_msix += adapter->drv_rss_rings; |
675 | else | 675 | else |
676 | num_msix += adapter->drv_sds_rings; | 676 | num_msix += adapter->drv_sds_rings; |
@@ -686,19 +686,15 @@ int qlcnic_setup_tss_rss_intr(struct qlcnic_adapter *adapter) | |||
686 | return -ENOMEM; | 686 | return -ENOMEM; |
687 | } | 687 | } |
688 | 688 | ||
689 | restore: | ||
690 | for (vector = 0; vector < num_msix; vector++) | 689 | for (vector = 0; vector < num_msix; vector++) |
691 | adapter->msix_entries[vector].entry = vector; | 690 | adapter->msix_entries[vector].entry = vector; |
692 | 691 | ||
692 | restore: | ||
693 | err = pci_enable_msix(pdev, adapter->msix_entries, num_msix); | 693 | err = pci_enable_msix(pdev, adapter->msix_entries, num_msix); |
694 | if (err == 0) { | 694 | if (err > 0) { |
695 | adapter->ahw->num_msix = num_msix; | 695 | if (!adapter->drv_tss_rings && !adapter->drv_rss_rings) |
696 | if (adapter->drv_tss_rings > 0) | 696 | return -ENOSPC; |
697 | adapter->drv_tx_rings = adapter->drv_tss_rings; | ||
698 | 697 | ||
699 | if (adapter->drv_rss_rings > 0) | ||
700 | adapter->drv_sds_rings = adapter->drv_rss_rings; | ||
701 | } else { | ||
702 | netdev_info(adapter->netdev, | 698 | netdev_info(adapter->netdev, |
703 | "Unable to allocate %d MSI-X vectors, Available vectors %d\n", | 699 | "Unable to allocate %d MSI-X vectors, Available vectors %d\n", |
704 | num_msix, err); | 700 | num_msix, err); |
@@ -716,12 +712,20 @@ restore: | |||
716 | "Restoring %d Tx, %d SDS rings for total %d vectors.\n", | 712 | "Restoring %d Tx, %d SDS rings for total %d vectors.\n", |
717 | adapter->drv_tx_rings, adapter->drv_sds_rings, | 713 | adapter->drv_tx_rings, adapter->drv_sds_rings, |
718 | num_msix); | 714 | num_msix); |
719 | goto restore; | ||
720 | 715 | ||
721 | err = -EIO; | 716 | goto restore; |
717 | } else if (err < 0) { | ||
718 | return err; | ||
722 | } | 719 | } |
723 | 720 | ||
724 | return err; | 721 | adapter->ahw->num_msix = num_msix; |
722 | if (adapter->drv_tss_rings > 0) | ||
723 | adapter->drv_tx_rings = adapter->drv_tss_rings; | ||
724 | |||
725 | if (adapter->drv_rss_rings > 0) | ||
726 | adapter->drv_sds_rings = adapter->drv_rss_rings; | ||
727 | |||
728 | return 0; | ||
725 | } | 729 | } |
726 | 730 | ||
727 | int qlcnic_enable_msix(struct qlcnic_adapter *adapter, u32 num_msix) | 731 | int qlcnic_enable_msix(struct qlcnic_adapter *adapter, u32 num_msix) |
@@ -2528,8 +2532,6 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
2528 | goto err_out_free_hw; | 2532 | goto err_out_free_hw; |
2529 | } | 2533 | } |
2530 | 2534 | ||
2531 | qlcnic_dcb_enable(adapter->dcb); | ||
2532 | |||
2533 | if (qlcnic_read_mac_addr(adapter)) | 2535 | if (qlcnic_read_mac_addr(adapter)) |
2534 | dev_warn(&pdev->dev, "failed to read mac addr\n"); | 2536 | dev_warn(&pdev->dev, "failed to read mac addr\n"); |
2535 | 2537 | ||
@@ -2549,7 +2551,10 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
2549 | "Device does not support MSI interrupts\n"); | 2551 | "Device does not support MSI interrupts\n"); |
2550 | 2552 | ||
2551 | if (qlcnic_82xx_check(adapter)) { | 2553 | if (qlcnic_82xx_check(adapter)) { |
2554 | qlcnic_dcb_enable(adapter->dcb); | ||
2555 | qlcnic_dcb_get_info(adapter->dcb); | ||
2552 | err = qlcnic_setup_intr(adapter); | 2556 | err = qlcnic_setup_intr(adapter); |
2557 | |||
2553 | if (err) { | 2558 | if (err) { |
2554 | dev_err(&pdev->dev, "Failed to setup interrupt\n"); | 2559 | dev_err(&pdev->dev, "Failed to setup interrupt\n"); |
2555 | goto err_out_disable_msi; | 2560 | goto err_out_disable_msi; |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c index 14f748cbf0de..280137991544 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c | |||
@@ -461,6 +461,16 @@ static int qlcnic_pci_sriov_disable(struct qlcnic_adapter *adapter) | |||
461 | { | 461 | { |
462 | struct net_device *netdev = adapter->netdev; | 462 | struct net_device *netdev = adapter->netdev; |
463 | 463 | ||
464 | if (pci_vfs_assigned(adapter->pdev)) { | ||
465 | netdev_err(adapter->netdev, | ||
466 | "SR-IOV VFs belonging to port %d are assigned to VMs. SR-IOV can not be disabled on this port\n", | ||
467 | adapter->portnum); | ||
468 | netdev_info(adapter->netdev, | ||
469 | "Please detach SR-IOV VFs belonging to port %d from VMs, and then try to disable SR-IOV on this port\n", | ||
470 | adapter->portnum); | ||
471 | return -EPERM; | ||
472 | } | ||
473 | |||
464 | rtnl_lock(); | 474 | rtnl_lock(); |
465 | if (netif_running(netdev)) | 475 | if (netif_running(netdev)) |
466 | __qlcnic_down(adapter, netdev); | 476 | __qlcnic_down(adapter, netdev); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c index 448d156c3d08..cd346e27f2e1 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c | |||
@@ -354,7 +354,7 @@ int qlcnic_is_valid_nic_func(struct qlcnic_adapter *adapter, u8 pci_func) | |||
354 | { | 354 | { |
355 | int i; | 355 | int i; |
356 | 356 | ||
357 | for (i = 0; i < adapter->ahw->max_vnic_func; i++) { | 357 | for (i = 0; i < adapter->ahw->total_nic_func; i++) { |
358 | if (adapter->npars[i].pci_func == pci_func) | 358 | if (adapter->npars[i].pci_func == pci_func) |
359 | return i; | 359 | return i; |
360 | } | 360 | } |
@@ -720,6 +720,7 @@ static ssize_t qlcnic_sysfs_read_npar_config(struct file *file, | |||
720 | struct qlcnic_adapter *adapter = dev_get_drvdata(dev); | 720 | struct qlcnic_adapter *adapter = dev_get_drvdata(dev); |
721 | struct qlcnic_npar_func_cfg *np_cfg; | 721 | struct qlcnic_npar_func_cfg *np_cfg; |
722 | struct qlcnic_info nic_info; | 722 | struct qlcnic_info nic_info; |
723 | u8 pci_func; | ||
723 | int i, ret; | 724 | int i, ret; |
724 | u32 count; | 725 | u32 count; |
725 | 726 | ||
@@ -729,26 +730,28 @@ static ssize_t qlcnic_sysfs_read_npar_config(struct file *file, | |||
729 | 730 | ||
730 | count = size / sizeof(struct qlcnic_npar_func_cfg); | 731 | count = size / sizeof(struct qlcnic_npar_func_cfg); |
731 | for (i = 0; i < adapter->ahw->total_nic_func; i++) { | 732 | for (i = 0; i < adapter->ahw->total_nic_func; i++) { |
732 | if (qlcnic_is_valid_nic_func(adapter, i) < 0) | ||
733 | continue; | ||
734 | if (adapter->npars[i].pci_func >= count) { | 733 | if (adapter->npars[i].pci_func >= count) { |
735 | dev_dbg(dev, "%s: Total nic functions[%d], App sent function count[%d]\n", | 734 | dev_dbg(dev, "%s: Total nic functions[%d], App sent function count[%d]\n", |
736 | __func__, adapter->ahw->total_nic_func, count); | 735 | __func__, adapter->ahw->total_nic_func, count); |
737 | continue; | 736 | continue; |
738 | } | 737 | } |
739 | ret = qlcnic_get_nic_info(adapter, &nic_info, i); | ||
740 | if (ret) | ||
741 | return ret; | ||
742 | if (!adapter->npars[i].eswitch_status) | 738 | if (!adapter->npars[i].eswitch_status) |
743 | continue; | 739 | continue; |
744 | np_cfg[i].pci_func = i; | 740 | pci_func = adapter->npars[i].pci_func; |
745 | np_cfg[i].op_mode = (u8)nic_info.op_mode; | 741 | if (qlcnic_is_valid_nic_func(adapter, pci_func) < 0) |
746 | np_cfg[i].port_num = nic_info.phys_port; | 742 | continue; |
747 | np_cfg[i].fw_capab = nic_info.capabilities; | 743 | ret = qlcnic_get_nic_info(adapter, &nic_info, pci_func); |
748 | np_cfg[i].min_bw = nic_info.min_tx_bw; | 744 | if (ret) |
749 | np_cfg[i].max_bw = nic_info.max_tx_bw; | 745 | return ret; |
750 | np_cfg[i].max_tx_queues = nic_info.max_tx_ques; | 746 | |
751 | np_cfg[i].max_rx_queues = nic_info.max_rx_ques; | 747 | np_cfg[pci_func].pci_func = pci_func; |
748 | np_cfg[pci_func].op_mode = (u8)nic_info.op_mode; | ||
749 | np_cfg[pci_func].port_num = nic_info.phys_port; | ||
750 | np_cfg[pci_func].fw_capab = nic_info.capabilities; | ||
751 | np_cfg[pci_func].min_bw = nic_info.min_tx_bw; | ||
752 | np_cfg[pci_func].max_bw = nic_info.max_tx_bw; | ||
753 | np_cfg[pci_func].max_tx_queues = nic_info.max_tx_ques; | ||
754 | np_cfg[pci_func].max_rx_queues = nic_info.max_rx_ques; | ||
752 | } | 755 | } |
753 | return size; | 756 | return size; |
754 | } | 757 | } |
diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c index 430bb0db9bc4..e36f194673a4 100644 --- a/drivers/net/ieee802154/at86rf230.c +++ b/drivers/net/ieee802154/at86rf230.c | |||
@@ -365,7 +365,7 @@ __at86rf230_read_subreg(struct at86rf230_local *lp, | |||
365 | dev_vdbg(&lp->spi->dev, "buf[1] = %02x\n", buf[1]); | 365 | dev_vdbg(&lp->spi->dev, "buf[1] = %02x\n", buf[1]); |
366 | 366 | ||
367 | if (status == 0) | 367 | if (status == 0) |
368 | *data = buf[1]; | 368 | *data = (buf[1] & mask) >> shift; |
369 | 369 | ||
370 | return status; | 370 | return status; |
371 | } | 371 | } |
@@ -1025,14 +1025,6 @@ static int at86rf230_hw_init(struct at86rf230_local *lp) | |||
1025 | return -EINVAL; | 1025 | return -EINVAL; |
1026 | } | 1026 | } |
1027 | 1027 | ||
1028 | rc = at86rf230_read_subreg(lp, SR_AVDD_OK, &status); | ||
1029 | if (rc) | ||
1030 | return rc; | ||
1031 | if (!status) { | ||
1032 | dev_err(&lp->spi->dev, "AVDD error\n"); | ||
1033 | return -EINVAL; | ||
1034 | } | ||
1035 | |||
1036 | return 0; | 1028 | return 0; |
1037 | } | 1029 | } |
1038 | 1030 | ||
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index c55e316373a1..82355d5d155a 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
@@ -1755,8 +1755,8 @@ int vxlan_xmit_skb(struct vxlan_sock *vs, | |||
1755 | if (err) | 1755 | if (err) |
1756 | return err; | 1756 | return err; |
1757 | 1757 | ||
1758 | return iptunnel_xmit(rt, skb, src, dst, IPPROTO_UDP, tos, ttl, df, | 1758 | return iptunnel_xmit(vs->sock->sk, rt, skb, src, dst, IPPROTO_UDP, |
1759 | false); | 1759 | tos, ttl, df, false); |
1760 | } | 1760 | } |
1761 | EXPORT_SYMBOL_GPL(vxlan_xmit_skb); | 1761 | EXPORT_SYMBOL_GPL(vxlan_xmit_skb); |
1762 | 1762 | ||
diff --git a/drivers/net/wan/cosa.c b/drivers/net/wan/cosa.c index 84734a805092..83c39e2858bf 100644 --- a/drivers/net/wan/cosa.c +++ b/drivers/net/wan/cosa.c | |||
@@ -1521,11 +1521,7 @@ static int cosa_reset_and_read_id(struct cosa_data *cosa, char *idstring) | |||
1521 | cosa_putstatus(cosa, 0); | 1521 | cosa_putstatus(cosa, 0); |
1522 | cosa_getdata8(cosa); | 1522 | cosa_getdata8(cosa); |
1523 | cosa_putstatus(cosa, SR_RST); | 1523 | cosa_putstatus(cosa, SR_RST); |
1524 | #ifdef MODULE | ||
1525 | msleep(500); | 1524 | msleep(500); |
1526 | #else | ||
1527 | udelay(5*100000); | ||
1528 | #endif | ||
1529 | /* Disable all IRQs from the card */ | 1525 | /* Disable all IRQs from the card */ |
1530 | cosa_putstatus(cosa, 0); | 1526 | cosa_putstatus(cosa, 0); |
1531 | 1527 | ||