Merge branch 'master' of git://git.infradead.org/users/linville/wireless
Conflicts: drivers/net/wireless/iwlwifi/iwl-pci.c drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c drivers/net/wireless/rt2x00/rt2800usb.c drivers/net/wireless/wl12xx/main.c
This commit is contained in:
@@ -3769,14 +3769,15 @@ static void rt2800_efuse_read(struct rt2x00_dev *rt2x00dev, unsigned int i)
|
||||
rt2800_regbusy_read(rt2x00dev, EFUSE_CTRL, EFUSE_CTRL_KICK, ®);
|
||||
|
||||
/* Apparently the data is read from end to start */
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA3,
|
||||
(u32 *)&rt2x00dev->eeprom[i]);
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA2,
|
||||
(u32 *)&rt2x00dev->eeprom[i + 2]);
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA1,
|
||||
(u32 *)&rt2x00dev->eeprom[i + 4]);
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA0,
|
||||
(u32 *)&rt2x00dev->eeprom[i + 6]);
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA3, ®);
|
||||
/* The returned value is in CPU order, but eeprom is le */
|
||||
rt2x00dev->eeprom[i] = cpu_to_le32(reg);
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA2, ®);
|
||||
*(u32 *)&rt2x00dev->eeprom[i + 2] = cpu_to_le32(reg);
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA1, ®);
|
||||
*(u32 *)&rt2x00dev->eeprom[i + 4] = cpu_to_le32(reg);
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA0, ®);
|
||||
*(u32 *)&rt2x00dev->eeprom[i + 6] = cpu_to_le32(reg);
|
||||
|
||||
mutex_unlock(&rt2x00dev->csr_mutex);
|
||||
}
|
||||
@@ -3942,19 +3943,23 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!rt2x00_rf(rt2x00dev, RF2820) &&
|
||||
!rt2x00_rf(rt2x00dev, RF2850) &&
|
||||
!rt2x00_rf(rt2x00dev, RF2720) &&
|
||||
!rt2x00_rf(rt2x00dev, RF2750) &&
|
||||
!rt2x00_rf(rt2x00dev, RF3020) &&
|
||||
!rt2x00_rf(rt2x00dev, RF2020) &&
|
||||
!rt2x00_rf(rt2x00dev, RF3021) &&
|
||||
!rt2x00_rf(rt2x00dev, RF3022) &&
|
||||
!rt2x00_rf(rt2x00dev, RF3052) &&
|
||||
!rt2x00_rf(rt2x00dev, RF3320) &&
|
||||
!rt2x00_rf(rt2x00dev, RF5370) &&
|
||||
!rt2x00_rf(rt2x00dev, RF5390)) {
|
||||
ERROR(rt2x00dev, "Invalid RF chipset detected.\n");
|
||||
switch (rt2x00dev->chip.rf) {
|
||||
case RF2820:
|
||||
case RF2850:
|
||||
case RF2720:
|
||||
case RF2750:
|
||||
case RF3020:
|
||||
case RF2020:
|
||||
case RF3021:
|
||||
case RF3022:
|
||||
case RF3052:
|
||||
case RF3320:
|
||||
case RF5370:
|
||||
case RF5390:
|
||||
break;
|
||||
default:
|
||||
ERROR(rt2x00dev, "Invalid RF chipset 0x%x detected.\n",
|
||||
rt2x00dev->chip.rf);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
@@ -464,6 +464,15 @@ static bool rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg)
|
||||
int wcid, ack, pid;
|
||||
int tx_wcid, tx_ack, tx_pid;
|
||||
|
||||
if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) ||
|
||||
!test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags)) {
|
||||
WARNING(entry->queue->rt2x00dev,
|
||||
"Data pending for entry %u in queue %u\n",
|
||||
entry->entry_idx, entry->queue->qid);
|
||||
cond_resched();
|
||||
return false;
|
||||
}
|
||||
|
||||
wcid = rt2x00_get_field32(reg, TX_STA_FIFO_WCID);
|
||||
ack = rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED);
|
||||
pid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_TYPE);
|
||||
@@ -529,13 +538,12 @@ static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev)
|
||||
entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
|
||||
if (rt2800usb_txdone_entry_check(entry, reg))
|
||||
break;
|
||||
entry = NULL;
|
||||
}
|
||||
|
||||
if (!entry || rt2x00queue_empty(queue))
|
||||
break;
|
||||
|
||||
rt2800_txdone_entry(entry, reg,
|
||||
rt2800usb_get_txwi(entry));
|
||||
if (entry)
|
||||
rt2800_txdone_entry(entry, reg,
|
||||
rt2800usb_get_txwi(entry));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -559,8 +567,10 @@ static void rt2800usb_work_txdone(struct work_struct *work)
|
||||
while (!rt2x00queue_empty(queue)) {
|
||||
entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
|
||||
|
||||
if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))
|
||||
if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) ||
|
||||
!test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))
|
||||
break;
|
||||
|
||||
if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags))
|
||||
rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE);
|
||||
else if (rt2x00queue_status_timeout(entry))
|
||||
@@ -926,6 +936,8 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
||||
{ USB_DEVICE(0x07d1, 0x3c16) },
|
||||
/* Draytek */
|
||||
{ USB_DEVICE(0x07fa, 0x7712) },
|
||||
/* DVICO */
|
||||
{ USB_DEVICE(0x0fe9, 0xb307) },
|
||||
/* Edimax */
|
||||
{ USB_DEVICE(0x7392, 0x7711) },
|
||||
{ USB_DEVICE(0x7392, 0x7717) },
|
||||
|
@@ -262,23 +262,20 @@ static void rt2x00usb_interrupt_txdone(struct urb *urb)
|
||||
struct queue_entry *entry = (struct queue_entry *)urb->context;
|
||||
struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
|
||||
|
||||
if (!test_and_clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))
|
||||
if (!test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))
|
||||
return;
|
||||
|
||||
if (rt2x00dev->ops->lib->tx_dma_done)
|
||||
rt2x00dev->ops->lib->tx_dma_done(entry);
|
||||
|
||||
/*
|
||||
* Report the frame as DMA done
|
||||
*/
|
||||
rt2x00lib_dmadone(entry);
|
||||
|
||||
/*
|
||||
* Check if the frame was correctly uploaded
|
||||
*/
|
||||
if (urb->status)
|
||||
set_bit(ENTRY_DATA_IO_FAILED, &entry->flags);
|
||||
/*
|
||||
* Report the frame as DMA done
|
||||
*/
|
||||
rt2x00lib_dmadone(entry);
|
||||
|
||||
if (rt2x00dev->ops->lib->tx_dma_done)
|
||||
rt2x00dev->ops->lib->tx_dma_done(entry);
|
||||
/*
|
||||
* Schedule the delayed work for reading the TX status
|
||||
* from the device.
|
||||
@@ -874,18 +871,8 @@ int rt2x00usb_suspend(struct usb_interface *usb_intf, pm_message_t state)
|
||||
{
|
||||
struct ieee80211_hw *hw = usb_get_intfdata(usb_intf);
|
||||
struct rt2x00_dev *rt2x00dev = hw->priv;
|
||||
int retval;
|
||||
|
||||
retval = rt2x00lib_suspend(rt2x00dev, state);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
/*
|
||||
* Decrease usbdev refcount.
|
||||
*/
|
||||
usb_put_dev(interface_to_usbdev(usb_intf));
|
||||
|
||||
return 0;
|
||||
return rt2x00lib_suspend(rt2x00dev, state);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00usb_suspend);
|
||||
|
||||
@@ -894,8 +881,6 @@ int rt2x00usb_resume(struct usb_interface *usb_intf)
|
||||
struct ieee80211_hw *hw = usb_get_intfdata(usb_intf);
|
||||
struct rt2x00_dev *rt2x00dev = hw->priv;
|
||||
|
||||
usb_get_dev(interface_to_usbdev(usb_intf));
|
||||
|
||||
return rt2x00lib_resume(rt2x00dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00usb_resume);
|
||||
|
@@ -2420,6 +2420,7 @@ static struct usb_device_id rt73usb_device_table[] = {
|
||||
/* Buffalo */
|
||||
{ USB_DEVICE(0x0411, 0x00d8) },
|
||||
{ USB_DEVICE(0x0411, 0x00d9) },
|
||||
{ USB_DEVICE(0x0411, 0x00e6) },
|
||||
{ USB_DEVICE(0x0411, 0x00f4) },
|
||||
{ USB_DEVICE(0x0411, 0x0116) },
|
||||
{ USB_DEVICE(0x0411, 0x0119) },
|
||||
|
Reference in New Issue
Block a user