Commit 2cfd71f1 authored by Kalle Valo's avatar Kalle Valo

Merge git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers.git

mt76 driver had major conflicts within mt7615 directory. To make it easier for
every merge wireless-drivers to wireless-drivers-next and solve those
conflicts.
parents 3dc05ffb 1cfd3426
...@@ -820,7 +820,7 @@ static int ath10k_ahb_probe(struct platform_device *pdev) ...@@ -820,7 +820,7 @@ static int ath10k_ahb_probe(struct platform_device *pdev)
ath10k_ahb_release_irq_legacy(ar); ath10k_ahb_release_irq_legacy(ar);
err_free_pipes: err_free_pipes:
ath10k_pci_free_pipes(ar); ath10k_pci_release_resource(ar);
err_resource_deinit: err_resource_deinit:
ath10k_ahb_resource_deinit(ar); ath10k_ahb_resource_deinit(ar);
......
...@@ -3473,6 +3473,28 @@ int ath10k_pci_setup_resource(struct ath10k *ar) ...@@ -3473,6 +3473,28 @@ int ath10k_pci_setup_resource(struct ath10k *ar)
timer_setup(&ar_pci->rx_post_retry, ath10k_pci_rx_replenish_retry, 0); timer_setup(&ar_pci->rx_post_retry, ath10k_pci_rx_replenish_retry, 0);
ar_pci->attr = kmemdup(pci_host_ce_config_wlan,
sizeof(pci_host_ce_config_wlan),
GFP_KERNEL);
if (!ar_pci->attr)
return -ENOMEM;
ar_pci->pipe_config = kmemdup(pci_target_ce_config_wlan,
sizeof(pci_target_ce_config_wlan),
GFP_KERNEL);
if (!ar_pci->pipe_config) {
ret = -ENOMEM;
goto err_free_attr;
}
ar_pci->serv_to_pipe = kmemdup(pci_target_service_to_ce_map_wlan,
sizeof(pci_target_service_to_ce_map_wlan),
GFP_KERNEL);
if (!ar_pci->serv_to_pipe) {
ret = -ENOMEM;
goto err_free_pipe_config;
}
if (QCA_REV_6174(ar) || QCA_REV_9377(ar)) if (QCA_REV_6174(ar) || QCA_REV_9377(ar))
ath10k_pci_override_ce_config(ar); ath10k_pci_override_ce_config(ar);
...@@ -3480,18 +3502,31 @@ int ath10k_pci_setup_resource(struct ath10k *ar) ...@@ -3480,18 +3502,31 @@ int ath10k_pci_setup_resource(struct ath10k *ar)
if (ret) { if (ret) {
ath10k_err(ar, "failed to allocate copy engine pipes: %d\n", ath10k_err(ar, "failed to allocate copy engine pipes: %d\n",
ret); ret);
return ret; goto err_free_serv_to_pipe;
} }
return 0; return 0;
err_free_serv_to_pipe:
kfree(ar_pci->serv_to_pipe);
err_free_pipe_config:
kfree(ar_pci->pipe_config);
err_free_attr:
kfree(ar_pci->attr);
return ret;
} }
void ath10k_pci_release_resource(struct ath10k *ar) void ath10k_pci_release_resource(struct ath10k *ar)
{ {
struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
ath10k_pci_rx_retry_sync(ar); ath10k_pci_rx_retry_sync(ar);
netif_napi_del(&ar->napi); netif_napi_del(&ar->napi);
ath10k_pci_ce_deinit(ar); ath10k_pci_ce_deinit(ar);
ath10k_pci_free_pipes(ar); ath10k_pci_free_pipes(ar);
kfree(ar_pci->attr);
kfree(ar_pci->pipe_config);
kfree(ar_pci->serv_to_pipe);
} }
static const struct ath10k_bus_ops ath10k_pci_bus_ops = { static const struct ath10k_bus_ops ath10k_pci_bus_ops = {
...@@ -3601,30 +3636,6 @@ static int ath10k_pci_probe(struct pci_dev *pdev, ...@@ -3601,30 +3636,6 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
timer_setup(&ar_pci->ps_timer, ath10k_pci_ps_timer, 0); timer_setup(&ar_pci->ps_timer, ath10k_pci_ps_timer, 0);
ar_pci->attr = kmemdup(pci_host_ce_config_wlan,
sizeof(pci_host_ce_config_wlan),
GFP_KERNEL);
if (!ar_pci->attr) {
ret = -ENOMEM;
goto err_free;
}
ar_pci->pipe_config = kmemdup(pci_target_ce_config_wlan,
sizeof(pci_target_ce_config_wlan),
GFP_KERNEL);
if (!ar_pci->pipe_config) {
ret = -ENOMEM;
goto err_free;
}
ar_pci->serv_to_pipe = kmemdup(pci_target_service_to_ce_map_wlan,
sizeof(pci_target_service_to_ce_map_wlan),
GFP_KERNEL);
if (!ar_pci->serv_to_pipe) {
ret = -ENOMEM;
goto err_free;
}
ret = ath10k_pci_setup_resource(ar); ret = ath10k_pci_setup_resource(ar);
if (ret) { if (ret) {
ath10k_err(ar, "failed to setup resource: %d\n", ret); ath10k_err(ar, "failed to setup resource: %d\n", ret);
...@@ -3705,10 +3716,9 @@ static int ath10k_pci_probe(struct pci_dev *pdev, ...@@ -3705,10 +3716,9 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
err_free_irq: err_free_irq:
ath10k_pci_free_irq(ar); ath10k_pci_free_irq(ar);
ath10k_pci_rx_retry_sync(ar);
err_deinit_irq: err_deinit_irq:
ath10k_pci_deinit_irq(ar); ath10k_pci_release_resource(ar);
err_sleep: err_sleep:
ath10k_pci_sleep_sync(ar); ath10k_pci_sleep_sync(ar);
...@@ -3720,29 +3730,18 @@ static int ath10k_pci_probe(struct pci_dev *pdev, ...@@ -3720,29 +3730,18 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
err_core_destroy: err_core_destroy:
ath10k_core_destroy(ar); ath10k_core_destroy(ar);
err_free:
kfree(ar_pci->attr);
kfree(ar_pci->pipe_config);
kfree(ar_pci->serv_to_pipe);
return ret; return ret;
} }
static void ath10k_pci_remove(struct pci_dev *pdev) static void ath10k_pci_remove(struct pci_dev *pdev)
{ {
struct ath10k *ar = pci_get_drvdata(pdev); struct ath10k *ar = pci_get_drvdata(pdev);
struct ath10k_pci *ar_pci;
ath10k_dbg(ar, ATH10K_DBG_PCI, "pci remove\n"); ath10k_dbg(ar, ATH10K_DBG_PCI, "pci remove\n");
if (!ar) if (!ar)
return; return;
ar_pci = ath10k_pci_priv(ar);
if (!ar_pci)
return;
ath10k_core_unregister(ar); ath10k_core_unregister(ar);
ath10k_pci_free_irq(ar); ath10k_pci_free_irq(ar);
ath10k_pci_deinit_irq(ar); ath10k_pci_deinit_irq(ar);
...@@ -3750,9 +3749,6 @@ static void ath10k_pci_remove(struct pci_dev *pdev) ...@@ -3750,9 +3749,6 @@ static void ath10k_pci_remove(struct pci_dev *pdev)
ath10k_pci_sleep_sync(ar); ath10k_pci_sleep_sync(ar);
ath10k_pci_release(ar); ath10k_pci_release(ar);
ath10k_core_destroy(ar); ath10k_core_destroy(ar);
kfree(ar_pci->attr);
kfree(ar_pci->pipe_config);
kfree(ar_pci->serv_to_pipe);
} }
MODULE_DEVICE_TABLE(pci, ath10k_pci_id_table); MODULE_DEVICE_TABLE(pci, ath10k_pci_id_table);
......
...@@ -733,11 +733,13 @@ static void ath9k_hif_usb_reg_in_cb(struct urb *urb) ...@@ -733,11 +733,13 @@ static void ath9k_hif_usb_reg_in_cb(struct urb *urb)
return; return;
} }
rx_buf->skb = nskb;
usb_fill_int_urb(urb, hif_dev->udev, usb_fill_int_urb(urb, hif_dev->udev,
usb_rcvintpipe(hif_dev->udev, usb_rcvintpipe(hif_dev->udev,
USB_REG_IN_PIPE), USB_REG_IN_PIPE),
nskb->data, MAX_REG_IN_BUF_SIZE, nskb->data, MAX_REG_IN_BUF_SIZE,
ath9k_hif_usb_reg_in_cb, nskb, 1); ath9k_hif_usb_reg_in_cb, rx_buf, 1);
} }
resubmit: resubmit:
......
...@@ -271,6 +271,8 @@ static int iwl_dbg_tlv_alloc_trigger(struct iwl_trans *trans, ...@@ -271,6 +271,8 @@ static int iwl_dbg_tlv_alloc_trigger(struct iwl_trans *trans,
{ {
struct iwl_fw_ini_trigger_tlv *trig = (void *)tlv->data; struct iwl_fw_ini_trigger_tlv *trig = (void *)tlv->data;
u32 tp = le32_to_cpu(trig->time_point); u32 tp = le32_to_cpu(trig->time_point);
struct iwl_ucode_tlv *dup = NULL;
int ret;
if (le32_to_cpu(tlv->length) < sizeof(*trig)) if (le32_to_cpu(tlv->length) < sizeof(*trig))
return -EINVAL; return -EINVAL;
...@@ -283,10 +285,20 @@ static int iwl_dbg_tlv_alloc_trigger(struct iwl_trans *trans, ...@@ -283,10 +285,20 @@ static int iwl_dbg_tlv_alloc_trigger(struct iwl_trans *trans,
return -EINVAL; return -EINVAL;
} }
if (!le32_to_cpu(trig->occurrences)) if (!le32_to_cpu(trig->occurrences)) {
dup = kmemdup(tlv, sizeof(*tlv) + le32_to_cpu(tlv->length),
GFP_KERNEL);
if (!dup)
return -ENOMEM;
trig = (void *)dup->data;
trig->occurrences = cpu_to_le32(-1); trig->occurrences = cpu_to_le32(-1);
tlv = dup;
}
ret = iwl_dbg_tlv_add(tlv, &trans->dbg.time_point[tp].trig_list);
kfree(dup);
return iwl_dbg_tlv_add(tlv, &trans->dbg.time_point[tp].trig_list); return ret;
} }
static int (*dbg_tlv_alloc[])(struct iwl_trans *trans, static int (*dbg_tlv_alloc[])(struct iwl_trans *trans,
......
...@@ -1189,17 +1189,15 @@ static int iwl_mvm_inactivity_check(struct iwl_mvm *mvm, u8 alloc_for_sta) ...@@ -1189,17 +1189,15 @@ static int iwl_mvm_inactivity_check(struct iwl_mvm *mvm, u8 alloc_for_sta)
for_each_set_bit(i, &changetid_queues, IWL_MAX_HW_QUEUES) for_each_set_bit(i, &changetid_queues, IWL_MAX_HW_QUEUES)
iwl_mvm_change_queue_tid(mvm, i); iwl_mvm_change_queue_tid(mvm, i);
rcu_read_unlock();
if (free_queue >= 0 && alloc_for_sta != IWL_MVM_INVALID_STA) { if (free_queue >= 0 && alloc_for_sta != IWL_MVM_INVALID_STA) {
ret = iwl_mvm_free_inactive_queue(mvm, free_queue, queue_owner, ret = iwl_mvm_free_inactive_queue(mvm, free_queue, queue_owner,
alloc_for_sta); alloc_for_sta);
if (ret) { if (ret)
rcu_read_unlock();
return ret; return ret;
}
} }
rcu_read_unlock();
return free_queue; return free_queue;
} }
......
...@@ -582,6 +582,8 @@ static const struct iwl_dev_info iwl_dev_info_table[] = { ...@@ -582,6 +582,8 @@ static const struct iwl_dev_info iwl_dev_info_table[] = {
IWL_DEV_INFO(0x30DC, 0x1552, iwl9560_2ac_cfg_soc, iwl9560_killer_1550i_name), IWL_DEV_INFO(0x30DC, 0x1552, iwl9560_2ac_cfg_soc, iwl9560_killer_1550i_name),
IWL_DEV_INFO(0x31DC, 0x1551, iwl9560_2ac_cfg_soc, iwl9560_killer_1550s_name), IWL_DEV_INFO(0x31DC, 0x1551, iwl9560_2ac_cfg_soc, iwl9560_killer_1550s_name),
IWL_DEV_INFO(0x31DC, 0x1552, iwl9560_2ac_cfg_soc, iwl9560_killer_1550i_name), IWL_DEV_INFO(0x31DC, 0x1552, iwl9560_2ac_cfg_soc, iwl9560_killer_1550i_name),
IWL_DEV_INFO(0xA370, 0x1551, iwl9560_2ac_cfg_soc, iwl9560_killer_1550s_name),
IWL_DEV_INFO(0xA370, 0x1552, iwl9560_2ac_cfg_soc, iwl9560_killer_1550i_name),
IWL_DEV_INFO(0x271C, 0x0214, iwl9260_2ac_cfg, iwl9260_1_name), IWL_DEV_INFO(0x271C, 0x0214, iwl9260_2ac_cfg, iwl9260_1_name),
......
...@@ -72,8 +72,7 @@ static int mt7615_eeprom_load(struct mt7615_dev *dev, u32 addr) ...@@ -72,8 +72,7 @@ static int mt7615_eeprom_load(struct mt7615_dev *dev, u32 addr)
{ {
int ret; int ret;
ret = mt76_eeprom_init(&dev->mt76, MT7615_EEPROM_SIZE + ret = mt76_eeprom_init(&dev->mt76, MT7615_EEPROM_FULL_SIZE);
MT7615_EEPROM_EXTRA_DATA);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#define MT7615_EEPROM_TXDPD_SIZE 216 #define MT7615_EEPROM_TXDPD_SIZE 216
#define MT7615_EEPROM_TXDPD_COUNT (44 + 3) #define MT7615_EEPROM_TXDPD_COUNT (44 + 3)
#define MT7615_EEPROM_EXTRA_DATA (MT7615_EEPROM_TXDPD_OFFSET + \ #define MT7615_EEPROM_FULL_SIZE (MT7615_EEPROM_TXDPD_OFFSET + \
MT7615_EEPROM_TXDPD_COUNT * \ MT7615_EEPROM_TXDPD_COUNT * \
MT7615_EEPROM_TXDPD_SIZE) MT7615_EEPROM_TXDPD_SIZE)
......
...@@ -119,25 +119,26 @@ static int mt7663u_probe(struct usb_interface *usb_intf, ...@@ -119,25 +119,26 @@ static int mt7663u_probe(struct usb_interface *usb_intf,
if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_PWR_ON, if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_PWR_ON,
FW_STATE_PWR_ON << 1, 500)) { FW_STATE_PWR_ON << 1, 500)) {
dev_err(dev->mt76.dev, "Timeout for power on\n"); dev_err(dev->mt76.dev, "Timeout for power on\n");
return -EIO; ret = -EIO;
goto error;
} }
alloc_queues: alloc_queues:
ret = mt76u_alloc_mcu_queue(&dev->mt76); ret = mt76u_alloc_mcu_queue(&dev->mt76);
if (ret) if (ret)
goto error; goto error_free_q;
ret = mt76u_alloc_queues(&dev->mt76); ret = mt76u_alloc_queues(&dev->mt76);
if (ret) if (ret)
goto error; goto error_free_q;
ret = mt7663_usb_sdio_register_device(dev); ret = mt7663_usb_sdio_register_device(dev);
if (ret) if (ret)
goto error_freeq; goto error_free_q;
return 0; return 0;
error_freeq: error_free_q:
mt76u_queues_deinit(&dev->mt76); mt76u_queues_deinit(&dev->mt76);
error: error:
usb_set_intfdata(usb_intf, NULL); usb_set_intfdata(usb_intf, NULL);
......
...@@ -456,8 +456,9 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev) ...@@ -456,8 +456,9 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev)
tasklet_disable(&dev->mt76.tx_tasklet); tasklet_disable(&dev->mt76.tx_tasklet);
napi_disable(&dev->mt76.tx_napi); napi_disable(&dev->mt76.tx_napi);
for (i = 0; i < ARRAY_SIZE(dev->mt76.napi); i++) mt76_for_each_q_rx(&dev->mt76, i) {
napi_disable(&dev->mt76.napi[i]); napi_disable(&dev->mt76.napi[i]);
}
mutex_lock(&dev->mt76.mutex); mutex_lock(&dev->mt76.mutex);
...@@ -515,7 +516,7 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev) ...@@ -515,7 +516,7 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev)
tasklet_enable(&dev->mt76.pre_tbtt_tasklet); tasklet_enable(&dev->mt76.pre_tbtt_tasklet);
for (i = 0; i < ARRAY_SIZE(dev->mt76.napi); i++) { mt76_for_each_q_rx(&dev->mt76, i) {
napi_enable(&dev->mt76.napi[i]); napi_enable(&dev->mt76.napi[i]);
napi_schedule(&dev->mt76.napi[i]); napi_schedule(&dev->mt76.napi[i]);
} }
......
...@@ -1021,11 +1021,16 @@ static int mt76u_alloc_tx(struct mt76_dev *dev) ...@@ -1021,11 +1021,16 @@ static int mt76u_alloc_tx(struct mt76_dev *dev)
static void mt76u_free_tx(struct mt76_dev *dev) static void mt76u_free_tx(struct mt76_dev *dev)
{ {
struct mt76_queue *q; int i;
int i, j;
for (i = 0; i < IEEE80211_NUM_ACS; i++) { for (i = 0; i < IEEE80211_NUM_ACS; i++) {
struct mt76_queue *q;
int j;
q = dev->q_tx[i].q; q = dev->q_tx[i].q;
if (!q)
continue;
for (j = 0; j < q->ndesc; j++) for (j = 0; j < q->ndesc; j++)
usb_free_urb(q->entry[j].urb); usb_free_urb(q->entry[j].urb);
} }
...@@ -1033,17 +1038,22 @@ static void mt76u_free_tx(struct mt76_dev *dev) ...@@ -1033,17 +1038,22 @@ static void mt76u_free_tx(struct mt76_dev *dev)
void mt76u_stop_tx(struct mt76_dev *dev) void mt76u_stop_tx(struct mt76_dev *dev)
{ {
struct mt76_queue_entry entry; int ret;
struct mt76_queue *q;
int i, j, ret;
ret = wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(&dev->phy), ret = wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(&dev->phy),
HZ / 5); HZ / 5);
if (!ret) { if (!ret) {
struct mt76_queue_entry entry;
struct mt76_queue *q;
int i, j;
dev_err(dev->dev, "timed out waiting for pending tx\n"); dev_err(dev->dev, "timed out waiting for pending tx\n");
for (i = 0; i < IEEE80211_NUM_ACS; i++) { for (i = 0; i < IEEE80211_NUM_ACS; i++) {
q = dev->q_tx[i].q; q = dev->q_tx[i].q;
if (!q)
continue;
for (j = 0; j < q->ndesc; j++) for (j = 0; j < q->ndesc; j++)
usb_kill_urb(q->entry[j].urb); usb_kill_urb(q->entry[j].urb);
} }
...@@ -1055,6 +1065,8 @@ void mt76u_stop_tx(struct mt76_dev *dev) ...@@ -1055,6 +1065,8 @@ void mt76u_stop_tx(struct mt76_dev *dev)
*/ */
for (i = 0; i < IEEE80211_NUM_ACS; i++) { for (i = 0; i < IEEE80211_NUM_ACS; i++) {
q = dev->q_tx[i].q; q = dev->q_tx[i].q;
if (!q)
continue;
/* Assure we are in sync with killed tasklet. */ /* Assure we are in sync with killed tasklet. */
spin_lock_bh(&q->lock); spin_lock_bh(&q->lock);
......
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