rt2x00: Fix VGC lower bound initialization
PATCH 1/2 rt2x00: Fix VGC lower bound initialization
When the EEPROM_BBPTUNE_VGC word is valid, we should override EEPROM_BBPTUNE_VGCLOWER field with the BBP value.
And we should _not_ do that when EEPROM_BBPTUNE_R17 is valid.
---
John. Please queue for 2.6.27, it restores rt2500usb back to the same state as 2.6.25 which means it can associate, but cannot transfer data afterwards.
drivers/net/wireless/rt2x00/rt2500usb.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)
drivers/net/wireless/rt2x00/rt2500usb.c +3 -3
@@ -1376,6 +1376,9 @@ static int rt2500usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)rt2x00_set_field16 (&word,EEPROM_BBPTUNE_VGCLOWER , bbp);rt2x00_eeprom_write (rt2x00dev,EEPROM_BBPTUNE_VGC , word);EEPROM (rt2x00dev,"BBPtune vgc: 0x%04x\n" , word); + }else { +rt2x00_set_field16 (&word,EEPROM_BBPTUNE_VGCLOWER , bbp); +rt2x00_eeprom_write (rt2x00dev,EEPROM_BBPTUNE_VGC , word); }rt2x00_eeprom_read (rt2x00dev,EEPROM_BBPTUNE_R17 , &word);
@@ -1384,9 +1387,6 @@ static int rt2500usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)rt2x00_set_field16 (&word,EEPROM_BBPTUNE_R17_HIGH ,0x41 );rt2x00_eeprom_write (rt2x00dev,EEPROM_BBPTUNE_R17 , word);EEPROM (rt2x00dev,"BBPtune r17: 0x%04x\n" , word); - }else { -rt2x00_set_field16 (&word,EEPROM_BBPTUNE_VGCLOWER , bbp); -rt2x00_eeprom_write (rt2x00dev,EEPROM_BBPTUNE_VGC , word); }rt2x00_eeprom_read (rt2x00dev,EEPROM_BBPTUNE_R24 , &word);
Signature · 1 line
1.5.6.1
PATCH 2/2 rt2x00: Sequence counter should be protected in irqsave
The sequence counter can be accessed in IRQ context, which means the lock protecting the counter should be irqsave. To prevent making the entire intf->lock irqsave without reason, create a new lock which only protects the sequence counter.
---
John. Please queue for 2.6.27. This fixes deplock warnings under some circumstances when the interface is up.
drivers/net/wireless/rt2x00/rt2x00.h | 6 ++++++ drivers/net/wireless/rt2x00/rt2x00mac.c | 1 + drivers/net/wireless/rt2x00/rt2x00queue.c | 5 +++-- 3 files changed, 10 insertions(+), 2 deletions(-)
drivers/net/wireless/rt2x00/rt2x00.h +6 -0
@@ -368,6 +368,12 @@ struct rt2x00_intf {#define DELAYED_CONFIG_ERP 0x00000002#define DELAYED_LED_ASSOC 0x00000004 +/* +* Software sequence counter, this is only required +* for hardware which doesn't support hardware +* sequence counting. +*/ +spinlock_t seqlock;u16 seqno; };
drivers/net/wireless/rt2x00/rt2x00mac.c +1 -0
@@ -247,6 +247,7 @@ int rt2x00mac_add_interface(struct ieee80211_hw *hw, rt2x00dev->intf_sta_count++;spin_lock_init (&intf->lock); +spin_lock_init (&intf->seqlock); intf->beacon = entry;if (conf->type ==IEEE80211_IF_TYPE_AP )
drivers/net/wireless/rt2x00/rt2x00queue.c +3 -2
@@ -128,6 +128,7 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry,unsigned int data_length;unsigned int duration;unsigned int residual; +unsigned long irqflags;memset (txdesc,0 ,sizeof (*txdesc));
@@ -213,14 +214,14 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry,* sequence counter given by mac80211. */ if (tx_info->flags &IEEE80211_TX_CTL_ASSIGN_SEQ ) { -spin_lock (&intf->lock); +spin_lock_irqsave (&intf->seqlock, irqflags);if (test_bit (ENTRY_TXD_FIRST_FRAGMENT , &txdesc->flags)) intf->seqno +=0x10 ; hdr->seq_ctrl &=cpu_to_le16 (IEEE80211_SCTL_FRAG ); hdr->seq_ctrl |=cpu_to_le16 (intf->seqno); -spin_unlock (&intf->lock); +spin_unlock_irqrestore (&intf->seqlock, irqflags);__set_bit (ENTRY_TXD_GENERATE_SEQ , &txdesc->flags); }
Signature · 1 line
1.5.6.1