Commit eae74e65 authored by Lennert Buytenhek's avatar Lennert Buytenhek Committed by John W. Linville
Browse files

mwl8k: handle loading AP firmware images



AP and STA firmware images provide a different signature in the
HIU_INT_CODE register after loading.  Record which of the signatures
we saw, as it determines which command sequences to use later on.

Signed-off-by: default avatarLennert Buytenhek <buytenh@marvell.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent a74b295e
Loading
Loading
Loading
Loading
+19 −4
Original line number Diff line number Diff line
@@ -130,6 +130,7 @@ struct mwl8k_priv {
	struct pci_dev *pdev;

	struct mwl8k_device_info *device_info;
	bool ap_fw;

	/* firmware files and meta data */
	struct mwl8k_firmware fw;
@@ -534,6 +535,7 @@ static int mwl8k_load_firmware(struct ieee80211_hw *hw)
{
	struct mwl8k_priv *priv = hw->priv;
	struct firmware *fw = priv->fw.ucode;
	struct mwl8k_device_info *di = priv->device_info;
	int rc;
	int loops;

@@ -565,14 +567,26 @@ static int mwl8k_load_firmware(struct ieee80211_hw *hw)
		return rc;
	}

	if (di->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);
	msleep(1);

	loops = 200000;
	do {
		if (ioread32(priv->regs + MWL8K_HIU_INT_CODE)
						== MWL8K_FWSTA_READY)
		u32 ready_code;

		ready_code = ioread32(priv->regs + MWL8K_HIU_INT_CODE);
		if (ready_code == MWL8K_FWAP_READY) {
			priv->ap_fw = 1;
			break;
		} else if (ready_code == MWL8K_FWSTA_READY) {
			priv->ap_fw = 0;
			break;
		}

		cond_resched();
		udelay(1);
	} while (--loops);

@@ -3165,9 +3179,10 @@ static int __devinit mwl8k_probe(struct pci_dev *pdev,
		goto err_stop_firmware;
	}

	printk(KERN_INFO "%s: %s v%d, %pM, firmware version %u.%u.%u.%u\n",
	printk(KERN_INFO "%s: %s v%d, %pM, %s firmware %u.%u.%u.%u\n",
	       wiphy_name(hw->wiphy), priv->device_info->part_name,
	       priv->hw_rev, hw->wiphy->perm_addr,
	       priv->ap_fw ? "AP" : "STA",
	       (priv->fw_rev >> 24) & 0xff, (priv->fw_rev >> 16) & 0xff,
	       (priv->fw_rev >> 8) & 0xff, priv->fw_rev & 0xff);