diff options
author | Rasesh Mody <rmody@brocade.com> | 2011-08-30 11:27:44 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-09-15 15:36:33 -0400 |
commit | 761fab374e5b8efa6f7a8650ff546905578a482d (patch) | |
tree | dfa3e9a97a5e5345a17145dd7dace2383629d608 | |
parent | a2122d95be5bab420741167913a9f39af673d11c (diff) |
bna: Async Mode Tx Rx Init Fix
Change details:
- Async mode of Tx/Rx queue initialization in BNAD from a task queue context
runs into non-unique taskq allocation issues. Get rid of Tx/Rx
initialization from task q context
- In the attach function, wait for IOC enable, then do Tx/Rx queue
initialization. Default BNA attributes are used when IOC enable from attach
fails and values are set to:
1 TxQ, 1 RxQ, 1 Unicast MAC, 1 RIT entry
Signed-off-by: Gurunatha Karaje <gkaraje@brocade.com>
Signed-off-by: Rasesh Mody <rmody@brocade.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/brocade/bna/bna_enet.c | 29 | ||||
-rw-r--r-- | drivers/net/ethernet/brocade/bna/bna_hw_defs.h | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/brocade/bna/bna_types.h | 1 |
3 files changed, 27 insertions, 7 deletions
diff --git a/drivers/net/ethernet/brocade/bna/bna_enet.c b/drivers/net/ethernet/brocade/bna/bna_enet.c index 68a275d66fcf..26f5c5abfd1f 100644 --- a/drivers/net/ethernet/brocade/bna/bna_enet.c +++ b/drivers/net/ethernet/brocade/bna/bna_enet.c | |||
@@ -167,13 +167,14 @@ bna_bfi_attr_get_rsp(struct bna_ioceth *ioceth, | |||
167 | * Store only if not set earlier, since BNAD can override the HW | 167 | * Store only if not set earlier, since BNAD can override the HW |
168 | * attributes | 168 | * attributes |
169 | */ | 169 | */ |
170 | if (!ioceth->attr.num_txq) | 170 | if (!ioceth->attr.fw_query_complete) { |
171 | ioceth->attr.num_txq = ntohl(rsp->max_cfg); | 171 | ioceth->attr.num_txq = ntohl(rsp->max_cfg); |
172 | if (!ioceth->attr.num_rxp) | ||
173 | ioceth->attr.num_rxp = ntohl(rsp->max_cfg); | 172 | ioceth->attr.num_rxp = ntohl(rsp->max_cfg); |
174 | ioceth->attr.num_ucmac = ntohl(rsp->max_ucmac); | 173 | ioceth->attr.num_ucmac = ntohl(rsp->max_ucmac); |
175 | ioceth->attr.num_mcmac = BFI_ENET_MAX_MCAM; | 174 | ioceth->attr.num_mcmac = BFI_ENET_MAX_MCAM; |
176 | ioceth->attr.max_rit_size = ntohl(rsp->rit_size); | 175 | ioceth->attr.max_rit_size = ntohl(rsp->rit_size); |
176 | ioceth->attr.fw_query_complete = true; | ||
177 | } | ||
177 | 178 | ||
178 | bfa_fsm_send_event(ioceth, IOCETH_E_ENET_ATTR_RESP); | 179 | bfa_fsm_send_event(ioceth, IOCETH_E_ENET_ATTR_RESP); |
179 | } | 180 | } |
@@ -1693,6 +1694,16 @@ static struct bfa_ioc_cbfn bna_ioceth_cbfn = { | |||
1693 | bna_cb_ioceth_reset | 1694 | bna_cb_ioceth_reset |
1694 | }; | 1695 | }; |
1695 | 1696 | ||
1697 | static void bna_attr_init(struct bna_ioceth *ioceth) | ||
1698 | { | ||
1699 | ioceth->attr.num_txq = BFI_ENET_DEF_TXQ; | ||
1700 | ioceth->attr.num_rxp = BFI_ENET_DEF_RXP; | ||
1701 | ioceth->attr.num_ucmac = BFI_ENET_DEF_UCAM; | ||
1702 | ioceth->attr.num_mcmac = BFI_ENET_MAX_MCAM; | ||
1703 | ioceth->attr.max_rit_size = BFI_ENET_DEF_RITSZ; | ||
1704 | ioceth->attr.fw_query_complete = false; | ||
1705 | } | ||
1706 | |||
1696 | static void | 1707 | static void |
1697 | bna_ioceth_init(struct bna_ioceth *ioceth, struct bna *bna, | 1708 | bna_ioceth_init(struct bna_ioceth *ioceth, struct bna *bna, |
1698 | struct bna_res_info *res_info) | 1709 | struct bna_res_info *res_info) |
@@ -1738,6 +1749,8 @@ bna_ioceth_init(struct bna_ioceth *ioceth, struct bna *bna, | |||
1738 | ioceth->stop_cbfn = NULL; | 1749 | ioceth->stop_cbfn = NULL; |
1739 | ioceth->stop_cbarg = NULL; | 1750 | ioceth->stop_cbarg = NULL; |
1740 | 1751 | ||
1752 | bna_attr_init(ioceth); | ||
1753 | |||
1741 | bfa_fsm_set_state(ioceth, bna_ioceth_sm_stopped); | 1754 | bfa_fsm_set_state(ioceth, bna_ioceth_sm_stopped); |
1742 | } | 1755 | } |
1743 | 1756 | ||
@@ -2036,7 +2049,8 @@ bna_uninit(struct bna *bna) | |||
2036 | int | 2049 | int |
2037 | bna_num_txq_set(struct bna *bna, int num_txq) | 2050 | bna_num_txq_set(struct bna *bna, int num_txq) |
2038 | { | 2051 | { |
2039 | if (num_txq > 0 && (num_txq <= bna->ioceth.attr.num_txq)) { | 2052 | if (bna->ioceth.attr.fw_query_complete && |
2053 | (num_txq <= bna->ioceth.attr.num_txq)) { | ||
2040 | bna->ioceth.attr.num_txq = num_txq; | 2054 | bna->ioceth.attr.num_txq = num_txq; |
2041 | return BNA_CB_SUCCESS; | 2055 | return BNA_CB_SUCCESS; |
2042 | } | 2056 | } |
@@ -2047,7 +2061,8 @@ bna_num_txq_set(struct bna *bna, int num_txq) | |||
2047 | int | 2061 | int |
2048 | bna_num_rxp_set(struct bna *bna, int num_rxp) | 2062 | bna_num_rxp_set(struct bna *bna, int num_rxp) |
2049 | { | 2063 | { |
2050 | if (num_rxp > 0 && (num_rxp <= bna->ioceth.attr.num_rxp)) { | 2064 | if (bna->ioceth.attr.fw_query_complete && |
2065 | (num_rxp <= bna->ioceth.attr.num_rxp)) { | ||
2051 | bna->ioceth.attr.num_rxp = num_rxp; | 2066 | bna->ioceth.attr.num_rxp = num_rxp; |
2052 | return BNA_CB_SUCCESS; | 2067 | return BNA_CB_SUCCESS; |
2053 | } | 2068 | } |
diff --git a/drivers/net/ethernet/brocade/bna/bna_hw_defs.h b/drivers/net/ethernet/brocade/bna/bna_hw_defs.h index 7ecdca559c35..dde8a463b8d9 100644 --- a/drivers/net/ethernet/brocade/bna/bna_hw_defs.h +++ b/drivers/net/ethernet/brocade/bna/bna_hw_defs.h | |||
@@ -30,6 +30,10 @@ | |||
30 | * SW imposed limits | 30 | * SW imposed limits |
31 | * | 31 | * |
32 | */ | 32 | */ |
33 | #define BFI_ENET_DEF_TXQ 1 | ||
34 | #define BFI_ENET_DEF_RXP 1 | ||
35 | #define BFI_ENET_DEF_UCAM 1 | ||
36 | #define BFI_ENET_DEF_RITSZ 1 | ||
33 | 37 | ||
34 | #define BFI_ENET_MAX_MCAM 256 | 38 | #define BFI_ENET_MAX_MCAM 256 |
35 | 39 | ||
diff --git a/drivers/net/ethernet/brocade/bna/bna_types.h b/drivers/net/ethernet/brocade/bna/bna_types.h index 59417b1f56a9..242d7997ffb2 100644 --- a/drivers/net/ethernet/brocade/bna/bna_types.h +++ b/drivers/net/ethernet/brocade/bna/bna_types.h | |||
@@ -323,6 +323,7 @@ struct bna_qpt { | |||
323 | }; | 323 | }; |
324 | 324 | ||
325 | struct bna_attr { | 325 | struct bna_attr { |
326 | bool fw_query_complete; | ||
326 | int num_txq; | 327 | int num_txq; |
327 | int num_rxp; | 328 | int num_rxp; |
328 | int num_ucmac; | 329 | int num_ucmac; |