diff options
Diffstat (limited to 'drivers/infiniband/hw/hfi1/pio.c')
-rw-r--r-- | drivers/infiniband/hw/hfi1/pio.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/drivers/infiniband/hw/hfi1/pio.c b/drivers/infiniband/hw/hfi1/pio.c index d5edb1afbb8f..d4022450b73f 100644 --- a/drivers/infiniband/hw/hfi1/pio.c +++ b/drivers/infiniband/hw/hfi1/pio.c | |||
@@ -995,7 +995,7 @@ static void sc_wait_for_packet_egress(struct send_context *sc, int pause) | |||
995 | /* counter is reset if occupancy count changes */ | 995 | /* counter is reset if occupancy count changes */ |
996 | if (reg != reg_prev) | 996 | if (reg != reg_prev) |
997 | loop = 0; | 997 | loop = 0; |
998 | if (loop > 500) { | 998 | if (loop > 50000) { |
999 | /* timed out - bounce the link */ | 999 | /* timed out - bounce the link */ |
1000 | dd_dev_err(dd, | 1000 | dd_dev_err(dd, |
1001 | "%s: context %u(%u) timeout waiting for packets to egress, remaining count %u, bouncing link\n", | 1001 | "%s: context %u(%u) timeout waiting for packets to egress, remaining count %u, bouncing link\n", |
@@ -1798,6 +1798,21 @@ static void pio_map_rcu_callback(struct rcu_head *list) | |||
1798 | } | 1798 | } |
1799 | 1799 | ||
1800 | /* | 1800 | /* |
1801 | * Set credit return threshold for the kernel send context | ||
1802 | */ | ||
1803 | static void set_threshold(struct hfi1_devdata *dd, int scontext, int i) | ||
1804 | { | ||
1805 | u32 thres; | ||
1806 | |||
1807 | thres = min(sc_percent_to_threshold(dd->kernel_send_context[scontext], | ||
1808 | 50), | ||
1809 | sc_mtu_to_threshold(dd->kernel_send_context[scontext], | ||
1810 | dd->vld[i].mtu, | ||
1811 | dd->rcd[0]->rcvhdrqentsize)); | ||
1812 | sc_set_cr_threshold(dd->kernel_send_context[scontext], thres); | ||
1813 | } | ||
1814 | |||
1815 | /* | ||
1801 | * pio_map_init - called when #vls change | 1816 | * pio_map_init - called when #vls change |
1802 | * @dd: hfi1_devdata | 1817 | * @dd: hfi1_devdata |
1803 | * @port: port number | 1818 | * @port: port number |
@@ -1872,11 +1887,16 @@ int pio_map_init(struct hfi1_devdata *dd, u8 port, u8 num_vls, u8 *vl_scontexts) | |||
1872 | if (!newmap->map[i]) | 1887 | if (!newmap->map[i]) |
1873 | goto bail; | 1888 | goto bail; |
1874 | newmap->map[i]->mask = (1 << ilog2(sz)) - 1; | 1889 | newmap->map[i]->mask = (1 << ilog2(sz)) - 1; |
1875 | /* assign send contexts */ | 1890 | /* |
1891 | * assign send contexts and | ||
1892 | * adjust credit return threshold | ||
1893 | */ | ||
1876 | for (j = 0; j < sz; j++) { | 1894 | for (j = 0; j < sz; j++) { |
1877 | if (dd->kernel_send_context[scontext]) | 1895 | if (dd->kernel_send_context[scontext]) { |
1878 | newmap->map[i]->ksc[j] = | 1896 | newmap->map[i]->ksc[j] = |
1879 | dd->kernel_send_context[scontext]; | 1897 | dd->kernel_send_context[scontext]; |
1898 | set_threshold(dd, scontext, i); | ||
1899 | } | ||
1880 | if (++scontext >= first_scontext + | 1900 | if (++scontext >= first_scontext + |
1881 | vl_scontexts[i]) | 1901 | vl_scontexts[i]) |
1882 | /* wrap back to first send context */ | 1902 | /* wrap back to first send context */ |