diff options
Diffstat (limited to 'drivers/net/cxgb3/cxgb3_main.c')
-rw-r--r-- | drivers/net/cxgb3/cxgb3_main.c | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c index 89bec9c3c141..37945fce7fa5 100644 --- a/drivers/net/cxgb3/cxgb3_main.c +++ b/drivers/net/cxgb3/cxgb3_main.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include <linux/firmware.h> | 45 | #include <linux/firmware.h> |
46 | #include <linux/log2.h> | 46 | #include <linux/log2.h> |
47 | #include <linux/stringify.h> | 47 | #include <linux/stringify.h> |
48 | #include <linux/sched.h> | ||
48 | #include <asm/uaccess.h> | 49 | #include <asm/uaccess.h> |
49 | 50 | ||
50 | #include "common.h" | 51 | #include "common.h" |
@@ -140,7 +141,7 @@ MODULE_PARM_DESC(ofld_disable, "whether to enable offload at init time or not"); | |||
140 | * will block keventd as it needs the rtnl lock, and we'll deadlock waiting | 141 | * will block keventd as it needs the rtnl lock, and we'll deadlock waiting |
141 | * for our work to complete. Get our own work queue to solve this. | 142 | * for our work to complete. Get our own work queue to solve this. |
142 | */ | 143 | */ |
143 | static struct workqueue_struct *cxgb3_wq; | 144 | struct workqueue_struct *cxgb3_wq; |
144 | 145 | ||
145 | /** | 146 | /** |
146 | * link_report - show link status and link speed/duplex | 147 | * link_report - show link status and link speed/duplex |
@@ -590,6 +591,19 @@ static void setup_rss(struct adapter *adap) | |||
590 | V_RRCPLCPUSIZE(6) | F_HASHTOEPLITZ, cpus, rspq_map); | 591 | V_RRCPLCPUSIZE(6) | F_HASHTOEPLITZ, cpus, rspq_map); |
591 | } | 592 | } |
592 | 593 | ||
594 | static void ring_dbs(struct adapter *adap) | ||
595 | { | ||
596 | int i, j; | ||
597 | |||
598 | for (i = 0; i < SGE_QSETS; i++) { | ||
599 | struct sge_qset *qs = &adap->sge.qs[i]; | ||
600 | |||
601 | if (qs->adap) | ||
602 | for (j = 0; j < SGE_TXQ_PER_SET; j++) | ||
603 | t3_write_reg(adap, A_SG_KDOORBELL, F_SELEGRCNTX | V_EGRCNTX(qs->txq[j].cntxt_id)); | ||
604 | } | ||
605 | } | ||
606 | |||
593 | static void init_napi(struct adapter *adap) | 607 | static void init_napi(struct adapter *adap) |
594 | { | 608 | { |
595 | int i; | 609 | int i; |
@@ -2754,6 +2768,42 @@ static void t3_adap_check_task(struct work_struct *work) | |||
2754 | spin_unlock_irq(&adapter->work_lock); | 2768 | spin_unlock_irq(&adapter->work_lock); |
2755 | } | 2769 | } |
2756 | 2770 | ||
2771 | static void db_full_task(struct work_struct *work) | ||
2772 | { | ||
2773 | struct adapter *adapter = container_of(work, struct adapter, | ||
2774 | db_full_task); | ||
2775 | |||
2776 | cxgb3_event_notify(&adapter->tdev, OFFLOAD_DB_FULL, 0); | ||
2777 | } | ||
2778 | |||
2779 | static void db_empty_task(struct work_struct *work) | ||
2780 | { | ||
2781 | struct adapter *adapter = container_of(work, struct adapter, | ||
2782 | db_empty_task); | ||
2783 | |||
2784 | cxgb3_event_notify(&adapter->tdev, OFFLOAD_DB_EMPTY, 0); | ||
2785 | } | ||
2786 | |||
2787 | static void db_drop_task(struct work_struct *work) | ||
2788 | { | ||
2789 | struct adapter *adapter = container_of(work, struct adapter, | ||
2790 | db_drop_task); | ||
2791 | unsigned long delay = 1000; | ||
2792 | unsigned short r; | ||
2793 | |||
2794 | cxgb3_event_notify(&adapter->tdev, OFFLOAD_DB_DROP, 0); | ||
2795 | |||
2796 | /* | ||
2797 | * Sleep a while before ringing the driver qset dbs. | ||
2798 | * The delay is between 1000-2023 usecs. | ||
2799 | */ | ||
2800 | get_random_bytes(&r, 2); | ||
2801 | delay += r & 1023; | ||
2802 | set_current_state(TASK_UNINTERRUPTIBLE); | ||
2803 | schedule_timeout(usecs_to_jiffies(delay)); | ||
2804 | ring_dbs(adapter); | ||
2805 | } | ||
2806 | |||
2757 | /* | 2807 | /* |
2758 | * Processes external (PHY) interrupts in process context. | 2808 | * Processes external (PHY) interrupts in process context. |
2759 | */ | 2809 | */ |
@@ -3222,6 +3272,11 @@ static int __devinit init_one(struct pci_dev *pdev, | |||
3222 | INIT_LIST_HEAD(&adapter->adapter_list); | 3272 | INIT_LIST_HEAD(&adapter->adapter_list); |
3223 | INIT_WORK(&adapter->ext_intr_handler_task, ext_intr_task); | 3273 | INIT_WORK(&adapter->ext_intr_handler_task, ext_intr_task); |
3224 | INIT_WORK(&adapter->fatal_error_handler_task, fatal_error_task); | 3274 | INIT_WORK(&adapter->fatal_error_handler_task, fatal_error_task); |
3275 | |||
3276 | INIT_WORK(&adapter->db_full_task, db_full_task); | ||
3277 | INIT_WORK(&adapter->db_empty_task, db_empty_task); | ||
3278 | INIT_WORK(&adapter->db_drop_task, db_drop_task); | ||
3279 | |||
3225 | INIT_DELAYED_WORK(&adapter->adap_check_task, t3_adap_check_task); | 3280 | INIT_DELAYED_WORK(&adapter->adap_check_task, t3_adap_check_task); |
3226 | 3281 | ||
3227 | for (i = 0; i < ai->nports0 + ai->nports1; ++i) { | 3282 | for (i = 0; i < ai->nports0 + ai->nports1; ++i) { |