From f4a2d780df8230abab19ecf5c6136dd341e04de8 Mon Sep 17 00:00:00 2001 From: Kip Macy Date: Sun, 9 Sep 2007 20:26:02 +0000 Subject: [PATCH] - Remove filter support Supported by: Chelsio Approved by: re(blanket) --- sys/dev/cxgb/cxgb_main.c | 298 --------------------------------------- 1 file changed, 298 deletions(-) diff --git a/sys/dev/cxgb/cxgb_main.c b/sys/dev/cxgb/cxgb_main.c index 9bdc715e223c..4394ff7080ff 100644 --- a/sys/dev/cxgb/cxgb_main.c +++ b/sys/dev/cxgb/cxgb_main.c @@ -688,114 +688,6 @@ cxgb_free(struct adapter *sc) return; } -static int -alloc_filters(struct adapter *adap) -{ - struct filter_info *p; - int nfilters; - - if ((nfilters = adap->params.mc5.nfilters) == 0) - return (0); - - adap->filters = malloc(nfilters*sizeof(struct filter_info), - M_DEVBUF, M_ZERO|M_WAITOK); - - if (adap->filters == NULL) - return (ENOMEM); - - /* Set the default filters, only need to set non-0 fields here. */ - p = &adap->filters[nfilters - 1]; - p->vlan = 0xfff; - p->vlan_prio = FILTER_NO_VLAN_PRI; - p->pass = p->rss = p->valid = p->locked = 1; - - return (0); -} - -static inline void -set_tcb_field_ulp(struct cpl_set_tcb_field *req, - unsigned int tid, unsigned int word, - uint64_t mask, uint64_t val) -{ - struct ulp_txpkt *txpkt = (struct ulp_txpkt *)req; - - txpkt->cmd_dest = htonl(V_ULPTX_CMD(ULP_TXPKT)); - txpkt->len = htonl(V_ULPTX_NFLITS(sizeof(*req) / 8)); - OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, tid)); - req->reply = V_NO_REPLY(1); - req->cpu_idx = 0; - req->word = htons(word); - req->mask = htobe64(mask); - req->val = htobe64(val); -} - -static int -set_filter(struct adapter *adap, int id, const struct filter_info *f) -{ - int len; - struct mbuf *m; - struct ulp_txpkt *txpkt; - struct work_request_hdr *wr; - struct cpl_pass_open_req *oreq; - struct cpl_set_tcb_field *sreq; - - len = sizeof(*wr) + sizeof(*oreq) + 2 * sizeof(*sreq); - id += t3_mc5_size(&adap->mc5) - adap->params.mc5.nroutes - - adap->params.mc5.nfilters; - - m = m_gethdr(M_TRYWAIT, MT_DATA); - wr = mtod(m, struct work_request_hdr *); - wr->wr_hi = htonl(V_WR_OP(FW_WROPCODE_BYPASS) | F_WR_ATOMIC); - m->m_len = m->m_pkthdr.len = len; - - oreq = (struct cpl_pass_open_req *)(wr + 1); - txpkt = (struct ulp_txpkt *)oreq; - txpkt->cmd_dest = htonl(V_ULPTX_CMD(ULP_TXPKT)); - txpkt->len = htonl(V_ULPTX_NFLITS(sizeof(*oreq) / 8)); - OPCODE_TID(oreq) = htonl(MK_OPCODE_TID(CPL_PASS_OPEN_REQ, id)); - oreq->local_port = htons(f->dport); - oreq->peer_port = htons(f->sport); - oreq->local_ip = htonl(f->dip); - oreq->peer_ip = htonl(f->sip); - oreq->peer_netmask = htonl(f->sip_mask); - oreq->opt0h = 0; - oreq->opt0l = htonl(F_NO_OFFLOAD); - oreq->opt1 = htonl(V_MAC_MATCH_VALID(f->mac_vld) | - V_CONN_POLICY(CPL_CONN_POLICY_FILTER) | - V_VLAN_PRI(f->vlan_prio >> 1) | - V_VLAN_PRI_VALID(f->vlan_prio != FILTER_NO_VLAN_PRI) | - V_PKT_TYPE(f->pkt_type) | V_OPT1_VLAN(f->vlan) | - V_MAC_MATCH(f->mac_idx | (f->mac_hit << 4))); - - sreq = (struct cpl_set_tcb_field *)(oreq + 1); - set_tcb_field_ulp(sreq, id, 1, 0x1800808000ULL, - (f->report_filter_id << 15) | (1 << 23) | - ((u64)f->pass << 35) | ((u64)!f->rss << 36)); - set_tcb_field_ulp(sreq + 1, id, 25, 0x3f80000, - (u64)adap->rrss_map[f->qset] << 19); - t3_mgmt_tx(adap, m); - return 0; -} - -static int -setup_hw_filters(struct adapter *adap) -{ - int i, err; - -#ifndef USE_FILTERS - return (0); -#endif - if (adap->filters == NULL) - return 0; - - t3_enable_filters(adap); - - for (i = err = 0; i < adap->params.mc5.nfilters && !err; i++) - if (adap->filters[i].locked) - err = set_filter(adap, i, &adap->filters[i]); - return err; -} - /** * setup_sge_qsets - configure SGE Tx/Rx/response queues * @sc: the controller softc @@ -1563,7 +1455,6 @@ cxgb_up(struct adapter *sc) if (err) goto out; - alloc_filters(sc); setup_rss(sc); sc->flags |= FULL_INIT_DONE; } @@ -1600,7 +1491,6 @@ cxgb_up(struct adapter *sc) if (!(sc->flags & QUEUES_BOUND)) { printf("bind qsets\n"); bind_qsets(sc); - setup_hw_filters(sc); sc->flags |= QUEUES_BOUND; } out: @@ -2228,121 +2118,6 @@ touch_bars(device_t dev) #endif } -#if 0 -static void * -filter_get_idx(struct seq_file *seq, loff_t pos) -{ - int i; - struct adapter *adap = seq->private; - struct filter_info *p = adap->filters; - - if (!p) - return NULL; - - for (i = 0; i < adap->params.mc5.nfilters; i++, p++) - if (p->valid) { - if (!pos) - return p; - pos--; - } - return NULL; -} - -static void *filter_get_nxt_idx(struct seq_file *seq, struct filter_info *p) -{ - struct adapter *adap = seq->private; - struct filter_info *end = &adap->filters[adap->params.mc5.nfilters]; - - while (++p < end && !p->valid) - ; - return p < end ? p : NULL; -} - -static void *filter_seq_start(struct seq_file *seq, loff_t *pos) -{ - return *pos ? filter_get_idx(seq, *pos - 1) : SEQ_START_TOKEN; -} - -static void *filter_seq_next(struct seq_file *seq, void *v, loff_t *pos) -{ - v = *pos ? filter_get_nxt_idx(seq, v) : filter_get_idx(seq, 0); - if (v) - ++*pos; - return v; -} - -static void filter_seq_stop(struct seq_file *seq, void *v) -{ -} - -static int filter_seq_show(struct seq_file *seq, void *v) -{ - static const char *pkt_type[] = { "any", "tcp", "udp", "frag" }; - - if (v == SEQ_START_TOKEN) - seq_puts(seq, "index SIP DIP sport " - "dport VLAN PRI MAC type Q\n"); - else { - char sip[20], dip[20]; - struct filter_info *f = v; - struct adapter *adap = seq->private; - - sprintf(sip, NIPQUAD_FMT "/%-2u", HIPQUAD(f->sip), - f->sip_mask ? 33 - ffs(f->sip_mask) : 0); - sprintf(dip, NIPQUAD_FMT, HIPQUAD(f->dip)); - seq_printf(seq, "%5zu %18s %15s ", f - adap->filters, sip, dip); - seq_printf(seq, f->sport ? "%5u " : " * ", f->sport); - seq_printf(seq, f->dport ? "%5u " : " * ", f->dport); - seq_printf(seq, f->vlan != 0xfff ? "%4u " : " * ", f->vlan); - seq_printf(seq, f->vlan_prio == FILTER_NO_VLAN_PRI ? - " * " : "%1u/%1u ", f->vlan_prio, f->vlan_prio | 1); - if (!f->mac_vld) - seq_printf(seq, " * "); - else if (f->mac_hit) - seq_printf(seq, "%3u ", f->mac_idx); - else - seq_printf(seq, " -1 "); - seq_printf(seq, "%4s ", pkt_type[f->pkt_type]); - if (!f->pass) - seq_printf(seq, "-\n"); - else if (f->rss) - seq_printf(seq, "*\n"); - else - seq_printf(seq, "%1u\n", f->qset); - } - return 0; -} - -static struct seq_operations filter_seq_ops = { - .start = filter_seq_start, - .next = filter_seq_next, - .stop = filter_seq_stop, - .show = filter_seq_show -}; - -static int filter_seq_open(struct inode *inode, struct file *file) -{ - int rc = seq_open(file, &filter_seq_ops); - - if (!rc) { - struct proc_dir_entry *dp = PDE(inode); - struct seq_file *seq = file->private_data; - - seq->private = dp->data; - } - return rc; -} - -static struct file_operations filter_seq_fops = { - .owner = THIS_MODULE, - .open = filter_seq_open, - .read = seq_read, - .llseek = seq_lseek, - .release = seq_release -}; - -#endif - static int set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset) { @@ -2660,79 +2435,6 @@ cxgb_extension_ioctl(struct cdev *dev, unsigned long cmd, caddr_t data, m->nmtus = NMTUS; break; } - case CHELSIO_SET_FILTER: { - struct ch_filter *f = (struct ch_filter *)data; - struct filter_info *p; - int ret; - - if (sc->params.mc5.nfilters == 0) - return (EOPNOTSUPP); - if (!(sc->flags & FULL_INIT_DONE)) - return (EAGAIN); /* can still change nfilters */ - if (sc->filters == NULL) - return (ENOMEM); - - if (f->filter_id >= sc->params.mc5.nfilters || - (f->val.dip && f->mask.dip != 0xffffffff) || - (f->val.sport && f->mask.sport != 0xffff) || - (f->val.dport && f->mask.dport != 0xffff) || - (f->mask.vlan && f->mask.vlan != 0xfff) || - (f->mask.vlan_prio && f->mask.vlan_prio != 7) || - (f->mac_addr_idx != 0xffff && f->mac_addr_idx > 15) || - f->qset >= SGE_QSETS || - sc->rrss_map[f->qset] >= RSS_TABLE_SIZE) - return (EINVAL); - - p = &sc->filters[f->filter_id]; - if (p->locked) - return (EPERM); - - p->sip = f->val.sip; - p->sip_mask = f->mask.sip; - p->dip = f->val.dip; - p->sport = f->val.sport; - p->dport = f->val.dport; - p->vlan = f->mask.vlan ? f->val.vlan : 0xfff; - p->vlan_prio = f->mask.vlan_prio ? (f->val.vlan_prio & 6) : - FILTER_NO_VLAN_PRI; - p->mac_hit = f->mac_hit; - p->mac_vld = f->mac_addr_idx != 0xffff; - p->mac_idx = f->mac_addr_idx; - p->pkt_type = f->proto; - p->report_filter_id = f->want_filter_id; - p->pass = f->pass; - p->rss = f->rss; - p->qset = f->qset; - - ret = set_filter(sc, f->filter_id, p); - if (ret) - return ret; - p->valid = 1; - break; - } - case CHELSIO_DEL_FILTER: { - struct ch_filter *f = (struct ch_filter *)data; - struct filter_info *p; - - if (sc->params.mc5.nfilters == 0) - return (EOPNOTSUPP); - if (!(sc->flags & FULL_INIT_DONE)) - return (EAGAIN); /* can still change nfilters */ - if (sc->filters == NULL) - return (ENOMEM); - if (f->filter_id >= sc->params.mc5.nfilters) - return (EINVAL); - - p = &sc->filters[f->filter_id]; - if (p->locked) - return (EPERM); - memset(p, 0, sizeof(*p)); - p->sip_mask = 0xffffffff; - p->vlan = 0xfff; - p->vlan_prio = FILTER_NO_VLAN_PRI; - p->pkt_type = 1; - return set_filter(sc, f->filter_id, p); - } case CHELSIO_DEVUP: if (!is_offload(sc)) return (EOPNOTSUPP);