aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/pcie
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2012-12-27 17:08:06 -0500
committerJohannes Berg <johannes.berg@intel.com>2013-01-03 09:32:45 -0500
commita8b691e6104e6bd27070b6ed6622d0b640707fa8 (patch)
treea45df98035a34ab5ecce4eee153fb9dad8d70650 /drivers/net/wireless/iwlwifi/pcie
parent653ea7a6a5a912a96affc6443b6e9f42dfce2234 (diff)
iwlwifi: request IRQ only once
There's no need to request the IRQ every time the device is started, we can request it just once. Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/pcie')
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/internal.h4
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/trans.c62
2 files changed, 25 insertions, 41 deletions
diff --git a/drivers/net/wireless/iwlwifi/pcie/internal.h b/drivers/net/wireless/iwlwifi/pcie/internal.h
index 15f79754b67b..8f017c34ab2b 100644
--- a/drivers/net/wireless/iwlwifi/pcie/internal.h
+++ b/drivers/net/wireless/iwlwifi/pcie/internal.h
@@ -222,8 +222,6 @@ struct iwl_txq {
222 * @rx_replenish: work that will be called when buffers need to be allocated 222 * @rx_replenish: work that will be called when buffers need to be allocated
223 * @drv - pointer to iwl_drv 223 * @drv - pointer to iwl_drv
224 * @trans: pointer to the generic transport area 224 * @trans: pointer to the generic transport area
225 * @irq - the irq number for the device
226 * @irq_requested: true when the irq has been requested
227 * @scd_base_addr: scheduler sram base address in SRAM 225 * @scd_base_addr: scheduler sram base address in SRAM
228 * @scd_bc_tbls: pointer to the byte count table of the scheduler 226 * @scd_bc_tbls: pointer to the byte count table of the scheduler
229 * @kw: keep warm address 227 * @kw: keep warm address
@@ -250,11 +248,9 @@ struct iwl_trans_pcie {
250 int ict_index; 248 int ict_index;
251 u32 inta; 249 u32 inta;
252 bool use_ict; 250 bool use_ict;
253 bool irq_requested;
254 struct tasklet_struct irq_tasklet; 251 struct tasklet_struct irq_tasklet;
255 struct isr_statistics isr_stats; 252 struct isr_statistics isr_stats;
256 253
257 unsigned int irq;
258 spinlock_t irq_lock; 254 spinlock_t irq_lock;
259 u32 inta_mask; 255 u32 inta_mask;
260 u32 scd_base_addr; 256 u32 scd_base_addr;
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c
index 3a40607ed542..48cd65e950a1 100644
--- a/drivers/net/wireless/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/iwlwifi/pcie/trans.c
@@ -535,7 +535,7 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)
535 iwl_enable_rfkill_int(trans); 535 iwl_enable_rfkill_int(trans);
536 536
537 /* wait to make sure we flush pending tasklet*/ 537 /* wait to make sure we flush pending tasklet*/
538 synchronize_irq(trans_pcie->irq); 538 synchronize_irq(trans_pcie->pci_dev->irq);
539 tasklet_kill(&trans_pcie->irq_tasklet); 539 tasklet_kill(&trans_pcie->irq_tasklet);
540 540
541 cancel_work_sync(&trans_pcie->rx_replenish); 541 cancel_work_sync(&trans_pcie->rx_replenish);
@@ -564,33 +564,13 @@ static void iwl_trans_pcie_wowlan_suspend(struct iwl_trans *trans)
564 564
565static int iwl_trans_pcie_start_hw(struct iwl_trans *trans) 565static int iwl_trans_pcie_start_hw(struct iwl_trans *trans)
566{ 566{
567 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
568 int err;
569 bool hw_rfkill; 567 bool hw_rfkill;
570 568 int err;
571 trans_pcie->inta_mask = CSR_INI_SET_MASK;
572
573 if (!trans_pcie->irq_requested) {
574 tasklet_init(&trans_pcie->irq_tasklet, (void (*)(unsigned long))
575 iwl_pcie_tasklet, (unsigned long)trans);
576
577 iwl_pcie_alloc_ict(trans);
578
579 err = request_irq(trans_pcie->irq, iwl_pcie_isr_ict,
580 IRQF_SHARED, DRV_NAME, trans);
581 if (err) {
582 IWL_ERR(trans, "Error allocating IRQ %d\n",
583 trans_pcie->irq);
584 goto error;
585 }
586
587 trans_pcie->irq_requested = true;
588 }
589 569
590 err = iwl_pcie_prepare_card_hw(trans); 570 err = iwl_pcie_prepare_card_hw(trans);
591 if (err) { 571 if (err) {
592 IWL_ERR(trans, "Error while preparing HW: %d\n", err); 572 IWL_ERR(trans, "Error while preparing HW: %d\n", err);
593 goto err_free_irq; 573 return err;
594 } 574 }
595 575
596 iwl_pcie_apm_init(trans); 576 iwl_pcie_apm_init(trans);
@@ -601,15 +581,7 @@ static int iwl_trans_pcie_start_hw(struct iwl_trans *trans)
601 hw_rfkill = iwl_is_rfkill_set(trans); 581 hw_rfkill = iwl_is_rfkill_set(trans);
602 iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill); 582 iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill);
603 583
604 return err; 584 return 0;
605
606err_free_irq:
607 trans_pcie->irq_requested = false;
608 free_irq(trans_pcie->irq, trans);
609error:
610 iwl_pcie_free_ict(trans);
611 tasklet_kill(&trans_pcie->irq_tasklet);
612 return err;
613} 585}
614 586
615static void iwl_trans_pcie_stop_hw(struct iwl_trans *trans, 587static void iwl_trans_pcie_stop_hw(struct iwl_trans *trans,
@@ -713,10 +685,8 @@ void iwl_trans_pcie_free(struct iwl_trans *trans)
713 iwl_pcie_tx_free(trans); 685 iwl_pcie_tx_free(trans);
714 iwl_pcie_rx_free(trans); 686 iwl_pcie_rx_free(trans);
715 687
716 if (trans_pcie->irq_requested == true) { 688 free_irq(trans_pcie->pci_dev->irq, trans);
717 free_irq(trans_pcie->irq, trans); 689 iwl_pcie_free_ict(trans);
718 iwl_pcie_free_ict(trans);
719 }
720 690
721 pci_disable_msi(trans_pcie->pci_dev); 691 pci_disable_msi(trans_pcie->pci_dev);
722 iounmap(trans_pcie->hw_base); 692 iounmap(trans_pcie->hw_base);
@@ -1424,7 +1394,6 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
1424 } 1394 }
1425 1395
1426 trans->dev = &pdev->dev; 1396 trans->dev = &pdev->dev;
1427 trans_pcie->irq = pdev->irq;
1428 trans_pcie->pci_dev = pdev; 1397 trans_pcie->pci_dev = pdev;
1429 trans->hw_rev = iwl_read32(trans, CSR_HW_REV); 1398 trans->hw_rev = iwl_read32(trans, CSR_HW_REV);
1430 trans->hw_id = (pdev->device << 16) + pdev->subsystem_device; 1399 trans->hw_id = (pdev->device << 16) + pdev->subsystem_device;
@@ -1450,8 +1419,27 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
1450 if (!trans->dev_cmd_pool) 1419 if (!trans->dev_cmd_pool)
1451 goto out_pci_disable_msi; 1420 goto out_pci_disable_msi;
1452 1421
1422 trans_pcie->inta_mask = CSR_INI_SET_MASK;
1423
1424 tasklet_init(&trans_pcie->irq_tasklet, (void (*)(unsigned long))
1425 iwl_pcie_tasklet, (unsigned long)trans);
1426
1427 if (iwl_pcie_alloc_ict(trans))
1428 goto out_free_cmd_pool;
1429
1430 err = request_irq(pdev->irq, iwl_pcie_isr_ict,
1431 IRQF_SHARED, DRV_NAME, trans);
1432 if (err) {
1433 IWL_ERR(trans, "Error allocating IRQ %d\n", pdev->irq);
1434 goto out_free_ict;
1435 }
1436
1453 return trans; 1437 return trans;
1454 1438
1439out_free_ict:
1440 iwl_pcie_free_ict(trans);
1441out_free_cmd_pool:
1442 kmem_cache_destroy(trans->dev_cmd_pool);
1455out_pci_disable_msi: 1443out_pci_disable_msi:
1456 pci_disable_msi(pdev); 1444 pci_disable_msi(pdev);
1457out_pci_release_regions: 1445out_pci_release_regions: