aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
diff options
context:
space:
mode:
authorRasesh Mody <rmody@brocade.com>2012-12-11 07:24:51 -0500
committerDavid S. Miller <davem@davemloft.net>2012-12-11 18:25:47 -0500
commit5216562a2ccd037d0eb85a2e8bbfd6315e3f1bb5 (patch)
tree6c22d90daca6d7684f97fdbe331ced936569beaa /drivers/net/ethernet/brocade/bna/bna_tx_rx.c
parent5e46631fdb1e5611969c1e61106a59a3b38af078 (diff)
bna: Tx and Rx Optimizations
Change details: - Have contiguous queue pages for TxQ, RxQ and CQ. Data structure and QPT changes related to contiguous queue pages - Optimized Tx and Rx unmap structures. Tx and Rx fast path changes due to unmap data structure changes - Re-factored Tx and Rx fastpath routines as per the new queue data structures - Implemented bnad_txq_wi_prepare() to program the opcode, flags, frame_len and num_vectors in the work item - Reduced Max TxQ and RxQ depth to 2048 while default value for Tx/Rx queue depth is unaltered (512) Signed-off-by: Rasesh Mody <rmody@brocade.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/brocade/bna/bna_tx_rx.c')
-rw-r--r--drivers/net/ethernet/brocade/bna/bna_tx_rx.c109
1 files changed, 62 insertions, 47 deletions
diff --git a/drivers/net/ethernet/brocade/bna/bna_tx_rx.c b/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
index 71144b396e02..bb5467bd3090 100644
--- a/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
+++ b/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
@@ -1908,6 +1908,9 @@ bna_rxq_qpt_setup(struct bna_rxq *rxq,
1908 struct bna_mem_descr *swqpt_mem, 1908 struct bna_mem_descr *swqpt_mem,
1909 struct bna_mem_descr *page_mem) 1909 struct bna_mem_descr *page_mem)
1910{ 1910{
1911 u8 *kva;
1912 u64 dma;
1913 struct bna_dma_addr bna_dma;
1911 int i; 1914 int i;
1912 1915
1913 rxq->qpt.hw_qpt_ptr.lsb = qpt_mem->dma.lsb; 1916 rxq->qpt.hw_qpt_ptr.lsb = qpt_mem->dma.lsb;
@@ -1917,13 +1920,21 @@ bna_rxq_qpt_setup(struct bna_rxq *rxq,
1917 rxq->qpt.page_size = page_size; 1920 rxq->qpt.page_size = page_size;
1918 1921
1919 rxq->rcb->sw_qpt = (void **) swqpt_mem->kva; 1922 rxq->rcb->sw_qpt = (void **) swqpt_mem->kva;
1923 rxq->rcb->sw_q = page_mem->kva;
1924
1925 kva = page_mem->kva;
1926 BNA_GET_DMA_ADDR(&page_mem->dma, dma);
1920 1927
1921 for (i = 0; i < rxq->qpt.page_count; i++) { 1928 for (i = 0; i < rxq->qpt.page_count; i++) {
1922 rxq->rcb->sw_qpt[i] = page_mem[i].kva; 1929 rxq->rcb->sw_qpt[i] = kva;
1930 kva += PAGE_SIZE;
1931
1932 BNA_SET_DMA_ADDR(dma, &bna_dma);
1923 ((struct bna_dma_addr *)rxq->qpt.kv_qpt_ptr)[i].lsb = 1933 ((struct bna_dma_addr *)rxq->qpt.kv_qpt_ptr)[i].lsb =
1924 page_mem[i].dma.lsb; 1934 bna_dma.lsb;
1925 ((struct bna_dma_addr *)rxq->qpt.kv_qpt_ptr)[i].msb = 1935 ((struct bna_dma_addr *)rxq->qpt.kv_qpt_ptr)[i].msb =
1926 page_mem[i].dma.msb; 1936 bna_dma.msb;
1937 dma += PAGE_SIZE;
1927 } 1938 }
1928} 1939}
1929 1940
@@ -1935,6 +1946,9 @@ bna_rxp_cqpt_setup(struct bna_rxp *rxp,
1935 struct bna_mem_descr *swqpt_mem, 1946 struct bna_mem_descr *swqpt_mem,
1936 struct bna_mem_descr *page_mem) 1947 struct bna_mem_descr *page_mem)
1937{ 1948{
1949 u8 *kva;
1950 u64 dma;
1951 struct bna_dma_addr bna_dma;
1938 int i; 1952 int i;
1939 1953
1940 rxp->cq.qpt.hw_qpt_ptr.lsb = qpt_mem->dma.lsb; 1954 rxp->cq.qpt.hw_qpt_ptr.lsb = qpt_mem->dma.lsb;
@@ -1944,14 +1958,21 @@ bna_rxp_cqpt_setup(struct bna_rxp *rxp,
1944 rxp->cq.qpt.page_size = page_size; 1958 rxp->cq.qpt.page_size = page_size;
1945 1959
1946 rxp->cq.ccb->sw_qpt = (void **) swqpt_mem->kva; 1960 rxp->cq.ccb->sw_qpt = (void **) swqpt_mem->kva;
1961 rxp->cq.ccb->sw_q = page_mem->kva;
1962
1963 kva = page_mem->kva;
1964 BNA_GET_DMA_ADDR(&page_mem->dma, dma);
1947 1965
1948 for (i = 0; i < rxp->cq.qpt.page_count; i++) { 1966 for (i = 0; i < rxp->cq.qpt.page_count; i++) {
1949 rxp->cq.ccb->sw_qpt[i] = page_mem[i].kva; 1967 rxp->cq.ccb->sw_qpt[i] = kva;
1968 kva += PAGE_SIZE;
1950 1969
1970 BNA_SET_DMA_ADDR(dma, &bna_dma);
1951 ((struct bna_dma_addr *)rxp->cq.qpt.kv_qpt_ptr)[i].lsb = 1971 ((struct bna_dma_addr *)rxp->cq.qpt.kv_qpt_ptr)[i].lsb =
1952 page_mem[i].dma.lsb; 1972 bna_dma.lsb;
1953 ((struct bna_dma_addr *)rxp->cq.qpt.kv_qpt_ptr)[i].msb = 1973 ((struct bna_dma_addr *)rxp->cq.qpt.kv_qpt_ptr)[i].msb =
1954 page_mem[i].dma.msb; 1974 bna_dma.msb;
1975 dma += PAGE_SIZE;
1955 } 1976 }
1956} 1977}
1957 1978
@@ -2250,8 +2271,8 @@ bna_rx_res_req(struct bna_rx_config *q_cfg, struct bna_res_info *res_info)
2250 res_info[BNA_RX_RES_MEM_T_CQPT_PAGE].res_type = BNA_RES_T_MEM; 2271 res_info[BNA_RX_RES_MEM_T_CQPT_PAGE].res_type = BNA_RES_T_MEM;
2251 mem_info = &res_info[BNA_RX_RES_MEM_T_CQPT_PAGE].res_u.mem_info; 2272 mem_info = &res_info[BNA_RX_RES_MEM_T_CQPT_PAGE].res_u.mem_info;
2252 mem_info->mem_type = BNA_MEM_T_DMA; 2273 mem_info->mem_type = BNA_MEM_T_DMA;
2253 mem_info->len = PAGE_SIZE; 2274 mem_info->len = PAGE_SIZE * cpage_count;
2254 mem_info->num = cpage_count * q_cfg->num_paths; 2275 mem_info->num = q_cfg->num_paths;
2255 2276
2256 res_info[BNA_RX_RES_MEM_T_DQPT].res_type = BNA_RES_T_MEM; 2277 res_info[BNA_RX_RES_MEM_T_DQPT].res_type = BNA_RES_T_MEM;
2257 mem_info = &res_info[BNA_RX_RES_MEM_T_DQPT].res_u.mem_info; 2278 mem_info = &res_info[BNA_RX_RES_MEM_T_DQPT].res_u.mem_info;
@@ -2268,8 +2289,8 @@ bna_rx_res_req(struct bna_rx_config *q_cfg, struct bna_res_info *res_info)
2268 res_info[BNA_RX_RES_MEM_T_DPAGE].res_type = BNA_RES_T_MEM; 2289 res_info[BNA_RX_RES_MEM_T_DPAGE].res_type = BNA_RES_T_MEM;
2269 mem_info = &res_info[BNA_RX_RES_MEM_T_DPAGE].res_u.mem_info; 2290 mem_info = &res_info[BNA_RX_RES_MEM_T_DPAGE].res_u.mem_info;
2270 mem_info->mem_type = BNA_MEM_T_DMA; 2291 mem_info->mem_type = BNA_MEM_T_DMA;
2271 mem_info->len = PAGE_SIZE; 2292 mem_info->len = PAGE_SIZE * dpage_count;
2272 mem_info->num = dpage_count * q_cfg->num_paths; 2293 mem_info->num = q_cfg->num_paths;
2273 2294
2274 res_info[BNA_RX_RES_MEM_T_HQPT].res_type = BNA_RES_T_MEM; 2295 res_info[BNA_RX_RES_MEM_T_HQPT].res_type = BNA_RES_T_MEM;
2275 mem_info = &res_info[BNA_RX_RES_MEM_T_HQPT].res_u.mem_info; 2296 mem_info = &res_info[BNA_RX_RES_MEM_T_HQPT].res_u.mem_info;
@@ -2286,8 +2307,8 @@ bna_rx_res_req(struct bna_rx_config *q_cfg, struct bna_res_info *res_info)
2286 res_info[BNA_RX_RES_MEM_T_HPAGE].res_type = BNA_RES_T_MEM; 2307 res_info[BNA_RX_RES_MEM_T_HPAGE].res_type = BNA_RES_T_MEM;
2287 mem_info = &res_info[BNA_RX_RES_MEM_T_HPAGE].res_u.mem_info; 2308 mem_info = &res_info[BNA_RX_RES_MEM_T_HPAGE].res_u.mem_info;
2288 mem_info->mem_type = BNA_MEM_T_DMA; 2309 mem_info->mem_type = BNA_MEM_T_DMA;
2289 mem_info->len = (hpage_count ? PAGE_SIZE : 0); 2310 mem_info->len = PAGE_SIZE * hpage_count;
2290 mem_info->num = (hpage_count ? (hpage_count * q_cfg->num_paths) : 0); 2311 mem_info->num = (hpage_count ? q_cfg->num_paths : 0);
2291 2312
2292 res_info[BNA_RX_RES_MEM_T_IBIDX].res_type = BNA_RES_T_MEM; 2313 res_info[BNA_RX_RES_MEM_T_IBIDX].res_type = BNA_RES_T_MEM;
2293 mem_info = &res_info[BNA_RX_RES_MEM_T_IBIDX].res_u.mem_info; 2314 mem_info = &res_info[BNA_RX_RES_MEM_T_IBIDX].res_u.mem_info;
@@ -2332,7 +2353,7 @@ bna_rx_create(struct bna *bna, struct bnad *bnad,
2332 struct bna_mem_descr *dsqpt_mem; 2353 struct bna_mem_descr *dsqpt_mem;
2333 struct bna_mem_descr *hpage_mem; 2354 struct bna_mem_descr *hpage_mem;
2334 struct bna_mem_descr *dpage_mem; 2355 struct bna_mem_descr *dpage_mem;
2335 int i, cpage_idx = 0, dpage_idx = 0, hpage_idx = 0; 2356 int i;
2336 int dpage_count, hpage_count, rcb_idx; 2357 int dpage_count, hpage_count, rcb_idx;
2337 2358
2338 if (!bna_rx_res_check(rx_mod, rx_cfg)) 2359 if (!bna_rx_res_check(rx_mod, rx_cfg))
@@ -2352,14 +2373,14 @@ bna_rx_create(struct bna *bna, struct bnad *bnad,
2352 hpage_mem = &res_info[BNA_RX_RES_MEM_T_HPAGE].res_u.mem_info.mdl[0]; 2373 hpage_mem = &res_info[BNA_RX_RES_MEM_T_HPAGE].res_u.mem_info.mdl[0];
2353 dpage_mem = &res_info[BNA_RX_RES_MEM_T_DPAGE].res_u.mem_info.mdl[0]; 2374 dpage_mem = &res_info[BNA_RX_RES_MEM_T_DPAGE].res_u.mem_info.mdl[0];
2354 2375
2355 page_count = res_info[BNA_RX_RES_MEM_T_CQPT_PAGE].res_u.mem_info.num / 2376 page_count = res_info[BNA_RX_RES_MEM_T_CQPT_PAGE].res_u.mem_info.len /
2356 rx_cfg->num_paths; 2377 PAGE_SIZE;
2357 2378
2358 dpage_count = res_info[BNA_RX_RES_MEM_T_DPAGE].res_u.mem_info.num / 2379 dpage_count = res_info[BNA_RX_RES_MEM_T_DPAGE].res_u.mem_info.len /
2359 rx_cfg->num_paths; 2380 PAGE_SIZE;
2360 2381
2361 hpage_count = res_info[BNA_RX_RES_MEM_T_HPAGE].res_u.mem_info.num / 2382 hpage_count = res_info[BNA_RX_RES_MEM_T_HPAGE].res_u.mem_info.len /
2362 rx_cfg->num_paths; 2383 PAGE_SIZE;
2363 2384
2364 rx = bna_rx_get(rx_mod, rx_cfg->rx_type); 2385 rx = bna_rx_get(rx_mod, rx_cfg->rx_type);
2365 rx->bna = bna; 2386 rx->bna = bna;
@@ -2446,10 +2467,7 @@ bna_rx_create(struct bna *bna, struct bnad *bnad,
2446 q0->rx_packets_with_error = q0->rxbuf_alloc_failed = 0; 2467 q0->rx_packets_with_error = q0->rxbuf_alloc_failed = 0;
2447 2468
2448 bna_rxq_qpt_setup(q0, rxp, dpage_count, PAGE_SIZE, 2469 bna_rxq_qpt_setup(q0, rxp, dpage_count, PAGE_SIZE,
2449 &dqpt_mem[i], &dsqpt_mem[i], &dpage_mem[dpage_idx]); 2470 &dqpt_mem[i], &dsqpt_mem[i], &dpage_mem[i]);
2450 q0->rcb->page_idx = dpage_idx;
2451 q0->rcb->page_count = dpage_count;
2452 dpage_idx += dpage_count;
2453 2471
2454 if (rx->rcb_setup_cbfn) 2472 if (rx->rcb_setup_cbfn)
2455 rx->rcb_setup_cbfn(bnad, q0->rcb); 2473 rx->rcb_setup_cbfn(bnad, q0->rcb);
@@ -2475,10 +2493,7 @@ bna_rx_create(struct bna *bna, struct bnad *bnad,
2475 2493
2476 bna_rxq_qpt_setup(q1, rxp, hpage_count, PAGE_SIZE, 2494 bna_rxq_qpt_setup(q1, rxp, hpage_count, PAGE_SIZE,
2477 &hqpt_mem[i], &hsqpt_mem[i], 2495 &hqpt_mem[i], &hsqpt_mem[i],
2478 &hpage_mem[hpage_idx]); 2496 &hpage_mem[i]);
2479 q1->rcb->page_idx = hpage_idx;
2480 q1->rcb->page_count = hpage_count;
2481 hpage_idx += hpage_count;
2482 2497
2483 if (rx->rcb_setup_cbfn) 2498 if (rx->rcb_setup_cbfn)
2484 rx->rcb_setup_cbfn(bnad, q1->rcb); 2499 rx->rcb_setup_cbfn(bnad, q1->rcb);
@@ -2510,10 +2525,7 @@ bna_rx_create(struct bna *bna, struct bnad *bnad,
2510 rxp->cq.ccb->id = i; 2525 rxp->cq.ccb->id = i;
2511 2526
2512 bna_rxp_cqpt_setup(rxp, page_count, PAGE_SIZE, 2527 bna_rxp_cqpt_setup(rxp, page_count, PAGE_SIZE,
2513 &cqpt_mem[i], &cswqpt_mem[i], &cpage_mem[cpage_idx]); 2528 &cqpt_mem[i], &cswqpt_mem[i], &cpage_mem[i]);
2514 rxp->cq.ccb->page_idx = cpage_idx;
2515 rxp->cq.ccb->page_count = page_count;
2516 cpage_idx += page_count;
2517 2529
2518 if (rx->ccb_setup_cbfn) 2530 if (rx->ccb_setup_cbfn)
2519 rx->ccb_setup_cbfn(bnad, rxp->cq.ccb); 2531 rx->ccb_setup_cbfn(bnad, rxp->cq.ccb);
@@ -3230,6 +3242,9 @@ bna_txq_qpt_setup(struct bna_txq *txq, int page_count, int page_size,
3230 struct bna_mem_descr *swqpt_mem, 3242 struct bna_mem_descr *swqpt_mem,
3231 struct bna_mem_descr *page_mem) 3243 struct bna_mem_descr *page_mem)
3232{ 3244{
3245 u8 *kva;
3246 u64 dma;
3247 struct bna_dma_addr bna_dma;
3233 int i; 3248 int i;
3234 3249
3235 txq->qpt.hw_qpt_ptr.lsb = qpt_mem->dma.lsb; 3250 txq->qpt.hw_qpt_ptr.lsb = qpt_mem->dma.lsb;
@@ -3239,14 +3254,21 @@ bna_txq_qpt_setup(struct bna_txq *txq, int page_count, int page_size,
3239 txq->qpt.page_size = page_size; 3254 txq->qpt.page_size = page_size;
3240 3255
3241 txq->tcb->sw_qpt = (void **) swqpt_mem->kva; 3256 txq->tcb->sw_qpt = (void **) swqpt_mem->kva;
3257 txq->tcb->sw_q = page_mem->kva;
3258
3259 kva = page_mem->kva;
3260 BNA_GET_DMA_ADDR(&page_mem->dma, dma);
3242 3261
3243 for (i = 0; i < page_count; i++) { 3262 for (i = 0; i < page_count; i++) {
3244 txq->tcb->sw_qpt[i] = page_mem[i].kva; 3263 txq->tcb->sw_qpt[i] = kva;
3264 kva += PAGE_SIZE;
3245 3265
3266 BNA_SET_DMA_ADDR(dma, &bna_dma);
3246 ((struct bna_dma_addr *)txq->qpt.kv_qpt_ptr)[i].lsb = 3267 ((struct bna_dma_addr *)txq->qpt.kv_qpt_ptr)[i].lsb =
3247 page_mem[i].dma.lsb; 3268 bna_dma.lsb;
3248 ((struct bna_dma_addr *)txq->qpt.kv_qpt_ptr)[i].msb = 3269 ((struct bna_dma_addr *)txq->qpt.kv_qpt_ptr)[i].msb =
3249 page_mem[i].dma.msb; 3270 bna_dma.msb;
3271 dma += PAGE_SIZE;
3250 } 3272 }
3251} 3273}
3252 3274
@@ -3430,8 +3452,8 @@ bna_tx_res_req(int num_txq, int txq_depth, struct bna_res_info *res_info)
3430 res_info[BNA_TX_RES_MEM_T_PAGE].res_type = BNA_RES_T_MEM; 3452 res_info[BNA_TX_RES_MEM_T_PAGE].res_type = BNA_RES_T_MEM;
3431 mem_info = &res_info[BNA_TX_RES_MEM_T_PAGE].res_u.mem_info; 3453 mem_info = &res_info[BNA_TX_RES_MEM_T_PAGE].res_u.mem_info;
3432 mem_info->mem_type = BNA_MEM_T_DMA; 3454 mem_info->mem_type = BNA_MEM_T_DMA;
3433 mem_info->len = PAGE_SIZE; 3455 mem_info->len = PAGE_SIZE * page_count;
3434 mem_info->num = num_txq * page_count; 3456 mem_info->num = num_txq;
3435 3457
3436 res_info[BNA_TX_RES_MEM_T_IBIDX].res_type = BNA_RES_T_MEM; 3458 res_info[BNA_TX_RES_MEM_T_IBIDX].res_type = BNA_RES_T_MEM;
3437 mem_info = &res_info[BNA_TX_RES_MEM_T_IBIDX].res_u.mem_info; 3459 mem_info = &res_info[BNA_TX_RES_MEM_T_IBIDX].res_u.mem_info;
@@ -3457,14 +3479,11 @@ bna_tx_create(struct bna *bna, struct bnad *bnad,
3457 struct bna_txq *txq; 3479 struct bna_txq *txq;
3458 struct list_head *qe; 3480 struct list_head *qe;
3459 int page_count; 3481 int page_count;
3460 int page_size;
3461 int page_idx;
3462 int i; 3482 int i;
3463 3483
3464 intr_info = &res_info[BNA_TX_RES_INTR_T_TXCMPL].res_u.intr_info; 3484 intr_info = &res_info[BNA_TX_RES_INTR_T_TXCMPL].res_u.intr_info;
3465 page_count = (res_info[BNA_TX_RES_MEM_T_PAGE].res_u.mem_info.num) / 3485 page_count = (res_info[BNA_TX_RES_MEM_T_PAGE].res_u.mem_info.len) /
3466 tx_cfg->num_txq; 3486 PAGE_SIZE;
3467 page_size = res_info[BNA_TX_RES_MEM_T_PAGE].res_u.mem_info.len;
3468 3487
3469 /** 3488 /**
3470 * Get resources 3489 * Get resources
@@ -3529,7 +3548,6 @@ bna_tx_create(struct bna *bna, struct bnad *bnad,
3529 /* TxQ */ 3548 /* TxQ */
3530 3549
3531 i = 0; 3550 i = 0;
3532 page_idx = 0;
3533 list_for_each(qe, &tx->txq_q) { 3551 list_for_each(qe, &tx->txq_q) {
3534 txq = (struct bna_txq *)qe; 3552 txq = (struct bna_txq *)qe;
3535 txq->tcb = (struct bna_tcb *) 3553 txq->tcb = (struct bna_tcb *)
@@ -3569,14 +3587,11 @@ bna_tx_create(struct bna *bna, struct bnad *bnad,
3569 txq->tcb->id = i; 3587 txq->tcb->id = i;
3570 3588
3571 /* QPT, SWQPT, Pages */ 3589 /* QPT, SWQPT, Pages */
3572 bna_txq_qpt_setup(txq, page_count, page_size, 3590 bna_txq_qpt_setup(txq, page_count, PAGE_SIZE,
3573 &res_info[BNA_TX_RES_MEM_T_QPT].res_u.mem_info.mdl[i], 3591 &res_info[BNA_TX_RES_MEM_T_QPT].res_u.mem_info.mdl[i],
3574 &res_info[BNA_TX_RES_MEM_T_SWQPT].res_u.mem_info.mdl[i], 3592 &res_info[BNA_TX_RES_MEM_T_SWQPT].res_u.mem_info.mdl[i],
3575 &res_info[BNA_TX_RES_MEM_T_PAGE]. 3593 &res_info[BNA_TX_RES_MEM_T_PAGE].
3576 res_u.mem_info.mdl[page_idx]); 3594 res_u.mem_info.mdl[i]);
3577 txq->tcb->page_idx = page_idx;
3578 txq->tcb->page_count = page_count;
3579 page_idx += page_count;
3580 3595
3581 /* Callback to bnad for setting up TCB */ 3596 /* Callback to bnad for setting up TCB */
3582 if (tx->tcb_setup_cbfn) 3597 if (tx->tcb_setup_cbfn)