Merge tag 'wireless-drivers-next-for-davem-2016-09-29' of git://git.kernel.org/pub...
[cascardo/linux.git] / drivers / net / wireless / intel / iwlwifi / pcie / rx.c
index 5c36e6d..6fe5546 100644 (file)
@@ -487,15 +487,13 @@ static void iwl_pcie_rx_allocator(struct iwl_trans *trans)
 
        while (pending) {
                int i;
-               struct list_head local_allocated;
+               LIST_HEAD(local_allocated);
                gfp_t gfp_mask = GFP_KERNEL;
 
                /* Do not post a warning if there are only a few requests */
                if (pending < RX_PENDING_WATERMARK)
                        gfp_mask |= __GFP_NOWARN;
 
-               INIT_LIST_HEAD(&local_allocated);
-
                for (i = 0; i < RX_CLAIM_REQ_ALLOC;) {
                        struct iwl_rx_mem_buffer *rxb;
                        struct page *page;
@@ -1108,13 +1106,14 @@ static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans,
                        FH_RSCSR_RXQ_POS != rxq->id);
 
                IWL_DEBUG_RX(trans,
-                            "cmd at offset %d: %s (0x%.2x, seq 0x%x)\n",
+                            "cmd at offset %d: %s (%.2x.%2x, seq 0x%x)\n",
                             rxcb._offset,
                             iwl_get_cmd_string(trans,
                                                iwl_cmd_id(pkt->hdr.cmd,
                                                           pkt->hdr.group_id,
                                                           0)),
-                            pkt->hdr.cmd, le16_to_cpu(pkt->hdr.sequence));
+                            pkt->hdr.group_id, pkt->hdr.cmd,
+                            le16_to_cpu(pkt->hdr.sequence));
 
                len = iwl_rx_packet_len(pkt);
                len += sizeof(u32); /* account for status word */
@@ -1142,7 +1141,7 @@ static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans,
 
                sequence = le16_to_cpu(pkt->hdr.sequence);
                index = SEQ_TO_INDEX(sequence);
-               cmd_index = get_cmd_index(&txq->q, index);
+               cmd_index = get_cmd_index(txq, index);
 
                if (rxq->id == 0)
                        iwl_op_mode_rx(trans->op_mode, &rxq->napi,
@@ -1885,6 +1884,20 @@ irqreturn_t iwl_pcie_irq_msix_handler(int irq, void *dev_id)
                              inta_fh,
                              iwl_read32(trans, CSR_MSIX_FH_INT_MASK_AD));
 
+       if ((trans_pcie->shared_vec_mask & IWL_SHARED_IRQ_NON_RX) &&
+           inta_fh & MSIX_FH_INT_CAUSES_Q0) {
+               local_bh_disable();
+               iwl_pcie_rx_handle(trans, 0);
+               local_bh_enable();
+       }
+
+       if ((trans_pcie->shared_vec_mask & IWL_SHARED_IRQ_FIRST_RSS) &&
+           inta_fh & MSIX_FH_INT_CAUSES_Q1) {
+               local_bh_disable();
+               iwl_pcie_rx_handle(trans, 1);
+               local_bh_enable();
+       }
+
        /* This "Tx" DMA channel is used only for loading uCode */
        if (inta_fh & MSIX_FH_INT_CAUSES_D2S_CH0_NUM) {
                IWL_DEBUG_ISR(trans, "uCode load interrupt\n");