aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorNavdeep Parhar <np@FreeBSD.org>2011-03-08 03:04:07 +0000
committerNavdeep Parhar <np@FreeBSD.org>2011-03-08 03:04:07 +0000
commit945861930970b2a59a494d428e002170fcb467e7 (patch)
treef6247b595182235d2a388b6380af7a51ba29eb37 /sys/dev
parent3b613c28c5f8ea1e96740ac6fe0681a4a83f8095 (diff)
downloadsrc-945861930970b2a59a494d428e002170fcb467e7.tar.gz
src-945861930970b2a59a494d428e002170fcb467e7.zip
cxgbe shouldn't directly know of the UMA zones where network buffers
come from. MFC after: 1 week
Notes
Notes: svn path=/head/; revision=219392
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/cxgbe/adapter.h7
-rw-r--r--sys/dev/cxgbe/t4_main.c14
-rw-r--r--sys/dev/cxgbe/t4_sge.c49
3 files changed, 48 insertions, 22 deletions
diff --git a/sys/dev/cxgbe/adapter.h b/sys/dev/cxgbe/adapter.h
index a514bbb5efb5..e788eed6824f 100644
--- a/sys/dev/cxgbe/adapter.h
+++ b/sys/dev/cxgbe/adapter.h
@@ -115,7 +115,11 @@ enum {
RX_FL_ESIZE = 64, /* 8 64bit addresses */
- FL_BUF_SIZES = 4,
+#if MJUMPAGESIZE != MCLBYTES
+ FL_BUF_SIZES = 4, /* cluster, jumbop, jumbo9k, jumbo16k */
+#else
+ FL_BUF_SIZES = 3, /* cluster, jumbo9k, jumbo16k */
+#endif
TX_EQ_QSIZE = 1024,
TX_EQ_ESIZE = 64,
@@ -562,6 +566,7 @@ void t4_os_portmod_changed(const struct adapter *, int);
void t4_os_link_changed(struct adapter *, int, int);
/* t4_sge.c */
+void t4_sge_modload(void);
void t4_sge_init(struct adapter *);
int t4_create_dma_tag(struct adapter *);
int t4_destroy_dma_tag(struct adapter *);
diff --git a/sys/dev/cxgbe/t4_main.c b/sys/dev/cxgbe/t4_main.c
index 1c38faf83421..68221b26c994 100644
--- a/sys/dev/cxgbe/t4_main.c
+++ b/sys/dev/cxgbe/t4_main.c
@@ -278,7 +278,7 @@ static int sysctl_qsize_rxq(SYSCTL_HANDLER_ARGS);
static int sysctl_qsize_txq(SYSCTL_HANDLER_ARGS);
static int sysctl_handle_t4_reg64(SYSCTL_HANDLER_ARGS);
static inline void txq_start(struct ifnet *, struct sge_txq *);
-
+static int t4_mod_event(module_t, int, void *);
struct t4_pciids {
uint16_t device;
@@ -2815,10 +2815,20 @@ t4_ioctl(struct cdev *dev, unsigned long cmd, caddr_t data, int fflag,
return (rc);
}
+static int
+t4_mod_event(module_t mod, int cmd, void *arg)
+{
+
+ if (cmd == MOD_LOAD)
+ t4_sge_modload();
+
+ return (0);
+}
+
static devclass_t t4_devclass;
static devclass_t cxgbe_devclass;
-DRIVER_MODULE(t4nex, pci, t4_driver, t4_devclass, 0, 0);
+DRIVER_MODULE(t4nex, pci, t4_driver, t4_devclass, t4_mod_event, 0);
MODULE_VERSION(t4nex, 1);
DRIVER_MODULE(cxgbe, t4nex, cxgbe_driver, cxgbe_devclass, 0, 0);
diff --git a/sys/dev/cxgbe/t4_sge.c b/sys/dev/cxgbe/t4_sge.c
index 8bdab95fa947..de753648117b 100644
--- a/sys/dev/cxgbe/t4_sge.c
+++ b/sys/dev/cxgbe/t4_sge.c
@@ -58,13 +58,9 @@ struct fl_buf_info {
uma_zone_t zone;
};
-/* t4_sge_init will fill up the zone */
-static struct fl_buf_info fl_buf_info[FL_BUF_SIZES] = {
- { MCLBYTES, EXT_CLUSTER, NULL},
- { MJUMPAGESIZE, EXT_JUMBOP, NULL},
- { MJUM9BYTES, EXT_JUMBO9, NULL},
- { MJUM16BYTES, EXT_JUMBO16, NULL}
-};
+/* Filled up by t4_sge_modload */
+static struct fl_buf_info fl_buf_info[FL_BUF_SIZES];
+
#define FL_BUF_SIZE(x) (fl_buf_info[x].size)
#define FL_BUF_TYPE(x) (fl_buf_info[x].type)
#define FL_BUF_ZONE(x) (fl_buf_info[x].zone)
@@ -142,6 +138,29 @@ static __be64 get_flit(bus_dma_segment_t *, int, int);
static int handle_sge_egr_update(struct adapter *,
const struct cpl_sge_egr_update *);
+/*
+ * Called on MOD_LOAD and fills up fl_buf_info[].
+ */
+void
+t4_sge_modload(void)
+{
+ int i;
+ int bufsize[FL_BUF_SIZES] = {
+ MCLBYTES,
+#if MJUMPAGESIZE != MCLBYTES
+ MJUMPAGESIZE,
+#endif
+ MJUM9BYTES,
+ MJUM16BYTES
+ };
+
+ for (i = 0; i < FL_BUF_SIZES; i++) {
+ FL_BUF_SIZE(i) = bufsize[i];
+ FL_BUF_TYPE(i) = m_gettype(bufsize[i]);
+ FL_BUF_ZONE(i) = m_getzone(bufsize[i]);
+ }
+}
+
/**
* t4_sge_init - initialize SGE
* @sc: the adapter
@@ -156,11 +175,6 @@ t4_sge_init(struct adapter *sc)
struct sge *s = &sc->sge;
int i;
- FL_BUF_ZONE(0) = zone_clust;
- FL_BUF_ZONE(1) = zone_jumbop;
- FL_BUF_ZONE(2) = zone_jumbo9;
- FL_BUF_ZONE(3) = zone_jumbo16;
-
t4_set_reg_field(sc, A_SGE_CONTROL, V_PKTSHIFT(M_PKTSHIFT) |
V_INGPADBOUNDARY(M_INGPADBOUNDARY) |
F_EGRSTATUSPAGESIZE,
@@ -584,7 +598,7 @@ t4_intr_data(void *arg)
bus_dmamap_sync(fl->tag[sd->tag_idx], sd->map,
BUS_DMASYNC_POSTREAD);
- m_init(m0, zone_mbuf, MLEN, M_NOWAIT, MT_DATA, M_PKTHDR);
+ m_init(m0, NULL, 0, M_NOWAIT, MT_DATA, M_PKTHDR);
if (len < MINCLSIZE) {
/* copy data to mbuf, buffer will be recycled */
bcopy(sd->cl, mtod(m0, caddr_t), len);
@@ -645,7 +659,7 @@ t4_intr_data(void *arg)
bus_dmamap_sync(fl->tag[sd->tag_idx], sd->map,
BUS_DMASYNC_POSTREAD);
- m_init(m, zone_mbuf, MLEN, M_NOWAIT, MT_DATA, 0);
+ m_init(m, NULL, 0, M_NOWAIT, MT_DATA, 0);
if (len <= MLEN) {
bcopy(sd->cl, mtod(m, caddr_t), len);
m->m_len = len;
@@ -1600,9 +1614,6 @@ alloc_fl_sdesc(struct sge_fl *fl)
rc = bus_dmamap_create(tag, 0, &sd->map);
if (rc != 0)
goto failed;
-
- /* Doesn't matter if this succeeds or not */
- sd->m = m_gethdr(M_NOWAIT, MT_NOINIT);
}
return (0);
@@ -1611,7 +1622,7 @@ failed:
sd--;
bus_dmamap_destroy(tag, sd->map);
if (sd->m) {
- m_init(sd->m, zone_mbuf, MLEN, M_NOWAIT, MT_DATA, 0);
+ m_init(sd->m, NULL, 0, M_NOWAIT, MT_DATA, 0);
m_free(sd->m);
sd->m = NULL;
}
@@ -1636,7 +1647,7 @@ free_fl_sdesc(struct sge_fl *fl)
for (i = 0; i < fl->cap; i++, sd++) {
if (sd->m) {
- m_init(sd->m, zone_mbuf, MLEN, M_NOWAIT, MT_DATA, 0);
+ m_init(sd->m, NULL, 0, M_NOWAIT, MT_DATA, 0);
m_free(sd->m);
sd->m = NULL;
}