diff options
Diffstat (limited to 'drivers/net/qla3xxx.c')
-rwxr-xr-x | drivers/net/qla3xxx.c | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/drivers/net/qla3xxx.c b/drivers/net/qla3xxx.c index c25a1f728715..7d68d1f2df69 100755 --- a/drivers/net/qla3xxx.c +++ b/drivers/net/qla3xxx.c | |||
@@ -1700,11 +1700,11 @@ static void ql_update_lrg_bufq_prod_index(struct ql3_adapter *qdev) | |||
1700 | 1700 | ||
1701 | qdev->lrg_buf_q_producer_index++; | 1701 | qdev->lrg_buf_q_producer_index++; |
1702 | 1702 | ||
1703 | if (qdev->lrg_buf_q_producer_index == NUM_LBUFQ_ENTRIES) | 1703 | if (qdev->lrg_buf_q_producer_index == qdev->num_lbufq_entries) |
1704 | qdev->lrg_buf_q_producer_index = 0; | 1704 | qdev->lrg_buf_q_producer_index = 0; |
1705 | 1705 | ||
1706 | if (qdev->lrg_buf_q_producer_index == | 1706 | if (qdev->lrg_buf_q_producer_index == |
1707 | (NUM_LBUFQ_ENTRIES - 1)) { | 1707 | (qdev->num_lbufq_entries - 1)) { |
1708 | lrg_buf_q_ele = qdev->lrg_buf_q_virt_addr; | 1708 | lrg_buf_q_ele = qdev->lrg_buf_q_virt_addr; |
1709 | } | 1709 | } |
1710 | } | 1710 | } |
@@ -1785,7 +1785,7 @@ static void ql_process_mac_rx_intr(struct ql3_adapter *qdev, | |||
1785 | lrg_buf_phy_addr_low = le32_to_cpu(*curr_ial_ptr); | 1785 | lrg_buf_phy_addr_low = le32_to_cpu(*curr_ial_ptr); |
1786 | lrg_buf_cb1 = &qdev->lrg_buf[qdev->lrg_buf_index]; | 1786 | lrg_buf_cb1 = &qdev->lrg_buf[qdev->lrg_buf_index]; |
1787 | qdev->lrg_buf_release_cnt++; | 1787 | qdev->lrg_buf_release_cnt++; |
1788 | if (++qdev->lrg_buf_index == NUM_LARGE_BUFFERS) { | 1788 | if (++qdev->lrg_buf_index == qdev->num_large_buffers) { |
1789 | qdev->lrg_buf_index = 0; | 1789 | qdev->lrg_buf_index = 0; |
1790 | } | 1790 | } |
1791 | curr_ial_ptr++; /* 64-bit pointers require two incs. */ | 1791 | curr_ial_ptr++; /* 64-bit pointers require two incs. */ |
@@ -1800,7 +1800,7 @@ static void ql_process_mac_rx_intr(struct ql3_adapter *qdev, | |||
1800 | * Second buffer gets sent up the stack. | 1800 | * Second buffer gets sent up the stack. |
1801 | */ | 1801 | */ |
1802 | qdev->lrg_buf_release_cnt++; | 1802 | qdev->lrg_buf_release_cnt++; |
1803 | if (++qdev->lrg_buf_index == NUM_LARGE_BUFFERS) | 1803 | if (++qdev->lrg_buf_index == qdev->num_large_buffers) |
1804 | qdev->lrg_buf_index = 0; | 1804 | qdev->lrg_buf_index = 0; |
1805 | skb = lrg_buf_cb2->skb; | 1805 | skb = lrg_buf_cb2->skb; |
1806 | 1806 | ||
@@ -1855,7 +1855,7 @@ static void ql_process_macip_rx_intr(struct ql3_adapter *qdev, | |||
1855 | lrg_buf_phy_addr_low = le32_to_cpu(*curr_ial_ptr); | 1855 | lrg_buf_phy_addr_low = le32_to_cpu(*curr_ial_ptr); |
1856 | lrg_buf_cb1 = &qdev->lrg_buf[qdev->lrg_buf_index]; | 1856 | lrg_buf_cb1 = &qdev->lrg_buf[qdev->lrg_buf_index]; |
1857 | qdev->lrg_buf_release_cnt++; | 1857 | qdev->lrg_buf_release_cnt++; |
1858 | if (++qdev->lrg_buf_index == NUM_LARGE_BUFFERS) | 1858 | if (++qdev->lrg_buf_index == qdev->num_large_buffers) |
1859 | qdev->lrg_buf_index = 0; | 1859 | qdev->lrg_buf_index = 0; |
1860 | skb1 = lrg_buf_cb1->skb; | 1860 | skb1 = lrg_buf_cb1->skb; |
1861 | curr_ial_ptr++; /* 64-bit pointers require two incs. */ | 1861 | curr_ial_ptr++; /* 64-bit pointers require two incs. */ |
@@ -1870,7 +1870,7 @@ static void ql_process_macip_rx_intr(struct ql3_adapter *qdev, | |||
1870 | lrg_buf_cb2 = &qdev->lrg_buf[qdev->lrg_buf_index]; | 1870 | lrg_buf_cb2 = &qdev->lrg_buf[qdev->lrg_buf_index]; |
1871 | skb2 = lrg_buf_cb2->skb; | 1871 | skb2 = lrg_buf_cb2->skb; |
1872 | qdev->lrg_buf_release_cnt++; | 1872 | qdev->lrg_buf_release_cnt++; |
1873 | if (++qdev->lrg_buf_index == NUM_LARGE_BUFFERS) | 1873 | if (++qdev->lrg_buf_index == qdev->num_large_buffers) |
1874 | qdev->lrg_buf_index = 0; | 1874 | qdev->lrg_buf_index = 0; |
1875 | 1875 | ||
1876 | skb_put(skb2, length); /* Just the second buffer length here. */ | 1876 | skb_put(skb2, length); /* Just the second buffer length here. */ |
@@ -2347,12 +2347,19 @@ static int ql_alloc_buffer_queues(struct ql3_adapter *qdev) | |||
2347 | { | 2347 | { |
2348 | /* Create Large Buffer Queue */ | 2348 | /* Create Large Buffer Queue */ |
2349 | qdev->lrg_buf_q_size = | 2349 | 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); |
2351 | if (qdev->lrg_buf_q_size < PAGE_SIZE) | 2351 | if (qdev->lrg_buf_q_size < PAGE_SIZE) |
2352 | qdev->lrg_buf_q_alloc_size = PAGE_SIZE; | 2352 | qdev->lrg_buf_q_alloc_size = PAGE_SIZE; |
2353 | else | 2353 | else |
2354 | qdev->lrg_buf_q_alloc_size = qdev->lrg_buf_q_size * 2; | 2354 | qdev->lrg_buf_q_alloc_size = qdev->lrg_buf_q_size * 2; |
2355 | 2355 | ||
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 | |||
2356 | qdev->lrg_buf_q_alloc_virt_addr = | 2363 | qdev->lrg_buf_q_alloc_virt_addr = |
2357 | pci_alloc_consistent(qdev->pdev, | 2364 | pci_alloc_consistent(qdev->pdev, |
2358 | qdev->lrg_buf_q_alloc_size, | 2365 | qdev->lrg_buf_q_alloc_size, |
@@ -2402,6 +2409,7 @@ static void ql_free_buffer_queues(struct ql3_adapter *qdev) | |||
2402 | "%s: Already done.\n", qdev->ndev->name); | 2409 | "%s: Already done.\n", qdev->ndev->name); |
2403 | return; | 2410 | return; |
2404 | } | 2411 | } |
2412 | if(qdev->lrg_buf) kfree(qdev->lrg_buf); | ||
2405 | 2413 | ||
2406 | pci_free_consistent(qdev->pdev, | 2414 | pci_free_consistent(qdev->pdev, |
2407 | qdev->lrg_buf_q_alloc_size, | 2415 | qdev->lrg_buf_q_alloc_size, |
@@ -2485,7 +2493,7 @@ static void ql_free_large_buffers(struct ql3_adapter *qdev) | |||
2485 | int i = 0; | 2493 | int i = 0; |
2486 | struct ql_rcv_buf_cb *lrg_buf_cb; | 2494 | struct ql_rcv_buf_cb *lrg_buf_cb; |
2487 | 2495 | ||
2488 | for (i = 0; i < NUM_LARGE_BUFFERS; i++) { | 2496 | for (i = 0; i < qdev->num_large_buffers; i++) { |
2489 | lrg_buf_cb = &qdev->lrg_buf[i]; | 2497 | lrg_buf_cb = &qdev->lrg_buf[i]; |
2490 | if (lrg_buf_cb->skb) { | 2498 | if (lrg_buf_cb->skb) { |
2491 | dev_kfree_skb(lrg_buf_cb->skb); | 2499 | dev_kfree_skb(lrg_buf_cb->skb); |
@@ -2506,7 +2514,7 @@ static void ql_init_large_buffers(struct ql3_adapter *qdev) | |||
2506 | struct ql_rcv_buf_cb *lrg_buf_cb; | 2514 | struct ql_rcv_buf_cb *lrg_buf_cb; |
2507 | struct bufq_addr_element *buf_addr_ele = qdev->lrg_buf_q_virt_addr; | 2515 | struct bufq_addr_element *buf_addr_ele = qdev->lrg_buf_q_virt_addr; |
2508 | 2516 | ||
2509 | for (i = 0; i < NUM_LARGE_BUFFERS; i++) { | 2517 | for (i = 0; i < qdev->num_large_buffers; i++) { |
2510 | lrg_buf_cb = &qdev->lrg_buf[i]; | 2518 | lrg_buf_cb = &qdev->lrg_buf[i]; |
2511 | buf_addr_ele->addr_high = lrg_buf_cb->buf_phy_addr_high; | 2519 | buf_addr_ele->addr_high = lrg_buf_cb->buf_phy_addr_high; |
2512 | buf_addr_ele->addr_low = lrg_buf_cb->buf_phy_addr_low; | 2520 | 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) | |||
2523 | struct sk_buff *skb; | 2531 | struct sk_buff *skb; |
2524 | u64 map; | 2532 | u64 map; |
2525 | 2533 | ||
2526 | for (i = 0; i < NUM_LARGE_BUFFERS; i++) { | 2534 | for (i = 0; i < qdev->num_large_buffers; i++) { |
2527 | skb = netdev_alloc_skb(qdev->ndev, | 2535 | skb = netdev_alloc_skb(qdev->ndev, |
2528 | qdev->lrg_buffer_len); | 2536 | qdev->lrg_buffer_len); |
2529 | if (unlikely(!skb)) { | 2537 | if (unlikely(!skb)) { |
@@ -2602,9 +2610,15 @@ static int ql_create_send_free_list(struct ql3_adapter *qdev) | |||
2602 | 2610 | ||
2603 | static int ql_alloc_mem_resources(struct ql3_adapter *qdev) | 2611 | static int ql_alloc_mem_resources(struct ql3_adapter *qdev) |
2604 | { | 2612 | { |
2605 | if (qdev->ndev->mtu == NORMAL_MTU_SIZE) | 2613 | if (qdev->ndev->mtu == NORMAL_MTU_SIZE) { |
2614 | qdev->num_lbufq_entries = NUM_LBUFQ_ENTRIES; | ||
2606 | qdev->lrg_buffer_len = NORMAL_MTU_SIZE; | 2615 | qdev->lrg_buffer_len = NORMAL_MTU_SIZE; |
2616 | } | ||
2607 | else if (qdev->ndev->mtu == JUMBO_MTU_SIZE) { | 2617 | 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; | ||
2608 | qdev->lrg_buffer_len = JUMBO_MTU_SIZE; | 2622 | qdev->lrg_buffer_len = JUMBO_MTU_SIZE; |
2609 | } else { | 2623 | } else { |
2610 | printk(KERN_ERR PFX | 2624 | printk(KERN_ERR PFX |
@@ -2612,6 +2626,7 @@ static int ql_alloc_mem_resources(struct ql3_adapter *qdev) | |||
2612 | qdev->ndev->name); | 2626 | qdev->ndev->name); |
2613 | return -ENOMEM; | 2627 | return -ENOMEM; |
2614 | } | 2628 | } |
2629 | qdev->num_large_buffers = qdev->num_lbufq_entries * QL_ADDR_ELE_PER_BUFQ_ENTRY; | ||
2615 | qdev->lrg_buffer_len += VLAN_ETH_HLEN + VLAN_ID_LEN + QL_HEADER_SPACE; | 2630 | qdev->lrg_buffer_len += VLAN_ETH_HLEN + VLAN_ID_LEN + QL_HEADER_SPACE; |
2616 | qdev->max_frame_size = | 2631 | qdev->max_frame_size = |
2617 | (qdev->lrg_buffer_len - QL_HEADER_SPACE) + ETHERNET_CRC_SIZE; | 2632 | (qdev->lrg_buffer_len - QL_HEADER_SPACE) + ETHERNET_CRC_SIZE; |
@@ -2844,7 +2859,7 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev) | |||
2844 | &hmem_regs->rxLargeQBaseAddrLow, | 2859 | &hmem_regs->rxLargeQBaseAddrLow, |
2845 | LS_64BITS(qdev->lrg_buf_q_phy_addr)); | 2860 | LS_64BITS(qdev->lrg_buf_q_phy_addr)); |
2846 | 2861 | ||
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); |
2848 | 2863 | ||
2849 | ql_write_page1_reg(qdev, | 2864 | ql_write_page1_reg(qdev, |
2850 | &hmem_regs->rxLargeBufferLength, | 2865 | &hmem_regs->rxLargeBufferLength, |
@@ -2866,7 +2881,7 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev) | |||
2866 | 2881 | ||
2867 | qdev->small_buf_q_producer_index = NUM_SBUFQ_ENTRIES - 1; | 2882 | qdev->small_buf_q_producer_index = NUM_SBUFQ_ENTRIES - 1; |
2868 | qdev->small_buf_release_cnt = 8; | 2883 | 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; |
2870 | qdev->lrg_buf_release_cnt = 8; | 2885 | qdev->lrg_buf_release_cnt = 8; |
2871 | qdev->lrg_buf_next_free = | 2886 | qdev->lrg_buf_next_free = |
2872 | (struct bufq_addr_element *)qdev->lrg_buf_q_virt_addr; | 2887 | (struct bufq_addr_element *)qdev->lrg_buf_q_virt_addr; |