|
@@ -572,26 +572,11 @@ il3945_tx_skb(struct il_priv *il,
|
|
|
il3945_hw_build_tx_cmd_rate(il, out_cmd, info, hdr, sta_id);
|
|
|
|
|
|
/* Total # bytes to be transmitted */
|
|
|
- len = (u16) skb->len;
|
|
|
- tx_cmd->len = cpu_to_le16(len);
|
|
|
+ tx_cmd->len = cpu_to_le16((u16) skb->len);
|
|
|
|
|
|
- il_update_stats(il, true, fc, len);
|
|
|
tx_cmd->tx_flags &= ~TX_CMD_FLG_ANT_A_MSK;
|
|
|
tx_cmd->tx_flags &= ~TX_CMD_FLG_ANT_B_MSK;
|
|
|
|
|
|
- if (!ieee80211_has_morefrags(hdr->frame_control)) {
|
|
|
- txq->need_update = 1;
|
|
|
- } else {
|
|
|
- wait_write_ptr = 1;
|
|
|
- txq->need_update = 0;
|
|
|
- }
|
|
|
-
|
|
|
- D_TX("sequence nr = 0X%x\n", le16_to_cpu(out_cmd->hdr.sequence));
|
|
|
- D_TX("tx_flags = 0X%x\n", le32_to_cpu(tx_cmd->tx_flags));
|
|
|
- il_print_hex_dump(il, IL_DL_TX, tx_cmd, sizeof(*tx_cmd));
|
|
|
- il_print_hex_dump(il, IL_DL_TX, (u8 *) tx_cmd->hdr,
|
|
|
- ieee80211_hdrlen(fc));
|
|
|
-
|
|
|
/*
|
|
|
* Use the first empty entry in this queue's command buffer array
|
|
|
* to contain the Tx command and MAC header concatenated together
|
|
@@ -610,14 +595,8 @@ il3945_tx_skb(struct il_priv *il,
|
|
|
* within command buffer array. */
|
|
|
txcmd_phys =
|
|
|
pci_map_single(il->pci_dev, &out_cmd->hdr, len, PCI_DMA_TODEVICE);
|
|
|
- /* we do not map meta data ... so we can safely access address to
|
|
|
- * provide to unmap command*/
|
|
|
- dma_unmap_addr_set(out_meta, mapping, txcmd_phys);
|
|
|
- dma_unmap_len_set(out_meta, len, len);
|
|
|
-
|
|
|
- /* Add buffer containing Tx command and MAC(!) header to TFD's
|
|
|
- * first entry */
|
|
|
- il->ops->txq_attach_buf_to_tfd(il, txq, txcmd_phys, len, 1, 0);
|
|
|
+ if (unlikely(pci_dma_mapping_error(il->pci_dev, txcmd_phys)))
|
|
|
+ goto drop_unlock;
|
|
|
|
|
|
/* Set up TFD's 2nd entry to point directly to remainder of skb,
|
|
|
* if any (802.11 null frames have no payload). */
|
|
@@ -626,10 +605,34 @@ il3945_tx_skb(struct il_priv *il,
|
|
|
phys_addr =
|
|
|
pci_map_single(il->pci_dev, skb->data + hdr_len, len,
|
|
|
PCI_DMA_TODEVICE);
|
|
|
+ if (unlikely(pci_dma_mapping_error(il->pci_dev, phys_addr)))
|
|
|
+ goto drop_unlock;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Add buffer containing Tx command and MAC(!) header to TFD's
|
|
|
+ * first entry */
|
|
|
+ il->ops->txq_attach_buf_to_tfd(il, txq, txcmd_phys, len, 1, 0);
|
|
|
+ dma_unmap_addr_set(out_meta, mapping, txcmd_phys);
|
|
|
+ dma_unmap_len_set(out_meta, len, len);
|
|
|
+ if (len)
|
|
|
il->ops->txq_attach_buf_to_tfd(il, txq, phys_addr, len, 0,
|
|
|
U32_PAD(len));
|
|
|
+
|
|
|
+ if (!ieee80211_has_morefrags(hdr->frame_control)) {
|
|
|
+ txq->need_update = 1;
|
|
|
+ } else {
|
|
|
+ wait_write_ptr = 1;
|
|
|
+ txq->need_update = 0;
|
|
|
}
|
|
|
|
|
|
+ il_update_stats(il, true, fc, skb->len);
|
|
|
+
|
|
|
+ D_TX("sequence nr = 0X%x\n", le16_to_cpu(out_cmd->hdr.sequence));
|
|
|
+ D_TX("tx_flags = 0X%x\n", le32_to_cpu(tx_cmd->tx_flags));
|
|
|
+ il_print_hex_dump(il, IL_DL_TX, tx_cmd, sizeof(*tx_cmd));
|
|
|
+ il_print_hex_dump(il, IL_DL_TX, (u8 *) tx_cmd->hdr,
|
|
|
+ ieee80211_hdrlen(fc));
|
|
|
+
|
|
|
/* Tell device the write idx *just past* this latest filled TFD */
|
|
|
q->write_ptr = il_queue_inc_wrap(q->write_ptr, q->n_bd);
|
|
|
il_txq_update_write_ptr(il, txq);
|