diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/pci/files.pci | 9 | ||||
-rw-r--r-- | sys/dev/pci/if_nx.c | 2161 | ||||
-rw-r--r-- | sys/dev/pci/if_nxreg.h | 782 |
3 files changed, 1 insertions, 2951 deletions
diff --git a/sys/dev/pci/files.pci b/sys/dev/pci/files.pci index 77be9051b0c..5861aa98398 100644 --- a/sys/dev/pci/files.pci +++ b/sys/dev/pci/files.pci @@ -1,4 +1,4 @@ -# $OpenBSD: files.pci,v 1.240 2007/08/01 13:09:03 mk Exp $ +# $OpenBSD: files.pci,v 1.241 2007/08/14 18:54:39 reyk Exp $ # $NetBSD: files.pci,v 1.20 1996/09/24 17:47:15 christos Exp $ # # Config file and device description for machine-independent PCI code. @@ -351,13 +351,6 @@ device xge: ether, ifnet, ifmedia attach xge at pci file dev/pci/if_xge.c xge -# NetXen NX203x 10 Gigabit Ethernet -device nxb {} -attach nxb at pci -device nx: ether, ifnet, mii, ifmedia, firmload -attach nx at nxb -file dev/pci/if_nx.c nxb | nx - # Tehuti Networks 10Gb Ethernet device thtc {} attach thtc at pci diff --git a/sys/dev/pci/if_nx.c b/sys/dev/pci/if_nx.c deleted file mode 100644 index b914eb43150..00000000000 --- a/sys/dev/pci/if_nx.c +++ /dev/null @@ -1,2161 +0,0 @@ -/* $OpenBSD: if_nx.c,v 1.50 2007/05/28 19:44:15 reyk Exp $ */ - -/* - * Copyright (c) 2007 Reyk Floeter <reyk@openbsd.org> - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * Driver for the NetXen NX2031/NX2035 10Gb and Gigabit Ethernet chipsets, - * see http://www.netxen.com/. - * - * This driver was made possible because NetXen Inc. provided hardware - * and documentation. Thanks! - */ - -#include "bpfilter.h" - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/sockio.h> -#include <sys/mbuf.h> -#include <sys/kernel.h> -#include <sys/socket.h> -#include <sys/malloc.h> -#include <sys/timeout.h> -#include <sys/proc.h> -#include <sys/device.h> -#include <sys/sensors.h> - -#include <machine/bus.h> -#include <machine/intr.h> - -#include <net/if.h> -#include <net/if_dl.h> -#include <net/if_media.h> -#include <net/if_types.h> - -#if NBPFILTER > 0 -#include <net/bpf.h> -#endif - -#ifdef INET -#include <netinet/in.h> -#include <netinet/if_ether.h> -#endif - -#include <dev/mii/mii.h> -#include <dev/mii/miivar.h> - -#include <dev/pci/pcireg.h> -#include <dev/pci/pcivar.h> -#include <dev/pci/pcidevs.h> - -#include <dev/pci/if_nxreg.h> - -#ifdef NX_DEBUG -#define NXDBG_WAIT (1<<0) /* poll registers */ -#define NXDBG_FLASH (1<<1) /* debug flash access through ROMUSB */ -#define NXDBG_CRBINIT (1<<2) /* SW register init from flash */ -#define NXDBG_STATE (1<<3) /* Firmware states */ -#define NXDBG_WINDOW (1<<4) /* Memory windows */ -#define NXDBG_INTR (1<<5) /* Interrupts */ -#define NXDBG_TX (1<<6) /* Transmit */ -#define NXDBG_ALL 0xfffe /* enable nearly all debugging messages */ -int nx_debug = 0; -#define DPRINTF(_lvl, _arg...) do { \ - if (nx_debug & (_lvl)) \ - printf(_arg); \ -} while (0) -#define DPRINTREG(_lvl, _reg) do { \ - if (nx_debug & (_lvl)) \ - printf("%s: 0x%08x: %08x\n", \ - #_reg, _reg, nxb_readcrb(sc, _reg)); \ -} while (0) -#else -#define DPRINTREG(_lvl, _reg) -#define DPRINTF(_lvl, arg...) -#endif - -#define DEVNAME(_s) ((_s)->_s##_dev.dv_xname) - -#ifdef notyet -/* - * The NetXen firmware and bootloader is about 800k big, don't even try - * to load the alternative version from disk with small kernels used by - * the install media. The driver can still try to use the primary firmware - * and bootloader found in the controller's flash memory. - */ -#ifndef SMALL_KERNEL -#define NXB_LOADFIRMWARE -#endif -#endif - -struct nx_softc; - -struct nxb_port { - u_int8_t nxp_id; - u_int8_t nxp_mode; - u_int8_t nxp_phy; - u_int8_t nxp_lladdr[ETHER_ADDR_LEN]; - bus_size_t nxp_phyregion; - - struct nx_softc *nxp_nx; -}; - -struct nxb_dmamem { - bus_dmamap_t nxm_map; - bus_dma_segment_t nxm_seg; - int nxm_nsegs; - size_t nxm_size; - caddr_t nxm_kva; - const char *nxm_name; -}; - -struct nxb_softc { - struct device sc_dev; - - pci_chipset_tag_t sc_pc; - pcitag_t sc_tag; - u_int sc_function; - - bus_dma_tag_t sc_dmat; - bus_space_tag_t sc_memt; - bus_space_handle_t sc_memh; - bus_size_t sc_mems; - bus_space_tag_t sc_dbmemt; - bus_space_handle_t sc_dbmemh; - bus_size_t sc_dbmems; - - int sc_window; /* SW memory window */ - int sc_ddrwindow; /* PCI DDR memory window */ - int sc_qdrwindow; /* PCI QDR memory window */ - - pci_intr_handle_t sc_ih; - - u_int sc_flags; -#define NXFLAG_FWINVALID (1<<0) /* update firmware from disk */ - - struct nxb_info sc_nxbinfo; /* Information from flash */ - struct nxb_imageinfo sc_nxbimage; /* Image info from flash */ - - int sc_state; /* Firmware state */ - u_int32_t sc_fwmajor; /* Load image major rev */ - u_int32_t sc_fwminor; /* Load image minor rev */ - u_int32_t sc_fwbuild; /* Load image build rev */ - - struct nxb_port sc_nxp[NX_MAX_PORTS]; /* The nx ports */ - int sc_nports; - - struct timeout sc_reload; - int sc_reloaded; - - struct ksensor sc_sensor; - struct ksensordev sc_sensordev; -}; - -struct nx_buf { - bus_dmamap_t nb_dmamap; - struct mbuf *nb_m; -}; - -struct nx_ringdata { - /* Rx and Rx status descriptors */ - struct nxb_dmamem rd_rxdma; - struct nx_rxdesc *rd_rxring; - struct nx_buf rd_rxbuf[NX_MAX_RX_DESC]; - struct nxb_dmamem rd_statusdma; - struct nx_statusdesc *rd_statusring; - struct nx_buf rd_statusbuf[NX_MAX_RX_DESC]; - - /* Tx descriptors */ - struct nxb_dmamem rd_txdma; - struct nx_txdesc *rd_txring; - struct nx_buf rd_txbuf[NX_MAX_TX_DESC]; - u_int32_t rd_txproducer; - volatile u_int rd_txpending; -}; - -struct nx_softc { - struct device nx_dev; - struct arpcom nx_ac; - struct mii_data nx_mii; - - bus_space_handle_t nx_memh; /* port phy subregion */ - - struct nx_ringcontext *nx_rc; /* Rx, Tx, Status */ - struct nxb_dmamem nx_rcdma; - - struct nxb_softc *nx_sc; /* The nxb board */ - struct nxb_port *nx_port; /* Port information */ - void *nx_ih; - - struct nx_ringdata *nx_rings; - - struct timeout nx_tick; -}; - -int nxb_match(struct device *, void *, void *); -void nxb_attach(struct device *, struct device *, void *); -int nxb_query(struct nxb_softc *sc); -int nxb_newstate(struct nxb_softc *, int); -void nxb_reload(void *); -void nxb_mountroot(void *); -int nxb_loadfirmware(struct nxb_softc *, struct nxb_firmware_header *, - u_int8_t **, size_t *); -int nxb_reloadfirmware(struct nxb_softc *, struct nxb_firmware_header *, - u_int8_t **, size_t *); -void nxb_reset(struct nxb_softc *); - -u_int32_t nxb_read(struct nxb_softc *, bus_size_t); -void nxb_write(struct nxb_softc *, bus_size_t, u_int32_t); -u_int32_t nxb_readcrb(struct nxb_softc *, bus_size_t); -void nxb_writecrb(struct nxb_softc *, bus_size_t, u_int32_t); -int nxb_writehw(struct nxb_softc *, u_int32_t, u_int32_t); -bus_size_t nxb_set_crbwindow(struct nxb_softc *, bus_size_t); -u_int64_t nxb_set_pciwindow(struct nxb_softc *, u_int64_t); -int nxb_wait(struct nxb_softc *, bus_size_t, u_int32_t, u_int32_t, - int, u_int); -int nxb_read_rom(struct nxb_softc *, u_int32_t, u_int32_t *); - -void nxb_temp_sensor(void *); -int nxb_dmamem_alloc(struct nxb_softc *, struct nxb_dmamem *, - bus_size_t, const char *); -void nxb_dmamem_free(struct nxb_softc *, struct nxb_dmamem *); - -int nx_match(struct device *, void *, void *); -void nx_attach(struct device *, struct device *, void *); -int nx_print(void *, const char *); -int nx_media_change(struct ifnet *); -void nx_media_status(struct ifnet *, struct ifmediareq *); -void nx_link_state(struct nx_softc *); -void nx_init(struct ifnet *); -void nx_start(struct ifnet *); -void nx_stop(struct ifnet *); -void nx_watchdog(struct ifnet *); -int nx_ioctl(struct ifnet *, u_long, caddr_t); -void nx_iff(struct nx_softc *); -void nx_tick(void *); -int nx_intr(void *); -void nx_setlladdr(struct nx_softc *, u_int8_t *); -void nx_doorbell(struct nx_softc *nx, u_int8_t, u_int8_t, u_int32_t); -u_int32_t nx_readphy(struct nx_softc *, bus_size_t); -void nx_writephy(struct nx_softc *, bus_size_t, u_int32_t); -u_int32_t nx_readcrb(struct nx_softc *, enum nxsw_portreg); -void nx_writecrb(struct nx_softc *, enum nxsw_portreg, u_int32_t); - -int nx_alloc(struct nx_softc *); -void nx_free(struct nx_softc *); -struct mbuf *nx_getbuf(struct nx_softc *, bus_dmamap_t, int); -int nx_init_rings(struct nx_softc *); -void nx_free_rings(struct nx_softc *); - -struct cfdriver nxb_cd = { - 0, "nxb", DV_DULL -}; -struct cfattach nxb_ca = { - sizeof(struct nxb_softc), nxb_match, nxb_attach -}; - -struct cfdriver nx_cd = { - 0, "nx", DV_IFNET -}; -struct cfattach nx_ca = { - sizeof(struct nx_softc), nx_match, nx_attach -}; - -const struct pci_matchid nxb_devices[] = { - { PCI_VENDOR_NETXEN, PCI_PRODUCT_NETXEN_NXB_10GXxR }, - { PCI_VENDOR_NETXEN, PCI_PRODUCT_NETXEN_NXB_10GCX4 }, - { PCI_VENDOR_NETXEN, PCI_PRODUCT_NETXEN_NXB_4GCU }, - { PCI_VENDOR_NETXEN, PCI_PRODUCT_NETXEN_NXB_IMEZ }, - { PCI_VENDOR_NETXEN, PCI_PRODUCT_NETXEN_NXB_HMEZ }, - { PCI_VENDOR_NETXEN, PCI_PRODUCT_NETXEN_NXB_IMEZ_2 }, - { PCI_VENDOR_NETXEN, PCI_PRODUCT_NETXEN_NXB_HMEZ_2 } -}; - -const struct nxb_board { - enum nxb_board_types brd_type; - u_int brd_mode; - u_int brd_nports; - u_int brd_phy; /* The default PHY */ -} nxb_boards[] = { - { NXB_BOARDTYPE_P2SB35_4G, NXNIU_MODE_GBE, 4, IFM_1000_T }, - { NXB_BOARDTYPE_P2SB31_10G, NXNIU_MODE_XGE, 1, IFM_10G_SR }, - { NXB_BOARDTYPE_P2SB31_2G, NXNIU_MODE_GBE, 2, IFM_1000_T }, - { NXB_BOARDTYPE_P2SB31_10GIMEZ, NXNIU_MODE_XGE, 2, IFM_10G_SR }, - { NXB_BOARDTYPE_P2SB31_10GHMEZ, NXNIU_MODE_XGE, 2, IFM_10G_SR }, - { NXB_BOARDTYPE_P2SB31_10GCX4, NXNIU_MODE_XGE, 1, IFM_10G_CX4 } -}; - -/* Use mapping table, see if_nxreg.h for details */ -const u_int32_t nx_swportreg[NXSW_PORTREG_MAX][NX_MAX_PORTS] = NXSW_PORTREGS; -#define NXSW_PORTREG(_p, _r) (nx_swportreg[_r][nx->nx_port->nxp_id]) - -/* - * Routines handling the physical ''nxb'' board - */ - -int -nxb_match(struct device *parent, void *match, void *aux) -{ - return (pci_matchbyid((struct pci_attach_args *)aux, - nxb_devices, sizeof(nxb_devices) / sizeof(nxb_devices[0]))); -} - -void -nxb_attach(struct device *parent, struct device *self, void *aux) -{ - struct nxb_softc *sc = (struct nxb_softc *)self; - struct pci_attach_args *pa = aux; - pcireg_t memtype; - const char *intrstr; - bus_size_t pcisize; - paddr_t pciaddr; - int i; - - sc->sc_pc = pa->pa_pc; - sc->sc_tag = pa->pa_tag; - sc->sc_dmat = pa->pa_dmat; - sc->sc_function = pa->pa_function; - sc->sc_window = -1; - sc->sc_ddrwindow = -1; - sc->sc_qdrwindow = -1; - - /* - * The NetXen NICs can have different PCI memory layouts which - * need some special handling in the driver. Support is limited - * to 32bit 128MB memory for now (the chipset uses a configurable - * window to access the complete memory range). - */ - memtype = pci_mapreg_type(sc->sc_pc, sc->sc_tag, NXBAR0); - switch (memtype) { - case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT: - break; - case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT: - default: - printf(": invalid memory type: 0x%x\n", memtype); - return; - } - if (pci_mapreg_info(sc->sc_pc, sc->sc_tag, NXBAR0, - memtype, &pciaddr, &pcisize, NULL)) { - printf(": failed to get pci info\n"); - return; - } - switch (pcisize) { - case NXPCIMEM_SIZE_128MB: - break; - case NXPCIMEM_SIZE_32MB: - default: - printf(": invalid memory size: %ld\n", pcisize); - return; - } - - /* Finally map the PCI memory space */ - if (pci_mapreg_map(pa, NXBAR0, memtype, 0, &sc->sc_memt, - &sc->sc_memh, NULL, &sc->sc_mems, 0) != 0) { - printf(": unable to map register memory\n"); - return; - } - if (pci_mapreg_map(pa, NXBAR4, memtype, 0, &sc->sc_dbmemt, - &sc->sc_dbmemh, NULL, &sc->sc_dbmems, 0) != 0) { - printf(": unable to map doorbell memory\n"); - goto unmap1; - } - - /* Get the board information and initialize the h/w */ - if (nxb_query(sc) != 0) - goto unmap; - - /* Map the interrupt, the handlers will be attached later */ - if (pci_intr_map(pa, &sc->sc_ih) != 0) { - printf(": unable to map interrupt\n"); - goto unmap; - } - intrstr = pci_intr_string(pa->pa_pc, sc->sc_ih); - printf(": %s\n", intrstr); - - for (i = 0; i < sc->sc_nports; i++) - config_found(&sc->sc_dev, &sc->sc_nxp[i], nx_print); - - /* Initialize sensor data */ - strlcpy(sc->sc_sensordev.xname, DEVNAME(sc), - sizeof(sc->sc_sensordev.xname)); - sc->sc_sensor.type = SENSOR_TEMP; - sensor_attach(&sc->sc_sensordev, &sc->sc_sensor); - sensordev_install(&sc->sc_sensordev); - - timeout_set(&sc->sc_reload, nxb_reload, sc); - mountroothook_establish(nxb_mountroot, sc); - - return; - - unmap: - bus_space_unmap(sc->sc_dbmemt, sc->sc_dbmemh, sc->sc_dbmems); - sc->sc_dbmems = 0; - unmap1: - bus_space_unmap(sc->sc_memt, sc->sc_memh, sc->sc_mems); - sc->sc_mems = 0; -} - -int -nxb_query(struct nxb_softc *sc) -{ - struct nxb_info *ni = &sc->sc_nxbinfo; - struct nxb_userinfo *nu; - u_int32_t *data, addr; - u_int8_t *ptr; - const struct nxb_board *board = NULL; - u_int i, j, len; - - /* - * Get the board information from flash memory - */ - addr = NXFLASHMAP_INFO; - len = sizeof(*ni) / sizeof(u_int32_t); - data = (u_int32_t *)ni; - for (i = 0; i < len; i++) { - if (nxb_read_rom(sc, addr, data) != 0) { - printf(": failed to get board info from flash\n"); - return (-1); - } - addr += sizeof(u_int32_t); - data++; - } - -#ifdef NX_DEBUG -#define _NXBINFO(_e) do { \ - if (nx_debug & NXDBG_FLASH) \ - printf("%s: %s: 0x%08x (%u)\n", \ - DEVNAME(sc), #_e, ni->_e, ni->_e); \ -} while (0) - _NXBINFO(ni_hdrver); - _NXBINFO(ni_board_mfg); - _NXBINFO(ni_board_type); - _NXBINFO(ni_board_num); - _NXBINFO(ni_chip_id); - _NXBINFO(ni_chip_minor); - _NXBINFO(ni_chip_major); - _NXBINFO(ni_chip_pkg); - _NXBINFO(ni_chip_lot); - _NXBINFO(ni_port_mask); - _NXBINFO(ni_peg_mask); - _NXBINFO(ni_icache); - _NXBINFO(ni_dcache); - _NXBINFO(ni_casper); - _NXBINFO(ni_lladdr0_low); - _NXBINFO(ni_lladdr1_low); - _NXBINFO(ni_lladdr2_low); - _NXBINFO(ni_lladdr3_low); - _NXBINFO(ni_mnsync_mode); - _NXBINFO(ni_mnsync_shift_cclk); - _NXBINFO(ni_mnsync_shift_mclk); - _NXBINFO(ni_mnwb_enable); - _NXBINFO(ni_mnfreq_crystal); - _NXBINFO(ni_mnfreq_speed); - _NXBINFO(ni_mnorg); - _NXBINFO(ni_mndepth); - _NXBINFO(ni_mnranks0); - _NXBINFO(ni_mnranks1); - _NXBINFO(ni_mnrd_latency0); - _NXBINFO(ni_mnrd_latency1); - _NXBINFO(ni_mnrd_latency2); - _NXBINFO(ni_mnrd_latency3); - _NXBINFO(ni_mnrd_latency4); - _NXBINFO(ni_mnrd_latency5); - _NXBINFO(ni_mnrd_latency6); - _NXBINFO(ni_mnrd_latency7); - _NXBINFO(ni_mnrd_latency8); - _NXBINFO(ni_mndll[0]); - _NXBINFO(ni_mnddr_mode); - _NXBINFO(ni_mnddr_extmode); - _NXBINFO(ni_mntiming0); - _NXBINFO(ni_mntiming1); - _NXBINFO(ni_mntiming2); - _NXBINFO(ni_snsync_mode); - _NXBINFO(ni_snpt_mode); - _NXBINFO(ni_snecc_enable); - _NXBINFO(ni_snwb_enable); - _NXBINFO(ni_snfreq_crystal); - _NXBINFO(ni_snfreq_speed); - _NXBINFO(ni_snorg); - _NXBINFO(ni_sndepth); - _NXBINFO(ni_sndll); - _NXBINFO(ni_snrd_latency); - _NXBINFO(ni_lladdr0_high); - _NXBINFO(ni_lladdr1_high); - _NXBINFO(ni_lladdr2_high); - _NXBINFO(ni_lladdr3_high); - _NXBINFO(ni_magic); - _NXBINFO(ni_mnrd_imm); - _NXBINFO(ni_mndll_override); -#undef _NXBINFO -#endif /* NX_DEBUG */ - - /* Validate the board information from flash */ - if (ni->ni_hdrver != NXB_VERSION) { - printf(": unsupported flash info header version %u\n", - ni->ni_hdrver); - return (-1); - } - if (ni->ni_magic != NXB_MAGIC) { - printf(": flash info magic value mismatch\n"); - return (-1); - } - - /* Lookup the board */ - for (i = 0; i < (sizeof(nxb_boards) / sizeof(nxb_boards[0])); i++) { - if (ni->ni_board_type == nxb_boards[i].brd_type) { - board = &nxb_boards[i]; - break; - } - } - if (board == NULL) { - printf(": unsupported board type %u\n", ni->ni_board_type); - return (-1); - } - - /* Configure the ports */ - sc->sc_nports = board->brd_nports; - for (i = 0; i < sc->sc_nports; i++) { - sc->sc_nxp[i].nxp_id = i; - sc->sc_nxp[i].nxp_mode = board->brd_mode; - sc->sc_nxp[i].nxp_phy = board->brd_phy; - switch (board->brd_mode) { - case NXNIU_MODE_XGE: - sc->sc_nxp[i].nxp_phyregion = NXNIU_XGE(i); - break; - case NXNIU_MODE_GBE: - sc->sc_nxp[i].nxp_phyregion = NXNIU_GBE(i); - break; - case NXNIU_MODE_FC: - sc->sc_nxp[i].nxp_phyregion = NXNIU_FC(i); - break; - } - } - - /* - * Get the user information from flash memory - */ - if ((nu = (struct nxb_userinfo *) - malloc(sizeof(*nu), M_TEMP, M_NOWAIT)) == NULL) { - printf(": failed to allocate user info\n"); - return (-1); - } - addr = NXFLASHMAP_USER; - len = sizeof(*nu) / sizeof(u_int32_t); - data = (u_int32_t *)nu; - for (i = 0; i < len; i++) { - if (nxb_read_rom(sc, addr, data) != 0) { - printf(": failed to get user info from flash\n"); - free(nu, M_TEMP); - return (-1); - } - addr += sizeof(u_int32_t); - data++; - } - - /* Copy the MAC addresses */ - for (i = 0; i < sc->sc_nports; i++) { - ptr = (u_int8_t *) - &nu->nu_lladdr[i * NXB_MAX_PORT_LLADDRS]; - /* MAC address bytes are stored in a swapped order */ - for (j = 0; j < ETHER_ADDR_LEN; j++) - sc->sc_nxp[i].nxp_lladdr[j] = - ptr[ETHER_ADDR_LEN - (j + 1)]; - } - - /* Make sure that the serial number is a NUL-terminated string */ - nu->nu_serial_num[31] = '\0'; - - /* Copy flash image information */ - bcopy(&nu->nu_image, &sc->sc_nxbimage, sizeof(sc->sc_nxbimage)); - -#ifdef NX_DEBUG -#define _NXBUSER(_e) do { \ - if (nx_debug & NXDBG_FLASH) \ - printf("%s: %s: 0x%08x (%u)\n", \ - DEVNAME(sc), #_e, nu->_e, nu->_e); \ -} while (0) - _NXBUSER(nu_image.nim_bootld_ver); - _NXBUSER(nu_image.nim_bootld_size); - _NXBUSER(nu_image.nim_image_ver); - _NXBUSER(nu_image.nim_image_size); - _NXBUSER(nu_primary); - _NXBUSER(nu_secondary); - _NXBUSER(nu_subsys_id); - DPRINTF(NXDBG_FLASH, "%s: nu_serial_num: %s\n", - DEVNAME(sc), nu->nu_serial_num); - _NXBUSER(nu_bios_ver); -#undef _NXBUSER -#endif - - free(nu, M_TEMP); - - /* - * bootstrap the firmware, the status will be polled in the - * mountroot hook. - */ - nxb_newstate(sc, NX_S_BOOT); - - return (0); -} - -int -nxb_newstate(struct nxb_softc *sc, int newstate) -{ - int oldstate = sc->sc_state; - - sc->sc_state = newstate; - DPRINTF(NXDBG_STATE, "%s(%s) state %d -> %d\n", - DEVNAME(sc), __func__, oldstate, newstate); - - switch (newstate) { - case NX_S_RESET: - timeout_del(&sc->sc_reload); - nxb_reset(sc); - break; - case NX_S_BOOT: - /* - * Initialize and bootstrap the device - */ - nxb_writecrb(sc, NXSW_CMD_PRODUCER_OFF, 0); - nxb_writecrb(sc, NXSW_CMD_CONSUMER_OFF, 0); - nxb_writecrb(sc, NXSW_DRIVER_VER, NX_FIRMWARE_VER); - nxb_writecrb(sc, NXROMUSB_GLB_PEGTUNE, - NXROMUSB_GLB_PEGTUNE_DONE); - break; - case NX_S_LOADED: - /* - * Initially wait for the device to become ready - */ - assert(oldstate == NX_S_BOOT); - timeout_del(&sc->sc_reload); - if (nxb_wait(sc, NXSW_CMDPEG_STATE, NXSW_CMDPEG_INIT_DONE, - NXSW_CMDPEG_STATE_M, 1, 2000000) != 0) { - printf("%s: bootstrap failed, code 0x%x\n", - DEVNAME(sc), - nxb_readcrb(sc, NXSW_CMDPEG_STATE)); - sc->sc_state = NX_S_FAIL; - return (-1); - } - break; - case NX_S_RELOADED: - assert(oldstate == NX_S_RESET || oldstate == NX_S_BOOT); - /* - * Wait for the device to become ready - */ - sc->sc_reloaded = 20000; - timeout_add(&sc->sc_reload, hz / 100); - break; - case NX_S_READY: - nxb_temp_sensor(sc); - break; - case NX_S_FAIL: - if (oldstate == NX_S_RELOADED) - printf("%s: failed to reset the firmware, " - "code 0x%x\n", DEVNAME(sc), - nxb_readcrb(sc, NXSW_CMDPEG_STATE)); - break; - default: - /* no action */ - break; - } - - return (0); -} - -void -nxb_mountroot(void *arg) -{ - struct nxb_softc *sc = (struct nxb_softc *)arg; - - /* - * Poll the status of the running firmware. - */ - if (nxb_newstate(sc, NX_S_LOADED) != 0) - return; - - /* Start sensor */ - sensor_task_register(sc, nxb_temp_sensor, NX_POLL_SENSOR); - - /* - * Get and validate the loaded firmware version - */ - sc->sc_fwmajor = nxb_readcrb(sc, NXSW_FW_VERSION_MAJOR); - sc->sc_fwminor = nxb_readcrb(sc, NXSW_FW_VERSION_MINOR); - sc->sc_fwbuild = nxb_readcrb(sc, NXSW_FW_VERSION_BUILD); - printf("%s: firmware %u.%u.%u", DEVNAME(sc), - sc->sc_fwmajor, sc->sc_fwminor, sc->sc_fwbuild); - if (sc->sc_fwmajor != NX_FIRMWARE_MAJOR || - sc->sc_fwminor != NX_FIRMWARE_MINOR) { - printf(", requires %u.%u.xx (%u.%u.%u)", - NX_FIRMWARE_MAJOR, NX_FIRMWARE_MINOR, - NX_FIRMWARE_MAJOR, NX_FIRMWARE_MINOR, - NX_FIRMWARE_BUILD); - sc->sc_flags |= NXFLAG_FWINVALID; - } - printf("\n"); - - nxb_newstate(sc, NX_S_RESET); -} - -void -nxb_reload(void *arg) -{ - struct nxb_softc *sc = (struct nxb_softc *)arg; - u_int32_t val; - - /* - * Check if the device is ready, other re-schedule or timeout - */ - val = nxb_readcrb(sc, NXSW_CMDPEG_STATE); - if (((val & NXSW_CMDPEG_STATE_M) != NXSW_CMDPEG_INIT_DONE) && - ((val & NXSW_CMDPEG_STATE_M) != NXSW_CMDPEG_INIT_ACK)) { - if (!sc->sc_reloaded--) - nxb_newstate(sc, NX_S_FAIL); - else - timeout_add(&sc->sc_reload, hz / 100); - return; - } - nxb_writecrb(sc, NXSW_MPORT_MODE, NXSW_MPORT_MODE_NFUNC); - nxb_writecrb(sc, NXSW_CMDPEG_STATE, NXSW_CMDPEG_INIT_ACK); - - /* Firmware is ready for operation, allow interrupts etc. */ - nxb_newstate(sc, NX_S_READY); -} - -int -nxb_loadfirmware(struct nxb_softc *sc, struct nxb_firmware_header *fh, - u_int8_t **fw, size_t *fwlen) -{ -#ifdef NXB_LOADFIRMWARE - u_int8_t *mem; - size_t memlen; - - /* - * Load a supported bootloader and firmware image from disk - */ - if (loadfirmware("nxb", &mem, &memlen) != 0) - return (-1); - - if ((memlen) < sizeof(*fh)) - goto fail; - bcopy(mem, fh, sizeof(*fh)); - if (ntohl(fh->fw_hdrver) != NX_FIRMWARE_HDRVER) - goto fail; - - *fw = mem; - *fwlen = memlen; - - return (0); - fail: - free(mem, M_DEVBUF); -#endif - return (-1); -} - -int -nxb_reloadfirmware(struct nxb_softc *sc, struct nxb_firmware_header *fh, - u_int8_t **fw, size_t *fwlen) -{ - u_int8_t *mem; - size_t memlen; - u_int32_t addr, *data; - u_int i; - size_t bsize = NXFLASHMAP_BOOTLDSIZE; - - /* - * Load the images from flash, setup a fake firmware header - */ - memlen = bsize + sizeof(*fh); - mem = (u_int8_t *)malloc(memlen, M_DEVBUF, M_NOWAIT); - if (mem == NULL) - return (-1); - - fh->fw_hdrver = htonl(NX_FIRMWARE_HDRVER); - fh->fw_image_ver = htonl(sc->sc_nxbimage.nim_image_ver); - fh->fw_image_size = 0; /* Reload firmware image from flash */ - fh->fw_bootld_ver = htonl(sc->sc_nxbimage.nim_bootld_ver); - fh->fw_bootld_size = htonl(bsize); - bcopy(fh, mem, sizeof(*fh)); - - addr = NXFLASHMAP_BOOTLOADER; - data = (u_int32_t *)(mem + sizeof(*fh)); - for (i = 0; i < (bsize / 4); i++) { - if (nxb_read_rom(sc, addr, data) != 0) - goto fail; - addr += sizeof(u_int32_t); - *data++; - } - - *fw = mem; - *fwlen = memlen; - - return (0); - fail: - free(mem, M_DEVBUF); - return (-1); -} - -void -nxb_reset(struct nxb_softc *sc) -{ - struct nxb_firmware_header fh; - u_int8_t *fw = NULL; - size_t fwlen = 0; - int bootsz, imagesz; - u_int i; - u_int32_t *data, addr, addr1, val, ncrb; - bus_size_t reg; - - /* Reset the SW state */ - nxb_writecrb(sc, NXSW_CMDPEG_STATE, 0); - - /* - * Load the firmware from disk or from flash - */ - bzero(&fh, sizeof(fh)); - if (sc->sc_flags & NXFLAG_FWINVALID) { - if (nxb_loadfirmware(sc, &fh, &fw, &fwlen) != 0) { - printf("%s: failed to load firmware from disk\n", - DEVNAME(sc)); - goto fail; - } - } else { - if (nxb_reloadfirmware(sc, &fh, &fw, &fwlen) != 0) { - printf("%s: failed to reload firmware from flash\n", - DEVNAME(sc)); - goto fail; - } - } - - /* - * Validate the information found in the extra header - */ - val = ntohl(fh.fw_image_ver); - sc->sc_fwmajor = (val & NXB_IMAGE_MAJOR_M) >> NXB_IMAGE_MAJOR_S; - sc->sc_fwminor = (val & NXB_IMAGE_MINOR_M) >> NXB_IMAGE_MINOR_S; - sc->sc_fwbuild = (val & NXB_IMAGE_BUILD_M) >> NXB_IMAGE_BUILD_S; - if (sc->sc_flags & NXFLAG_FWINVALID) - printf("%s: using firmware %u.%u.%u\n", DEVNAME(sc), - sc->sc_fwmajor, sc->sc_fwminor, sc->sc_fwbuild); - if (sc->sc_fwmajor != NX_FIRMWARE_MAJOR || - sc->sc_fwminor != NX_FIRMWARE_MINOR) { - printf("%s: unsupported firmware version\n", - DEVNAME(sc)); - goto fail; - } - - bootsz = ntohl(fh.fw_bootld_size); - imagesz = ntohl(fh.fw_image_size); - if ((imagesz + bootsz) != (fwlen - sizeof(fh)) || - (imagesz % 4) || (bootsz % 4)) { - printf("%s: invalid firmware image\n", DEVNAME(sc)); - goto fail; - } - - /* - * Reset the SW registers - */ - - /* 1. Halt the hardware */ - nxb_writecrb(sc, NXROMUSB_GLB_SW_RESET, NXROMUSB_GLB_SW_RESET_DEF); - - /* 2. Read the CRBINIT area from flash memory */ - addr = NXFLASHMAP_CRBINIT_0; - if (nxb_read_rom(sc, addr, &ncrb) != 0) - goto fail1; - ncrb &= NXFLASHMAP_CRBINIT_M; - if (ncrb == 0 || ncrb > NXFLASHMAP_CRBINIT_MAX) - goto fail1; /* ignore CRBINIT and skip step */ - - /* 3. Write the CRBINIT area to PCI memory */ - for (i = 0; i < ncrb; i++) { - addr = NXFLASHMAP_CRBINIT_0 + (i * 8); - nxb_read_rom(sc, addr + 4, &val); - nxb_read_rom(sc, addr + 8, &addr1); - - if (nxb_writehw(sc, addr1, val) != 0) - goto fail1; - } - - /* 4. Reset the Protocol Processing Engine */ - val = nxb_readcrb(sc, NXROMUSB_GLB_SW_RESET) & - ~NXROMUSB_GLB_SW_RESET_PPE; - nxb_writecrb(sc, NXROMUSB_GLB_SW_RESET, val); - - /* 5. Reset the D & I caches */ - nxb_writecrb(sc, NXPPE_D(0x0e), 0x1e); - nxb_writecrb(sc, NXPPE_D(0x4c), 0x8); - nxb_writecrb(sc, NXPPE_I(0x4c), 0x8); - - /* 6. Clear the Protocol Processing Engine */ - nxb_writecrb(sc, NXPPE_0(0x8), 0); - nxb_writecrb(sc, NXPPE_0(0xc), 0); - nxb_writecrb(sc, NXPPE_1(0x8), 0); - nxb_writecrb(sc, NXPPE_1(0xc), 0); - nxb_writecrb(sc, NXPPE_2(0x8), 0); - nxb_writecrb(sc, NXPPE_2(0xc), 0); - nxb_writecrb(sc, NXPPE_3(0x8), 0); - nxb_writecrb(sc, NXPPE_3(0xc), 0); - - /* - * Load the images into RAM - */ - - /* Reset casper boot chip */ - nxb_writecrb(sc, NXROMUSB_GLB_CAS_RESET, NXROMUSB_GLB_CAS_RESET_ENABLE); - - addr = NXFLASHMAP_BOOTLOADER; - data = (u_int32_t *)(fw + sizeof(fh)); - for (i = 0; i < (bootsz / 4); i++) { - reg = nxb_set_pciwindow(sc, (u_int64_t)addr); - if (reg == ~0) - goto fail1; - nxb_write(sc, reg, *data); - addr += sizeof(u_int32_t); - data++; - } - if (imagesz) { - addr = NXFLASHMAP_FIRMWARE_0; - for (i = 0; i < (imagesz / 4); i++) { - reg = nxb_set_pciwindow(sc, (u_int64_t)addr); - if (reg == ~0) - goto fail1; - nxb_write(sc, reg, *data); - addr += sizeof(u_int32_t); - data++; - } - /* tell the bootloader to load the firmware image from RAM */ - nxb_writecrb(sc, NXSW_BOOTLD_CONFIG, NXSW_BOOTLD_CONFIG_RAM); - } else { - /* tell the bootloader to load the firmware image from flash */ - nxb_writecrb(sc, NXSW_BOOTLD_CONFIG, NXSW_BOOTLD_CONFIG_ROM); - } - - /* Power on the clocks and unreset the casper boot chip */ - nxb_writecrb(sc, NXROMUSB_GLB_CHIPCLKCONTROL, - NXROMUSB_GLB_CHIPCLKCONTROL_ON); - nxb_writecrb(sc, NXROMUSB_GLB_CAS_RESET, - NXROMUSB_GLB_CAS_RESET_DISABLE); - free(fw, M_DEVBUF); - fw = NULL; - - /* - * bootstrap the newly loaded firmware and wait for completion - */ - nxb_newstate(sc, NX_S_BOOT); - if (nxb_newstate(sc, NX_S_RELOADED) != 0) - goto fail; - return; - fail1: - printf("%s: failed to reset firmware\n", DEVNAME(sc)); - fail: - nxb_newstate(sc, NX_S_FAIL); - if (fw != NULL) - free(fw, M_DEVBUF); -} - -u_int32_t -nxb_read(struct nxb_softc *sc, bus_size_t reg) -{ - bus_space_barrier(sc->sc_memt, sc->sc_memh, reg, 4, - BUS_SPACE_BARRIER_READ); - return (bus_space_read_4(sc->sc_memt, sc->sc_memh, reg)); -} - -void -nxb_write(struct nxb_softc *sc, bus_size_t reg, u_int32_t val) -{ - bus_space_write_4(sc->sc_memt, sc->sc_memh, reg, val); - bus_space_barrier(sc->sc_memt, sc->sc_memh, reg, 4, - BUS_SPACE_BARRIER_WRITE); -} - -u_int32_t -nxb_readcrb(struct nxb_softc *sc, bus_size_t reg) -{ - reg = nxb_set_crbwindow(sc, reg); - bus_space_barrier(sc->sc_memt, sc->sc_memh, reg, 4, - BUS_SPACE_BARRIER_READ); - return (bus_space_read_4(sc->sc_memt, sc->sc_memh, reg)); -} - -void -nxb_writecrb(struct nxb_softc *sc, bus_size_t reg, u_int32_t val) -{ - reg = nxb_set_crbwindow(sc, reg); - bus_space_write_4(sc->sc_memt, sc->sc_memh, reg, val); - bus_space_barrier(sc->sc_memt, sc->sc_memh, reg, 4, - BUS_SPACE_BARRIER_WRITE); -} - -int -nxb_writehw(struct nxb_softc *sc, u_int32_t addr, u_int32_t val) -{ - /* Translation table of NIC addresses to PCI addresses */ - static const u_int16_t hwtrans[] = { - 0x29a0, 0x7730, 0x2950, 0x2a50, 0x0000, 0x0d00, - 0x1b10, 0x0e60, 0x0e00, 0x0e10, 0x0e20, 0x0e30, - 0x7000, 0x7010, 0x7020, 0x7030, 0x7040, 0x3400, - 0x3410, 0x3420, 0x3430, 0x3450, 0x3440, 0x3c00, - 0x3c10, 0x3c20, 0x3c30, 0x3c50, 0x3c40, 0x4100, - 0x0000, 0x0d10, 0x0000, 0x0000, 0x4160, 0x0c60, - 0x0c70, 0x0c80, 0x7580, 0x7590, 0x4170, 0x0000, - 0x0890, 0x70a0, 0x70b0, 0x70c0, 0x08d0, 0x08e0, - 0x70f0, 0x4050, 0x4200, 0x4210, 0x0000, 0x0880, - 0x0000, 0x0000, 0x0000, 0x0000, 0x7180, 0x0000 - }; - u_int32_t base = (addr & NXMEMMAP_HWTRANS_M) >> 16; - bus_size_t reg = ~0; - u_int i, timo = 1; - - for (i = 0; i < (sizeof(hwtrans) / sizeof(hwtrans[0])); i++) { - if (hwtrans[i] == base) { - reg = i << 20; - break; - } - } - if (reg == ~0) - return (-1); /* Invalid address */ - reg += (addr & ~NXMEMMAP_HWTRANS_M) + NXPCIMAP_CRB; - - /* Write value to the register, enable some workarounds */ - if (reg == NXSW_BOOTLD_CONFIG) - return (0); - else if (reg == NXROMUSB_GLB_SW_RESET) { - val = NXROMUSB_GLB_SW_RESET_XDMA; - timo = hz; - } - nxb_writecrb(sc, reg, val); - delay(timo); - - DPRINTF(NXDBG_CRBINIT, "%s(%s) addr 0x%08x -> reg 0x%08x, " - "val 0x%08x\n", DEVNAME(sc), __func__, addr, reg, val); - - return (0); -} - -u_int64_t -nxb_set_pciwindow(struct nxb_softc *sc, u_int64_t reg) -{ - int32_t window = -1; - u_int64_t wreg = ~0ULL; - - /* - * Get the correct offset in the mapped PCI space - */ - if (reg <= NXADDR_DDR_NET_END) { - window = (reg >> NXDDR_WINDOW_S) & NXDDR_WINDOW_M; - reg -= (window * NXDDR_WINDOW_SIZE); - if (sc->sc_ddrwindow != window) { - sc->sc_ddrwindow = window; - wreg = NXDDR_WINDOW(sc->sc_function); - } - } else if (reg >= NXADDR_OCM0 && reg <= NXADDR_OCM0_END) { - reg -= NXADDR_OCM0; - reg += NXPCIMAP_OCM0; - } else if (reg >= NXADDR_OCM1 && reg <= NXADDR_OCM1_END) { - reg -= NXADDR_OCM1; - reg += NXPCIMAP_OCM1; - } else if (reg >= NXADDR_QDR_NET && reg <= NXADDR_QDR_NET_END) { - reg -= NXADDR_QDR_NET; - window = (reg >> NXDDR_WINDOW_S) & NXDDR_WINDOW_M; - reg -= (window * NXQDR_WINDOW_SIZE); - reg += NXPCIMAP_QDR_NET; - if (sc->sc_qdrwindow != window) { - sc->sc_qdrwindow = window; - wreg = NXQDR_WINDOW(sc->sc_function); - } - } else - reg = ~0ULL; - - /* - * Update the PCI window - */ - if (wreg != ~0ULL) { - DPRINTF(NXDBG_WINDOW, "%s(%s) reg 0x%08x window 0x%08x\n", - DEVNAME(sc), __func__, sc->sc_window, wreg, window); - - nxb_write(sc, wreg, window); - (void)nxb_read(sc, wreg); - } - - return (reg); -} - -bus_size_t -nxb_set_crbwindow(struct nxb_softc *sc, bus_size_t reg) -{ - int window = 0; - - /* Set the correct CRB window */ - if ((reg >> NXCRB_WINDOW_S) & NXCRB_WINDOW_M) { - window = 1; - reg -= NXCRB_WINDOW_SIZE; - } - if (sc->sc_window == window) - return (reg); - nxb_write(sc, NXCRB_WINDOW(sc->sc_function), - window << NXCRB_WINDOW_S); - (void)nxb_read(sc, NXCRB_WINDOW(sc->sc_function)); - - DPRINTF(NXDBG_WINDOW, "%s(%s) window %d -> %d reg 0x%08x\n", - DEVNAME(sc), __func__, sc->sc_window, window, - reg + (window * NXCRB_WINDOW_SIZE)); - - sc->sc_window = window; - - return (reg); -} - -int -nxb_wait(struct nxb_softc *sc, bus_size_t reg, u_int32_t val, - u_int32_t mask, int is_set, u_int timeout) -{ - u_int i; - u_int32_t data; - - for (i = timeout; i > 0; i--) { - data = nxb_readcrb(sc, reg) & mask; - if (is_set) { - if (data == val) - goto done; - } else { - if (data != val) - goto done; - } - delay(10); - } - - return (-1); - done: - DPRINTF(NXDBG_WAIT, "%s(%s) " - "reg 0x%08x completed after %d/%d iterations\n", - DEVNAME(sc), __func__, reg, i, timeout); - return (0); -} - -int -nxb_read_rom(struct nxb_softc *sc, u_int32_t addr, u_int32_t *val) -{ - u_int32_t data; - int ret = 0; - - /* - * Need to set a lock and the lock ID to access the flash - */ - ret = nxb_wait(sc, NXSEM_FLASH_LOCK, - NXSEM_FLASH_LOCKED, NXSEM_FLASH_LOCK_M, 1, 10000); - if (ret != 0) { - DPRINTF(NXDBG_FLASH, "%s(%s): ROM lock timeout\n", - DEVNAME(sc), __func__); - return (-1); - } - nxb_writecrb(sc, NXSW_ROM_LOCK_ID, NXSW_ROM_LOCK_DRV); - - /* - * Setup ROM data transfer - */ - - /* Set the ROM address */ - nxb_writecrb(sc, NXROMUSB_ROM_ADDR, addr); - - /* The delay is needed to prevent bursting on the chipset */ - nxb_writecrb(sc, NXROMUSB_ROM_ABYTE_CNT, 3); - delay(100); - nxb_writecrb(sc, NXROMUSB_ROM_DUMMY_BYTE_CNT, 0); - - /* Set opcode and wait for completion */ - nxb_writecrb(sc, NXROMUSB_ROM_OPCODE, NXROMUSB_ROM_OPCODE_READ); - ret = nxb_wait(sc, NXROMUSB_GLB_STATUS, - NXROMUSB_GLB_STATUS_DONE, NXROMUSB_GLB_STATUS_DONE, 1, 100); - if (ret != 0) { - DPRINTF(NXDBG_FLASH, "%s(%s): ROM operation timeout\n", - DEVNAME(sc), __func__); - goto unlock; - } - - /* Reset counters */ - nxb_writecrb(sc, NXROMUSB_ROM_ABYTE_CNT, 0); - delay(100); - nxb_writecrb(sc, NXROMUSB_ROM_DUMMY_BYTE_CNT, 0); - - /* Finally get the value */ - data = nxb_readcrb(sc, NXROMUSB_ROM_RDATA); - - /* Flash data is stored in little endian */ - *val = letoh32(data); - - unlock: - /* - * Release the lock - */ - (void)nxb_readcrb(sc, NXSEM_FLASH_UNLOCK); - - return (ret); -} - -void -nxb_temp_sensor(void *arg) -{ - struct nxb_softc *sc = (struct nxb_softc *)arg; - u_int32_t data, val, state; - - if (sc->sc_state != NX_S_READY) { - sc->sc_sensor.flags = SENSOR_FUNKNOWN; - return; - } - - data = nxb_readcrb(sc, NXSW_TEMP); - state = (data & NXSW_TEMP_STATE_M) >> NXSW_TEMP_STATE_S; - val = (data & NXSW_TEMP_VAL_M) >> NXSW_TEMP_VAL_S; - - switch (state) { - case NXSW_TEMP_STATE_NONE: - sc->sc_sensor.status = SENSOR_S_UNSPEC; - break; - case NXSW_TEMP_STATE_OK: - sc->sc_sensor.status = SENSOR_S_OK; - break; - case NXSW_TEMP_STATE_WARN: - sc->sc_sensor.status = SENSOR_S_WARN; - break; - case NXSW_TEMP_STATE_CRIT: - sc->sc_sensor.status = SENSOR_S_CRIT; - break; - default: - sc->sc_sensor.flags = SENSOR_FUNKNOWN; - return; - } - sc->sc_sensor.value = val * 1000000 + 273150000; - sc->sc_sensor.flags = 0; -} - -int -nxb_dmamem_alloc(struct nxb_softc *sc, struct nxb_dmamem *nxm, - bus_size_t size, const char *mname) -{ - nxm->nxm_size = size; - - if (bus_dmamap_create(sc->sc_dmat, nxm->nxm_size, 1, - nxm->nxm_size, 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, - &nxm->nxm_map) != 0) - return (1); - if (bus_dmamem_alloc(sc->sc_dmat, nxm->nxm_size, - NX_DMA_ALIGN, 0, &nxm->nxm_seg, 1, &nxm->nxm_nsegs, - BUS_DMA_NOWAIT) != 0) - goto destroy; - if (bus_dmamem_map(sc->sc_dmat, &nxm->nxm_seg, nxm->nxm_nsegs, - nxm->nxm_size, &nxm->nxm_kva, BUS_DMA_NOWAIT) != 0) - goto free; - if (bus_dmamap_load(sc->sc_dmat, nxm->nxm_map, nxm->nxm_kva, - nxm->nxm_size, NULL, BUS_DMA_NOWAIT) != 0) - goto unmap; - - bzero(nxm->nxm_kva, nxm->nxm_size); - nxm->nxm_name = mname; - - return (0); - unmap: - bus_dmamem_unmap(sc->sc_dmat, nxm->nxm_kva, nxm->nxm_size); - free: - bus_dmamem_free(sc->sc_dmat, &nxm->nxm_seg, 1); - destroy: - bus_dmamap_destroy(sc->sc_dmat, nxm->nxm_map); - return (1); -} - -void -nxb_dmamem_free(struct nxb_softc *sc, struct nxb_dmamem *nxm) -{ - bus_dmamap_unload(sc->sc_dmat, nxm->nxm_map); - bus_dmamem_unmap(sc->sc_dmat, nxm->nxm_kva, nxm->nxm_size); - bus_dmamem_free(sc->sc_dmat, &nxm->nxm_seg, 1); - bus_dmamap_destroy(sc->sc_dmat, nxm->nxm_map); -} - -/* - * Routines handling the virtual ''nx'' ports - */ - -int -nx_match(struct device *parent, void *match, void *aux) -{ - struct nxb_port *nxp = (struct nxb_port *)aux; - - if (nxp->nxp_id >= NX_MAX_PORTS) - return (0); - - switch (nxp->nxp_mode) { - case NXNIU_MODE_XGE: - case NXNIU_MODE_GBE: - return (1); - case NXNIU_MODE_FC: - /* FibreChannel mode is not documented and not supported */ - return (0); - } - - return (0); -} - -void -nx_attach(struct device *parent, struct device *self, void *aux) -{ - struct nxb_softc *sc = (struct nxb_softc *)parent; - struct nx_softc *nx = (struct nx_softc *)self; - struct nxb_port *nxp = (struct nxb_port *)aux; - struct ifnet *ifp; - - nx->nx_sc = sc; - nx->nx_port = nxp; - nxp->nxp_nx = nx; - - if (bus_space_subregion(sc->sc_memt, sc->sc_memh, - nxp->nxp_phyregion, NXNIU_PORT_SIZE, &nx->nx_memh) != 0) { - printf(": unable to map port subregion\n"); - return; - } - - nx->nx_ih = pci_intr_establish(sc->sc_pc, sc->sc_ih, IPL_NET, - nx_intr, nx, DEVNAME(nx)); - if (nx->nx_ih == NULL) { - printf(": unable to establish interrupt\n"); - return; - } - - if (nx_alloc(nx) != 0) { - printf(": unable to allocate ring or dma memory\n"); - pci_intr_disestablish(sc->sc_pc, nx->nx_ih); - return; - } - - bcopy(nxp->nxp_lladdr, nx->nx_ac.ac_enaddr, ETHER_ADDR_LEN); - printf(": address %s\n", ether_sprintf(nx->nx_ac.ac_enaddr)); - - ifp = &nx->nx_ac.ac_if; - ifp->if_softc = nx; - ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; - ifp->if_ioctl = nx_ioctl; - ifp->if_start = nx_start; - ifp->if_watchdog = nx_watchdog; - ifp->if_hardmtu = NX_JUMBO_MTU; - strlcpy(ifp->if_xname, DEVNAME(nx), IFNAMSIZ); - IFQ_SET_MAXLEN(&ifp->if_snd, NX_MAX_TX_DESC - 1); - IFQ_SET_READY(&ifp->if_snd); - - ifp->if_capabilities = IFCAP_VLAN_MTU; -#if 0 - ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING; - ifp->if_capabilities |= IFCAP_CSUM_IPv4 | IFCAP_CSUM_TCPv4 | - IFCAP_CSUM_UDPv4; -#endif - if (nxp->nxp_mode == NXNIU_MODE_GBE) - ifp->if_baudrate = IF_Gbps(1); - else - ifp->if_baudrate = ULONG_MAX; /* XXX fix if_baudrate */ - - ifmedia_init(&nx->nx_mii.mii_media, 0, - nx_media_change, nx_media_status); - ifmedia_add(&nx->nx_mii.mii_media, IFM_ETHER|nxp->nxp_phy, 0, NULL); - ifmedia_set(&nx->nx_mii.mii_media, IFM_ETHER|nxp->nxp_phy); - - if_attach(ifp); - ether_ifattach(ifp); - - timeout_set(&nx->nx_tick, nx_tick, nx); - timeout_add(&nx->nx_tick, hz); -} - -int -nx_print(void *aux, const char *parentname) -{ - struct nxb_port *nxp = (struct nxb_port *)aux; - - if (parentname) - printf("nx port %u at %s", - nxp->nxp_id, parentname); - else - printf(" port %u", nxp->nxp_id); - return (UNCONF); -} - -int -nx_media_change(struct ifnet *ifp) -{ - struct nx_softc *nx = (struct nx_softc *)ifp->if_softc; - struct nxb_port *nxp = nx->nx_port; - - switch (nxp->nxp_mode) { - case NXNIU_MODE_XGE: - /* XXX */ - break; - case NXNIU_MODE_GBE: - mii_mediachg(&nx->nx_mii); - break; - } - - return (0); -} - -void -nx_media_status(struct ifnet *ifp, struct ifmediareq *imr) -{ - struct nx_softc *nx = (struct nx_softc *)ifp->if_softc; - struct nxb_softc *sc = nx->nx_sc; - struct nxb_port *nxp = nx->nx_port; - u_int32_t val; - - switch (nxp->nxp_mode) { - case NXNIU_MODE_XGE: - imr->ifm_active = IFM_ETHER | nxp->nxp_phy | IFM_FDX; - imr->ifm_status = IFM_AVALID; - nx_link_state(nx); - if (!LINK_STATE_IS_UP(ifp->if_link_state)) - break; - imr->ifm_status |= IFM_ACTIVE; - - /* Flow control */ - imr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE; - val = nxb_readcrb(sc, NXNIU_XGE_PAUSE_CONTROL); - if (((val >> NXNIU_XGE_PAUSE_S(nxp->nxp_id)) & - NXNIU_XGE_PAUSE_M) == 0) - imr->ifm_active |= IFM_ETH_TXPAUSE; - break; - case NXNIU_MODE_GBE: - mii_pollstat(&nx->nx_mii); - imr->ifm_active = nx->nx_mii.mii_media_active; - imr->ifm_status = nx->nx_mii.mii_media_status; - mii_mediachg(&nx->nx_mii); - break; - } -} - -void -nx_link_state(struct nx_softc *nx) -{ - struct nxb_port *nxp = nx->nx_port; - struct nxb_softc *sc = nx->nx_sc; - struct ifnet *ifp = &nx->nx_ac.ac_if; - u_int32_t status = 0; - int link_state = LINK_STATE_DOWN; - - switch (nxp->nxp_mode) { - case NXNIU_MODE_XGE: - status = nxb_readcrb(sc, NXSW_XG_STATE) >> (nxp->nxp_id * 8); - if (status & NXSW_XG_LINK_UP) - link_state = LINK_STATE_FULL_DUPLEX; - if (ifp->if_link_state != link_state) { - ifp->if_link_state = link_state; - if_link_state_change(ifp); - } - break; - case NXNIU_MODE_GBE: - mii_tick(&nx->nx_mii); - break; - } -} - -void -nx_watchdog(struct ifnet *ifp) -{ - return; -} - -int -nx_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) -{ - struct nx_softc *nx = (struct nx_softc *)ifp->if_softc; - struct ifaddr *ifa = (struct ifaddr *)data; - struct ifreq *ifr = (struct ifreq *)data; - int s, error = 0; - - s = splnet(); - - if ((error = ether_ioctl(ifp, &nx->nx_ac, cmd, data)) > 0) { - splx(s); - return (error); - } - - switch (cmd) { - case SIOCSIFADDR: - ifp->if_flags |= IFF_UP; -#ifdef INET - if (ifa->ifa_addr->sa_family == AF_INET) - arp_ifinit(&nx->nx_ac, ifa); -#endif - /* FALLTHROUGH */ - case SIOCSIFFLAGS: - if (ifp->if_flags & IFF_UP) { - if (ifp->if_flags & IFF_RUNNING) - nx_iff(nx); - else - nx_init(ifp); - } else { - if (ifp->if_flags & IFF_RUNNING) - nx_stop(ifp); - } - break; - - case SIOCSIFMTU: - if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ifp->if_hardmtu) - error = EINVAL; - else if (ifp->if_mtu != ifr->ifr_mtu) - ifp->if_mtu = ifr->ifr_mtu; - break; - - case SIOCADDMULTI: - case SIOCDELMULTI: - error = (cmd == SIOCADDMULTI) ? - ether_addmulti(ifr, &nx->nx_ac) : - ether_delmulti(ifr, &nx->nx_ac); - break; - - case SIOCGIFMEDIA: - case SIOCSIFMEDIA: - error = ifmedia_ioctl(ifp, ifr, &nx->nx_mii.mii_media, cmd); - break; - - default: - error = ENOTTY; - } - - if (error == ENETRESET) { - if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == - (IFF_UP | IFF_RUNNING)) - nx_iff(nx); - error = 0; - } - - splx(s); - - return (error); -} - -void -nx_init(struct ifnet *ifp) -{ - struct nx_softc *nx = (struct nx_softc *)ifp->if_softc; - struct nxb_softc *sc = nx->nx_sc; - int s; - - if (sc->sc_state != NX_S_READY) - return; - - s = splnet(); - - if (nxb_wait(sc, NXSW_PORTREG(nx, NXSW_RCVPEG_STATE), - NXSW_RCVPEG_INIT_DONE, NXSW_RCVPEG_STATE_M, 1, 2000) != 0) { - printf("%s: receive engine not ready, code 0x%x\n", - DEVNAME(nx), nx_readcrb(nx, NXSW_RCVPEG_STATE)); - goto done; - } - - nx_setlladdr(nx, LLADDR(ifp->if_sadl)); - - if (nx_init_rings(nx) != 0) - goto done; - - /* Set and enable interrupts */ - nxb_writecrb(sc, NXSW_GLOBAL_INT_COAL, 0); /* XXX */ - nxb_writecrb(sc, NXSW_INT_COAL_MODE, 0); /* XXX */ - nxb_writecrb(sc, NXISR_INT_MASK, NXISR_INT_MASK_ENABLE); - nxb_writecrb(sc, NXISR_INT_VECTOR, 0); - nxb_writecrb(sc, NXISR_TARGET_MASK, NXISR_TARGET_MASK_ENABLE); - - DPRINTF(NXDBG_INTR, "%s(%s) enabled interrupts\n", - DEVNAME(nx), __func__); - - ifp->if_flags |= IFF_RUNNING; - ifp->if_flags &= ~IFF_OACTIVE; - - done: - splx(s); -} - -void -nx_stop(struct ifnet *ifp) -{ - struct nx_softc *nx = (struct nx_softc *)ifp->if_softc; - struct nxb_softc *sc = nx->nx_sc; - int s; - - s = splnet(); - ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); - - /* Disable interrupts */ - nxb_writecrb(sc, NXISR_INT_MASK, 0); - nxb_writecrb(sc, NXISR_INT_VECTOR, 0); - nxb_writecrb(sc, NXISR_TARGET_MASK, 0); - - nx_free_rings(nx); - splx(s); -} - -#define NX_INC(_x, _y) (_x) = ((_x) + 1) % (_y) -#define NX_TXURN_WARN(_rd) ((_rd)->rd_txpending >= (NX_MAX_TX_DESC - 5)) -#define NX_TXURN(_rd) ((_rd)->rd_txpending >= NX_MAX_TX_DESC) - -void -nx_start(struct ifnet *ifp) -{ - struct nx_softc *nx = (struct nx_softc *)ifp->if_softc; - struct nxb_softc *sc = nx->nx_sc; - struct nxb_port *nxp = nx->nx_port; - struct nx_ringdata *rd = nx->nx_rings; - struct nxb_dmamem *txm; - struct mbuf *m; - struct nx_buf *nb; - struct nx_txdesc *txd; - bus_dmamap_t map; - u_int64_t port = nxp->nxp_id, nsegs, len; - u_int32_t producer; - u_int i, idx, tx = 0; - - if ((ifp->if_flags & IFF_RUNNING) == 0|| - (ifp->if_flags & IFF_OACTIVE) || - IFQ_IS_EMPTY(&ifp->if_snd)) - return; - - txm = &rd->rd_txdma; - producer = rd->rd_txproducer; - - for (;;) { - if (NX_TXURN(rd)) { - ifp->if_flags |= IFF_OACTIVE; - break; - } - - IFQ_POLL(&ifp->if_snd, m); - if (m == NULL) - break; - - idx = rd->rd_txproducer; - if (idx >= NX_MAX_TX_DESC) { - printf("%s: tx idx is corrupt\n", DEVNAME(nx)); - ifp->if_oerrors++; - break; - } - - txd = &rd->rd_txring[idx]; - bzero(txd, sizeof(*txd)); - - nb = &rd->rd_txbuf[idx]; - if (nb->nb_m != NULL) { - printf("%s: tx ring is corrupt\n", DEVNAME(nx)); - ifp->if_oerrors++; - break; - } - - /* - * we're committed to sending it now. if we cant map it into - * dma memory then we drop it. - */ - IFQ_DEQUEUE(&ifp->if_snd, m); - map = nb->nb_dmamap; - if (bus_dmamap_load_mbuf(sc->sc_dmat, map, m, - BUS_DMA_NOWAIT) != 0) { - m_freem(m); - printf("%s: could not load mbuf dma map", DEVNAME(nx)); - ifp->if_oerrors++; - break; - } - if (map->dm_nsegs > 4) { - m_freem(m); - printf("%s: too many segments for tx", DEVNAME(nx)); - ifp->if_oerrors++; - break; - } - nb->nb_m = m; - -#if NBPFILTER > 0 - if (ifp->if_bpf) - bpf_mtap(ifp->if_bpf, nb->nb_m, BPF_DIRECTION_OUT); -#endif - - len = 0; - nsegs = map->dm_nsegs; - txd->tx_buflength = 0; - for (i = 0; i < nsegs; i++) { - len += map->dm_segs[i].ds_len; - switch (i) { - case 0: - txd->tx_buflength |= - htole64((map->dm_segs[i].ds_len << - NX_TXDESC_BUFLENGTH1_S) & - NX_TXDESC_BUFLENGTH1_M); - txd->tx_addr1 = - htole64(map->dm_segs[i].ds_addr); - break; - case 1: - txd->tx_buflength |= - htole64((map->dm_segs[i].ds_len << - NX_TXDESC_BUFLENGTH2_S) & - NX_TXDESC_BUFLENGTH2_M); - txd->tx_addr2 = - htole64(map->dm_segs[i].ds_addr); - break; - case 2: - txd->tx_buflength |= - htole64(((u_int64_t) - map->dm_segs[i].ds_len << - NX_TXDESC_BUFLENGTH3_S) & - NX_TXDESC_BUFLENGTH3_M); - txd->tx_addr3 = - htole64(map->dm_segs[i].ds_addr); - break; - case 3: - txd->tx_buflength |= - htole64(((u_int64_t) - map->dm_segs[i].ds_len << - NX_TXDESC_BUFLENGTH4_S) & - NX_TXDESC_BUFLENGTH4_M); - txd->tx_addr4 = - htole64(map->dm_segs[i].ds_addr); - break; - } - } - txd->tx_word0 = htole64( - ((NX_TXDESC0_OP_TX << NX_TXDESC0_OP_S) & NX_TXDESC0_OP_M) | - ((nsegs << NX_TXDESC0_NBUF_S) & NX_TXDESC0_NBUF_M) | - ((len << NX_TXDESC0_LENGTH_S) & NX_TXDESC0_LENGTH_M)); - txd->tx_word2 = htole64( - ((idx << NX_TXDESC2_HANDLE_S) & NX_TXDESC2_HANDLE_M) | - ((port << NX_TXDESC2_PORT_S) & NX_TXDESC2_PORT_M) | - ((port << NX_TXDESC2_CTXID_S) & NX_TXDESC2_CTXID_M)); - - DPRINTF(NXDBG_TX, "%s(%s): txd w0:%016llx w2:%016llx " - "a1:%016llx a2:%016llx a3:%016llx a4:%016llx len:%016llx\n", - DEVNAME(nx), __func__, txd->tx_word0, txd->tx_word2, - txd->tx_addr1, txd->tx_addr2, txd->tx_addr3, txd->tx_addr4, - txd->tx_buflength); - - bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize, - BUS_DMASYNC_PREWRITE); - - ifp->if_opackets++; - rd->rd_txpending++; - - NX_INC(rd->rd_txproducer, NX_MAX_TX_DESC); - - tx = 1; - } - - bus_dmamap_sync(sc->sc_dmat, txm->nxm_map, 0, txm->nxm_size, - BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); - - if (tx) { - DPRINTF(NXDBG_TX, "%s(%s): producer 0x%08x\n", - DEVNAME(nx), __func__, producer); - nxb_writecrb(sc, NXSW_CMD_PRODUCER_OFF, producer); - - /* Ring... */ - nx_doorbell(nx, NXDB_PEGID_TX, - NXDB_OPCODE_CMD_PROD, producer); - } - - return; -} - -void -nx_iff(struct nx_softc *nx) -{ - return; -} - -void -nx_tick(void *arg) -{ - struct nx_softc *nx = (struct nx_softc *)arg; - struct nxb_softc *sc = nx->nx_sc; - - if (sc->sc_state != NX_S_READY) - goto done; - - nx_link_state(nx); - - done: - timeout_add(&nx->nx_tick, hz); -} - -int -nx_intr(void *arg) -{ - struct nx_softc *nx = (struct nx_softc *)arg; - struct nxb_port *nxp = nx->nx_port; - struct nxb_softc *sc = nx->nx_sc; - u_int32_t inv; - u_int i; - - if (sc->sc_state != NX_S_READY) - return (0); - - /* Is the interrupt for us? */ - inv = nxb_read(sc, NXISR_INT_VECTOR); - if ((inv & NXISR_INT_VECTOR_PORT(nxp->nxp_id)) == 0) - return (0); - DPRINTF(NXDBG_INTR, "%s(%s): int vector 0x%08x\n", - DEVNAME(nx), __func__, inv); - - nxb_writecrb(sc, NXISR_INT_MASK, NXISR_INT_MASK_DISABLE); - for (i = 0; i < 32; i++) { - nxb_writecrb(sc, NXISR_TARGET_MASK, NXISR_TARGET_MASK_DISABLE); - inv = nxb_readcrb(sc, NXISR_INT_VECTOR); - if ((inv & NXISR_INT_VECTOR_PORT(nxp->nxp_id)) == 0) - break; - } - if (inv) - printf("%s: failed to disable interrupt\n", DEVNAME(nx)); - - /* Ring... */ - DPRINTF(NXDBG_INTR, "%s(%s): consumer 0x%08x\n", - DEVNAME(nx), __func__, nx->nx_rc->rc_txconsumer); - - nxb_writecrb(sc, NXISR_INT_MASK, NXISR_INT_MASK_ENABLE); - - return (1); -} - -void -nx_setlladdr(struct nx_softc *nx, u_int8_t *lladdr) -{ - struct nxb_softc *sc = nx->nx_sc; - - nxb_set_crbwindow(sc, NXMEMMAP_WINDOW0_START); - bus_space_write_region_1(sc->sc_memt, nx->nx_memh, - NX_XGE_STATION_ADDR_HI, lladdr, ETHER_ADDR_LEN); - bus_space_barrier(sc->sc_memt, nx->nx_memh, - NX_XGE_STATION_ADDR_HI, ETHER_ADDR_LEN, BUS_SPACE_BARRIER_WRITE); -} - -void -nx_doorbell(struct nx_softc *nx, u_int8_t id, u_int8_t cmd, u_int32_t count) -{ - struct nxb_softc *sc = nx->nx_sc; - struct nxb_port *nxp = nx->nx_port; - u_int32_t data; - - /* Create the doorbell message */ - data = ((NXDB_PEGID_S << id) & NXDB_PEGID_M) | - ((NXDB_COUNT_S << count) & NXDB_COUNT_M) | - ((NXDB_CTXID_S << nxp->nxp_id) & NXDB_CTXID_M) | - ((NXDB_OPCODE_S << cmd) & NXDB_OPCODE_M) | - NXDB_PRIVID; - - bus_space_write_4(sc->sc_dbmemt, sc->sc_dbmemh, 0, data); - bus_space_barrier(sc->sc_dbmemt, sc->sc_dbmemh, 0, 4, - BUS_SPACE_BARRIER_WRITE); -} - -u_int32_t -nx_readphy(struct nx_softc *nx, bus_size_t reg) -{ - struct nxb_softc *sc = nx->nx_sc; - - nxb_set_crbwindow(sc, NXMEMMAP_WINDOW0_START); - bus_space_barrier(sc->sc_memt, nx->nx_memh, reg, 4, - BUS_SPACE_BARRIER_READ); - return (bus_space_read_4(sc->sc_memt, nx->nx_memh, reg)); -} - -void -nx_writephy(struct nx_softc *nx, bus_size_t reg, u_int32_t val) -{ - struct nxb_softc *sc = nx->nx_sc; - - nxb_set_crbwindow(sc, NXMEMMAP_WINDOW0_START); - bus_space_write_4(sc->sc_memt, nx->nx_memh, reg, val); - bus_space_barrier(sc->sc_memt, nx->nx_memh, reg, 4, - BUS_SPACE_BARRIER_WRITE); -} - -u_int32_t -nx_readcrb(struct nx_softc *nx, enum nxsw_portreg n) -{ - struct nxb_softc *sc = nx->nx_sc; - u_int32_t reg; - - reg = NXSW_PORTREG(nx, n); - nxb_set_crbwindow(sc, NXMEMMAP_WINDOW1_START); - bus_space_barrier(sc->sc_memt, sc->sc_memh, reg, 4, - BUS_SPACE_BARRIER_READ); - return (bus_space_read_4(sc->sc_memt, sc->sc_memh, reg)); -} - -void -nx_writecrb(struct nx_softc *nx, enum nxsw_portreg n, u_int32_t val) -{ - struct nxb_softc *sc = nx->nx_sc; - u_int32_t reg; - - reg = NXSW_PORTREG(nx, n); - nxb_set_crbwindow(sc, NXMEMMAP_WINDOW1_START); - bus_space_write_4(sc->sc_memt, sc->sc_memh, reg, val); - bus_space_barrier(sc->sc_memt, sc->sc_memh, reg, 4, - BUS_SPACE_BARRIER_WRITE); -} - -int -nx_alloc(struct nx_softc *nx) -{ - struct nxb_softc *sc = nx->nx_sc; - struct nxb_port *nxp = nx->nx_port; - struct nxb_dmamem *nxm; - struct nx_ringcontext *rc; - u_int64_t addr; - - /* - * One DMA'ed ring context per virtual port - */ - nxm = &nx->nx_rcdma; - if (nxb_dmamem_alloc(sc, nxm, sizeof(*rc), "ringcontext") != 0) - return (1); - - rc = (struct nx_ringcontext *)nxm->nxm_kva; - - /* Initialize the ring context */ - rc->rc_id = htole32(nxp->nxp_id); - addr = nxm->nxm_map->dm_segs[0].ds_addr + /* physaddr */ - offsetof(struct nx_ringcontext, rc_txconsumer); - rc->rc_txconsumeroff = htole64(addr); - nx->nx_rc = rc; - - /* - * Ring data used by the driver - */ - nx->nx_rings = (struct nx_ringdata *) - malloc(sizeof(struct nx_ringdata), M_NOWAIT, M_DEVBUF); - if (nx->nx_rings == NULL) { - nxb_dmamem_free(sc, nxm); - return (1); - } - bzero(nx->nx_rings, sizeof(struct nx_ringdata)); - - return (0); -} - -void -nx_free(struct nx_softc *nx) -{ - struct nxb_softc *sc = nx->nx_sc; - nxb_dmamem_free(sc, &nx->nx_rcdma); -} - -struct mbuf * -nx_getbuf(struct nx_softc *nx, bus_dmamap_t map, int wait) -{ - struct nxb_softc *sc = nx->nx_sc; - struct mbuf *m = NULL; - - MGETHDR(m, wait ? M_WAIT : M_DONTWAIT, MT_DATA); - if (m == NULL) - goto merr; - - MCLGET(m, wait ? M_WAIT : M_DONTWAIT); - if ((m->m_flags & M_EXT) == 0) - goto merr; - m->m_len = m->m_pkthdr.len = MCLBYTES; - - if (bus_dmamap_load_mbuf(sc->sc_dmat, map, m, - wait ? BUS_DMA_WAITOK : BUS_DMA_NOWAIT) != 0) { - printf("%s: could not load mbuf dma map", DEVNAME(nx)); - goto err; - } - - return (m); - merr: - printf("%s: unable to allocate mbuf", DEVNAME(nx)); - err: - if (m != NULL) - m_freem(m); - return (NULL); -} - -int -nx_init_rings(struct nx_softc *nx) -{ - struct nxb_softc *sc = nx->nx_sc; - struct nxb_port *nxp = nx->nx_port; - struct nxb_dmamem *nxm; - struct nx_ringcontext *rc = nx->nx_rc; - struct nx_ringdata *rd = nx->nx_rings; - struct nx_rxcontext *rxc; - struct nx_buf *nb; - struct nx_rxdesc *rxd; - u_int64_t addr; - int i, size; - - nxm = &nx->nx_rcdma; - bus_dmamap_sync(sc->sc_dmat, nxm->nxm_map, 0, nxm->nxm_size, - BUS_DMASYNC_PREWRITE); - - /* - * Rx descriptors - */ - nxm = &rd->rd_rxdma; - size = NX_MAX_RX_DESC * sizeof(struct nx_rxdesc); - if (nxb_dmamem_alloc(sc, nxm, size, "rxdesc") != 0) { - printf("%s: failed to alloc rx dma memory\n", - DEVNAME(nx)); - return (1); - } - - rd->rd_rxring = (struct nx_rxdesc *)nxm->nxm_kva; - addr = nxm->nxm_map->dm_segs[0].ds_addr; - rxc = &rc->rc_rxcontext[NX_RX_CONTEXT]; - rxc->rxc_ringaddr = htole64(addr); - rxc->rxc_ringsize = htole32(NX_MAX_RX_DESC); - - /* Rx buffers */ - for (i = 0; i < NX_MAX_RX_DESC; i++) { - nb = &rd->rd_rxbuf[i]; - rxd = rd->rd_rxring + i; - - if (bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, - MCLBYTES, 0, BUS_DMA_NOWAIT, &nb->nb_dmamap) != 0) { - printf("%s: unable to create dmamap for rx %d\n", - DEVNAME(nx), i); - goto fail; - } - - nb->nb_m = nx_getbuf(nx, nb->nb_dmamap, NX_NOWAIT); - if (nb->nb_m == NULL) { - bus_dmamap_destroy(sc->sc_dmat, nb->nb_dmamap); - goto fail; - } - - bus_dmamap_sync(sc->sc_dmat, nb->nb_dmamap, 0, - nb->nb_m->m_pkthdr.len, BUS_DMASYNC_PREREAD); - - addr = nb->nb_dmamap->dm_segs[0].ds_addr; - rxd->rx_addr = htole64(addr); - rxd->rx_length = htole32(nb->nb_m->m_pkthdr.len); - rxd->rx_handle = htole16(i); - } - - /* XXX Jumbo Rx descriptors/buffers */ - - /* - * Rx status descriptors - */ - nxm = &rd->rd_statusdma; - size = NX_MAX_STATUS_DESC * sizeof(struct nx_statusdesc); - if (nxb_dmamem_alloc(sc, nxm, size, "statusdesc") != 0) { - printf("%s: failed to alloc status dma memory\n", - DEVNAME(nx)); - return (1); - } - - rd->rd_statusring = (struct nx_statusdesc *)nxm->nxm_kva; - addr = nxm->nxm_map->dm_segs[0].ds_addr; - rc->rc_statusringaddr = htole64(addr); - rc->rc_statusringsize = htole32(NX_MAX_STATUS_DESC); - - /* - * Tx descriptors - */ - nxm = &rd->rd_txdma; - size = NX_MAX_TX_DESC * sizeof(struct nx_txdesc); - if (nxb_dmamem_alloc(sc, nxm, size, "txdesc") != 0) { - printf("%s: failed to alloc tx dma memory\n", - DEVNAME(nx)); - return (1); - } - - rd->rd_txring = (struct nx_txdesc *)nxm->nxm_kva; - addr = nxm->nxm_map->dm_segs[0].ds_addr; - rc->rc_txringaddr = htole64(addr); - rc->rc_txringsize = htole32(NX_MAX_TX_DESC); - - /* Tx buffers */ - for (i = 0; i < NX_MAX_TX_DESC; i++) { - nb = &rd->rd_txbuf[i]; - if (bus_dmamap_create(sc->sc_dmat, MCLBYTES, 4, - MCLBYTES, 0, BUS_DMA_NOWAIT, &nb->nb_dmamap) != 0) { - printf("%s: unable to create dmamap for tx %d\n", - DEVNAME(nx), i); - goto fail; - } - nb->nb_m = NULL; - } - - /* - * Sync DMA and write the ring context address to hardware - */ - nxm = &nx->nx_rcdma; - bus_dmamap_sync(sc->sc_dmat, nxm->nxm_map, 0, nxm->nxm_size, - BUS_DMASYNC_POSTWRITE); - - addr = nxm->nxm_map->dm_segs[0].ds_addr; - nx_writecrb(nx, NXSW_CONTEXT_ADDR_LO, addr & 0xffffffff); - nx_writecrb(nx, NXSW_CONTEXT_ADDR_HI, addr >> 32); - nx_writecrb(nx, NXSW_CONTEXT, nxp->nxp_id | NXSW_CONTEXT_SIG); - - return (0); - - fail: - nx_free_rings(nx); - return (1); -} - -void -nx_free_rings(struct nx_softc *nx) -{ - struct nxb_softc *sc = nx->nx_sc; - struct nxb_port *nxp = nx->nx_port; - struct nx_ringdata *rd = nx->nx_rings; - struct nxb_dmamem *nxm; - struct nx_buf *nb; - int i; - - for (i = 0; i < NX_MAX_RX_DESC; i++) { - nb = &rd->rd_rxbuf[i]; - if (nb->nb_dmamap == NULL) - continue; - bus_dmamap_sync(sc->sc_dmat, nb->nb_dmamap, 0, - nb->nb_m->m_pkthdr.len, BUS_DMASYNC_POSTREAD); - bus_dmamap_unload(sc->sc_dmat, nb->nb_dmamap); - bus_dmamap_destroy(sc->sc_dmat, nb->nb_dmamap); - if (nb->nb_m != NULL) - m_freem(nb->nb_m); - nb->nb_m = NULL; - } - - for (i = 0; i < NX_MAX_TX_DESC; i++) { - nb = &rd->rd_txbuf[i]; - if (nb->nb_dmamap == NULL) - continue; - bus_dmamap_destroy(sc->sc_dmat, nb->nb_dmamap); - if (nb->nb_m != NULL) - m_freem(nb->nb_m); - nb->nb_m = NULL; - } - - if (rd->rd_rxdma.nxm_size) - nxb_dmamem_free(sc, &rd->rd_rxdma); - if (rd->rd_statusdma.nxm_size) - nxb_dmamem_free(sc, &rd->rd_statusdma); - if (rd->rd_txdma.nxm_size) - nxb_dmamem_free(sc, &rd->rd_txdma); - - nxm = &nx->nx_rcdma; - bzero(nx->nx_rc, sizeof(struct nx_ringcontext)); - bus_dmamap_sync(sc->sc_dmat, nxm->nxm_map, 0, nxm->nxm_size, - BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); - - nx_writecrb(nx, NXSW_CONTEXT_ADDR_LO, 0); - nx_writecrb(nx, NXSW_CONTEXT_ADDR_HI, 0); - nx_writecrb(nx, NXSW_CONTEXT_SIG, nxp->nxp_id | NXSW_CONTEXT_RESET); -} diff --git a/sys/dev/pci/if_nxreg.h b/sys/dev/pci/if_nxreg.h deleted file mode 100644 index 067d448d9f9..00000000000 --- a/sys/dev/pci/if_nxreg.h +++ /dev/null @@ -1,782 +0,0 @@ -/* $OpenBSD: if_nxreg.h,v 1.28 2007/05/28 19:44:15 reyk Exp $ */ - -/* - * Copyright (c) 2007 Reyk Floeter <reyk@openbsd.org> - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * NetXen NX2031/NX2035 register definitions partially based on: - * http://www.netxen.com/products/downloads/ - * Ethernet_Driver_Ref_Guide_Open_Source.pdf - */ - -#ifndef _NX_REG_H -#define _NX_REG_H - -/* - * Common definitions - */ - -#define NX_MAX_PORTS 4 -#define NX_MAX_MTU ETHER_MTU - -#define NX_MAX_TX_DESC 128 /* XXX 4096 */ -#define NX_MAX_RX_DESC 128 /* XXX 32768 */ -#define NX_MAX_JUMBO_DESC 64 /* XXX 1024 */ -#define NX_MAX_TSO_DESC 32 /* XXX 64 */ -#define NX_MAX_STATUS_DESC NX_MAX_RX_DESC - -#define NX_JUMBO_MTU 8000 /* less than 9k */ -#define NX_DMA_ALIGN 8 /* 64bit alignment */ -#define NX_POLL_SENSOR 10 /* read temp sensor every 10s */ - -#define NX_WAIT 1 -#define NX_NOWAIT 0 - -/* This driver supported the 3.4.31 (3.4.xx) NIC firmware */ -#define NX_FIRMWARE_MAJOR 3 -#define NX_FIRMWARE_MINOR 4 -#define NX_FIRMWARE_BUILD 31 - -#define NX_FIRMWARE_VER ( \ - (NX_FIRMWARE_MAJOR << 16) | (NX_FIRMWARE_MINOR << 8) | \ - NX_FIRMWARE_BUILD \ -) - -/* Used to indicate various states of the NIC and its firmware */ -enum nx_state { - NX_S_FAIL = -1, /* Failed to initialize the device */ - NX_S_OFFLINE = 0, /* Firmware is not active yet */ - NX_S_RESET = 2, /* Firmware is in reset state */ - NX_S_BOOT = 3, /* Chipset is booting the firmware */ - NX_S_LOADED = 4, /* Firmware is loaded but not initialized */ - NX_S_RELOADED = 5, /* Firmware is reloaded and initialized */ - NX_S_READY = 6 /* Device has been initialized and is ready */ -}; - -/* - * Hardware descriptors - */ - -struct nx_txdesc { - u_int64_t tx_word0; -#define NX_TXDESC0_TCPHDROFF_S 0 /* TCP header offset */ -#define NX_TXDESC0_TCPHDROFF_M 0x00000000000000ffULL -#define NX_TXDESC0_IPHDROFF_S 8 /* IP header offset */ -#define NX_TXDESC0_IPHDROFF_M 0x000000000000ff00 -#define NX_TXDESC0_F_S 16 /* flags */ -#define NX_TXDESC0_F_M 0x00000000007f0000ULL -#define NX_TXDESC0_F_VLAN (1<<8) /* VLAN tagged */ -#define NX_TXDESC0_F_TSO (1<<1) /* TSO enabled */ -#define NX_TXDESC0_F_CKSUM (1<<0) /* checksum enabled */ -#define NX_TXDESC0_OP_S 23 /* opcode */ -#define NX_TXDESC0_OP_M 0x000000001f800000ULL -#define NX_TXDESC0_OP_TX_TSO (1<<4) /* TCP packet, do TSO */ -#define NX_TXDESC0_OP_TX_IP (1<<3) /* IP packet, compute cksum */ -#define NX_TXDESC0_OP_TX_UDP (1<<2) /* UDP packet, compute cksum */ -#define NX_TXDESC0_OP_TX_TCP (1<<1) /* TCP packet, compute cksum */ -#define NX_TXDESC0_OP_TX (1<<0) /* raw Ethernet packet */ -#define NX_TXDESC0_RES0_S 29 /* Reserved */ -#define NX_TXDESC0_RES0_M 0x00000000e0000000ULL -#define NX_TXDESC0_NBUF_S 32 /* number of buffers */ -#define NX_TXDESC0_NBUF_M 0x000000ff00000000ULL -#define NX_TXDESC0_LENGTH_S 40 /* length */ -#define NX_TXDESC0_LENGTH_M 0xffffff0000000000ULL - u_int64_t tx_addr2; /* address of buffer 2 */ - u_int64_t tx_word2; -#define NX_TXDESC2_HANDLE_S 0 /* handle of the buffer */ -#define NX_TXDESC2_HANDLE_M 0x000000000000ffffULL -#define NX_TXDESC2_MSS_S 16 /* MSS for the packet */ -#define NX_TXDESC2_MSS_M 0x00000000ffff0000ULL -#define NX_TXDESC2_PORT_S 32 /* interface port */ -#define NX_TXDESC2_PORT_M 0x0000000f00000000ULL -#define NX_TXDESC2_CTXID_S 36 /* context ID */ -#define NX_TXDESC2_CTXID_M 0x000000f000000000ULL -#define NX_TXDESC2_HDRLENGTH_S 40 /* MAC+IP+TCP length for TSO */ -#define NX_TXDESC2_HDRLENGTH_M 0x0000ff0000000000ULL -#define NX_TXDESC2_IPSECID_S 48 /* IPsec offloading SA/ID */ -#define NX_TXDESC2_IPSECID_M 0xffff000000000000ULL - u_int64_t tx_addr3; /* address of buffer 3 */ - u_int64_t tx_addr1; /* address of buffer 1 */ - u_int64_t tx_buflength; -#define NX_TXDESC_BUFLENGTH1_S 0 /* length of buffer 1 */ -#define NX_TXDESC_BUFLENGTH1_M 0x000000000000ffffULL -#define NX_TXDESC_BUFLENGTH2_S 16 /* length of buffer 2 */ -#define NX_TXDESC_BUFLENGTH2_M 0x00000000ffff0000ULL -#define NX_TXDESC_BUFLENGTH3_S 32 /* length of buffer 3 */ -#define NX_TXDESC_BUFLENGTH3_M 0x0000ffff00000000ULL -#define NX_TXDESC_BUFLENGTH4_S 48 /* length of buffer 4 */ -#define NX_TXDESC_BUFLENGTH4_M 0xffff000000000000ULL - u_int64_t tx_addr4; /* address of buffer 4 */ - u_int64_t tx_word7; /* reserved */ -} __packed; - -struct nx_rxdesc { - u_int16_t rx_handle; /* handle of the buffer */ - u_int16_t rx_reserved; - u_int32_t rx_length; /* length of the buffer */ - u_int64_t rx_addr; /* address of buffer */ -} __packed; - -struct nx_statusdesc { - u_int16_t rx_port; -#define NX_STSDESC_PORT_S 0 /* interface port */ -#define NX_STSDESC_PORT_M 0x000f -#define NX_STSDESC_STS_S 4 /* completion status */ -#define NX_STSDESC_STS_M 0x00f0 -#define NX_STSDESC_STS_NOCHK 1 /* checksum not verified */ -#define NX_STSDESC_STS_CHKOK 2 /* checksum verified ok */ -#define NX_STSDESC_TYPE_S 8 /* type/index of the ring */ -#define NX_STSDESC_TYPE_M 0x0f00 -#define NX_STSDESC_OPCODE_S 12 /* opcode */ -#define NX_STSDESC_OPCODE_M 0xf000 -#define NX_STSDESC_OPCODE 0xa /* received packet */ - u_int16_t rx_length; /* total length of the packet */ - u_int16_t rx_handle; /* handle of the buffer */ - u_int16_t rx_owner; -#define NX_STSDESC_OWNER_S 0 /* owner of the descriptor */ -#define NX_STSDESC_OWNER_M 0x0003 -#define NX_STSDESC_OWNER_HOST 1 /* owner is the host (t.b.d) */ -#define NX_STSDESC_OWNER_CARD 2 /* owner is the card */ -#define NX_STSDESC_PROTO_S 2 /* protocol type */ -#define NX_STSDESC_PROTO_M 0x003c -} __packed; - -struct nx_rxcontext { - u_int64_t rxc_ringaddr; - u_int32_t rxc_ringsize; - u_int32_t rxc_reserved; -} __packed; - -#define NX_NRXCONTEXT 3 -#define NX_RX_CONTEXT 0 -#define NX_JUMBO_CONTEXT 1 -#define NX_TSO_CONTEXT 2 - -/* DMA-mapped ring context for the Rx, Tx, and Status rings */ -struct nx_ringcontext { - u_int64_t rc_txconsumeroff; - u_int64_t rc_txringaddr; - u_int32_t rc_txringsize; - u_int32_t rc_reserved; - - struct nx_rxcontext rc_rxcontext[NX_NRXCONTEXT]; - - u_int64_t rc_statusringaddr; - u_int32_t rc_statusringsize; - - u_int32_t rc_id; /* context identifier */ - - /* d3 state register, dummy dma address */ - u_int64_t rc_reserved1; - u_int64_t rc_reserved2; - - u_int32_t rc_txconsumer; -} __packed; - -/* - * Memory layout - */ - -#define NXBAR0 PCI_MAPREG_START -#define NXBAR4 (PCI_MAPREG_START + 16) - -/* PCI memory setup */ -#define NXPCIMEM_SIZE_128MB 0x08000000 /* 128MB size */ -#define NXPCIMEM_SIZE_32MB 0x02000000 /* 32MB size */ - -/* PCI memory address ranges */ -#define NXADDR_DDR_NET 0x0000000000000000ULL -#define NXADDR_DDR_NET_END 0x000000000fffffffULL -#define NXADDR_PCIE 0x0000000800000000ULL -#define NXADDR_PCIE_END 0x0000000fffffffffULL -#define NXADDR_OCM0 0x0000000200000000ULL -#define NXADDR_OCM0_END 0x00000002000fffffULL -#define NXADDR_OCM1 0x0000000200400000ULL -#define NXADDR_OCM1_END 0x00000002004fffffULL -#define NXADDR_QDR_NET 0x0000000300000000ULL -#define NXADDR_QDR_NET_END 0x00000003001fffffULL - -/* Memory mapping in the default PCI window */ -#define NXPCIMAP_DDR_NET 0x00000000 -#define NXPCIMAP_DDR_MD 0x02000000 -#define NXPCIMAP_QDR_NET 0x04000000 -#define NXPCIMAP_DIRECT_CRB 0x04400000 -#define NXPCIMAP_OCM0 0x05000000 -#define NXPCIMAP_OCM1 0x05100000 -#define NXPCIMAP_CRB 0x06000000 - -/* Offsets inside NXPCIMAP_CRB */ -#define NXMEMMAP_PCIE_0 0x00100000 -#define NXMEMMAP_NIU 0x00600000 -#define NXMEMMAP_PPE_0 0x01100000 -#define NXMEMMAP_PPE_1 0x01200000 -#define NXMEMMAP_PPE_2 0x01300000 -#define NXMEMMAP_PPE_3 0x01400000 -#define NXMEMMAP_PPE_D 0x01500000 -#define NXMEMMAP_PPE_I 0x01600000 -#define NXMEMMAP_PCIE_1 0x02100000 -#define NXMEMMAP_SW 0x02200000 -#define NXMEMMAP_SIR 0x03200000 -#define NXMEMMAP_ROMUSB 0x03300000 - -/* NXPCIMAP_CRB window (total offsets) */ -#define NXMEMMAP_WINDOW_SIZE 0x02000000 -#define NXMEMMAP_WINDOW0_START 0x06000000 -#define NXMEMMAP_WINDOW0_END 0x07ffffff -#define NXMEMMAP_WINDOW1_START 0x08000000 -#define NXMEMMAP_WINDOW1_END 0x09ffffff - -#define NXMEMMAP_HWTRANS_M 0xfff00000 - -/* Window 0 register map */ -#define NXPCIE(_x) ((_x) + 0x06100000) /* PCI Express */ -#define NXNIU(_x) ((_x) + 0x06600000) /* Network Int Unit */ -#define NXPPE_0(_x) ((_x) + 0x07100000) /* PEGNET 0 */ -#define NXPPE_1(_x) ((_x) + 0x07200000) /* PEGNET 0 */ -#define NXPPE_2(_x) ((_x) + 0x07300000) /* PEGNET 0 */ -#define NXPPE_3(_x) ((_x) + 0x07400000) /* PEGNET 0 */ -#define NXPPE_D(_x) ((_x) + 0x07500000) /* PEGNET D-Cache */ -#define NXPPE_I(_x) ((_x) + 0x07600000) /* PEGNET I-Cache */ - -/* Window 1 register map */ -#define NXPCIE_1(_x) ((_x) + 0x08100000) /* PCI Express' */ -#define NXSW(_x) ((_x) + 0x08200000) /* Software defined */ -#define NXSIR(_x) ((_x) + 0x09200000) /* 2nd interrupt */ -#define NXROMUSB(_x) ((_x) + 0x09300000) /* ROMUSB */ - -/* The IMEZ/HMEZ NICs have multiple PCI functions with different registers */ -#define NXPCIE_FUNC(_r, _f) (NXPCIE(_r) + ((_f) * 0x20)) - -/* Flash layout */ -#define NXFLASHMAP_CRBINIT_0 0x00000000 /* CRBINIT */ -#define NXFLASHMAP_CRBINIT_M 0x7fffffff /* ROM memory barrier */ -#define NXFLASHMAP_CRBINIT_MAX 1023 /* Max CRBINIT entries */ -#define NXFLASHMAP_INFO 0x00004000 /* board configuration */ -#define NXFLASHMAP_INITCODE 0x00006000 /* chipset-specific code */ -#define NXFLASHMAP_BOOTLOADER 0x00010000 /* boot loader */ -#define NXFLASHMAP_BOOTLDSIZE 0x4000 /* boot loader size */ -#define NXFLASHMAP_FIRMWARE_0 0x00043000 /* compressed firmware image */ -#define NXFLASHMAP_FIRMWARE_1 0x00200000 /* backup firmware image */ -#define NXFLASHMAP_PXE 0x003d0000 /* PXE image */ -#define NXFLASHMAP_USER 0x003e8000 /* user-specific ares */ -#define NXFLASHMAP_VPD 0x003e8c00 /* vendor private data */ -#define NXFLASHMAP_LICENSE 0x003e9000 /* firmware license (?) */ -#define NXFLASHMAP_CRBINIT_1 0x003f0000 /* backup of CRBINIT */ - -/* - * Doorbell messages - */ - -/* Register in the doorbell memory region */ -#define NXDB 0x00000000 -#define NXDB_PEGID_M 0x00000003 /* Chipset unit */ -#define NXDB_PEGID_S 0 -#define NXDB_PEGID_RX 1 /* Rx unit */ -#define NXDB_PEGID_TX 2 /* Tx unit */ -#define NXDB_PRIVID 0x00000004 /* Must be set */ -#define NXDB_COUNT_M 0x0003fff8 /* Doorbell count */ -#define NXDB_COUNT_S 3 -#define NXDB_CTXID_M 0x0ffc0000 /* Context ID */ -#define NXDB_CTXID_S 18 -#define NXDB_OPCODE_M 0xf0000000 /* Doorbell opcode */ -#define NXDB_OPCODE_S 28 -#define NXDB_OPCODE_RCV_PROD 0 -#define NXDB_OPCODE_JRCV_PROD 1 -#define NXDB_OPCODE_TSO_PROD 2 -#define NXDB_OPCODE_CMD_PROD 3 -#define NXDB_OPCODE_UPD_CONS 4 -#define NXDB_OPCODE_RESET_CTX 5 - -/* - * PCI Express Registers - */ - -/* Interrupt Vector */ -#define NXISR_INT_VECTOR NXPCIE(0x00010100) -#define NXISR_INT_VECTOR_TARGET3 (1<<10) /* interrupt for function 3 */ -#define NXISR_INT_VECTOR_TARGET2 (1<<9) /* interrupt for function 2 */ -#define NXISR_INT_VECTOR_TARGET1 (1<<8) /* interrupt for function 1 */ -#define NXISR_INT_VECTOR_TARGET0 (1<<7) /* interrupt for function 0 */ -#define NXISR_INT_VECTOR_PORT(_n) (NXISR_INT_VECTOR_TARGET0 << (_n)) -#define NXISR_INT_VECTOR_RC_INT (1<<5) /* root complex interrupt */ - -/* Interrupt Mask */ -#define NXISR_INT_MASK NXPCIE(0x00010104) -#define NXISR_INT_MASK_TARGET3 (1<<10) /* mask for function 3 */ -#define NXISR_INT_MASK_TARGET2 (1<<9) /* mask for function 2 */ -#define NXISR_INT_MASK_TARGET1 (1<<8) /* mask for function 1 */ -#define NXISR_INT_MASK_TARGET0 (1<<7) /* mask for function 0 */ -#define NXISR_INT_MASK_PORT(_n) (NXISR_INT_MASK_TARGET0 << (_n)) -#define NXISR_INT_MASK_RC_INT (1<<5) /* root complex mask */ -#define NXISR_INT_MASK_ENABLE 0x0000077f -#define NXISR_INT_MASK_DISABLE 0x000007ff - -/* Interrupt target mask and status */ -#define NXISR_TARGET_STATUS NXPCIE(0x00010118) -#define NXISR_TARGET_MASK NXPCIE(0x00010128) -#define NXISR_TARGET_MASK_ENABLE 0x00000bff -#define NXISR_TARGET_MASK_DISABLE 0xffffffff - -/* Memory windows */ -#define NXDDR_WINDOW(_f) NXPCIE_FUNC(0x00010200, _f) -#define NXDDR_WINDOW_1 (1<<25) /* Set this flag for Win 1 */ -#define NXDDR_WINDOW_S 25 -#define NXDDR_WINDOW_M 0x000003ff -#define NXDDR_WINDOW_SIZE 0x02000000 -#define NXQDR_WINDOW(_f) NXPCIE_FUNC(0x00010208, _f) -#define NXQDR_WINDOW_1 (1<<25) /* Set this flag for Win 1 */ -#define NXQDR_WINDOW_S 22 -#define NXQDR_WINDOW_M 0x0000003f -#define NXQDR_WINDOW_SIZE 0x00400000 -#define NXCRB_WINDOW(_f) NXPCIE_FUNC(0x00010210, _f) -#define NXCRB_WINDOW_1 (1<<25) /* Set this flag for Win 1 */ -#define NXCRB_WINDOW_S 25 -#define NXCRB_WINDOW_M 0x00000004 -#define NXCRB_WINDOW_SIZE 0x02000000 - -/* Lock registers (semaphores between chipset and driver) */ -#define NXSEM_FLASH_LOCK NXPCIE_1(0x0001c010) /* Flash lock */ -#define NXSEM_FLASH_LOCK_M 0xffffffff -#define NXSEM_FLASH_LOCKED (1<<0) /* R/O: is locked */ -#define NXSEM_FLASH_UNLOCK NXPCIE_1(0x0001c014) /* Flash unlock */ -#define NXSEM_PHY_LOCK NXPCIE_1(0x0001c018) /* PHY lock */ -#define NXSEM_PHY_LOCK_M 0xffffffff -#define NXSEM_PHY_LOCKED (1<<0) /* R/O: is locked */ -#define NXSEM_PHY_UNLOCK PXPCIE_1(0x0001c01c) /* PHY unlock */ - -/* - * Network Interface Unit (NIU) registers - */ - -/* Mode Register (see also NXNIU_RESET_SYS_FIFOS) */ -#define NXNIU_MODE NXNIU(0x00000000) -#define NXNIU_MODE_XGE (1<<2) /* XGE interface enabled */ -#define NXNIU_MODE_GBE (1<<1) /* 4 GbE interfaces enabled */ -#define NXNIU_MODE_FC (1<<0) /* *Fibre Channel enabled */ -#define NXNIU_MODE_DEF NUI_XGE_ENABLE - -/* 10G - 1G Mode Enable Register */ -#define NXNIU_XG_SINGLE_TERM NXNIU(0x00000004) -#define NXNIU_XG_SINGLE_TERM_ENABLE (1<<0) /* Enable 10G + 1G mode */ -#define NXNIU_XG_SINGLE_TERM_DEF 0 /* Disabled */ - -/* XGE Reset Register */ -#define NXNIU_XG_RESET NXNIU(0x0000001c) -#define NXNIU_XG_RESET_CD (1<<1) /* Reset channels CD */ -#define NXNIU_XG_RESET_AB (1<<0) /* Reset channels AB */ -#define NXNIU_XG_RESET_DEF (NXNIU_XG_RESET_AB|NXNIU_XG_RESET_CD) - -/* Interrupt Mask Register */ -#define NXNIU_INT_MASK NXNIU(0x00000040) -#define NXNIU_INT_MASK_XG (1<<6) /* XGE Interrupt Mask */ -#define NXNIU_INT_MASK_RES5 (1<<5) /* Reserved bit */ -#define NXNIU_INT_MASK_RES4 (1<<4) /* Reserved bit */ -#define NXNIU_INT_MASK_GB3 (1<<3) /* GbE 3 Interrupt Mask */ -#define NXNIU_INT_MASK_GB2 (1<<2) /* GbE 2 Interrupt Mask */ -#define NXNIU_INT_MASK_GB1 (1<<1) /* GbE 1 Interrupt Mask */ -#define NXNIU_INT_MASK_GB0 (1<<0) /* GbE 0 Interrupt Mask */ -#define NXNIU_INT_MASK_DEF ( \ - NXNIU_INT_MASK_XG|NXNIU_INT_MASK_RES5|NXNIU_INT_MASK_RES4| \ - NXNIU_INT_MASK_GB3|NXNIU_INT_MASK_GB2|NXNIU_INT_MASK_GB1| \ - NXNIU_INT_MASK_GB0) /* Reserved bits enabled */ - -/* Reset System FIFOs Register (needed before changing NXNIU_MODE) */ -#define NXNIU_RESET_SYS_FIFOS NXNIU(0x00000088) -#define NXNIU_RESET_SYS_FIFOS_RX (1<<31) /* Reset all Rx FIFOs */ -#define NXNIU_RESET_SYS_FIFOS_TX (1<<0) /* Reset all Tx FIFOs */ -#define NXNIU_RESET_SYS_FIFOS_DEF 0 /* Disabled */ - -/* Flow control registers */ -#define NXNIU_XGE_PAUSE_CONTROL NXNIU(0x00000098) -#define NXNIU_XGE_PAUSE_S(_n) ((_n) * 3) -#define NXNIU_XGE_PAUSE_M 0x00000007 -#define NXNIU_XGE_PAUSE_DISABLED (1<<0) /* Tx Pause (always Rx) */ -#define NXNIU_XGE_PAUSE_REQUEST (1<<1) /* Request pause */ -#define NXNIU_XGE_PAUSE_ONOFF (1<<2) /* Request pause on/off */ -#define NXNIU_XGE_PAUSE_LEVEL NXNIU(0x000000dc) - -/* - * Port-specific NIU registers, will be mapped to a subregion - */ - -#define NXNIU_PORT_SIZE 0x00010000 -#define NXNIU_PORT(_r, _n) NXNIU((_r) + (_n) * NXNIU_PORT_SIZE) - -#define NXNIU_FC(_n) NXNIU_PORT(0x00010000, _n) -#define NXNIU_GBE(_n) NXNIU_PORT(0x00030000, _n) -#define NXNIU_XGE(_n) NXNIU_PORT(0x00070000, _n) - -/* XGE Configuration 0 Register */ -#define NX_XGE_CONFIG0 0x0000 -#define NXNIU_XGE_CONFIG0_SOFTRST_FIFO (1<<31) /* Soft reset FIFOs */ -#define NXNIU_XGE_CONFIG0_SOFTRST_MAC (1<<4) /* Soft reset XGE MAC */ -#define NXNIU_XGE_CONFIG0_RX_ENABLE (1<<2) /* Enable frame Rx */ -#define NXNIU_XGE_CONFIG0_TX_ENABLE (1<<0) /* Enable frame Tx */ -#define NXNIU_XGE_CONFIG0_DEF 0 /* Disabled */ - -/* XGE Configuration 1 Register */ -#define NX_XGE_CONFIG1 0x0004 -#define NXNIU_XGE_CONFIG1_PROMISC (1<<13) /* Pass all Rx frames */ -#define NXNIU_XGE_CONFIG1_MCAST_ENABLE (1<<12) /* Rx all multicast frames */ -#define NXNIU_XGE_CONFIG1_SEQ_ERROR (1<<10) /* Sequence error detection */ -#define NXNIU_XGE_CONFIG1_NO_PAUSE (1<<8) /* Ignore pause frames */ -#define NXNIU_XGE_CONFIG1_LOCALERR (1<<6) /* Wire local error */ -#define NXNIU_XGE_CONFIG1_LOCALERR_FE 0 /* Signal with 0xFE */ -#define NXNIU_XGE_CONFIG1_LOCALERR_I 1 /* Signal with Ierr */ -#define NXNIU_XGE_CONFIG1_NO_MAXSIZE (1<<5) /* Ignore max Rx size */ -#define NXNIU_XGE_CONFIG1_CRC_TX (1<<1) /* Append CRC to Tx frames */ -#define NXNIU_XGE_CONFIG1_CRC_RX (1<<0) /* Remove CRC from Rx frames */ -#define NXNIU_XGE_CONFIG1_DEF 0 /* Disabled */ - -/* XGE Station Address (lladdr) Register */ -#define NX_XGE_STATION_ADDR_HI 0x000c /* High lladdr */ -#define NX_XGE_STATION_ADDR_LO 0x0010 /* low lladdr */ - -/* - * Software defined registers (used by the firmware or the driver) - */ - -/* Chipset state registers */ -#define NXSW_ROM_LOCK_ID NXSW(0x2100) /* Used for locking the ROM */ -#define NXSW_ROM_LOCK_DRV 0x0d417340 /* Driver ROM lock ID */ -#define NXSW_PHY_LOCK_ID NXSW(0x2120) /* Used for locking the PHY */ -#define NXSW_PHY_LOCK_DRV 0x44524956 /* Driver PHY lock ID */ -#define NXSW_FW_VERSION_MAJOR NXSW(0x2150) /* Major f/w version */ -#define NXSW_FW_VERSION_MINOR NXSW(0x2154) /* Minor f/w version */ -#define NXSW_FW_VERSION_BUILD NXSW(0x2158) /* Build/Sub f/w version */ -#define NXSW_BOOTLD_CONFIG NXSW(0x21fc) -#define NXSW_BOOTLD_CONFIG_ROM 0x00000000 /* Load firmware from flasg */ -#define NXSW_BOOTLD_CONFIG_RAM 0x12345678 /* Load firmware from memory */ - -/* Misc SW registers */ -#define NXSW_CMD_PRODUCER_OFF NXSW(0x2208) /* Producer CMD ring index */ -#define NXSW_CMD_CONSUMER_OFF NXSW(0x220c) /* Consumer CMD ring index */ -#define NXSW_CMD_ADDR_HI NXSW(0x2218) /* CMD ring phys address */ -#define NXSW_CMD_ADDR_LO NXSW(0x221c) /* CMD ring phys address */ -#define NXSW_CMD_RING_SIZE NXSW(0x22c8) /* Entries in the CMD ring */ -#define NXSW_CMDPEG_STATE NXSW(0x2250) /* State of the firmware */ -#define NXSW_CMDPEG_STATE_M 0xffff /* State mask */ -#define NXSW_CMDPEG_INIT_START 0xff00 /* Start of initialization */ -#define NXSW_CMDPEG_INIT_DONE 0xff01 /* Initialization complete */ -#define NXSW_CMDPEG_INIT_ACK 0xf00f /* Initialization ACKed */ -#define NXSW_CMDPEG_INIT_FAIL 0xffff /* Initialization failed */ -#define NXSW_GLOBAL_INT_COAL NXSW(0x2264) /* Interrupt coalescing */ -#define NXSW_INT_COAL_MODE NXSW(0x2268) /* Reserved */ -#define NXSW_MAX_RCV_BUFS NXSW(0x226c) /* Interrupt tuning register */ -#define NXSW_TX_INT_THRESHOLD NXSW(0x2270) /* Interrupt tuning register */ -#define NXSW_RX_PKT_TIMER NXSW(0x2274) /* Interrupt tuning register */ -#define NXSW_TX_PKT_TIMER NXSW(0x2278) /* Interrupt tuning register */ -#define NXSW_RX_PKT_CNT NXSW(0x227c) /* Rx packet count register */ -#define NXSW_RX_TMR_CNT NXSW(0x2280) /* Rx timer count register */ -#define NXSW_XG_STATE NXSW(0x2294) /* PHY state register */ -#define NXSW_XG_LINK_UP (1<<4) /* 10G PHY state up */ -#define NXSW_XG_LINK_DOWN (1<<5) /* 10G PHY state down */ -#define NXSW_MPORT_MODE NXSW(0x22c4) /* Multi port mode */ -#define NXSW_MPORT_MODE_M 0xffff /* Mode mask */ -#define NXSW_MPORT_MODE_1FUNC 0x1111 /* Single function mode */ -#define NXSW_MPORT_MODE_NFUNC 0x2222 /* Multi function mode */ - -#define NXSW_TEMP NXSW(0x23b4) /* Temperature sensor */ -#define NXSW_TEMP_STATE_M 0x0000ffff /* Temp state mask */ -#define NXSW_TEMP_STATE_S 0 /* Temp state shift */ -#define NXSW_TEMP_STATE_NONE 0x0000 /* Temp state is UNSPEC */ -#define NXSW_TEMP_STATE_OK 0x0001 /* Temp state is OK */ -#define NXSW_TEMP_STATE_WARN 0x0002 /* Temp state is WARNING */ -#define NXSW_TEMP_STATE_CRIT 0x0003 /* Temp state is CRITICAL */ -#define NXSW_TEMP_VAL_M 0xffff0000 /* Temp deg celsius mask */ -#define NXSW_TEMP_VAL_S 16 /* Temp deg celsius shift */ -#define NXSW_DRIVER_VER NXSW(0x24a0) /* Host driver version */ - -/* - * Port-specific SW registers, cannot be mapped to a subregion because - * they're using different offsets between the registers. Ugh, we have to - * define a mapping table to avoid a ton of ugly if's in the code. - */ -enum nxsw_portreg { - NXSW_RCV_PRODUCER_OFF = 0, /* Producer Rx ring index */ - NXSW_RCV_CONSUMER_OFF, /* Consumer Rx ring index */ - NXSW_GLOBALRCV_RING, /* Address of Rx buffer */ - NXSW_RCV_RING_SIZE, /* Entries in the Rx ring */ - - NXSW_JRCV_PRODUCER_OFF, /* Producer jumbo ring index */ - NXSW_JRCV_CONSUMER_OFF, /* Consumer jumbo ring index */ - NXSW_GLOBALJRCV_RING, /* Address of jumbo buffer */ - NXSW_JRCV_RING_SIZE, /* Entries in the jumbo ring */ - - NXSW_TSO_PRODUCER_OFF, /* Producer TSO ring index */ - NXSW_TSO_CONSUMER_OFF, /* Consumer TSO ring index */ - NXSW_GLOBALOTSO_RING, /* Address of TSO buffer */ - NXSW_TSO_RING_SIZE, /* Entries in the TSO ring */ - - NXSW_STATUS_RING, /* Address of status ring */ - NXSW_STATUS_PROD, /* Producer status index */ - NXSW_STATUS_CONS, /* Consumer status index */ - NXSW_RCVPEG_STATE, /* State of the NX2031 */ -#define NXSW_RCVPEG_STATE_M 0xffff /* State mask */ -#define NXSW_RCVPEG_INIT_START 0xff00 /* Start of initialization */ -#define NXSW_RCVPEG_INIT_DONE 0xff01 /* Initialization complete */ -#define NXSW_RCVPEG_INIT_ACK 0xf00f /* Initialization ACKed */ -#define NXSW_RCVPEG_INIT_FAIL 0xffff /* Initialization failed */ - NXSW_STATUS_RING_SIZE, /* Entries in the status ring */ - - NXSW_CONTEXT_ADDR_LO, /* Low address of context */ - NXSW_CONTEXT, /* Context register */ -#define NXSW_CONTEXT_M 0xffff /* Context register mask */ -#define NXSW_CONTEXT_SIG 0xdee0 /* Context signature */ -#define NXSW_CONTEXT_RESET 0xbad0 /* Context reset */ - NXSW_CONTEXT_ADDR_HI, /* High address of context */ - - NXSW_PORTREG_MAX -}; -#define NXSW_PORTREGS { \ - { NXSW(0x2300), NXSW(0x2344), NXSW(0x23d8), NXSW(0x242c) }, \ - { NXSW(0x2304), NXSW(0x2348), NXSW(0x23dc), NXSW(0x2430) }, \ - { NXSW(0x2308), NXSW(0x234c), NXSW(0x23f0), NXSW(0x2434) }, \ - { NXSW(0x230c), NXSW(0x2350), NXSW(0x23f4), NXSW(0x2438) }, \ - \ - { NXSW(0x2310), NXSW(0x2354), NXSW(0x23f8), NXSW(0x243c) }, \ - { NXSW(0x2314), NXSW(0x2358), NXSW(0x23fc), NXSW(0x2440) }, \ - { NXSW(0x2318), NXSW(0x235c), NXSW(0x2400), NXSW(0x2444) }, \ - { NXSW(0x231c), NXSW(0x2360), NXSW(0x2404), NXSW(0x2448) }, \ - \ - { NXSW(0x2320), NXSW(0x2364), NXSW(0x2408), NXSW(0x244c) }, \ - { NXSW(0x2324), NXSW(0x2368), NXSW(0x240c), NXSW(0x2450) }, \ - { NXSW(0x2328), NXSW(0x236c), NXSW(0x2410), NXSW(0x2454) }, \ - { NXSW(0x232c), NXSW(0x2370), NXSW(0x2414), NXSW(0x2458) }, \ - \ - { NXSW(0x2330), NXSW(0x2374), NXSW(0x2418), NXSW(0x245c) }, \ - { NXSW(0x2334), NXSW(0x2378), NXSW(0x241c), NXSW(0x2460) }, \ - { NXSW(0x2338), NXSW(0x237c), NXSW(0x2420), NXSW(0x2464) }, \ - { NXSW(0x233c), NXSW(0x2380), NXSW(0x2424), NXSW(0x2468) }, \ - { NXSW(0x2340), NXSW(0x2384), NXSW(0x2428), NXSW(0x246c) }, \ - \ - { NXSW(0x2388), NXSW(0x2390), NXSW(0x2398), NXSW(0x23a0) }, \ - { NXSW(0x238c), NXSW(0x2394), NXSW(0x239c), NXSW(0x23a4) }, \ - { NXSW(0x23c0), NXSW(0x23c4), NXSW(0x23c8), NXSW(0x23cc) } \ -} - -/* - * Port-specific SW registers, will be mapped to a subregion - */ - -/* - * Secondary Interrupt Registers - */ - -/* I2Q Register */ -#define NXI2Q_CLR_PCI_HI NXSIR(0x00000034) -#define NXI2Q_CLR_PCI_HI_PHY (1<<13) /* PHY interrupt */ -#define NXI2Q_CLR_PCI_HI_DEF 0 /* Cleared */ - -/* - * ROMUSB registers - */ - -/* Status Register */ -#define NXROMUSB_GLB_STATUS NXROMUSB(0x00000004) /* ROM Status */ -#define NXROMUSB_GLB_STATUS_DONE (1<<1) /* Ready */ - -/* Reset Unit Register */ -#define NXROMUSB_GLB_SW_RESET NXROMUSB(0x00000008) -#define NXROMUSB_GLB_SW_RESET_EFC_SIU (1<<30) /* EFC_SIU reset */ -#define NXROMUSB_GLB_SW_RESET_NIU (1<<29) /* NIU software reset */ -#define NXROMUSB_GLB_SW_RESET_U0QMSQG (1<<28) /* Network side QM_SQG reset */ -#define NXROMUSB_GLB_SW_RESET_U1QMSQG (1<<27) /* Storage side QM_SQG reset */ -#define NXROMUSB_GLB_SW_RESET_C2C1 (1<<26) /* Chip to Chip 1 reset */ -#define NXROMUSB_GLB_SW_RESET_C2C0 (1<<25) /* Chip to Chip 2 reset */ -#define NXROMUSB_GLB_SW_RESET_U1PEGI (1<<11) /* Storage Pegasus I-Cache */ -#define NXROMUSB_GLB_SW_RESET_U1PEGD (1<<10) /* Storage Pegasus D-Cache */ -#define NXROMUSB_GLB_SW_RESET_U1PEG3 (1<<9) /* Storage Pegasus3 reset */ -#define NXROMUSB_GLB_SW_RESET_U1PEG2 (1<<8) /* Storage Pegasus2 reset */ -#define NXROMUSB_GLB_SW_RESET_U1PEG1 (1<<7) /* Storage Pegasus1 reset */ -#define NXROMUSB_GLB_SW_RESET_U1PEG0 (1<<6) /* Storage Pegasus0 reset */ -#define NXROMUSB_GLB_SW_RESET_U0PEGI (1<<11) /* Network Pegasus I-Cache */ -#define NXROMUSB_GLB_SW_RESET_U0PEGD (1<<10) /* Network Pegasus D-Cache */ -#define NXROMUSB_GLB_SW_RESET_U0PEG3 (1<<9) /* Network Pegasus3 reset */ -#define NXROMUSB_GLB_SW_RESET_U0PEG2 (1<<8) /* Network Pegasus2 reset */ -#define NXROMUSB_GLB_SW_RESET_U0PEG1 (1<<7) /* Network Pegasus1 reset */ -#define NXROMUSB_GLB_SW_RESET_U0PEG0 (1<<6) /* Network Pegasus0 reset */ -#define NXROMUSB_GLB_SW_RESET_PPE 0xf0 /* Protocol Processing Engine */ -#define NXROMUSB_GLB_SW_RESET_XDMA 0x8000ff; -#define NXROMUSB_GLB_SW_RESET_DEF 0xffffffff - -/* Casper Reset Register */ -#define NXROMUSB_GLB_CAS_RESET NXROMUSB(0x00000038) -#define NXROMUSB_GLB_CAS_RESET_ENABLE (1<<0) /* Enable Casper reset */ -#define NXROMUSB_GLB_CAS_RESET_DISABLE 0 -#define NXROMUSB_GLB_CAS_RESET_DEF 0 /* Disabled */ - -/* Reset register */ -#define NXROMUSB_GLB_PEGTUNE NXROMUSB(0x0000005c) -#define NXROMUSB_GLB_PEGTUNE_DONE (1<<0) - -/* Chip clock control register */ -#define NXROMUSB_GLB_CHIPCLKCONTROL NXROMUSB(0x000000a8) -#define NXROMUSB_GLB_CHIPCLKCONTROL_ON 0x00003fff - -/* ROM Register */ -#define NXROMUSB_ROM_CONTROL NXROMUSB(0x00010000) -#define NXROMUSB_ROM_OPCODE NXROMUSB(0x00010004) -#define NXROMUSB_ROM_OPCODE_READ 0x0000000b -#define NXROMUSB_ROM_ADDR NXROMUSB(0x00010008) -#define NXROMUSB_ROM_WDATA NXROMUSB(0x0001000c) -#define NXROMUSB_ROM_ABYTE_CNT NXROMUSB(0x00010010) -#define NXROMUSB_ROM_DUMMY_BYTE_CNT NXROMUSB(0x00010014) -#define NXROMUSB_ROM_RDATA NXROMUSB(0x00010018) -#define NXROMUSB_ROM_AGT_TAG NXROMUSB(0x0001001c) -#define NXROMUSB_ROM_TIME_PARM NXROMUSB(0x00010020) -#define NXROMUSB_ROM_CLK_DIV NXROMUSB(0x00010024) -#define NXROMUSB_ROM_MISS_INSTR NXROMUSB(0x00010028) - -/* - * Flash data structures - */ - -enum nxb_board_types { - NXB_BOARDTYPE_P1BD = 0, - NXB_BOARDTYPE_P1SB = 1, - NXB_BOARDTYPE_P1SMAX = 2, - NXB_BOARDTYPE_P1SOCK = 3, - - NXB_BOARDTYPE_P2SOCK31 = 8, - NXB_BOARDTYPE_P2SOCK35 = 9, - - NXB_BOARDTYPE_P2SB35_4G = 10, - NXB_BOARDTYPE_P2SB31_10G = 11, - NXB_BOARDTYPE_P2SB31_2G = 12, - NXB_BOARDTYPE_P2SB31_10GIMEZ = 13, - NXB_BOARDTYPE_P2SB31_10GHMEZ = 14, - NXB_BOARDTYPE_P2SB31_10GCX4 = 15 -}; - -#define NXB_MAX_PORTS NX_MAX_PORTS /* max supported ports */ - -struct nxb_info { - u_int32_t ni_hdrver; /* Board info version */ -#define NXB_VERSION 0x00000001 /* board information version */ - - u_int32_t ni_board_mfg; - u_int32_t ni_board_type; - u_int32_t ni_board_num; - - u_int32_t ni_chip_id; - u_int32_t ni_chip_minor; - u_int32_t ni_chip_major; - u_int32_t ni_chip_pkg; - u_int32_t ni_chip_lot; - - u_int32_t ni_port_mask; - u_int32_t ni_peg_mask; - u_int32_t ni_icache; - u_int32_t ni_dcache; - u_int32_t ni_casper; - - u_int32_t ni_lladdr0_low; - u_int32_t ni_lladdr1_low; - u_int32_t ni_lladdr2_low; - u_int32_t ni_lladdr3_low; - - u_int32_t ni_mnsync_mode; - u_int32_t ni_mnsync_shift_cclk; - u_int32_t ni_mnsync_shift_mclk; - u_int32_t ni_mnwb_enable; - u_int32_t ni_mnfreq_crystal; - u_int32_t ni_mnfreq_speed; - u_int32_t ni_mnorg; - u_int32_t ni_mndepth; - u_int32_t ni_mnranks0; - u_int32_t ni_mnranks1; - u_int32_t ni_mnrd_latency0; - u_int32_t ni_mnrd_latency1; - u_int32_t ni_mnrd_latency2; - u_int32_t ni_mnrd_latency3; - u_int32_t ni_mnrd_latency4; - u_int32_t ni_mnrd_latency5; - u_int32_t ni_mnrd_latency6; - u_int32_t ni_mnrd_latency7; - u_int32_t ni_mnrd_latency8; - u_int32_t ni_mndll[18]; - u_int32_t ni_mnddr_mode; - u_int32_t ni_mnddr_extmode; - u_int32_t ni_mntiming0; - u_int32_t ni_mntiming1; - u_int32_t ni_mntiming2; - - u_int32_t ni_snsync_mode; - u_int32_t ni_snpt_mode; - u_int32_t ni_snecc_enable; - u_int32_t ni_snwb_enable; - u_int32_t ni_snfreq_crystal; - u_int32_t ni_snfreq_speed; - u_int32_t ni_snorg; - u_int32_t ni_sndepth; - u_int32_t ni_sndll; - u_int32_t ni_snrd_latency; - - u_int32_t ni_lladdr0_high; - u_int32_t ni_lladdr1_high; - u_int32_t ni_lladdr2_high; - u_int32_t ni_lladdr3_high; - - u_int32_t ni_magic; -#define NXB_MAGIC 0x12345678 /* magic value */ - - u_int32_t ni_mnrd_imm; - u_int32_t ni_mndll_override; -} __packed; - -#define NXB_MAX_PORT_LLADDRS 32 - -struct nxb_imageinfo { - u_int32_t nim_bootld_ver; - u_int32_t nim_bootld_size; - u_int32_t nim_image_ver; -#define NXB_IMAGE_MAJOR_S 0 -#define NXB_IMAGE_MAJOR_M 0x000000ff -#define NXB_IMAGE_MINOR_S 8 -#define NXB_IMAGE_MINOR_M 0x0000ff00 -#define NXB_IMAGE_BUILD_S 16 -#define NXB_IMAGE_BUILD_M 0xffff0000 - u_int32_t nim_image_size; -} __packed; - -struct nxb_userinfo { - u_int8_t nu_flash_md5[1024]; - - struct nxb_imageinfo nu_image; - - u_int32_t nu_primary; - u_int32_t nu_secondary; - u_int64_t nu_lladdr[NXB_MAX_PORTS * NXB_MAX_PORT_LLADDRS]; - u_int32_t nu_subsys_id; - u_int8_t nu_serial_num[32]; - u_int32_t nu_bios_ver; - - /* Followed by user-specific data */ -} __packed; - -/* Appended to the on-disk firmware image, values in network byte order */ -struct nxb_firmware_header { - u_int32_t fw_hdrver; -#define NX_FIRMWARE_HDRVER 0 /* version of the firmware header */ - struct nxb_imageinfo fw_image; -#define fw_image_ver fw_image.nim_image_ver -#define fw_image_size fw_image.nim_image_size -#define fw_bootld_ver fw_image.nim_bootld_ver -#define fw_bootld_size fw_image.nim_bootld_size -} __packed; - -#endif /* _NX_REG_H */ |