@@ -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
26032611static 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 ;
0 commit comments