aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/qlcnic/qlcnic.h4
-rw-r--r--drivers/net/qlcnic/qlcnic_ctx.c50
-rw-r--r--drivers/net/qlcnic/qlcnic_ethtool.c7
-rw-r--r--drivers/net/qlcnic/qlcnic_hw.c4
-rw-r--r--drivers/net/qlcnic/qlcnic_init.c26
-rw-r--r--drivers/net/qlcnic/qlcnic_main.c60
6 files changed, 114 insertions, 37 deletions
diff --git a/drivers/net/qlcnic/qlcnic.h b/drivers/net/qlcnic/qlcnic.h
index 588b9a9611aa..5c7d474e560b 100644
--- a/drivers/net/qlcnic/qlcnic.h
+++ b/drivers/net/qlcnic/qlcnic.h
@@ -1124,6 +1124,10 @@ void __iomem *qlcnic_get_ioaddr(struct qlcnic_adapter *, u32);
1124int qlcnic_alloc_hw_resources(struct qlcnic_adapter *adapter); 1124int qlcnic_alloc_hw_resources(struct qlcnic_adapter *adapter);
1125void qlcnic_free_hw_resources(struct qlcnic_adapter *adapter); 1125void qlcnic_free_hw_resources(struct qlcnic_adapter *adapter);
1126 1126
1127int qlcnic_fw_create_ctx(struct qlcnic_adapter *adapter);
1128void qlcnic_fw_destroy_ctx(struct qlcnic_adapter *adapter);
1129
1130void qlcnic_reset_rx_buffers_list(struct qlcnic_adapter *adapter);
1127void qlcnic_release_rx_buffers(struct qlcnic_adapter *adapter); 1131void qlcnic_release_rx_buffers(struct qlcnic_adapter *adapter);
1128void qlcnic_release_tx_buffers(struct qlcnic_adapter *adapter); 1132void qlcnic_release_tx_buffers(struct qlcnic_adapter *adapter);
1129 1133
diff --git a/drivers/net/qlcnic/qlcnic_ctx.c b/drivers/net/qlcnic/qlcnic_ctx.c
index 7c96c8e06c3f..be341c1564b8 100644
--- a/drivers/net/qlcnic/qlcnic_ctx.c
+++ b/drivers/net/qlcnic/qlcnic_ctx.c
@@ -180,6 +180,7 @@ qlcnic_fw_cmd_create_rx_ctx(struct qlcnic_adapter *adapter)
180 for (i = 0; i < nrds_rings; i++) { 180 for (i = 0; i < nrds_rings; i++) {
181 181
182 rds_ring = &recv_ctx->rds_rings[i]; 182 rds_ring = &recv_ctx->rds_rings[i];
183 rds_ring->producer = 0;
183 184
184 prq_rds[i].host_phys_addr = cpu_to_le64(rds_ring->phys_addr); 185 prq_rds[i].host_phys_addr = cpu_to_le64(rds_ring->phys_addr);
185 prq_rds[i].ring_size = cpu_to_le32(rds_ring->num_desc); 186 prq_rds[i].ring_size = cpu_to_le32(rds_ring->num_desc);
@@ -193,6 +194,8 @@ qlcnic_fw_cmd_create_rx_ctx(struct qlcnic_adapter *adapter)
193 for (i = 0; i < nsds_rings; i++) { 194 for (i = 0; i < nsds_rings; i++) {
194 195
195 sds_ring = &recv_ctx->sds_rings[i]; 196 sds_ring = &recv_ctx->sds_rings[i];
197 sds_ring->consumer = 0;
198 memset(sds_ring->desc_head, 0, STATUS_DESC_RINGSIZE(sds_ring));
196 199
197 prq_sds[i].host_phys_addr = cpu_to_le64(sds_ring->phys_addr); 200 prq_sds[i].host_phys_addr = cpu_to_le64(sds_ring->phys_addr);
198 prq_sds[i].ring_size = cpu_to_le32(sds_ring->num_desc); 201 prq_sds[i].ring_size = cpu_to_le32(sds_ring->num_desc);
@@ -293,6 +296,11 @@ qlcnic_fw_cmd_create_tx_ctx(struct qlcnic_adapter *adapter)
293 dma_addr_t rq_phys_addr, rsp_phys_addr; 296 dma_addr_t rq_phys_addr, rsp_phys_addr;
294 struct qlcnic_host_tx_ring *tx_ring = adapter->tx_ring; 297 struct qlcnic_host_tx_ring *tx_ring = adapter->tx_ring;
295 298
299 /* reset host resources */
300 tx_ring->producer = 0;
301 tx_ring->sw_consumer = 0;
302 *(tx_ring->hw_consumer) = 0;
303
296 rq_size = SIZEOF_HOSTRQ_TX(struct qlcnic_hostrq_tx_ctx); 304 rq_size = SIZEOF_HOSTRQ_TX(struct qlcnic_hostrq_tx_ctx);
297 rq_addr = pci_alloc_consistent(adapter->pdev, 305 rq_addr = pci_alloc_consistent(adapter->pdev,
298 rq_size, &rq_phys_addr); 306 rq_size, &rq_phys_addr);
@@ -476,15 +484,6 @@ int qlcnic_alloc_hw_resources(struct qlcnic_adapter *adapter)
476 sds_ring->desc_head = (struct status_desc *)addr; 484 sds_ring->desc_head = (struct status_desc *)addr;
477 } 485 }
478 486
479
480 err = qlcnic_fw_cmd_create_rx_ctx(adapter);
481 if (err)
482 goto err_out_free;
483 err = qlcnic_fw_cmd_create_tx_ctx(adapter);
484 if (err)
485 goto err_out_free;
486
487 set_bit(__QLCNIC_FW_ATTACHED, &adapter->state);
488 return 0; 487 return 0;
489 488
490err_out_free: 489err_out_free:
@@ -492,15 +491,27 @@ err_out_free:
492 return err; 491 return err;
493} 492}
494 493
495void qlcnic_free_hw_resources(struct qlcnic_adapter *adapter) 494
495int qlcnic_fw_create_ctx(struct qlcnic_adapter *adapter)
496{ 496{
497 struct qlcnic_recv_context *recv_ctx; 497 int err;
498 struct qlcnic_host_rds_ring *rds_ring; 498
499 struct qlcnic_host_sds_ring *sds_ring; 499 err = qlcnic_fw_cmd_create_rx_ctx(adapter);
500 struct qlcnic_host_tx_ring *tx_ring; 500 if (err)
501 int ring; 501 return err;
502 502
503 err = qlcnic_fw_cmd_create_tx_ctx(adapter);
504 if (err) {
505 qlcnic_fw_cmd_destroy_rx_ctx(adapter);
506 return err;
507 }
508
509 set_bit(__QLCNIC_FW_ATTACHED, &adapter->state);
510 return 0;
511}
503 512
513void qlcnic_fw_destroy_ctx(struct qlcnic_adapter *adapter)
514{
504 if (test_and_clear_bit(__QLCNIC_FW_ATTACHED, &adapter->state)) { 515 if (test_and_clear_bit(__QLCNIC_FW_ATTACHED, &adapter->state)) {
505 qlcnic_fw_cmd_destroy_rx_ctx(adapter); 516 qlcnic_fw_cmd_destroy_rx_ctx(adapter);
506 qlcnic_fw_cmd_destroy_tx_ctx(adapter); 517 qlcnic_fw_cmd_destroy_tx_ctx(adapter);
@@ -508,6 +519,15 @@ void qlcnic_free_hw_resources(struct qlcnic_adapter *adapter)
508 /* Allow dma queues to drain after context reset */ 519 /* Allow dma queues to drain after context reset */
509 msleep(20); 520 msleep(20);
510 } 521 }
522}
523
524void qlcnic_free_hw_resources(struct qlcnic_adapter *adapter)
525{
526 struct qlcnic_recv_context *recv_ctx;
527 struct qlcnic_host_rds_ring *rds_ring;
528 struct qlcnic_host_sds_ring *sds_ring;
529 struct qlcnic_host_tx_ring *tx_ring;
530 int ring;
511 531
512 recv_ctx = &adapter->recv_ctx; 532 recv_ctx = &adapter->recv_ctx;
513 533
diff --git a/drivers/net/qlcnic/qlcnic_ethtool.c b/drivers/net/qlcnic/qlcnic_ethtool.c
index a4f112022715..d4e803e2a977 100644
--- a/drivers/net/qlcnic/qlcnic_ethtool.c
+++ b/drivers/net/qlcnic/qlcnic_ethtool.c
@@ -348,7 +348,7 @@ qlcnic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p)
348 for (i = 0; diag_registers[i] != -1; i++) 348 for (i = 0; diag_registers[i] != -1; i++)
349 regs_buff[i] = QLCRD32(adapter, diag_registers[i]); 349 regs_buff[i] = QLCRD32(adapter, diag_registers[i]);
350 350
351 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) 351 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
352 return; 352 return;
353 353
354 regs_buff[i++] = 0xFFEFCDAB; /* Marker btw regs and ring count*/ 354 regs_buff[i++] = 0xFFEFCDAB; /* Marker btw regs and ring count*/
@@ -833,6 +833,9 @@ static int qlcnic_blink_led(struct net_device *dev, u32 val)
833 struct qlcnic_adapter *adapter = netdev_priv(dev); 833 struct qlcnic_adapter *adapter = netdev_priv(dev);
834 int ret; 834 int ret;
835 835
836 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
837 return -EIO;
838
836 ret = adapter->nic_ops->config_led(adapter, 1, 0xf); 839 ret = adapter->nic_ops->config_led(adapter, 1, 0xf);
837 if (ret) { 840 if (ret) {
838 dev_err(&adapter->pdev->dev, 841 dev_err(&adapter->pdev->dev,
@@ -904,7 +907,7 @@ static int qlcnic_set_intr_coalesce(struct net_device *netdev,
904{ 907{
905 struct qlcnic_adapter *adapter = netdev_priv(netdev); 908 struct qlcnic_adapter *adapter = netdev_priv(netdev);
906 909
907 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) 910 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
908 return -EINVAL; 911 return -EINVAL;
909 912
910 /* 913 /*
diff --git a/drivers/net/qlcnic/qlcnic_hw.c b/drivers/net/qlcnic/qlcnic_hw.c
index ad124254b6a9..e08c8b0556a4 100644
--- a/drivers/net/qlcnic/qlcnic_hw.c
+++ b/drivers/net/qlcnic/qlcnic_hw.c
@@ -327,7 +327,7 @@ qlcnic_send_cmd_descs(struct qlcnic_adapter *adapter,
327 327
328 i = 0; 328 i = 0;
329 329
330 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) 330 if (!test_bit(__QLCNIC_FW_ATTACHED, &adapter->state))
331 return -EIO; 331 return -EIO;
332 332
333 tx_ring = adapter->tx_ring; 333 tx_ring = adapter->tx_ring;
@@ -431,7 +431,7 @@ void qlcnic_set_multi(struct net_device *netdev)
431 u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; 431 u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
432 u32 mode = VPORT_MISS_MODE_DROP; 432 u32 mode = VPORT_MISS_MODE_DROP;
433 433
434 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) 434 if (!test_bit(__QLCNIC_FW_ATTACHED, &adapter->state))
435 return; 435 return;
436 436
437 qlcnic_nic_add_mac(adapter, adapter->mac_addr); 437 qlcnic_nic_add_mac(adapter, adapter->mac_addr);
diff --git a/drivers/net/qlcnic/qlcnic_init.c b/drivers/net/qlcnic/qlcnic_init.c
index d19d0120e5b8..6678127ed4f2 100644
--- a/drivers/net/qlcnic/qlcnic_init.c
+++ b/drivers/net/qlcnic/qlcnic_init.c
@@ -125,6 +125,32 @@ void qlcnic_release_rx_buffers(struct qlcnic_adapter *adapter)
125 } 125 }
126} 126}
127 127
128void qlcnic_reset_rx_buffers_list(struct qlcnic_adapter *adapter)
129{
130 struct qlcnic_recv_context *recv_ctx;
131 struct qlcnic_host_rds_ring *rds_ring;
132 struct qlcnic_rx_buffer *rx_buf;
133 int i, ring;
134
135 recv_ctx = &adapter->recv_ctx;
136 for (ring = 0; ring < adapter->max_rds_rings; ring++) {
137 rds_ring = &recv_ctx->rds_rings[ring];
138
139 spin_lock(&rds_ring->lock);
140
141 INIT_LIST_HEAD(&rds_ring->free_list);
142
143 rx_buf = rds_ring->rx_buf_arr;
144 for (i = 0; i < rds_ring->num_desc; i++) {
145 list_add_tail(&rx_buf->list,
146 &rds_ring->free_list);
147 rx_buf++;
148 }
149
150 spin_unlock(&rds_ring->lock);
151 }
152}
153
128void qlcnic_release_tx_buffers(struct qlcnic_adapter *adapter) 154void qlcnic_release_tx_buffers(struct qlcnic_adapter *adapter)
129{ 155{
130 struct qlcnic_cmd_buffer *cmd_buf; 156 struct qlcnic_cmd_buffer *cmd_buf;
diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c
index 9658b1849386..38d8fe08b7ff 100644
--- a/drivers/net/qlcnic/qlcnic_main.c
+++ b/drivers/net/qlcnic/qlcnic_main.c
@@ -346,7 +346,7 @@ static int qlcnic_set_mac(struct net_device *netdev, void *p)
346 if (!is_valid_ether_addr(addr->sa_data)) 346 if (!is_valid_ether_addr(addr->sa_data))
347 return -EINVAL; 347 return -EINVAL;
348 348
349 if (netif_running(netdev)) { 349 if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
350 netif_device_detach(netdev); 350 netif_device_detach(netdev);
351 qlcnic_napi_disable(adapter); 351 qlcnic_napi_disable(adapter);
352 } 352 }
@@ -355,7 +355,7 @@ static int qlcnic_set_mac(struct net_device *netdev, void *p)
355 memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); 355 memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
356 qlcnic_set_multi(adapter->netdev); 356 qlcnic_set_multi(adapter->netdev);
357 357
358 if (netif_running(netdev)) { 358 if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
359 netif_device_attach(netdev); 359 netif_device_attach(netdev);
360 qlcnic_napi_enable(adapter); 360 qlcnic_napi_enable(adapter);
361 } 361 }
@@ -877,9 +877,23 @@ qlcnic_init_coalesce_defaults(struct qlcnic_adapter *adapter)
877static int 877static int
878__qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev) 878__qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev)
879{ 879{
880 int ring;
881 struct qlcnic_host_rds_ring *rds_ring;
882
880 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) 883 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC)
881 return -EIO; 884 return -EIO;
882 885
886 if (test_bit(__QLCNIC_DEV_UP, &adapter->state))
887 return 0;
888
889 if (qlcnic_fw_create_ctx(adapter))
890 return -EIO;
891
892 for (ring = 0; ring < adapter->max_rds_rings; ring++) {
893 rds_ring = &adapter->recv_ctx.rds_rings[ring];
894 qlcnic_post_rx_buffers(adapter, ring, rds_ring);
895 }
896
883 qlcnic_set_multi(netdev); 897 qlcnic_set_multi(netdev);
884 qlcnic_fw_cmd_set_mtu(adapter, netdev->mtu); 898 qlcnic_fw_cmd_set_mtu(adapter, netdev->mtu);
885 899
@@ -936,6 +950,9 @@ __qlcnic_down(struct qlcnic_adapter *adapter, struct net_device *netdev)
936 950
937 qlcnic_napi_disable(adapter); 951 qlcnic_napi_disable(adapter);
938 952
953 qlcnic_fw_destroy_ctx(adapter);
954
955 qlcnic_reset_rx_buffers_list(adapter);
939 qlcnic_release_tx_buffers(adapter); 956 qlcnic_release_tx_buffers(adapter);
940 spin_unlock(&adapter->tx_clean_lock); 957 spin_unlock(&adapter->tx_clean_lock);
941} 958}
@@ -957,13 +974,11 @@ qlcnic_attach(struct qlcnic_adapter *adapter)
957{ 974{
958 struct net_device *netdev = adapter->netdev; 975 struct net_device *netdev = adapter->netdev;
959 struct pci_dev *pdev = adapter->pdev; 976 struct pci_dev *pdev = adapter->pdev;
960 int err, ring; 977 int err;
961 struct qlcnic_host_rds_ring *rds_ring;
962 978
963 if (adapter->is_up == QLCNIC_ADAPTER_UP_MAGIC) 979 if (adapter->is_up == QLCNIC_ADAPTER_UP_MAGIC)
964 return 0; 980 return 0;
965 981
966
967 err = qlcnic_napi_add(adapter, netdev); 982 err = qlcnic_napi_add(adapter, netdev);
968 if (err) 983 if (err)
969 return err; 984 return err;
@@ -971,7 +986,7 @@ qlcnic_attach(struct qlcnic_adapter *adapter)
971 err = qlcnic_alloc_sw_resources(adapter); 986 err = qlcnic_alloc_sw_resources(adapter);
972 if (err) { 987 if (err) {
973 dev_err(&pdev->dev, "Error in setting sw resources\n"); 988 dev_err(&pdev->dev, "Error in setting sw resources\n");
974 return err; 989 goto err_out_napi_del;
975 } 990 }
976 991
977 err = qlcnic_alloc_hw_resources(adapter); 992 err = qlcnic_alloc_hw_resources(adapter);
@@ -980,16 +995,10 @@ qlcnic_attach(struct qlcnic_adapter *adapter)
980 goto err_out_free_sw; 995 goto err_out_free_sw;
981 } 996 }
982 997
983
984 for (ring = 0; ring < adapter->max_rds_rings; ring++) {
985 rds_ring = &adapter->recv_ctx.rds_rings[ring];
986 qlcnic_post_rx_buffers(adapter, ring, rds_ring);
987 }
988
989 err = qlcnic_request_irq(adapter); 998 err = qlcnic_request_irq(adapter);
990 if (err) { 999 if (err) {
991 dev_err(&pdev->dev, "failed to setup interrupt\n"); 1000 dev_err(&pdev->dev, "failed to setup interrupt\n");
992 goto err_out_free_rxbuf; 1001 goto err_out_free_hw;
993 } 1002 }
994 1003
995 qlcnic_init_coalesce_defaults(adapter); 1004 qlcnic_init_coalesce_defaults(adapter);
@@ -999,11 +1008,12 @@ qlcnic_attach(struct qlcnic_adapter *adapter)
999 adapter->is_up = QLCNIC_ADAPTER_UP_MAGIC; 1008 adapter->is_up = QLCNIC_ADAPTER_UP_MAGIC;
1000 return 0; 1009 return 0;
1001 1010
1002err_out_free_rxbuf: 1011err_out_free_hw:
1003 qlcnic_release_rx_buffers(adapter);
1004 qlcnic_free_hw_resources(adapter); 1012 qlcnic_free_hw_resources(adapter);
1005err_out_free_sw: 1013err_out_free_sw:
1006 qlcnic_free_sw_resources(adapter); 1014 qlcnic_free_sw_resources(adapter);
1015err_out_napi_del:
1016 qlcnic_napi_del(adapter);
1007 return err; 1017 return err;
1008} 1018}
1009 1019
@@ -1038,6 +1048,8 @@ void qlcnic_diag_free_res(struct net_device *netdev, int max_sds_rings)
1038 } 1048 }
1039 } 1049 }
1040 1050
1051 qlcnic_fw_destroy_ctx(adapter);
1052
1041 qlcnic_detach(adapter); 1053 qlcnic_detach(adapter);
1042 1054
1043 adapter->diag_test = 0; 1055 adapter->diag_test = 0;
@@ -1056,6 +1068,7 @@ int qlcnic_diag_alloc_res(struct net_device *netdev, int test)
1056{ 1068{
1057 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1069 struct qlcnic_adapter *adapter = netdev_priv(netdev);
1058 struct qlcnic_host_sds_ring *sds_ring; 1070 struct qlcnic_host_sds_ring *sds_ring;
1071 struct qlcnic_host_rds_ring *rds_ring;
1059 int ring; 1072 int ring;
1060 int ret; 1073 int ret;
1061 1074
@@ -1075,6 +1088,17 @@ int qlcnic_diag_alloc_res(struct net_device *netdev, int test)
1075 return ret; 1088 return ret;
1076 } 1089 }
1077 1090
1091 ret = qlcnic_fw_create_ctx(adapter);
1092 if (ret) {
1093 qlcnic_detach(adapter);
1094 return ret;
1095 }
1096
1097 for (ring = 0; ring < adapter->max_rds_rings; ring++) {
1098 rds_ring = &adapter->recv_ctx.rds_rings[ring];
1099 qlcnic_post_rx_buffers(adapter, ring, rds_ring);
1100 }
1101
1078 if (adapter->diag_test == QLCNIC_INTERRUPT_TEST) { 1102 if (adapter->diag_test == QLCNIC_INTERRUPT_TEST) {
1079 for (ring = 0; ring < adapter->max_sds_rings; ring++) { 1103 for (ring = 0; ring < adapter->max_sds_rings; ring++) {
1080 sds_ring = &adapter->recv_ctx.sds_rings[ring]; 1104 sds_ring = &adapter->recv_ctx.sds_rings[ring];
@@ -2636,7 +2660,7 @@ qlcnic_store_bridged_mode(struct device *dev,
2636 if (!(adapter->capabilities & QLCNIC_FW_CAPABILITY_BDG)) 2660 if (!(adapter->capabilities & QLCNIC_FW_CAPABILITY_BDG))
2637 goto err_out; 2661 goto err_out;
2638 2662
2639 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) 2663 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
2640 goto err_out; 2664 goto err_out;
2641 2665
2642 if (strict_strtoul(buf, 2, &new)) 2666 if (strict_strtoul(buf, 2, &new))
@@ -2944,7 +2968,7 @@ recheck:
2944 if (!adapter) 2968 if (!adapter)
2945 goto done; 2969 goto done;
2946 2970
2947 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) 2971 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
2948 goto done; 2972 goto done;
2949 2973
2950 qlcnic_config_indev_addr(dev, event); 2974 qlcnic_config_indev_addr(dev, event);
@@ -2980,7 +3004,7 @@ recheck:
2980 if (!adapter) 3004 if (!adapter)
2981 goto done; 3005 goto done;
2982 3006
2983 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) 3007 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
2984 goto done; 3008 goto done;
2985 3009
2986 switch (event) { 3010 switch (event) {