aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-01-28 15:00:00 -0500
committerDavid S. Miller <davem@davemloft.net>2014-01-28 15:00:00 -0500
commit77c14e512f5361e2b859c2ad05a54b5679b0f2d8 (patch)
tree6f022775a11f09715d6bcf84c60197900036d431
parentd922e1cb1ea17ac7f0a5c3c2be98d4bd80d055b8 (diff)
parent092dfcf347241576a98d3b1bb4b9b98e0faeb801 (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.c19
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c9
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c11
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
2713err_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
451static int qlcnic_sriov_get_vf_acl(struct qlcnic_adapter *adapter, 451static 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;