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 | |
| 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>
| -rwxr-xr-x | drivers/net/cxgb3/sge.c | 2 | ||||
| -rwxr-xr-x[-rw-r--r--] | drivers/net/cxgb3/t3_hw.c | 45 |
2 files changed, 39 insertions, 8 deletions
diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c index fcd1a4f4f778..54667f0dde94 100755 --- a/drivers/net/cxgb3/sge.c +++ b/drivers/net/cxgb3/sge.c | |||
| @@ -1089,7 +1089,7 @@ static void write_tx_pkt_wr(struct adapter *adap, struct sk_buff *skb, | |||
| 1089 | struct tx_desc *d = &q->desc[pidx]; | 1089 | struct tx_desc *d = &q->desc[pidx]; |
| 1090 | struct cpl_tx_pkt *cpl = (struct cpl_tx_pkt *)d; | 1090 | struct cpl_tx_pkt *cpl = (struct cpl_tx_pkt *)d; |
| 1091 | 1091 | ||
| 1092 | cpl->len = htonl(skb->len | 0x80000000); | 1092 | cpl->len = htonl(skb->len); |
| 1093 | cntrl = V_TXPKT_INTF(pi->port_id); | 1093 | cntrl = V_TXPKT_INTF(pi->port_id); |
| 1094 | 1094 | ||
| 1095 | if (vlan_tx_tag_present(skb) && pi->vlan_grp) | 1095 | if (vlan_tx_tag_present(skb) && pi->vlan_grp) |
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); |
