Please pull 'upstream' branch of rt2x00
Hi John,
Here is the 2.1.2 release of rt2x00. Several important bugfixes like a partial return of TX/RX activity in the PCI drivers.
Note that _none_ of the drivers (PCI or USB) are in a good shape since the 2.1.0 release. With partial RX/TX activity we are at least now on a similar behavior as the 2.0.14 version inside kernel 2.6.25.
Speaking of the 2.6.25 kernel, it seems that rt2x00 is not in an all too good shape in there. If more reports about broken TX/RX come in I will consider reverting a lot of patches to make rt2x00 look a lot like the version in 2.6.24. That version wasn't good either, but at least people can't complain about regressions. ;)
Also note that the git pull request below also contains the patches from previous pull request. But I noticed that you hadn't pulled in the 2.1.1 release yet. I won't resent those patches to the list, since there aren't any changes in them since last week. ;)
Ivo
---
The following changes since commit 2b78397a79d3daa2ba6c633526a7e3b455f9fc73:
Stefano Brivio (1):
b43legacy: Add driver load messages
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/ivd/rt2x00.git/ upstream
Adam Baker (1):
rt2x00: correct address calc for queue private data
Gertjan van Wingerde (1):
Fix hw mode registration with mac80211.
Ivo van Doorn (23):
rt2x00: Fix invalid DMA free
rt2x00: Make rt2x00 less verbose
rt2x00: Remove MGMT ring initialization
rt2x00: Select CONFIG_NEW_LEDS
rt2x00: make csr_cache and csr_addr an union
rt2x00: Fix scheduling while atomic errors in usb drivers
rt2x00: Add queue statistics to debugfs
rt2x00: Fix typo in debug statement
rt2x00: Fix skbdesc->data_len initialization
rt2x00: Fix queue->qid initialization
rt2x00: Cleanup Makefile
rt2x00: Kill guardian urb during disable_radio
rt2x00: Release rt2x00 2.1.1
rt2x00: Send frames out with configured TX power
rt2x00: Don't report driver generated frames to tx_status()
rt2x00: Fix Descriptor DMA initialization
rt2x00: Filter ACK_CTS based on FIF_CONTROL
rt2x00: Remove reset_tsf()
rt2x00: Rename dscape -> mac80211
rt2x00: Cleanup mode registration
rt2x00: Remove async vendor request calls from rt2x00usb
rt2x00: Fix MAC address defines in rt61pci
rt2x00: Release rt2x00 2.1.2
drivers/net/wireless/rt2x00/Kconfig | 3 +- drivers/net/wireless/rt2x00/Makefile | 41 ++++------- drivers/net/wireless/rt2x00/rt2400pci.c | 39 ++++------ drivers/net/wireless/rt2x00/rt2400pci.h | 6 +- drivers/net/wireless/rt2x00/rt2500pci.c | 38 ++++------ drivers/net/wireless/rt2x00/rt2500pci.h | 4 +- drivers/net/wireless/rt2x00/rt2500usb.c | 23 ++++--- drivers/net/wireless/rt2x00/rt2500usb.h | 4 +- drivers/net/wireless/rt2x00/rt2x00.h | 50 ++++++++----- drivers/net/wireless/rt2x00/rt2x00debug.c | 90 ++++++++++++++++++++---- drivers/net/wireless/rt2x00/rt2x00dev.c | 100 +++++++++++++++------------ drivers/net/wireless/rt2x00/rt2x00lib.h | 5 +- drivers/net/wireless/rt2x00/rt2x00mac.c | 24 ++++++- drivers/net/wireless/rt2x00/rt2x00pci.c | 108 +++++++++++++++++++--------- drivers/net/wireless/rt2x00/rt2x00pci.h | 14 ++-- drivers/net/wireless/rt2x00/rt2x00queue.c | 36 +++++---- drivers/net/wireless/rt2x00/rt2x00queue.h | 12 +++- drivers/net/wireless/rt2x00/rt2x00usb.c | 90 +++++++----------------- drivers/net/wireless/rt2x00/rt2x00usb.h | 18 ----- drivers/net/wireless/rt2x00/rt61pci.c | 54 ++++++-------- drivers/net/wireless/rt2x00/rt61pci.h | 12 ++-- drivers/net/wireless/rt2x00/rt73usb.c | 56 +++++++-------- drivers/net/wireless/rt2x00/rt73usb.h | 4 +- 23 files changed, 453 insertions(+), 378 deletions(-)
PATCH 1/11 rt2x00: Send frames out with configured TX power
mac80211 sends the txpower to use during config(), we already store it in the rt2x00_dev structure. When writing the descriptor correctly initialize the txpower field with this value to make sure all frames are send out with the correct tx power.
--- drivers/net/wireless/rt2x00/rt61pci.c | 4 +--- drivers/net/wireless/rt2x00/rt73usb.c | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-)
drivers/net/wireless/rt2x00/rt61pci.c +1 -3
@@ -1500,10 +1500,8 @@ static void rt61pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,rt2x00_desc_write (txd,2 , word);rt2x00_desc_read (txd,5 , &word); -/* XXX: removed for now rt2x00_set_field32 (&word,TXD_W5_TX_POWER , -TXPOWER_TO_DEV(control->power_level)); -*/ +TXPOWER_TO_DEV (rt2x00dev->tx_power));rt2x00_set_field32 (&word,TXD_W5_WAITING_DMA_DONE_INT ,1 );rt2x00_desc_write (txd,5 , word);
drivers/net/wireless/rt2x00/rt73usb.c +1 -3
@@ -1236,10 +1236,8 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,rt2x00_desc_write (txd,2 , word);rt2x00_desc_read (txd,5 , &word); -/* XXX: removed for now rt2x00_set_field32 (&word,TXD_W5_TX_POWER , -TXPOWER_TO_DEV(control->power_level)); -*/ +TXPOWER_TO_DEV (rt2x00dev->tx_power));rt2x00_set_field32 (&word,TXD_W5_WAITING_DMA_DONE_INT ,1 );rt2x00_desc_write (txd,5 , word);
Signature · 1 line
1.5.4
PATCH 2/11 rt2x00: Don't report driver generated frames to tx_status()
In reply to Ivo van DoornThis adds a new flag for the skb_frame_desc structure which is used to tag rts/cts frames that are generated by the driver. Through the tag we can recognize frames we have generated ourselves, so we don't report their tx status to mac80211.
This patch is based on the original patch by
Mattias Nissler <[email protected]>.
--- drivers/net/wireless/rt2x00/rt2400pci.c | 1 + drivers/net/wireless/rt2x00/rt2500pci.c | 1 + drivers/net/wireless/rt2x00/rt2500usb.c | 1 + drivers/net/wireless/rt2x00/rt2x00dev.c | 20 ++++++++++++++++---- drivers/net/wireless/rt2x00/rt2x00mac.c | 15 +++++++++++++++ drivers/net/wireless/rt2x00/rt2x00pci.c | 1 - drivers/net/wireless/rt2x00/rt2x00queue.h | 12 +++++++++++- drivers/net/wireless/rt2x00/rt2x00usb.c | 1 - drivers/net/wireless/rt2x00/rt61pci.c | 1 + drivers/net/wireless/rt2x00/rt73usb.c | 1 + 10 files changed, 47 insertions(+), 7 deletions(-)
drivers/net/wireless/rt2x00/rt2400pci.c +1 -0
@@ -1527,6 +1527,7 @@ static int rt2400pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb,*/ skbdesc =get_skb_frame_desc (skb);memset (skbdesc,0 ,sizeof (*skbdesc)); + skbdesc->flags |=FRAME_DESC_DRIVER_GENERATED ; skbdesc->data = skb->data; skbdesc->data_len = skb->len; skbdesc->desc = priv_tx->desc;
drivers/net/wireless/rt2x00/rt2500pci.c +1 -0
@@ -1839,6 +1839,7 @@ static int rt2500pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb,*/ skbdesc =get_skb_frame_desc (skb);memset (skbdesc,0 ,sizeof (*skbdesc)); + skbdesc->flags |=FRAME_DESC_DRIVER_GENERATED ; skbdesc->data = skb->data; skbdesc->data_len = skb->len; skbdesc->desc = priv_tx->desc;
drivers/net/wireless/rt2x00/rt2500usb.c +1 -0
@@ -1747,6 +1747,7 @@ static int rt2500usb_beacon_update(struct ieee80211_hw *hw,*/ skbdesc =get_skb_frame_desc (skb);memset (skbdesc,0 ,sizeof (*skbdesc)); + skbdesc->flags |=FRAME_DESC_DRIVER_GENERATED ; skbdesc->data = skb->data + intf->beacon->queue->desc_size; skbdesc->data_len = skb->len - intf->beacon->queue->desc_size; skbdesc->desc = skb->data;
drivers/net/wireless/rt2x00/rt2x00dev.c +16 -4
@@ -497,6 +497,7 @@ void rt2x00lib_txdone(struct queue_entry *entry, struct txdone_entry_desc *txdesc) {struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; +struct skb_frame_desc *skbdesc;struct ieee80211_tx_status tx_status;int success = !!(txdesc->status ==TX_SUCCESS || txdesc->status ==TX_SUCCESS_RETRY );
@@ -537,12 +538,23 @@ void rt2x00lib_txdone(struct queue_entry *entry, }/* -* Send the tx_status to mac80211 & debugfs. -* mac80211 will clean up the skb structure. +* Send the tx_status to debugfs. Only send the status report +* to mac80211 when the frame originated from there. If this was +* a extra frame coming through a mac80211 library call (RTS/CTS) +* then we should not send the status report back. +* If send to mac80211, mac80211 will clean up the skb structure, +* otherwise we have to do it ourself. */ -get_skb_frame_desc (entry->skb)->frame_type =DUMP_FRAME_TXDONE ; + skbdesc =get_skb_frame_desc (entry->skb); + skbdesc->frame_type =DUMP_FRAME_TXDONE ; +rt2x00debug_dump_frame (rt2x00dev, entry->skb); -ieee80211_tx_status_irqsafe (rt2x00dev->hw, entry->skb, &tx_status); + +if (!(skbdesc->flags &FRAME_DESC_DRIVER_GENERATED )) +ieee80211_tx_status_irqsafe (rt2x00dev->hw, + entry->skb, &tx_status); +else +dev_kfree_skb (entry->skb); entry->skb =NULL ; }EXPORT_SYMBOL_GPL (rt2x00lib_txdone);
drivers/net/wireless/rt2x00/rt2x00mac.c +15 -0
@@ -34,6 +34,7 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev,struct sk_buff *frag_skb, struct ieee80211_tx_control *control) { + struct skb_frame_desc *skbdesc;struct sk_buff *skb;int size;
@@ -60,6 +61,13 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev, frag_skb->data, frag_skb->len, control, (struct ieee80211_rts *)(skb->data)); +/* +* Initialize skb descriptor +*/ + skbdesc =get_skb_frame_desc (skb); +memset (skbdesc,0 ,sizeof (*skbdesc)); + skbdesc->flags |=FRAME_DESC_DRIVER_GENERATED ; +if (rt2x00dev->ops->lib->write_tx_data (rt2x00dev, queue, skb, control)) {WARNING (rt2x00dev,"Failed to send RTS/CTS frame.\n" );return NETDEV_TX_BUSY ;
@@ -74,6 +82,7 @@ int rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb,struct rt2x00_dev *rt2x00dev = hw->priv;struct ieee80211_hdr *ieee80211hdr = (struct ieee80211_hdr *)skb->data;struct data_queue *queue; +struct skb_frame_desc *skbdesc;u16 frame_control;/*
@@ -121,6 +130,12 @@ int rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb, } } +/* +* Initialize skb descriptor +*/ + skbdesc =get_skb_frame_desc (skb); +memset (skbdesc,0 ,sizeof (*skbdesc)); +if (rt2x00dev->ops->lib->write_tx_data (rt2x00dev, queue, skb, control)) {ieee80211_stop_queue (rt2x00dev->hw, control->queue);return NETDEV_TX_BUSY ;
drivers/net/wireless/rt2x00/rt2x00pci.c +0 -1
@@ -61,7 +61,6 @@ int rt2x00pci_write_tx_data(struct rt2x00_dev *rt2x00dev,* Fill in skb descriptor */ skbdesc =get_skb_frame_desc (skb); -memset (skbdesc,0 ,sizeof (*skbdesc)); skbdesc->data = skb->data; skbdesc->data_len = skb->len; skbdesc->desc = priv_tx->desc;
drivers/net/wireless/rt2x00/rt2x00queue.h +11 -1
@@ -82,12 +82,22 @@ enum rt2x00_bcn_queue { };/** +* enum skb_frame_desc_flags: Flags for &struct skb_frame_desc +* +* @FRAME_DESC_DRIVER_GENERATED: Frame was generated inside driver +* and should not be reported back to mac80211 during txdone. +*/ +enum skb_frame_desc_flags { +FRAME_DESC_DRIVER_GENERATED =1 <<0 , +}; + +/** * struct skb_frame_desc: Descriptor information for the skb buffer * * This structure is placed over the skb->cb array, this means that * this structure should not exceed the size of that array (48 bytes). * -* @flags: Frame flags. +* @flags: Frame flags, see &enum skb_frame_desc_flags. * @frame_type: Frame type, see &enum rt2x00_dump_type. * @data: Pointer to data part of frame (Start of ieee80211 header). * @desc: Pointer to descriptor part of the frame.
drivers/net/wireless/rt2x00/rt2x00usb.c +0 -1
@@ -252,7 +252,6 @@ int rt2x00usb_write_tx_data(struct rt2x00_dev *rt2x00dev,* Fill in skb descriptor */ skbdesc =get_skb_frame_desc (skb); -memset (skbdesc,0 ,sizeof (*skbdesc)); skbdesc->data = skb->data + queue->desc_size; skbdesc->data_len = skb->len - queue->desc_size; skbdesc->desc = skb->data;
drivers/net/wireless/rt2x00/rt61pci.c +1 -0
@@ -2396,6 +2396,7 @@ static int rt61pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb,*/ skbdesc =get_skb_frame_desc (skb);memset (skbdesc,0 ,sizeof (*skbdesc)); + skbdesc->flags |=FRAME_DESC_DRIVER_GENERATED ; skbdesc->data = skb->data + intf->beacon->queue->desc_size; skbdesc->data_len = skb->len - intf->beacon->queue->desc_size; skbdesc->desc = skb->data;
drivers/net/wireless/rt2x00/rt73usb.c +1 -0
@@ -1998,6 +1998,7 @@ static int rt73usb_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb,*/ skbdesc =get_skb_frame_desc (skb);memset (skbdesc,0 ,sizeof (*skbdesc)); + skbdesc->flags |=FRAME_DESC_DRIVER_GENERATED ; skbdesc->data = skb->data + intf->beacon->queue->desc_size; skbdesc->data_len = skb->len - intf->beacon->queue->desc_size; skbdesc->desc = skb->data;
Signature · 1 line
1.5.4
PATCH 3/11 rt2x00: Fix Descriptor DMA initialization
In reply to Ivo van DoornAs Adam Baker reported the DMA address for the descriptor base was incorrectly initialized in the PCI drivers.
Instead of the DMA base for the descriptor, the DMA base for the data was passed resulting in a broken TX/RX state for PCI drivers.
--- drivers/net/wireless/rt2x00/rt2400pci.c | 21 ++++++++++------ drivers/net/wireless/rt2x00/rt2500pci.c | 18 +++++++++----- drivers/net/wireless/rt2x00/rt2x00pci.c | 38 +++++++++++++++++------------- drivers/net/wireless/rt2x00/rt2x00pci.h | 6 +++- drivers/net/wireless/rt2x00/rt61pci.c | 21 +++++++++++----- 5 files changed, 63 insertions(+), 41 deletions(-)
drivers/net/wireless/rt2x00/rt2400pci.c +13 -8
@@ -597,11 +597,12 @@ static void rt2400pci_init_rxentry(struct rt2x00_dev *rt2x00dev,u32 word;rt2x00_desc_read (priv_rx->desc,2 , &word); -rt2x00_set_field32 (&word,RXD_W2_BUFFER_LENGTH , entry->queue->data_size); +rt2x00_set_field32 (&word,RXD_W2_BUFFER_LENGTH , + entry->queue->data_size);rt2x00_desc_write (priv_rx->desc,2 , word);rt2x00_desc_read (priv_rx->desc,1 , &word); -rt2x00_set_field32 (&word,RXD_W1_BUFFER_ADDRESS , priv_rx->dma); +rt2x00_set_field32 (&word,RXD_W1_BUFFER_ADDRESS , priv_rx->data_dma);rt2x00_desc_write (priv_rx->desc,1 , word);rt2x00_desc_read (priv_rx->desc,0 , &word);
@@ -616,7 +617,7 @@ static void rt2400pci_init_txentry(struct rt2x00_dev *rt2x00dev,u32 word;rt2x00_desc_read (priv_tx->desc,1 , &word); -rt2x00_set_field32 (&word,TXD_W1_BUFFER_ADDRESS , priv_tx->dma); +rt2x00_set_field32 (&word,TXD_W1_BUFFER_ADDRESS , priv_tx->data_dma);rt2x00_desc_write (priv_tx->desc,1 , word);rt2x00_desc_read (priv_tx->desc,2 , &word);
@@ -648,22 +649,26 @@ static int rt2400pci_init_queues(struct rt2x00_dev *rt2x00dev) priv_tx = rt2x00dev->tx[1 ].entries[0 ].priv_data;rt2x00pci_register_read (rt2x00dev,TXCSR3 , ®); -rt2x00_set_field32 (®,TXCSR3_TX_RING_REGISTER , priv_tx->dma); +rt2x00_set_field32 (®,TXCSR3_TX_RING_REGISTER , + priv_tx->desc_dma);rt2x00pci_register_write (rt2x00dev,TXCSR3 , reg); priv_tx = rt2x00dev->tx[0 ].entries[0 ].priv_data;rt2x00pci_register_read (rt2x00dev,TXCSR5 , ®); -rt2x00_set_field32 (®,TXCSR5_PRIO_RING_REGISTER , priv_tx->dma); +rt2x00_set_field32 (®,TXCSR5_PRIO_RING_REGISTER , + priv_tx->desc_dma);rt2x00pci_register_write (rt2x00dev,TXCSR5 , reg); priv_tx = rt2x00dev->bcn[1 ].entries[0 ].priv_data;rt2x00pci_register_read (rt2x00dev,TXCSR4 , ®); -rt2x00_set_field32 (®,TXCSR4_ATIM_RING_REGISTER , priv_tx->dma); +rt2x00_set_field32 (®,TXCSR4_ATIM_RING_REGISTER , + priv_tx->desc_dma);rt2x00pci_register_write (rt2x00dev,TXCSR4 , reg); priv_tx = rt2x00dev->bcn[0 ].entries[0 ].priv_data;rt2x00pci_register_read (rt2x00dev,TXCSR6 , ®); -rt2x00_set_field32 (®,TXCSR6_BEACON_RING_REGISTER , priv_tx->dma); +rt2x00_set_field32 (®,TXCSR6_BEACON_RING_REGISTER , + priv_tx->desc_dma);rt2x00pci_register_write (rt2x00dev,TXCSR6 , reg);rt2x00pci_register_read (rt2x00dev,RXCSR1 , ®);
@@ -673,7 +678,7 @@ static int rt2400pci_init_queues(struct rt2x00_dev *rt2x00dev) priv_rx = rt2x00dev->rx->entries[0 ].priv_data;rt2x00pci_register_read (rt2x00dev,RXCSR2 , ®); -rt2x00_set_field32 (®,RXCSR2_RX_RING_REGISTER , priv_tx->dma); +rt2x00_set_field32 (®,RXCSR2_RX_RING_REGISTER , priv_tx->desc_dma);rt2x00pci_register_write (rt2x00dev,RXCSR2 , reg);return 0 ;
drivers/net/wireless/rt2x00/rt2500pci.c +11 -7
@@ -691,7 +691,7 @@ static void rt2500pci_init_rxentry(struct rt2x00_dev *rt2x00dev,u32 word;rt2x00_desc_read (priv_rx->desc,1 , &word); -rt2x00_set_field32 (&word,RXD_W1_BUFFER_ADDRESS , priv_rx->dma); +rt2x00_set_field32 (&word,RXD_W1_BUFFER_ADDRESS , priv_rx->data_dma);rt2x00_desc_write (priv_rx->desc,1 , word);rt2x00_desc_read (priv_rx->desc,0 , &word);
@@ -706,7 +706,7 @@ static void rt2500pci_init_txentry(struct rt2x00_dev *rt2x00dev,u32 word;rt2x00_desc_read (priv_tx->desc,1 , &word); -rt2x00_set_field32 (&word,TXD_W1_BUFFER_ADDRESS , priv_tx->dma); +rt2x00_set_field32 (&word,TXD_W1_BUFFER_ADDRESS , priv_tx->data_dma);rt2x00_desc_write (priv_tx->desc,1 , word);rt2x00_desc_read (priv_tx->desc,0 , &word);
@@ -733,22 +733,26 @@ static int rt2500pci_init_queues(struct rt2x00_dev *rt2x00dev) priv_tx = rt2x00dev->tx[1 ].entries[0 ].priv_data;rt2x00pci_register_read (rt2x00dev,TXCSR3 , ®); -rt2x00_set_field32 (®,TXCSR3_TX_RING_REGISTER , priv_tx->dma); +rt2x00_set_field32 (®,TXCSR3_TX_RING_REGISTER , + priv_tx->desc_dma);rt2x00pci_register_write (rt2x00dev,TXCSR3 , reg); priv_tx = rt2x00dev->tx[0 ].entries[0 ].priv_data;rt2x00pci_register_read (rt2x00dev,TXCSR5 , ®); -rt2x00_set_field32 (®,TXCSR5_PRIO_RING_REGISTER , priv_tx->dma); +rt2x00_set_field32 (®,TXCSR5_PRIO_RING_REGISTER , + priv_tx->desc_dma);rt2x00pci_register_write (rt2x00dev,TXCSR5 , reg); priv_tx = rt2x00dev->bcn[1 ].entries[0 ].priv_data;rt2x00pci_register_read (rt2x00dev,TXCSR4 , ®); -rt2x00_set_field32 (®,TXCSR4_ATIM_RING_REGISTER , priv_tx->dma); +rt2x00_set_field32 (®,TXCSR4_ATIM_RING_REGISTER , + priv_tx->desc_dma);rt2x00pci_register_write (rt2x00dev,TXCSR4 , reg); priv_tx = rt2x00dev->bcn[0 ].entries[0 ].priv_data;rt2x00pci_register_read (rt2x00dev,TXCSR6 , ®); -rt2x00_set_field32 (®,TXCSR6_BEACON_RING_REGISTER , priv_tx->dma); +rt2x00_set_field32 (®,TXCSR6_BEACON_RING_REGISTER , + priv_tx->desc_dma);rt2x00pci_register_write (rt2x00dev,TXCSR6 , reg);rt2x00pci_register_read (rt2x00dev,RXCSR1 , ®);
@@ -758,7 +762,7 @@ static int rt2500pci_init_queues(struct rt2x00_dev *rt2x00dev) priv_rx = rt2x00dev->rx->entries[0 ].priv_data;rt2x00pci_register_read (rt2x00dev,RXCSR2 , ®); -rt2x00_set_field32 (®,RXCSR2_RX_RING_REGISTER , priv_tx->dma); +rt2x00_set_field32 (®,RXCSR2_RX_RING_REGISTER , priv_tx->desc_dma);rt2x00pci_register_write (rt2x00dev,RXCSR2 , reg);return 0 ;
drivers/net/wireless/rt2x00/rt2x00pci.c +21 -17
@@ -218,40 +218,44 @@ static int rt2x00pci_alloc_queue_dma(struct rt2x00_dev *rt2x00dev,struct pci_dev *pci_dev =rt2x00dev_pci (rt2x00dev);struct queue_entry_priv_pci_rx *priv_rx;struct queue_entry_priv_pci_tx *priv_tx; -void *desc; +void *addr; +dma_addr_t dma; +void *desc_addr; +dma_addr_t desc_dma;void *data_addr; -void *data;dma_addr_t data_dma; -dma_addr_t dma;unsigned int i;/* * Allocate DMA memory for descriptor and buffer. */ - data_addr =pci_alloc_consistent (pci_dev,dma_size (queue), &data_dma); -if (!data_addr) + addr =pci_alloc_consistent (pci_dev,dma_size (queue), &dma); +if (!addr)return -ENOMEM ; -memset (data_addr,0 ,dma_size (queue)); +memset (addr,0 ,dma_size (queue));/* * Initialize all queue entries to contain valid addresses. */ for (i =0 ; i < queue->limit; i++) { - desc =desc_offset (queue, data_addr, i); - data =data_offset (queue, data_addr, i); - dma =data_offset (queue, data_dma, i); + desc_addr =desc_offset (queue, addr, i); + desc_dma =desc_offset (queue, dma, i); + data_addr =data_offset (queue, addr, i); + data_dma =data_offset (queue, dma, i);if (queue->qid ==QID_RX ) { priv_rx = queue->entries[i].priv_data; - priv_rx->desc = desc; - priv_rx->data = data; - priv_rx->dma = dma; + priv_rx->desc = desc_addr; + priv_rx->desc_dma = desc_dma; + priv_rx->data = data_addr; + priv_rx->data_dma = data_dma; }else { priv_tx = queue->entries[i].priv_data; - priv_tx->desc = desc; - priv_tx->data = data; - priv_tx->dma = dma; + priv_tx->desc = desc_addr; + priv_tx->desc_dma = desc_dma; + priv_tx->data = data_addr; + priv_tx->data_dma = data_dma; } }
@@ -270,13 +274,13 @@ static void rt2x00pci_free_queue_dma(struct rt2x00_dev *rt2x00dev,if (queue->qid ==QID_RX ) { priv_rx = queue->entries[0 ].priv_data; data_addr = priv_rx->data; - data_dma = priv_rx->dma; + data_dma = priv_rx->data_dma; priv_rx->data =NULL ; }else { priv_tx = queue->entries[0 ].priv_data; data_addr = priv_tx->data; - data_dma = priv_tx->dma; + data_dma = priv_tx->data_dma; priv_tx->data =NULL ; }
drivers/net/wireless/rt2x00/rt2x00pci.h +4 -2
@@ -103,9 +103,10 @@ int rt2x00pci_write_tx_data(struct rt2x00_dev *rt2x00dev,*/ struct queue_entry_priv_pci_rx {__le32 *desc; +dma_addr_t desc_dma;void *data; -dma_addr_t dma; +dma_addr_t data_dma; };/**
@@ -118,9 +119,10 @@ struct queue_entry_priv_pci_rx {*/ struct queue_entry_priv_pci_tx {__le32 *desc; +dma_addr_t desc_dma;void *data; -dma_addr_t dma; +dma_addr_t data_dma;struct ieee80211_tx_control control; };
drivers/net/wireless/rt2x00/rt61pci.c +14 -7
@@ -975,7 +975,8 @@ static void rt61pci_init_rxentry(struct rt2x00_dev *rt2x00dev,u32 word;rt2x00_desc_read (priv_rx->desc,5 , &word); -rt2x00_set_field32 (&word,RXD_W5_BUFFER_PHYSICAL_ADDRESS , priv_rx->dma); +rt2x00_set_field32 (&word,RXD_W5_BUFFER_PHYSICAL_ADDRESS , + priv_rx->data_dma);rt2x00_desc_write (priv_rx->desc,5 , word);rt2x00_desc_read (priv_rx->desc,0 , &word);
@@ -999,7 +1000,8 @@ static void rt61pci_init_txentry(struct rt2x00_dev *rt2x00dev,rt2x00_desc_write (priv_tx->desc,5 , word);rt2x00_desc_read (priv_tx->desc,6 , &word); -rt2x00_set_field32 (&word,TXD_W6_BUFFER_PHYSICAL_ADDRESS , priv_tx->dma); +rt2x00_set_field32 (&word,TXD_W6_BUFFER_PHYSICAL_ADDRESS , + priv_tx->data_dma);rt2x00_desc_write (priv_tx->desc,6 , word);rt2x00_desc_read (priv_tx->desc,0 , &word);
@@ -1035,22 +1037,26 @@ static int rt61pci_init_queues(struct rt2x00_dev *rt2x00dev) priv_tx = rt2x00dev->tx[0 ].entries[0 ].priv_data;rt2x00pci_register_read (rt2x00dev,AC0_BASE_CSR , ®); -rt2x00_set_field32 (®,AC0_BASE_CSR_RING_REGISTER , priv_tx->dma); +rt2x00_set_field32 (®,AC0_BASE_CSR_RING_REGISTER , + priv_tx->desc_dma);rt2x00pci_register_write (rt2x00dev,AC0_BASE_CSR , reg); priv_tx = rt2x00dev->tx[1 ].entries[0 ].priv_data;rt2x00pci_register_read (rt2x00dev,AC1_BASE_CSR , ®); -rt2x00_set_field32 (®,AC1_BASE_CSR_RING_REGISTER , priv_tx->dma); +rt2x00_set_field32 (®,AC1_BASE_CSR_RING_REGISTER , + priv_tx->desc_dma);rt2x00pci_register_write (rt2x00dev,AC1_BASE_CSR , reg); priv_tx = rt2x00dev->tx[2 ].entries[0 ].priv_data;rt2x00pci_register_read (rt2x00dev,AC2_BASE_CSR , ®); -rt2x00_set_field32 (®,AC2_BASE_CSR_RING_REGISTER , priv_tx->dma); +rt2x00_set_field32 (®,AC2_BASE_CSR_RING_REGISTER , + priv_tx->desc_dma);rt2x00pci_register_write (rt2x00dev,AC2_BASE_CSR , reg); priv_tx = rt2x00dev->tx[3 ].entries[0 ].priv_data;rt2x00pci_register_read (rt2x00dev,AC3_BASE_CSR , ®); -rt2x00_set_field32 (®,AC3_BASE_CSR_RING_REGISTER , priv_tx->dma); +rt2x00_set_field32 (®,AC3_BASE_CSR_RING_REGISTER , + priv_tx->desc_dma);rt2x00pci_register_write (rt2x00dev,AC3_BASE_CSR , reg);rt2x00pci_register_read (rt2x00dev,RX_RING_CSR , ®);
@@ -1062,7 +1068,8 @@ static int rt61pci_init_queues(struct rt2x00_dev *rt2x00dev) priv_rx = rt2x00dev->rx->entries[0 ].priv_data;rt2x00pci_register_read (rt2x00dev,RX_BASE_CSR , ®); -rt2x00_set_field32 (®,RX_BASE_CSR_RING_REGISTER , priv_rx->dma); +rt2x00_set_field32 (®,RX_BASE_CSR_RING_REGISTER , + priv_rx->desc_dma);rt2x00pci_register_write (rt2x00dev,RX_BASE_CSR , reg);rt2x00pci_register_read (rt2x00dev,TX_DMA_DST_CSR , ®);
Signature · 1 line
1.5.4
PATCH 4/11 rt2x00: Filter ACK_CTS based on FIF_CONTROL
In reply to Ivo van DoornThe ACK_CTS frame is a control frame, this means dropping the frame depends on the FIF_CONTROL flag for filtering.
This also fixes an obvious typo in register definition.
--- drivers/net/wireless/rt2x00/rt61pci.c | 5 +++-- drivers/net/wireless/rt2x00/rt61pci.h | 2 +- drivers/net/wireless/rt2x00/rt73usb.c | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-)
drivers/net/wireless/rt2x00/rt61pci.c +3 -2
@@ -2328,8 +2328,9 @@ static void rt61pci_configure_filter(struct ieee80211_hw *hw,rt2x00_set_field32 (®,TXRX_CSR0_DROP_VERSION_ERROR ,1 );rt2x00_set_field32 (®,TXRX_CSR0_DROP_MULTICAST , !(*total_flags &FIF_ALLMULTI )); -rt2x00_set_field32 (®,TXRX_CSR0_DROP_BORADCAST ,0 ); -rt2x00_set_field32 (®,TXRX_CSR0_DROP_ACK_CTS ,1 ); +rt2x00_set_field32 (®,TXRX_CSR0_DROP_BROADCAST ,0 ); +rt2x00_set_field32 (®,TXRX_CSR0_DROP_ACK_CTS , + !(*total_flags &FIF_CONTROL ));rt2x00pci_register_write (rt2x00dev,TXRX_CSR0 , reg); }
drivers/net/wireless/rt2x00/rt61pci.h +1 -1
@@ -405,7 +405,7 @@ struct hw_pairwise_ta_entry {#define TXRX_CSR0_DROP_TO_DS FIELD32(0x00200000)#define TXRX_CSR0_DROP_VERSION_ERROR FIELD32(0x00400000)#define TXRX_CSR0_DROP_MULTICAST FIELD32(0x00800000) -#define TXRX_CSR0_DROP_BORADCAST FIELD32(0x01000000) +#define TXRX_CSR0_DROP_BROADCAST FIELD32(0x01000000)#define TXRX_CSR0_DROP_ACK_CTS FIELD32(0x02000000)#define TXRX_CSR0_TX_WITHOUT_WAITING FIELD32(0x04000000)
drivers/net/wireless/rt2x00/rt73usb.c +2 -1
@@ -1925,7 +1925,8 @@ static void rt73usb_configure_filter(struct ieee80211_hw *hw,rt2x00_set_field32 (®,TXRX_CSR0_DROP_MULTICAST , !(*total_flags &FIF_ALLMULTI ));rt2x00_set_field32 (®,TXRX_CSR0_DROP_BROADCAST ,0 ); -rt2x00_set_field32 (®,TXRX_CSR0_DROP_ACK_CTS ,1 ); +rt2x00_set_field32 (®,TXRX_CSR0_DROP_ACK_CTS , + !(*total_flags &FIF_CONTROL ));rt73usb_register_write (rt2x00dev,TXRX_CSR0 , reg); }
Signature · 1 line
1.5.4
PATCH 5/11 rt2x00: Remove reset_tsf()
In reply to Ivo van DoornSpecifications indicate the TSF registers are read-only, so there is no point in writing 0 to those registers.
As far as I know there isn't another way to reset the TSF registers. So removing these callbacks will notify mac80211 about the lack of support.
--- drivers/net/wireless/rt2x00/rt2400pci.c | 9 --------- drivers/net/wireless/rt2x00/rt2500pci.c | 9 --------- drivers/net/wireless/rt2x00/rt61pci.c | 9 --------- drivers/net/wireless/rt2x00/rt73usb.c | 9 --------- 4 files changed, 0 insertions(+), 36 deletions(-)
drivers/net/wireless/rt2x00/rt2400pci.c +0 -9
@@ -1506,14 +1506,6 @@ static u64 rt2400pci_get_tsf(struct ieee80211_hw *hw)return tsf; } -static void rt2400pci_reset_tsf (struct ieee80211_hw *hw) -{ -struct rt2x00_dev *rt2x00dev = hw->priv; - -rt2x00pci_register_write (rt2x00dev,CSR16 ,0 ); -rt2x00pci_register_write (rt2x00dev,CSR17 ,0 ); -} -static int rt2400pci_beacon_update (struct ieee80211_hw *hw,struct sk_buff *skb,struct ieee80211_tx_control *control) {
@@ -1582,7 +1574,6 @@ static const struct ieee80211_ops rt2400pci_mac80211_ops = { .conf_tx = rt2400pci_conf_tx, .get_tx_stats = rt2x00mac_get_tx_stats, .get_tsf = rt2400pci_get_tsf, - .reset_tsf = rt2400pci_reset_tsf, .beacon_update = rt2400pci_beacon_update, .tx_last_beacon = rt2400pci_tx_last_beacon, };
drivers/net/wireless/rt2x00/rt2500pci.c +0 -9
@@ -1817,14 +1817,6 @@ static u64 rt2500pci_get_tsf(struct ieee80211_hw *hw)return tsf; } -static void rt2500pci_reset_tsf (struct ieee80211_hw *hw) -{ -struct rt2x00_dev *rt2x00dev = hw->priv; - -rt2x00pci_register_write (rt2x00dev,CSR16 ,0 ); -rt2x00pci_register_write (rt2x00dev,CSR17 ,0 ); -} -static int rt2500pci_beacon_update (struct ieee80211_hw *hw,struct sk_buff *skb,struct ieee80211_tx_control *control) {
@@ -1893,7 +1885,6 @@ static const struct ieee80211_ops rt2500pci_mac80211_ops = { .conf_tx = rt2x00mac_conf_tx, .get_tx_stats = rt2x00mac_get_tx_stats, .get_tsf = rt2500pci_get_tsf, - .reset_tsf = rt2500pci_reset_tsf, .beacon_update = rt2500pci_beacon_update, .tx_last_beacon = rt2500pci_tx_last_beacon, };
drivers/net/wireless/rt2x00/rt61pci.c +0 -9
@@ -2362,14 +2362,6 @@ static u64 rt61pci_get_tsf(struct ieee80211_hw *hw)return tsf; } -static void rt61pci_reset_tsf (struct ieee80211_hw *hw) -{ -struct rt2x00_dev *rt2x00dev = hw->priv; - -rt2x00pci_register_write (rt2x00dev,TXRX_CSR12 ,0 ); -rt2x00pci_register_write (rt2x00dev,TXRX_CSR13 ,0 ); -} -static int rt61pci_beacon_update (struct ieee80211_hw *hw,struct sk_buff *skb,struct ieee80211_tx_control *control) {
@@ -2446,7 +2438,6 @@ static const struct ieee80211_ops rt61pci_mac80211_ops = { .conf_tx = rt2x00mac_conf_tx, .get_tx_stats = rt2x00mac_get_tx_stats, .get_tsf = rt61pci_get_tsf, - .reset_tsf = rt61pci_reset_tsf, .beacon_update = rt61pci_beacon_update, };
drivers/net/wireless/rt2x00/rt73usb.c +0 -9
@@ -1968,14 +1968,6 @@ static u64 rt73usb_get_tsf(struct ieee80211_hw *hw)#define rt73usb_get_tsf NULL#endif -static void rt73usb_reset_tsf (struct ieee80211_hw *hw) -{ -struct rt2x00_dev *rt2x00dev = hw->priv; - -rt73usb_register_write (rt2x00dev,TXRX_CSR12 ,0 ); -rt73usb_register_write (rt2x00dev,TXRX_CSR13 ,0 ); -} -static int rt73usb_beacon_update (struct ieee80211_hw *hw,struct sk_buff *skb,struct ieee80211_tx_control *control) {
@@ -2043,7 +2035,6 @@ static const struct ieee80211_ops rt73usb_mac80211_ops = { .conf_tx = rt2x00mac_conf_tx, .get_tx_stats = rt2x00mac_get_tx_stats, .get_tsf = rt73usb_get_tsf, - .reset_tsf = rt73usb_reset_tsf, .beacon_update = rt73usb_beacon_update, };
Signature · 1 line
1.5.4
PATCH 6/11 rt2x00: Rename dscape -> mac80211
In reply to Ivo van DoornThe dscape stack was renamed to mac80211 a long time ago, we are long overdue with fixing all comments to reflect this.
--- drivers/net/wireless/rt2x00/Kconfig | 2 +- drivers/net/wireless/rt2x00/rt2400pci.h | 6 +++--- drivers/net/wireless/rt2x00/rt2500pci.h | 4 ++-- drivers/net/wireless/rt2x00/rt2500usb.h | 4 ++-- drivers/net/wireless/rt2x00/rt61pci.h | 4 ++-- drivers/net/wireless/rt2x00/rt73usb.h | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-)
drivers/net/wireless/rt2x00/Kconfig +1 -1
@@ -5,7 +5,7 @@ config RT2X00 This will enable the experimental support for the Ralink drivers, developed in the rt2x00 project <http://rt2x00.serialmonkey.com>. - These drivers will make use of the Devicescape ieee80211 stack. + These drivers will make use of the mac80211 stack. When building one of the individual drivers, the rt2x00 library will also be created. That library (when the driver is built as
drivers/net/wireless/rt2x00/rt2400pci.h +3 -3
@@ -923,13 +923,13 @@#define RXD_W7_RESERVED FIELD32(0xffffffff)/* -* Macro's for converting txpower from EEPROM to dscape value -* and from dscape value to register value. +* Macro's for converting txpower from EEPROM to mac80211 value +* and from mac80211 value to register value. * NOTE: Logics in rt2400pci for txpower are reversed * compared to the other rt2x00 drivers. A higher txpower * value means that the txpower must be lowered. This is * important when converting the value coming from the -* dscape stack to the rt2400 acceptable value. +* mac80211 stack to the rt2400 acceptable value. */ #define MIN_TXPOWER 31#define MAX_TXPOWER 62
drivers/net/wireless/rt2x00/rt2500pci.h +2 -2
@@ -1213,8 +1213,8 @@#define RXD_W10_DROP FIELD32(0x00000001)/* -* Macro's for converting txpower from EEPROM to dscape value -* and from dscape value to register value. +* Macro's for converting txpower from EEPROM to mac80211 value +* and from mac80211 value to register value. */ #define MIN_TXPOWER 0#define MAX_TXPOWER 31
drivers/net/wireless/rt2x00/rt2500usb.h +2 -2
@@ -787,8 +787,8 @@#define RXD_W3_EIV FIELD32(0xffffffff)/* -* Macro's for converting txpower from EEPROM to dscape value -* and from dscape value to register value. +* Macro's for converting txpower from EEPROM to mac80211 value +* and from mac80211 value to register value. */ #define MIN_TXPOWER 0#define MAX_TXPOWER 31
drivers/net/wireless/rt2x00/rt61pci.h +2 -2
@@ -1455,8 +1455,8 @@ struct hw_pairwise_ta_entry {#define RXD_W15_RESERVED FIELD32(0xffffffff)/* -* Macro's for converting txpower from EEPROM to dscape value -* and from dscape value to register value. +* Macro's for converting txpower from EEPROM to mac80211 value +* and from mac80211 value to register value. */ #define MIN_TXPOWER 0#define MAX_TXPOWER 31
drivers/net/wireless/rt2x00/rt73usb.h +2 -2
@@ -1023,8 +1023,8 @@ struct hw_pairwise_ta_entry {#define RXD_W5_RESERVED FIELD32(0xffffffff)/* -* Macro's for converting txpower from EEPROM to dscape value -* and from dscape value to register value. +* Macro's for converting txpower from EEPROM to mac80211 value +* and from mac80211 value to register value. */ #define MIN_TXPOWER 0#define MAX_TXPOWER 31
Signature · 1 line
1.5.4
PATCH 7/11 rt2x00: Cleanup mode registration
In reply to Ivo van DoornDon't wildly pass any number for num_rates to rt2x00lib, instead pass which type of rates are supported (CCK, OFDM). Same for num_modes but then for the 2GHZ and 5GHZ band.
This makes the interface look much nicer and makes extending it later easier.
--- drivers/net/wireless/rt2x00/rt2400pci.c | 4 +- drivers/net/wireless/rt2x00/rt2500pci.c | 6 +- drivers/net/wireless/rt2x00/rt2500usb.c | 6 +- drivers/net/wireless/rt2x00/rt2x00.h | 38 +++++++++------ drivers/net/wireless/rt2x00/rt2x00dev.c | 80 +++++++++++++++--------------- drivers/net/wireless/rt2x00/rt2x00lib.h | 5 +- drivers/net/wireless/rt2x00/rt61pci.c | 6 +- drivers/net/wireless/rt2x00/rt73usb.c | 8 ++-- 8 files changed, 81 insertions(+), 72 deletions(-)
drivers/net/wireless/rt2x00/rt2400pci.c +2 -2
@@ -1348,8 +1348,8 @@ static void rt2400pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)/* * Initialize hw_mode information. */ - spec->num_modes =1 ; - spec->num_rates =4 ; + spec->supported_bands =SUPPORT_BAND_2GHZ ; + spec->supported_rates =SUPPORT_RATE_CCK ; spec->tx_power_a =NULL ; spec->tx_power_bg = txpower; spec->tx_power_default =DEFAULT_TXPOWER ;
drivers/net/wireless/rt2x00/rt2500pci.c +3 -3
@@ -1662,8 +1662,8 @@ static void rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)/* * Initialize hw_mode information. */ - spec->num_modes =2 ; - spec->num_rates =12 ; + spec->supported_bands =SUPPORT_BAND_2GHZ ; + spec->supported_rates =SUPPORT_RATE_CCK |SUPPORT_RATE_OFDM ; spec->tx_power_a =NULL ; spec->tx_power_bg = txpower; spec->tx_power_default =DEFAULT_TXPOWER ;
@@ -1684,9 +1684,9 @@ static void rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev) spec->num_channels =ARRAY_SIZE (rf_vals_bg_2525e); spec->channels = rf_vals_bg_2525e; }else if (rt2x00_rf (&rt2x00dev->chip,RF5222 )) { + spec->supported_bands |=SUPPORT_BAND_5GHZ ; spec->num_channels =ARRAY_SIZE (rf_vals_5222); spec->channels = rf_vals_5222; - spec->num_modes =3 ; } }
drivers/net/wireless/rt2x00/rt2500usb.c +3 -3
@@ -1582,8 +1582,8 @@ static void rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)/* * Initialize hw_mode information. */ - spec->num_modes =2 ; - spec->num_rates =12 ; + spec->supported_bands =SUPPORT_BAND_2GHZ ; + spec->supported_rates =SUPPORT_RATE_CCK |SUPPORT_RATE_OFDM ; spec->tx_power_a =NULL ; spec->tx_power_bg = txpower; spec->tx_power_default =DEFAULT_TXPOWER ;
@@ -1604,9 +1604,9 @@ static void rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev) spec->num_channels =ARRAY_SIZE (rf_vals_bg_2525e); spec->channels = rf_vals_bg_2525e; }else if (rt2x00_rf (&rt2x00dev->chip,RF5222 )) { + spec->supported_bands |=SUPPORT_BAND_5GHZ ; spec->num_channels =ARRAY_SIZE (rf_vals_5222); spec->channels = rf_vals_5222; - spec->num_modes =3 ; } }
drivers/net/wireless/rt2x00/rt2x00.h +23 -15
@@ -392,30 +392,38 @@ static inline struct rt2x00_intf* vif_to_intf(struct ieee80211_vif *vif)return (struct rt2x00_intf *)vif->drv_priv; } -/* +/** +* struct hw_mode_spec: Hardware specifications structure +* * Details about the supported modes, rates and channels * of a particular chipset. This is used by rt2x00lib * to build the ieee80211_hw_mode array for mac80211. +* +* @supported_bands: Bitmask contained the supported bands (2.4GHz, 5.2GHz). +* @supported_rates: Rate types which are supported (CCK, OFDM). +* @num_channels: Number of supported channels. This is used as array size +* for @tx_power_a, @tx_power_bg and @channels. +* channels: Device/chipset specific channel values (See &struct rf_channel). +* @tx_power_a: TX power values for all 5.2GHz channels (may be NULL). +* @tx_power_bg: TX power values for all 2.4GHz channels (may be NULL). +* @tx_power_default: Default TX power value to use when either +* @tx_power_a or @tx_power_bg is missing. */ struct hw_mode_spec { -/* -* Number of modes, rates and channels. -*/ -int num_modes; -int num_rates; -int num_channels; +unsigned int supported_bands; +#define SUPPORT_BAND_2GHZ 0x00000001 +#define SUPPORT_BAND_5GHZ 0x00000002 + +unsigned int supported_rates; +#define SUPPORT_RATE_CCK 0x00000001 +#define SUPPORT_RATE_OFDM 0x00000002 + +unsigned int num_channels; +const struct rf_channel *channels; -/* -* txpower values. -*/ const u8 *tx_power_a;const u8 *tx_power_bg;u8 tx_power_default; - -/* -* Device/chipset specific value. -*/ -const struct rf_channel *channels; };/*
drivers/net/wireless/rt2x00/rt2x00dev.c +40 -40
144 lines not on this page · raw message
drivers/net/wireless/rt2x00/rt2x00lib.h +3 -2
@@ -38,8 +38,9 @@*/ struct rt2x00_rate {unsigned short flags; -#define DEV_RATE_OFDM 0x0001 -#define DEV_RATE_SHORT_PREAMBLE 0x0002 +#define DEV_RATE_CCK 0x0001 +#define DEV_RATE_OFDM 0x0002 +#define DEV_RATE_SHORT_PREAMBLE 0x0004unsigned short bitrate;/* In 100kbit/s */
drivers/net/wireless/rt2x00/rt61pci.c +3 -3
@@ -2205,8 +2205,8 @@ static void rt61pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)/* * Initialize hw_mode information. */ - spec->num_modes =2 ; - spec->num_rates =12 ; + spec->supported_bands =SUPPORT_BAND_2GHZ ; + spec->supported_rates =SUPPORT_RATE_CCK |SUPPORT_RATE_OFDM ; spec->tx_power_a =NULL ; spec->tx_power_bg = txpower; spec->tx_power_default =DEFAULT_TXPOWER ;
@@ -2221,7 +2221,7 @@ static void rt61pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)if (rt2x00_rf (&rt2x00dev->chip,RF5225 ) ||rt2x00_rf (&rt2x00dev->chip,RF5325 )) { - spec->num_modes =3 ; + spec->supported_bands |=SUPPORT_BAND_5GHZ ; spec->num_channels =ARRAY_SIZE (rf_vals_seq); txpower =rt2x00_eeprom_addr (rt2x00dev,EEPROM_TXPOWER_A_START );
drivers/net/wireless/rt2x00/rt73usb.c +4 -4
@@ -1787,8 +1787,8 @@ static void rt73usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)/* * Initialize hw_mode information. */ - spec->num_modes =2 ; - spec->num_rates =12 ; + spec->supported_bands =SUPPORT_BAND_2GHZ ; + spec->supported_rates =SUPPORT_RATE_CCK |SUPPORT_RATE_OFDM ; spec->tx_power_a =NULL ; spec->tx_power_bg = txpower; spec->tx_power_default =DEFAULT_TXPOWER ;
@@ -1797,20 +1797,20 @@ static void rt73usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev) spec->num_channels =ARRAY_SIZE (rf_vals_bg_2528); spec->channels = rf_vals_bg_2528; }else if (rt2x00_rf (&rt2x00dev->chip,RF5226 )) { + spec->supported_bands |=SUPPORT_BAND_5GHZ ; spec->num_channels =ARRAY_SIZE (rf_vals_5226); spec->channels = rf_vals_5226; }else if (rt2x00_rf (&rt2x00dev->chip,RF2527 )) { spec->num_channels =14 ; spec->channels = rf_vals_5225_2527; }else if (rt2x00_rf (&rt2x00dev->chip,RF5225 )) { + spec->supported_bands |=SUPPORT_BAND_5GHZ ; spec->num_channels =ARRAY_SIZE (rf_vals_5225_2527); spec->channels = rf_vals_5225_2527; }if (rt2x00_rf (&rt2x00dev->chip,RF5225 ) ||rt2x00_rf (&rt2x00dev->chip,RF5226 )) { - spec->num_modes =3 ; - txpower =rt2x00_eeprom_addr (rt2x00dev,EEPROM_TXPOWER_A_START );for (i =0 ; i <14 ; i++) txpower[i] =TXPOWER_FROM_DEV (txpower[i]);
Signature · 1 line
1.5.4
PATCH 8/11 rt2x00: Remove async vendor request calls from rt2x00usb
In reply to Ivo van DoornThe async vendor requests are a ugly hack which is not working correctly. The proper fix for the scheduling while atomic issue is finding out why we can't use led classes for USB drivers and fix that.
Just replace all async calls with the regular ones and print an error for the disallowed LED configuration attempts. That will help in determining which led class is causing the problem.
--- drivers/net/wireless/rt2x00/rt2500usb.c | 10 +++++- drivers/net/wireless/rt2x00/rt2x00usb.c | 52 ------------------------------- drivers/net/wireless/rt2x00/rt2x00usb.h | 18 ----------- drivers/net/wireless/rt2x00/rt73usb.c | 23 +++++++++---- 4 files changed, 24 insertions(+), 79 deletions(-)
drivers/net/wireless/rt2x00/rt2500usb.c +8 -2
@@ -292,6 +292,12 @@ static void rt2500usb_led_brightness(struct led_classdev *led_cdev,unsigned int activity = led->rt2x00dev->led_flags &LED_SUPPORT_ACTIVITY ; +if (in_atomic ()) { +NOTICE (led->rt2x00dev, +"Ignoring LED brightness command for led %d" , led->type); +return ; + } +if (led->type ==LED_TYPE_RADIO || led->type ==LED_TYPE_ASSOC ) {rt2x00_set_field16 (&led->rt2x00dev->led_mcu_reg,MAC_CSR20_LINK , enabled);
@@ -299,8 +305,8 @@ static void rt2500usb_led_brightness(struct led_classdev *led_cdev, MAC_CSR20_ACTIVITY, enabled && activity); } -rt2x00usb_vendor_request_async (led->rt2x00dev,USB_SINGLE_WRITE , -MAC_CSR20 , led->rt2x00dev->led_mcu_reg); +rt2500usb_register_write (led->rt2x00dev,MAC_CSR20 , + led->rt2x00dev->led_mcu_reg); }#else #define rt2500usb_led_brightness NULL
drivers/net/wireless/rt2x00/rt2x00usb.c +0 -52
58 lines not on this page · raw message
drivers/net/wireless/rt2x00/rt2x00usb.h +0 -18
@@ -194,24 +194,6 @@ static inline int rt2x00usb_eeprom_read(struct rt2x00_dev *rt2x00dev, eeprom, lenght, timeout); } -/** -* rt2x00usb_vendor_request_async - Send register command to device (async) -* @rt2x00dev: Pointer to &struct rt2x00_dev -* @request: USB vendor command (See &enum rt2x00usb_vendor_request) -* @offset: Register offset to perform action on -* @value: Value to write to device -* -* Asynchroneous version of &rt2x00usb_vendor_request this is required -* for some routines where the driver cannot sleep because it is in -* irq context. Note that with this function the driver will not be -* notified on failure or timeout of the command. It will only be notified -* if the start of the command succeeded or not. This means it should not be -* used when the command must succeed. -*/ -int rt2x00usb_vendor_request_async (struct rt2x00_dev *rt2x00dev, -const u8 request,const u16 offset, -const u16 value); -/* * Radio handlers */
drivers/net/wireless/rt2x00/rt73usb.c +16 -7
@@ -290,29 +290,38 @@ static void rt73usb_led_brightness(struct led_classdev *led_cdev,unsigned int bg_mode = (enabled && led->rt2x00dev->curr_band ==IEEE80211_BAND_2GHZ ); +if (in_atomic ()) { +NOTICE (led->rt2x00dev, +"Ignoring LED brightness command for led %d" , led->type); +return ; + } +if (led->type ==LED_TYPE_RADIO ) {rt2x00_set_field16 (&led->rt2x00dev->led_mcu_reg,MCU_LEDCS_RADIO_STATUS , enabled); -rt2x00usb_vendor_request_async (led->rt2x00dev,USB_LED_CONTROL , -0 , led->rt2x00dev->led_mcu_reg); +rt2x00usb_vendor_request_sw (led->rt2x00dev,USB_LED_CONTROL , +0 , led->rt2x00dev->led_mcu_reg, +REGISTER_TIMEOUT ); }else if (led->type ==LED_TYPE_ASSOC ) {rt2x00_set_field16 (&led->rt2x00dev->led_mcu_reg,MCU_LEDCS_LINK_BG_STATUS , bg_mode);rt2x00_set_field16 (&led->rt2x00dev->led_mcu_reg,MCU_LEDCS_LINK_A_STATUS , a_mode); -rt2x00usb_vendor_request_async (led->rt2x00dev,USB_LED_CONTROL , -0 , led->rt2x00dev->led_mcu_reg); +rt2x00usb_vendor_request_sw (led->rt2x00dev,USB_LED_CONTROL , +0 , led->rt2x00dev->led_mcu_reg, +REGISTER_TIMEOUT ); }else if (led->type ==LED_TYPE_QUALITY ) {/* * The brightness is divided into 6 levels (0 - 5), * this means we need to convert the brightness * argument into the matching level within that range. */ -rt2x00usb_vendor_request_async (led->rt2x00dev,USB_LED_CONTROL , - brightness / (LED_FULL /6 ), - led->rt2x00dev->led_mcu_reg); +rt2x00usb_vendor_request_sw (led->rt2x00dev,USB_LED_CONTROL , + brightness / (LED_FULL /6 ), + led->rt2x00dev->led_mcu_reg, +REGISTER_TIMEOUT ); } }#else
Signature · 1 line
1.5.4
PATCH 9/11 Fix hw mode registration with mac80211.
In reply to Ivo van DoornFrom: Gertjan van Wingerde <[email protected]>
The supported_bands field of struct hw_mode_spec now represents a bitfield, so bitfield operators need to be tested with when setting the band data.
The current code generates the following warning:
[176624.986244] WARNING: at /usr/local/src/incoming/compat-wireless-2.6/net/wireless/core.c:269 wiphy_register() [176624.986249] Pid: 12548, comm: modprobe Tainted: P 2.6.24.2#4 [176624.986251] [176624.986251] Call Trace: [176624.986277] [<ffffffff881c56bf>] :cfg80211:wiphy_register+0x17f/0x1a0 [176624.986282] [<ffffffff881ddf80>] :rt61pci:rt61pci_eepromregister_write+0x0/0x80 [176624.986302] [<ffffffff88b7e4bc>] :mac80211:ieee80211_register_hw+0x2c/0x2b0 [176624.986310] [<ffffffff881cdc80>] :rt2x00lib:rt2x00lib_probe_dev+0x350/0x3f0 [176624.986318] [<ffffffff881d74b9>] :rt2x00pci:rt2x00pci_probe+0x149/0x200 [176624.986325] [<ffffffff8030c858>] pci_device_probe+0xf8/0x170 [176624.986331] [<ffffffff803594fc>] driver_probe_device+0x9c/0x1c0 [176624.986335] [<ffffffff80359700>] __driver_attach+0x0/0xb0 [176624.986337] [<ffffffff803597a5>] __driver_attach+0xa5/0xb0 [176624.986341] [<ffffffff8035877d>] bus_for_each_dev+0x4d/0x80 [176624.986347] [<ffffffff80358b8c>] bus_add_driver+0xac/0x210 [176624.986351] [<ffffffff8030cad3>] __pci_register_driver+0x73/0xc0 [176624.986357] [<ffffffff8025689e>] sys_init_module+0x18e/0x1a20 [176624.986374] [<ffffffff8020c42e>] system_call+0x7e/0x83
--- drivers/net/wireless/rt2x00/rt2x00dev.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/rt2x00/rt2x00dev.c +2 -2
@@ -916,7 +916,7 @@ static int rt2x00lib_probe_hw_modes(struct rt2x00_dev *rt2x00dev,* Rates: CCK, OFDM. * Channels: 2.4 GHz */ -if (spec->supported_bands >SUPPORT_BAND_2GHZ ) { +if (spec->supported_bands &SUPPORT_BAND_2GHZ ) { rt2x00dev->bands[IEEE80211_BAND_2GHZ ].n_channels =14 ; rt2x00dev->bands[IEEE80211_BAND_2GHZ ].n_bitrates = num_rates; rt2x00dev->bands[IEEE80211_BAND_2GHZ ].channels = channels;
@@ -930,7 +930,7 @@ static int rt2x00lib_probe_hw_modes(struct rt2x00_dev *rt2x00dev,* Rates: OFDM. * Channels: OFDM, UNII, HiperLAN2. */ -if (spec->supported_bands >SUPPORT_BAND_5GHZ ) { +if (spec->supported_bands &SUPPORT_BAND_5GHZ ) { rt2x00dev->bands[IEEE80211_BAND_5GHZ ].n_channels = spec->num_channels -14 ; rt2x00dev->bands[IEEE80211_BAND_5GHZ].n_bitrates =
Signature · 1 line
1.5.4
PATCH 10/11 rt2x00: Fix MAC address defines in rt61pci
In reply to Ivo van DoornThe MAC address offset defines were incorrect because the byte offset was used instead of word index. This bug had no affect on normal operations since these defines weren't used. (EEPROM_MAC_ADDR_0 was used to read 6 bytes from).
--- drivers/net/wireless/rt2x00/rt61pci.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/rt2x00/rt61pci.h +2 -2
@@ -1130,10 +1130,10 @@ struct hw_pairwise_ta_entry {#define EEPROM_MAC_ADDR_0 0x0002#define EEPROM_MAC_ADDR_BYTE0 FIELD16(0x00ff)#define EEPROM_MAC_ADDR_BYTE1 FIELD16(0xff00) -#define EEPROM_MAC_ADDR1 0x0004 +#define EEPROM_MAC_ADDR1 0x0003#define EEPROM_MAC_ADDR_BYTE2 FIELD16(0x00ff)#define EEPROM_MAC_ADDR_BYTE3 FIELD16(0xff00) -#define EEPROM_MAC_ADDR_2 0x0006 +#define EEPROM_MAC_ADDR_2 0x0004#define EEPROM_MAC_ADDR_BYTE4 FIELD16(0x00ff)#define EEPROM_MAC_ADDR_BYTE5 FIELD16(0xff00)
Signature · 1 line
1.5.4
PATCH 11/11 rt2x00: Release rt2x00 2.1.2
In reply to Ivo van Doorn--- drivers/net/wireless/rt2x00/rt2x00.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/net/wireless/rt2x00/rt2x00.h +1 -1
@@ -44,7 +44,7 @@/* * Module information. */ -#define DRV_VERSION "2.1.1" +#define DRV_VERSION "2.1.2"#define DRV_PROJECT "http://rt2x00.serialmonkey.com"/*
Signature · 1 line
1.5.4