Commit 7bb5d6ce authored by Arik Nemtsov's avatar Arik Nemtsov Committed by Luciano Coelho

wl12xx: Revert "wl12xx: schedule TX packets according to FW occupancy"

This does not make sense in fw >= 6/7.3.0.0.75 (wl127x/wl128x) -
we don't use Tx blocks to measure FW occupancy anymore.

This reverts commit 9e374a37.
Signed-off-by: default avatarArik Nemtsov <arik@wizery.com>
Signed-off-by: default avatarEliad Peller <eliad@wizery.com>
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
parent 6f07b72a
...@@ -339,10 +339,7 @@ static ssize_t driver_state_read(struct file *file, char __user *user_buf, ...@@ -339,10 +339,7 @@ static ssize_t driver_state_read(struct file *file, char __user *user_buf,
#define DRIVER_STATE_PRINT_HEX(x) DRIVER_STATE_PRINT(x, "0x%x") #define DRIVER_STATE_PRINT_HEX(x) DRIVER_STATE_PRINT(x, "0x%x")
DRIVER_STATE_PRINT_INT(tx_blocks_available); DRIVER_STATE_PRINT_INT(tx_blocks_available);
DRIVER_STATE_PRINT_INT(tx_allocated_blocks[0]); DRIVER_STATE_PRINT_INT(tx_allocated_blocks);
DRIVER_STATE_PRINT_INT(tx_allocated_blocks[1]);
DRIVER_STATE_PRINT_INT(tx_allocated_blocks[2]);
DRIVER_STATE_PRINT_INT(tx_allocated_blocks[3]);
DRIVER_STATE_PRINT_INT(tx_frames_cnt); DRIVER_STATE_PRINT_INT(tx_frames_cnt);
DRIVER_STATE_PRINT_LHEX(tx_frames_map[0]); DRIVER_STATE_PRINT_LHEX(tx_frames_map[0]);
DRIVER_STATE_PRINT_INT(tx_queue_count[0]); DRIVER_STATE_PRINT_INT(tx_queue_count[0]);
......
...@@ -824,24 +824,13 @@ static void wl1271_irq_update_links_status(struct wl1271 *wl, ...@@ -824,24 +824,13 @@ static void wl1271_irq_update_links_status(struct wl1271 *wl,
} }
} }
static u32 wl1271_tx_allocated_blocks(struct wl1271 *wl)
{
int i;
u32 total_alloc_blocks = 0;
for (i = 0; i < NUM_TX_QUEUES; i++)
total_alloc_blocks += wl->tx_allocated_blocks[i];
return total_alloc_blocks;
}
static void wl1271_fw_status(struct wl1271 *wl, static void wl1271_fw_status(struct wl1271 *wl,
struct wl1271_fw_full_status *full_status) struct wl1271_fw_full_status *full_status)
{ {
struct wl1271_fw_common_status *status = &full_status->common; struct wl1271_fw_common_status *status = &full_status->common;
struct timespec ts; struct timespec ts;
u32 old_tx_blk_count = wl->tx_blocks_available; u32 old_tx_blk_count = wl->tx_blocks_available;
u32 freed_blocks = 0, ac_freed_blocks; u32 freed_blocks = 0;
int i; int i;
if (wl->bss_type == BSS_TYPE_AP_BSS) { if (wl->bss_type == BSS_TYPE_AP_BSS) {
...@@ -861,23 +850,21 @@ static void wl1271_fw_status(struct wl1271 *wl, ...@@ -861,23 +850,21 @@ static void wl1271_fw_status(struct wl1271 *wl,
/* update number of available TX blocks */ /* update number of available TX blocks */
for (i = 0; i < NUM_TX_QUEUES; i++) { for (i = 0; i < NUM_TX_QUEUES; i++) {
ac_freed_blocks = le32_to_cpu(status->tx_released_blks[i]) - freed_blocks += le32_to_cpu(status->tx_released_blks[i]) -
wl->tx_blocks_freed[i]; wl->tx_blocks_freed[i];
freed_blocks += ac_freed_blocks;
wl->tx_allocated_blocks[i] -= ac_freed_blocks;
wl->tx_blocks_freed[i] = wl->tx_blocks_freed[i] =
le32_to_cpu(status->tx_released_blks[i]); le32_to_cpu(status->tx_released_blks[i]);
} }
wl->tx_allocated_blocks -= freed_blocks;
if (wl->bss_type == BSS_TYPE_AP_BSS) { if (wl->bss_type == BSS_TYPE_AP_BSS) {
/* Update num of allocated TX blocks per link and ps status */ /* Update num of allocated TX blocks per link and ps status */
wl1271_irq_update_links_status(wl, &full_status->ap); wl1271_irq_update_links_status(wl, &full_status->ap);
wl->tx_blocks_available += freed_blocks; wl->tx_blocks_available += freed_blocks;
} else { } else {
int avail = full_status->sta.tx_total - int avail = full_status->sta.tx_total - wl->tx_allocated_blocks;
wl1271_tx_allocated_blocks(wl);
/* /*
* The FW might change the total number of TX memblocks before * The FW might change the total number of TX memblocks before
...@@ -2013,6 +2000,7 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl, ...@@ -2013,6 +2000,7 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl,
wl->psm_entry_retry = 0; wl->psm_entry_retry = 0;
wl->power_level = WL1271_DEFAULT_POWER_LEVEL; wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
wl->tx_blocks_available = 0; wl->tx_blocks_available = 0;
wl->tx_allocated_blocks = 0;
wl->tx_results_count = 0; wl->tx_results_count = 0;
wl->tx_packets_count = 0; wl->tx_packets_count = 0;
wl->time_offset = 0; wl->time_offset = 0;
...@@ -2033,10 +2021,8 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl, ...@@ -2033,10 +2021,8 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl,
*/ */
wl->flags = 0; wl->flags = 0;
for (i = 0; i < NUM_TX_QUEUES; i++) { for (i = 0; i < NUM_TX_QUEUES; i++)
wl->tx_blocks_freed[i] = 0; wl->tx_blocks_freed[i] = 0;
wl->tx_allocated_blocks[i] = 0;
}
wl1271_debugfs_reset(wl); wl1271_debugfs_reset(wl);
......
...@@ -168,7 +168,7 @@ static int wl1271_tx_allocate(struct wl1271 *wl, struct sk_buff *skb, u32 extra, ...@@ -168,7 +168,7 @@ static int wl1271_tx_allocate(struct wl1271 *wl, struct sk_buff *skb, u32 extra,
u32 total_len = skb->len + sizeof(struct wl1271_tx_hw_descr) + extra; u32 total_len = skb->len + sizeof(struct wl1271_tx_hw_descr) + extra;
u32 len; u32 len;
u32 total_blocks; u32 total_blocks;
int id, ret = -EBUSY, ac; int id, ret = -EBUSY;
u32 spare_blocks; u32 spare_blocks;
if (unlikely(wl->quirks & WL12XX_QUIRK_USE_2_SPARE_BLOCKS)) if (unlikely(wl->quirks & WL12XX_QUIRK_USE_2_SPARE_BLOCKS))
...@@ -206,9 +206,7 @@ static int wl1271_tx_allocate(struct wl1271 *wl, struct sk_buff *skb, u32 extra, ...@@ -206,9 +206,7 @@ static int wl1271_tx_allocate(struct wl1271 *wl, struct sk_buff *skb, u32 extra,
desc->id = id; desc->id = id;
wl->tx_blocks_available -= total_blocks; wl->tx_blocks_available -= total_blocks;
wl->tx_allocated_blocks += total_blocks;
ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
wl->tx_allocated_blocks[ac] += total_blocks;
if (wl->bss_type == BSS_TYPE_AP_BSS) if (wl->bss_type == BSS_TYPE_AP_BSS)
wl->links[hlid].allocated_blks += total_blocks; wl->links[hlid].allocated_blks += total_blocks;
...@@ -459,41 +457,21 @@ void wl1271_handle_tx_low_watermark(struct wl1271 *wl) ...@@ -459,41 +457,21 @@ void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
} }
} }
static struct sk_buff_head *wl1271_select_queue(struct wl1271 *wl,
struct sk_buff_head *queues)
{
int i, q = -1;
u32 min_blks = 0xffffffff;
/*
* Find a non-empty ac where:
* 1. There are packets to transmit
* 2. The FW has the least allocated blocks
*/
for (i = 0; i < NUM_TX_QUEUES; i++)
if (!skb_queue_empty(&queues[i]) &&
(wl->tx_allocated_blocks[i] < min_blks)) {
q = i;
min_blks = wl->tx_allocated_blocks[q];
}
if (q == -1)
return NULL;
return &queues[q];
}
static struct sk_buff *wl1271_sta_skb_dequeue(struct wl1271 *wl) static struct sk_buff *wl1271_sta_skb_dequeue(struct wl1271 *wl)
{ {
struct sk_buff *skb = NULL; struct sk_buff *skb = NULL;
unsigned long flags; unsigned long flags;
struct sk_buff_head *queue;
queue = wl1271_select_queue(wl, wl->tx_queue); skb = skb_dequeue(&wl->tx_queue[CONF_TX_AC_VO]);
if (!queue) if (skb)
goto out; goto out;
skb = skb_dequeue(&wl->tx_queue[CONF_TX_AC_VI]);
skb = skb_dequeue(queue); if (skb)
goto out;
skb = skb_dequeue(&wl->tx_queue[CONF_TX_AC_BE]);
if (skb)
goto out;
skb = skb_dequeue(&wl->tx_queue[CONF_TX_AC_BK]);
out: out:
if (skb) { if (skb) {
...@@ -511,7 +489,6 @@ static struct sk_buff *wl1271_ap_skb_dequeue(struct wl1271 *wl) ...@@ -511,7 +489,6 @@ static struct sk_buff *wl1271_ap_skb_dequeue(struct wl1271 *wl)
struct sk_buff *skb = NULL; struct sk_buff *skb = NULL;
unsigned long flags; unsigned long flags;
int i, h, start_hlid; int i, h, start_hlid;
struct sk_buff_head *queue;
/* start from the link after the last one */ /* start from the link after the last one */
start_hlid = (wl->last_tx_hlid + 1) % AP_MAX_LINKS; start_hlid = (wl->last_tx_hlid + 1) % AP_MAX_LINKS;
...@@ -520,20 +497,21 @@ static struct sk_buff *wl1271_ap_skb_dequeue(struct wl1271 *wl) ...@@ -520,20 +497,21 @@ static struct sk_buff *wl1271_ap_skb_dequeue(struct wl1271 *wl)
for (i = 0; i < AP_MAX_LINKS; i++) { for (i = 0; i < AP_MAX_LINKS; i++) {
h = (start_hlid + i) % AP_MAX_LINKS; h = (start_hlid + i) % AP_MAX_LINKS;
/* only consider connected stations */ skb = skb_dequeue(&wl->links[h].tx_queue[CONF_TX_AC_VO]);
if (h >= WL1271_AP_STA_HLID_START &&
!test_bit(h - WL1271_AP_STA_HLID_START, wl->ap_hlid_map))
continue;
queue = wl1271_select_queue(wl, wl->links[h].tx_queue);
if (!queue)
continue;
skb = skb_dequeue(queue);
if (skb) if (skb)
break; goto out;
skb = skb_dequeue(&wl->links[h].tx_queue[CONF_TX_AC_VI]);
if (skb)
goto out;
skb = skb_dequeue(&wl->links[h].tx_queue[CONF_TX_AC_BE]);
if (skb)
goto out;
skb = skb_dequeue(&wl->links[h].tx_queue[CONF_TX_AC_BK]);
if (skb)
goto out;
} }
out:
if (skb) { if (skb) {
int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb)); int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
wl->last_tx_hlid = h; wl->last_tx_hlid = h;
......
...@@ -424,7 +424,7 @@ struct wl1271 { ...@@ -424,7 +424,7 @@ struct wl1271 {
/* Accounting for allocated / available TX blocks on HW */ /* Accounting for allocated / available TX blocks on HW */
u32 tx_blocks_freed[NUM_TX_QUEUES]; u32 tx_blocks_freed[NUM_TX_QUEUES];
u32 tx_blocks_available; u32 tx_blocks_available;
u32 tx_allocated_blocks[NUM_TX_QUEUES]; u32 tx_allocated_blocks;
u32 tx_results_count; u32 tx_results_count;
/* Transmitted TX packets counter for chipset interface */ /* Transmitted TX packets counter for chipset interface */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment