rt2x00: Request TXWI pointer from driver

The only reason why the write_tx_data callback function
is needed inside the driver, is because the location of
the TXWI descriptor is different on PCI and USB hardware.
Except for the beacon, where the TXWI is always at the
start of the SKB buffer.

In both cases the drivers write_tx_data function only
wrap around the function rt2800_write_txwi. Move write_tx_data
completely into the rt2800lib library, and add a callback
function to obtain the TXWI pointer.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Acked-by: Helmut Schaa <helmut.schaa@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Ivo van Doorn 2010-08-06 20:47:20 +02:00 committed by John W. Linville
parent 3392beced3
commit 0c5879bc62
4 changed files with 26 additions and 18 deletions

View file

@ -427,8 +427,10 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
} }
EXPORT_SYMBOL_GPL(rt2800_load_firmware); EXPORT_SYMBOL_GPL(rt2800_load_firmware);
void rt2800_write_txwi(__le32 *txwi, struct txentry_desc *txdesc) void rt2800_write_tx_data(struct queue_entry *entry,
struct txentry_desc *txdesc)
{ {
__le32 *txwi = rt2800_drv_get_txwi(entry);
u32 word; u32 word;
/* /*
@ -479,7 +481,7 @@ void rt2800_write_txwi(__le32 *txwi, struct txentry_desc *txdesc)
_rt2x00_desc_write(txwi, 2, 0 /* skbdesc->iv[0] */); _rt2x00_desc_write(txwi, 2, 0 /* skbdesc->iv[0] */);
_rt2x00_desc_write(txwi, 3, 0 /* skbdesc->iv[1] */); _rt2x00_desc_write(txwi, 3, 0 /* skbdesc->iv[1] */);
} }
EXPORT_SYMBOL_GPL(rt2800_write_txwi); EXPORT_SYMBOL_GPL(rt2800_write_tx_data);
static int rt2800_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxwi_w2) static int rt2800_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxwi_w2)
{ {
@ -601,7 +603,7 @@ void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc)
/* /*
* Add the TXWI for the beacon to the skb. * Add the TXWI for the beacon to the skb.
*/ */
rt2800_write_txwi((__le32 *)entry->skb->data, txdesc); rt2800_write_tx_data(entry, txdesc);
/* /*
* Dump beacon to userspace through debugfs. * Dump beacon to userspace through debugfs.

View file

@ -44,6 +44,7 @@ struct rt2800_ops {
int (*drv_write_firmware)(struct rt2x00_dev *rt2x00dev, int (*drv_write_firmware)(struct rt2x00_dev *rt2x00dev,
const u8 *data, const size_t len); const u8 *data, const size_t len);
int (*drv_init_registers)(struct rt2x00_dev *rt2x00dev); int (*drv_init_registers)(struct rt2x00_dev *rt2x00dev);
__le32 *(*drv_get_txwi)(struct queue_entry *entry);
}; };
static inline void rt2800_register_read(struct rt2x00_dev *rt2x00dev, static inline void rt2800_register_read(struct rt2x00_dev *rt2x00dev,
@ -126,6 +127,13 @@ static inline int rt2800_drv_init_registers(struct rt2x00_dev *rt2x00dev)
return rt2800ops->drv_init_registers(rt2x00dev); return rt2800ops->drv_init_registers(rt2x00dev);
} }
static inline __le32 *rt2800_drv_get_txwi(struct queue_entry *entry)
{
const struct rt2800_ops *rt2800ops = entry->queue->rt2x00dev->ops->drv;
return rt2800ops->drv_get_txwi(entry);
}
void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev, void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev,
const u8 command, const u8 token, const u8 command, const u8 token,
const u8 arg0, const u8 arg1); const u8 arg0, const u8 arg1);
@ -135,7 +143,8 @@ int rt2800_check_firmware(struct rt2x00_dev *rt2x00dev,
int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev, int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
const u8 *data, const size_t len); const u8 *data, const size_t len);
void rt2800_write_txwi(__le32 *txwi, struct txentry_desc *txdesc); void rt2800_write_tx_data(struct queue_entry *entry,
struct txentry_desc *txdesc);
void rt2800_process_rxwi(struct queue_entry *entry, struct rxdone_entry_desc *txdesc); void rt2800_process_rxwi(struct queue_entry *entry, struct rxdone_entry_desc *txdesc);
void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc); void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc);

View file

@ -566,15 +566,11 @@ static int rt2800pci_set_device_state(struct rt2x00_dev *rt2x00dev,
/* /*
* TX descriptor initialization * TX descriptor initialization
*/ */
static void rt2800pci_write_tx_data(struct queue_entry* entry, static __le32 *rt2800pci_get_txwi(struct queue_entry *entry)
struct txentry_desc *txdesc)
{ {
__le32 *txwi = (__le32 *) entry->skb->data; return (__le32 *) entry->skb->data;
rt2800_write_txwi(txwi, txdesc);
} }
static void rt2800pci_write_tx_desc(struct rt2x00_dev *rt2x00dev, static void rt2800pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
struct sk_buff *skb, struct sk_buff *skb,
struct txentry_desc *txdesc) struct txentry_desc *txdesc)
@ -1011,6 +1007,7 @@ static const struct rt2800_ops rt2800pci_rt2800_ops = {
.regbusy_read = rt2x00pci_regbusy_read, .regbusy_read = rt2x00pci_regbusy_read,
.drv_write_firmware = rt2800pci_write_firmware, .drv_write_firmware = rt2800pci_write_firmware,
.drv_init_registers = rt2800pci_init_registers, .drv_init_registers = rt2800pci_init_registers,
.drv_get_txwi = rt2800pci_get_txwi,
}; };
static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = { static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = {
@ -1030,7 +1027,7 @@ static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = {
.reset_tuner = rt2800_reset_tuner, .reset_tuner = rt2800_reset_tuner,
.link_tuner = rt2800_link_tuner, .link_tuner = rt2800_link_tuner,
.write_tx_desc = rt2800pci_write_tx_desc, .write_tx_desc = rt2800pci_write_tx_desc,
.write_tx_data = rt2800pci_write_tx_data, .write_tx_data = rt2800_write_tx_data,
.write_beacon = rt2800_write_beacon, .write_beacon = rt2800_write_beacon,
.kick_tx_queue = rt2800pci_kick_tx_queue, .kick_tx_queue = rt2800pci_kick_tx_queue,
.kill_tx_queue = rt2800pci_kill_tx_queue, .kill_tx_queue = rt2800pci_kill_tx_queue,

View file

@ -320,15 +320,14 @@ static int rt2800usb_set_device_state(struct rt2x00_dev *rt2x00dev,
/* /*
* TX descriptor initialization * TX descriptor initialization
*/ */
static void rt2800usb_write_tx_data(struct queue_entry* entry, static __le32 *rt2800usb_get_txwi(struct queue_entry *entry)
struct txentry_desc *txdesc)
{ {
__le32 *txwi = (__le32 *) (entry->skb->data + TXINFO_DESC_SIZE); if (entry->queue->qid == QID_BEACON)
return (__le32 *) (entry->skb->data);
rt2800_write_txwi(txwi, txdesc); else
return (__le32 *) (entry->skb->data + TXINFO_DESC_SIZE);
} }
static void rt2800usb_write_tx_desc(struct rt2x00_dev *rt2x00dev, static void rt2800usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
struct sk_buff *skb, struct sk_buff *skb,
struct txentry_desc *txdesc) struct txentry_desc *txdesc)
@ -549,6 +548,7 @@ static const struct rt2800_ops rt2800usb_rt2800_ops = {
.regbusy_read = rt2x00usb_regbusy_read, .regbusy_read = rt2x00usb_regbusy_read,
.drv_write_firmware = rt2800usb_write_firmware, .drv_write_firmware = rt2800usb_write_firmware,
.drv_init_registers = rt2800usb_init_registers, .drv_init_registers = rt2800usb_init_registers,
.drv_get_txwi = rt2800usb_get_txwi,
}; };
static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = { static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = {
@ -566,7 +566,7 @@ static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = {
.link_tuner = rt2800_link_tuner, .link_tuner = rt2800_link_tuner,
.watchdog = rt2x00usb_watchdog, .watchdog = rt2x00usb_watchdog,
.write_tx_desc = rt2800usb_write_tx_desc, .write_tx_desc = rt2800usb_write_tx_desc,
.write_tx_data = rt2800usb_write_tx_data, .write_tx_data = rt2800_write_tx_data,
.write_beacon = rt2800_write_beacon, .write_beacon = rt2800_write_beacon,
.get_tx_data_len = rt2800usb_get_tx_data_len, .get_tx_data_len = rt2800usb_get_tx_data_len,
.kick_tx_queue = rt2x00usb_kick_tx_queue, .kick_tx_queue = rt2x00usb_kick_tx_queue,