mirror of https://gitee.com/openkylin/linux.git
rt2x00: move extra_tx_headroom field from rt2x00_ops to rt2x00_dev
The extra_tx_headroom field of struct rt2x00_ops indicates the extra TX headroom size required for a given device. This data is redundant, the value can be computed from the desc_size and winfo_size fields of the TX queues. Move the extra_tx_headroom field to struct rt2x00_dev, compute its value in the probe routine and use the cached value in the rest of the code. Signed-off-by: Gabor Juhos <juhosg@openwrt.org> Acked-by: Stanislaw Gruszka <sgruszka@redhat.com> Acked-by: Gertjan van Wingerde <gwingerde@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
d619c62f16
commit
5616a6efb2
|
@ -1813,7 +1813,6 @@ static const struct rt2x00_ops rt2400pci_ops = {
|
||||||
.eeprom_size = EEPROM_SIZE,
|
.eeprom_size = EEPROM_SIZE,
|
||||||
.rf_size = RF_SIZE,
|
.rf_size = RF_SIZE,
|
||||||
.tx_queues = NUM_TX_QUEUES,
|
.tx_queues = NUM_TX_QUEUES,
|
||||||
.extra_tx_headroom = 0,
|
|
||||||
.queue_init = rt2400pci_queue_init,
|
.queue_init = rt2400pci_queue_init,
|
||||||
.lib = &rt2400pci_rt2x00_ops,
|
.lib = &rt2400pci_rt2x00_ops,
|
||||||
.hw = &rt2400pci_mac80211_ops,
|
.hw = &rt2400pci_mac80211_ops,
|
||||||
|
|
|
@ -2102,7 +2102,6 @@ static const struct rt2x00_ops rt2500pci_ops = {
|
||||||
.eeprom_size = EEPROM_SIZE,
|
.eeprom_size = EEPROM_SIZE,
|
||||||
.rf_size = RF_SIZE,
|
.rf_size = RF_SIZE,
|
||||||
.tx_queues = NUM_TX_QUEUES,
|
.tx_queues = NUM_TX_QUEUES,
|
||||||
.extra_tx_headroom = 0,
|
|
||||||
.queue_init = rt2500pci_queue_init,
|
.queue_init = rt2500pci_queue_init,
|
||||||
.lib = &rt2500pci_rt2x00_ops,
|
.lib = &rt2500pci_rt2x00_ops,
|
||||||
.hw = &rt2500pci_mac80211_ops,
|
.hw = &rt2500pci_mac80211_ops,
|
||||||
|
|
|
@ -1913,7 +1913,6 @@ static const struct rt2x00_ops rt2500usb_ops = {
|
||||||
.eeprom_size = EEPROM_SIZE,
|
.eeprom_size = EEPROM_SIZE,
|
||||||
.rf_size = RF_SIZE,
|
.rf_size = RF_SIZE,
|
||||||
.tx_queues = NUM_TX_QUEUES,
|
.tx_queues = NUM_TX_QUEUES,
|
||||||
.extra_tx_headroom = TXD_DESC_SIZE,
|
|
||||||
.queue_init = rt2500usb_queue_init,
|
.queue_init = rt2500usb_queue_init,
|
||||||
.lib = &rt2500usb_rt2x00_ops,
|
.lib = &rt2500usb_rt2x00_ops,
|
||||||
.hw = &rt2500usb_mac80211_ops,
|
.hw = &rt2500usb_mac80211_ops,
|
||||||
|
|
|
@ -1231,7 +1231,6 @@ static const struct rt2x00_ops rt2800pci_ops = {
|
||||||
.eeprom_size = EEPROM_SIZE,
|
.eeprom_size = EEPROM_SIZE,
|
||||||
.rf_size = RF_SIZE,
|
.rf_size = RF_SIZE,
|
||||||
.tx_queues = NUM_TX_QUEUES,
|
.tx_queues = NUM_TX_QUEUES,
|
||||||
.extra_tx_headroom = TXWI_DESC_SIZE,
|
|
||||||
.queue_init = rt2800pci_queue_init,
|
.queue_init = rt2800pci_queue_init,
|
||||||
.lib = &rt2800pci_rt2x00_ops,
|
.lib = &rt2800pci_rt2x00_ops,
|
||||||
.drv = &rt2800pci_rt2800_ops,
|
.drv = &rt2800pci_rt2800_ops,
|
||||||
|
|
|
@ -905,7 +905,6 @@ static const struct rt2x00_ops rt2800usb_ops = {
|
||||||
.eeprom_size = EEPROM_SIZE,
|
.eeprom_size = EEPROM_SIZE,
|
||||||
.rf_size = RF_SIZE,
|
.rf_size = RF_SIZE,
|
||||||
.tx_queues = NUM_TX_QUEUES,
|
.tx_queues = NUM_TX_QUEUES,
|
||||||
.extra_tx_headroom = TXINFO_DESC_SIZE + TXWI_DESC_SIZE,
|
|
||||||
.queue_init = rt2800usb_queue_init,
|
.queue_init = rt2800usb_queue_init,
|
||||||
.lib = &rt2800usb_rt2x00_ops,
|
.lib = &rt2800usb_rt2x00_ops,
|
||||||
.drv = &rt2800usb_rt2800_ops,
|
.drv = &rt2800usb_rt2800_ops,
|
||||||
|
@ -922,7 +921,6 @@ static const struct rt2x00_ops rt2800usb_ops_5592 = {
|
||||||
.eeprom_size = EEPROM_SIZE,
|
.eeprom_size = EEPROM_SIZE,
|
||||||
.rf_size = RF_SIZE,
|
.rf_size = RF_SIZE,
|
||||||
.tx_queues = NUM_TX_QUEUES,
|
.tx_queues = NUM_TX_QUEUES,
|
||||||
.extra_tx_headroom = TXINFO_DESC_SIZE + TXWI_DESC_SIZE_5592,
|
|
||||||
.queue_init = rt2800usb_queue_init,
|
.queue_init = rt2800usb_queue_init,
|
||||||
.lib = &rt2800usb_rt2x00_ops,
|
.lib = &rt2800usb_rt2x00_ops,
|
||||||
.drv = &rt2800usb_rt2800_ops,
|
.drv = &rt2800usb_rt2800_ops,
|
||||||
|
|
|
@ -648,7 +648,6 @@ struct rt2x00_ops {
|
||||||
const unsigned int eeprom_size;
|
const unsigned int eeprom_size;
|
||||||
const unsigned int rf_size;
|
const unsigned int rf_size;
|
||||||
const unsigned int tx_queues;
|
const unsigned int tx_queues;
|
||||||
const unsigned int extra_tx_headroom;
|
|
||||||
void (*queue_init)(struct data_queue *queue);
|
void (*queue_init)(struct data_queue *queue);
|
||||||
const struct rt2x00lib_ops *lib;
|
const struct rt2x00lib_ops *lib;
|
||||||
const void *drv;
|
const void *drv;
|
||||||
|
@ -1007,6 +1006,9 @@ struct rt2x00_dev {
|
||||||
*/
|
*/
|
||||||
struct list_head bar_list;
|
struct list_head bar_list;
|
||||||
spinlock_t bar_list_lock;
|
spinlock_t bar_list_lock;
|
||||||
|
|
||||||
|
/* Extra TX headroom required for alignment purposes. */
|
||||||
|
unsigned int extra_tx_headroom;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rt2x00_bar_list_entry {
|
struct rt2x00_bar_list_entry {
|
||||||
|
|
|
@ -334,7 +334,7 @@ void rt2x00lib_txdone(struct queue_entry *entry,
|
||||||
/*
|
/*
|
||||||
* Remove the extra tx headroom from the skb.
|
* Remove the extra tx headroom from the skb.
|
||||||
*/
|
*/
|
||||||
skb_pull(entry->skb, rt2x00dev->ops->extra_tx_headroom);
|
skb_pull(entry->skb, rt2x00dev->extra_tx_headroom);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Signal that the TX descriptor is no longer in the skb.
|
* Signal that the TX descriptor is no longer in the skb.
|
||||||
|
@ -1049,7 +1049,7 @@ static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)
|
||||||
*/
|
*/
|
||||||
rt2x00dev->hw->extra_tx_headroom =
|
rt2x00dev->hw->extra_tx_headroom =
|
||||||
max_t(unsigned int, IEEE80211_TX_STATUS_HEADROOM,
|
max_t(unsigned int, IEEE80211_TX_STATUS_HEADROOM,
|
||||||
rt2x00dev->ops->extra_tx_headroom);
|
rt2x00dev->extra_tx_headroom);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Take TX headroom required for alignment into account.
|
* Take TX headroom required for alignment into account.
|
||||||
|
@ -1256,6 +1256,17 @@ static inline void rt2x00lib_set_if_combinations(struct rt2x00_dev *rt2x00dev)
|
||||||
rt2x00dev->hw->wiphy->n_iface_combinations = 1;
|
rt2x00dev->hw->wiphy->n_iface_combinations = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned int rt2x00dev_extra_tx_headroom(struct rt2x00_dev *rt2x00dev)
|
||||||
|
{
|
||||||
|
if (WARN_ON(!rt2x00dev->tx))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (rt2x00_is_usb(rt2x00dev))
|
||||||
|
return rt2x00dev->tx[0].winfo_size + rt2x00dev->tx[0].desc_size;
|
||||||
|
|
||||||
|
return rt2x00dev->tx[0].winfo_size;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* driver allocation handlers.
|
* driver allocation handlers.
|
||||||
*/
|
*/
|
||||||
|
@ -1330,6 +1341,9 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
|
||||||
if (retval)
|
if (retval)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
|
/* Cache TX headroom value */
|
||||||
|
rt2x00dev->extra_tx_headroom = rt2x00dev_extra_tx_headroom(rt2x00dev);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Determine which operating modes are supported, all modes
|
* Determine which operating modes are supported, all modes
|
||||||
* which require beaconing, depend on the availability of
|
* which require beaconing, depend on the availability of
|
||||||
|
|
|
@ -542,8 +542,8 @@ static int rt2x00queue_write_tx_data(struct queue_entry *entry,
|
||||||
/*
|
/*
|
||||||
* Add the requested extra tx headroom in front of the skb.
|
* Add the requested extra tx headroom in front of the skb.
|
||||||
*/
|
*/
|
||||||
skb_push(entry->skb, rt2x00dev->ops->extra_tx_headroom);
|
skb_push(entry->skb, rt2x00dev->extra_tx_headroom);
|
||||||
memset(entry->skb->data, 0, rt2x00dev->ops->extra_tx_headroom);
|
memset(entry->skb->data, 0, rt2x00dev->extra_tx_headroom);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Call the driver's write_tx_data function, if it exists.
|
* Call the driver's write_tx_data function, if it exists.
|
||||||
|
@ -596,7 +596,7 @@ static void rt2x00queue_bar_check(struct queue_entry *entry)
|
||||||
{
|
{
|
||||||
struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
|
struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
|
||||||
struct ieee80211_bar *bar = (void *) (entry->skb->data +
|
struct ieee80211_bar *bar = (void *) (entry->skb->data +
|
||||||
rt2x00dev->ops->extra_tx_headroom);
|
rt2x00dev->extra_tx_headroom);
|
||||||
struct rt2x00_bar_list_entry *bar_entry;
|
struct rt2x00_bar_list_entry *bar_entry;
|
||||||
|
|
||||||
if (likely(!ieee80211_is_back_req(bar->frame_control)))
|
if (likely(!ieee80211_is_back_req(bar->frame_control)))
|
||||||
|
|
|
@ -3066,7 +3066,6 @@ static const struct rt2x00_ops rt61pci_ops = {
|
||||||
.eeprom_size = EEPROM_SIZE,
|
.eeprom_size = EEPROM_SIZE,
|
||||||
.rf_size = RF_SIZE,
|
.rf_size = RF_SIZE,
|
||||||
.tx_queues = NUM_TX_QUEUES,
|
.tx_queues = NUM_TX_QUEUES,
|
||||||
.extra_tx_headroom = 0,
|
|
||||||
.queue_init = rt61pci_queue_init,
|
.queue_init = rt61pci_queue_init,
|
||||||
.lib = &rt61pci_rt2x00_ops,
|
.lib = &rt61pci_rt2x00_ops,
|
||||||
.hw = &rt61pci_mac80211_ops,
|
.hw = &rt61pci_mac80211_ops,
|
||||||
|
|
|
@ -2400,7 +2400,6 @@ static const struct rt2x00_ops rt73usb_ops = {
|
||||||
.eeprom_size = EEPROM_SIZE,
|
.eeprom_size = EEPROM_SIZE,
|
||||||
.rf_size = RF_SIZE,
|
.rf_size = RF_SIZE,
|
||||||
.tx_queues = NUM_TX_QUEUES,
|
.tx_queues = NUM_TX_QUEUES,
|
||||||
.extra_tx_headroom = TXD_DESC_SIZE,
|
|
||||||
.queue_init = rt73usb_queue_init,
|
.queue_init = rt73usb_queue_init,
|
||||||
.lib = &rt73usb_rt2x00_ops,
|
.lib = &rt73usb_rt2x00_ops,
|
||||||
.hw = &rt73usb_mac80211_ops,
|
.hw = &rt73usb_mac80211_ops,
|
||||||
|
|
Loading…
Reference in New Issue