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:
parent
3392beced3
commit
0c5879bc62
4 changed files with 26 additions and 18 deletions
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue