aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/emulex/benet/be_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/emulex/benet/be_main.c')
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c54
1 files changed, 39 insertions, 15 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 4babc8a4a543..6c52a60dcdb7 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -410,6 +410,7 @@ static void populate_be_v1_stats(struct be_adapter *adapter)
410 drvs->rxpp_fifo_overflow_drop = port_stats->rxpp_fifo_overflow_drop; 410 drvs->rxpp_fifo_overflow_drop = port_stats->rxpp_fifo_overflow_drop;
411 drvs->tx_pauseframes = port_stats->tx_pauseframes; 411 drvs->tx_pauseframes = port_stats->tx_pauseframes;
412 drvs->tx_controlframes = port_stats->tx_controlframes; 412 drvs->tx_controlframes = port_stats->tx_controlframes;
413 drvs->tx_priority_pauseframes = port_stats->tx_priority_pauseframes;
413 drvs->jabber_events = port_stats->jabber_events; 414 drvs->jabber_events = port_stats->jabber_events;
414 drvs->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf; 415 drvs->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf;
415 drvs->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr; 416 drvs->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr;
@@ -471,11 +472,26 @@ static void accumulate_16bit_val(u32 *acc, u16 val)
471 ACCESS_ONCE(*acc) = newacc; 472 ACCESS_ONCE(*acc) = newacc;
472} 473}
473 474
475void populate_erx_stats(struct be_adapter *adapter,
476 struct be_rx_obj *rxo,
477 u32 erx_stat)
478{
479 if (!BEx_chip(adapter))
480 rx_stats(rxo)->rx_drops_no_frags = erx_stat;
481 else
482 /* below erx HW counter can actually wrap around after
483 * 65535. Driver accumulates a 32-bit value
484 */
485 accumulate_16bit_val(&rx_stats(rxo)->rx_drops_no_frags,
486 (u16)erx_stat);
487}
488
474void be_parse_stats(struct be_adapter *adapter) 489void be_parse_stats(struct be_adapter *adapter)
475{ 490{
476 struct be_erx_stats_v1 *erx = be_erx_stats_from_cmd(adapter); 491 struct be_erx_stats_v1 *erx = be_erx_stats_from_cmd(adapter);
477 struct be_rx_obj *rxo; 492 struct be_rx_obj *rxo;
478 int i; 493 int i;
494 u32 erx_stat;
479 495
480 if (lancer_chip(adapter)) { 496 if (lancer_chip(adapter)) {
481 populate_lancer_stats(adapter); 497 populate_lancer_stats(adapter);
@@ -488,12 +504,8 @@ void be_parse_stats(struct be_adapter *adapter)
488 504
489 /* as erx_v1 is longer than v0, ok to use v1 for v0 access */ 505 /* as erx_v1 is longer than v0, ok to use v1 for v0 access */
490 for_all_rx_queues(adapter, rxo, i) { 506 for_all_rx_queues(adapter, rxo, i) {
491 /* below erx HW counter can actually wrap around after 507 erx_stat = erx->rx_drops_no_fragments[rxo->q.id];
492 * 65535. Driver accumulates a 32-bit value 508 populate_erx_stats(adapter, rxo, erx_stat);
493 */
494 accumulate_16bit_val(&rx_stats(rxo)->rx_drops_no_frags,
495 (u16)erx->rx_drops_no_fragments \
496 [rxo->q.id]);
497 } 509 }
498 } 510 }
499} 511}
@@ -2378,7 +2390,7 @@ static uint be_num_rss_want(struct be_adapter *adapter)
2378 return num; 2390 return num;
2379} 2391}
2380 2392
2381static void be_msix_enable(struct be_adapter *adapter) 2393static int be_msix_enable(struct be_adapter *adapter)
2382{ 2394{
2383#define BE_MIN_MSIX_VECTORS 1 2395#define BE_MIN_MSIX_VECTORS 1
2384 int i, status, num_vec, num_roce_vec = 0; 2396 int i, status, num_vec, num_roce_vec = 0;
@@ -2403,13 +2415,17 @@ static void be_msix_enable(struct be_adapter *adapter)
2403 goto done; 2415 goto done;
2404 } else if (status >= BE_MIN_MSIX_VECTORS) { 2416 } else if (status >= BE_MIN_MSIX_VECTORS) {
2405 num_vec = status; 2417 num_vec = status;
2406 if (pci_enable_msix(adapter->pdev, adapter->msix_entries, 2418 status = pci_enable_msix(adapter->pdev, adapter->msix_entries,
2407 num_vec) == 0) 2419 num_vec);
2420 if (!status)
2408 goto done; 2421 goto done;
2409 } 2422 }
2410 2423
2411 dev_warn(dev, "MSIx enable failed\n"); 2424 dev_warn(dev, "MSIx enable failed\n");
2412 return; 2425 /* INTx is not supported in VFs, so fail probe if enable_msix fails */
2426 if (!be_physfn(adapter))
2427 return status;
2428 return 0;
2413done: 2429done:
2414 if (be_roce_supported(adapter)) { 2430 if (be_roce_supported(adapter)) {
2415 if (num_vec > num_roce_vec) { 2431 if (num_vec > num_roce_vec) {
@@ -2423,7 +2439,7 @@ done:
2423 } else 2439 } else
2424 adapter->num_msix_vec = num_vec; 2440 adapter->num_msix_vec = num_vec;
2425 dev_info(dev, "enabled %d MSI-x vector(s)\n", adapter->num_msix_vec); 2441 dev_info(dev, "enabled %d MSI-x vector(s)\n", adapter->num_msix_vec);
2426 return; 2442 return 0;
2427} 2443}
2428 2444
2429static inline int be_msix_vec_get(struct be_adapter *adapter, 2445static inline int be_msix_vec_get(struct be_adapter *adapter,
@@ -2536,8 +2552,11 @@ static int be_close(struct net_device *netdev)
2536 2552
2537 be_roce_dev_close(adapter); 2553 be_roce_dev_close(adapter);
2538 2554
2539 for_all_evt_queues(adapter, eqo, i) 2555 if (adapter->flags & BE_FLAGS_NAPI_ENABLED) {
2540 napi_disable(&eqo->napi); 2556 for_all_evt_queues(adapter, eqo, i)
2557 napi_disable(&eqo->napi);
2558 adapter->flags &= ~BE_FLAGS_NAPI_ENABLED;
2559 }
2541 2560
2542 be_async_mcc_disable(adapter); 2561 be_async_mcc_disable(adapter);
2543 2562
@@ -2631,7 +2650,9 @@ static int be_open(struct net_device *netdev)
2631 if (status) 2650 if (status)
2632 goto err; 2651 goto err;
2633 2652
2634 be_irq_register(adapter); 2653 status = be_irq_register(adapter);
2654 if (status)
2655 goto err;
2635 2656
2636 for_all_rx_queues(adapter, rxo, i) 2657 for_all_rx_queues(adapter, rxo, i)
2637 be_cq_notify(adapter, rxo->cq.id, true, 0); 2658 be_cq_notify(adapter, rxo->cq.id, true, 0);
@@ -2645,6 +2666,7 @@ static int be_open(struct net_device *netdev)
2645 napi_enable(&eqo->napi); 2666 napi_enable(&eqo->napi);
2646 be_eq_notify(adapter, eqo->q.id, true, false, 0); 2667 be_eq_notify(adapter, eqo->q.id, true, false, 0);
2647 } 2668 }
2669 adapter->flags |= BE_FLAGS_NAPI_ENABLED;
2648 2670
2649 status = be_cmd_link_status_query(adapter, NULL, &link_status, 0); 2671 status = be_cmd_link_status_query(adapter, NULL, &link_status, 0);
2650 if (!status) 2672 if (!status)
@@ -3100,7 +3122,9 @@ static int be_setup(struct be_adapter *adapter)
3100 if (status) 3122 if (status)
3101 goto err; 3123 goto err;
3102 3124
3103 be_msix_enable(adapter); 3125 status = be_msix_enable(adapter);
3126 if (status)
3127 goto err;
3104 3128
3105 status = be_evt_queues_create(adapter); 3129 status = be_evt_queues_create(adapter);
3106 if (status) 3130 if (status)