egrcnt = dd->ipath_rcvegrcnt;
        /* 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;
        ipath_cdbg(VERBOSE, "Allocating %d egr buffers, at egrtid "
                   "offset %x, egrsize %u\n", egrcnt, egroff, egrsize);
 
        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,
                                   struct infinipath_counters *cntrs)
 {
        dd->ipath_f_setextled = ipath_setup_ht_setextled;
        dd->ipath_f_get_base_info = ipath_ht_get_base_info;
        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_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,
                                   struct infinipath_counters *cntrs)
 {
 
        /* initialize chip-specific variables */
        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;
 
        /*
 
        struct ipath_skbinfo *skbinfo;
        int ret;
 
-       egrcnt = dd->ipath_rcvegrcnt;
+       egrcnt = dd->ipath_p0_rcvegrcnt;
 
        skbinfo = vmalloc(sizeof(*dd->ipath_port0_skbinfo) * egrcnt);
        if (skbinfo == NULL) {
         * cfgports.  We do still check and report a difference, if
         * not same (should be impossible).
         */
-       dd->ipath_portcnt =
-               ipath_read_kreg32(dd, dd->ipath_kregs->kr_portcnt);
+       dd->ipath_f_config_ports(dd, ipath_cfgports);
        if (!ipath_cfgports)
                dd->ipath_cfgports = dd->ipath_portcnt;
        else if (ipath_cfgports <= dd->ipath_portcnt) {
 
        int (*ipath_f_get_base_info)(struct ipath_portdata *, void *);
        /* free irq */
        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 *,
                                      struct infinipath_counters *);
        struct ipath_ibdev *verbs_dev;
        u32 ipath_cfgports;
        /* count of port 0 hdrqfull errors */
        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