Skip to content

Commit 1357bfc

Browse files
Ron MercerJeff Garzik
authored andcommitted
qla3xxx: Dynamically size the rx buffer queue based on the MTU.
This change removes use of constants for rx buffer queue size and instead calculates the queue length based on what he MTU is set to. Signed-off-by: Ron Mercer <ron.mercer@qlogic.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
1 parent cb8bac1 commit 1357bfc

File tree

2 files changed

+34
-15
lines changed

2 files changed

+34
-15
lines changed

drivers/net/qla3xxx.c

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1700,11 +1700,11 @@ static void ql_update_lrg_bufq_prod_index(struct ql3_adapter *qdev)
17001700

17011701
qdev->lrg_buf_q_producer_index++;
17021702

1703-
if (qdev->lrg_buf_q_producer_index == NUM_LBUFQ_ENTRIES)
1703+
if (qdev->lrg_buf_q_producer_index == qdev->num_lbufq_entries)
17041704
qdev->lrg_buf_q_producer_index = 0;
17051705

17061706
if (qdev->lrg_buf_q_producer_index ==
1707-
(NUM_LBUFQ_ENTRIES - 1)) {
1707+
(qdev->num_lbufq_entries - 1)) {
17081708
lrg_buf_q_ele = qdev->lrg_buf_q_virt_addr;
17091709
}
17101710
}
@@ -1785,7 +1785,7 @@ static void ql_process_mac_rx_intr(struct ql3_adapter *qdev,
17851785
lrg_buf_phy_addr_low = le32_to_cpu(*curr_ial_ptr);
17861786
lrg_buf_cb1 = &qdev->lrg_buf[qdev->lrg_buf_index];
17871787
qdev->lrg_buf_release_cnt++;
1788-
if (++qdev->lrg_buf_index == NUM_LARGE_BUFFERS) {
1788+
if (++qdev->lrg_buf_index == qdev->num_large_buffers) {
17891789
qdev->lrg_buf_index = 0;
17901790
}
17911791
curr_ial_ptr++; /* 64-bit pointers require two incs. */
@@ -1800,7 +1800,7 @@ static void ql_process_mac_rx_intr(struct ql3_adapter *qdev,
18001800
* Second buffer gets sent up the stack.
18011801
*/
18021802
qdev->lrg_buf_release_cnt++;
1803-
if (++qdev->lrg_buf_index == NUM_LARGE_BUFFERS)
1803+
if (++qdev->lrg_buf_index == qdev->num_large_buffers)
18041804
qdev->lrg_buf_index = 0;
18051805
skb = lrg_buf_cb2->skb;
18061806

@@ -1855,7 +1855,7 @@ static void ql_process_macip_rx_intr(struct ql3_adapter *qdev,
18551855
lrg_buf_phy_addr_low = le32_to_cpu(*curr_ial_ptr);
18561856
lrg_buf_cb1 = &qdev->lrg_buf[qdev->lrg_buf_index];
18571857
qdev->lrg_buf_release_cnt++;
1858-
if (++qdev->lrg_buf_index == NUM_LARGE_BUFFERS)
1858+
if (++qdev->lrg_buf_index == qdev->num_large_buffers)
18591859
qdev->lrg_buf_index = 0;
18601860
skb1 = lrg_buf_cb1->skb;
18611861
curr_ial_ptr++; /* 64-bit pointers require two incs. */
@@ -1870,7 +1870,7 @@ static void ql_process_macip_rx_intr(struct ql3_adapter *qdev,
18701870
lrg_buf_cb2 = &qdev->lrg_buf[qdev->lrg_buf_index];
18711871
skb2 = lrg_buf_cb2->skb;
18721872
qdev->lrg_buf_release_cnt++;
1873-
if (++qdev->lrg_buf_index == NUM_LARGE_BUFFERS)
1873+
if (++qdev->lrg_buf_index == qdev->num_large_buffers)
18741874
qdev->lrg_buf_index = 0;
18751875

18761876
skb_put(skb2, length); /* Just the second buffer length here. */
@@ -2347,12 +2347,19 @@ static int ql_alloc_buffer_queues(struct ql3_adapter *qdev)
23472347
{
23482348
/* Create Large Buffer Queue */
23492349
qdev->lrg_buf_q_size =
2350-
NUM_LBUFQ_ENTRIES * sizeof(struct lrg_buf_q_entry);
2350+
qdev->num_lbufq_entries * sizeof(struct lrg_buf_q_entry);
23512351
if (qdev->lrg_buf_q_size < PAGE_SIZE)
23522352
qdev->lrg_buf_q_alloc_size = PAGE_SIZE;
23532353
else
23542354
qdev->lrg_buf_q_alloc_size = qdev->lrg_buf_q_size * 2;
23552355

2356+
qdev->lrg_buf = kmalloc(qdev->num_large_buffers * sizeof(struct ql_rcv_buf_cb),GFP_KERNEL);
2357+
if (qdev->lrg_buf == NULL) {
2358+
printk(KERN_ERR PFX
2359+
"%s: qdev->lrg_buf alloc failed.\n", qdev->ndev->name);
2360+
return -ENOMEM;
2361+
}
2362+
23562363
qdev->lrg_buf_q_alloc_virt_addr =
23572364
pci_alloc_consistent(qdev->pdev,
23582365
qdev->lrg_buf_q_alloc_size,
@@ -2402,6 +2409,7 @@ static void ql_free_buffer_queues(struct ql3_adapter *qdev)
24022409
"%s: Already done.\n", qdev->ndev->name);
24032410
return;
24042411
}
2412+
if(qdev->lrg_buf) kfree(qdev->lrg_buf);
24052413

24062414
pci_free_consistent(qdev->pdev,
24072415
qdev->lrg_buf_q_alloc_size,
@@ -2485,7 +2493,7 @@ static void ql_free_large_buffers(struct ql3_adapter *qdev)
24852493
int i = 0;
24862494
struct ql_rcv_buf_cb *lrg_buf_cb;
24872495

2488-
for (i = 0; i < NUM_LARGE_BUFFERS; i++) {
2496+
for (i = 0; i < qdev->num_large_buffers; i++) {
24892497
lrg_buf_cb = &qdev->lrg_buf[i];
24902498
if (lrg_buf_cb->skb) {
24912499
dev_kfree_skb(lrg_buf_cb->skb);
@@ -2506,7 +2514,7 @@ static void ql_init_large_buffers(struct ql3_adapter *qdev)
25062514
struct ql_rcv_buf_cb *lrg_buf_cb;
25072515
struct bufq_addr_element *buf_addr_ele = qdev->lrg_buf_q_virt_addr;
25082516

2509-
for (i = 0; i < NUM_LARGE_BUFFERS; i++) {
2517+
for (i = 0; i < qdev->num_large_buffers; i++) {
25102518
lrg_buf_cb = &qdev->lrg_buf[i];
25112519
buf_addr_ele->addr_high = lrg_buf_cb->buf_phy_addr_high;
25122520
buf_addr_ele->addr_low = lrg_buf_cb->buf_phy_addr_low;
@@ -2523,7 +2531,7 @@ static int ql_alloc_large_buffers(struct ql3_adapter *qdev)
25232531
struct sk_buff *skb;
25242532
u64 map;
25252533

2526-
for (i = 0; i < NUM_LARGE_BUFFERS; i++) {
2534+
for (i = 0; i < qdev->num_large_buffers; i++) {
25272535
skb = netdev_alloc_skb(qdev->ndev,
25282536
qdev->lrg_buffer_len);
25292537
if (unlikely(!skb)) {
@@ -2602,16 +2610,23 @@ static int ql_create_send_free_list(struct ql3_adapter *qdev)
26022610

26032611
static int ql_alloc_mem_resources(struct ql3_adapter *qdev)
26042612
{
2605-
if (qdev->ndev->mtu == NORMAL_MTU_SIZE)
2613+
if (qdev->ndev->mtu == NORMAL_MTU_SIZE) {
2614+
qdev->num_lbufq_entries = NUM_LBUFQ_ENTRIES;
26062615
qdev->lrg_buffer_len = NORMAL_MTU_SIZE;
2616+
}
26072617
else if (qdev->ndev->mtu == JUMBO_MTU_SIZE) {
2618+
/*
2619+
* Bigger buffers, so less of them.
2620+
*/
2621+
qdev->num_lbufq_entries = JUMBO_NUM_LBUFQ_ENTRIES;
26082622
qdev->lrg_buffer_len = JUMBO_MTU_SIZE;
26092623
} else {
26102624
printk(KERN_ERR PFX
26112625
"%s: Invalid mtu size. Only 1500 and 9000 are accepted.\n",
26122626
qdev->ndev->name);
26132627
return -ENOMEM;
26142628
}
2629+
qdev->num_large_buffers = qdev->num_lbufq_entries * QL_ADDR_ELE_PER_BUFQ_ENTRY;
26152630
qdev->lrg_buffer_len += VLAN_ETH_HLEN + VLAN_ID_LEN + QL_HEADER_SPACE;
26162631
qdev->max_frame_size =
26172632
(qdev->lrg_buffer_len - QL_HEADER_SPACE) + ETHERNET_CRC_SIZE;
@@ -2844,7 +2859,7 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev)
28442859
&hmem_regs->rxLargeQBaseAddrLow,
28452860
LS_64BITS(qdev->lrg_buf_q_phy_addr));
28462861

2847-
ql_write_page1_reg(qdev, &hmem_regs->rxLargeQLength, NUM_LBUFQ_ENTRIES);
2862+
ql_write_page1_reg(qdev, &hmem_regs->rxLargeQLength, qdev->num_lbufq_entries);
28482863

28492864
ql_write_page1_reg(qdev,
28502865
&hmem_regs->rxLargeBufferLength,
@@ -2866,7 +2881,7 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev)
28662881

28672882
qdev->small_buf_q_producer_index = NUM_SBUFQ_ENTRIES - 1;
28682883
qdev->small_buf_release_cnt = 8;
2869-
qdev->lrg_buf_q_producer_index = NUM_LBUFQ_ENTRIES - 1;
2884+
qdev->lrg_buf_q_producer_index = qdev->num_lbufq_entries - 1;
28702885
qdev->lrg_buf_release_cnt = 8;
28712886
qdev->lrg_buf_next_free =
28722887
(struct bufq_addr_element *)qdev->lrg_buf_q_virt_addr;

drivers/net/qla3xxx.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,13 +1014,15 @@ struct eeprom_data {
10141014

10151015
/* Transmit and Receive Buffers */
10161016
#define NUM_LBUFQ_ENTRIES 128
1017+
#define JUMBO_NUM_LBUFQ_ENTRIES \
1018+
(NUM_LBUFQ_ENTRIES/(JUMBO_MTU_SIZE/NORMAL_MTU_SIZE))
10171019
#define NUM_SBUFQ_ENTRIES 64
10181020
#define QL_SMALL_BUFFER_SIZE 32
10191021
#define QL_ADDR_ELE_PER_BUFQ_ENTRY \
10201022
(sizeof(struct lrg_buf_q_entry) / sizeof(struct bufq_addr_element))
10211023
/* Each send has at least control block. This is how many we keep. */
10221024
#define NUM_SMALL_BUFFERS NUM_SBUFQ_ENTRIES * QL_ADDR_ELE_PER_BUFQ_ENTRY
1023-
#define NUM_LARGE_BUFFERS NUM_LBUFQ_ENTRIES * QL_ADDR_ELE_PER_BUFQ_ENTRY
1025+
10241026
#define QL_HEADER_SPACE 32 /* make header space at top of skb. */
10251027
/*
10261028
* Large & Small Buffers for Receives
@@ -1207,9 +1209,11 @@ struct ql3_adapter {
12071209
u32 lrg_buf_q_producer_index;
12081210
u32 lrg_buf_release_cnt;
12091211
struct bufq_addr_element *lrg_buf_next_free;
1212+
u32 num_large_buffers;
1213+
u32 num_lbufq_entries;
12101214

12111215
/* Large (Receive) Buffers */
1212-
struct ql_rcv_buf_cb lrg_buf[NUM_LARGE_BUFFERS];
1216+
struct ql_rcv_buf_cb *lrg_buf;
12131217
struct ql_rcv_buf_cb *lrg_buf_free_head;
12141218
struct ql_rcv_buf_cb *lrg_buf_free_tail;
12151219
u32 lrg_buf_free_count;

0 commit comments

Comments
 (0)