aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAvinash Patil <patila@marvell.com>2013-02-08 21:18:07 -0500
committerJohn W. Linville <linville@tuxdriver.com>2013-02-11 15:34:57 -0500
commit0732484b47b57ef90bb08408d60fddbad0262d82 (patch)
treeb62e9f6a8b1ed831f8f5c7132333c5cac457bb60
parentdd04e6acd828d51255fbb2d9b7b0e5b85df04f0b (diff)
mwifiex: separate ring initialization and ring creation routines
This patch separates PCIe ring initialization from ring creation routines. This modularizes ring creation(TXBD, RXBD and event rings) functions. Readability has been improved while moving the code around. Signed-off-by: Avinash Patil <patila@marvell.com> Signed-off-by: Bing Zhao <bzhao@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/mwifiex/pcie.c327
1 files changed, 194 insertions, 133 deletions
diff --git a/drivers/net/wireless/mwifiex/pcie.c b/drivers/net/wireless/mwifiex/pcie.c
index 29c539b9424b..06aae55485e5 100644
--- a/drivers/net/wireless/mwifiex/pcie.c
+++ b/drivers/net/wireless/mwifiex/pcie.c
@@ -372,13 +372,199 @@ static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
372} 372}
373 373
374/* 374/*
375 * This function creates buffer descriptor ring for TX 375 * This function initializes TX buffer ring descriptors
376 */
377static int mwifiex_init_txq_ring(struct mwifiex_adapter *adapter)
378{
379 struct pcie_service_card *card = adapter->card;
380 struct mwifiex_pcie_buf_desc *desc;
381 int i;
382
383 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
384 card->tx_buf_list[i] = NULL;
385 card->txbd_ring[i] = (void *)(card->txbd_ring_vbase +
386 (sizeof(*desc) * i));
387 desc = card->txbd_ring[i];
388 memset(desc, 0, sizeof(*desc));
389 }
390
391 return 0;
392}
393
394/* This function initializes RX buffer ring descriptors. Each SKB is allocated
395 * here and after mapping PCI memory, its physical address is assigned to
396 * PCIE Rx buffer descriptor's physical address.
397 */
398static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
399{
400 struct pcie_service_card *card = adapter->card;
401 struct sk_buff *skb;
402 struct mwifiex_pcie_buf_desc *desc;
403 dma_addr_t buf_pa;
404 int i;
405
406 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
407 /* Allocate skb here so that firmware can DMA data from it */
408 skb = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
409 if (!skb) {
410 dev_err(adapter->dev,
411 "Unable to allocate skb for RX ring.\n");
412 kfree(card->rxbd_ring_vbase);
413 return -ENOMEM;
414 }
415
416 if (mwifiex_map_pci_memory(adapter, skb,
417 MWIFIEX_RX_DATA_BUF_SIZE,
418 PCI_DMA_FROMDEVICE))
419 return -1;
420
421 MWIFIEX_SKB_PACB(skb, &buf_pa);
422
423 dev_dbg(adapter->dev,
424 "info: RX ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
425 skb, skb->len, skb->data, (u32)buf_pa,
426 (u32)((u64)buf_pa >> 32));
427
428 card->rx_buf_list[i] = skb;
429 card->rxbd_ring[i] = (void *)(card->rxbd_ring_vbase +
430 (sizeof(*desc) * i));
431 desc = card->rxbd_ring[i];
432 desc->paddr = buf_pa;
433 desc->len = (u16)skb->len;
434 desc->flags = 0;
435 }
436
437 return 0;
438}
439
440/* This function initializes event buffer ring descriptors. Each SKB is
441 * allocated here and after mapping PCI memory, its physical address is assigned
442 * to PCIE Rx buffer descriptor's physical address
443 */
444static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)
445{
446 struct pcie_service_card *card = adapter->card;
447 struct mwifiex_pcie_buf_desc *desc;
448 struct sk_buff *skb;
449 dma_addr_t buf_pa;
450 int i;
451
452 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
453 /* Allocate skb here so that firmware can DMA data from it */
454 skb = dev_alloc_skb(MAX_EVENT_SIZE);
455 if (!skb) {
456 dev_err(adapter->dev,
457 "Unable to allocate skb for EVENT buf.\n");
458 kfree(card->evtbd_ring_vbase);
459 return -ENOMEM;
460 }
461 skb_put(skb, MAX_EVENT_SIZE);
462
463 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
464 PCI_DMA_FROMDEVICE))
465 return -1;
466
467 MWIFIEX_SKB_PACB(skb, &buf_pa);
468
469 dev_dbg(adapter->dev,
470 "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
471 skb, skb->len, skb->data, (u32)buf_pa,
472 (u32)((u64)buf_pa >> 32));
473
474 card->evt_buf_list[i] = skb;
475 card->evtbd_ring[i] = (void *)(card->evtbd_ring_vbase +
476 (sizeof(*desc) * i));
477
478 desc = card->evtbd_ring[i];
479 desc->paddr = buf_pa;
480 desc->len = (u16)skb->len;
481 desc->flags = 0;
482 }
483
484 return 0;
485}
486
487/* This function cleans up TX buffer rings. If any of the buffer list has valid
488 * SKB address, associated SKB is freed.
489 */
490static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter)
491{
492 struct pcie_service_card *card = adapter->card;
493 struct sk_buff *skb;
494 struct mwifiex_pcie_buf_desc *desc;
495 int i;
496
497 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
498 desc = card->txbd_ring[i];
499 if (card->tx_buf_list[i]) {
500 skb = card->tx_buf_list[i];
501 pci_unmap_single(card->dev, desc->paddr, skb->len,
502 PCI_DMA_TODEVICE);
503 dev_kfree_skb_any(skb);
504 }
505 card->tx_buf_list[i] = NULL;
506 memset(desc, 0, sizeof(*desc));
507 }
508
509 return;
510}
511
512/* This function cleans up RX buffer rings. If any of the buffer list has valid
513 * SKB address, associated SKB is freed.
514 */
515static void mwifiex_cleanup_rxq_ring(struct mwifiex_adapter *adapter)
516{
517 struct pcie_service_card *card = adapter->card;
518 struct mwifiex_pcie_buf_desc *desc;
519 struct sk_buff *skb;
520 int i;
521
522 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
523 desc = card->rxbd_ring[i];
524 if (card->rx_buf_list[i]) {
525 skb = card->rx_buf_list[i];
526 pci_unmap_single(card->dev, desc->paddr,
527 MWIFIEX_RX_DATA_BUF_SIZE,
528 PCI_DMA_FROMDEVICE);
529 dev_kfree_skb_any(skb);
530 }
531 memset(desc, 0, sizeof(*desc));
532 }
533
534 return;
535}
536
537/* This function cleans up event buffer rings. If any of the buffer list has
538 * valid SKB address, associated SKB is freed.
539 */
540static void mwifiex_cleanup_evt_ring(struct mwifiex_adapter *adapter)
541{
542 struct pcie_service_card *card = adapter->card;
543 struct mwifiex_pcie_buf_desc *desc;
544 struct sk_buff *skb;
545 int i;
546
547 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
548 desc = card->evtbd_ring[i];
549 if (card->evt_buf_list[i]) {
550 skb = card->evt_buf_list[i];
551 pci_unmap_single(card->dev, desc->paddr, MAX_EVENT_SIZE,
552 PCI_DMA_FROMDEVICE);
553 dev_kfree_skb_any(skb);
554 }
555 card->evt_buf_list[i] = NULL;
556 memset(desc, 0, sizeof(*desc));
557 }
558
559 return;
560}
561
562/* This function creates buffer descriptor ring for TX
376 */ 563 */
377static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter) 564static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
378{ 565{
379 struct pcie_service_card *card = adapter->card; 566 struct pcie_service_card *card = adapter->card;
380 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 567 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
381 int i;
382 568
383 /* 569 /*
384 * driver maintaines the write pointer and firmware maintaines the read 570 * driver maintaines the write pointer and firmware maintaines the read
@@ -408,41 +594,15 @@ static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
408 card->txbd_ring_vbase, (unsigned int)card->txbd_ring_pbase, 594 card->txbd_ring_vbase, (unsigned int)card->txbd_ring_pbase,
409 (u32)((u64)card->txbd_ring_pbase >> 32), card->txbd_ring_size); 595 (u32)((u64)card->txbd_ring_pbase >> 32), card->txbd_ring_size);
410 596
411 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) { 597 return mwifiex_init_txq_ring(adapter);
412 card->txbd_ring[i] = (struct mwifiex_pcie_buf_desc *)
413 (card->txbd_ring_vbase +
414 (sizeof(struct mwifiex_pcie_buf_desc)
415 * i));
416
417 card->tx_buf_list[i] = NULL;
418 card->txbd_ring[i]->paddr = 0;
419 card->txbd_ring[i]->len = 0;
420 card->txbd_ring[i]->flags = 0;
421 }
422
423 return 0;
424} 598}
425 599
426static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter) 600static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
427{ 601{
428 struct pcie_service_card *card = adapter->card; 602 struct pcie_service_card *card = adapter->card;
429 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 603 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
430 struct sk_buff *skb;
431 int i;
432 604
433 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) { 605 mwifiex_cleanup_txq_ring(adapter);
434 if (card->tx_buf_list[i]) {
435 skb = card->tx_buf_list[i];
436 pci_unmap_single(card->dev, card->txbd_ring[i]->paddr,
437 skb->len, PCI_DMA_TODEVICE);
438 dev_kfree_skb_any(skb);
439 }
440 card->tx_buf_list[i] = NULL;
441 card->txbd_ring[i]->paddr = 0;
442 card->txbd_ring[i]->len = 0;
443 card->txbd_ring[i]->flags = 0;
444 card->txbd_ring[i] = NULL;
445 }
446 606
447 if (card->txbd_ring_vbase) 607 if (card->txbd_ring_vbase)
448 pci_free_consistent(card->dev, card->txbd_ring_size, 608 pci_free_consistent(card->dev, card->txbd_ring_size,
@@ -464,9 +624,6 @@ static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
464{ 624{
465 struct pcie_service_card *card = adapter->card; 625 struct pcie_service_card *card = adapter->card;
466 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 626 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
467 struct sk_buff *skb;
468 int i;
469 dma_addr_t buf_pa;
470 627
471 /* 628 /*
472 * driver maintaines the read pointer and firmware maintaines the write 629 * driver maintaines the read pointer and firmware maintaines the write
@@ -496,39 +653,7 @@ static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
496 (u32)((u64)card->rxbd_ring_pbase >> 32), 653 (u32)((u64)card->rxbd_ring_pbase >> 32),
497 card->rxbd_ring_size); 654 card->rxbd_ring_size);
498 655
499 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) { 656 return mwifiex_init_rxq_ring(adapter);
500 card->rxbd_ring[i] = (struct mwifiex_pcie_buf_desc *)
501 (card->rxbd_ring_vbase +
502 (sizeof(struct mwifiex_pcie_buf_desc)
503 * i));
504
505 /* Allocate skb here so that firmware can DMA data from it */
506 skb = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
507 if (!skb) {
508 dev_err(adapter->dev,
509 "Unable to allocate skb for RX ring.\n");
510 kfree(card->rxbd_ring_vbase);
511 return -ENOMEM;
512 }
513 if (mwifiex_map_pci_memory(adapter, skb,
514 MWIFIEX_RX_DATA_BUF_SIZE,
515 PCI_DMA_FROMDEVICE))
516 return -1;
517
518 MWIFIEX_SKB_PACB(skb, &buf_pa);
519
520 dev_dbg(adapter->dev, "info: RX ring: add new skb base: %p, "
521 "buf_base: %p, buf_pbase: %#x:%x, buf_len: %#x\n",
522 skb, skb->data, (u32)buf_pa, (u32)((u64)buf_pa >> 32),
523 skb->len);
524
525 card->rx_buf_list[i] = skb;
526 card->rxbd_ring[i]->paddr = buf_pa;
527 card->rxbd_ring[i]->len = (u16)skb->len;
528 card->rxbd_ring[i]->flags = 0;
529 }
530
531 return 0;
532} 657}
533 658
534/* 659/*
@@ -538,23 +663,8 @@ static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
538{ 663{
539 struct pcie_service_card *card = adapter->card; 664 struct pcie_service_card *card = adapter->card;
540 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 665 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
541 struct sk_buff *skb;
542 int i;
543 666
544 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) { 667 mwifiex_cleanup_rxq_ring(adapter);
545 if (card->rx_buf_list[i]) {
546 skb = card->rx_buf_list[i];
547 pci_unmap_single(card->dev, card->rxbd_ring[i]->paddr ,
548 MWIFIEX_RX_DATA_BUF_SIZE,
549 PCI_DMA_FROMDEVICE);
550 dev_kfree_skb_any(skb);
551 }
552 card->rx_buf_list[i] = NULL;
553 card->rxbd_ring[i]->paddr = 0;
554 card->rxbd_ring[i]->len = 0;
555 card->rxbd_ring[i]->flags = 0;
556 card->rxbd_ring[i] = NULL;
557 }
558 668
559 if (card->rxbd_ring_vbase) 669 if (card->rxbd_ring_vbase)
560 pci_free_consistent(card->dev, card->rxbd_ring_size, 670 pci_free_consistent(card->dev, card->rxbd_ring_size,
@@ -576,9 +686,6 @@ static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
576{ 686{
577 struct pcie_service_card *card = adapter->card; 687 struct pcie_service_card *card = adapter->card;
578 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 688 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
579 struct sk_buff *skb;
580 int i;
581 dma_addr_t buf_pa;
582 689
583 /* 690 /*
584 * driver maintaines the read pointer and firmware maintaines the write 691 * driver maintaines the read pointer and firmware maintaines the write
@@ -608,39 +715,7 @@ static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
608 (u32)((u64)card->evtbd_ring_pbase >> 32), 715 (u32)((u64)card->evtbd_ring_pbase >> 32),
609 card->evtbd_ring_size); 716 card->evtbd_ring_size);
610 717
611 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) { 718 return mwifiex_pcie_init_evt_ring(adapter);
612 card->evtbd_ring[i] = (struct mwifiex_pcie_buf_desc *)
613 (card->evtbd_ring_vbase +
614 (sizeof(struct mwifiex_pcie_buf_desc)
615 * i));
616
617 /* Allocate skb here so that firmware can DMA data from it */
618 skb = dev_alloc_skb(MAX_EVENT_SIZE);
619 if (!skb) {
620 dev_err(adapter->dev,
621 "Unable to allocate skb for EVENT buf.\n");
622 kfree(card->evtbd_ring_vbase);
623 return -ENOMEM;
624 }
625 skb_put(skb, MAX_EVENT_SIZE);
626
627 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
628 PCI_DMA_FROMDEVICE))
629 return -1;
630
631 MWIFIEX_SKB_PACB(skb, &buf_pa);
632 dev_dbg(adapter->dev, "info: Evt ring: add new skb. base: %p, "
633 "buf_base: %p, buf_pbase: %#x:%x, buf_len: %#x\n",
634 skb, skb->data, (u32)buf_pa, (u32)((u64)buf_pa >> 32),
635 skb->len);
636
637 card->evt_buf_list[i] = skb;
638 card->evtbd_ring[i]->paddr = buf_pa;
639 card->evtbd_ring[i]->len = (u16)skb->len;
640 card->evtbd_ring[i]->flags = 0;
641 }
642
643 return 0;
644} 719}
645 720
646/* 721/*
@@ -650,22 +725,8 @@ static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
650{ 725{
651 struct pcie_service_card *card = adapter->card; 726 struct pcie_service_card *card = adapter->card;
652 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 727 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
653 struct sk_buff *skb;
654 int i;
655 728
656 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) { 729 mwifiex_cleanup_evt_ring(adapter);
657 if (card->evt_buf_list[i]) {
658 skb = card->evt_buf_list[i];
659 pci_unmap_single(card->dev, card->evtbd_ring[i]->paddr,
660 MAX_EVENT_SIZE, PCI_DMA_FROMDEVICE);
661 dev_kfree_skb_any(skb);
662 }
663 card->evt_buf_list[i] = NULL;
664 card->evtbd_ring[i]->paddr = 0;
665 card->evtbd_ring[i]->len = 0;
666 card->evtbd_ring[i]->flags = 0;
667 card->evtbd_ring[i] = NULL;
668 }
669 730
670 if (card->evtbd_ring_vbase) 731 if (card->evtbd_ring_vbase)
671 pci_free_consistent(card->dev, card->evtbd_ring_size, 732 pci_free_consistent(card->dev, card->evtbd_ring_size,