diff options
author | Johannes Berg <johannes.berg@intel.com> | 2012-12-27 17:08:06 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-01-03 09:32:45 -0500 |
commit | a8b691e6104e6bd27070b6ed6622d0b640707fa8 (patch) | |
tree | a45df98035a34ab5ecce4eee153fb9dad8d70650 /drivers/net/wireless/iwlwifi/pcie | |
parent | 653ea7a6a5a912a96affc6443b6e9f42dfce2234 (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.h | 4 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/trans.c | 62 |
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 | ||
565 | static int iwl_trans_pcie_start_hw(struct iwl_trans *trans) | 565 | static 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 | |||
606 | err_free_irq: | ||
607 | trans_pcie->irq_requested = false; | ||
608 | free_irq(trans_pcie->irq, trans); | ||
609 | error: | ||
610 | iwl_pcie_free_ict(trans); | ||
611 | tasklet_kill(&trans_pcie->irq_tasklet); | ||
612 | return err; | ||
613 | } | 585 | } |
614 | 586 | ||
615 | static void iwl_trans_pcie_stop_hw(struct iwl_trans *trans, | 587 | static 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 | ||
1439 | out_free_ict: | ||
1440 | iwl_pcie_free_ict(trans); | ||
1441 | out_free_cmd_pool: | ||
1442 | kmem_cache_destroy(trans->dev_cmd_pool); | ||
1455 | out_pci_disable_msi: | 1443 | out_pci_disable_msi: |
1456 | pci_disable_msi(pdev); | 1444 | pci_disable_msi(pdev); |
1457 | out_pci_release_regions: | 1445 | out_pci_release_regions: |