Commit 89a91f4f authored by Lennert Buytenhek's avatar Lennert Buytenhek Committed by John W. Linville

mwl8k: fix up AP vs. STA firmware image receive descriptor handling

The receive descriptor ops that are currently marked as being for
8687 only are actually used for all STA firmware images, whereas the
receive descriptor ops marked as 8366 are only used on 8366 when an
AP firmware image is in use.

Rename the receive descriptor ops to reflect this, use the STA ops
unconditionally if the firmware image loaded reported the STA ready
code, and rename the mwl8k_device_info::rxd_ops member to ap_rxd_ops
to indicate that it should only be used if we are running on AP
firmware.
Signed-off-by: default avatarLennert Buytenhek <buytenh@marvell.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent be695fc4
......@@ -92,8 +92,7 @@ struct mwl8k_device_info {
char *part_name;
char *helper_image;
char *fw_image;
struct rxd_ops *rxd_ops;
u16 modes;
struct rxd_ops *ap_rxd_ops;
};
struct mwl8k_rx_queue {
......@@ -580,10 +579,7 @@ static int mwl8k_load_firmware(struct ieee80211_hw *hw)
return rc;
}
if (priv->device_info->modes & BIT(NL80211_IFTYPE_AP))
iowrite32(MWL8K_MODE_AP, priv->regs + MWL8K_HIU_GEN_PTR);
else
iowrite32(MWL8K_MODE_STA, priv->regs + MWL8K_HIU_GEN_PTR);
iowrite32(MWL8K_MODE_STA, priv->regs + MWL8K_HIU_GEN_PTR);
loops = 500000;
do {
......@@ -720,9 +716,9 @@ static inline void mwl8k_add_dma_header(struct sk_buff *skb)
/*
* Packet reception for 88w8366.
* Packet reception for 88w8366 AP firmware.
*/
struct mwl8k_rxd_8366 {
struct mwl8k_rxd_8366_ap {
__le16 pkt_len;
__u8 sq2;
__u8 rate;
......@@ -740,23 +736,23 @@ struct mwl8k_rxd_8366 {
__u8 rx_ctrl;
} __attribute__((packed));
#define MWL8K_8366_RATE_INFO_MCS_FORMAT 0x80
#define MWL8K_8366_RATE_INFO_40MHZ 0x40
#define MWL8K_8366_RATE_INFO_RATEID(x) ((x) & 0x3f)
#define MWL8K_8366_AP_RATE_INFO_MCS_FORMAT 0x80
#define MWL8K_8366_AP_RATE_INFO_40MHZ 0x40
#define MWL8K_8366_AP_RATE_INFO_RATEID(x) ((x) & 0x3f)
#define MWL8K_8366_RX_CTRL_OWNED_BY_HOST 0x80
#define MWL8K_8366_AP_RX_CTRL_OWNED_BY_HOST 0x80
static void mwl8k_rxd_8366_init(void *_rxd, dma_addr_t next_dma_addr)
static void mwl8k_rxd_8366_ap_init(void *_rxd, dma_addr_t next_dma_addr)
{
struct mwl8k_rxd_8366 *rxd = _rxd;
struct mwl8k_rxd_8366_ap *rxd = _rxd;
rxd->next_rxd_phys_addr = cpu_to_le32(next_dma_addr);
rxd->rx_ctrl = MWL8K_8366_RX_CTRL_OWNED_BY_HOST;
rxd->rx_ctrl = MWL8K_8366_AP_RX_CTRL_OWNED_BY_HOST;
}
static void mwl8k_rxd_8366_refill(void *_rxd, dma_addr_t addr, int len)
static void mwl8k_rxd_8366_ap_refill(void *_rxd, dma_addr_t addr, int len)
{
struct mwl8k_rxd_8366 *rxd = _rxd;
struct mwl8k_rxd_8366_ap *rxd = _rxd;
rxd->pkt_len = cpu_to_le16(len);
rxd->pkt_phys_addr = cpu_to_le32(addr);
......@@ -765,12 +761,12 @@ static void mwl8k_rxd_8366_refill(void *_rxd, dma_addr_t addr, int len)
}
static int
mwl8k_rxd_8366_process(void *_rxd, struct ieee80211_rx_status *status,
__le16 *qos)
mwl8k_rxd_8366_ap_process(void *_rxd, struct ieee80211_rx_status *status,
__le16 *qos)
{
struct mwl8k_rxd_8366 *rxd = _rxd;
struct mwl8k_rxd_8366_ap *rxd = _rxd;
if (!(rxd->rx_ctrl & MWL8K_8366_RX_CTRL_OWNED_BY_HOST))
if (!(rxd->rx_ctrl & MWL8K_8366_AP_RX_CTRL_OWNED_BY_HOST))
return -1;
rmb();
......@@ -779,11 +775,11 @@ mwl8k_rxd_8366_process(void *_rxd, struct ieee80211_rx_status *status,
status->signal = -rxd->rssi;
status->noise = -rxd->noise_floor;
if (rxd->rate & MWL8K_8366_RATE_INFO_MCS_FORMAT) {
if (rxd->rate & MWL8K_8366_AP_RATE_INFO_MCS_FORMAT) {
status->flag |= RX_FLAG_HT;
if (rxd->rate & MWL8K_8366_RATE_INFO_40MHZ)
if (rxd->rate & MWL8K_8366_AP_RATE_INFO_40MHZ)
status->flag |= RX_FLAG_40MHZ;
status->rate_idx = MWL8K_8366_RATE_INFO_RATEID(rxd->rate);
status->rate_idx = MWL8K_8366_AP_RATE_INFO_RATEID(rxd->rate);
} else {
int i;
......@@ -803,17 +799,17 @@ mwl8k_rxd_8366_process(void *_rxd, struct ieee80211_rx_status *status,
return le16_to_cpu(rxd->pkt_len);
}
static struct rxd_ops rxd_8366_ops = {
.rxd_size = sizeof(struct mwl8k_rxd_8366),
.rxd_init = mwl8k_rxd_8366_init,
.rxd_refill = mwl8k_rxd_8366_refill,
.rxd_process = mwl8k_rxd_8366_process,
static struct rxd_ops rxd_8366_ap_ops = {
.rxd_size = sizeof(struct mwl8k_rxd_8366_ap),
.rxd_init = mwl8k_rxd_8366_ap_init,
.rxd_refill = mwl8k_rxd_8366_ap_refill,
.rxd_process = mwl8k_rxd_8366_ap_process,
};
/*
* Packet reception for 88w8687.
* Packet reception for STA firmware.
*/
struct mwl8k_rxd_8687 {
struct mwl8k_rxd_sta {
__le16 pkt_len;
__u8 link_quality;
__u8 noise_level;
......@@ -830,26 +826,26 @@ struct mwl8k_rxd_8687 {
__u8 pad2[2];
} __attribute__((packed));
#define MWL8K_8687_RATE_INFO_SHORTPRE 0x8000
#define MWL8K_8687_RATE_INFO_ANTSELECT(x) (((x) >> 11) & 0x3)
#define MWL8K_8687_RATE_INFO_RATEID(x) (((x) >> 3) & 0x3f)
#define MWL8K_8687_RATE_INFO_40MHZ 0x0004
#define MWL8K_8687_RATE_INFO_SHORTGI 0x0002
#define MWL8K_8687_RATE_INFO_MCS_FORMAT 0x0001
#define MWL8K_STA_RATE_INFO_SHORTPRE 0x8000
#define MWL8K_STA_RATE_INFO_ANTSELECT(x) (((x) >> 11) & 0x3)
#define MWL8K_STA_RATE_INFO_RATEID(x) (((x) >> 3) & 0x3f)
#define MWL8K_STA_RATE_INFO_40MHZ 0x0004
#define MWL8K_STA_RATE_INFO_SHORTGI 0x0002
#define MWL8K_STA_RATE_INFO_MCS_FORMAT 0x0001
#define MWL8K_8687_RX_CTRL_OWNED_BY_HOST 0x02
#define MWL8K_STA_RX_CTRL_OWNED_BY_HOST 0x02
static void mwl8k_rxd_8687_init(void *_rxd, dma_addr_t next_dma_addr)
static void mwl8k_rxd_sta_init(void *_rxd, dma_addr_t next_dma_addr)
{
struct mwl8k_rxd_8687 *rxd = _rxd;
struct mwl8k_rxd_sta *rxd = _rxd;
rxd->next_rxd_phys_addr = cpu_to_le32(next_dma_addr);
rxd->rx_ctrl = MWL8K_8687_RX_CTRL_OWNED_BY_HOST;
rxd->rx_ctrl = MWL8K_STA_RX_CTRL_OWNED_BY_HOST;
}
static void mwl8k_rxd_8687_refill(void *_rxd, dma_addr_t addr, int len)
static void mwl8k_rxd_sta_refill(void *_rxd, dma_addr_t addr, int len)
{
struct mwl8k_rxd_8687 *rxd = _rxd;
struct mwl8k_rxd_sta *rxd = _rxd;
rxd->pkt_len = cpu_to_le16(len);
rxd->pkt_phys_addr = cpu_to_le32(addr);
......@@ -858,13 +854,13 @@ static void mwl8k_rxd_8687_refill(void *_rxd, dma_addr_t addr, int len)
}
static int
mwl8k_rxd_8687_process(void *_rxd, struct ieee80211_rx_status *status,
mwl8k_rxd_sta_process(void *_rxd, struct ieee80211_rx_status *status,
__le16 *qos)
{
struct mwl8k_rxd_8687 *rxd = _rxd;
struct mwl8k_rxd_sta *rxd = _rxd;
u16 rate_info;
if (!(rxd->rx_ctrl & MWL8K_8687_RX_CTRL_OWNED_BY_HOST))
if (!(rxd->rx_ctrl & MWL8K_STA_RX_CTRL_OWNED_BY_HOST))
return -1;
rmb();
......@@ -874,16 +870,16 @@ mwl8k_rxd_8687_process(void *_rxd, struct ieee80211_rx_status *status,
status->signal = -rxd->rssi;
status->noise = -rxd->noise_level;
status->antenna = MWL8K_8687_RATE_INFO_ANTSELECT(rate_info);
status->rate_idx = MWL8K_8687_RATE_INFO_RATEID(rate_info);
status->antenna = MWL8K_STA_RATE_INFO_ANTSELECT(rate_info);
status->rate_idx = MWL8K_STA_RATE_INFO_RATEID(rate_info);
if (rate_info & MWL8K_8687_RATE_INFO_SHORTPRE)
if (rate_info & MWL8K_STA_RATE_INFO_SHORTPRE)
status->flag |= RX_FLAG_SHORTPRE;
if (rate_info & MWL8K_8687_RATE_INFO_40MHZ)
if (rate_info & MWL8K_STA_RATE_INFO_40MHZ)
status->flag |= RX_FLAG_40MHZ;
if (rate_info & MWL8K_8687_RATE_INFO_SHORTGI)
if (rate_info & MWL8K_STA_RATE_INFO_SHORTGI)
status->flag |= RX_FLAG_SHORT_GI;
if (rate_info & MWL8K_8687_RATE_INFO_MCS_FORMAT)
if (rate_info & MWL8K_STA_RATE_INFO_MCS_FORMAT)
status->flag |= RX_FLAG_HT;
status->band = IEEE80211_BAND_2GHZ;
......@@ -894,11 +890,11 @@ mwl8k_rxd_8687_process(void *_rxd, struct ieee80211_rx_status *status,
return le16_to_cpu(rxd->pkt_len);
}
static struct rxd_ops rxd_8687_ops = {
.rxd_size = sizeof(struct mwl8k_rxd_8687),
.rxd_init = mwl8k_rxd_8687_init,
.rxd_refill = mwl8k_rxd_8687_refill,
.rxd_process = mwl8k_rxd_8687_process,
static struct rxd_ops rxd_sta_ops = {
.rxd_size = sizeof(struct mwl8k_rxd_sta),
.rxd_init = mwl8k_rxd_sta_init,
.rxd_refill = mwl8k_rxd_sta_refill,
.rxd_process = mwl8k_rxd_sta_process,
};
......@@ -3267,15 +3263,12 @@ static struct mwl8k_device_info mwl8k_info_tbl[] __devinitdata = {
.part_name = "88w8687",
.helper_image = "mwl8k/helper_8687.fw",
.fw_image = "mwl8k/fmimage_8687.fw",
.rxd_ops = &rxd_8687_ops,
.modes = BIT(NL80211_IFTYPE_STATION),
},
[MWL8366] = {
.part_name = "88w8366",
.helper_image = "mwl8k/helper_8366.fw",
.fw_image = "mwl8k/fmimage_8366.fw",
.rxd_ops = &rxd_8366_ops,
.modes = 0,
.ap_rxd_ops = &rxd_8366_ap_ops,
},
};
......@@ -3380,7 +3373,10 @@ static int __devinit mwl8k_probe(struct pci_dev *pdev,
mwl8k_release_firmware(priv);
priv->rxd_ops = priv->device_info->rxd_ops;
if (priv->ap_fw)
priv->rxd_ops = priv->device_info->ap_rxd_ops;
else
priv->rxd_ops = &rxd_sta_ops;
priv->sniffer_enabled = false;
priv->wmm_enabled = false;
......@@ -3409,8 +3405,6 @@ static int __devinit mwl8k_probe(struct pci_dev *pdev,
hw->queues = MWL8K_TX_QUEUES;
hw->wiphy->interface_modes = priv->device_info->modes;
/* Set rssi and noise values to dBm */
hw->flags |= IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_NOISE_DBM;
hw->vif_data_size = sizeof(struct mwl8k_vif);
......@@ -3480,6 +3474,8 @@ static int __devinit mwl8k_probe(struct pci_dev *pdev,
rc = mwl8k_cmd_set_hw_spec(hw);
} else {
rc = mwl8k_cmd_get_hw_spec_sta(hw);
hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
}
if (rc) {
printk(KERN_ERR "%s: Cannot initialise firmware\n",
......
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