- Remove filter support

Supported by: Chelsio
Approved by: re(blanket)
This commit is contained in:
Kip Macy 2007-09-09 20:26:02 +00:00
parent 4168e66b1f
commit f4a2d780df
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=172105

View File

@ -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);