diff options
author | Divy Le Ray <divy@chelsio.com> | 2009-03-26 12:39:14 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-03-27 03:46:57 -0400 |
commit | 3fa58c883d44c50b48f2d57a0bc626a7812b0cae (patch) | |
tree | 63d1c5ae2247888e6e0155aa81ce69e5679c9031 /drivers/net/cxgb3/t3_hw.c | |
parent | 3156378993b0fc0f9f12f5f297f0a9b4c4fe0fc8 (diff) |
cxgb3: sge setup fixes
Enable timestamps, update delayed ack threshold for iSCSI/iWARP traffic
Remove the len flag in Tx requests. It might corrupt offload trace packets.
Update SGE context setup to avoid potential H/W misprogrammation.
Signed-off-by: Divy Le Ray <divy@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/cxgb3/t3_hw.c')
-rwxr-xr-x[-rw-r--r--] | drivers/net/cxgb3/t3_hw.c | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/drivers/net/cxgb3/t3_hw.c b/drivers/net/cxgb3/t3_hw.c index ff262a04ded0..7d8fbae58dcf 100644..100755 --- a/drivers/net/cxgb3/t3_hw.c +++ b/drivers/net/cxgb3/t3_hw.c | |||
@@ -2128,16 +2128,40 @@ void t3_port_intr_clear(struct adapter *adapter, int idx) | |||
2128 | static int t3_sge_write_context(struct adapter *adapter, unsigned int id, | 2128 | static int t3_sge_write_context(struct adapter *adapter, unsigned int id, |
2129 | unsigned int type) | 2129 | unsigned int type) |
2130 | { | 2130 | { |
2131 | t3_write_reg(adapter, A_SG_CONTEXT_MASK0, 0xffffffff); | 2131 | if (type == F_RESPONSEQ) { |
2132 | t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0xffffffff); | 2132 | /* |
2133 | t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0xffffffff); | 2133 | * Can't write the Response Queue Context bits for |
2134 | t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0xffffffff); | 2134 | * Interrupt Armed or the Reserve bits after the chip |
2135 | * has been initialized out of reset. Writing to these | ||
2136 | * bits can confuse the hardware. | ||
2137 | */ | ||
2138 | t3_write_reg(adapter, A_SG_CONTEXT_MASK0, 0xffffffff); | ||
2139 | t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0xffffffff); | ||
2140 | t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0x17ffffff); | ||
2141 | t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0xffffffff); | ||
2142 | } else { | ||
2143 | t3_write_reg(adapter, A_SG_CONTEXT_MASK0, 0xffffffff); | ||
2144 | t3_write_reg(adapter, A_SG_CONTEXT_MASK1, 0xffffffff); | ||
2145 | t3_write_reg(adapter, A_SG_CONTEXT_MASK2, 0xffffffff); | ||
2146 | t3_write_reg(adapter, A_SG_CONTEXT_MASK3, 0xffffffff); | ||
2147 | } | ||
2135 | t3_write_reg(adapter, A_SG_CONTEXT_CMD, | 2148 | t3_write_reg(adapter, A_SG_CONTEXT_CMD, |
2136 | V_CONTEXT_CMD_OPCODE(1) | type | V_CONTEXT(id)); | 2149 | V_CONTEXT_CMD_OPCODE(1) | type | V_CONTEXT(id)); |
2137 | return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY, | 2150 | return t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY, |
2138 | 0, SG_CONTEXT_CMD_ATTEMPTS, 1); | 2151 | 0, SG_CONTEXT_CMD_ATTEMPTS, 1); |
2139 | } | 2152 | } |
2140 | 2153 | ||
2154 | /** | ||
2155 | * clear_sge_ctxt - completely clear an SGE context | ||
2156 | * @adapter: the adapter | ||
2157 | * @id: the context id | ||
2158 | * @type: the context type | ||
2159 | * | ||
2160 | * Completely clear an SGE context. Used predominantly at post-reset | ||
2161 | * initialization. Note in particular that we don't skip writing to any | ||
2162 | * "sensitive bits" in the contexts the way that t3_sge_write_context() | ||
2163 | * does ... | ||
2164 | */ | ||
2141 | static int clear_sge_ctxt(struct adapter *adap, unsigned int id, | 2165 | static int clear_sge_ctxt(struct adapter *adap, unsigned int id, |
2142 | unsigned int type) | 2166 | unsigned int type) |
2143 | { | 2167 | { |
@@ -2145,7 +2169,14 @@ static int clear_sge_ctxt(struct adapter *adap, unsigned int id, | |||
2145 | t3_write_reg(adap, A_SG_CONTEXT_DATA1, 0); | 2169 | t3_write_reg(adap, A_SG_CONTEXT_DATA1, 0); |
2146 | t3_write_reg(adap, A_SG_CONTEXT_DATA2, 0); | 2170 | t3_write_reg(adap, A_SG_CONTEXT_DATA2, 0); |
2147 | t3_write_reg(adap, A_SG_CONTEXT_DATA3, 0); | 2171 | t3_write_reg(adap, A_SG_CONTEXT_DATA3, 0); |
2148 | return t3_sge_write_context(adap, id, type); | 2172 | t3_write_reg(adap, A_SG_CONTEXT_MASK0, 0xffffffff); |
2173 | t3_write_reg(adap, A_SG_CONTEXT_MASK1, 0xffffffff); | ||
2174 | t3_write_reg(adap, A_SG_CONTEXT_MASK2, 0xffffffff); | ||
2175 | t3_write_reg(adap, A_SG_CONTEXT_MASK3, 0xffffffff); | ||
2176 | t3_write_reg(adap, A_SG_CONTEXT_CMD, | ||
2177 | V_CONTEXT_CMD_OPCODE(1) | type | V_CONTEXT(id)); | ||
2178 | return t3_wait_op_done(adap, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY, | ||
2179 | 0, SG_CONTEXT_CMD_ATTEMPTS, 1); | ||
2149 | } | 2180 | } |
2150 | 2181 | ||
2151 | /** | 2182 | /** |
@@ -2729,10 +2760,10 @@ static void tp_config(struct adapter *adap, const struct tp_params *p) | |||
2729 | F_TCPCHECKSUMOFFLOAD | V_IPTTL(64)); | 2760 | F_TCPCHECKSUMOFFLOAD | V_IPTTL(64)); |
2730 | t3_write_reg(adap, A_TP_TCP_OPTIONS, V_MTUDEFAULT(576) | | 2761 | t3_write_reg(adap, A_TP_TCP_OPTIONS, V_MTUDEFAULT(576) | |
2731 | F_MTUENABLE | V_WINDOWSCALEMODE(1) | | 2762 | F_MTUENABLE | V_WINDOWSCALEMODE(1) | |
2732 | V_TIMESTAMPSMODE(0) | V_SACKMODE(1) | V_SACKRX(1)); | 2763 | V_TIMESTAMPSMODE(1) | V_SACKMODE(1) | V_SACKRX(1)); |
2733 | t3_write_reg(adap, A_TP_DACK_CONFIG, V_AUTOSTATE3(1) | | 2764 | t3_write_reg(adap, A_TP_DACK_CONFIG, V_AUTOSTATE3(1) | |
2734 | V_AUTOSTATE2(1) | V_AUTOSTATE1(0) | | 2765 | V_AUTOSTATE2(1) | V_AUTOSTATE1(0) | |
2735 | V_BYTETHRESHOLD(16384) | V_MSSTHRESHOLD(2) | | 2766 | V_BYTETHRESHOLD(26880) | V_MSSTHRESHOLD(2) | |
2736 | F_AUTOCAREFUL | F_AUTOENABLE | V_DACK_MODE(1)); | 2767 | F_AUTOCAREFUL | F_AUTOENABLE | V_DACK_MODE(1)); |
2737 | t3_set_reg_field(adap, A_TP_IN_CONFIG, F_RXFBARBPRIO | F_TXFBARBPRIO, | 2768 | t3_set_reg_field(adap, A_TP_IN_CONFIG, F_RXFBARBPRIO | F_TXFBARBPRIO, |
2738 | F_IPV6ENABLE | F_NICMODE); | 2769 | F_IPV6ENABLE | F_NICMODE); |