aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2500pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2500pci.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt2500pci.c71
1 files changed, 46 insertions, 25 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index 69d231d83952..c2a555d5376b 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -626,6 +626,7 @@ static inline void rt2500pci_set_vgc(struct rt2x00_dev *rt2x00dev,
626{ 626{
627 if (qual->vgc_level_reg != vgc_level) { 627 if (qual->vgc_level_reg != vgc_level) {
628 rt2500pci_bbp_write(rt2x00dev, 17, vgc_level); 628 rt2500pci_bbp_write(rt2x00dev, 17, vgc_level);
629 qual->vgc_level = vgc_level;
629 qual->vgc_level_reg = vgc_level; 630 qual->vgc_level_reg = vgc_level;
630 } 631 }
631} 632}
@@ -700,13 +701,10 @@ dynamic_cca_tune:
700 * R17 is inside the dynamic tuning range, 701 * R17 is inside the dynamic tuning range,
701 * start tuning the link based on the false cca counter. 702 * start tuning the link based on the false cca counter.
702 */ 703 */
703 if (qual->false_cca > 512 && qual->vgc_level_reg < 0x40) { 704 if (qual->false_cca > 512 && qual->vgc_level_reg < 0x40)
704 rt2500pci_set_vgc(rt2x00dev, qual, ++qual->vgc_level_reg); 705 rt2500pci_set_vgc(rt2x00dev, qual, ++qual->vgc_level_reg);
705 qual->vgc_level = qual->vgc_level_reg; 706 else if (qual->false_cca < 100 && qual->vgc_level_reg > 0x32)
706 } else if (qual->false_cca < 100 && qual->vgc_level_reg > 0x32) {
707 rt2500pci_set_vgc(rt2x00dev, qual, --qual->vgc_level_reg); 707 rt2500pci_set_vgc(rt2x00dev, qual, --qual->vgc_level_reg);
708 qual->vgc_level = qual->vgc_level_reg;
709 }
710} 708}
711 709
712/* 710/*
@@ -1035,7 +1033,8 @@ static void rt2500pci_toggle_rx(struct rt2x00_dev *rt2x00dev,
1035static void rt2500pci_toggle_irq(struct rt2x00_dev *rt2x00dev, 1033static void rt2500pci_toggle_irq(struct rt2x00_dev *rt2x00dev,
1036 enum dev_state state) 1034 enum dev_state state)
1037{ 1035{
1038 int mask = (state == STATE_RADIO_IRQ_OFF); 1036 int mask = (state == STATE_RADIO_IRQ_OFF) ||
1037 (state == STATE_RADIO_IRQ_OFF_ISR);
1039 u32 reg; 1038 u32 reg;
1040 1039
1041 /* 1040 /*
@@ -1136,7 +1135,9 @@ static int rt2500pci_set_device_state(struct rt2x00_dev *rt2x00dev,
1136 rt2500pci_toggle_rx(rt2x00dev, state); 1135 rt2500pci_toggle_rx(rt2x00dev, state);
1137 break; 1136 break;
1138 case STATE_RADIO_IRQ_ON: 1137 case STATE_RADIO_IRQ_ON:
1138 case STATE_RADIO_IRQ_ON_ISR:
1139 case STATE_RADIO_IRQ_OFF: 1139 case STATE_RADIO_IRQ_OFF:
1140 case STATE_RADIO_IRQ_OFF_ISR:
1140 rt2500pci_toggle_irq(rt2x00dev, state); 1141 rt2500pci_toggle_irq(rt2x00dev, state);
1141 break; 1142 break;
1142 case STATE_DEEP_SLEEP: 1143 case STATE_DEEP_SLEEP:
@@ -1369,23 +1370,10 @@ static void rt2500pci_txdone(struct rt2x00_dev *rt2x00dev,
1369 } 1370 }
1370} 1371}
1371 1372
1372static irqreturn_t rt2500pci_interrupt(int irq, void *dev_instance) 1373static irqreturn_t rt2500pci_interrupt_thread(int irq, void *dev_instance)
1373{ 1374{
1374 struct rt2x00_dev *rt2x00dev = dev_instance; 1375 struct rt2x00_dev *rt2x00dev = dev_instance;
1375 u32 reg; 1376 u32 reg = rt2x00dev->irqvalue[0];
1376
1377 /*
1378 * Get the interrupt sources & saved to local variable.
1379 * Write register value back to clear pending interrupts.
1380 */
1381 rt2x00pci_register_read(rt2x00dev, CSR7, &reg);
1382 rt2x00pci_register_write(rt2x00dev, CSR7, reg);
1383
1384 if (!reg)
1385 return IRQ_NONE;
1386
1387 if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
1388 return IRQ_HANDLED;
1389 1377
1390 /* 1378 /*
1391 * Handle interrupts, walk through all bits 1379 * Handle interrupts, walk through all bits
@@ -1423,9 +1411,41 @@ static irqreturn_t rt2500pci_interrupt(int irq, void *dev_instance)
1423 if (rt2x00_get_field32(reg, CSR7_TXDONE_TXRING)) 1411 if (rt2x00_get_field32(reg, CSR7_TXDONE_TXRING))
1424 rt2500pci_txdone(rt2x00dev, QID_AC_BK); 1412 rt2500pci_txdone(rt2x00dev, QID_AC_BK);
1425 1413
1414 /* Enable interrupts again. */
1415 rt2x00dev->ops->lib->set_device_state(rt2x00dev,
1416 STATE_RADIO_IRQ_ON_ISR);
1417
1426 return IRQ_HANDLED; 1418 return IRQ_HANDLED;
1427} 1419}
1428 1420
1421static irqreturn_t rt2500pci_interrupt(int irq, void *dev_instance)
1422{
1423 struct rt2x00_dev *rt2x00dev = dev_instance;
1424 u32 reg;
1425
1426 /*
1427 * Get the interrupt sources & saved to local variable.
1428 * Write register value back to clear pending interrupts.
1429 */
1430 rt2x00pci_register_read(rt2x00dev, CSR7, &reg);
1431 rt2x00pci_register_write(rt2x00dev, CSR7, reg);
1432
1433 if (!reg)
1434 return IRQ_NONE;
1435
1436 if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
1437 return IRQ_HANDLED;
1438
1439 /* Store irqvalues for use in the interrupt thread. */
1440 rt2x00dev->irqvalue[0] = reg;
1441
1442 /* Disable interrupts, will be enabled again in the interrupt thread. */
1443 rt2x00dev->ops->lib->set_device_state(rt2x00dev,
1444 STATE_RADIO_IRQ_OFF_ISR);
1445
1446 return IRQ_WAKE_THREAD;
1447}
1448
1429/* 1449/*
1430 * Device probe functions. 1450 * Device probe functions.
1431 */ 1451 */
@@ -1557,9 +1577,8 @@ static int rt2500pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
1557 * Check if the BBP tuning should be enabled. 1577 * Check if the BBP tuning should be enabled.
1558 */ 1578 */
1559 rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC, &eeprom); 1579 rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC, &eeprom);
1560 1580 if (!rt2x00_get_field16(eeprom, EEPROM_NIC_DYN_BBP_TUNE))
1561 if (rt2x00_get_field16(eeprom, EEPROM_NIC_DYN_BBP_TUNE)) 1581 __set_bit(DRIVER_SUPPORT_LINK_TUNING, &rt2x00dev->flags);
1562 __set_bit(CONFIG_DISABLE_LINK_TUNING, &rt2x00dev->flags);
1563 1582
1564 /* 1583 /*
1565 * Read the RSSI <-> dBm offset information. 1584 * Read the RSSI <-> dBm offset information.
@@ -1864,7 +1883,8 @@ static const struct ieee80211_ops rt2500pci_mac80211_ops = {
1864 .remove_interface = rt2x00mac_remove_interface, 1883 .remove_interface = rt2x00mac_remove_interface,
1865 .config = rt2x00mac_config, 1884 .config = rt2x00mac_config,
1866 .configure_filter = rt2x00mac_configure_filter, 1885 .configure_filter = rt2x00mac_configure_filter,
1867 .set_tim = rt2x00mac_set_tim, 1886 .sw_scan_start = rt2x00mac_sw_scan_start,
1887 .sw_scan_complete = rt2x00mac_sw_scan_complete,
1868 .get_stats = rt2x00mac_get_stats, 1888 .get_stats = rt2x00mac_get_stats,
1869 .bss_info_changed = rt2x00mac_bss_info_changed, 1889 .bss_info_changed = rt2x00mac_bss_info_changed,
1870 .conf_tx = rt2x00mac_conf_tx, 1890 .conf_tx = rt2x00mac_conf_tx,
@@ -1875,6 +1895,7 @@ static const struct ieee80211_ops rt2500pci_mac80211_ops = {
1875 1895
1876static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = { 1896static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = {
1877 .irq_handler = rt2500pci_interrupt, 1897 .irq_handler = rt2500pci_interrupt,
1898 .irq_handler_thread = rt2500pci_interrupt_thread,
1878 .probe_hw = rt2500pci_probe_hw, 1899 .probe_hw = rt2500pci_probe_hw,
1879 .initialize = rt2x00pci_initialize, 1900 .initialize = rt2x00pci_initialize,
1880 .uninitialize = rt2x00pci_uninitialize, 1901 .uninitialize = rt2x00pci_uninitialize,