diff options
Diffstat (limited to 'drivers/net/wireless')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/dfs_pattern_detector.c | 4 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/dfs_pri_detector.c | 4 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_init.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/phy_n.c | 3 | ||||
| -rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | 7 | ||||
| -rw-r--r-- | drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c | 264 | 
7 files changed, 141 insertions, 145 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h b/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h index 28fd99203f6..bdee2ed6721 100644 --- a/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h @@ -519,7 +519,7 @@ static const u32 ar9580_1p0_mac_core[][2] = {  	{0x00008258, 0x00000000},  	{0x0000825c, 0x40000000},  	{0x00008260, 0x00080922}, -	{0x00008264, 0x9bc00010}, +	{0x00008264, 0x9d400010},  	{0x00008268, 0xffffffff},  	{0x0000826c, 0x0000ffff},  	{0x00008270, 0x00000000}, diff --git a/drivers/net/wireless/ath/ath9k/dfs_pattern_detector.c b/drivers/net/wireless/ath/ath9k/dfs_pattern_detector.c index 467b60014b7..73fe8d6db56 100644 --- a/drivers/net/wireless/ath/ath9k/dfs_pattern_detector.c +++ b/drivers/net/wireless/ath/ath9k/dfs_pattern_detector.c @@ -143,14 +143,14 @@ channel_detector_create(struct dfs_pattern_detector *dpd, u16 freq)  	u32 sz, i;  	struct channel_detector *cd; -	cd = kmalloc(sizeof(*cd), GFP_KERNEL); +	cd = kmalloc(sizeof(*cd), GFP_ATOMIC);  	if (cd == NULL)  		goto fail;  	INIT_LIST_HEAD(&cd->head);  	cd->freq = freq;  	sz = sizeof(cd->detectors) * dpd->num_radar_types; -	cd->detectors = kzalloc(sz, GFP_KERNEL); +	cd->detectors = kzalloc(sz, GFP_ATOMIC);  	if (cd->detectors == NULL)  		goto fail; diff --git a/drivers/net/wireless/ath/ath9k/dfs_pri_detector.c b/drivers/net/wireless/ath/ath9k/dfs_pri_detector.c index 91b8dceeadb..5e48c5515b8 100644 --- a/drivers/net/wireless/ath/ath9k/dfs_pri_detector.c +++ b/drivers/net/wireless/ath/ath9k/dfs_pri_detector.c @@ -218,7 +218,7 @@ static bool pulse_queue_enqueue(struct pri_detector *pde, u64 ts)  {  	struct pulse_elem *p = pool_get_pulse_elem();  	if (p == NULL) { -		p = kmalloc(sizeof(*p), GFP_KERNEL); +		p = kmalloc(sizeof(*p), GFP_ATOMIC);  		if (p == NULL) {  			DFS_POOL_STAT_INC(pulse_alloc_error);  			return false; @@ -299,7 +299,7 @@ static bool pseq_handler_create_sequences(struct pri_detector *pde,  		ps.deadline_ts = ps.first_ts + ps.dur;  		new_ps = pool_get_pseq_elem();  		if (new_ps == NULL) { -			new_ps = kmalloc(sizeof(*new_ps), GFP_KERNEL); +			new_ps = kmalloc(sizeof(*new_ps), GFP_ATOMIC);  			if (new_ps == NULL) {  				DFS_POOL_STAT_INC(pseq_alloc_error);  				return false; diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c index 716058b6755..a47f5e05fc0 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c @@ -796,7 +796,7 @@ static int ath9k_init_firmware_version(struct ath9k_htc_priv *priv)  	 * required version.  	 */  	if (priv->fw_version_major != MAJOR_VERSION_REQ || -	    priv->fw_version_minor != MINOR_VERSION_REQ) { +	    priv->fw_version_minor < MINOR_VERSION_REQ) {  		dev_err(priv->dev, "ath9k_htc: Please upgrade to FW version %d.%d\n",  			MAJOR_VERSION_REQ, MINOR_VERSION_REQ);  		return -EINVAL; diff --git a/drivers/net/wireless/b43/phy_n.c b/drivers/net/wireless/b43/phy_n.c index e8486c1e091..b70f220bc4b 100644 --- a/drivers/net/wireless/b43/phy_n.c +++ b/drivers/net/wireless/b43/phy_n.c @@ -5165,7 +5165,8 @@ static void b43_nphy_pmu_spur_avoid(struct b43_wldev *dev, bool avoid)  #endif  #ifdef CONFIG_B43_SSB  	case B43_BUS_SSB: -		/* FIXME */ +		ssb_pmu_spuravoid_pllupdate(&dev->dev->sdev->bus->chipco, +					    avoid);  		break;  #endif  	} diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c index ec46ffff540..78da3eff75e 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c @@ -4128,10 +4128,6 @@ static const struct ieee80211_iface_limit brcmf_iface_limits[] = {  	},  	{  		.max = 1, -		.types = BIT(NL80211_IFTYPE_P2P_DEVICE) -	}, -	{ -		.max = 1,  		.types = BIT(NL80211_IFTYPE_P2P_CLIENT) |  			 BIT(NL80211_IFTYPE_P2P_GO)  	}, @@ -4187,8 +4183,7 @@ static struct wiphy *brcmf_setup_wiphy(struct device *phydev)  				 BIT(NL80211_IFTYPE_ADHOC) |  				 BIT(NL80211_IFTYPE_AP) |  				 BIT(NL80211_IFTYPE_P2P_CLIENT) | -				 BIT(NL80211_IFTYPE_P2P_GO) | -				 BIT(NL80211_IFTYPE_P2P_DEVICE); +				 BIT(NL80211_IFTYPE_P2P_GO);  	wiphy->iface_combinations = brcmf_iface_combos;  	wiphy->n_iface_combinations = ARRAY_SIZE(brcmf_iface_combos);  	wiphy->bands[IEEE80211_BAND_2GHZ] = &__wl_band_2ghz; diff --git a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c index c6451c61407..e2340b231aa 100644 --- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c +++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c @@ -274,6 +274,130 @@ static void brcms_set_basic_rate(struct brcm_rateset *rs, u16 rate, bool is_br)  	}  } +/** + * This function frees the WL per-device resources. + * + * This function frees resources owned by the WL device pointed to + * by the wl parameter. + * + * precondition: can both be called locked and unlocked + * + */ +static void brcms_free(struct brcms_info *wl) +{ +	struct brcms_timer *t, *next; + +	/* free ucode data */ +	if (wl->fw.fw_cnt) +		brcms_ucode_data_free(&wl->ucode); +	if (wl->irq) +		free_irq(wl->irq, wl); + +	/* kill dpc */ +	tasklet_kill(&wl->tasklet); + +	if (wl->pub) { +		brcms_debugfs_detach(wl->pub); +		brcms_c_module_unregister(wl->pub, "linux", wl); +	} + +	/* free common resources */ +	if (wl->wlc) { +		brcms_c_detach(wl->wlc); +		wl->wlc = NULL; +		wl->pub = NULL; +	} + +	/* virtual interface deletion is deferred so we cannot spinwait */ + +	/* wait for all pending callbacks to complete */ +	while (atomic_read(&wl->callbacks) > 0) +		schedule(); + +	/* free timers */ +	for (t = wl->timers; t; t = next) { +		next = t->next; +#ifdef DEBUG +		kfree(t->name); +#endif +		kfree(t); +	} +} + +/* +* called from both kernel as from this kernel module (error flow on attach) +* precondition: perimeter lock is not acquired. +*/ +static void brcms_remove(struct bcma_device *pdev) +{ +	struct ieee80211_hw *hw = bcma_get_drvdata(pdev); +	struct brcms_info *wl = hw->priv; + +	if (wl->wlc) { +		wiphy_rfkill_set_hw_state(wl->pub->ieee_hw->wiphy, false); +		wiphy_rfkill_stop_polling(wl->pub->ieee_hw->wiphy); +		ieee80211_unregister_hw(hw); +	} + +	brcms_free(wl); + +	bcma_set_drvdata(pdev, NULL); +	ieee80211_free_hw(hw); +} + +/* + * Precondition: Since this function is called in brcms_pci_probe() context, + * no locking is required. + */ +static void brcms_release_fw(struct brcms_info *wl) +{ +	int i; +	for (i = 0; i < MAX_FW_IMAGES; i++) { +		release_firmware(wl->fw.fw_bin[i]); +		release_firmware(wl->fw.fw_hdr[i]); +	} +} + +/* + * Precondition: Since this function is called in brcms_pci_probe() context, + * no locking is required. + */ +static int brcms_request_fw(struct brcms_info *wl, struct bcma_device *pdev) +{ +	int status; +	struct device *device = &pdev->dev; +	char fw_name[100]; +	int i; + +	memset(&wl->fw, 0, sizeof(struct brcms_firmware)); +	for (i = 0; i < MAX_FW_IMAGES; i++) { +		if (brcms_firmwares[i] == NULL) +			break; +		sprintf(fw_name, "%s-%d.fw", brcms_firmwares[i], +			UCODE_LOADER_API_VER); +		status = request_firmware(&wl->fw.fw_bin[i], fw_name, device); +		if (status) { +			wiphy_err(wl->wiphy, "%s: fail to load firmware %s\n", +				  KBUILD_MODNAME, fw_name); +			return status; +		} +		sprintf(fw_name, "%s_hdr-%d.fw", brcms_firmwares[i], +			UCODE_LOADER_API_VER); +		status = request_firmware(&wl->fw.fw_hdr[i], fw_name, device); +		if (status) { +			wiphy_err(wl->wiphy, "%s: fail to load firmware %s\n", +				  KBUILD_MODNAME, fw_name); +			return status; +		} +		wl->fw.hdr_num_entries[i] = +		    wl->fw.fw_hdr[i]->size / (sizeof(struct firmware_hdr)); +	} +	wl->fw.fw_cnt = i; +	status = brcms_ucode_data_init(wl, &wl->ucode); +	brcms_release_fw(wl); +	return status; +} +  static void brcms_ops_tx(struct ieee80211_hw *hw,  			 struct ieee80211_tx_control *control,  			 struct sk_buff *skb) @@ -306,6 +430,14 @@ static int brcms_ops_start(struct ieee80211_hw *hw)  	if (!blocked)  		wiphy_rfkill_stop_polling(wl->pub->ieee_hw->wiphy); +	if (!wl->ucode.bcm43xx_bomminor) { +		err = brcms_request_fw(wl, wl->wlc->hw->d11core); +		if (err) { +			brcms_remove(wl->wlc->hw->d11core); +			return -ENOENT; +		} +	} +  	spin_lock_bh(&wl->lock);  	/* avoid acknowledging frames before a non-monitor device is added */  	wl->mute_tx = true; @@ -793,128 +925,6 @@ void brcms_dpc(unsigned long data)  	wake_up(&wl->tx_flush_wq);  } -/* - * Precondition: Since this function is called in brcms_pci_probe() context, - * no locking is required. - */ -static int brcms_request_fw(struct brcms_info *wl, struct bcma_device *pdev) -{ -	int status; -	struct device *device = &pdev->dev; -	char fw_name[100]; -	int i; - -	memset(&wl->fw, 0, sizeof(struct brcms_firmware)); -	for (i = 0; i < MAX_FW_IMAGES; i++) { -		if (brcms_firmwares[i] == NULL) -			break; -		sprintf(fw_name, "%s-%d.fw", brcms_firmwares[i], -			UCODE_LOADER_API_VER); -		status = request_firmware(&wl->fw.fw_bin[i], fw_name, device); -		if (status) { -			wiphy_err(wl->wiphy, "%s: fail to load firmware %s\n", -				  KBUILD_MODNAME, fw_name); -			return status; -		} -		sprintf(fw_name, "%s_hdr-%d.fw", brcms_firmwares[i], -			UCODE_LOADER_API_VER); -		status = request_firmware(&wl->fw.fw_hdr[i], fw_name, device); -		if (status) { -			wiphy_err(wl->wiphy, "%s: fail to load firmware %s\n", -				  KBUILD_MODNAME, fw_name); -			return status; -		} -		wl->fw.hdr_num_entries[i] = -		    wl->fw.fw_hdr[i]->size / (sizeof(struct firmware_hdr)); -	} -	wl->fw.fw_cnt = i; -	return brcms_ucode_data_init(wl, &wl->ucode); -} - -/* - * Precondition: Since this function is called in brcms_pci_probe() context, - * no locking is required. - */ -static void brcms_release_fw(struct brcms_info *wl) -{ -	int i; -	for (i = 0; i < MAX_FW_IMAGES; i++) { -		release_firmware(wl->fw.fw_bin[i]); -		release_firmware(wl->fw.fw_hdr[i]); -	} -} - -/** - * This function frees the WL per-device resources. - * - * This function frees resources owned by the WL device pointed to - * by the wl parameter. - * - * precondition: can both be called locked and unlocked - * - */ -static void brcms_free(struct brcms_info *wl) -{ -	struct brcms_timer *t, *next; - -	/* free ucode data */ -	if (wl->fw.fw_cnt) -		brcms_ucode_data_free(&wl->ucode); -	if (wl->irq) -		free_irq(wl->irq, wl); - -	/* kill dpc */ -	tasklet_kill(&wl->tasklet); - -	if (wl->pub) { -		brcms_debugfs_detach(wl->pub); -		brcms_c_module_unregister(wl->pub, "linux", wl); -	} - -	/* free common resources */ -	if (wl->wlc) { -		brcms_c_detach(wl->wlc); -		wl->wlc = NULL; -		wl->pub = NULL; -	} - -	/* virtual interface deletion is deferred so we cannot spinwait */ - -	/* wait for all pending callbacks to complete */ -	while (atomic_read(&wl->callbacks) > 0) -		schedule(); - -	/* free timers */ -	for (t = wl->timers; t; t = next) { -		next = t->next; -#ifdef DEBUG -		kfree(t->name); -#endif -		kfree(t); -	} -} - -/* -* called from both kernel as from this kernel module (error flow on attach) -* precondition: perimeter lock is not acquired. -*/ -static void brcms_remove(struct bcma_device *pdev) -{ -	struct ieee80211_hw *hw = bcma_get_drvdata(pdev); -	struct brcms_info *wl = hw->priv; - -	if (wl->wlc) { -		wiphy_rfkill_set_hw_state(wl->pub->ieee_hw->wiphy, false); -		wiphy_rfkill_stop_polling(wl->pub->ieee_hw->wiphy); -		ieee80211_unregister_hw(hw); -	} - -	brcms_free(wl); - -	bcma_set_drvdata(pdev, NULL); -	ieee80211_free_hw(hw); -} -  static irqreturn_t brcms_isr(int irq, void *dev_id)  {  	struct brcms_info *wl; @@ -1047,18 +1057,8 @@ static struct brcms_info *brcms_attach(struct bcma_device *pdev)  	spin_lock_init(&wl->lock);  	spin_lock_init(&wl->isr_lock); -	/* prepare ucode */ -	if (brcms_request_fw(wl, pdev) < 0) { -		wiphy_err(wl->wiphy, "%s: Failed to find firmware usually in " -			  "%s\n", KBUILD_MODNAME, "/lib/firmware/brcm"); -		brcms_release_fw(wl); -		brcms_remove(pdev); -		return NULL; -	} -  	/* common load-time initialization */  	wl->wlc = brcms_c_attach((void *)wl, pdev, unit, false, &err); -	brcms_release_fw(wl);  	if (!wl->wlc) {  		wiphy_err(wl->wiphy, "%s: attach() failed with code %d\n",  			  KBUILD_MODNAME, err);  |