提交 60948a41 编写于 作者: R Ralph Campbell 提交者: Roland Dreier

IB/ipath: Port config has on-chip effects for 7220

The number of configured ports for the 7220 changes the number of eager
TIDs available per port, for all but port 0 (kernel port) which remains
constant, so add a field to give port0 count separate from the portdata
structure.
Signed-off-by: NRalph Campbell <ralph.campbell@qlogic.com>
Signed-off-by: NRoland Dreier <rolandd@cisco.com>
上级 a18e26ae
...@@ -882,7 +882,7 @@ static int ipath_create_user_egr(struct ipath_portdata *pd) ...@@ -882,7 +882,7 @@ static int ipath_create_user_egr(struct ipath_portdata *pd)
egrcnt = dd->ipath_rcvegrcnt; egrcnt = dd->ipath_rcvegrcnt;
/* TID number offset for this port */ /* TID number offset for this port */
egroff = pd->port_port * egrcnt; egroff = (pd->port_port - 1) * egrcnt + dd->ipath_p0_rcvegrcnt;
egrsize = dd->ipath_rcvegrbufsize; egrsize = dd->ipath_rcvegrbufsize;
ipath_cdbg(VERBOSE, "Allocating %d egr buffers, at egrtid " ipath_cdbg(VERBOSE, "Allocating %d egr buffers, at egrtid "
"offset %x, egrsize %u\n", egrcnt, egroff, egrsize); "offset %x, egrsize %u\n", egrcnt, egroff, egrsize);
......
...@@ -1669,6 +1669,14 @@ static void ipath_ht_free_irq(struct ipath_devdata *dd) ...@@ -1669,6 +1669,14 @@ static void ipath_ht_free_irq(struct ipath_devdata *dd)
dd->ipath_intconfig = 0; dd->ipath_intconfig = 0;
} }
static void ipath_ht_config_ports(struct ipath_devdata *dd, ushort cfgports)
{
dd->ipath_portcnt =
ipath_read_kreg32(dd, dd->ipath_kregs->kr_portcnt);
dd->ipath_p0_rcvegrcnt =
ipath_read_kreg32(dd, dd->ipath_kregs->kr_rcvegrcnt);
}
static void ipath_ht_read_counters(struct ipath_devdata *dd, static void ipath_ht_read_counters(struct ipath_devdata *dd,
struct infinipath_counters *cntrs) struct infinipath_counters *cntrs)
{ {
...@@ -1798,6 +1806,7 @@ void ipath_init_iba6110_funcs(struct ipath_devdata *dd) ...@@ -1798,6 +1806,7 @@ void ipath_init_iba6110_funcs(struct ipath_devdata *dd)
dd->ipath_f_setextled = ipath_setup_ht_setextled; dd->ipath_f_setextled = ipath_setup_ht_setextled;
dd->ipath_f_get_base_info = ipath_ht_get_base_info; dd->ipath_f_get_base_info = ipath_ht_get_base_info;
dd->ipath_f_free_irq = ipath_ht_free_irq; dd->ipath_f_free_irq = ipath_ht_free_irq;
dd->ipath_f_config_ports = ipath_ht_config_ports;
dd->ipath_f_read_counters = ipath_ht_read_counters; dd->ipath_f_read_counters = ipath_ht_read_counters;
/* /*
......
...@@ -1423,6 +1423,14 @@ static void ipath_pe_free_irq(struct ipath_devdata *dd) ...@@ -1423,6 +1423,14 @@ static void ipath_pe_free_irq(struct ipath_devdata *dd)
dd->ipath_irq = 0; dd->ipath_irq = 0;
} }
static void ipath_pe_config_ports(struct ipath_devdata *dd, ushort cfgports)
{
dd->ipath_portcnt =
ipath_read_kreg32(dd, dd->ipath_kregs->kr_portcnt);
dd->ipath_p0_rcvegrcnt =
ipath_read_kreg32(dd, dd->ipath_kregs->kr_rcvegrcnt);
}
static void ipath_pe_read_counters(struct ipath_devdata *dd, static void ipath_pe_read_counters(struct ipath_devdata *dd,
struct infinipath_counters *cntrs) struct infinipath_counters *cntrs)
{ {
...@@ -1581,6 +1589,7 @@ void ipath_init_iba6120_funcs(struct ipath_devdata *dd) ...@@ -1581,6 +1589,7 @@ void ipath_init_iba6120_funcs(struct ipath_devdata *dd)
/* initialize chip-specific variables */ /* initialize chip-specific variables */
dd->ipath_f_tidtemplate = ipath_pe_tidtemplate; dd->ipath_f_tidtemplate = ipath_pe_tidtemplate;
dd->ipath_f_config_ports = ipath_pe_config_ports;
dd->ipath_f_read_counters = ipath_pe_read_counters; dd->ipath_f_read_counters = ipath_pe_read_counters;
/* /*
......
...@@ -91,7 +91,7 @@ static int create_port0_egr(struct ipath_devdata *dd) ...@@ -91,7 +91,7 @@ static int create_port0_egr(struct ipath_devdata *dd)
struct ipath_skbinfo *skbinfo; struct ipath_skbinfo *skbinfo;
int ret; int ret;
egrcnt = dd->ipath_rcvegrcnt; egrcnt = dd->ipath_p0_rcvegrcnt;
skbinfo = vmalloc(sizeof(*dd->ipath_port0_skbinfo) * egrcnt); skbinfo = vmalloc(sizeof(*dd->ipath_port0_skbinfo) * egrcnt);
if (skbinfo == NULL) { if (skbinfo == NULL) {
...@@ -244,8 +244,7 @@ static int init_chip_first(struct ipath_devdata *dd, ...@@ -244,8 +244,7 @@ static int init_chip_first(struct ipath_devdata *dd,
* cfgports. We do still check and report a difference, if * cfgports. We do still check and report a difference, if
* not same (should be impossible). * not same (should be impossible).
*/ */
dd->ipath_portcnt = dd->ipath_f_config_ports(dd, ipath_cfgports);
ipath_read_kreg32(dd, dd->ipath_kregs->kr_portcnt);
if (!ipath_cfgports) if (!ipath_cfgports)
dd->ipath_cfgports = dd->ipath_portcnt; dd->ipath_cfgports = dd->ipath_portcnt;
else if (ipath_cfgports <= dd->ipath_portcnt) { else if (ipath_cfgports <= dd->ipath_portcnt) {
......
...@@ -253,6 +253,7 @@ struct ipath_devdata { ...@@ -253,6 +253,7 @@ struct ipath_devdata {
int (*ipath_f_get_base_info)(struct ipath_portdata *, void *); int (*ipath_f_get_base_info)(struct ipath_portdata *, void *);
/* free irq */ /* free irq */
void (*ipath_f_free_irq)(struct ipath_devdata *); void (*ipath_f_free_irq)(struct ipath_devdata *);
void (*ipath_f_config_ports)(struct ipath_devdata *, ushort);
void (*ipath_f_read_counters)(struct ipath_devdata *, void (*ipath_f_read_counters)(struct ipath_devdata *,
struct infinipath_counters *); struct infinipath_counters *);
struct ipath_ibdev *verbs_dev; struct ipath_ibdev *verbs_dev;
...@@ -326,6 +327,8 @@ struct ipath_devdata { ...@@ -326,6 +327,8 @@ struct ipath_devdata {
u32 ipath_cfgports; u32 ipath_cfgports;
/* count of port 0 hdrqfull errors */ /* count of port 0 hdrqfull errors */
u32 ipath_p0_hdrqfull; u32 ipath_p0_hdrqfull;
/* port 0 number of receive eager buffers */
u32 ipath_p0_rcvegrcnt;
/* /*
* index of last piobuffer we used. Speeds up searching, by * index of last piobuffer we used. Speeds up searching, by
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册