diff options
author | David S. Miller <davem@davemloft.net> | 2014-01-28 15:00:00 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-01-28 15:00:00 -0500 |
commit | 77c14e512f5361e2b859c2ad05a54b5679b0f2d8 (patch) | |
tree | 6f022775a11f09715d6bcf84c60197900036d431 | |
parent | d922e1cb1ea17ac7f0a5c3c2be98d4bd80d055b8 (diff) | |
parent | 092dfcf347241576a98d3b1bb4b9b98e0faeb801 (diff) |
Merge branch 'qlcnic'
Rajesh Borundia says:
====================
qlcnic: bug fixes
The patch series contains following bug fixes
o Bound checks for number of receive descriptors and number of recieve rings.
Both of these have off-by-one errors.
o Vlan list was getting re-initialized in case of adapter reset.
o Tx queue was timing out because of missing start queue for a corresponding
netif_tx_disable.
o Loopback test failed because driver was not setting linkup variable
while handling link events.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | 19 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 9 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c | 11 |
3 files changed, 19 insertions, 20 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c index 30874cda8476..54ebf300332a 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | |||
@@ -683,12 +683,17 @@ void qlcnic_advert_link_change(struct qlcnic_adapter *adapter, int linkup) | |||
683 | adapter->ahw->linkup = 0; | 683 | adapter->ahw->linkup = 0; |
684 | netif_carrier_off(netdev); | 684 | netif_carrier_off(netdev); |
685 | } else if (!adapter->ahw->linkup && linkup) { | 685 | } else if (!adapter->ahw->linkup && linkup) { |
686 | /* Do not advertise Link up if the port is in loopback mode */ | 686 | adapter->ahw->linkup = 1; |
687 | if (qlcnic_83xx_check(adapter) && adapter->ahw->lb_mode) | 687 | |
688 | /* Do not advertise Link up to the stack if device | ||
689 | * is in loopback mode | ||
690 | */ | ||
691 | if (qlcnic_83xx_check(adapter) && adapter->ahw->lb_mode) { | ||
692 | netdev_info(netdev, "NIC Link is up for loopback test\n"); | ||
688 | return; | 693 | return; |
694 | } | ||
689 | 695 | ||
690 | netdev_info(netdev, "NIC Link is up\n"); | 696 | netdev_info(netdev, "NIC Link is up\n"); |
691 | adapter->ahw->linkup = 1; | ||
692 | netif_carrier_on(netdev); | 697 | netif_carrier_on(netdev); |
693 | } | 698 | } |
694 | } | 699 | } |
@@ -1150,13 +1155,13 @@ qlcnic_process_lro(struct qlcnic_adapter *adapter, | |||
1150 | u16 lro_length, length, data_offset, t_vid, vid = 0xffff; | 1155 | u16 lro_length, length, data_offset, t_vid, vid = 0xffff; |
1151 | u32 seq_number; | 1156 | u32 seq_number; |
1152 | 1157 | ||
1153 | if (unlikely(ring > adapter->max_rds_rings)) | 1158 | if (unlikely(ring >= adapter->max_rds_rings)) |
1154 | return NULL; | 1159 | return NULL; |
1155 | 1160 | ||
1156 | rds_ring = &recv_ctx->rds_rings[ring]; | 1161 | rds_ring = &recv_ctx->rds_rings[ring]; |
1157 | 1162 | ||
1158 | index = qlcnic_get_lro_sts_refhandle(sts_data0); | 1163 | index = qlcnic_get_lro_sts_refhandle(sts_data0); |
1159 | if (unlikely(index > rds_ring->num_desc)) | 1164 | if (unlikely(index >= rds_ring->num_desc)) |
1160 | return NULL; | 1165 | return NULL; |
1161 | 1166 | ||
1162 | buffer = &rds_ring->rx_buf_arr[index]; | 1167 | buffer = &rds_ring->rx_buf_arr[index]; |
@@ -1662,13 +1667,13 @@ qlcnic_83xx_process_lro(struct qlcnic_adapter *adapter, | |||
1662 | u16 vid = 0xffff; | 1667 | u16 vid = 0xffff; |
1663 | int err; | 1668 | int err; |
1664 | 1669 | ||
1665 | if (unlikely(ring > adapter->max_rds_rings)) | 1670 | if (unlikely(ring >= adapter->max_rds_rings)) |
1666 | return NULL; | 1671 | return NULL; |
1667 | 1672 | ||
1668 | rds_ring = &recv_ctx->rds_rings[ring]; | 1673 | rds_ring = &recv_ctx->rds_rings[ring]; |
1669 | 1674 | ||
1670 | index = qlcnic_83xx_hndl(sts_data[0]); | 1675 | index = qlcnic_83xx_hndl(sts_data[0]); |
1671 | if (unlikely(index > rds_ring->num_desc)) | 1676 | if (unlikely(index >= rds_ring->num_desc)) |
1672 | return NULL; | 1677 | return NULL; |
1673 | 1678 | ||
1674 | buffer = &rds_ring->rx_buf_arr[index]; | 1679 | buffer = &rds_ring->rx_buf_arr[index]; |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c index 1f79d47c45fa..ba78c7481fa3 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | |||
@@ -1837,6 +1837,7 @@ int __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev) | |||
1837 | qlcnic_linkevent_request(adapter, 1); | 1837 | qlcnic_linkevent_request(adapter, 1); |
1838 | 1838 | ||
1839 | adapter->ahw->reset_context = 0; | 1839 | adapter->ahw->reset_context = 0; |
1840 | netif_tx_start_all_queues(netdev); | ||
1840 | return 0; | 1841 | return 0; |
1841 | } | 1842 | } |
1842 | 1843 | ||
@@ -2704,14 +2705,8 @@ static int qlcnic_open(struct net_device *netdev) | |||
2704 | 2705 | ||
2705 | err = __qlcnic_up(adapter, netdev); | 2706 | err = __qlcnic_up(adapter, netdev); |
2706 | if (err) | 2707 | if (err) |
2707 | goto err_out; | 2708 | qlcnic_detach(adapter); |
2708 | |||
2709 | netif_tx_start_all_queues(netdev); | ||
2710 | |||
2711 | return 0; | ||
2712 | 2709 | ||
2713 | err_out: | ||
2714 | qlcnic_detach(adapter); | ||
2715 | return err; | 2710 | return err; |
2716 | } | 2711 | } |
2717 | 2712 | ||
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c index 17a1ca2050f4..0638c1810d54 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c | |||
@@ -448,8 +448,7 @@ static int qlcnic_sriov_set_guest_vlan_mode(struct qlcnic_adapter *adapter, | |||
448 | return 0; | 448 | return 0; |
449 | } | 449 | } |
450 | 450 | ||
451 | static int qlcnic_sriov_get_vf_acl(struct qlcnic_adapter *adapter, | 451 | static int qlcnic_sriov_get_vf_acl(struct qlcnic_adapter *adapter) |
452 | struct qlcnic_info *info) | ||
453 | { | 452 | { |
454 | struct qlcnic_sriov *sriov = adapter->ahw->sriov; | 453 | struct qlcnic_sriov *sriov = adapter->ahw->sriov; |
455 | struct qlcnic_cmd_args cmd; | 454 | struct qlcnic_cmd_args cmd; |
@@ -495,10 +494,6 @@ static int qlcnic_sriov_vf_init_driver(struct qlcnic_adapter *adapter) | |||
495 | if (err) | 494 | if (err) |
496 | return -EIO; | 495 | return -EIO; |
497 | 496 | ||
498 | err = qlcnic_sriov_get_vf_acl(adapter, &nic_info); | ||
499 | if (err) | ||
500 | return err; | ||
501 | |||
502 | if (qlcnic_83xx_get_port_info(adapter)) | 497 | if (qlcnic_83xx_get_port_info(adapter)) |
503 | return -EIO; | 498 | return -EIO; |
504 | 499 | ||
@@ -555,6 +550,10 @@ static int qlcnic_sriov_setup_vf(struct qlcnic_adapter *adapter, | |||
555 | if (err) | 550 | if (err) |
556 | goto err_out_send_channel_term; | 551 | goto err_out_send_channel_term; |
557 | 552 | ||
553 | err = qlcnic_sriov_get_vf_acl(adapter); | ||
554 | if (err) | ||
555 | goto err_out_send_channel_term; | ||
556 | |||
558 | err = qlcnic_setup_netdev(adapter, adapter->netdev, pci_using_dac); | 557 | err = qlcnic_setup_netdev(adapter, adapter->netdev, pci_using_dac); |
559 | if (err) | 558 | if (err) |
560 | goto err_out_send_channel_term; | 559 | goto err_out_send_channel_term; |