Skip to content

Commit bac842d

Browse files
committed
iwlwifi: pcie: aggregate Flow Handler configuration writes
Instead of waking up the device each time we write a register, wake it up once, and writes the registers at once. Signed-off-by: Emmanuel Grumbach <[email protected]>
1 parent 5a51c03 commit bac842d

File tree

1 file changed

+28
-28
lines changed
  • drivers/net/wireless/intel/iwlwifi/pcie

1 file changed

+28
-28
lines changed

drivers/net/wireless/intel/iwlwifi/pcie/trans.c

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -616,38 +616,38 @@ static int iwl_pcie_load_firmware_chunk(struct iwl_trans *trans, u32 dst_addr,
616616
dma_addr_t phy_addr, u32 byte_cnt)
617617
{
618618
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
619+
unsigned long flags;
619620
int ret;
620621

621622
trans_pcie->ucode_write_complete = false;
622623

623-
iwl_write_direct32(trans,
624-
FH_TCSR_CHNL_TX_CONFIG_REG(FH_SRVC_CHNL),
625-
FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_PAUSE);
626-
627-
iwl_write_direct32(trans,
628-
FH_SRVC_CHNL_SRAM_ADDR_REG(FH_SRVC_CHNL),
629-
dst_addr);
630-
631-
iwl_write_direct32(trans,
632-
FH_TFDIB_CTRL0_REG(FH_SRVC_CHNL),
633-
phy_addr & FH_MEM_TFDIB_DRAM_ADDR_LSB_MSK);
634-
635-
iwl_write_direct32(trans,
636-
FH_TFDIB_CTRL1_REG(FH_SRVC_CHNL),
637-
(iwl_get_dma_hi_addr(phy_addr)
638-
<< FH_MEM_TFDIB_REG1_ADDR_BITSHIFT) | byte_cnt);
639-
640-
iwl_write_direct32(trans,
641-
FH_TCSR_CHNL_TX_BUF_STS_REG(FH_SRVC_CHNL),
642-
1 << FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_NUM |
643-
1 << FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_IDX |
644-
FH_TCSR_CHNL_TX_BUF_STS_REG_VAL_TFDB_VALID);
645-
646-
iwl_write_direct32(trans,
647-
FH_TCSR_CHNL_TX_CONFIG_REG(FH_SRVC_CHNL),
648-
FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE |
649-
FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_DISABLE |
650-
FH_TCSR_TX_CONFIG_REG_VAL_CIRQ_HOST_ENDTFD);
624+
if (!iwl_trans_grab_nic_access(trans, &flags))
625+
return -EIO;
626+
627+
iwl_write32(trans, FH_TCSR_CHNL_TX_CONFIG_REG(FH_SRVC_CHNL),
628+
FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_PAUSE);
629+
630+
iwl_write32(trans, FH_SRVC_CHNL_SRAM_ADDR_REG(FH_SRVC_CHNL),
631+
dst_addr);
632+
633+
iwl_write32(trans, FH_TFDIB_CTRL0_REG(FH_SRVC_CHNL),
634+
phy_addr & FH_MEM_TFDIB_DRAM_ADDR_LSB_MSK);
635+
636+
iwl_write32(trans, FH_TFDIB_CTRL1_REG(FH_SRVC_CHNL),
637+
(iwl_get_dma_hi_addr(phy_addr)
638+
<< FH_MEM_TFDIB_REG1_ADDR_BITSHIFT) | byte_cnt);
639+
640+
iwl_write32(trans, FH_TCSR_CHNL_TX_BUF_STS_REG(FH_SRVC_CHNL),
641+
BIT(FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_NUM) |
642+
BIT(FH_TCSR_CHNL_TX_BUF_STS_REG_POS_TB_IDX) |
643+
FH_TCSR_CHNL_TX_BUF_STS_REG_VAL_TFDB_VALID);
644+
645+
iwl_write32(trans, FH_TCSR_CHNL_TX_CONFIG_REG(FH_SRVC_CHNL),
646+
FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE |
647+
FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_DISABLE |
648+
FH_TCSR_TX_CONFIG_REG_VAL_CIRQ_HOST_ENDTFD);
649+
650+
iwl_trans_release_nic_access(trans, &flags);
651651

652652
ret = wait_event_timeout(trans_pcie->ucode_write_waitq,
653653
trans_pcie->ucode_write_complete, 5 * HZ);

0 commit comments

Comments
 (0)