OSDN Git Service

mwl8k: fix up AP vs. STA firmware image receive descriptor handling
[uclinux-h8/linux.git] / drivers / net / wireless / mwl8k.c
index 0ae56cb..b20820a 100644 (file)
@@ -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",