aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRasesh Mody <rmody@brocade.com>2011-08-30 11:27:44 -0400
committerDavid S. Miller <davem@davemloft.net>2011-09-15 15:36:33 -0400
commit761fab374e5b8efa6f7a8650ff546905578a482d (patch)
treedfa3e9a97a5e5345a17145dd7dace2383629d608
parenta2122d95be5bab420741167913a9f39af673d11c (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.c29
-rw-r--r--drivers/net/ethernet/brocade/bna/bna_hw_defs.h4
-rw-r--r--drivers/net/ethernet/brocade/bna/bna_types.h1
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
1697static 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
1696static void 1707static void
1697bna_ioceth_init(struct bna_ioceth *ioceth, struct bna *bna, 1708bna_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)
2036int 2049int
2037bna_num_txq_set(struct bna *bna, int num_txq) 2050bna_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)
2047int 2061int
2048bna_num_rxp_set(struct bna *bna, int num_rxp) 2062bna_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
325struct bna_attr { 325struct 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;