diff options
Diffstat (limited to 'drivers/net')
| -rw-r--r-- | drivers/net/can/usb/ems_usb.c | 3 | ||||
| -rw-r--r-- | drivers/net/can/usb/peak_usb/pcan_usb_pro.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 47 | ||||
| -rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c | 65 | ||||
| -rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | 19 | ||||
| -rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | 10 | ||||
| -rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 2 | ||||
| -rw-r--r-- | drivers/net/hyperv/netvsc_drv.c | 1 | ||||
| -rw-r--r-- | drivers/net/xen-netback/netback.c | 3 |
10 files changed, 81 insertions, 73 deletions
diff --git a/drivers/net/can/usb/ems_usb.c b/drivers/net/can/usb/ems_usb.c index 5f9a7ad9b964..8aeec0b4601a 100644 --- a/drivers/net/can/usb/ems_usb.c +++ b/drivers/net/can/usb/ems_usb.c | |||
| @@ -625,6 +625,7 @@ static int ems_usb_start(struct ems_usb *dev) | |||
| 625 | usb_unanchor_urb(urb); | 625 | usb_unanchor_urb(urb); |
| 626 | usb_free_coherent(dev->udev, RX_BUFFER_SIZE, buf, | 626 | usb_free_coherent(dev->udev, RX_BUFFER_SIZE, buf, |
| 627 | urb->transfer_dma); | 627 | urb->transfer_dma); |
| 628 | usb_free_urb(urb); | ||
| 628 | break; | 629 | break; |
| 629 | } | 630 | } |
| 630 | 631 | ||
| @@ -798,8 +799,8 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne | |||
| 798 | * allowed (MAX_TX_URBS). | 799 | * allowed (MAX_TX_URBS). |
| 799 | */ | 800 | */ |
| 800 | if (!context) { | 801 | if (!context) { |
| 801 | usb_unanchor_urb(urb); | ||
| 802 | usb_free_coherent(dev->udev, size, buf, urb->transfer_dma); | 802 | usb_free_coherent(dev->udev, size, buf, urb->transfer_dma); |
| 803 | usb_free_urb(urb); | ||
| 803 | 804 | ||
| 804 | netdev_warn(netdev, "couldn't find free context\n"); | 805 | netdev_warn(netdev, "couldn't find free context\n"); |
| 805 | 806 | ||
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c index 8ee9d1556e6e..263dd921edc4 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c +++ b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c | |||
| @@ -927,6 +927,9 @@ static int pcan_usb_pro_init(struct peak_usb_device *dev) | |||
| 927 | /* set LED in default state (end of init phase) */ | 927 | /* set LED in default state (end of init phase) */ |
| 928 | pcan_usb_pro_set_led(dev, 0, 1); | 928 | pcan_usb_pro_set_led(dev, 0, 1); |
| 929 | 929 | ||
| 930 | kfree(bi); | ||
| 931 | kfree(fi); | ||
| 932 | |||
| 930 | return 0; | 933 | return 0; |
| 931 | 934 | ||
| 932 | err_out: | 935 | err_out: |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c index b1cb0ffb15c7..6055d397a29e 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | |||
| @@ -447,8 +447,9 @@ irqreturn_t qlcnic_83xx_intr(int irq, void *data) | |||
| 447 | 447 | ||
| 448 | qlcnic_83xx_poll_process_aen(adapter); | 448 | qlcnic_83xx_poll_process_aen(adapter); |
| 449 | 449 | ||
| 450 | if (ahw->diag_test == QLCNIC_INTERRUPT_TEST) { | 450 | if (ahw->diag_test) { |
| 451 | ahw->diag_cnt++; | 451 | if (ahw->diag_test == QLCNIC_INTERRUPT_TEST) |
| 452 | ahw->diag_cnt++; | ||
| 452 | qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter); | 453 | qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter); |
| 453 | return IRQ_HANDLED; | 454 | return IRQ_HANDLED; |
| 454 | } | 455 | } |
| @@ -1345,11 +1346,6 @@ static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test, | |||
| 1345 | } | 1346 | } |
| 1346 | 1347 | ||
| 1347 | if (adapter->ahw->diag_test == QLCNIC_LOOPBACK_TEST) { | 1348 | if (adapter->ahw->diag_test == QLCNIC_LOOPBACK_TEST) { |
| 1348 | /* disable and free mailbox interrupt */ | ||
| 1349 | if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) { | ||
| 1350 | qlcnic_83xx_enable_mbx_poll(adapter); | ||
| 1351 | qlcnic_83xx_free_mbx_intr(adapter); | ||
| 1352 | } | ||
| 1353 | adapter->ahw->loopback_state = 0; | 1349 | adapter->ahw->loopback_state = 0; |
| 1354 | adapter->ahw->hw_ops->setup_link_event(adapter, 1); | 1350 | adapter->ahw->hw_ops->setup_link_event(adapter, 1); |
| 1355 | } | 1351 | } |
| @@ -1363,33 +1359,20 @@ static void qlcnic_83xx_diag_free_res(struct net_device *netdev, | |||
| 1363 | { | 1359 | { |
| 1364 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 1360 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
| 1365 | struct qlcnic_host_sds_ring *sds_ring; | 1361 | struct qlcnic_host_sds_ring *sds_ring; |
| 1366 | int ring, err; | 1362 | int ring; |
| 1367 | 1363 | ||
| 1368 | clear_bit(__QLCNIC_DEV_UP, &adapter->state); | 1364 | clear_bit(__QLCNIC_DEV_UP, &adapter->state); |
| 1369 | if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { | 1365 | if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { |
| 1370 | for (ring = 0; ring < adapter->drv_sds_rings; ring++) { | 1366 | for (ring = 0; ring < adapter->drv_sds_rings; ring++) { |
| 1371 | sds_ring = &adapter->recv_ctx->sds_rings[ring]; | 1367 | sds_ring = &adapter->recv_ctx->sds_rings[ring]; |
| 1372 | qlcnic_83xx_disable_intr(adapter, sds_ring); | 1368 | if (adapter->flags & QLCNIC_MSIX_ENABLED) |
| 1373 | if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) | 1369 | qlcnic_83xx_disable_intr(adapter, sds_ring); |
| 1374 | qlcnic_83xx_enable_mbx_poll(adapter); | ||
| 1375 | } | 1370 | } |
| 1376 | } | 1371 | } |
| 1377 | 1372 | ||
| 1378 | qlcnic_fw_destroy_ctx(adapter); | 1373 | qlcnic_fw_destroy_ctx(adapter); |
| 1379 | qlcnic_detach(adapter); | 1374 | qlcnic_detach(adapter); |
| 1380 | 1375 | ||
| 1381 | if (adapter->ahw->diag_test == QLCNIC_LOOPBACK_TEST) { | ||
| 1382 | if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) { | ||
| 1383 | err = qlcnic_83xx_setup_mbx_intr(adapter); | ||
| 1384 | qlcnic_83xx_disable_mbx_poll(adapter); | ||
| 1385 | if (err) { | ||
| 1386 | dev_err(&adapter->pdev->dev, | ||
| 1387 | "%s: failed to setup mbx interrupt\n", | ||
| 1388 | __func__); | ||
| 1389 | goto out; | ||
| 1390 | } | ||
| 1391 | } | ||
| 1392 | } | ||
| 1393 | adapter->ahw->diag_test = 0; | 1376 | adapter->ahw->diag_test = 0; |
| 1394 | adapter->drv_sds_rings = drv_sds_rings; | 1377 | adapter->drv_sds_rings = drv_sds_rings; |
| 1395 | 1378 | ||
| @@ -1399,9 +1382,6 @@ static void qlcnic_83xx_diag_free_res(struct net_device *netdev, | |||
| 1399 | if (netif_running(netdev)) | 1382 | if (netif_running(netdev)) |
| 1400 | __qlcnic_up(adapter, netdev); | 1383 | __qlcnic_up(adapter, netdev); |
| 1401 | 1384 | ||
| 1402 | if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST && | ||
| 1403 | !(adapter->flags & QLCNIC_MSIX_ENABLED)) | ||
| 1404 | qlcnic_83xx_disable_mbx_poll(adapter); | ||
| 1405 | out: | 1385 | out: |
| 1406 | netif_device_attach(netdev); | 1386 | netif_device_attach(netdev); |
| 1407 | } | 1387 | } |
| @@ -3754,6 +3734,19 @@ static void qlcnic_83xx_decode_mbx_rsp(struct qlcnic_adapter *adapter, | |||
| 3754 | return; | 3734 | return; |
| 3755 | } | 3735 | } |
| 3756 | 3736 | ||
| 3737 | static inline void qlcnic_dump_mailbox_registers(struct qlcnic_adapter *adapter) | ||
| 3738 | { | ||
| 3739 | struct qlcnic_hardware_context *ahw = adapter->ahw; | ||
| 3740 | u32 offset; | ||
| 3741 | |||
| 3742 | offset = QLCRDX(ahw, QLCNIC_DEF_INT_MASK); | ||
| 3743 | dev_info(&adapter->pdev->dev, "Mbx interrupt mask=0x%x, Mbx interrupt enable=0x%x, Host mbx control=0x%x, Fw mbx control=0x%x", | ||
| 3744 | readl(ahw->pci_base0 + offset), | ||
| 3745 | QLCRDX(ahw, QLCNIC_MBX_INTR_ENBL), | ||
| 3746 | QLCRDX(ahw, QLCNIC_HOST_MBX_CTRL), | ||
| 3747 | QLCRDX(ahw, QLCNIC_FW_MBX_CTRL)); | ||
| 3748 | } | ||
| 3749 | |||
| 3757 | static void qlcnic_83xx_mailbox_worker(struct work_struct *work) | 3750 | static void qlcnic_83xx_mailbox_worker(struct work_struct *work) |
| 3758 | { | 3751 | { |
| 3759 | struct qlcnic_mailbox *mbx = container_of(work, struct qlcnic_mailbox, | 3752 | struct qlcnic_mailbox *mbx = container_of(work, struct qlcnic_mailbox, |
| @@ -3798,6 +3791,8 @@ static void qlcnic_83xx_mailbox_worker(struct work_struct *work) | |||
| 3798 | __func__, cmd->cmd_op, cmd->type, ahw->pci_func, | 3791 | __func__, cmd->cmd_op, cmd->type, ahw->pci_func, |
| 3799 | ahw->op_mode); | 3792 | ahw->op_mode); |
| 3800 | clear_bit(QLC_83XX_MBX_READY, &mbx->status); | 3793 | clear_bit(QLC_83XX_MBX_READY, &mbx->status); |
| 3794 | qlcnic_dump_mailbox_registers(adapter); | ||
| 3795 | qlcnic_83xx_get_mbx_data(adapter, cmd); | ||
| 3801 | qlcnic_dump_mbx(adapter, cmd); | 3796 | qlcnic_dump_mbx(adapter, cmd); |
| 3802 | qlcnic_83xx_idc_request_reset(adapter, | 3797 | qlcnic_83xx_idc_request_reset(adapter, |
| 3803 | QLCNIC_FORCE_FW_DUMP_KEY); | 3798 | QLCNIC_FORCE_FW_DUMP_KEY); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h index 4cae6caa6bfa..a6a33508e401 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h | |||
| @@ -662,4 +662,5 @@ pci_ers_result_t qlcnic_83xx_io_error_detected(struct pci_dev *, | |||
| 662 | pci_channel_state_t); | 662 | pci_channel_state_t); |
| 663 | pci_ers_result_t qlcnic_83xx_io_slot_reset(struct pci_dev *); | 663 | pci_ers_result_t qlcnic_83xx_io_slot_reset(struct pci_dev *); |
| 664 | void qlcnic_83xx_io_resume(struct pci_dev *); | 664 | void qlcnic_83xx_io_resume(struct pci_dev *); |
| 665 | void qlcnic_83xx_stop_hw(struct qlcnic_adapter *); | ||
| 665 | #endif | 666 | #endif |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c index 89208e5b25d6..918e18ddf038 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c | |||
| @@ -740,6 +740,7 @@ static int qlcnic_83xx_idc_unknown_state(struct qlcnic_adapter *adapter) | |||
| 740 | adapter->ahw->idc.err_code = -EIO; | 740 | adapter->ahw->idc.err_code = -EIO; |
| 741 | dev_err(&adapter->pdev->dev, | 741 | dev_err(&adapter->pdev->dev, |
| 742 | "%s: Device in unknown state\n", __func__); | 742 | "%s: Device in unknown state\n", __func__); |
| 743 | clear_bit(__QLCNIC_RESETTING, &adapter->state); | ||
| 743 | return 0; | 744 | return 0; |
| 744 | } | 745 | } |
| 745 | 746 | ||
| @@ -818,7 +819,6 @@ static int qlcnic_83xx_idc_ready_state(struct qlcnic_adapter *adapter) | |||
| 818 | struct qlcnic_hardware_context *ahw = adapter->ahw; | 819 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
| 819 | struct qlcnic_mailbox *mbx = ahw->mailbox; | 820 | struct qlcnic_mailbox *mbx = ahw->mailbox; |
| 820 | int ret = 0; | 821 | int ret = 0; |
| 821 | u32 owner; | ||
| 822 | u32 val; | 822 | u32 val; |
| 823 | 823 | ||
| 824 | /* Perform NIC configuration based ready state entry actions */ | 824 | /* Perform NIC configuration based ready state entry actions */ |
| @@ -848,9 +848,9 @@ static int qlcnic_83xx_idc_ready_state(struct qlcnic_adapter *adapter) | |||
| 848 | set_bit(__QLCNIC_RESETTING, &adapter->state); | 848 | set_bit(__QLCNIC_RESETTING, &adapter->state); |
| 849 | qlcnic_83xx_idc_enter_need_reset_state(adapter, 1); | 849 | qlcnic_83xx_idc_enter_need_reset_state(adapter, 1); |
| 850 | } else { | 850 | } else { |
| 851 | owner = qlcnic_83xx_idc_find_reset_owner_id(adapter); | 851 | netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n", |
| 852 | if (ahw->pci_func == owner) | 852 | __func__); |
| 853 | qlcnic_dump_fw(adapter); | 853 | qlcnic_83xx_idc_enter_failed_state(adapter, 1); |
| 854 | } | 854 | } |
| 855 | return -EIO; | 855 | return -EIO; |
| 856 | } | 856 | } |
| @@ -948,13 +948,26 @@ static int qlcnic_83xx_idc_need_quiesce_state(struct qlcnic_adapter *adapter) | |||
| 948 | return 0; | 948 | return 0; |
| 949 | } | 949 | } |
| 950 | 950 | ||
| 951 | static int qlcnic_83xx_idc_failed_state(struct qlcnic_adapter *adapter) | 951 | static void qlcnic_83xx_idc_failed_state(struct qlcnic_adapter *adapter) |
| 952 | { | 952 | { |
| 953 | dev_err(&adapter->pdev->dev, "%s: please restart!!\n", __func__); | 953 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
| 954 | u32 val, owner; | ||
| 955 | |||
| 956 | val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); | ||
| 957 | if (val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) { | ||
| 958 | owner = qlcnic_83xx_idc_find_reset_owner_id(adapter); | ||
| 959 | if (ahw->pci_func == owner) { | ||
| 960 | qlcnic_83xx_stop_hw(adapter); | ||
| 961 | qlcnic_dump_fw(adapter); | ||
| 962 | } | ||
| 963 | } | ||
| 964 | |||
| 965 | netdev_warn(adapter->netdev, "%s: Reboot will be required to recover the adapter!!\n", | ||
| 966 | __func__); | ||
| 954 | clear_bit(__QLCNIC_RESETTING, &adapter->state); | 967 | clear_bit(__QLCNIC_RESETTING, &adapter->state); |
| 955 | adapter->ahw->idc.err_code = -EIO; | 968 | ahw->idc.err_code = -EIO; |
| 956 | 969 | ||
| 957 | return 0; | 970 | return; |
| 958 | } | 971 | } |
| 959 | 972 | ||
| 960 | static int qlcnic_83xx_idc_quiesce_state(struct qlcnic_adapter *adapter) | 973 | static int qlcnic_83xx_idc_quiesce_state(struct qlcnic_adapter *adapter) |
| @@ -1063,12 +1076,6 @@ void qlcnic_83xx_idc_poll_dev_state(struct work_struct *work) | |||
| 1063 | adapter->ahw->idc.prev_state = adapter->ahw->idc.curr_state; | 1076 | adapter->ahw->idc.prev_state = adapter->ahw->idc.curr_state; |
| 1064 | qlcnic_83xx_periodic_tasks(adapter); | 1077 | qlcnic_83xx_periodic_tasks(adapter); |
| 1065 | 1078 | ||
| 1066 | /* Do not reschedule if firmaware is in hanged state and auto | ||
| 1067 | * recovery is disabled | ||
| 1068 | */ | ||
| 1069 | if ((adapter->flags & QLCNIC_FW_HANG) && !qlcnic_auto_fw_reset) | ||
| 1070 | return; | ||
| 1071 | |||
| 1072 | /* Re-schedule the function */ | 1079 | /* Re-schedule the function */ |
| 1073 | if (test_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status)) | 1080 | if (test_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status)) |
| 1074 | qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state, | 1081 | qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state, |
| @@ -1219,10 +1226,10 @@ void qlcnic_83xx_idc_request_reset(struct qlcnic_adapter *adapter, u32 key) | |||
| 1219 | } | 1226 | } |
| 1220 | 1227 | ||
| 1221 | val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); | 1228 | val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); |
| 1222 | if ((val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) || | 1229 | if (val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) { |
| 1223 | !qlcnic_auto_fw_reset) { | 1230 | netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n", |
| 1224 | dev_err(&adapter->pdev->dev, | 1231 | __func__); |
| 1225 | "%s:failed, device in non reset mode\n", __func__); | 1232 | qlcnic_83xx_idc_enter_failed_state(adapter, 0); |
| 1226 | qlcnic_83xx_unlock_driver(adapter); | 1233 | qlcnic_83xx_unlock_driver(adapter); |
| 1227 | return; | 1234 | return; |
| 1228 | } | 1235 | } |
| @@ -1254,24 +1261,24 @@ static int qlcnic_83xx_copy_bootloader(struct qlcnic_adapter *adapter) | |||
| 1254 | if (size & 0xF) | 1261 | if (size & 0xF) |
| 1255 | size = (size + 16) & ~0xF; | 1262 | size = (size + 16) & ~0xF; |
| 1256 | 1263 | ||
| 1257 | p_cache = kzalloc(size, GFP_KERNEL); | 1264 | p_cache = vzalloc(size); |
| 1258 | if (p_cache == NULL) | 1265 | if (p_cache == NULL) |
| 1259 | return -ENOMEM; | 1266 | return -ENOMEM; |
| 1260 | 1267 | ||
| 1261 | ret = qlcnic_83xx_lockless_flash_read32(adapter, src, p_cache, | 1268 | ret = qlcnic_83xx_lockless_flash_read32(adapter, src, p_cache, |
| 1262 | size / sizeof(u32)); | 1269 | size / sizeof(u32)); |
| 1263 | if (ret) { | 1270 | if (ret) { |
| 1264 | kfree(p_cache); | 1271 | vfree(p_cache); |
| 1265 | return ret; | 1272 | return ret; |
| 1266 | } | 1273 | } |
| 1267 | /* 16 byte write to MS memory */ | 1274 | /* 16 byte write to MS memory */ |
| 1268 | ret = qlcnic_83xx_ms_mem_write128(adapter, dest, (u32 *)p_cache, | 1275 | ret = qlcnic_83xx_ms_mem_write128(adapter, dest, (u32 *)p_cache, |
| 1269 | size / 16); | 1276 | size / 16); |
| 1270 | if (ret) { | 1277 | if (ret) { |
| 1271 | kfree(p_cache); | 1278 | vfree(p_cache); |
| 1272 | return ret; | 1279 | return ret; |
| 1273 | } | 1280 | } |
| 1274 | kfree(p_cache); | 1281 | vfree(p_cache); |
| 1275 | 1282 | ||
| 1276 | return ret; | 1283 | return ret; |
| 1277 | } | 1284 | } |
| @@ -1939,7 +1946,7 @@ static void qlcnic_83xx_exec_template_cmd(struct qlcnic_adapter *p_dev, | |||
| 1939 | p_dev->ahw->reset.seq_index = index; | 1946 | p_dev->ahw->reset.seq_index = index; |
| 1940 | } | 1947 | } |
| 1941 | 1948 | ||
| 1942 | static void qlcnic_83xx_stop_hw(struct qlcnic_adapter *p_dev) | 1949 | void qlcnic_83xx_stop_hw(struct qlcnic_adapter *p_dev) |
| 1943 | { | 1950 | { |
| 1944 | p_dev->ahw->reset.seq_index = 0; | 1951 | p_dev->ahw->reset.seq_index = 0; |
| 1945 | 1952 | ||
| @@ -1994,6 +2001,14 @@ static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter) | |||
| 1994 | val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); | 2001 | val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); |
| 1995 | if (!(val & QLC_83XX_IDC_GRACEFULL_RESET)) | 2002 | if (!(val & QLC_83XX_IDC_GRACEFULL_RESET)) |
| 1996 | qlcnic_dump_fw(adapter); | 2003 | qlcnic_dump_fw(adapter); |
| 2004 | |||
| 2005 | if (val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) { | ||
| 2006 | netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n", | ||
| 2007 | __func__); | ||
| 2008 | qlcnic_83xx_idc_enter_failed_state(adapter, 1); | ||
| 2009 | return err; | ||
| 2010 | } | ||
| 2011 | |||
| 1997 | qlcnic_83xx_init_hw(adapter); | 2012 | qlcnic_83xx_init_hw(adapter); |
| 1998 | 2013 | ||
| 1999 | if (qlcnic_83xx_copy_bootloader(adapter)) | 2014 | if (qlcnic_83xx_copy_bootloader(adapter)) |
| @@ -2073,8 +2088,8 @@ int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter) | |||
| 2073 | ahw->nic_mode = QLCNIC_DEFAULT_MODE; | 2088 | ahw->nic_mode = QLCNIC_DEFAULT_MODE; |
| 2074 | adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver; | 2089 | adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver; |
| 2075 | ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry; | 2090 | ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry; |
| 2076 | adapter->max_sds_rings = ahw->max_rx_ques; | 2091 | adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS; |
| 2077 | adapter->max_tx_rings = ahw->max_tx_ques; | 2092 | adapter->max_tx_rings = QLCNIC_MAX_TX_RINGS; |
| 2078 | } else { | 2093 | } else { |
| 2079 | return -EIO; | 2094 | return -EIO; |
| 2080 | } | 2095 | } |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c index b36c02fafcfd..e3be2760665c 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | |||
| @@ -667,30 +667,25 @@ qlcnic_set_ringparam(struct net_device *dev, | |||
| 667 | static int qlcnic_validate_ring_count(struct qlcnic_adapter *adapter, | 667 | static int qlcnic_validate_ring_count(struct qlcnic_adapter *adapter, |
| 668 | u8 rx_ring, u8 tx_ring) | 668 | u8 rx_ring, u8 tx_ring) |
| 669 | { | 669 | { |
| 670 | if (rx_ring == 0 || tx_ring == 0) | ||
| 671 | return -EINVAL; | ||
| 672 | |||
| 670 | if (rx_ring != 0) { | 673 | if (rx_ring != 0) { |
| 671 | if (rx_ring > adapter->max_sds_rings) { | 674 | if (rx_ring > adapter->max_sds_rings) { |
| 672 | netdev_err(adapter->netdev, "Invalid ring count, SDS ring count %d should not be greater than max %d driver sds rings.\n", | 675 | netdev_err(adapter->netdev, |
| 676 | "Invalid ring count, SDS ring count %d should not be greater than max %d driver sds rings.\n", | ||
| 673 | rx_ring, adapter->max_sds_rings); | 677 | rx_ring, adapter->max_sds_rings); |
| 674 | return -EINVAL; | 678 | return -EINVAL; |
| 675 | } | 679 | } |
| 676 | } | 680 | } |
| 677 | 681 | ||
| 678 | if (tx_ring != 0) { | 682 | if (tx_ring != 0) { |
| 679 | if (qlcnic_82xx_check(adapter) && | 683 | if (tx_ring > adapter->max_tx_rings) { |
| 680 | (tx_ring > adapter->max_tx_rings)) { | ||
| 681 | netdev_err(adapter->netdev, | 684 | netdev_err(adapter->netdev, |
| 682 | "Invalid ring count, Tx ring count %d should not be greater than max %d driver Tx rings.\n", | 685 | "Invalid ring count, Tx ring count %d should not be greater than max %d driver Tx rings.\n", |
| 683 | tx_ring, adapter->max_tx_rings); | 686 | tx_ring, adapter->max_tx_rings); |
| 684 | return -EINVAL; | 687 | return -EINVAL; |
| 685 | } | 688 | } |
| 686 | |||
| 687 | if (qlcnic_83xx_check(adapter) && | ||
| 688 | (tx_ring > QLCNIC_SINGLE_RING)) { | ||
| 689 | netdev_err(adapter->netdev, | ||
| 690 | "Invalid ring count, Tx ring count %d should not be greater than %d driver Tx rings.\n", | ||
| 691 | tx_ring, QLCNIC_SINGLE_RING); | ||
| 692 | return -EINVAL; | ||
| 693 | } | ||
| 694 | } | 689 | } |
| 695 | 690 | ||
| 696 | return 0; | 691 | return 0; |
| @@ -948,6 +943,7 @@ static int qlcnic_irq_test(struct net_device *netdev) | |||
| 948 | struct qlcnic_hardware_context *ahw = adapter->ahw; | 943 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
| 949 | struct qlcnic_cmd_args cmd; | 944 | struct qlcnic_cmd_args cmd; |
| 950 | int ret, drv_sds_rings = adapter->drv_sds_rings; | 945 | int ret, drv_sds_rings = adapter->drv_sds_rings; |
| 946 | int drv_tx_rings = adapter->drv_tx_rings; | ||
| 951 | 947 | ||
| 952 | if (qlcnic_83xx_check(adapter)) | 948 | if (qlcnic_83xx_check(adapter)) |
| 953 | return qlcnic_83xx_interrupt_test(netdev); | 949 | return qlcnic_83xx_interrupt_test(netdev); |
| @@ -980,6 +976,7 @@ free_diag_res: | |||
| 980 | 976 | ||
| 981 | clear_diag_irq: | 977 | clear_diag_irq: |
| 982 | adapter->drv_sds_rings = drv_sds_rings; | 978 | adapter->drv_sds_rings = drv_sds_rings; |
| 979 | adapter->drv_tx_rings = drv_tx_rings; | ||
| 983 | clear_bit(__QLCNIC_RESETTING, &adapter->state); | 980 | clear_bit(__QLCNIC_RESETTING, &adapter->state); |
| 984 | 981 | ||
| 985 | return ret; | 982 | return ret; |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c index 0149c9495347..eda6c691d897 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | |||
| @@ -687,17 +687,11 @@ void qlcnic_advert_link_change(struct qlcnic_adapter *adapter, int linkup) | |||
| 687 | if (adapter->ahw->linkup && !linkup) { | 687 | if (adapter->ahw->linkup && !linkup) { |
| 688 | netdev_info(netdev, "NIC Link is down\n"); | 688 | netdev_info(netdev, "NIC Link is down\n"); |
| 689 | adapter->ahw->linkup = 0; | 689 | adapter->ahw->linkup = 0; |
| 690 | if (netif_running(netdev)) { | 690 | netif_carrier_off(netdev); |
| 691 | netif_carrier_off(netdev); | ||
| 692 | netif_tx_stop_all_queues(netdev); | ||
| 693 | } | ||
| 694 | } else if (!adapter->ahw->linkup && linkup) { | 691 | } else if (!adapter->ahw->linkup && linkup) { |
| 695 | netdev_info(netdev, "NIC Link is up\n"); | 692 | netdev_info(netdev, "NIC Link is up\n"); |
| 696 | adapter->ahw->linkup = 1; | 693 | adapter->ahw->linkup = 1; |
| 697 | if (netif_running(netdev)) { | 694 | netif_carrier_on(netdev); |
| 698 | netif_carrier_on(netdev); | ||
| 699 | netif_wake_queue(netdev); | ||
| 700 | } | ||
| 701 | } | 695 | } |
| 702 | } | 696 | } |
| 703 | 697 | ||
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c index 05c1eef8df13..2c8cac0c6a55 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | |||
| @@ -1178,6 +1178,7 @@ qlcnic_initialize_nic(struct qlcnic_adapter *adapter) | |||
| 1178 | } else { | 1178 | } else { |
| 1179 | adapter->ahw->nic_mode = QLCNIC_DEFAULT_MODE; | 1179 | adapter->ahw->nic_mode = QLCNIC_DEFAULT_MODE; |
| 1180 | adapter->max_tx_rings = QLCNIC_MAX_HW_TX_RINGS; | 1180 | adapter->max_tx_rings = QLCNIC_MAX_HW_TX_RINGS; |
| 1181 | adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS; | ||
| 1181 | adapter->flags &= ~QLCNIC_ESWITCH_ENABLED; | 1182 | adapter->flags &= ~QLCNIC_ESWITCH_ENABLED; |
| 1182 | } | 1183 | } |
| 1183 | 1184 | ||
| @@ -1940,7 +1941,6 @@ int qlcnic_diag_alloc_res(struct net_device *netdev, int test) | |||
| 1940 | qlcnic_detach(adapter); | 1941 | qlcnic_detach(adapter); |
| 1941 | 1942 | ||
| 1942 | adapter->drv_sds_rings = QLCNIC_SINGLE_RING; | 1943 | adapter->drv_sds_rings = QLCNIC_SINGLE_RING; |
| 1943 | adapter->drv_tx_rings = QLCNIC_SINGLE_RING; | ||
| 1944 | adapter->ahw->diag_test = test; | 1944 | adapter->ahw->diag_test = test; |
| 1945 | adapter->ahw->linkup = 0; | 1945 | adapter->ahw->linkup = 0; |
| 1946 | 1946 | ||
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 524f713f6017..f8135725bcf6 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c | |||
| @@ -327,7 +327,6 @@ static int netvsc_change_mtu(struct net_device *ndev, int mtu) | |||
| 327 | return -EINVAL; | 327 | return -EINVAL; |
| 328 | 328 | ||
| 329 | nvdev->start_remove = true; | 329 | nvdev->start_remove = true; |
| 330 | cancel_delayed_work_sync(&ndevctx->dwork); | ||
| 331 | cancel_work_sync(&ndevctx->work); | 330 | cancel_work_sync(&ndevctx->work); |
| 332 | netif_tx_disable(ndev); | 331 | netif_tx_disable(ndev); |
| 333 | rndis_filter_device_remove(hdev); | 332 | rndis_filter_device_remove(hdev); |
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index e884ee1fe7ed..27bbe58dcbe7 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c | |||
| @@ -1197,6 +1197,9 @@ static int checksum_setup_ip(struct xenvif *vif, struct sk_buff *skb, | |||
| 1197 | 1197 | ||
| 1198 | err = -EPROTO; | 1198 | err = -EPROTO; |
| 1199 | 1199 | ||
| 1200 | if (fragment) | ||
| 1201 | goto out; | ||
| 1202 | |||
| 1200 | switch (ip_hdr(skb)->protocol) { | 1203 | switch (ip_hdr(skb)->protocol) { |
| 1201 | case IPPROTO_TCP: | 1204 | case IPPROTO_TCP: |
| 1202 | err = maybe_pull_tail(skb, | 1205 | err = maybe_pull_tail(skb, |
