summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/pci/if_oce.c186
-rw-r--r--sys/dev/pci/if_ocereg.h85
-rw-r--r--sys/dev/pci/if_ocevar.h197
3 files changed, 173 insertions, 295 deletions
diff --git a/sys/dev/pci/if_oce.c b/sys/dev/pci/if_oce.c
index 40514c48a65..108d19bcdbb 100644
--- a/sys/dev/pci/if_oce.c
+++ b/sys/dev/pci/if_oce.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_oce.c,v 1.36 2012/10/30 17:38:23 mikeb Exp $ */
+/* $OpenBSD: if_oce.c,v 1.37 2012/10/31 20:15:43 mikeb Exp $ */
/*
* Copyright (c) 2012 Mike Belopuhov
@@ -99,7 +99,7 @@
int oce_probe(struct device *parent, void *match, void *aux);
void oce_attach(struct device *parent, struct device *self, void *aux);
void oce_attachhook(void *arg);
-int oce_attach_ifp(struct oce_softc *sc);
+void oce_attach_ifp(struct oce_softc *sc);
int oce_ioctl(struct ifnet *ifp, u_long command, caddr_t data);
void oce_init(void *xsc);
void oce_stop(struct oce_softc *sc);
@@ -206,7 +206,7 @@ int oce_config_vlan(struct oce_softc *sc, uint32_t if_id,
int oce_set_flow_control(struct oce_softc *sc, uint32_t flow_control);
int oce_config_rss(struct oce_softc *sc, uint32_t if_id, int enable);
int oce_update_mcast(struct oce_softc *sc,
- uint8_t multi[][ETH_ADDR_LEN], int naddr);
+ uint8_t multi[][ETHER_ADDR_LEN], int naddr);
int oce_set_promisc(struct oce_softc *sc, int enable);
int oce_get_link_status(struct oce_softc *sc);
@@ -259,14 +259,14 @@ oce_attach(struct device *parent, struct device *self, void *aux)
switch (PCI_PRODUCT(pa->pa_id)) {
case PCI_PRODUCT_SERVERENGINES_BE2:
case PCI_PRODUCT_SERVERENGINES_OCBE2:
- sc->flags |= OCE_FLAGS_BE2;
+ SET(sc->flags, OCE_F_BE2);
break;
case PCI_PRODUCT_SERVERENGINES_BE3:
case PCI_PRODUCT_SERVERENGINES_OCBE3:
- sc->flags |= OCE_FLAGS_BE3;
+ SET(sc->flags, OCE_F_BE3);
break;
case PCI_PRODUCT_EMULEX_XE201:
- sc->flags |= OCE_FLAGS_XE201;
+ SET(sc->flags, OCE_F_XE201);
break;
}
@@ -278,7 +278,7 @@ oce_attach(struct device *parent, struct device *self, void *aux)
sc->tx_ring_size = OCE_TX_RING_SIZE;
sc->rx_ring_size = OCE_RX_RING_SIZE;
sc->rq_frag_size = OCE_RQ_BUF_SIZE;
- sc->flow_control = OCE_DEFAULT_FLOW_CONTROL;
+ sc->flow_control = OCE_FC_TX | OCE_FC_RX;
/* create the bootstrap mailbox */
if (oce_dma_alloc(sc, sizeof(struct oce_bmbx), &sc->bsmbx)) {
@@ -294,17 +294,16 @@ oce_attach(struct device *parent, struct device *self, void *aux)
goto fail_1;
}
- if (IS_BE(sc) && (sc->flags & OCE_FLAGS_BE3)) {
+ if (ISSET(sc->flags, OCE_F_BE3)) {
if (oce_check_native_mode(sc))
goto fail_1;
- } else
- sc->be3_native = 0;
+ }
if (oce_macaddr_get(sc, sc->macaddr)) {
printf(": failed to fetch MAC address\n");
goto fail_1;
}
- bcopy(sc->macaddr, sc->arpcom.ac_enaddr, ETH_ADDR_LEN);
+ bcopy(sc->macaddr, sc->arpcom.ac_enaddr, ETHER_ADDR_LEN);
sc->nrqs = 1;
sc->nwqs = 1;
@@ -316,12 +315,11 @@ oce_attach(struct device *parent, struct device *self, void *aux)
if (oce_init_queues(sc))
goto fail_1;
- if (oce_attach_ifp(sc))
- goto fail_2;
+ oce_attach_ifp(sc);
#ifdef OCE_LRO
if (oce_init_lro(sc))
- goto fail_3;
+ goto fail_2;
#endif
timeout_set(&sc->timer, oce_local_timer, sc);
@@ -334,14 +332,11 @@ oce_attach(struct device *parent, struct device *self, void *aux)
return;
#ifdef OCE_LRO
-fail_4:
- oce_free_lro(sc);
-fail_3:
-#endif
+fail_2:
ether_ifdetach(&sc->arpcom.ac_if);
if_detach(&sc->arpcom.ac_if);
-fail_2:
oce_release_queues(sc);
+#endif
fail_1:
oce_dma_free(sc, &sc->bsmbx);
}
@@ -369,7 +364,7 @@ oce_attachhook(void *arg)
oce_first_mcc(sc);
}
-int
+void
oce_attach_ifp(struct oce_softc *sc)
{
struct ifnet *ifp = &sc->arpcom.ac_if;
@@ -409,8 +404,6 @@ oce_attach_ifp(struct oce_softc *sc)
if_attach(ifp);
ether_ifattach(ifp);
-
- return 0;
}
int
@@ -433,11 +426,9 @@ oce_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
arp_ifinit(&sc->arpcom, ifa);
#endif
break;
-
case SIOCGIFMEDIA:
error = ifmedia_ioctl(ifp, ifr, &sc->media, command);
break;
-
case SIOCSIFMTU:
if (ifr->ifr_mtu > OCE_MAX_MTU)
error = EINVAL;
@@ -446,7 +437,6 @@ oce_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
oce_init(sc);
}
break;
-
case SIOCSIFFLAGS:
if (ifp->if_flags & IFF_UP) {
if (ifp->if_flags & IFF_RUNNING)
@@ -458,7 +448,6 @@ oce_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
oce_stop(sc);
}
break;
-
default:
error = ether_ioctl(ifp, &sc->arpcom, command, data);
break;
@@ -478,7 +467,7 @@ oce_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
void
oce_iff(struct oce_softc *sc)
{
- uint8_t multi[OCE_MAX_MC_FILTER_SIZE][ETH_ADDR_LEN];
+ uint8_t multi[OCE_MAX_MC_FILTER_SIZE][ETHER_ADDR_LEN];
struct ifnet *ifp = &sc->arpcom.ac_if;
struct arpcom *ac = &sc->arpcom;
struct ether_multi *enm;
@@ -494,11 +483,9 @@ oce_iff(struct oce_softc *sc)
} else {
ETHER_FIRST_MULTI(step, &sc->arpcom, enm);
while (enm != NULL) {
- bcopy(enm->enm_addrlo, multi[naddr++], ETH_ADDR_LEN);
-
+ bcopy(enm->enm_addrlo, multi[naddr++], ETHER_ADDR_LEN);
ETHER_NEXT_MULTI(step, enm);
}
-
oce_update_mcast(sc, multi, naddr);
}
@@ -540,7 +527,7 @@ oce_intr(void *arg)
(*cq->cq_intr)(cq->cb_arg);
}
- /* Arm all cqs connected to this EQ */
+ /* Arm all CQs connected to this EQ */
for (i = 0; i < eq->cq_valid; i++) {
cq = eq->cq[i];
oce_arm_cq(cq, 0, TRUE);
@@ -558,7 +545,7 @@ oce_pci_alloc(struct oce_softc *sc)
pcireg_t memtype, reg;
/* setup the device config region */
- if (IS_BE(sc) && (sc->flags & OCE_FLAGS_BE2))
+ if (ISSET(sc->flags, OCE_F_BE2))
reg = OCE_BAR_CFG_BE2;
else
reg = OCE_BAR_CFG;
@@ -585,11 +572,9 @@ oce_pci_alloc(struct oce_softc *sc)
goto fail_1;
}
if (OCE_SLI_IFTYPE(reg) == OCE_INTF_IF_TYPE_1)
- sc->flags |= OCE_FLAGS_MBOX_ENDIAN_RQD;
+ SET(sc->flags, OCE_F_MBOX_ENDIAN_RQD);
if (OCE_SLI_HINT1(reg) == OCE_INTF_FUNC_RESET_REQD)
- sc->flags |= OCE_FLAGS_RESET_RQD;
- if (OCE_SLI_FUNCTION(reg) == OCE_INTF_VIRT_FUNC)
- sc->flags |= OCE_FLAGS_VIRTUAL_PORT;
+ SET(sc->flags, OCE_F_RESET_RQD);
/* Lancer has one BAR (CFG) but BE3 has three (CFG, CSR, DB) */
if (IS_BE(sc)) {
@@ -689,7 +674,7 @@ oce_alloc_intr(struct oce_softc *sc)
intrstr = pci_intr_string(pa->pa_pc, ih);
if (pci_intr_establish(pa->pa_pc, ih, IPL_NET, oce_intr, sc,
sc->dev.dv_xname) == NULL) {
- printf(": couldn't establish interrupt");
+ printf(": couldn't establish interrupt\n");
if (intrstr != NULL)
printf(" at %s", intrstr);
printf("\n");
@@ -801,7 +786,7 @@ oce_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
int
oce_media_change(struct ifnet *ifp)
{
- return 0;
+ return (0);
}
int
@@ -1267,11 +1252,12 @@ oce_discard_rx_comp(struct oce_rq *rq, struct oce_nic_rx_cqe *cqe)
int num_frags = cqe->u0.s.num_fragments;
if (IS_XE201(sc) && cqe->u0.s.error) {
- /* Lancer A0 workaround
+ /*
+ * Lancer A0 workaround:
* num_frags will be 1 more than actual in case of error
*/
if (num_frags)
- num_frags -= 1;
+ num_frags--;
}
for (i = 0; i < num_frags; i++) {
if (rq->packets_out == rq->packets_in) {
@@ -1296,16 +1282,12 @@ int
oce_cqe_vtp_valid(struct oce_softc *sc, struct oce_nic_rx_cqe *cqe)
{
struct oce_nic_rx_cqe_v1 *cqe_v1;
- int vtp = 0;
- if (sc->be3_native) {
+ if (IS_BE(sc) && ISSET(sc->flags, OCE_F_BE3_NATIVE)) {
cqe_v1 = (struct oce_nic_rx_cqe_v1 *)cqe;
- vtp = cqe_v1->u0.s.vlan_tag_present;
- } else
- vtp = cqe->u0.s.vlan_tag_present;
-
- return vtp;
-
+ return (cqe_v1->u0.s.vlan_tag_present);
+ }
+ return (cqe->u0.s.vlan_tag_present);
}
int
@@ -1313,15 +1295,12 @@ oce_cqe_portid_valid(struct oce_softc *sc, struct oce_nic_rx_cqe *cqe)
{
struct oce_nic_rx_cqe_v1 *cqe_v1;
- if (sc->be3_native && IS_BE(sc)) {
+ if (IS_BE(sc) && ISSET(sc->flags, OCE_F_BE3_NATIVE)) {
cqe_v1 = (struct oce_nic_rx_cqe_v1 *)cqe;
if (sc->port_id != cqe_v1->u0.s.port)
- return 0;
- } else
- ;/* For BE3 legacy and Lancer this is dummy */
-
- return 1;
-
+ return (0);
+ }
+ return (1);
}
#ifdef OCE_LRO
@@ -1391,20 +1370,20 @@ oce_get_buf(struct oce_rq *rq)
if (in == OCE_RQ_PACKET_ARRAY_SIZE)
in = 0;
if (in == rq->packets_out)
- return 0; /* no more room */
+ return (0); /* no more room */
pd = &rq->pckts[rq->packets_in];
pd->mbuf = MCLGETI(NULL, M_DONTWAIT, ifp, MCLBYTES);
if (pd->mbuf == NULL)
- return 0;
+ return (0);
pd->mbuf->m_len = pd->mbuf->m_pkthdr.len = MCLBYTES;
if (bus_dmamap_load_mbuf(rq->tag, pd->map, pd->mbuf, BUS_DMA_NOWAIT)) {
m_freem(pd->mbuf);
pd->mbuf = NULL;
- return 0;
+ return (0);
}
rq->packets_in = in;
@@ -1425,7 +1404,7 @@ oce_get_buf(struct oce_rq *rq)
oce_dma_sync(&rq->ring->dma, BUS_DMASYNC_POSTREAD |
BUS_DMASYNC_POSTWRITE);
- return 1;
+ return (1);
}
int
@@ -1437,7 +1416,7 @@ oce_alloc_rx_bufs(struct oce_rq *rq)
while (oce_get_buf(rq))
nbufs++;
if (!nbufs)
- return 0;
+ return (0);
for (i = nbufs / OCE_MAX_RQ_POSTS; i > 0; i--) {
oce_write_db(sc, PD_RXULP_DB, rq->id |
(OCE_MAX_RQ_POSTS << 24));
@@ -1445,7 +1424,7 @@ oce_alloc_rx_bufs(struct oce_rq *rq)
}
if (nbufs > 0)
oce_write_db(sc, PD_RXULP_DB, rq->id | (nbufs << 24));
- return 1;
+ return (1);
}
void
@@ -1531,7 +1510,7 @@ oce_set_macaddr(struct oce_softc *sc)
uint32_t old_pmac_id = sc->pmac_id;
int status = 0;
- if (!bcmp(sc->macaddr, sc->arpcom.ac_enaddr, ETH_ADDR_LEN))
+ if (!bcmp(sc->macaddr, sc->arpcom.ac_enaddr, ETHER_ADDR_LEN))
return;
status = oce_macaddr_add(sc, sc->arpcom.ac_enaddr, sc->if_id,
@@ -1635,7 +1614,7 @@ oce_init(void *arg)
#ifdef OCE_RSS
/* RSS config */
if (sc->rss_enable) {
- if (oce_config_rss(sc, (uint8_t)sc->if_id, RSS_ENABLE)) {
+ if (oce_config_rss(sc, (uint8_t)sc->if_id, 1)) {
printf("%s: failed to configure RSS\n",
sc->dev.dv_xname);
goto error;
@@ -1844,7 +1823,7 @@ oce_create_wq(struct oce_softc *sc, struct oce_eq *eq, uint32_t q_len)
wq->cq = cq;
wq->cfg.q_len = q_len;
wq->cfg.wq_type = NIC_WQ_TYPE_STANDARD;
- wq->cfg.eqd = OCE_DEFAULT_WQ_EQD;
+ wq->cfg.eqd = OCE_DEFAULT_EQD;
wq->cfg.nbufs = 2 * wq->cfg.q_len;
for (i = 0; i < OCE_WQ_PACKET_ARRAY_SIZE; i++) {
@@ -2005,9 +1984,9 @@ oce_create_eq(struct oce_softc *sc)
eq->id = -1;
eq->sc = sc;
- eq->cfg.q_len = EQ_LEN_1024; /* length of event queue */
- eq->cfg.item_size = EQE_SIZE_4; /* size of a queue item */
- eq->cfg.cur_eqd = (uint8_t)80; /* event queue delay */
+ eq->cfg.q_len = EQ_LEN_1024; /* length of event queue */
+ eq->cfg.item_size = EQE_SIZE_4; /* size of a queue item */
+ eq->cfg.cur_eqd = OCE_DEFAULT_EQD; /* event queue delay */
if (oce_new_eq(sc, eq)) {
oce_destroy_ring(sc, eq->ring);
@@ -2111,12 +2090,12 @@ oce_create_cq(struct oce_softc *sc, struct oce_eq *eq, uint32_t q_len,
cq = malloc(sizeof(struct oce_cq), M_DEVBUF, M_NOWAIT | M_ZERO);
if (!cq)
- return NULL;
+ return (NULL);
cq->ring = oce_create_ring(sc, q_len, item_size, 4);
if (!cq->ring) {
free(cq, M_DEVBUF);
- return NULL;
+ return (NULL);
}
cq->sc = sc;
@@ -2319,7 +2298,7 @@ oce_dma_alloc(struct oce_softc *sc, bus_size_t size, struct oce_dma_mem *dma)
dma->paddr = dma->map->dm_segs[0].ds_addr;
dma->size = size;
- return 0;
+ return (0);
fail_3:
bus_dmamem_unmap(dma->tag, dma->vaddr, size);
@@ -2328,7 +2307,7 @@ fail_2:
fail_1:
bus_dmamap_destroy(dma->tag, dma->map);
fail_0:
- return rc;
+ return (rc);
}
void
@@ -2361,11 +2340,11 @@ oce_create_ring(struct oce_softc *sc, int q_len, int item_size,
int rc;
if (size > max_segs * PAGE_SIZE)
- return NULL;
+ return (NULL);
ring = malloc(sizeof(struct oce_ring), M_DEVBUF, M_NOWAIT | M_ZERO);
if (ring == NULL)
- return NULL;
+ return (NULL);
ring->item_size = item_size;
ring->num_items = q_len;
@@ -2483,7 +2462,7 @@ oce_init_fw(struct oce_softc *sc)
}
if ((reg & MPU_EP_SEM_STAGE_MASK) == POST_STAGE_ARMFW_READY) {
/* reset FW */
- if (sc->flags & OCE_FLAGS_RESET_RQD) {
+ if (ISSET(sc->flags, OCE_F_RESET_RQD)) {
bzero(&cmd, sizeof(cmd));
err = oce_cmd(sc, SUBSYS_COMMON,
OPCODE_COMMON_FUNCTION_RESET,
@@ -2560,21 +2539,20 @@ oce_mbox_init(struct oce_softc *sc)
struct oce_bmbx *bmbx = OCE_DMAPTR(&sc->bsmbx, struct oce_bmbx);
uint8_t *ptr = (uint8_t *)&bmbx->mbx;
- if (sc->flags & OCE_FLAGS_MBOX_ENDIAN_RQD) {
- /* Endian Signature */
- *ptr++ = 0xff;
- *ptr++ = 0x12;
- *ptr++ = 0x34;
- *ptr++ = 0xff;
- *ptr++ = 0xff;
- *ptr++ = 0x56;
- *ptr++ = 0x78;
- *ptr = 0xff;
+ if (!ISSET(sc->flags, OCE_F_MBOX_ENDIAN_RQD))
+ return (0);
- return (oce_mbox_dispatch(sc));
- }
+ /* Endian Signature */
+ *ptr++ = 0xff;
+ *ptr++ = 0x12;
+ *ptr++ = 0x34;
+ *ptr++ = 0xff;
+ *ptr++ = 0xff;
+ *ptr++ = 0x56;
+ *ptr++ = 0x78;
+ *ptr = 0xff;
- return (0);
+ return (oce_mbox_dispatch(sc));
}
int
@@ -2709,7 +2687,7 @@ oce_create_iface(struct oce_softc *sc, uint8_t *macaddr)
cmd.params.req.cap_flags = htole32(capab_flags);
cmd.params.req.enable_flags = htole32(capab_en_flags);
if (macaddr != NULL) {
- bcopy(macaddr, &cmd.params.req.mac_addr[0], ETH_ADDR_LEN);
+ bcopy(macaddr, &cmd.params.req.mac_addr[0], ETHER_ADDR_LEN);
cmd.params.req.mac_invalid = 0;
} else
cmd.params.req.mac_invalid = 1;
@@ -2738,7 +2716,7 @@ oce_create_iface(struct oce_softc *sc, uint8_t *macaddr)
if (err)
return (err);
- return 0;
+ return (0);
}
/**
@@ -2799,7 +2777,7 @@ oce_set_flow_control(struct oce_softc *sc, uint32_t flow_control)
* @brief Function to set flow control capability in the hardware
* @param sc software handle to the device
* @param if_id interface id to read the address from
- * @param enable 0=disable, RSS_ENABLE_xxx flags otherwise
+ * @param enable 0=disable, OCE_RSS_xxx flags otherwise
* @returns 0 on success, EIO on failure
*/
int
@@ -2812,9 +2790,8 @@ oce_config_rss(struct oce_softc *sc, uint32_t if_id, int enable)
bzero(&cmd, sizeof(cmd));
if (enable)
- cmd.params.req.enable_rss = RSS_ENABLE_IPV4 |
- RSS_ENABLE_TCP_IPV4 | RSS_ENABLE_IPV6 |
- RSS_ENABLE_TCP_IPV6);
+ cmd.params.req.enable_rss = RSS_ENABLE_IPV4 | RSS_ENABLE_IPV6 |
+ RSS_ENABLE_TCP_IPV4 | RSS_ENABLE_TCP_IPV6);
cmd.params.req.flush = OCE_FLUSH;
cmd.params.req.if_id = htole32(if_id);
@@ -2853,13 +2830,13 @@ oce_config_rss(struct oce_softc *sc, uint32_t if_id, int enable)
*/
int
oce_update_mcast(struct oce_softc *sc,
- uint8_t multi[][ETH_ADDR_LEN], int naddr)
+ uint8_t multi[][ETHER_ADDR_LEN], int naddr)
{
struct mbx_set_common_iface_multicast cmd;
bzero(&cmd, sizeof(cmd));
- bcopy(&multi[0], &cmd.params.req.mac[0], naddr * ETH_ADDR_LEN);
+ bcopy(&multi[0], &cmd.params.req.mac[0], naddr * ETHER_ADDR_LEN);
cmd.params.req.num_mac = htole16(naddr);
cmd.params.req.if_id = sc->if_id;
@@ -2950,7 +2927,8 @@ oce_macaddr_get(struct oce_softc *sc, uint8_t *macaddr)
err = oce_cmd(sc, SUBSYS_COMMON, OPCODE_COMMON_QUERY_IFACE_MAC,
OCE_MBX_VER_V0, &cmd, sizeof(cmd));
if (err == 0)
- bcopy(&cmd.params.rsp.mac.mac_addr[0], macaddr, ETH_ADDR_LEN);
+ bcopy(&cmd.params.rsp.mac.mac_addr[0], macaddr,
+ ETHER_ADDR_LEN);
return (err);
}
@@ -2964,7 +2942,7 @@ oce_macaddr_add(struct oce_softc *sc, uint8_t *enaddr, uint32_t if_id,
bzero(&cmd, sizeof(cmd));
cmd.params.req.if_id = htole16(if_id);
- bcopy(enaddr, cmd.params.req.mac_address, ETH_ADDR_LEN);
+ bcopy(enaddr, cmd.params.req.mac_address, ETHER_ADDR_LEN);
err = oce_cmd(sc, SUBSYS_COMMON, OPCODE_COMMON_ADD_IFACE_MAC,
OCE_MBX_VER_V0, &cmd, sizeof(cmd));
@@ -3004,8 +2982,8 @@ oce_check_native_mode(struct oce_softc *sc)
if (err)
return (err);
- sc->be3_native = cmd.params.rsp.capability_flags &
- CAP_BE3_NATIVE_ERX_API;
+ if (cmd.params.rsp.capability_flags & CAP_BE3_NATIVE_ERX_API)
+ SET(sc->flags, OCE_F_BE3_NATIVE);
return (0);
}
@@ -3354,11 +3332,9 @@ oce_stats_xe(struct oce_softc *sc, uint64_t *rxe, uint64_t *txe)
int
oce_update_stats(struct oce_softc *sc, uint64_t *rxe, uint64_t *txe)
{
- if (IS_BE(sc)) {
- if (sc->flags & OCE_FLAGS_BE2)
- return (oce_stats_be2(sc, rxe, txe));
- else
- return (oce_stats_be3(sc, rxe, txe));
- }
+ if (ISSET(sc->flags, OCE_F_BE2))
+ return (oce_stats_be2(sc, rxe, txe));
+ if (ISSET(sc->flags, OCE_F_BE3))
+ return (oce_stats_be3(sc, rxe, txe));
return (oce_stats_xe(sc, rxe, txe));
}
diff --git a/sys/dev/pci/if_ocereg.h b/sys/dev/pci/if_ocereg.h
index 0a3b08accce..775dd14295c 100644
--- a/sys/dev/pci/if_ocereg.h
+++ b/sys/dev/pci/if_ocereg.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_ocereg.h,v 1.1 2012/10/29 18:36:42 mikeb Exp $ */
+/* $OpenBSD: if_ocereg.h,v 1.2 2012/10/31 20:15:43 mikeb Exp $ */
/*-
* Copyright (C) 2012 Emulex
@@ -620,10 +620,10 @@ struct mbx_hdr {
} u0;
} __packed;
-#define OCE_BMBX_RHDR_SZ 20
-#define OCE_MBX_RRHDR_SZ sizeof (struct mbx_hdr)
-#define OCE_MBX_ADDL_STATUS(_MHDR) ((_MHDR)->u0.rsp.additional_status)
-#define OCE_MBX_STATUS(_MHDR) ((_MHDR)->u0.rsp.status)
+#define OCE_BMBX_RHDR_SZ 20
+#define OCE_MBX_RRHDR_SZ sizeof (struct mbx_hdr)
+#define OCE_MBX_ADDL_STATUS(_MHDR) ((_MHDR)->u0.rsp.additional_status)
+#define OCE_MBX_STATUS(_MHDR) ((_MHDR)->u0.rsp.status)
/* [05] OPCODE_COMMON_QUERY_LINK_CONFIG */
struct mbx_query_common_link_config {
@@ -1715,17 +1715,6 @@ enum NIC_SUBSYS_OPCODES {
OPCODE_NIC_GET_QUEUE_STATS = 20
};
-/* Hash option flags for RSS enable */
-enum RSS_ENABLE_FLAGS {
- RSS_ENABLE_NONE = 0x0, /* (No RSS) */
- RSS_ENABLE_IPV4 = 0x1, /* (IPV4 HASH enabled ) */
- RSS_ENABLE_TCP_IPV4 = 0x2, /* (TCP IPV4 Hash enabled) */
- RSS_ENABLE_IPV6 = 0x4, /* (IPV6 HASH enabled) */
- RSS_ENABLE_TCP_IPV6 = 0x8 /* (TCP IPV6 HASH */
-};
-#define RSS_ENABLE (RSS_ENABLE_IPV4 | RSS_ENABLE_TCP_IPV4)
-#define RSS_DISABLE RSS_ENABLE_NONE
-
/* NIC header WQE */
struct oce_nic_hdr_wqe {
union {
@@ -1855,8 +1844,8 @@ struct oce_nic_tx_cqe {
uint32_t dw[4];
} u0;
} __packed;
-#define WQ_CQE_VALID(_cqe) (_cqe->u0.dw[3])
-#define WQ_CQE_INVALIDATE(_cqe) (_cqe->u0.dw[3] = 0)
+#define WQ_CQE_VALID(_cqe) (_cqe->u0.dw[3])
+#define WQ_CQE_INVALIDATE(_cqe) (_cqe->u0.dw[3] = 0)
/* Receive Queue Entry (RQE) */
struct oce_nic_rqe {
@@ -2027,9 +2016,9 @@ struct oce_nic_rx_cqe_v1 {
} u0;
} __packed;
-#define RQ_CQE_VALID_MASK 0x80
-#define RQ_CQE_VALID(_cqe) (_cqe->u0.dw[2])
-#define RQ_CQE_INVALIDATE(_cqe) (_cqe->u0.dw[2] = 0)
+#define RQ_CQE_VALID_MASK 0x80
+#define RQ_CQE_VALID(_cqe) (_cqe->u0.dw[2])
+#define RQ_CQE_INVALIDATE(_cqe) (_cqe->u0.dw[2] = 0)
struct mbx_config_nic_promiscuous {
struct mbx_hdr hdr;
@@ -2625,51 +2614,19 @@ struct mbx_get_vport_stats {
} params;
} __packed;
-/**
- * @brief [20(0x14)] NIC_GET_QUEUE_STATS
- * The significant difference between vPort and Queue statistics is
- * the packet byte counters.
- */
-struct oce_queue_stats {
- uint64_t packets;
- uint64_t bytes;
- uint64_t errors;
- uint64_t drops;
- uint64_t buffer_errors; /* rsvd when tx */
-} __packed;
-
-#define QUEUE_TYPE_WQ 0
-#define QUEUE_TYPE_RQ 1
-#define QUEUE_TYPE_HDS_RQ 1 /* same as RQ */
-
-struct mbx_get_queue_stats {
- /* dw0 - dw3 */
- struct mbx_hdr hdr;
- union {
- struct {
- /* dw4 */
-#if _BYTE_ORDER == BIG_ENDIAN
- uint32_t reset_stats:8;
- uint32_t queue_type:8;
- uint32_t queue_id:16;
-#else
- uint32_t queue_id:16;
- uint32_t queue_type:8;
- uint32_t reset_stats:8;
-#endif
- } req;
-
- union {
- struct oce_queue_stats qs;
- uint32_t queue_stats[13 - 4 + 1];
- } rsp;
- } params;
-} __packed;
+/* Hash option flags for RSS enable */
+enum RSS_ENABLE_FLAGS {
+ RSS_ENABLE_NONE = 0x0, /* (No RSS) */
+ RSS_ENABLE_IPV4 = 0x1, /* (IPV4 HASH enabled ) */
+ RSS_ENABLE_TCP_IPV4 = 0x2, /* (TCP IPV4 Hash enabled) */
+ RSS_ENABLE_IPV6 = 0x4, /* (IPV6 HASH enabled) */
+ RSS_ENABLE_TCP_IPV6 = 0x8 /* (TCP IPV6 HASH */
+};
/* [01] NIC_CONFIG_RSS */
-#define OCE_HASH_TBL_SZ 10
-#define OCE_CPU_TBL_SZ 128
-#define OCE_FLUSH 1 /* RSS flush completion per CQ port */
+#define OCE_HASH_TBL_SZ 10
+#define OCE_CPU_TBL_SZ 128
+#define OCE_FLUSH 1 /* RSS flush completion per CQ port */
struct mbx_config_nic_rss {
struct mbx_hdr hdr;
union {
diff --git a/sys/dev/pci/if_ocevar.h b/sys/dev/pci/if_ocevar.h
index aded80bcb16..9c99305deae 100644
--- a/sys/dev/pci/if_ocevar.h
+++ b/sys/dev/pci/if_ocevar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_ocevar.h,v 1.2 2012/10/30 17:38:23 mikeb Exp $ */
+/* $OpenBSD: if_ocevar.h,v 1.3 2012/10/31 20:15:43 mikeb Exp $ */
/*-
* Copyright (C) 2012 Emulex
@@ -39,76 +39,57 @@
*/
/* OCE device driver module component revision informaiton */
-#define COMPONENT_REVISION "4.2.127.0"
-
-#define IS_BE(sc) ((sc->flags & OCE_FLAGS_BE2) | \
- (sc->flags & OCE_FLAGS_BE3) ? 1 : 0)
-#define IS_XE201(sc) ((sc->flags & OCE_FLAGS_XE201) ? 1 : 0)
-
-/* proportion Service Level Interface queues */
-#define OCE_MAX_UNITS 2
-#define OCE_MAX_PPORT OCE_MAX_UNITS
-#define OCE_MAX_VPORT OCE_MAX_UNITS
+#define COMPONENT_REVISION "4.2.127.0"
/* This should be powers of 2. Like 2,4,8 & 16 */
-#define OCE_MAX_RSS 4 /* TODO: 8 */
-#define OCE_LEGACY_MODE_RSS 4 /* For BE3 Legacy mode */
-
-#define OCE_MIN_RQ 1
-#define OCE_MIN_WQ 1
-
-#define OCE_MAX_RQ OCE_MAX_RSS + 1 /* one default queue */
-#define OCE_MAX_WQ 8
-
-#define OCE_MAX_EQ 32
-#define OCE_MAX_CQ OCE_MAX_RQ + OCE_MAX_WQ + 1 /* one MCC queue */
-#define OCE_MAX_CQ_EQ 8 /* Max CQ that can attached to an EQ */
-
-#define OCE_DEFAULT_WQ_EQD 80
-#define OCE_MAX_PACKET_Q 16
-#define OCE_RQ_BUF_SIZE 2048
-#define OCE_LSO_MAX_SIZE (64 * 1024)
-#define LONG_TIMEOUT 30
-#define OCE_MAX_JUMBO_FRAME_SIZE 16360
-#define OCE_MAX_MTU (OCE_MAX_JUMBO_FRAME_SIZE - \
- ETHER_VLAN_ENCAP_LEN - \
- ETHER_HDR_LEN - ETHER_CRC_LEN)
-
-#define OCE_MAX_TX_ELEMENTS 29
-#define OCE_MAX_TX_DESC 1024
-#define OCE_MAX_TX_SIZE 65535
-#define OCE_MAX_RX_SIZE 4096
-#define OCE_MAX_RQ_POSTS 255
-
-#define RSS_ENABLE_IPV4 0x1
-#define RSS_ENABLE_TCP_IPV4 0x2
-#define RSS_ENABLE_IPV6 0x4
-#define RSS_ENABLE_TCP_IPV6 0x8
+#define OCE_MAX_RSS 4 /* TODO: 8 */
+#define OCE_LEGACY_MODE_RSS 4 /* For BE3 Legacy mode */
+
+#define OCE_MAX_RQ OCE_MAX_RSS + 1 /* one default queue */
+#define OCE_MAX_WQ 8
+
+#define OCE_MAX_EQ 32
+#define OCE_MAX_CQ OCE_MAX_RQ + OCE_MAX_WQ + 1 /* one MCC queue */
+#define OCE_MAX_CQ_EQ 8 /* Max CQ that can attached to an EQ */
+
+#define OCE_DEFAULT_EQD 80
+#define OCE_RQ_BUF_SIZE 2048
+#define OCE_LSO_MAX_SIZE (64 * 1024)
+#define OCE_MAX_JUMBO_FRAME_SIZE 16360
+#define OCE_MAX_MTU (OCE_MAX_JUMBO_FRAME_SIZE - \
+ ETHER_VLAN_ENCAP_LEN - \
+ ETHER_HDR_LEN - ETHER_CRC_LEN)
+
+#define OCE_MAX_TX_ELEMENTS 29
+#define OCE_MAX_TX_DESC 1024
+#define OCE_MAX_TX_SIZE 65535
+#define OCE_MAX_RX_SIZE 4096
+#define OCE_MAX_RQ_POSTS 255
+#define OCE_MAX_RSP_HANDLED 64
+
+#define OCE_RSS_IPV4 0x1
+#define OCE_RSS_TCP_IPV4 0x2
+#define OCE_RSS_IPV6 0x4
+#define OCE_RSS_TCP_IPV6 0x8
/* flow control definitions */
-#define OCE_FC_NONE 0x00000000
-#define OCE_FC_TX 0x00000001
-#define OCE_FC_RX 0x00000002
-#define OCE_DEFAULT_FLOW_CONTROL (OCE_FC_TX | OCE_FC_RX)
+#define OCE_FC_NONE 0x00000000
+#define OCE_FC_TX 0x00000001
+#define OCE_FC_RX 0x00000002
/* Interface capabilities to give device when creating interface */
-#define OCE_CAPAB_FLAGS (MBX_RX_IFACE_FLAGS_BROADCAST | \
- MBX_RX_IFACE_FLAGS_UNTAGGED | \
- MBX_RX_IFACE_FLAGS_PROMISC | \
- MBX_RX_IFACE_FLAGS_MCAST_PROMISC | \
- MBX_RX_IFACE_FLAGS_RSS)
- /* MBX_RX_IFACE_FLAGS_RSS | \ */
- /* MBX_RX_IFACE_FLAGS_PASS_L3L4_ERR) */
+#define OCE_CAPAB_FLAGS (MBX_RX_IFACE_FLAGS_BROADCAST | \
+ MBX_RX_IFACE_FLAGS_UNTAGGED | \
+ MBX_RX_IFACE_FLAGS_PROMISC | \
+ MBX_RX_IFACE_FLAGS_MCAST_PROMISC)
+ /* MBX_RX_IFACE_FLAGS_RSS | \ */
+ /* MBX_RX_IFACE_FLAGS_PASS_L3L4_ERR) */
/* Interface capabilities to enable by default (others set dynamically) */
-#define OCE_CAPAB_ENABLE (MBX_RX_IFACE_FLAGS_BROADCAST | \
- MBX_RX_IFACE_FLAGS_UNTAGGED)
- /* MBX_RX_IFACE_FLAGS_RSS | \ */
- /* MBX_RX_IFACE_FLAGS_PASS_L3L4_ERR) */
-
-#define ETH_ADDR_LEN 6
-#define MAX_VLANFILTER_SIZE 64
-#define MAX_VLANS 4096
+#define OCE_CAPAB_ENABLE (MBX_RX_IFACE_FLAGS_BROADCAST | \
+ MBX_RX_IFACE_FLAGS_UNTAGGED)
+ /* MBX_RX_IFACE_FLAGS_RSS | \ */
+ /* MBX_RX_IFACE_FLAGS_PASS_L3L4_ERR) */
#define BSWAP_8(x) ((x) & 0xff)
#define BSWAP_16(x) ((BSWAP_8(x) << 8) | BSWAP_8((x) >> 8))
@@ -124,27 +105,6 @@
#define for_all_cq_queues(sc, cq, i) \
for (i = 0, cq = sc->cq[0]; i < sc->ncqs; i++, cq = sc->cq[i])
-/* Flash specific */
-#define IOCTL_COOKIE "SERVERENGINES CORP"
-#define MAX_FLASH_COMP 32
-
-#define IMG_ISCSI 160
-#define IMG_REDBOOT 224
-#define IMG_BIOS 34
-#define IMG_PXEBIOS 32
-#define IMG_FCOEBIOS 33
-#define IMG_ISCSI_BAK 176
-#define IMG_FCOE 162
-#define IMG_FCOE_BAK 178
-#define IMG_NCSI 16
-#define IMG_PHY 192
-#define FLASHROM_OPER_FLASH 1
-#define FLASHROM_OPER_SAVE 2
-#define FLASHROM_OPER_REPORT 4
-#define FLASHROM_OPER_FLASH_PHY 9
-#define FLASHROM_OPER_SAVE_PHY 10
-#define TN_8022 13
-
enum {
PHY_TYPE_CX4_10GB = 0,
PHY_TYPE_XFP_10GB,
@@ -171,7 +131,7 @@ enum {
#define RING_PUT(_r, _n) \
(_r)->pidx = GET_Q_NEXT((_r)->pidx, _n, (_r)->num_items)
-#define OCE_DMAPTR(_o, _t) ((_t *)(_o)->vaddr)
+#define OCE_DMAPTR(_o, _t) ((_t *)(_o)->vaddr)
#define RING_GET_CONSUMER_ITEM_VA(_r, _t) \
(OCE_DMAPTR(&(_r)->dma, _t) + (_r)->cidx)
@@ -205,20 +165,16 @@ struct oce_ring {
struct oce_dma_mem dma;
};
-#define TRUE 1
-#define FALSE 0
+#define TRUE 1
+#define FALSE 0
-#define DEFAULT_MQ_MBOX_TIMEOUT (5 * 1000 * 1000)
-#define MBX_READY_TIMEOUT (1 * 1000 * 1000)
-#define DEFAULT_DRAIN_TIME 200
-#define MBX_TIMEOUT_SEC 5
-#define STAT_TIMEOUT 2000000
+#define MBX_TIMEOUT_SEC 5
/* size of the packet descriptor array in a transmit queue */
-#define OCE_TX_RING_SIZE 512
-#define OCE_RX_RING_SIZE 1024
-#define OCE_WQ_PACKET_ARRAY_SIZE (OCE_TX_RING_SIZE/2)
-#define OCE_RQ_PACKET_ARRAY_SIZE (OCE_RX_RING_SIZE)
+#define OCE_TX_RING_SIZE 512
+#define OCE_RX_RING_SIZE 1024
+#define OCE_WQ_PACKET_ARRAY_SIZE (OCE_TX_RING_SIZE/2)
+#define OCE_RQ_PACKET_ARRAY_SIZE (OCE_RX_RING_SIZE)
struct oce_softc;
@@ -326,7 +282,7 @@ struct oce_wq {
bus_dma_tag_t tag;
- struct oce_cq *cq;
+ struct oce_cq * cq;
struct oce_packet_desc pckts[OCE_WQ_PACKET_ARRAY_SIZE];
uint32_t packets_in;
@@ -381,18 +337,12 @@ struct link_status {
uint32_t logical_link_status;
} __packed;
-#define OCE_FLAGS_PCIX 0x00000001
-#define OCE_FLAGS_PCIE 0x00000002
-#define OCE_FLAGS_MSI_CAPABLE 0x00000004
-#define OCE_FLAGS_MSIX_CAPABLE 0x00000008
-#define OCE_FLAGS_USING_MSI 0x00000010
-#define OCE_FLAGS_USING_MSIX 0x00000020
-#define OCE_FLAGS_RESET_RQD 0x00000040
-#define OCE_FLAGS_VIRTUAL_PORT 0x00000080
-#define OCE_FLAGS_MBOX_ENDIAN_RQD 0x00000100
-#define OCE_FLAGS_BE3 0x00000200
-#define OCE_FLAGS_XE201 0x00000400
-#define OCE_FLAGS_BE2 0x00000800
+#define OCE_F_BE2 0x00000001
+#define OCE_F_BE3 0x00000002
+#define OCE_F_BE3_NATIVE 0x00000004
+#define OCE_F_XE201 0x00000008
+#define OCE_F_RESET_RQD 0x00000100
+#define OCE_F_MBOX_ENDIAN_RQD 0x00000200
struct oce_softc {
struct device dev;
@@ -429,11 +379,11 @@ struct oce_softc {
uint32_t max_tx_rings;
uint32_t max_rx_rings;
- struct oce_wq *wq[OCE_MAX_WQ]; /* TX work queues */
- struct oce_rq *rq[OCE_MAX_RQ]; /* RX work queues */
- struct oce_cq *cq[OCE_MAX_CQ]; /* Completion queues */
- struct oce_eq *eq[OCE_MAX_EQ]; /* Event queues */
- struct oce_mq *mq; /* Mailbox queue */
+ struct oce_wq * wq[OCE_MAX_WQ]; /* TX work queues */
+ struct oce_rq * rq[OCE_MAX_RQ]; /* RX work queues */
+ struct oce_cq * cq[OCE_MAX_CQ]; /* Completion queues */
+ struct oce_eq * eq[OCE_MAX_EQ]; /* Event queues */
+ struct oce_mq * mq; /* Mailbox queue */
ushort neqs;
ushort ncqs;
@@ -449,7 +399,7 @@ struct oce_softc {
uint32_t nifs; /* number of adapter interfaces, 0 or 1 */
uint32_t pmac_id; /* PMAC id */
- char macaddr[ETH_ADDR_LEN];
+ char macaddr[ETHER_ADDR_LEN];
uint32_t if_cap_flags;
@@ -465,17 +415,12 @@ struct oce_softc {
struct timeout rxrefill;
};
+#define IS_BE(sc) ISSET((sc)->flags, OCE_F_BE2 | OCE_F_BE3)
+#define IS_XE201(sc) ISSET((sc)->flags, OCE_F_XE201)
+
#define oce_dma_sync(d, f) \
bus_dmamap_sync((d)->tag, (d)->map, 0, (d)->map->dm_mapsize, f)
-/* Capabilities */
-#define OCE_MAX_RSP_HANDLED 64
-
-#define OCE_MAC_LOOPBACK 0x0
-#define OCE_PHY_LOOPBACK 0x1
-#define OCE_ONE_PORT_EXT_LOOPBACK 0x2
-#define OCE_NO_LOOPBACK 0xff
-
#define DW_SWAP(x, l)
#define ADDR_HI(x) ((uint32_t)((uint64_t)(x) >> 32))
@@ -483,9 +428,9 @@ struct oce_softc {
#define IFCAP_HWCSUM \
(IFCAP_CSUM_IPv4 | IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4)
-#define IF_LRO_ENABLED(ifp) (((ifp)->if_capabilities & IFCAP_LRO) ? 1:0)
-#define IF_LSO_ENABLED(ifp) (((ifp)->if_capabilities & IFCAP_TSO4) ? 1:0)
-#define IF_CSUM_ENABLED(ifp) (((ifp)->if_capabilities & IFCAP_HWCSUM) ? 1:0)
+#define IF_LRO_ENABLED(ifp) ISSET((ifp)->if_capabilities, IFCAP_LRO)
+#define IF_LSO_ENABLED(ifp) ISSET((ifp)->if_capabilities, IFCAP_TSO4)
+#define IF_CSUM_ENABLED(ifp) ISSET((ifp)->if_capabilities, IFCAP_HWCSUM)
static inline int
ilog2(unsigned int v)