diff options
author | gd78059 <none@none> | 2007-12-05 19:58:32 -0800 |
---|---|---|
committer | gd78059 <none@none> | 2007-12-05 19:58:32 -0800 |
commit | 8ef10d209f1443865a8ce5b1eb59838b64a64e67 (patch) | |
tree | 82312079ed89031aea489ba915c219eb31002724 /usr/src | |
parent | 664a673477ba7d1a08fe6e9fd8076e744913d25c (diff) | |
download | illumos-joyent-8ef10d209f1443865a8ce5b1eb59838b64a64e67.tar.gz |
6540812 amd64 dnet driver missing
6622301 dnet should support suspend/resume
6632441 dnet driver does not report link state for MII link
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/pkgdefs/SUNWos86r/prototype_i386 | 1 | ||||
-rw-r--r-- | usr/src/uts/intel/dnet/Makefile | 5 | ||||
-rw-r--r-- | usr/src/uts/intel/io/dnet.c | 294 | ||||
-rw-r--r-- | usr/src/uts/intel/sys/dnet.h | 34 |
4 files changed, 197 insertions, 137 deletions
diff --git a/usr/src/pkgdefs/SUNWos86r/prototype_i386 b/usr/src/pkgdefs/SUNWos86r/prototype_i386 index 8e6eb6dfa3..874b11220b 100644 --- a/usr/src/pkgdefs/SUNWos86r/prototype_i386 +++ b/usr/src/pkgdefs/SUNWos86r/prototype_i386 @@ -87,6 +87,7 @@ f none kernel/drv/spwr 755 root sys f none kernel/drv/spwr.conf 644 root sys # EXPORT DELETE END d none kernel/drv/amd64 755 root sys +f none kernel/drv/amd64/dnet 755 root sys f none kernel/drv/amd64/elxl 755 root sys f none kernel/drv/amd64/iprb 755 root sys f none kernel/drv/amd64/pcn 755 root sys diff --git a/usr/src/uts/intel/dnet/Makefile b/usr/src/uts/intel/dnet/Makefile index 14e60e5c40..057351bfec 100644 --- a/usr/src/uts/intel/dnet/Makefile +++ b/usr/src/uts/intel/dnet/Makefile @@ -63,11 +63,6 @@ $(NOT_RELEASE_BUILD)DEBUG_DEFS += $(DEBUG_FLGS) CPPFLAGS += -DSUNDDI -# Only build 32-bit version (until hat_getkfpnum() call is removed) -# See PSARC 2004/405 -DEF_BUILDS = $(DEF_BUILDS32) -ALL_BUILDS = $(ALL_BUILDS32) - # # For now, disable these lint checks; maintainers should endeavor # to investigate and remove these for maximum lint coverage. diff --git a/usr/src/uts/intel/io/dnet.c b/usr/src/uts/intel/io/dnet.c index f0b404c74f..133c4d29cc 100644 --- a/usr/src/uts/intel/io/dnet.c +++ b/usr/src/uts/intel/io/dnet.c @@ -101,8 +101,8 @@ struct free_ptr { struct rbuf_list { struct rbuf_list *rbuf_next; /* next in the list */ caddr_t rbuf_vaddr; /* virual addr of the buf */ - caddr_t rbuf_paddr; /* physical addr of the buf */ - caddr_t rbuf_endpaddr; /* physical addr at the end */ + uint32_t rbuf_paddr; /* physical addr of the buf */ + uint32_t rbuf_endpaddr; /* physical addr at the end */ ddi_dma_handle_t rbuf_dmahdl; /* dma handle */ ddi_acc_handle_t rbuf_acchdl; /* handle for DDI functions */ }; @@ -131,7 +131,7 @@ static void dnet_init_board(gld_mac_info_t *); static void dnet_chip_init(gld_mac_info_t *); static unsigned int hashindex(uchar_t *); static int dnet_start(gld_mac_info_t *); -static int dnet_set_addr(gld_mac_info_t *, uchar_t *); +static int dnet_set_addr(gld_mac_info_t *); static void dnet_getp(gld_mac_info_t *); static void update_rx_stats(gld_mac_info_t *, int); @@ -157,11 +157,11 @@ static void dnet_freemsg_buf(struct free_ptr *); static void setup_block(gld_mac_info_t *macinfo); /* SROM read functions */ -static int dnet_read_srom(dev_info_t *, int, ddi_acc_handle_t, int, uchar_t *, - int); -static void dnet_read21040addr(dev_info_t *, ddi_acc_handle_t, int, uchar_t *, - int *); -static void dnet_read21140srom(ddi_acc_handle_t, int, uchar_t *, int); +static int dnet_read_srom(dev_info_t *, int, ddi_acc_handle_t, caddr_t, + uchar_t *, int); +static void dnet_read21040addr(dev_info_t *, ddi_acc_handle_t, caddr_t, + uchar_t *, int *); +static void dnet_read21140srom(ddi_acc_handle_t, caddr_t, uchar_t *, int); static int get_alternative_srom_image(dev_info_t *, uchar_t *, int); static void dnet_print_srom(SROM_FORMAT *sr); static void dnet_dump_leaf(LEAF_FORMAT *leaf); @@ -341,7 +341,7 @@ static struct dev_ops dnetops = { static struct modldrv modldrv = { &mod_driverops, /* Type of module. This one is a driver */ - IDENT " %I%", /* short description */ + IDENT, /* short description */ &dnetops /* driver specific ops */ }; @@ -480,7 +480,7 @@ dnethack(dev_info_t *devinfo) uint32_t retval; int secondary; ddi_acc_handle_t io_handle; - uint32_t io_reg; + caddr_t io_reg; #define DNET_PCI_RNUMBER 1 @@ -504,8 +504,7 @@ dnethack(dev_info_t *devinfo) /* Now map I/O register */ if (ddi_regs_map_setup(devinfo, DNET_PCI_RNUMBER, - (caddr_t *)&io_reg, (offset_t)0, (offset_t)0, &accattr, - &io_handle) != DDI_SUCCESS) { + &io_reg, 0, 0, &accattr, &io_handle) != DDI_SUCCESS) { return (DDI_PROBE_FAILURE); } @@ -561,8 +560,36 @@ dnetattach(dev_info_t *devinfo, ddi_attach_cmd_t cmd) cmn_err(CE_NOTE, "dnetattach(0x%p)", (void *) devinfo); #endif - if (cmd != DDI_ATTACH) + switch (cmd) { + case DDI_ATTACH: + break; + + case DDI_RESUME: + + /* Get the driver private (gld_mac_info_t) structure */ + macinfo = ddi_get_driver_private(devinfo); + dnetp = (struct dnetinstance *)(macinfo->gldm_private); + + mutex_enter(&dnetp->intrlock); + mutex_enter(&dnetp->txlock); + dnet_reset_board(macinfo); + dnet_init_board(macinfo); + dnetp->suspended = B_FALSE; + + if (dnetp->running) { + dnetp->need_gld_sched = 0; + mutex_exit(&dnetp->txlock); + (void) dnet_start(macinfo); + mutex_exit(&dnetp->intrlock); + gld_sched(macinfo); + } else { + mutex_exit(&dnetp->txlock); + mutex_exit(&dnetp->intrlock); + } + return (DDI_SUCCESS); + default: return (DDI_FAILURE); + } if (pci_config_setup(devinfo, &handle) != DDI_SUCCESS) return (DDI_FAILURE); @@ -605,9 +632,8 @@ dnetattach(dev_info_t *devinfo, ddi_attach_cmd_t cmd) } /* Now map I/O register */ - if (ddi_regs_map_setup(devinfo, DNET_PCI_RNUMBER, - (caddr_t *)&dnetp->io_reg, (offset_t)0, (offset_t)0, &accattr, - &dnetp->io_handle) != DDI_SUCCESS) { + if (ddi_regs_map_setup(devinfo, DNET_PCI_RNUMBER, &dnetp->io_reg, + 0, 0, &accattr, &dnetp->io_handle) != DDI_SUCCESS) { kmem_free(dnetp, sizeof (struct dnetinstance)); gld_mac_free(macinfo); return (DDI_FAILURE); @@ -848,14 +874,32 @@ dnetdetach(dev_info_t *devinfo, ddi_detach_cmd_t cmd) cmn_err(CE_NOTE, "dnetdetach(0x%p)", (void *) devinfo); #endif - if (cmd != DDI_DETACH) { - return (DDI_FAILURE); - } - /* Get the driver private (gld_mac_info_t) structure */ macinfo = ddi_get_driver_private(devinfo); dnetp = (struct dnetinstance *)(macinfo->gldm_private); + switch (cmd) { + case DDI_DETACH: + break; + + case DDI_SUSPEND: + /* + * NB: dnetp->suspended can only be modified (marked true) + * if both intrlock and txlock are held. This keeps both + * tx and rx code paths excluded. + */ + mutex_enter(&dnetp->intrlock); + mutex_enter(&dnetp->txlock); + dnetp->suspended = B_TRUE; + dnet_reset_board(macinfo); + mutex_exit(&dnetp->txlock); + mutex_exit(&dnetp->intrlock); + return (DDI_SUCCESS); + + default: + return (DDI_FAILURE); + } + /* * Unregister ourselves from the GLD interface * @@ -941,6 +985,10 @@ dnet_reset(gld_mac_info_t *macinfo) dnetp->need_saddr = 0; mutex_exit(&dnetp->txlock); + if (dnetp->suspended) { + mutex_exit(&dnetp->intrlock); + return (0); + } dnet_reset_board(macinfo); if (ddi_getprop(DDI_DEV_T_ANY, dnetp->devinfo, DDI_PROP_DONTPASS, @@ -1017,13 +1065,13 @@ dnet_chip_init(gld_mac_info_t *macinfo) * Set the base address of the Rx descriptor list in CSR3 */ ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, RX_BASE_ADDR_REG), - (uint32_t)(dnetp->rx_desc_paddr)); + dnetp->rx_desc_paddr); /* * Set the base address of the Tx descrptor list in CSR4 */ ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, TX_BASE_ADDR_REG), - (uint32_t)(dnetp->tx_desc_paddr)); + dnetp->tx_desc_paddr); dnetp->tx_current_desc = dnetp->rx_current_desc = 0; dnetp->transmitted_desc = 0; @@ -1054,7 +1102,7 @@ dnet_start(gld_mac_info_t *macinfo) val = ddi_get32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG)); ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG), val | START_TRANSMIT); - (void) dnet_set_addr(macinfo, dnetp->curr_macaddr); + (void) dnet_set_addr(macinfo); val = ddi_get32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG)); ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG), val | START_RECEIVE); @@ -1077,10 +1125,12 @@ dnet_start_board(gld_mac_info_t *macinfo) #endif mutex_enter(&dnetp->intrlock); + dnetp->running = B_TRUE; /* * start the board and enable receiving */ - (void) dnet_start(macinfo); + if (!dnetp->suspended) + (void) dnet_start(macinfo); mutex_exit(&dnetp->intrlock); return (0); } @@ -1103,10 +1153,13 @@ dnet_stop_board(gld_mac_info_t *macinfo) * stop the board and disable transmit/receive */ mutex_enter(&dnetp->intrlock); - val = ddi_get32(dnetp->io_handle, - REG32(dnetp->io_reg, OPN_MODE_REG)); - ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG), - val & ~(START_TRANSMIT | START_RECEIVE)); + if (!dnetp->suspended) { + val = ddi_get32(dnetp->io_handle, + REG32(dnetp->io_reg, OPN_MODE_REG)); + ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG), + val & ~(START_TRANSMIT | START_RECEIVE)); + } + dnetp->running = B_FALSE; mutex_exit(&dnetp->intrlock); return (0); } @@ -1116,24 +1169,21 @@ dnet_stop_board(gld_mac_info_t *macinfo) * Called with intrlock held. */ static int -dnet_set_addr(gld_mac_info_t *macinfo, uchar_t *macaddr) +dnet_set_addr(gld_mac_info_t *macinfo) { struct dnetinstance *dnetp = /* Our private device info */ (struct dnetinstance *)macinfo->gldm_private; struct tx_desc_type *desc; int current_desc; - uint32_t index; - uint32_t *hashp; - uint32_t val; + uint32_t val; ASSERT(MUTEX_HELD(&dnetp->intrlock)); #ifdef DNETDEBUG if (dnetdebug & DNETTRACE) cmn_err(CE_NOTE, "dnet_set_addr(0x%p)", (void *) macinfo); #endif - bcopy(macaddr, dnetp->curr_macaddr, ETHERADDRL); - val = ddi_get32(dnetp->io_handle, - REG32(dnetp->io_reg, OPN_MODE_REG)); + + val = ddi_get32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG)); if (!(val & START_TRANSMIT)) return (0); @@ -1155,8 +1205,8 @@ dnet_set_addr(gld_mac_info_t *macinfo, uchar_t *macaddr) return (0); } - desc->buffer1 = (uint32_t)(dnetp->setup_buf_paddr); - desc->buffer2 = (uint32_t)(0); + desc->buffer1 = dnetp->setup_buf_paddr; + desc->buffer2 = 0; desc->desc1.buffer_size1 = SETUPBUF_SIZE; desc->desc1.buffer_size2 = 0; desc->desc1.setup_packet = 1; @@ -1166,6 +1216,31 @@ dnet_set_addr(gld_mac_info_t *macinfo, uchar_t *macaddr) desc->desc1.filter_type1 = 1; desc->desc1.int_on_comp = 1; + desc->desc0.own = 1; + ddi_put8(dnetp->io_handle, REG8(dnetp->io_reg, TX_POLL_REG), + TX_POLL_DEMAND); + return (0); +} + +/* + * dnet_set_mac_addr() -- set the physical network address on the board + */ +static int +dnet_set_mac_addr(gld_mac_info_t *macinfo, uchar_t *macaddr) +{ + struct dnetinstance *dnetp = /* Our private device info */ + (struct dnetinstance *)macinfo->gldm_private; + uint32_t index; + uint32_t *hashp; + +#ifdef DNETDEBUG + if (dnetdebug & DNETTRACE) + cmn_err(CE_NOTE, "dnet_set_mac_addr(0x%p)", (void *) macinfo); +#endif + mutex_enter(&dnetp->intrlock); + + bcopy(macaddr, dnetp->curr_macaddr, ETHERADDRL); + /* * As we are using Imperfect filtering, the broadcast address has to * be set explicitly in the 512 bit hash table. Hence the index into @@ -1190,27 +1265,8 @@ dnet_set_addr(gld_mac_info_t *macinfo, uchar_t *macaddr) index = hashindex((uchar_t *)dnetp->curr_macaddr); hashp[ index / 16 ] |= 1 << (index % 16); - desc->desc0.own = 1; - ddi_put8(dnetp->io_handle, REG8(dnetp->io_reg, TX_POLL_REG), - TX_POLL_DEMAND); - return (0); -} - -/* - * dnet_set_mac_addr() -- set the physical network address on the board - */ -static int -dnet_set_mac_addr(gld_mac_info_t *macinfo, uchar_t *macaddr) -{ - struct dnetinstance *dnetp = /* Our private device info */ - (struct dnetinstance *)macinfo->gldm_private; - -#ifdef DNETDEBUG - if (dnetdebug & DNETTRACE) - cmn_err(CE_NOTE, "dnet_set_mac_addr(0x%p)", (void *) macinfo); -#endif - mutex_enter(&dnetp->intrlock); - (void) dnet_set_addr(macinfo, macaddr); + if (!dnetp->suspended) + (void) dnet_set_addr(macinfo); mutex_exit(&dnetp->intrlock); return (0); } @@ -1251,7 +1307,10 @@ dnet_set_multicast(gld_mac_info_t *macinfo, uchar_t *mcast, int op) } hashp[ index / 16 ] &= ~ (1 << (index % 16)); } - retval = dnet_set_addr(macinfo, dnetp->curr_macaddr); + if (!dnetp->suspended) + retval = dnet_set_addr(macinfo); + else + retval = 0; mutex_exit(&dnetp->intrlock); return (retval); } @@ -1318,14 +1377,18 @@ dnet_set_promiscuous(gld_mac_info_t *macinfo, int on) } dnetp->promisc = on; - val = ddi_get32(dnetp->io_handle, - REG32(dnetp->io_reg, OPN_MODE_REG)); - if (on != GLD_MAC_PROMISC_NONE) - ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG), - val | PROM_MODE); - else - ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG), - val & (~PROM_MODE)); + if (!dnetp->suspended) { + val = ddi_get32(dnetp->io_handle, + REG32(dnetp->io_reg, OPN_MODE_REG)); + if (on != GLD_MAC_PROMISC_NONE) + ddi_put32(dnetp->io_handle, + REG32(dnetp->io_reg, OPN_MODE_REG), + val | PROM_MODE); + else + ddi_put32(dnetp->io_handle, + REG32(dnetp->io_reg, OPN_MODE_REG), + val & (~PROM_MODE)); + } mutex_exit(&dnetp->intrlock); return (DDI_SUCCESS); } @@ -1365,9 +1428,15 @@ dnet_get_stats(gld_mac_info_t *macinfo, struct gld_stats *sp) sp->glds_nocarrier = dnetp->stat_nocarrier; /* stats from instance structure */ - sp->glds_speed = dnetp->speed * 1000000; - sp->glds_duplex = - dnetp->full_duplex ? GLD_DUPLEX_FULL : GLD_DUPLEX_HALF; + if (dnetp->mii_up) { + sp->glds_speed = dnetp->mii_speed * 1000000; + sp->glds_duplex = dnetp->mii_duplex ? + GLD_DUPLEX_FULL : GLD_DUPLEX_HALF; + } else { + sp->glds_speed = dnetp->speed * 1000000; + sp->glds_duplex = + dnetp->full_duplex ? GLD_DUPLEX_FULL : GLD_DUPLEX_HALF; + } return (DDI_SUCCESS); } @@ -1407,11 +1476,17 @@ dnet_send(gld_mac_info_t *macinfo, mblk_t *mp) (void *) macinfo, (void *) mp); #endif mutex_enter(&dnetp->txlock); + /* if suspended, drop the packet on the floor, we missed it */ + if (dnetp->suspended) { + mutex_exit(&dnetp->txlock); + freemsg(mp); + return (0); + } if (dnetp->need_saddr) { /* XXX function return value ignored */ mutex_exit(&dnetp->txlock); mutex_enter(&dnetp->intrlock); - (void) dnet_set_addr(macinfo, dnetp->curr_macaddr); + (void) dnet_set_addr(macinfo); mutex_exit(&dnetp->intrlock); mutex_enter(&dnetp->txlock); } @@ -1609,6 +1684,11 @@ dnetintr(gld_mac_info_t *macinfo) if (dnetdebug & DNETINT) cmn_err(CE_NOTE, "dnetintr(0x%p)", (void *)macinfo); #endif + if (dnetp->suspended) { + mutex_exit(&dnetp->intrlock); + return (DDI_INTR_UNCLAIMED); + } + int_status = ddi_get32(dnetp->io_handle, REG32(dnetp->io_reg, STATUS_REG)); @@ -1919,10 +1999,10 @@ dnet_getp(gld_mac_info_t *macinfo) uint32_t end_paddr; /* attach the new buffer to the rx descriptor */ dnetp->rx_buf_vaddr[index] = newbuf; - desc[index].buffer1 = (uint32_t)rp->rbuf_paddr; + desc[index].buffer1 = rp->rbuf_paddr; desc[index].desc1.buffer_size1 = rx_buf_size; desc[index].desc1.buffer_size2 = 0; - end_paddr = (uint32_t)rp->rbuf_endpaddr; + end_paddr = rp->rbuf_endpaddr; if ((desc[index].buffer1 & ~dnetp->pgmask) != (end_paddr & ~dnetp->pgmask)) { /* discontiguous */ @@ -2346,10 +2426,8 @@ dnet_alloc_bufs(gld_mac_info_t *macinfo) return (FAILURE); page_size = ddi_ptob(dnetp->devinfo, 1); - for (i = page_size, len = 0; i > 1; len++) - i >>= 1; + dnetp->pgmask = page_size - 1; - dnetp->pgshft = len; /* allocate setup buffer if necessary */ if (dnetp->setup_buf_vaddr == NULL) { @@ -2365,8 +2443,7 @@ dnet_alloc_bufs(gld_mac_info_t *macinfo) NULL, &cookie, &ncookies) != DDI_DMA_MAPPED) return (FAILURE); - dnetp->setup_buf_paddr = (caddr_t)(uintptr_t) - cookie.dmac_laddress; + dnetp->setup_buf_paddr = cookie.dmac_address; bzero(dnetp->setup_buf_vaddr, len); } @@ -2385,8 +2462,7 @@ dnet_alloc_bufs(gld_mac_info_t *macinfo) DDI_DMA_RDWR | DDI_DMA_STREAMING, DDI_DMA_SLEEP, NULL, &cookie, &ncookies) != DDI_DMA_MAPPED) return (FAILURE); - dnetp->tx_desc_paddr = (caddr_t)(uintptr_t) - cookie.dmac_laddress; + dnetp->tx_desc_paddr = cookie.dmac_address; bzero(dnetp->tx_desc, len); dnetp->nxmit_desc = dnetp->max_tx_desc; @@ -2413,8 +2489,7 @@ dnet_alloc_bufs(gld_mac_info_t *macinfo) NULL, &cookie, &ncookies) != DDI_DMA_MAPPED) return (FAILURE); - dnetp->rx_desc_paddr = (caddr_t)(uintptr_t) - cookie.dmac_laddress; + dnetp->rx_desc_paddr = cookie.dmac_address; bzero(dnetp->rx_desc, len); dnetp->nrecv_desc = dnetp->max_rx_desc; @@ -2422,7 +2497,7 @@ dnet_alloc_bufs(gld_mac_info_t *macinfo) kmem_zalloc(dnetp->max_rx_desc * sizeof (caddr_t), KM_SLEEP); dnetp->rx_buf_paddr = - kmem_zalloc(dnetp->max_rx_desc * sizeof (caddr_t), + kmem_zalloc(dnetp->max_rx_desc * sizeof (uint32_t), KM_SLEEP); /* * Allocate or add to the pool of receive buffers. The pool @@ -2504,7 +2579,7 @@ dnet_free_bufs(gld_mac_info_t *macinfo) kmem_free(dnetp->rx_buf_vaddr, dnetp->nrecv_desc * sizeof (caddr_t)); kmem_free(dnetp->rx_buf_paddr, - dnetp->nrecv_desc * sizeof (caddr_t)); + dnetp->nrecv_desc * sizeof (uint32_t)); dnetp->rx_buf_vaddr = NULL; dnetp->rx_buf_paddr = NULL; } @@ -2566,8 +2641,8 @@ dnet_init_txrx_bufs(gld_mac_info_t *macinfo) } *(uint32_t *)&dnetp->tx_desc[i].desc0 = 0; *(uint32_t *)&dnetp->tx_desc[i].desc1 = 0; - dnetp->tx_desc[i].buffer1 = (uint32_t)(0); - dnetp->tx_desc[i].buffer2 = (uint32_t)(0); + dnetp->tx_desc[i].buffer1 = 0; + dnetp->tx_desc[i].buffer2 = 0; } dnetp->tx_desc[i - 1].desc1.end_of_ring = 1; @@ -2580,9 +2655,9 @@ dnet_init_txrx_bufs(gld_mac_info_t *macinfo) *(uint32_t *)&dnetp->rx_desc[i].desc1 = 0; dnetp->rx_desc[i].desc0.own = 1; dnetp->rx_desc[i].desc1.buffer_size1 = rx_buf_size; - dnetp->rx_desc[i].buffer1 = (uint32_t)dnetp->rx_buf_paddr[i]; - dnetp->rx_desc[i].buffer2 = (uint32_t)(0); - end_paddr = (uint32_t)dnetp->rx_buf_paddr[i]+rx_buf_size-1; + dnetp->rx_desc[i].buffer1 = dnetp->rx_buf_paddr[i]; + dnetp->rx_desc[i].buffer2 = 0; + end_paddr = dnetp->rx_buf_paddr[i]+rx_buf_size-1; if ((dnetp->rx_desc[i].buffer1 & ~dnetp->pgmask) != (end_paddr & ~dnetp->pgmask)) { @@ -2635,8 +2710,8 @@ alloctop: if (dnetp->need_saddr) { mutex_exit(&dnetp->txlock); /* XXX function return value ignored */ - /* XXX function return value ignored */ - (void) dnet_set_addr(macinfo, dnetp->curr_macaddr); + if (!dnetp->suspended) + (void) dnet_set_addr(macinfo); goto alloctop; } @@ -2768,14 +2843,14 @@ dnet_rbuf_init(dev_info_t *dip, int nbufs) if (ncookies > 2) goto fail_unbind; if (ncookies == 1) { - rp->rbuf_endpaddr = (caddr_t)(uintptr_t) - (cookie.dmac_laddress + rx_buf_size - 1); + rp->rbuf_endpaddr = + cookie.dmac_address + rx_buf_size - 1; } else { ddi_dma_nextcookie(rp->rbuf_dmahdl, &cookie); - rp->rbuf_endpaddr = (caddr_t)(uintptr_t) - (cookie.dmac_laddress + cookie.dmac_size - 1); + rp->rbuf_endpaddr = + cookie.dmac_address + cookie.dmac_size - 1; } - rp->rbuf_paddr = (caddr_t)(uintptr_t)cookie.dmac_laddress; + rp->rbuf_paddr = cookie.dmac_address; rp->rbuf_next = rbuf_freelist_head; rbuf_freelist_head = rp; @@ -2866,14 +2941,14 @@ dnet_rbuf_alloc(dev_info_t *dip, int cansleep) if (ncookies > 2) goto fail_unbind; if (ncookies == 1) { - rp->rbuf_endpaddr = (caddr_t)(uintptr_t) - (cookie.dmac_laddress + rx_buf_size - 1); + rp->rbuf_endpaddr = + cookie.dmac_address + rx_buf_size - 1; } else { ddi_dma_nextcookie(rp->rbuf_dmahdl, &cookie); - rp->rbuf_endpaddr = (caddr_t)(uintptr_t) - (cookie.dmac_laddress + cookie.dmac_size - 1); + rp->rbuf_endpaddr = + cookie.dmac_address + cookie.dmac_size - 1; } - rp->rbuf_paddr = (caddr_t)(uintptr_t)cookie.dmac_laddress; + rp->rbuf_paddr = cookie.dmac_address; rbuf_freelist_head = rp; rbuf_pool_size++; @@ -2970,7 +3045,7 @@ dnet_freemsg_buf(struct free_ptr *frp) */ static int dnet_read_srom(dev_info_t *devinfo, int board_type, ddi_acc_handle_t io_handle, - int io_reg, uchar_t *vi, int maxlen) + caddr_t io_reg, uchar_t *vi, int maxlen) { int all_ones, zerocheck, i; @@ -3008,7 +3083,7 @@ dnet_read_srom(dev_info_t *devinfo, int board_type, ddi_acc_handle_t io_handle, * The function reads the ethernet address of the 21040 adapter */ static void -dnet_read21040addr(dev_info_t *dip, ddi_acc_handle_t io_handle, int io_reg, +dnet_read21040addr(dev_info_t *dip, ddi_acc_handle_t io_handle, caddr_t io_reg, uchar_t *addr, int *len) { uint32_t val; @@ -3035,7 +3110,7 @@ dnet_read21040addr(dev_info_t *dip, ddi_acc_handle_t io_handle, int io_reg, * The function reads the SROM of the 21140 adapter */ static void -dnet_read21140srom(ddi_acc_handle_t io_handle, int io_reg, uchar_t *addr, +dnet_read21140srom(ddi_acc_handle_t io_handle, caddr_t io_reg, uchar_t *addr, int maxlen) { uint32_t i, j; @@ -3638,7 +3713,7 @@ send_test_packet(gld_mac_info_t *macinfo) BCOPY((caddr_t)dnetp->curr_macaddr, (caddr_t)dnetp->setup_buf_vaddr+ETHERADDRL, ETHERADDRL); - desc[bufindex].buffer1 = (uint32_t)(dnetp->setup_buf_paddr); + desc[bufindex].buffer1 = dnetp->setup_buf_paddr; desc[bufindex].desc1.buffer_size1 = SETUPBUF_SIZE; desc[bufindex].buffer2 = (uint32_t)(0); desc[bufindex].desc1.first_desc = 1; @@ -4163,6 +4238,8 @@ dnet_mii_link_cb(dev_info_t *dip, int phy, enum mii_phy_state state) } else { /* NEEDSWORK: Probably can call find_active_media here */ dnetp->mii_up = 0; + dnetp->mii_speed = 0; + dnetp->mii_duplex = 0; if (leaf->default_block->media_code == MEDIA_MII) dnetp->selected_media_block = leaf->default_block; setup_block(macinfo); @@ -4792,8 +4869,8 @@ dnet_usectimeout(struct dnetinstance *dnetp, uint32_t usecs, int contin, mutex_enter(&dnetp->intrlock); dnetp->timer.start_ticks = (usecs * 100) / 8192; dnetp->timer.cb = cback; - outl(dnetp->io_reg + GP_TIMER_REG, dnetp->timer.start_ticks | - (contin ? GPTIMER_CONT : 0)); + ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, GP_TIMER_REG), + dnetp->timer.start_ticks | (contin ? GPTIMER_CONT : 0)); if (dnetp->timer.cb) enable_interrupts(dnetp, 1); mutex_exit(&dnetp->intrlock); @@ -4803,7 +4880,8 @@ uint32_t dnet_usecelapsed(struct dnetinstance *dnetp) { uint32_t ticks = dnetp->timer.start_ticks - - (inl(dnetp->io_reg + GP_TIMER_REG) & 0xffff); + (ddi_get32(dnetp->io_handle, REG32(dnetp->io_reg, GP_TIMER_REG)) & + 0xffff); return ((ticks * 8192) / 100); } diff --git a/usr/src/uts/intel/sys/dnet.h b/usr/src/uts/intel/sys/dnet.h index 5883797bb5..cad21db2f2 100644 --- a/usr/src/uts/intel/sys/dnet.h +++ b/usr/src/uts/intel/sys/dnet.h @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -20,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2005 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -366,7 +365,7 @@ typedef struct srom_format { #define EXT_BIT 0x40 struct dnetinstance { - int io_reg; /* mapped register */ + caddr_t io_reg; /* mapped register */ int board_type; /* board type: 21040 or 21140 */ int full_duplex; int bnc_indicator; /* Flag for BNC connector */ @@ -380,11 +379,11 @@ struct dnetinstance { int need_saddr; int max_tx_desc; /* max xmit descriptors */ caddr_t setup_buf_vaddr; /* setup buffer (virt) */ - caddr_t setup_buf_paddr; /* setup buffer (phys) */ + uint32_t setup_buf_paddr; /* setup buffer (phys) */ struct tx_desc_type *tx_desc; /* virtual addr of xmit desc */ - caddr_t tx_desc_paddr; /* physical addr of xmit desc */ + uint32_t tx_desc_paddr; /* physical addr of xmit desc */ struct rx_desc_type *rx_desc; /* virtual addr of recv desc */ - caddr_t rx_desc_paddr; /* physical addr of recv desc */ + uint32_t rx_desc_paddr; /* physical addr of recv desc */ char multicast_cnt[MCASTBUF_SIZE]; ddi_acc_handle_t io_handle; /* ddi I/O handle */ dev_info_t *devinfo; @@ -394,7 +393,6 @@ struct dnetinstance { ddi_dma_handle_t dma_handle_txdesc; ddi_dma_handle_t dma_handle_setbuf; int pgmask; - int pgshft; ddi_acc_handle_t setup_buf_acchdl; int nxmit_desc; /* #of xmit descriptors */ int nrecv_desc; /* #of recv descriptors */ @@ -403,9 +401,11 @@ struct dnetinstance { mblk_t **tx_msgbufp; /* streams message buffers */ /* used for xmit */ caddr_t *rx_buf_vaddr; /* recv buf addresses (virt) */ - caddr_t *rx_buf_paddr; /* recv buf addresses (phys) */ + uint32_t *rx_buf_paddr; /* recv buf addresses (phys) */ kmutex_t txlock; kmutex_t intrlock; + boolean_t suspended; + boolean_t running; int need_gld_sched; uint32_t stat_errrcv; @@ -434,12 +434,6 @@ struct dnetinstance { uchar_t vendor_addr[ETHERADDRL]; uchar_t curr_macaddr[ETHERADDRL]; media_block_t *selected_media_block; - struct { - int _10mb; - int _100mb; - int _10mb_fd; - int _100mb_fd; - } v1_phy_media; uint32_t disallowed_media; int disable_scrambler; int overrun_workaround; @@ -453,14 +447,6 @@ struct dnetinstance { } timer; }; -/* - * Macro to convert Virtual to physical address - */ -#define DNET_KVTOP(vaddr) \ - ((uint32_t)(hat_getkpfnum((caddr_t)(vaddr)) << \ - (dnetp->pgshft)) | ((uintptr_t)(vaddr) & \ - (dnetp->pgmask))) - #pragma pack(1) #define BCOPY(from, to, len) bcopy(from, to, len) |