void t3_init_tunables(struct tom_data *t) { t->conf = default_tunable_vals; /* Adjust tunables */ t->conf.activated = activated; t->conf.ddp = ddp; /* Now apply device specific fixups. */ t->conf.mss = T3C_DATA(t->cdev)->tx_max_chunk; t->conf.max_wrs = T3C_DATA(t->cdev)->max_wrs; }
static int do_abort_req_rss(struct t3cdev *dev, struct mbuf *m) { union opcode_tid *p = cplhdr(m); unsigned int hwtid = G_TID(ntohl(p->opcode_tid)); struct toe_tid_entry *toe_tid; toe_tid = lookup_tid(&(T3C_DATA (dev))->tid_maps, hwtid); if (toe_tid->ctx && toe_tid->client->handlers && toe_tid->client->handlers[p->opcode]) { return toe_tid->client->handlers[p->opcode] (dev, m, toe_tid->ctx); } else { struct cpl_abort_req_rss *req = cplhdr(m); struct cpl_abort_rpl *rpl; struct mbuf *m = m_get(M_NOWAIT, MT_DATA); if (!m) { log(LOG_NOTICE, "do_abort_req_rss: couldn't get mbuf!\n"); goto out; } m_set_priority(m, CPL_PRIORITY_DATA); rpl = cplhdr(m); rpl->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_HOST_ABORT_CON_RPL)); rpl->wr.wr_lo = htonl(V_WR_TID(GET_TID(req))); OPCODE_TID(rpl) = htonl(MK_OPCODE_TID(CPL_ABORT_RPL, GET_TID(req))); rpl->cmd = req->status; cxgb_ofld_send(dev, m); out: return (CPL_RET_BUF_DONE); } }
static void set_emss(struct iwch_ep *ep, u16 opt) { PDBG("%s ep %p opt %u\n", __func__, ep, opt); ep->emss = T3C_DATA(ep->com.tdev)->mtus[G_TCPOPT_MSS(opt)] - 40; if (G_TCPOPT_TSTAMP(opt)) ep->emss -= 12; if (ep->emss < 128) ep->emss = 128; PDBG("emss=%d\n", ep->emss); }
void cxgb_offload_deactivate(struct adapter *adapter) { struct t3cdev *tdev = &adapter->tdev; struct t3c_data *t = T3C_DATA(tdev); printf("removing adapter %p\n", adapter); remove_adapter(adapter); if (TAILQ_EMPTY(&adapter_list)) { #if defined(CONFIG_CHELSIO_T3_MODULE) restore_arp_sans_t3core(); #endif } free_tid_maps(&t->tid_maps); T3C_DATA(tdev) = NULL; t3_free_l2t(L2DATA(tdev)); L2DATA(tdev) = NULL; mtx_destroy(&t->tid_release_lock); free(t, M_CXGB); }
static int do_stid_rpl(struct t3cdev *dev, struct mbuf *m) { union opcode_tid *p = cplhdr(m); unsigned int stid = G_TID(ntohl(p->opcode_tid)); struct toe_tid_entry *toe_tid; toe_tid = lookup_stid(&(T3C_DATA (dev))->tid_maps, stid); if (toe_tid->ctx && toe_tid->client->handlers && toe_tid->client->handlers[p->opcode]) { return toe_tid->client->handlers[p->opcode] (dev, m, toe_tid->ctx); } else { log(LOG_ERR, "%s: received clientless CPL command 0x%x\n", dev->name, p->opcode); return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG; } }
static int do_term(struct t3cdev *dev, struct mbuf *m) { unsigned int hwtid = ntohl(m_get_priority(m)) >> 8 & 0xfffff; unsigned int opcode = G_OPCODE(ntohl(m->m_pkthdr.csum_data)); struct toe_tid_entry *toe_tid; toe_tid = lookup_tid(&(T3C_DATA (dev))->tid_maps, hwtid); if (toe_tid && toe_tid->ctx && toe_tid->client->handlers && toe_tid->client->handlers[opcode]) { return toe_tid->client->handlers[opcode](dev, m, toe_tid->ctx); } else { log(LOG_ERR, "%s: received clientless CPL command 0x%x\n", dev->name, opcode); return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG; } return (0); }
static int do_cr(struct t3cdev *dev, struct mbuf *m) { struct cpl_pass_accept_req *req = cplhdr(m); unsigned int stid = G_PASS_OPEN_TID(ntohl(req->tos_tid)); struct toe_tid_entry *toe_tid; toe_tid = lookup_stid(&(T3C_DATA (dev))->tid_maps, stid); if (toe_tid->ctx && toe_tid->client->handlers && toe_tid->client->handlers[CPL_PASS_ACCEPT_REQ]) { return toe_tid->client->handlers[CPL_PASS_ACCEPT_REQ] (dev, m, toe_tid->ctx); } else { log(LOG_ERR, "%s: received clientless CPL command 0x%x\n", dev->name, CPL_PASS_ACCEPT_REQ); return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG; } }
static int do_act_open_rpl(struct t3cdev *dev, struct mbuf *m) { struct cpl_act_open_rpl *rpl = cplhdr(m); unsigned int atid = G_TID(ntohl(rpl->atid)); struct toe_tid_entry *toe_tid; toe_tid = lookup_atid(&(T3C_DATA (dev))->tid_maps, atid); if (toe_tid->ctx && toe_tid->client && toe_tid->client->handlers && toe_tid->client->handlers[CPL_ACT_OPEN_RPL]) { return toe_tid->client->handlers[CPL_ACT_OPEN_RPL] (dev, m, toe_tid->ctx); } else { log(LOG_ERR, "%s: received clientless CPL command 0x%x\n", dev->name, CPL_ACT_OPEN_RPL); return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG; } }
static void t3_process_tid_release_list(void *data, int pending) { struct mbuf *m; struct t3cdev *tdev = data; struct t3c_data *td = T3C_DATA (tdev); mtx_lock(&td->tid_release_lock); while (td->tid_release_list) { struct toe_tid_entry *p = td->tid_release_list; td->tid_release_list = (struct toe_tid_entry *)p->ctx; mtx_unlock(&td->tid_release_lock); m = m_get(M_WAIT, MT_DATA); mk_tid_release(m, p - td->tid_maps.tid_tab); cxgb_ofld_send(tdev, m); p->ctx = NULL; mtx_lock(&td->tid_release_lock); } mtx_unlock(&td->tid_release_lock); }
static int do_act_establish(struct t3cdev *dev, struct mbuf *m) { struct cpl_act_establish *req; unsigned int atid; struct toe_tid_entry *toe_tid; req = cplhdr(m); atid = G_PASS_OPEN_TID(ntohl(req->tos_tid)); toe_tid = lookup_atid(&(T3C_DATA (dev))->tid_maps, atid); if (toe_tid && toe_tid->ctx && toe_tid->client->handlers && toe_tid->client->handlers[CPL_ACT_ESTABLISH]) { return toe_tid->client->handlers[CPL_ACT_ESTABLISH] (dev, m, toe_tid->ctx); } else { log(LOG_ERR, "%s: received clientless CPL command 0x%x\n", dev->name, CPL_ACT_ESTABLISH); return CPL_RET_BUF_DONE | CPL_RET_BAD_MSG; } }
int cxgb_offload_activate(struct adapter *adapter) { struct t3cdev *dev = &adapter->tdev; int natids, err; struct t3c_data *t; struct tid_range stid_range, tid_range; struct mtutab mtutab; unsigned int l2t_capacity; t = malloc(sizeof(*t), M_CXGB, M_NOWAIT|M_ZERO); if (!t) return (ENOMEM); dev->adapter = adapter; err = (EOPNOTSUPP); if (dev->ctl(dev, GET_TX_MAX_CHUNK, &t->tx_max_chunk) < 0 || dev->ctl(dev, GET_MAX_OUTSTANDING_WR, &t->max_wrs) < 0 || dev->ctl(dev, GET_L2T_CAPACITY, &l2t_capacity) < 0 || dev->ctl(dev, GET_MTUS, &mtutab) < 0 || dev->ctl(dev, GET_TID_RANGE, &tid_range) < 0 || dev->ctl(dev, GET_STID_RANGE, &stid_range) < 0) { device_printf(adapter->dev, "%s: dev->ctl check failed\n", __FUNCTION__); goto out_free; } err = (ENOMEM); L2DATA(dev) = t3_init_l2t(l2t_capacity); if (!L2DATA(dev)) { device_printf(adapter->dev, "%s: t3_init_l2t failed\n", __FUNCTION__); goto out_free; } natids = min(tid_range.num / 2, MAX_ATIDS); err = init_tid_tabs(&t->tid_maps, tid_range.num, natids, stid_range.num, ATID_BASE, stid_range.base); if (err) { device_printf(adapter->dev, "%s: init_tid_tabs failed\n", __FUNCTION__); goto out_free_l2t; } t->mtus = mtutab.mtus; t->nmtus = mtutab.size; TASK_INIT(&t->tid_release_task, 0 /* XXX? */, t3_process_tid_release_list, dev); mtx_init(&t->tid_release_lock, "tid release", NULL, MTX_DUPOK|MTX_DEF); t->dev = dev; T3C_DATA (dev) = t; dev->recv = process_rx; dev->arp_update = t3_l2t_update; /* Register netevent handler once */ if (TAILQ_EMPTY(&adapter_list)) { #if defined(CONFIG_CHELSIO_T3_MODULE) if (prepare_arp_with_t3core()) log(LOG_ERR, "Unable to set offload capabilities\n"); #endif } CTR1(KTR_CXGB, "adding adapter %p", adapter); add_adapter(adapter); device_printf(adapter->dev, "offload started\n"); adapter->flags |= CXGB_OFLD_INIT; return (0); out_free_l2t: t3_free_l2t(L2DATA(dev)); L2DATA(dev) = NULL; out_free: free(t, M_CXGB); return (err); }