Commit dbb6654c authored by Winkler, Tomas's avatar Winkler, Tomas Committed by John W. Linville

iwl3945: rearrange 3945 tfd

This patch moves 3945 TFD structures to iwl-3945-fh.h. It renames them
similarly to AGN naming. This patch also eliminates iwl3945_tx_info and
fixes endianity issue in iwl3945_tx_skb and iwl3945_enqueue_hcmd caused
by ugly casting.
Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarZhu Yi <yi.zhu@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 8cd812bc
...@@ -172,7 +172,17 @@ ...@@ -172,7 +172,17 @@
#define FH39_RSSR_CHNL0_RX_STATUS_CHNL_IDLE (0x01000000) #define FH39_RSSR_CHNL0_RX_STATUS_CHNL_IDLE (0x01000000)
#define TFD_QUEUE_SIZE_MAX (256) struct iwl3945_tfd_tb {
__le32 addr;
__le32 len;
} __attribute__ ((packed));
struct iwl3945_tfd {
__le32 control_flags;
struct iwl3945_tfd_tb tbs[4];
u8 __pad[28];
} __attribute__ ((packed));
#endif /* __iwl_3945_fh_h__ */ #endif /* __iwl_3945_fh_h__ */
...@@ -304,17 +304,6 @@ struct iwl3945_shared { ...@@ -304,17 +304,6 @@ struct iwl3945_shared {
__le32 tx_base_ptr[8]; __le32 tx_base_ptr[8];
} __attribute__ ((packed)); } __attribute__ ((packed));
struct iwl3945_tfd_frame_data {
__le32 addr;
__le32 len;
} __attribute__ ((packed));
struct iwl3945_tfd_frame {
__le32 control_flags;
struct iwl3945_tfd_frame_data pa[4];
u8 reserved[28];
} __attribute__ ((packed));
static inline u8 iwl3945_hw_get_rate(__le16 rate_n_flags) static inline u8 iwl3945_hw_get_rate(__le16 rate_n_flags)
{ {
return le16_to_cpu(rate_n_flags) & 0xFF; return le16_to_cpu(rate_n_flags) & 0xFF;
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include <asm/unaligned.h> #include <asm/unaligned.h>
#include <net/mac80211.h> #include <net/mac80211.h>
#include "iwl-fh.h"
#include "iwl-3945-fh.h" #include "iwl-3945-fh.h"
#include "iwl-commands.h" #include "iwl-commands.h"
#include "iwl-3945.h" #include "iwl-3945.h"
...@@ -307,7 +308,7 @@ static void iwl3945_tx_queue_reclaim(struct iwl_priv *priv, ...@@ -307,7 +308,7 @@ static void iwl3945_tx_queue_reclaim(struct iwl_priv *priv,
{ {
struct iwl3945_tx_queue *txq = &priv->txq39[txq_id]; struct iwl3945_tx_queue *txq = &priv->txq39[txq_id];
struct iwl_queue *q = &txq->q; struct iwl_queue *q = &txq->q;
struct iwl3945_tx_info *tx_info; struct iwl_tx_info *tx_info;
BUG_ON(txq_id == IWL_CMD_QUEUE_NUM); BUG_ON(txq_id == IWL_CMD_QUEUE_NUM);
...@@ -728,7 +729,7 @@ int iwl3945_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv, void *ptr, ...@@ -728,7 +729,7 @@ int iwl3945_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv, void *ptr,
{ {
int count; int count;
u32 pad; u32 pad;
struct iwl3945_tfd_frame *tfd = (struct iwl3945_tfd_frame *)ptr; struct iwl3945_tfd *tfd = (struct iwl3945_tfd *)ptr;
count = TFD_CTL_COUNT_GET(le32_to_cpu(tfd->control_flags)); count = TFD_CTL_COUNT_GET(le32_to_cpu(tfd->control_flags));
pad = TFD_CTL_PAD_GET(le32_to_cpu(tfd->control_flags)); pad = TFD_CTL_PAD_GET(le32_to_cpu(tfd->control_flags));
...@@ -739,8 +740,8 @@ int iwl3945_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv, void *ptr, ...@@ -739,8 +740,8 @@ int iwl3945_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv, void *ptr,
return -EINVAL; return -EINVAL;
} }
tfd->pa[count].addr = cpu_to_le32(addr); tfd->tbs[count].addr = cpu_to_le32(addr);
tfd->pa[count].len = cpu_to_le32(len); tfd->tbs[count].len = cpu_to_le32(len);
count++; count++;
...@@ -757,8 +758,8 @@ int iwl3945_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv, void *ptr, ...@@ -757,8 +758,8 @@ int iwl3945_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv, void *ptr,
*/ */
int iwl3945_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl3945_tx_queue *txq) int iwl3945_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl3945_tx_queue *txq)
{ {
struct iwl3945_tfd_frame *bd_tmp = (struct iwl3945_tfd_frame *)&txq->bd[0]; struct iwl3945_tfd *tfd_tmp = (struct iwl3945_tfd *)&txq->tfds[0];
struct iwl3945_tfd_frame *bd = &bd_tmp[txq->q.read_ptr]; struct iwl3945_tfd *tfd = &tfd_tmp[txq->q.read_ptr];
struct pci_dev *dev = priv->pci_dev; struct pci_dev *dev = priv->pci_dev;
int i; int i;
int counter; int counter;
...@@ -769,7 +770,7 @@ int iwl3945_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl3945_tx_queue *txq) ...@@ -769,7 +770,7 @@ int iwl3945_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl3945_tx_queue *txq)
return 0; return 0;
/* sanity check */ /* sanity check */
counter = TFD_CTL_COUNT_GET(le32_to_cpu(bd->control_flags)); counter = TFD_CTL_COUNT_GET(le32_to_cpu(tfd->control_flags));
if (counter > NUM_TFD_CHUNKS) { if (counter > NUM_TFD_CHUNKS) {
IWL_ERR(priv, "Too many chunks: %i\n", counter); IWL_ERR(priv, "Too many chunks: %i\n", counter);
/* @todo issue fatal error, it is quite serious situation */ /* @todo issue fatal error, it is quite serious situation */
...@@ -779,8 +780,8 @@ int iwl3945_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl3945_tx_queue *txq) ...@@ -779,8 +780,8 @@ int iwl3945_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl3945_tx_queue *txq)
/* unmap chunks if any */ /* unmap chunks if any */
for (i = 1; i < counter; i++) { for (i = 1; i < counter; i++) {
pci_unmap_single(dev, le32_to_cpu(bd->pa[i].addr), pci_unmap_single(dev, le32_to_cpu(tfd->tbs[i].addr),
le32_to_cpu(bd->pa[i].len), PCI_DMA_TODEVICE); le32_to_cpu(tfd->tbs[i].len), PCI_DMA_TODEVICE);
if (txq->txb[txq->q.read_ptr].skb[0]) { if (txq->txb[txq->q.read_ptr].skb[0]) {
struct sk_buff *skb = txq->txb[txq->q.read_ptr].skb[0]; struct sk_buff *skb = txq->txb[txq->q.read_ptr].skb[0];
if (txq->txb[txq->q.read_ptr].skb[0]) { if (txq->txb[txq->q.read_ptr].skb[0]) {
......
...@@ -45,6 +45,7 @@ extern struct pci_device_id iwl3945_hw_card_ids[]; ...@@ -45,6 +45,7 @@ extern struct pci_device_id iwl3945_hw_card_ids[];
#include "iwl-csr.h" #include "iwl-csr.h"
#include "iwl-prph.h" #include "iwl-prph.h"
#include "iwl-fh.h"
#include "iwl-3945-hw.h" #include "iwl-3945-hw.h"
#include "iwl-debug.h" #include "iwl-debug.h"
#include "iwl-power.h" #include "iwl-power.h"
...@@ -107,13 +108,6 @@ enum iwl3945_antenna { ...@@ -107,13 +108,6 @@ enum iwl3945_antenna {
int iwl3945_x2_queue_used(const struct iwl_queue *q, int i); int iwl3945_x2_queue_used(const struct iwl_queue *q, int i);
#define MAX_NUM_OF_TBS (20)
/* One for each TFD */
struct iwl3945_tx_info {
struct sk_buff *skb[MAX_NUM_OF_TBS];
};
#include "iwl-agn-rs.h" #include "iwl-agn-rs.h"
#define IWL_TX_FIFO_AC0 0 #define IWL_TX_FIFO_AC0 0
......
...@@ -36,14 +36,15 @@ ...@@ -36,14 +36,15 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <net/ieee80211_radiotap.h> #include <net/ieee80211_radiotap.h>
#include "iwl-rfkill.h"
#include "iwl-eeprom.h" #include "iwl-eeprom.h"
#include "iwl-4965-hw.h"
#include "iwl-3945-hw.h"
#include "iwl-3945-led.h"
#include "iwl-csr.h" #include "iwl-csr.h"
#include "iwl-prph.h" #include "iwl-prph.h"
#include "iwl-fh.h"
#include "iwl-debug.h" #include "iwl-debug.h"
#include "iwl-rfkill.h"
#include "iwl-4965-hw.h"
#include "iwl-3945-hw.h"
#include "iwl-3945-led.h"
#include "iwl-led.h" #include "iwl-led.h"
#include "iwl-power.h" #include "iwl-power.h"
#include "iwl-agn-rs.h" #include "iwl-agn-rs.h"
...@@ -239,10 +240,10 @@ struct iwl_channel_info { ...@@ -239,10 +240,10 @@ struct iwl_channel_info {
*/ */
struct iwl3945_tx_queue { struct iwl3945_tx_queue {
struct iwl_queue q; struct iwl_queue q;
struct iwl3945_tfd_frame *bd; struct iwl3945_tfd *tfds;
struct iwl_cmd *cmd; struct iwl_cmd *cmd;
dma_addr_t dma_addr_cmd; dma_addr_t dma_addr_cmd;
struct iwl3945_tx_info *txb; struct iwl_tx_info *txb;
int need_update; int need_update;
int active; int active;
}; };
......
...@@ -48,9 +48,10 @@ ...@@ -48,9 +48,10 @@
#define DRV_NAME "iwl3945" #define DRV_NAME "iwl3945"
#include "iwl-fh.h"
#include "iwl-3945-fh.h"
#include "iwl-commands.h" #include "iwl-commands.h"
#include "iwl-3945.h" #include "iwl-3945.h"
#include "iwl-3945-fh.h"
#include "iwl-helpers.h" #include "iwl-helpers.h"
#include "iwl-core.h" #include "iwl-core.h"
#include "iwl-dev.h" #include "iwl-dev.h"
...@@ -180,13 +181,13 @@ static int iwl3945_tx_queue_alloc(struct iwl_priv *priv, ...@@ -180,13 +181,13 @@ static int iwl3945_tx_queue_alloc(struct iwl_priv *priv,
/* Circular buffer of transmit frame descriptors (TFDs), /* Circular buffer of transmit frame descriptors (TFDs),
* shared with device */ * shared with device */
txq->bd = pci_alloc_consistent(dev, txq->tfds = pci_alloc_consistent(dev,
sizeof(txq->bd[0]) * TFD_QUEUE_SIZE_MAX, sizeof(txq->tfds[0]) * TFD_QUEUE_SIZE_MAX,
&txq->q.dma_addr); &txq->q.dma_addr);
if (!txq->bd) { if (!txq->tfds) {
IWL_ERR(priv, "pci_alloc_consistent(%zd) failed\n", IWL_ERR(priv, "pci_alloc_consistent(%zd) failed\n",
sizeof(txq->bd[0]) * TFD_QUEUE_SIZE_MAX); sizeof(txq->tfds[0]) * TFD_QUEUE_SIZE_MAX);
goto error; goto error;
} }
txq->q.id = id; txq->q.id = id;
...@@ -278,8 +279,8 @@ void iwl3945_tx_queue_free(struct iwl_priv *priv, struct iwl3945_tx_queue *txq) ...@@ -278,8 +279,8 @@ void iwl3945_tx_queue_free(struct iwl_priv *priv, struct iwl3945_tx_queue *txq)
/* De-alloc circular buffer of TFDs */ /* De-alloc circular buffer of TFDs */
if (txq->q.n_bd) if (txq->q.n_bd)
pci_free_consistent(dev, sizeof(struct iwl3945_tfd_frame) * pci_free_consistent(dev, sizeof(struct iwl3945_tfd) *
txq->q.n_bd, txq->bd, txq->q.dma_addr); txq->q.n_bd, txq->tfds, txq->q.dma_addr);
/* De-alloc array of per-TFD driver data */ /* De-alloc array of per-TFD driver data */
kfree(txq->txb); kfree(txq->txb);
...@@ -445,14 +446,12 @@ static int iwl3945_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) ...@@ -445,14 +446,12 @@ static int iwl3945_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
{ {
struct iwl3945_tx_queue *txq = &priv->txq39[IWL_CMD_QUEUE_NUM]; struct iwl3945_tx_queue *txq = &priv->txq39[IWL_CMD_QUEUE_NUM];
struct iwl_queue *q = &txq->q; struct iwl_queue *q = &txq->q;
struct iwl3945_tfd_frame *tfd; struct iwl3945_tfd *tfd;
u32 *control_flags;
struct iwl_cmd *out_cmd; struct iwl_cmd *out_cmd;
u32 idx; u32 idx;
u16 fix_size = (u16)(cmd->len + sizeof(out_cmd->hdr)); u16 fix_size = (u16)(cmd->len + sizeof(out_cmd->hdr));
dma_addr_t phys_addr; dma_addr_t phys_addr;
int pad; int pad;
u16 count;
int ret; int ret;
unsigned long flags; unsigned long flags;
...@@ -475,11 +474,9 @@ static int iwl3945_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) ...@@ -475,11 +474,9 @@ static int iwl3945_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
spin_lock_irqsave(&priv->hcmd_lock, flags); spin_lock_irqsave(&priv->hcmd_lock, flags);
tfd = &txq->bd[q->write_ptr]; tfd = &txq->tfds[q->write_ptr];
memset(tfd, 0, sizeof(*tfd)); memset(tfd, 0, sizeof(*tfd));
control_flags = (u32 *) tfd;
idx = get_cmd_index(q, q->write_ptr, cmd->meta.flags & CMD_SIZE_HUGE); idx = get_cmd_index(q, q->write_ptr, cmd->meta.flags & CMD_SIZE_HUGE);
out_cmd = &txq->cmd[idx]; out_cmd = &txq->cmd[idx];
...@@ -501,8 +498,7 @@ static int iwl3945_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) ...@@ -501,8 +498,7 @@ static int iwl3945_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
iwl3945_hw_txq_attach_buf_to_tfd(priv, tfd, phys_addr, fix_size); iwl3945_hw_txq_attach_buf_to_tfd(priv, tfd, phys_addr, fix_size);
pad = U32_PAD(cmd->len); pad = U32_PAD(cmd->len);
count = TFD_CTL_COUNT_GET(*control_flags); tfd->control_flags |= cpu_to_le32(TFD_CTL_PAD_SET(pad));
*control_flags = TFD_CTL_COUNT_SET(count) | TFD_CTL_PAD_SET(pad);
IWL_DEBUG_HC("Sending command %s (#%x), seq: 0x%04X, " IWL_DEBUG_HC("Sending command %s (#%x), seq: 0x%04X, "
"%d bytes at %d[%d]:%d\n", "%d bytes at %d[%d]:%d\n",
...@@ -2231,8 +2227,7 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) ...@@ -2231,8 +2227,7 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
{ {
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
struct iwl3945_tfd_frame *tfd; struct iwl3945_tfd *tfd;
u32 *control_flags;
int txq_id = skb_get_queue_mapping(skb); int txq_id = skb_get_queue_mapping(skb);
struct iwl3945_tx_queue *txq = NULL; struct iwl3945_tx_queue *txq = NULL;
struct iwl_queue *q = NULL; struct iwl_queue *q = NULL;
...@@ -2317,13 +2312,12 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) ...@@ -2317,13 +2312,12 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
/* Set up first empty TFD within this queue's circular TFD buffer */ /* Set up first empty TFD within this queue's circular TFD buffer */
tfd = &txq->bd[q->write_ptr]; tfd = &txq->tfds[q->write_ptr];
memset(tfd, 0, sizeof(*tfd)); memset(tfd, 0, sizeof(*tfd));
control_flags = (u32 *) tfd;
idx = get_cmd_index(q, q->write_ptr, 0); idx = get_cmd_index(q, q->write_ptr, 0);
/* Set up driver data for this TFD */ /* Set up driver data for this TFD */
memset(&(txq->txb[q->write_ptr]), 0, sizeof(struct iwl3945_tx_info)); memset(&(txq->txb[q->write_ptr]), 0, sizeof(struct iwl_tx_info));
txq->txb[q->write_ptr].skb[0] = skb; txq->txb[q->write_ptr].skb[0] = skb;
/* Init first empty entry in queue's array of Tx/cmd buffers */ /* Init first empty entry in queue's array of Tx/cmd buffers */
...@@ -2387,12 +2381,12 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) ...@@ -2387,12 +2381,12 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
if (!len) if (!len)
/* If there is no payload, then we use only one Tx buffer */ /* If there is no payload, then we use only one Tx buffer */
*control_flags = TFD_CTL_COUNT_SET(1); tfd->control_flags = cpu_to_le32(TFD_CTL_COUNT_SET(1));
else else
/* Else use 2 buffers. /* Else use 2 buffers.
* Tell 3945 about any padding after MAC header */ * Tell 3945 about any padding after MAC header */
*control_flags = TFD_CTL_COUNT_SET(2) | tfd->control_flags = cpu_to_le32(TFD_CTL_COUNT_SET(2) |
TFD_CTL_PAD_SET(U32_PAD(len)); TFD_CTL_PAD_SET(U32_PAD(len)));
/* Total # bytes to be transmitted */ /* Total # bytes to be transmitted */
len = (u16)skb->len; len = (u16)skb->len;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment