aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/cxgb
diff options
context:
space:
mode:
authorKip Macy <kmacy@FreeBSD.org>2008-03-18 03:55:12 +0000
committerKip Macy <kmacy@FreeBSD.org>2008-03-18 03:55:12 +0000
commit19905d6dbdfec86753230618d6017656bc40c5c5 (patch)
tree3c03f91bf87719ef8536b68e7de3cac41f9f9a49 /sys/dev/cxgb
parent2ea1f90a187f5bba7e5e881f102860d76c81fa72 (diff)
downloadsrc-19905d6dbdfec86753230618d6017656bc40c5c5.tar.gz
src-19905d6dbdfec86753230618d6017656bc40c5c5.zip
- Integrate 1.133 vendor driver changes
- update some copyrights - add improved support for delayed ack - fix issue with fec
Notes
Notes: svn path=/head/; revision=177340
Diffstat (limited to 'sys/dev/cxgb')
-rw-r--r--sys/dev/cxgb/common/cxgb_ael1002.c4
-rw-r--r--sys/dev/cxgb/common/cxgb_common.h6
-rw-r--r--sys/dev/cxgb/common/cxgb_version.h4
-rw-r--r--sys/dev/cxgb/cxgb_ioctl.h2
-rw-r--r--sys/dev/cxgb/cxgb_main.c61
-rw-r--r--sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c81
-rw-r--r--sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c4
-rw-r--r--sys/dev/cxgb/ulp/tom/cxgb_ddp.c3
-rw-r--r--sys/dev/cxgb/ulp/tom/cxgb_defs.h1
9 files changed, 110 insertions, 56 deletions
diff --git a/sys/dev/cxgb/common/cxgb_ael1002.c b/sys/dev/cxgb/common/cxgb_ael1002.c
index a5a258b11f84..b288d5d60535 100644
--- a/sys/dev/cxgb/common/cxgb_ael1002.c
+++ b/sys/dev/cxgb/common/cxgb_ael1002.c
@@ -1,6 +1,6 @@
/**************************************************************************
-Copyright (c) 2007, Chelsio Inc.
+Copyright (c) 2007-2008, Chelsio Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -148,7 +148,7 @@ int t3_ael1002_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
{
cphy_init(phy, adapter, phy_addr, &ael1002_ops, mdio_ops,
SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE,
- "10GBASE-XR");
+ "10GBASE-R");
ael100x_txon(phy);
return 0;
}
diff --git a/sys/dev/cxgb/common/cxgb_common.h b/sys/dev/cxgb/common/cxgb_common.h
index f1b5075d7036..1ce6b4016b49 100644
--- a/sys/dev/cxgb/common/cxgb_common.h
+++ b/sys/dev/cxgb/common/cxgb_common.h
@@ -1,6 +1,6 @@
/**************************************************************************
-Copyright (c) 2007, Chelsio Inc.
+Copyright (c) 2007-2008, Chelsio Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -684,6 +684,7 @@ int t3_prep_adapter(adapter_t *adapter, const struct adapter_info *ai, int reset
void t3_led_ready(adapter_t *adapter);
void t3_fatal_err(adapter_t *adapter);
void t3_set_vlan_accel(adapter_t *adapter, unsigned int ports, int on);
+void t3_tp_set_offload_mode(adapter_t *adap, int enable);
void t3_enable_filters(adapter_t *adap);
void t3_config_rss(adapter_t *adapter, unsigned int rss_config, const u8 *cpus,
const u16 *rspq);
@@ -718,10 +719,9 @@ void t3_mc5_intr_handler(struct mc5 *mc5);
int t3_read_mc5_range(const struct mc5 *mc5, unsigned int start, unsigned int n,
u32 *buf);
-#ifdef CONFIG_CHELSIO_T3_CORE
+#if defined(CONFIG_CHELSIO_T3_CORE)
int t3_tp_set_coalescing_size(adapter_t *adap, unsigned int size, int psh);
void t3_tp_set_max_rxsize(adapter_t *adap, unsigned int size);
-void t3_tp_set_offload_mode(adapter_t *adap, int enable);
void t3_tp_get_mib_stats(adapter_t *adap, struct tp_mib_stats *tps);
void t3_load_mtus(adapter_t *adap, unsigned short mtus[NMTUS],
unsigned short alpha[NCCTRL_WIN],
diff --git a/sys/dev/cxgb/common/cxgb_version.h b/sys/dev/cxgb/common/cxgb_version.h
index 5867bebb2724..3f4a652fb426 100644
--- a/sys/dev/cxgb/common/cxgb_version.h
+++ b/sys/dev/cxgb/common/cxgb_version.h
@@ -1,6 +1,6 @@
/**************************************************************************
-Copyright (c) 2007, Chelsio Inc.
+Copyright (c) 2007-2008, Chelsio Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -37,5 +37,5 @@ $FreeBSD$
#define __CHELSIO_VERSION_H
#define DRV_DESC "Chelsio T3 Network Driver"
#define DRV_NAME "cxgb"
-#define DRV_VERSION "1.0.129a"
+#define DRV_VERSION "1.0.133"
#endif
diff --git a/sys/dev/cxgb/cxgb_ioctl.h b/sys/dev/cxgb/cxgb_ioctl.h
index d5df986da944..64a4ce9c66e4 100644
--- a/sys/dev/cxgb/cxgb_ioctl.h
+++ b/sys/dev/cxgb/cxgb_ioctl.h
@@ -1,6 +1,6 @@
/**************************************************************************
-Copyright (c) 2007, Chelsio Inc.
+Copyright (c) 2007-2008, Chelsio Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/cxgb/cxgb_main.c b/sys/dev/cxgb/cxgb_main.c
index bbf40b15b01e..c20fbaa0c193 100644
--- a/sys/dev/cxgb/cxgb_main.c
+++ b/sys/dev/cxgb/cxgb_main.c
@@ -990,7 +990,7 @@ cxgb_port_attach(device_t dev)
media_flags = IFM_ETHER | IFM_10G_CX4 | IFM_FDX;
} else if (!strcmp(p->phy.desc, "10GBASE-SR")) {
media_flags = IFM_ETHER | IFM_10G_SR | IFM_FDX;
- } else if (!strcmp(p->phy.desc, "10GBASE-XR")) {
+ } else if (!strcmp(p->phy.desc, "10GBASE-R")) {
media_flags = IFM_ETHER | IFM_10G_LR | IFM_FDX;
} else if (!strcmp(p->phy.desc, "10/100/1000BASE-T")) {
ifmedia_add(&p->media, IFM_ETHER | IFM_10_T, 0, NULL);
@@ -1025,7 +1025,9 @@ cxgb_port_attach(device_t dev)
/* Create a port for handling TX without starvation */
p->tq = taskqueue_create_fast(p->taskqbuf, M_NOWAIT,
taskqueue_thread_enqueue, &p->tq);
-#endif
+#endif
+ /* Get the latest mac address, User can use a LAA */
+ bcopy(IF_LLADDR(p->ifp), p->hw_addr, ETHER_ADDR_LEN);
t3_sge_init_port(p);
cxgb_link_start(p);
t3_link_changed(sc, p->port_id);
@@ -1155,7 +1157,7 @@ t3_os_pci_restore_state(struct adapter *sc)
* t3_os_link_changed - handle link status changes
* @adapter: the adapter associated with the link change
* @port_id: the port index whose limk status has changed
- * @link_stat: the new status of the link
+ * @link_status: the new status of the link
* @speed: the new speed setting
* @duplex: the new duplex setting
* @fc: the new flow-control setting
@@ -1172,12 +1174,19 @@ t3_os_link_changed(adapter_t *adapter, int port_id, int link_status, int speed,
struct cmac *mac = &adapter->port[port_id].mac;
if (link_status) {
- t3_mac_enable(mac, MAC_DIRECTION_RX);
+ DELAY(10);
+ t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
+ /* Clear errors created by MAC enable */
+ t3_set_reg_field(adapter,
+ A_XGM_STAT_CTRL + pi->mac.offset,
+ F_CLRSTATS, 1);
if_link_state_change(pi->ifp, LINK_STATE_UP);
+
} else {
pi->phy.ops->power_down(&pi->phy, 1);
t3_mac_disable(mac, MAC_DIRECTION_RX);
t3_link_start(&pi->phy, mac, &pi->link_config);
+ t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
if_link_state_change(pi->ifp, LINK_STATE_DOWN);
}
}
@@ -1832,26 +1841,46 @@ cxgb_set_rxmode(struct port_info *p)
}
static void
-cxgb_stop_locked(struct port_info *p)
+cxgb_stop_locked(struct port_info *pi)
{
struct ifnet *ifp;
- PORT_LOCK_ASSERT_OWNED(p);
- ADAPTER_LOCK_ASSERT_NOTOWNED(p->adapter);
+ PORT_LOCK_ASSERT_OWNED(pi);
+ ADAPTER_LOCK_ASSERT_NOTOWNED(pi->adapter);
- ifp = p->ifp;
- t3_port_intr_disable(p->adapter, p->port_id);
+ ifp = pi->ifp;
+ t3_port_intr_disable(pi->adapter, pi->port_id);
ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
- p->phy.ops->power_down(&p->phy, 1);
- t3_mac_disable(&p->mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX);
- ADAPTER_LOCK(p->adapter);
- clrbit(&p->adapter->open_device_map, p->port_id);
+ /* disable pause frames */
+ t3_set_reg_field(pi->adapter, A_XGM_TX_CFG + pi->mac.offset,
+ F_TXPAUSEEN, 0);
- if (p->adapter->open_device_map == 0) {
- cxgb_down_locked(p->adapter);
+ /* Reset RX FIFO HWM */
+ t3_set_reg_field(pi->adapter, A_XGM_RXFIFO_CFG + pi->mac.offset,
+ V_RXFIFOPAUSEHWM(M_RXFIFOPAUSEHWM), 0);
+
+
+ ADAPTER_LOCK(pi->adapter);
+ clrbit(&pi->adapter->open_device_map, pi->port_id);
+
+ if (pi->adapter->open_device_map == 0) {
+ cxgb_down_locked(pi->adapter);
} else
- ADAPTER_UNLOCK(p->adapter);
+ ADAPTER_UNLOCK(pi->adapter);
+
+ DELAY(100);
+
+
+ /* Wait for TXFIFO empty */
+ t3_wait_op_done(pi->adapter, A_XGM_TXFIFO_CFG + pi->mac.offset,
+ F_TXFIFO_EMPTY, 1, 20, 5);
+
+ DELAY(100);
+ t3_mac_disable(&pi->mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX);
+
+ pi->phy.ops->power_down(&pi->phy, 1);
+
}
diff --git a/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c b/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c
index 6d431a1cf3c1..a8c7e7e7aee5 100644
--- a/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c
+++ b/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c
@@ -638,6 +638,14 @@ do_rx_urg_notify(struct t3cdev *cdev, struct mbuf *m, void *ctx)
return (0);
}
+static __inline int
+is_delack_mode_valid(struct toedev *dev, struct toepcb *toep)
+{
+ return (toep->tp_ulp_mode ||
+ (toep->tp_ulp_mode == ULP_MODE_TCPDDP &&
+ dev->tod_ttid >= TOE_ID_CHELSIO_T3));
+}
+
/*
* Set of states for which we should return RX credits.
*/
@@ -702,9 +710,7 @@ t3_cleanup_rbuf(struct tcpcb *tp, int copied)
if (__predict_false(thres == 0))
return;
- if (toep->tp_ulp_mode)
- dack = F_RX_DACK_CHANGE | V_RX_DACK_MODE(1);
- else {
+ if (is_delack_mode_valid(dev, toep)) {
dack_mode = TOM_TUNABLE(dev, delack);
if (__predict_false(dack_mode != toep->tp_delack_mode)) {
u32 r = tp->rcv_nxt - toep->tp_delack_seq;
@@ -713,8 +719,9 @@ t3_cleanup_rbuf(struct tcpcb *tp, int copied)
dack = F_RX_DACK_CHANGE |
V_RX_DACK_MODE(dack_mode);
}
- }
-
+ } else
+ dack = F_RX_DACK_CHANGE | V_RX_DACK_MODE(1);
+
/*
* For coalescing to work effectively ensure the receive window has
* at least 16KB left.
@@ -887,6 +894,12 @@ t3_set_rcv_coalesce_enable(struct socket *so, int on_off)
set_tcb_tflag(so, S_TF_RCV_COALESCE_ENABLE, on_off);
}
+void
+t3_set_dack_mss(struct socket *so, int on_off)
+{
+ set_tcb_tflag(so, S_TF_DACK_MSS, on_off);
+}
+
/*
* Send a SET_TCB_FIELD CPL message to change a connection's TOS setting.
*/
@@ -2052,6 +2065,7 @@ new_rx_data_ddp(struct toepcb *toep, struct mbuf *m)
unsigned int ddp_len, rcv_nxt, ddp_report, end_offset, buf_idx;
struct socket *so = toeptoso(toep);
int nomoredata = 0;
+ unsigned int delack_mode;
tp = sototcpcb(so);
@@ -2091,6 +2105,12 @@ new_rx_data_ddp(struct toepcb *toep, struct mbuf *m)
ddp_len = ntohs(hdr->len);
rcv_nxt = ntohl(hdr->seq) + ddp_len;
+ delack_mode = G_DDP_DACK_MODE(ddp_report);
+ if (__predict_false(G_DDP_DACK_MODE(ddp_report) != toep->tp_delack_mode)) {
+ toep->tp_delack_mode = delack_mode;
+ toep->tp_delack_seq = tp->rcv_nxt;
+ }
+
m->m_seq = tp->rcv_nxt;
tp->rcv_nxt = rcv_nxt;
@@ -2153,11 +2173,10 @@ new_rx_data_ddp(struct toepcb *toep, struct mbuf *m)
if (nomoredata)
m->m_ddp_flags |= DDP_BF_NODATA;
- if (__predict_false(G_DDP_DACK_MODE(ddp_report) != toep->tp_delack_mode)) {
- toep->tp_delack_mode = G_DDP_DACK_MODE(ddp_report);
- toep->tp_delack_seq = tp->rcv_nxt;
- }
-
+#ifdef notyet
+ skb_reset_transport_header(skb);
+ tcp_hdr(skb)->fin = 0; /* changes original hdr->ddp_report */
+#endif
SBAPPEND(&so->so_rcv, m);
if ((so->so_state & SS_NOFDREF) == 0)
@@ -2202,7 +2221,7 @@ process_ddp_complete(struct toepcb *toep, struct mbuf *m)
struct ddp_state *q;
struct ddp_buf_state *bsp;
struct cpl_rx_ddp_complete *hdr;
- unsigned int ddp_report, buf_idx, when;
+ unsigned int ddp_report, buf_idx, when, delack_mode;
int nomoredata = 0;
INP_LOCK(tp->t_inpcb);
@@ -2226,16 +2245,19 @@ process_ddp_complete(struct toepcb *toep, struct mbuf *m)
m->m_len = m->m_pkthdr.len = G_DDP_OFFSET(ddp_report) - when;
tp->rcv_nxt += m->m_len;
tp->t_rcvtime = ticks;
+
+ delack_mode = G_DDP_DACK_MODE(ddp_report);
+ if (__predict_false(G_DDP_DACK_MODE(ddp_report) != toep->tp_delack_mode)) {
+ toep->tp_delack_mode = delack_mode;
+ toep->tp_delack_seq = tp->rcv_nxt;
+ }
+#ifdef notyet
+ skb_reset_transport_header(skb);
+ tcp_hdr(skb)->fin = 0; /* changes valid memory past CPL */
+#endif
INP_UNLOCK(tp->t_inpcb);
KASSERT(m->m_len > 0, ("%s m_len=%d", __FUNCTION__, m->m_len));
-#ifdef T3_TRACE
- T3_TRACE5(TIDTB(sk),
- "process_ddp_complete: tp->rcv_nxt 0x%x cur_offset %u "
- "ddp_report 0x%x offset %u, len %u",
- tp->rcv_nxt, bsp->cur_offset, ddp_report,
- G_DDP_OFFSET(ddp_report), skb->len);
-#endif
CTR5(KTR_TOM,
"process_ddp_complete: tp->rcv_nxt 0x%x cur_offset %u "
"ddp_report 0x%x offset %u, len %u",
@@ -2250,13 +2272,6 @@ process_ddp_complete(struct toepcb *toep, struct mbuf *m)
nomoredata=1;
}
-#ifdef T3_TRACE
- T3_TRACE4(TIDTB(sk),
- "process_ddp_complete: tp->rcv_nxt 0x%x cur_offset %u "
- "ddp_report %u offset %u",
- tp->rcv_nxt, bsp->cur_offset, ddp_report,
- G_DDP_OFFSET(ddp_report));
-#endif
CTR4(KTR_TOM,
"process_ddp_complete: tp->rcv_nxt 0x%x cur_offset %u "
"ddp_report %u offset %u",
@@ -2271,6 +2286,7 @@ process_ddp_complete(struct toepcb *toep, struct mbuf *m)
if (nomoredata)
m->m_ddp_flags |= DDP_BF_NODATA;
+
SBAPPEND(&so->so_rcv, m);
if ((so->so_state & SS_NOFDREF) == 0)
@@ -2369,6 +2385,10 @@ handle_peer_close_data(struct socket *so, struct mbuf *m)
bsp->cur_offset += m->m_pkthdr.len;
if (!(bsp->flags & DDP_BF_NOFLIP))
q->cur_buf ^= 1;
+#ifdef notyet
+ skb_reset_transport_header(skb);
+ tcp_hdr(skb)->fin = 0; /* changes valid memory past CPL */
+#endif
tp->t_rcvtime = ticks;
SBAPPEND(&so->so_rcv, m);
if (__predict_true((so->so_state & SS_NOFDREF) == 0))
@@ -4006,7 +4026,8 @@ mk_set_tcb_field_ulp(struct cpl_set_tcb_field *req, unsigned int tid,
* Build a CPL_RX_DATA_ACK message as payload of a ULP_TX_PKT command.
*/
static void
-mk_rx_data_ack_ulp(struct cpl_rx_data_ack *ack, unsigned int tid, unsigned int credits)
+mk_rx_data_ack_ulp(struct socket *so,struct cpl_rx_data_ack *ack,
+ unsigned int tid, unsigned int credits)
{
struct ulp_txpkt *txpkt = (struct ulp_txpkt *)ack;
@@ -4014,7 +4035,8 @@ mk_rx_data_ack_ulp(struct cpl_rx_data_ack *ack, unsigned int tid, unsigned int c
txpkt->len = htonl(V_ULPTX_NFLITS(sizeof(*ack) / 8));
OPCODE_TID(ack) = htonl(MK_OPCODE_TID(CPL_RX_DATA_ACK, tid));
ack->credit_dack = htonl(F_RX_MODULATE | F_RX_DACK_CHANGE |
- V_RX_DACK_MODE(1) | V_RX_CREDITS(credits));
+ V_RX_DACK_MODE(TOM_TUNABLE(TOE_DEV(so), delack)) |
+ V_RX_CREDITS(credits));
}
void
@@ -4216,8 +4238,9 @@ t3_setup_ddpbufs(struct toepcb *toep, unsigned int len0, unsigned int offset0,
ddp_flags);
if (modulate) {
- mk_rx_data_ack_ulp((struct cpl_rx_data_ack *)(req + 1), toep->tp_tid,
- toep->tp_copied_seq - toep->tp_rcv_wup);
+ mk_rx_data_ack_ulp(toeptoso(toep),
+ (struct cpl_rx_data_ack *)(req + 1), toep->tp_tid,
+ toep->tp_copied_seq - toep->tp_rcv_wup);
toep->tp_rcv_wup = toep->tp_copied_seq;
}
diff --git a/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c b/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c
index 6edeacd0c49c..858c5ef07ccb 100644
--- a/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c
+++ b/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c
@@ -825,7 +825,7 @@ skip_copy:
sbdrop_locked(&so->so_rcv, m->m_pkthdr.len);
#endif
exitnow = got_psh || nomoredata;
- if ((so->so_rcv.sb_mb == NULL) && exitnow)
+ if (copied >= target && (so->so_rcv.sb_mb == NULL) && exitnow)
goto done;
if (copied_unacked > (so->so_rcv.sb_hiwat >> 2)) {
SOCKBUF_UNLOCK(&so->so_rcv);
@@ -917,7 +917,7 @@ cxgb_soreceive(struct socket *so, struct sockaddr **psa, struct uio *uio,
*
*/
- if ((tp->t_flags & TF_TOE) && uio && ((flags & (MSG_WAITALL|MSG_OOB|MSG_PEEK|MSG_DONTWAIT)) == 0)
+ if ((tp->t_flags & TF_TOE) && uio && ((flags & (MSG_OOB|MSG_PEEK|MSG_DONTWAIT)) == 0)
&& (uio->uio_iovcnt == 1) && (mp0 == NULL)) {
tdev = TOE_DEV(so);
zcopy_thres = TOM_TUNABLE(tdev, ddp_thres);
diff --git a/sys/dev/cxgb/ulp/tom/cxgb_ddp.c b/sys/dev/cxgb/ulp/tom/cxgb_ddp.c
index 8bdcb6578bc7..81c73164ba0b 100644
--- a/sys/dev/cxgb/ulp/tom/cxgb_ddp.c
+++ b/sys/dev/cxgb/ulp/tom/cxgb_ddp.c
@@ -654,7 +654,8 @@ t3_enter_ddp(struct socket *so, unsigned int kbuf_size, unsigned int waitall, in
t3_set_rcv_coalesce_enable(so,
TOM_TUNABLE(TOE_DEV(so), ddp_rcvcoalesce));
-
+ t3_set_dack_mss(so, TOM_TUNABLE(TOE_DEV(so), delack)>>1);
+
#ifdef T3_TRACE
T3_TRACE4(TIDTB(so),
"t3_enter_ddp: kbuf_size %u waitall %u tag0 %d tag1 %d",
diff --git a/sys/dev/cxgb/ulp/tom/cxgb_defs.h b/sys/dev/cxgb/ulp/tom/cxgb_defs.h
index 8989fd911df2..2800a853e885 100644
--- a/sys/dev/cxgb/ulp/tom/cxgb_defs.h
+++ b/sys/dev/cxgb/ulp/tom/cxgb_defs.h
@@ -78,6 +78,7 @@ void toepcb_release(struct toepcb *);
void toepcb_init(struct toepcb *);
void t3_set_rcv_coalesce_enable(struct socket *so, int on_off);
+void t3_set_dack_mss(struct socket *so, int on);
void t3_set_keepalive(struct socket *so, int on_off);
void t3_set_ddp_tag(struct socket *so, int buf_idx, unsigned int tag);
void t3_set_ddp_buf(struct socket *so, int buf_idx, unsigned int offset,