diff options
-rw-r--r-- | drivers/net/ethernet/brocade/bna/bna_tx_rx.c | 11 | ||||
-rw-r--r-- | drivers/net/ethernet/brocade/bna/bna_types.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/brocade/bna/bnad.c | 25 | ||||
-rw-r--r-- | drivers/net/ethernet/brocade/bna/bnad.h | 1 |
4 files changed, 38 insertions, 1 deletions
diff --git a/drivers/net/ethernet/brocade/bna/bna_tx_rx.c b/drivers/net/ethernet/brocade/bna/bna_tx_rx.c index 066704efe34d..276fcb589f4b 100644 --- a/drivers/net/ethernet/brocade/bna/bna_tx_rx.c +++ b/drivers/net/ethernet/brocade/bna/bna_tx_rx.c | |||
@@ -1335,6 +1335,12 @@ do { \ | |||
1335 | } \ | 1335 | } \ |
1336 | } while (0) | 1336 | } while (0) |
1337 | 1337 | ||
1338 | #define call_rx_stall_cbfn(rx) \ | ||
1339 | do { \ | ||
1340 | if ((rx)->rx_stall_cbfn) \ | ||
1341 | (rx)->rx_stall_cbfn((rx)->bna->bnad, (rx)); \ | ||
1342 | } while (0) | ||
1343 | |||
1338 | #define bfi_enet_datapath_q_init(bfi_q, bna_qpt) \ | 1344 | #define bfi_enet_datapath_q_init(bfi_q, bna_qpt) \ |
1339 | do { \ | 1345 | do { \ |
1340 | struct bna_dma_addr cur_q_addr = \ | 1346 | struct bna_dma_addr cur_q_addr = \ |
@@ -1467,6 +1473,7 @@ bna_rx_sm_rxf_stop_wait(struct bna_rx *rx, enum bna_rx_event event) | |||
1467 | case RX_E_FAIL: | 1473 | case RX_E_FAIL: |
1468 | bfa_fsm_set_state(rx, bna_rx_sm_cleanup_wait); | 1474 | bfa_fsm_set_state(rx, bna_rx_sm_cleanup_wait); |
1469 | bna_rxf_fail(&rx->rxf); | 1475 | bna_rxf_fail(&rx->rxf); |
1476 | call_rx_stall_cbfn(rx); | ||
1470 | rx->rx_cleanup_cbfn(rx->bna->bnad, rx); | 1477 | rx->rx_cleanup_cbfn(rx->bna->bnad, rx); |
1471 | break; | 1478 | break; |
1472 | 1479 | ||
@@ -1476,6 +1483,7 @@ bna_rx_sm_rxf_stop_wait(struct bna_rx *rx, enum bna_rx_event event) | |||
1476 | 1483 | ||
1477 | case RX_E_RXF_STOPPED: | 1484 | case RX_E_RXF_STOPPED: |
1478 | bfa_fsm_set_state(rx, bna_rx_sm_stop_wait); | 1485 | bfa_fsm_set_state(rx, bna_rx_sm_stop_wait); |
1486 | call_rx_stall_cbfn(rx); | ||
1479 | bna_rx_enet_stop(rx); | 1487 | bna_rx_enet_stop(rx); |
1480 | break; | 1488 | break; |
1481 | 1489 | ||
@@ -1516,6 +1524,7 @@ bna_rx_sm_started(struct bna_rx *rx, enum bna_rx_event event) | |||
1516 | bfa_fsm_set_state(rx, bna_rx_sm_failed); | 1524 | bfa_fsm_set_state(rx, bna_rx_sm_failed); |
1517 | bna_ethport_cb_rx_stopped(&rx->bna->ethport); | 1525 | bna_ethport_cb_rx_stopped(&rx->bna->ethport); |
1518 | bna_rxf_fail(&rx->rxf); | 1526 | bna_rxf_fail(&rx->rxf); |
1527 | call_rx_stall_cbfn(rx); | ||
1519 | rx->rx_cleanup_cbfn(rx->bna->bnad, rx); | 1528 | rx->rx_cleanup_cbfn(rx->bna->bnad, rx); |
1520 | break; | 1529 | break; |
1521 | 1530 | ||
@@ -1536,6 +1545,7 @@ static void bna_rx_sm_rxf_start_wait(struct bna_rx *rx, | |||
1536 | case RX_E_FAIL: | 1545 | case RX_E_FAIL: |
1537 | bfa_fsm_set_state(rx, bna_rx_sm_failed); | 1546 | bfa_fsm_set_state(rx, bna_rx_sm_failed); |
1538 | bna_rxf_fail(&rx->rxf); | 1547 | bna_rxf_fail(&rx->rxf); |
1548 | call_rx_stall_cbfn(rx); | ||
1539 | rx->rx_cleanup_cbfn(rx->bna->bnad, rx); | 1549 | rx->rx_cleanup_cbfn(rx->bna->bnad, rx); |
1540 | break; | 1550 | break; |
1541 | 1551 | ||
@@ -2369,6 +2379,7 @@ bna_rx_create(struct bna *bna, struct bnad *bnad, | |||
2369 | rx->rcb_destroy_cbfn = rx_cbfn->rcb_destroy_cbfn; | 2379 | rx->rcb_destroy_cbfn = rx_cbfn->rcb_destroy_cbfn; |
2370 | rx->ccb_setup_cbfn = rx_cbfn->ccb_setup_cbfn; | 2380 | rx->ccb_setup_cbfn = rx_cbfn->ccb_setup_cbfn; |
2371 | rx->ccb_destroy_cbfn = rx_cbfn->ccb_destroy_cbfn; | 2381 | rx->ccb_destroy_cbfn = rx_cbfn->ccb_destroy_cbfn; |
2382 | rx->rx_stall_cbfn = rx_cbfn->rx_stall_cbfn; | ||
2372 | /* Following callbacks are mandatory */ | 2383 | /* Following callbacks are mandatory */ |
2373 | rx->rx_cleanup_cbfn = rx_cbfn->rx_cleanup_cbfn; | 2384 | rx->rx_cleanup_cbfn = rx_cbfn->rx_cleanup_cbfn; |
2374 | rx->rx_post_cbfn = rx_cbfn->rx_post_cbfn; | 2385 | rx->rx_post_cbfn = rx_cbfn->rx_post_cbfn; |
diff --git a/drivers/net/ethernet/brocade/bna/bna_types.h b/drivers/net/ethernet/brocade/bna/bna_types.h index 242d7997ffb2..d090fbfb12fa 100644 --- a/drivers/net/ethernet/brocade/bna/bna_types.h +++ b/drivers/net/ethernet/brocade/bna/bna_types.h | |||
@@ -847,6 +847,7 @@ struct bna_rx { | |||
847 | void (*rcb_destroy_cbfn)(struct bnad *, struct bna_rcb *); | 847 | void (*rcb_destroy_cbfn)(struct bnad *, struct bna_rcb *); |
848 | void (*ccb_setup_cbfn)(struct bnad *, struct bna_ccb *); | 848 | void (*ccb_setup_cbfn)(struct bnad *, struct bna_ccb *); |
849 | void (*ccb_destroy_cbfn)(struct bnad *, struct bna_ccb *); | 849 | void (*ccb_destroy_cbfn)(struct bnad *, struct bna_ccb *); |
850 | void (*rx_stall_cbfn)(struct bnad *, struct bna_rx *); | ||
850 | void (*rx_cleanup_cbfn)(struct bnad *, struct bna_rx *); | 851 | void (*rx_cleanup_cbfn)(struct bnad *, struct bna_rx *); |
851 | void (*rx_post_cbfn)(struct bnad *, struct bna_rx *); | 852 | void (*rx_post_cbfn)(struct bnad *, struct bna_rx *); |
852 | 853 | ||
@@ -864,6 +865,7 @@ struct bna_rx_event_cbfn { | |||
864 | void (*rcb_destroy_cbfn)(struct bnad *, struct bna_rcb *); | 865 | void (*rcb_destroy_cbfn)(struct bnad *, struct bna_rcb *); |
865 | void (*ccb_setup_cbfn)(struct bnad *, struct bna_ccb *); | 866 | void (*ccb_setup_cbfn)(struct bnad *, struct bna_ccb *); |
866 | void (*ccb_destroy_cbfn)(struct bnad *, struct bna_ccb *); | 867 | void (*ccb_destroy_cbfn)(struct bnad *, struct bna_ccb *); |
868 | void (*rx_stall_cbfn)(struct bnad *, struct bna_rx *); | ||
867 | /* Mandatory */ | 869 | /* Mandatory */ |
868 | void (*rx_cleanup_cbfn)(struct bnad *, struct bna_rx *); | 870 | void (*rx_cleanup_cbfn)(struct bnad *, struct bna_rx *); |
869 | void (*rx_post_cbfn)(struct bnad *, struct bna_rx *); | 871 | void (*rx_post_cbfn)(struct bnad *, struct bna_rx *); |
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c index d76d7cb0dd0e..2f4ced66612a 100644 --- a/drivers/net/ethernet/brocade/bna/bnad.c +++ b/drivers/net/ethernet/brocade/bna/bnad.c | |||
@@ -396,7 +396,7 @@ finishing: | |||
396 | unmap_q->producer_index = unmap_prod; | 396 | unmap_q->producer_index = unmap_prod; |
397 | rcb->producer_index = unmap_prod; | 397 | rcb->producer_index = unmap_prod; |
398 | smp_mb(); | 398 | smp_mb(); |
399 | if (likely(test_bit(BNAD_RXQ_STARTED, &rcb->flags))) | 399 | if (likely(test_bit(BNAD_RXQ_POST_OK, &rcb->flags))) |
400 | bna_rxq_prod_indx_doorbell(rcb); | 400 | bna_rxq_prod_indx_doorbell(rcb); |
401 | } | 401 | } |
402 | } | 402 | } |
@@ -956,6 +956,27 @@ bnad_cb_tx_cleanup(struct bnad *bnad, struct bna_tx *tx) | |||
956 | } | 956 | } |
957 | 957 | ||
958 | static void | 958 | static void |
959 | bnad_cb_rx_stall(struct bnad *bnad, struct bna_rx *rx) | ||
960 | { | ||
961 | struct bnad_rx_info *rx_info = (struct bnad_rx_info *)rx->priv; | ||
962 | struct bna_ccb *ccb; | ||
963 | struct bnad_rx_ctrl *rx_ctrl; | ||
964 | int i; | ||
965 | |||
966 | for (i = 0; i < BNAD_MAX_RXP_PER_RX; i++) { | ||
967 | rx_ctrl = &rx_info->rx_ctrl[i]; | ||
968 | ccb = rx_ctrl->ccb; | ||
969 | if (!ccb) | ||
970 | continue; | ||
971 | |||
972 | clear_bit(BNAD_RXQ_POST_OK, &ccb->rcb[0]->flags); | ||
973 | |||
974 | if (ccb->rcb[1]) | ||
975 | clear_bit(BNAD_RXQ_POST_OK, &ccb->rcb[1]->flags); | ||
976 | } | ||
977 | } | ||
978 | |||
979 | static void | ||
959 | bnad_cb_rx_cleanup(struct bnad *bnad, struct bna_rx *rx) | 980 | bnad_cb_rx_cleanup(struct bnad *bnad, struct bna_rx *rx) |
960 | { | 981 | { |
961 | struct bnad_rx_info *rx_info = (struct bnad_rx_info *)rx->priv; | 982 | struct bnad_rx_info *rx_info = (struct bnad_rx_info *)rx->priv; |
@@ -1009,6 +1030,7 @@ bnad_cb_rx_post(struct bnad *bnad, struct bna_rx *rx) | |||
1009 | bnad_free_all_rxbufs(bnad, rcb); | 1030 | bnad_free_all_rxbufs(bnad, rcb); |
1010 | 1031 | ||
1011 | set_bit(BNAD_RXQ_STARTED, &rcb->flags); | 1032 | set_bit(BNAD_RXQ_STARTED, &rcb->flags); |
1033 | set_bit(BNAD_RXQ_POST_OK, &rcb->flags); | ||
1012 | unmap_q = rcb->unmap_q; | 1034 | unmap_q = rcb->unmap_q; |
1013 | 1035 | ||
1014 | /* Now allocate & post buffers for this RCB */ | 1036 | /* Now allocate & post buffers for this RCB */ |
@@ -1898,6 +1920,7 @@ bnad_setup_rx(struct bnad *bnad, u32 rx_id) | |||
1898 | .rcb_destroy_cbfn = bnad_cb_rcb_destroy, | 1920 | .rcb_destroy_cbfn = bnad_cb_rcb_destroy, |
1899 | .ccb_setup_cbfn = bnad_cb_ccb_setup, | 1921 | .ccb_setup_cbfn = bnad_cb_ccb_setup, |
1900 | .ccb_destroy_cbfn = bnad_cb_ccb_destroy, | 1922 | .ccb_destroy_cbfn = bnad_cb_ccb_destroy, |
1923 | .rx_stall_cbfn = bnad_cb_rx_stall, | ||
1901 | .rx_cleanup_cbfn = bnad_cb_rx_cleanup, | 1924 | .rx_cleanup_cbfn = bnad_cb_rx_cleanup, |
1902 | .rx_post_cbfn = bnad_cb_rx_post, | 1925 | .rx_post_cbfn = bnad_cb_rx_post, |
1903 | }; | 1926 | }; |
diff --git a/drivers/net/ethernet/brocade/bna/bnad.h b/drivers/net/ethernet/brocade/bna/bnad.h index 1c9328d564d2..50fb36aedd5d 100644 --- a/drivers/net/ethernet/brocade/bna/bnad.h +++ b/drivers/net/ethernet/brocade/bna/bnad.h | |||
@@ -103,6 +103,7 @@ struct bnad_rx_ctrl { | |||
103 | /* Bit positions for rcb->flags */ | 103 | /* Bit positions for rcb->flags */ |
104 | #define BNAD_RXQ_REFILL 0 | 104 | #define BNAD_RXQ_REFILL 0 |
105 | #define BNAD_RXQ_STARTED 1 | 105 | #define BNAD_RXQ_STARTED 1 |
106 | #define BNAD_RXQ_POST_OK 2 | ||
106 | 107 | ||
107 | /* Resource limits */ | 108 | /* Resource limits */ |
108 | #define BNAD_NUM_TXQ (bnad->num_tx * bnad->num_txq_per_tx) | 109 | #define BNAD_NUM_TXQ (bnad->num_tx * bnad->num_txq_per_tx) |