diff options
-rw-r--r-- | drivers/net/qlge/qlge.h | 4 | ||||
-rw-r--r-- | drivers/net/qlge/qlge_dbg.c | 2 | ||||
-rw-r--r-- | drivers/net/qlge/qlge_ethtool.c | 16 | ||||
-rw-r--r-- | drivers/net/qlge/qlge_main.c | 70 |
4 files changed, 28 insertions, 64 deletions
diff --git a/drivers/net/qlge/qlge.h b/drivers/net/qlge/qlge.h index 6ed5317ab1c0..ed5dbca01bd1 100644 --- a/drivers/net/qlge/qlge.h +++ b/drivers/net/qlge/qlge.h | |||
@@ -1287,7 +1287,7 @@ struct rx_ring { | |||
1287 | u32 sbq_free_cnt; /* free buffer desc cnt */ | 1287 | u32 sbq_free_cnt; /* free buffer desc cnt */ |
1288 | 1288 | ||
1289 | /* Misc. handler elements. */ | 1289 | /* Misc. handler elements. */ |
1290 | u32 type; /* Type of queue, tx, rx, or default. */ | 1290 | u32 type; /* Type of queue, tx, rx. */ |
1291 | u32 irq; /* Which vector this ring is assigned. */ | 1291 | u32 irq; /* Which vector this ring is assigned. */ |
1292 | u32 cpu; /* Which CPU this should run on. */ | 1292 | u32 cpu; /* Which CPU this should run on. */ |
1293 | char name[IFNAMSIZ + 5]; | 1293 | char name[IFNAMSIZ + 5]; |
@@ -1486,11 +1486,9 @@ struct ql_adapter { | |||
1486 | struct intr_context intr_context[MAX_RX_RINGS]; | 1486 | struct intr_context intr_context[MAX_RX_RINGS]; |
1487 | 1487 | ||
1488 | int tx_ring_count; /* One per online CPU. */ | 1488 | int tx_ring_count; /* One per online CPU. */ |
1489 | u32 rss_ring_first_cq_id;/* index of first inbound (rss) rx_ring */ | ||
1490 | u32 rss_ring_count; /* One per online CPU. */ | 1489 | u32 rss_ring_count; /* One per online CPU. */ |
1491 | /* | 1490 | /* |
1492 | * rx_ring_count = | 1491 | * rx_ring_count = |
1493 | * one default queue + | ||
1494 | * (CPU count * outbound completion rx_ring) + | 1492 | * (CPU count * outbound completion rx_ring) + |
1495 | * (CPU count * inbound (RSS) completion rx_ring) | 1493 | * (CPU count * inbound (RSS) completion rx_ring) |
1496 | */ | 1494 | */ |
diff --git a/drivers/net/qlge/qlge_dbg.c b/drivers/net/qlge/qlge_dbg.c index 40a70c36f5ae..aa88cb3f41c7 100644 --- a/drivers/net/qlge/qlge_dbg.c +++ b/drivers/net/qlge/qlge_dbg.c | |||
@@ -418,8 +418,6 @@ void ql_dump_qdev(struct ql_adapter *qdev) | |||
418 | printk(KERN_ERR PFX "qdev->intr_count = %d.\n", qdev->intr_count); | 418 | printk(KERN_ERR PFX "qdev->intr_count = %d.\n", qdev->intr_count); |
419 | printk(KERN_ERR PFX "qdev->tx_ring = %p.\n", | 419 | printk(KERN_ERR PFX "qdev->tx_ring = %p.\n", |
420 | qdev->tx_ring); | 420 | qdev->tx_ring); |
421 | printk(KERN_ERR PFX "qdev->rss_ring_first_cq_id = %d.\n", | ||
422 | qdev->rss_ring_first_cq_id); | ||
423 | printk(KERN_ERR PFX "qdev->rss_ring_count = %d.\n", | 421 | printk(KERN_ERR PFX "qdev->rss_ring_count = %d.\n", |
424 | qdev->rss_ring_count); | 422 | qdev->rss_ring_count); |
425 | printk(KERN_ERR PFX "qdev->rx_ring = %p.\n", qdev->rx_ring); | 423 | printk(KERN_ERR PFX "qdev->rx_ring = %p.\n", qdev->rx_ring); |
diff --git a/drivers/net/qlge/qlge_ethtool.c b/drivers/net/qlge/qlge_ethtool.c index eb6a9ee640ed..68f9bd280f86 100644 --- a/drivers/net/qlge/qlge_ethtool.c +++ b/drivers/net/qlge/qlge_ethtool.c | |||
@@ -49,10 +49,11 @@ static int ql_update_ring_coalescing(struct ql_adapter *qdev) | |||
49 | /* Skip the default queue, and update the outbound handler | 49 | /* Skip the default queue, and update the outbound handler |
50 | * queues if they changed. | 50 | * queues if they changed. |
51 | */ | 51 | */ |
52 | cqicb = (struct cqicb *)&qdev->rx_ring[1]; | 52 | cqicb = (struct cqicb *)&qdev->rx_ring[qdev->rss_ring_count]; |
53 | if (le16_to_cpu(cqicb->irq_delay) != qdev->tx_coalesce_usecs || | 53 | if (le16_to_cpu(cqicb->irq_delay) != qdev->tx_coalesce_usecs || |
54 | le16_to_cpu(cqicb->pkt_delay) != qdev->tx_max_coalesced_frames) { | 54 | le16_to_cpu(cqicb->pkt_delay) != |
55 | for (i = 1; i < qdev->rss_ring_first_cq_id; i++, rx_ring++) { | 55 | qdev->tx_max_coalesced_frames) { |
56 | for (i = qdev->rss_ring_count; i < qdev->rx_ring_count; i++) { | ||
56 | rx_ring = &qdev->rx_ring[i]; | 57 | rx_ring = &qdev->rx_ring[i]; |
57 | cqicb = (struct cqicb *)rx_ring; | 58 | cqicb = (struct cqicb *)rx_ring; |
58 | cqicb->irq_delay = cpu_to_le16(qdev->tx_coalesce_usecs); | 59 | cqicb->irq_delay = cpu_to_le16(qdev->tx_coalesce_usecs); |
@@ -70,12 +71,11 @@ static int ql_update_ring_coalescing(struct ql_adapter *qdev) | |||
70 | } | 71 | } |
71 | 72 | ||
72 | /* Update the inbound (RSS) handler queues if they changed. */ | 73 | /* Update the inbound (RSS) handler queues if they changed. */ |
73 | cqicb = (struct cqicb *)&qdev->rx_ring[qdev->rss_ring_first_cq_id]; | 74 | cqicb = (struct cqicb *)&qdev->rx_ring[0]; |
74 | if (le16_to_cpu(cqicb->irq_delay) != qdev->rx_coalesce_usecs || | 75 | if (le16_to_cpu(cqicb->irq_delay) != qdev->rx_coalesce_usecs || |
75 | le16_to_cpu(cqicb->pkt_delay) != qdev->rx_max_coalesced_frames) { | 76 | le16_to_cpu(cqicb->pkt_delay) != |
76 | for (i = qdev->rss_ring_first_cq_id; | 77 | qdev->rx_max_coalesced_frames) { |
77 | i <= qdev->rss_ring_first_cq_id + qdev->rss_ring_count; | 78 | for (i = 0; i < qdev->rss_ring_count; i++, rx_ring++) { |
78 | i++) { | ||
79 | rx_ring = &qdev->rx_ring[i]; | 79 | rx_ring = &qdev->rx_ring[i]; |
80 | cqicb = (struct cqicb *)rx_ring; | 80 | cqicb = (struct cqicb *)rx_ring; |
81 | cqicb->irq_delay = cpu_to_le16(qdev->rx_coalesce_usecs); | 81 | cqicb->irq_delay = cpu_to_le16(qdev->rx_coalesce_usecs); |
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index 3a271afdd8f5..89ea9c7a58c8 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c | |||
@@ -370,9 +370,7 @@ static int ql_set_mac_addr_reg(struct ql_adapter *qdev, u8 *addr, u32 type, | |||
370 | cam_output = (CAM_OUT_ROUTE_NIC | | 370 | cam_output = (CAM_OUT_ROUTE_NIC | |
371 | (qdev-> | 371 | (qdev-> |
372 | func << CAM_OUT_FUNC_SHIFT) | | 372 | func << CAM_OUT_FUNC_SHIFT) | |
373 | (qdev-> | 373 | (0 << CAM_OUT_CQ_ID_SHIFT)); |
374 | rss_ring_first_cq_id << | ||
375 | CAM_OUT_CQ_ID_SHIFT)); | ||
376 | if (qdev->vlgrp) | 374 | if (qdev->vlgrp) |
377 | cam_output |= CAM_OUT_RV; | 375 | cam_output |= CAM_OUT_RV; |
378 | /* route to NIC core */ | 376 | /* route to NIC core */ |
@@ -1649,8 +1647,7 @@ static void ql_process_mac_rx_intr(struct ql_adapter *qdev, | |||
1649 | 1647 | ||
1650 | qdev->stats.rx_packets++; | 1648 | qdev->stats.rx_packets++; |
1651 | qdev->stats.rx_bytes += skb->len; | 1649 | qdev->stats.rx_bytes += skb->len; |
1652 | skb_record_rx_queue(skb, | 1650 | skb_record_rx_queue(skb, rx_ring->cq_id); |
1653 | rx_ring->cq_id - qdev->rss_ring_first_cq_id); | ||
1654 | if (skb->ip_summed == CHECKSUM_UNNECESSARY) { | 1651 | if (skb->ip_summed == CHECKSUM_UNNECESSARY) { |
1655 | if (qdev->vlgrp && | 1652 | if (qdev->vlgrp && |
1656 | (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V) && | 1653 | (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V) && |
@@ -2044,7 +2041,7 @@ static irqreturn_t qlge_isr(int irq, void *dev_id) | |||
2044 | ql_disable_completion_interrupt(qdev, | 2041 | ql_disable_completion_interrupt(qdev, |
2045 | intr_context-> | 2042 | intr_context-> |
2046 | intr); | 2043 | intr); |
2047 | if (i < qdev->rss_ring_first_cq_id) | 2044 | if (i >= qdev->rss_ring_count) |
2048 | queue_delayed_work_on(rx_ring->cpu, | 2045 | queue_delayed_work_on(rx_ring->cpu, |
2049 | qdev->q_workqueue, | 2046 | qdev->q_workqueue, |
2050 | &rx_ring->rx_work, | 2047 | &rx_ring->rx_work, |
@@ -2908,28 +2905,20 @@ static void ql_resolve_queues_to_irqs(struct ql_adapter *qdev) | |||
2908 | INTR_EN_TYPE_READ | INTR_EN_IHD_MASK | INTR_EN_IHD | | 2905 | INTR_EN_TYPE_READ | INTR_EN_IHD_MASK | INTR_EN_IHD | |
2909 | i; | 2906 | i; |
2910 | 2907 | ||
2911 | if (i == 0) { | 2908 | if (i < qdev->rss_ring_count) { |
2912 | /* | 2909 | /* |
2913 | * Default queue handles bcast/mcast plus | 2910 | * Inbound queues handle unicast frames only. |
2914 | * async events. Needs buffers. | ||
2915 | */ | 2911 | */ |
2916 | intr_context->handler = qlge_isr; | 2912 | intr_context->handler = qlge_msix_rx_isr; |
2917 | sprintf(intr_context->name, "%s-default-queue", | 2913 | sprintf(intr_context->name, "%s-rx-%d", |
2918 | qdev->ndev->name); | 2914 | qdev->ndev->name, i); |
2919 | } else if (i < qdev->rss_ring_first_cq_id) { | 2915 | } else { |
2920 | /* | 2916 | /* |
2921 | * Outbound queue is for outbound completions only. | 2917 | * Outbound queue is for outbound completions only. |
2922 | */ | 2918 | */ |
2923 | intr_context->handler = qlge_msix_tx_isr; | 2919 | intr_context->handler = qlge_msix_tx_isr; |
2924 | sprintf(intr_context->name, "%s-tx-%d", | 2920 | sprintf(intr_context->name, "%s-tx-%d", |
2925 | qdev->ndev->name, i); | 2921 | qdev->ndev->name, i); |
2926 | } else { | ||
2927 | /* | ||
2928 | * Inbound queues handle unicast frames only. | ||
2929 | */ | ||
2930 | intr_context->handler = qlge_msix_rx_isr; | ||
2931 | sprintf(intr_context->name, "%s-rx-%d", | ||
2932 | qdev->ndev->name, i); | ||
2933 | } | 2922 | } |
2934 | } | 2923 | } |
2935 | } else { | 2924 | } else { |
@@ -3062,7 +3051,7 @@ static int ql_start_rss(struct ql_adapter *qdev) | |||
3062 | 3051 | ||
3063 | memset((void *)ricb, 0, sizeof(*ricb)); | 3052 | memset((void *)ricb, 0, sizeof(*ricb)); |
3064 | 3053 | ||
3065 | ricb->base_cq = qdev->rss_ring_first_cq_id | RSS_L4K; | 3054 | ricb->base_cq = RSS_L4K; |
3066 | ricb->flags = | 3055 | ricb->flags = |
3067 | (RSS_L6K | RSS_LI | RSS_LB | RSS_LM | RSS_RI4 | RSS_RI6 | RSS_RT4 | | 3056 | (RSS_L6K | RSS_LI | RSS_LB | RSS_LM | RSS_RI4 | RSS_RI6 | RSS_RT4 | |
3068 | RSS_RT6); | 3057 | RSS_RT6); |
@@ -3264,7 +3253,7 @@ static int ql_adapter_initialize(struct ql_adapter *qdev) | |||
3264 | } | 3253 | } |
3265 | 3254 | ||
3266 | /* Start NAPI for the RSS queues. */ | 3255 | /* Start NAPI for the RSS queues. */ |
3267 | for (i = qdev->rss_ring_first_cq_id; i < qdev->rx_ring_count; i++) { | 3256 | for (i = 0; i < qdev->rss_ring_count; i++) { |
3268 | QPRINTK(qdev, IFUP, DEBUG, "Enabling NAPI for rx_ring[%d].\n", | 3257 | QPRINTK(qdev, IFUP, DEBUG, "Enabling NAPI for rx_ring[%d].\n", |
3269 | i); | 3258 | i); |
3270 | napi_enable(&qdev->rx_ring[i].napi); | 3259 | napi_enable(&qdev->rx_ring[i].napi); |
@@ -3355,7 +3344,7 @@ static int ql_adapter_down(struct ql_adapter *qdev) | |||
3355 | * environment. Outbound completion processing | 3344 | * environment. Outbound completion processing |
3356 | * is done in interrupt context. | 3345 | * is done in interrupt context. |
3357 | */ | 3346 | */ |
3358 | if (i >= qdev->rss_ring_first_cq_id) { | 3347 | if (i <= qdev->rss_ring_count) { |
3359 | napi_disable(&rx_ring->napi); | 3348 | napi_disable(&rx_ring->napi); |
3360 | } else { | 3349 | } else { |
3361 | cancel_delayed_work_sync(&rx_ring->rx_work); | 3350 | cancel_delayed_work_sync(&rx_ring->rx_work); |
@@ -3370,7 +3359,7 @@ static int ql_adapter_down(struct ql_adapter *qdev) | |||
3370 | 3359 | ||
3371 | /* Call netif_napi_del() from common point. | 3360 | /* Call netif_napi_del() from common point. |
3372 | */ | 3361 | */ |
3373 | for (i = qdev->rss_ring_first_cq_id; i < qdev->rx_ring_count; i++) | 3362 | for (i = 0; i < qdev->rss_ring_count; i++) |
3374 | netif_napi_del(&qdev->rx_ring[i].napi); | 3363 | netif_napi_del(&qdev->rx_ring[i].napi); |
3375 | 3364 | ||
3376 | ql_free_rx_buffers(qdev); | 3365 | ql_free_rx_buffers(qdev); |
@@ -3476,8 +3465,6 @@ static int ql_configure_rings(struct ql_adapter *qdev) | |||
3476 | qdev->tx_ring_count = cpu_cnt; | 3465 | qdev->tx_ring_count = cpu_cnt; |
3477 | /* Allocate inbound completion (RSS) ring for each CPU. */ | 3466 | /* Allocate inbound completion (RSS) ring for each CPU. */ |
3478 | qdev->rss_ring_count = cpu_cnt; | 3467 | qdev->rss_ring_count = cpu_cnt; |
3479 | /* cq_id for the first inbound ring handler. */ | ||
3480 | qdev->rss_ring_first_cq_id = cpu_cnt + 1; | ||
3481 | /* | 3468 | /* |
3482 | * qdev->rx_ring_count: | 3469 | * qdev->rx_ring_count: |
3483 | * Total number of rx_rings. This includes the one | 3470 | * Total number of rx_rings. This includes the one |
@@ -3485,7 +3472,7 @@ static int ql_configure_rings(struct ql_adapter *qdev) | |||
3485 | * handler rx_rings, and the number of inbound | 3472 | * handler rx_rings, and the number of inbound |
3486 | * completion handler rx_rings. | 3473 | * completion handler rx_rings. |
3487 | */ | 3474 | */ |
3488 | qdev->rx_ring_count = qdev->tx_ring_count + qdev->rss_ring_count + 1; | 3475 | qdev->rx_ring_count = qdev->tx_ring_count + qdev->rss_ring_count; |
3489 | 3476 | ||
3490 | for (i = 0; i < qdev->tx_ring_count; i++) { | 3477 | for (i = 0; i < qdev->tx_ring_count; i++) { |
3491 | tx_ring = &qdev->tx_ring[i]; | 3478 | tx_ring = &qdev->tx_ring[i]; |
@@ -3500,7 +3487,7 @@ static int ql_configure_rings(struct ql_adapter *qdev) | |||
3500 | * The completion queue ID for the tx rings start | 3487 | * The completion queue ID for the tx rings start |
3501 | * immediately after the default Q ID, which is zero. | 3488 | * immediately after the default Q ID, which is zero. |
3502 | */ | 3489 | */ |
3503 | tx_ring->cq_id = i + 1; | 3490 | tx_ring->cq_id = i + qdev->rss_ring_count; |
3504 | } | 3491 | } |
3505 | 3492 | ||
3506 | for (i = 0; i < qdev->rx_ring_count; i++) { | 3493 | for (i = 0; i < qdev->rx_ring_count; i++) { |
@@ -3509,11 +3496,8 @@ static int ql_configure_rings(struct ql_adapter *qdev) | |||
3509 | rx_ring->qdev = qdev; | 3496 | rx_ring->qdev = qdev; |
3510 | rx_ring->cq_id = i; | 3497 | rx_ring->cq_id = i; |
3511 | rx_ring->cpu = i % cpu_cnt; /* CPU to run handler on. */ | 3498 | rx_ring->cpu = i % cpu_cnt; /* CPU to run handler on. */ |
3512 | if (i == 0) { /* Default queue at index 0. */ | 3499 | if (i < qdev->rss_ring_count) { |
3513 | /* | 3500 | /* Inbound completions (RSS) queues */ |
3514 | * Default queue handles bcast/mcast plus | ||
3515 | * async events. Needs buffers. | ||
3516 | */ | ||
3517 | rx_ring->cq_len = qdev->rx_ring_size; | 3501 | rx_ring->cq_len = qdev->rx_ring_size; |
3518 | rx_ring->cq_size = | 3502 | rx_ring->cq_size = |
3519 | rx_ring->cq_len * sizeof(struct ql_net_rsp_iocb); | 3503 | rx_ring->cq_len * sizeof(struct ql_net_rsp_iocb); |
@@ -3525,8 +3509,8 @@ static int ql_configure_rings(struct ql_adapter *qdev) | |||
3525 | rx_ring->sbq_size = | 3509 | rx_ring->sbq_size = |
3526 | rx_ring->sbq_len * sizeof(__le64); | 3510 | rx_ring->sbq_len * sizeof(__le64); |
3527 | rx_ring->sbq_buf_size = SMALL_BUFFER_SIZE * 2; | 3511 | rx_ring->sbq_buf_size = SMALL_BUFFER_SIZE * 2; |
3528 | rx_ring->type = DEFAULT_Q; | 3512 | rx_ring->type = RX_Q; |
3529 | } else if (i < qdev->rss_ring_first_cq_id) { | 3513 | } else { |
3530 | /* | 3514 | /* |
3531 | * Outbound queue handles outbound completions only. | 3515 | * Outbound queue handles outbound completions only. |
3532 | */ | 3516 | */ |
@@ -3541,22 +3525,6 @@ static int ql_configure_rings(struct ql_adapter *qdev) | |||
3541 | rx_ring->sbq_size = 0; | 3525 | rx_ring->sbq_size = 0; |
3542 | rx_ring->sbq_buf_size = 0; | 3526 | rx_ring->sbq_buf_size = 0; |
3543 | rx_ring->type = TX_Q; | 3527 | rx_ring->type = TX_Q; |
3544 | } else { /* Inbound completions (RSS) queues */ | ||
3545 | /* | ||
3546 | * Inbound queues handle unicast frames only. | ||
3547 | */ | ||
3548 | rx_ring->cq_len = qdev->rx_ring_size; | ||
3549 | rx_ring->cq_size = | ||
3550 | rx_ring->cq_len * sizeof(struct ql_net_rsp_iocb); | ||
3551 | rx_ring->lbq_len = NUM_LARGE_BUFFERS; | ||
3552 | rx_ring->lbq_size = | ||
3553 | rx_ring->lbq_len * sizeof(__le64); | ||
3554 | rx_ring->lbq_buf_size = LARGE_BUFFER_SIZE; | ||
3555 | rx_ring->sbq_len = NUM_SMALL_BUFFERS; | ||
3556 | rx_ring->sbq_size = | ||
3557 | rx_ring->sbq_len * sizeof(__le64); | ||
3558 | rx_ring->sbq_buf_size = SMALL_BUFFER_SIZE * 2; | ||
3559 | rx_ring->type = RX_Q; | ||
3560 | } | 3528 | } |
3561 | } | 3529 | } |
3562 | return 0; | 3530 | return 0; |