Commit 77c14e51 authored by David S. Miller's avatar David S. Miller

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: default avatarDavid S. Miller <davem@davemloft.net>
parents d922e1cb 092dfcf3
...@@ -683,12 +683,17 @@ void qlcnic_advert_link_change(struct qlcnic_adapter *adapter, int linkup) ...@@ -683,12 +683,17 @@ void qlcnic_advert_link_change(struct qlcnic_adapter *adapter, int linkup)
adapter->ahw->linkup = 0; adapter->ahw->linkup = 0;
netif_carrier_off(netdev); netif_carrier_off(netdev);
} else if (!adapter->ahw->linkup && linkup) { } else if (!adapter->ahw->linkup && linkup) {
/* Do not advertise Link up if the port is in loopback mode */ adapter->ahw->linkup = 1;
if (qlcnic_83xx_check(adapter) && adapter->ahw->lb_mode)
/* Do not advertise Link up to the stack if device
* is in loopback mode
*/
if (qlcnic_83xx_check(adapter) && adapter->ahw->lb_mode) {
netdev_info(netdev, "NIC Link is up for loopback test\n");
return; return;
}
netdev_info(netdev, "NIC Link is up\n"); netdev_info(netdev, "NIC Link is up\n");
adapter->ahw->linkup = 1;
netif_carrier_on(netdev); netif_carrier_on(netdev);
} }
} }
...@@ -1150,13 +1155,13 @@ qlcnic_process_lro(struct qlcnic_adapter *adapter, ...@@ -1150,13 +1155,13 @@ qlcnic_process_lro(struct qlcnic_adapter *adapter,
u16 lro_length, length, data_offset, t_vid, vid = 0xffff; u16 lro_length, length, data_offset, t_vid, vid = 0xffff;
u32 seq_number; u32 seq_number;
if (unlikely(ring > adapter->max_rds_rings)) if (unlikely(ring >= adapter->max_rds_rings))
return NULL; return NULL;
rds_ring = &recv_ctx->rds_rings[ring]; rds_ring = &recv_ctx->rds_rings[ring];
index = qlcnic_get_lro_sts_refhandle(sts_data0); index = qlcnic_get_lro_sts_refhandle(sts_data0);
if (unlikely(index > rds_ring->num_desc)) if (unlikely(index >= rds_ring->num_desc))
return NULL; return NULL;
buffer = &rds_ring->rx_buf_arr[index]; buffer = &rds_ring->rx_buf_arr[index];
...@@ -1662,13 +1667,13 @@ qlcnic_83xx_process_lro(struct qlcnic_adapter *adapter, ...@@ -1662,13 +1667,13 @@ qlcnic_83xx_process_lro(struct qlcnic_adapter *adapter,
u16 vid = 0xffff; u16 vid = 0xffff;
int err; int err;
if (unlikely(ring > adapter->max_rds_rings)) if (unlikely(ring >= adapter->max_rds_rings))
return NULL; return NULL;
rds_ring = &recv_ctx->rds_rings[ring]; rds_ring = &recv_ctx->rds_rings[ring];
index = qlcnic_83xx_hndl(sts_data[0]); index = qlcnic_83xx_hndl(sts_data[0]);
if (unlikely(index > rds_ring->num_desc)) if (unlikely(index >= rds_ring->num_desc))
return NULL; return NULL;
buffer = &rds_ring->rx_buf_arr[index]; buffer = &rds_ring->rx_buf_arr[index];
......
...@@ -1837,6 +1837,7 @@ int __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev) ...@@ -1837,6 +1837,7 @@ int __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev)
qlcnic_linkevent_request(adapter, 1); qlcnic_linkevent_request(adapter, 1);
adapter->ahw->reset_context = 0; adapter->ahw->reset_context = 0;
netif_tx_start_all_queues(netdev);
return 0; return 0;
} }
...@@ -2704,14 +2705,8 @@ static int qlcnic_open(struct net_device *netdev) ...@@ -2704,14 +2705,8 @@ static int qlcnic_open(struct net_device *netdev)
err = __qlcnic_up(adapter, netdev); err = __qlcnic_up(adapter, netdev);
if (err) if (err)
goto err_out;
netif_tx_start_all_queues(netdev);
return 0;
err_out:
qlcnic_detach(adapter); qlcnic_detach(adapter);
return err; return err;
} }
......
...@@ -448,8 +448,7 @@ static int qlcnic_sriov_set_guest_vlan_mode(struct qlcnic_adapter *adapter, ...@@ -448,8 +448,7 @@ static int qlcnic_sriov_set_guest_vlan_mode(struct qlcnic_adapter *adapter,
return 0; return 0;
} }
static int qlcnic_sriov_get_vf_acl(struct qlcnic_adapter *adapter, static int qlcnic_sriov_get_vf_acl(struct qlcnic_adapter *adapter)
struct qlcnic_info *info)
{ {
struct qlcnic_sriov *sriov = adapter->ahw->sriov; struct qlcnic_sriov *sriov = adapter->ahw->sriov;
struct qlcnic_cmd_args cmd; struct qlcnic_cmd_args cmd;
...@@ -495,10 +494,6 @@ static int qlcnic_sriov_vf_init_driver(struct qlcnic_adapter *adapter) ...@@ -495,10 +494,6 @@ static int qlcnic_sriov_vf_init_driver(struct qlcnic_adapter *adapter)
if (err) if (err)
return -EIO; return -EIO;
err = qlcnic_sriov_get_vf_acl(adapter, &nic_info);
if (err)
return err;
if (qlcnic_83xx_get_port_info(adapter)) if (qlcnic_83xx_get_port_info(adapter))
return -EIO; return -EIO;
...@@ -555,6 +550,10 @@ static int qlcnic_sriov_setup_vf(struct qlcnic_adapter *adapter, ...@@ -555,6 +550,10 @@ static int qlcnic_sriov_setup_vf(struct qlcnic_adapter *adapter,
if (err) if (err)
goto err_out_send_channel_term; goto err_out_send_channel_term;
err = qlcnic_sriov_get_vf_acl(adapter);
if (err)
goto err_out_send_channel_term;
err = qlcnic_setup_netdev(adapter, adapter->netdev, pci_using_dac); err = qlcnic_setup_netdev(adapter, adapter->netdev, pci_using_dac);
if (err) if (err)
goto err_out_send_channel_term; goto err_out_send_channel_term;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment