Date: Wed, 15 Sep 2004 18:57:02 GMT From: Julian Elischer <julian@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 61549 for review Message-ID: <200409151857.i8FIv2Uh092908@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=61549 Change 61549 by julian@julian_ref on 2004/09/15 18:56:32 IFC@61548 Affected files ... .. //depot/projects/nsched/sys/alpha/isa/isa_dma.c#3 integrate .. //depot/projects/nsched/sys/amd64/isa/isa_dma.c#4 integrate .. //depot/projects/nsched/sys/amd64/isa/isa_dma.h#3 delete .. //depot/projects/nsched/sys/contrib/pf/net/if_pflog.c#6 integrate .. //depot/projects/nsched/sys/contrib/pf/net/if_pfsync.c#7 integrate .. //depot/projects/nsched/sys/contrib/pf/net/pf_if.c#3 integrate .. //depot/projects/nsched/sys/contrib/pf/net/pf_ioctl.c#8 integrate .. //depot/projects/nsched/sys/dev/aha/aha_mca.c#2 integrate .. //depot/projects/nsched/sys/dev/amr/amr.c#5 integrate .. //depot/projects/nsched/sys/dev/buslogic/bt_mca.c#2 integrate .. //depot/projects/nsched/sys/dev/fdc/fdc.c#8 integrate .. //depot/projects/nsched/sys/dev/fdc/fdc_isa.c#4 integrate .. //depot/projects/nsched/sys/dev/fdc/fdc_pccard.c#3 integrate .. //depot/projects/nsched/sys/dev/fdc/fdcvar.h#3 integrate .. //depot/projects/nsched/sys/dev/md/md.c#11 integrate .. //depot/projects/nsched/sys/dev/nge/if_nge.c#7 integrate .. //depot/projects/nsched/sys/dev/nge/if_ngereg.h#2 integrate .. //depot/projects/nsched/sys/dev/pst/pst-iop.h#2 integrate .. //depot/projects/nsched/sys/dev/pst/pst-pci.c#2 integrate .. //depot/projects/nsched/sys/dev/pst/pst-raid.c#2 integrate .. //depot/projects/nsched/sys/i386/isa/isa_dma.c#4 integrate .. //depot/projects/nsched/sys/i386/isa/isa_dma.h#3 delete .. //depot/projects/nsched/sys/ia64/isa/isa_dma.c#3 integrate .. //depot/projects/nsched/sys/isa/isavar.h#2 integrate .. //depot/projects/nsched/sys/kern/kern_event.c#9 integrate .. //depot/projects/nsched/sys/kern/kern_switch.c#31 integrate .. //depot/projects/nsched/sys/kern/kern_thread.c#36 integrate .. //depot/projects/nsched/sys/net/if_clone.c#3 integrate .. //depot/projects/nsched/sys/pc98/pc98/isa_dma.c#4 integrate .. //depot/projects/nsched/sys/vm/vm_page.c#9 integrate Differences ... ==== //depot/projects/nsched/sys/alpha/isa/isa_dma.c#3 (text+ko) ==== @@ -44,7 +44,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/alpha/isa/isa_dma.c,v 1.11 2004/04/05 21:00:51 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/alpha/isa/isa_dma.c,v 1.12 2004/09/15 12:09:49 phk Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -93,10 +93,8 @@ /* * Setup a DMA channel's bounce buffer. */ -void -isa_dmainit(chan, bouncebufsize) - int chan; - u_int bouncebufsize; +int +isa_dma_init(int chan, u_int bouncebufsize, int flag __unused) { static int initted = 0; bus_addr_t boundary = chan >= 4 ? 0x20000 : 0x10000; @@ -114,10 +112,10 @@ #ifdef DIAGNOSTIC if (chan & ~VALID_DMA_MASK) - panic("isa_dmainit: channel out of range"); + panic("isa_dma_init: channel out of range"); if (dma_tag[chan] || dma_map[chan]) - panic("isa_dmainit: impossible request"); + panic("isa_dma_init: impossible request"); #endif if (bus_dma_tag_create(/*parent*/NULL, @@ -132,13 +130,13 @@ /*lockfunc*/busdma_lock_mutex, /*lockarg*/&Giant, &dma_tag[chan]) != 0) { - panic("isa_dmainit: unable to create dma tag\n"); + panic("isa_dma_init: unable to create dma tag\n"); } if (bus_dmamap_create(dma_tag[chan], 0, &dma_map[chan])) { - panic("isa_dmainit: unable to create dma map\n"); + panic("isa_dma_init: unable to create dma map\n"); } - + return (0); } /* @@ -349,7 +347,7 @@ #endif if (!dma_tag || !dma_map[chan]) - panic("isa_dmastart: called without isa_dmainit"); + panic("isa_dmastart: called without isa_dma_init"); dma_busy |= (1 << chan); ==== //depot/projects/nsched/sys/amd64/isa/isa_dma.c#4 (text+ko) ==== @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/isa/isa_dma.c,v 1.19 2004/08/16 22:51:13 peter Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/isa/isa_dma.c,v 1.20 2004/09/15 12:09:49 phk Exp $"); /* * code to manage AT bus @@ -96,15 +96,13 @@ /* * Setup a DMA channel's bounce buffer. */ -void -isa_dmainit(chan, bouncebufsize) - int chan; - u_int bouncebufsize; +int +isa_dma_init(int chan, u_int bouncebufsize, int flag) { void *buf; /* - * If a DMA channel is shared, both drivers have to call isa_dmainit + * If a DMA channel is shared, both drivers have to call isa_dma_init * since they don't know that the other driver will do it. * Just return if we're already set up good. * XXX: this only works if they agree on the bouncebuf size. This @@ -112,30 +110,30 @@ * XXX: the same driver. */ if (dma_bouncebuf[chan] != NULL) - return; + return (0); #ifdef DIAGNOSTIC if (chan & ~VALID_DMA_MASK) - panic("isa_dmainit: channel out of range"); + panic("isa_dma_init: channel out of range"); #endif dma_bouncebufsize[chan] = bouncebufsize; /* Try malloc() first. It works better if it works. */ - buf = malloc(bouncebufsize, M_DEVBUF, M_NOWAIT); + buf = malloc(bouncebufsize, M_DEVBUF, flag); if (buf != NULL) { if (isa_dmarangecheck(buf, bouncebufsize, chan) == 0) { dma_bouncebuf[chan] = buf; - return; + return (0); } free(buf, M_DEVBUF); } - buf = contigmalloc(bouncebufsize, M_DEVBUF, M_NOWAIT, 0ul, 0xfffffful, + buf = contigmalloc(bouncebufsize, M_DEVBUF, flag, 0ul, 0xfffffful, 1ul, chan & 4 ? 0x20000ul : 0x10000ul); if (buf == NULL) - printf("isa_dmainit(%d, %d) failed\n", chan, bouncebufsize); - else - dma_bouncebuf[chan] = buf; + return (ENOMEM); + dma_bouncebuf[chan] = buf; + return (0); } /* ==== //depot/projects/nsched/sys/contrib/pf/net/if_pflog.c#6 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/sys/contrib/pf/net/if_pflog.c,v 1.9 2004/06/22 20:13:24 brooks Exp $ */ +/* $FreeBSD: src/sys/contrib/pf/net/if_pflog.c,v 1.10 2004/09/14 03:12:01 mlaier Exp $ */ /* $OpenBSD: if_pflog.c,v 1.11 2003/12/31 11:18:25 cedric Exp $ */ /* * The authors of this code are John Ioannidis (ji@tla.org), @@ -377,6 +377,6 @@ #define PFLOG_MODVER 1 -DECLARE_MODULE(pflog, pflog_mod, SI_SUB_PSEUDO, SI_ORDER_ANY); +DECLARE_MODULE(pflog, pflog_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY); MODULE_VERSION(pflog, PFLOG_MODVER); #endif /* __FreeBSD__ */ ==== //depot/projects/nsched/sys/contrib/pf/net/if_pfsync.c#7 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/sys/contrib/pf/net/if_pfsync.c,v 1.11 2004/08/14 15:32:40 dwmalone Exp $ */ +/* $FreeBSD: src/sys/contrib/pf/net/if_pfsync.c,v 1.12 2004/09/14 03:12:01 mlaier Exp $ */ /* $OpenBSD: if_pfsync.c,v 1.26 2004/03/28 18:14:20 mcbride Exp $ */ /* @@ -1662,6 +1662,6 @@ #define PFSYNC_MODVER 1 -DECLARE_MODULE(pfsync, pfsync_mod, SI_SUB_PSEUDO, SI_ORDER_ANY); +DECLARE_MODULE(pfsync, pfsync_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY); MODULE_VERSION(pfsync, PFSYNC_MODVER); #endif /* __FreeBSD__ */ ==== //depot/projects/nsched/sys/contrib/pf/net/pf_if.c#3 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/sys/contrib/pf/net/pf_if.c,v 1.5 2004/08/16 17:58:12 mlaier Exp $ */ +/* $FreeBSD: src/sys/contrib/pf/net/pf_if.c,v 1.6 2004/09/14 15:20:24 mlaier Exp $ */ /* $OpenBSD: pf_if.c,v 1.11 2004/03/15 11:38:23 cedric Exp $ */ /* add $OpenBSD: pf_if.c,v 1.19 2004/08/11 12:06:44 henning Exp $ */ @@ -638,8 +638,16 @@ af = ia->ifa_addr->sa_family; if (af != AF_INET && af != AF_INET6) continue; -#ifdef notyet - if (!(ia->ifa_flags & IFA_ROUTE)) +#ifdef __FreeBSD__ + /* + * XXX: For point-to-point interfaces, (ifname:0) and IPv4, + * jump over addresses without a proper route to work + * around a problem with ppp not fully removing the + * address used during IPCP. + */ + if ((ifp->if_flags & IFF_POINTOPOINT) && + !(ia->ifa_flags & IFA_ROUTE) && + (flags & PFI_AFLAG_NOALIAS) && (af == AF_INET)) continue; #endif if ((flags & PFI_AFLAG_BROADCAST) && af == AF_INET6) ==== //depot/projects/nsched/sys/contrib/pf/net/pf_ioctl.c#8 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/sys/contrib/pf/net/pf_ioctl.c,v 1.13 2004/08/22 15:23:48 mlaier Exp $ */ +/* $FreeBSD: src/sys/contrib/pf/net/pf_ioctl.c,v 1.14 2004/09/14 03:12:01 mlaier Exp $ */ /* $OpenBSD: pf_ioctl.c,v 1.112.2.2 2004/07/24 18:28:12 brad Exp $ */ /* @@ -3411,6 +3411,6 @@ 0 }; -DECLARE_MODULE(pf, pf_mod, SI_SUB_PSEUDO, SI_ORDER_FIRST); +DECLARE_MODULE(pf, pf_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_FIRST); MODULE_VERSION(pf, PF_MODVER); #endif /* __FreeBSD__ */ ==== //depot/projects/nsched/sys/dev/aha/aha_mca.c#2 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/aha/aha_mca.c,v 1.11 2004/03/17 17:50:24 njl Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/aha/aha_mca.c,v 1.12 2004/09/15 11:58:34 phk Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -41,7 +41,7 @@ #include <machine/resource.h> #include <sys/rman.h> -#include <i386/isa/isa_dma.h> +#include <isa/isavar.h> #include <dev/mca/mca_busreg.h> #include <dev/mca/mca_busvar.h> ==== //depot/projects/nsched/sys/dev/amr/amr.c#5 (text+ko) ==== @@ -55,7 +55,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/amr/amr.c,v 1.54 2004/08/16 17:23:09 ambrisko Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/amr/amr.c,v 1.55 2004/09/14 16:36:12 scottl Exp $"); /* * Driver for the AMI MegaRaid family of controllers. @@ -708,7 +708,7 @@ if ((result = malloc(bufsize, M_DEVBUF, M_NOWAIT)) == NULL) goto out; /* set command flags */ - ac->ac_flags |= AMR_CMD_PRIORITY | AMR_CMD_DATAOUT; + ac->ac_flags |= AMR_CMD_PRIORITY | AMR_CMD_DATAIN; /* point the command at our data */ ac->ac_data = result; ==== //depot/projects/nsched/sys/dev/buslogic/bt_mca.c#2 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/buslogic/bt_mca.c,v 1.9 2004/03/17 17:50:29 njl Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/buslogic/bt_mca.c,v 1.10 2004/09/15 11:58:34 phk Exp $"); /* * Written using the bt_isa/bt_pci code as a reference. @@ -55,7 +55,7 @@ #include <dev/mca/mca_busreg.h> #include <dev/mca/mca_busvar.h> -#include <i386/isa/isa_dma.h> +#include <isa/isavar.h> #include <dev/buslogic/btreg.h> ==== //depot/projects/nsched/sys/dev/fdc/fdc.c#8 (text+ko) ==== @@ -51,7 +51,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/fdc/fdc.c,v 1.286 2004/08/27 17:08:24 phk Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/fdc/fdc.c,v 1.288 2004/09/14 17:28:51 imp Exp $"); #include "opt_fdc.h" @@ -197,9 +197,18 @@ #define FDCTL 7 /* Control Register (W) */ /* - * this is the secret PIO data port (offset from base) + * The YE-DATA PC Card floppies use PIO to read in the data rather than + * DMA due to the wild variability of DMA for the PC Card devices. In + * addition, if we cannot setup the DMA resources for the ISA attachment, + * we'll use this same offset for data transfer. + * + * For this mode, offset 0 and 1 must be used to setup the transfer + * for this floppy. This means they are only available on those systems + * that map them to the floppy drive. Newer systems do not do this, and + * we should likely prohibit access to them (or disallow NODMA to be set). */ -#define FDC_YE_DATAPORT 6 +#define FDBCDR 0 /* And 1 */ +#define FD_YE_DATAPORT 6 /* Drive Data port */ #define FDI_DCHG 0x80 /* diskette has been changed */ /* requires drive and motor being selected */ @@ -337,6 +346,19 @@ return bus_space_read_1(fdc->ctlt, fdc->ctlh, fdc->ctl_off); } +/* + * Magic pseudo-DMA initialization for YE FDC. Sets count and + * direction. + */ +static void +fdbcdr_wr(struct fdc_data *fdc, int iswrite, uint16_t count) +{ + bus_space_write_1(fdc->portt, fdc->porth, fdc->port_off + FDBCDR, + (count - 1) & 0xff); + bus_space_write_1(fdc->portt, fdc->porth, fdc->port_off + FDBCDR + 1, + ((iswrite ? 0x80 : 0) | (((count - 1) >> 8) & 0x7f))); +} + static int fdc_err(struct fdc_data *fdc, const char *s) { @@ -634,18 +656,6 @@ } /* - * Magic pseudo-DMA initialization for YE FDC. Sets count and - * direction. - */ -#define SET_BCDR(fdc,wr,cnt,port) \ - do { \ - bus_space_write_1(fdc->portt, fdc->porth, fdc->port_off + port, \ - ((cnt)-1) & 0xff); \ - bus_space_write_1(fdc->portt, fdc->porth, fdc->port_off + port + 1, \ - ((wr ? 0x80 : 0) | ((((cnt)-1) >> 8) & 0x7f))); \ - } while (0) - -/* * fdc_pio(): perform programmed IO read/write for YE PCMCIA floppy. */ static void @@ -660,13 +670,13 @@ count = fdc->fd->fd_iosize; if (bp->bio_cmd == BIO_READ) { - SET_BCDR(fdc, 0, count, 0); + fdbcdr_wr(fdc, 0, count); bus_space_read_multi_1(fdc->portt, fdc->porth, fdc->port_off + - FDC_YE_DATAPORT, cptr, count); + FD_YE_DATAPORT, cptr, count); } else { bus_space_write_multi_1(fdc->portt, fdc->porth, fdc->port_off + - FDC_YE_DATAPORT, cptr, count); - SET_BCDR(fdc, 0, count, 0); + FD_YE_DATAPORT, cptr, count); + fdbcdr_wr(fdc, 0, count); /* needed? */ } } @@ -940,7 +950,7 @@ /* Do PIO if we have to */ if (fdc->flags & FDC_NODMA) { if (bp->bio_cmd & (BIO_READ|BIO_WRITE|BIO_FMT)) - SET_BCDR(fdc, 1, fd->fd_iosize, 0); + fdbcdr_wr(fdc, 1, fd->fd_iosize); if (bp->bio_cmd & (BIO_WRITE|BIO_FMT)) fdc_pio(fdc); } @@ -1484,39 +1494,30 @@ device_t dev; dev = fdc->fdc_dev; - if (fdc->fdc_intr) { + if (fdc->fdc_intr) BUS_TEARDOWN_INTR(device_get_parent(dev), dev, fdc->res_irq, fdc->fdc_intr); - fdc->fdc_intr = NULL; - } - if (fdc->res_irq != 0) { - bus_deactivate_resource(dev, SYS_RES_IRQ, fdc->rid_irq, - fdc->res_irq); + fdc->fdc_intr = NULL; + if (fdc->res_irq != NULL) bus_release_resource(dev, SYS_RES_IRQ, fdc->rid_irq, - fdc->res_irq); - fdc->res_irq = NULL; - } - if (fdc->res_ctl != 0) { - bus_deactivate_resource(dev, SYS_RES_IOPORT, fdc->rid_ctl, - fdc->res_ctl); + fdc->res_irq); + fdc->res_irq = NULL; + if (fdc->res_ctl != NULL) bus_release_resource(dev, SYS_RES_IOPORT, fdc->rid_ctl, - fdc->res_ctl); - fdc->res_ctl = NULL; - } - if (fdc->res_ioport != 0) { - bus_deactivate_resource(dev, SYS_RES_IOPORT, fdc->rid_ioport, - fdc->res_ioport); + fdc->res_ctl); + fdc->res_ctl = NULL; + if (fdc->res_sts != NULL) + bus_release_resource(dev, SYS_RES_IOPORT, fdc->rid_sts, + fdc->res_sts); + fdc->res_sts = NULL; + if (fdc->res_ioport != NULL) bus_release_resource(dev, SYS_RES_IOPORT, fdc->rid_ioport, - fdc->res_ioport); - fdc->res_ioport = NULL; - } - if (fdc->res_drq != 0) { - bus_deactivate_resource(dev, SYS_RES_DRQ, fdc->rid_drq, - fdc->res_drq); + fdc->res_ioport); + fdc->res_ioport = NULL; + if (fdc->res_drq != NULL) bus_release_resource(dev, SYS_RES_DRQ, fdc->rid_drq, - fdc->res_drq); - fdc->res_drq = NULL; - } + fdc->res_drq); + fdc->res_drq = NULL; } int @@ -1685,7 +1686,7 @@ device_printf(dev, "does not respond\n"); return (error); } - error = BUS_SETUP_INTR(device_get_parent(dev), dev, fdc->res_irq, + error = bus_setup_intr(dev, fdc->res_irq, INTR_TYPE_BIO | INTR_ENTROPY | INTR_FAST | INTR_MPSAFE, fdc_intr, fdc, &fdc->fdc_intr); if (error) { ==== //depot/projects/nsched/sys/dev/fdc/fdc_isa.c#4 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/fdc/fdc_isa.c,v 1.12 2004/08/31 20:37:10 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/fdc/fdc_isa.c,v 1.13 2004/09/14 07:06:49 imp Exp $"); #include <sys/param.h> #include <sys/bio.h> @@ -57,9 +57,8 @@ int fdc_isa_alloc_resources(device_t dev, struct fdc_data *fdc) { - int ispnp, nports; + int nports = 6; - ispnp = (fdc->flags & FDC_ISPNP) != 0; fdc->fdc_dev = dev; fdc->rid_ioport = 0; fdc->rid_irq = 0; @@ -69,99 +68,89 @@ /* * On standard ISA, we don't just use an 8 port range * (e.g. 0x3f0-0x3f7) since that covers an IDE control - * register at 0x3f6. + * register at 0x3f6. So, on older hardware, we use + * 0x3f0-0x3f5 and 0x3f7. However, some BIOSs omit the + * control port, while others start at 0x3f2. Of the latter, + * sometimes we have two resources, other times we have one. + * We have to deal with the following cases: + * + * 1: 0x3f0-0x3f5 # very rare + * 2: 0x3f0 # hints -> 0x3f0-0x3f5,0x3f7 + * 3: 0x3f0-0x3f5,0x3f7 # Most common + * 4: 0x3f2-0x3f5,0x3f7 # Second most common + * 5: 0x3f2-0x3f5 # implies 0x3f7 too. + * 6: 0x3f2-0x3f3,0x3f4-0x3f5,0x3f7 # becoming common + * 7: 0x3f2-0x3f3,0x3f4-0x3f5 # rare * - * Isn't PC hardware wonderful. + * The following code is generic for any value of 0x3fx :-) */ - nports = ispnp ? 1 : 6; /* - * Some ACPI BIOSen have _CRS objects for the floppy device that - * split the I/O port resource into several resources. We detect - * this case by checking if there are more than 2 IOPORT resources. - * If so, we use the resource with the smallest start address as - * the port RID and the largest start address as the control RID. + * First, allocated the main range of ports. In the best of + * worlds, this is 4 or 6 ports. In others, well, that's + * why this function is so complicated. */ - if (bus_get_resource_count(dev, SYS_RES_IOPORT, 2) != 0) { - u_long min_start, max_start, tmp; - int i; - - /* Find the min/max start addresses and their RIDs. */ - max_start = 0ul; - min_start = ~0ul; - for (i = 0; bus_get_resource_count(dev, SYS_RES_IOPORT, i) > 0; - i++) { - tmp = bus_get_resource_start(dev, SYS_RES_IOPORT, i); - KASSERT(tmp != 0, ("bogus resource")); - if (tmp < min_start) { - min_start = tmp; - fdc->rid_ioport = i; - } - if (tmp > max_start) { - max_start = tmp; - fdc->rid_ctl = i; - } - } - } - fdc->res_ioport = bus_alloc_resource(dev, SYS_RES_IOPORT, &fdc->rid_ioport, 0ul, ~0ul, nports, RF_ACTIVE); if (fdc->res_ioport == 0) { - device_printf(dev, "cannot reserve I/O port range (%d ports)\n", - nports); - return ENXIO; + device_printf(dev, "cannot allocate I/O port (%d ports)\n", + nports); + return (ENXIO); } fdc->portt = rman_get_bustag(fdc->res_ioport); fdc->porth = rman_get_bushandle(fdc->res_ioport); /* - * Some BIOSen report the device at 0x3f2-0x3f5,0x3f7 - * and some at 0x3f0-0x3f5,0x3f7. We detect the former - * by checking the size and adjust the port address - * accordingly. + * Handle cases 4-7 above */ - if (bus_get_resource_count(dev, SYS_RES_IOPORT, 0) == 4) - fdc->port_off = -2; + fdc->port_off = -(fdc->porth & 0x7); /* - * Register the control port range as rid 1 if it - * isn't there already. Most PnP BIOSen will have - * already done this but non-PnP configurations don't. - * - * And some (!!) report 0x3f2-0x3f5 and completely - * leave out the control register! It seems that some - * non-antique controller chips have a different - * method of programming the transfer speed which - * doesn't require the control register, but it's - * mighty bogus as the chip still responds to the - * address for the control register. + * Deal with case 6 and 7: FDSTS and FDSATA are in rid 1. */ - if (bus_get_resource_count(dev, SYS_RES_IOPORT, 1) == 0) { - u_long ctlstart; - /* Find the control port, usually 0x3f7 */ - ctlstart = rman_get_start(fdc->res_ioport) + fdc->port_off + 7; - bus_set_resource(dev, SYS_RES_IOPORT, 1, ctlstart, 1); + if (rman_get_size(fdc->res_ioport) == 2) { + fdc->rid_sts = 1; + fdc->res_sts = bus_alloc_resource_any(dev, SYS_RES_IOPORT, + &fdc->rid_sts, RF_ACTIVE); + if (fdc->res_sts == NULL) { + device_printf(dev, "Can't alloc rid 1"); + fdc_release_resources(fdc); + return (ENXIO); + } + fdc->rid_ctl++; + fdc->sts_off = -4; + fdc->stst = rman_get_bustag(fdc->res_sts); + fdc->stsh = rman_get_bushandle(fdc->res_sts); + } else { + fdc->res_sts = NULL; + fdc->sts_off = fdc->port_off; + fdc->stst = fdc->portt; + fdc->stsh = fdc->porth; } /* - * Now (finally!) allocate the control port. + * allocate the control port. For cases 1, 2, 5 and 7, we + * fake it from the ioports resource. XXX IS THIS THE RIGHT THING + * TO DO, OR SHOULD WE CREATE A NEW RID? (I think we need a new rid) */ fdc->res_ctl = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &fdc->rid_ctl, RF_ACTIVE); - if (fdc->res_ctl == 0) { - device_printf(dev, - "cannot reserve control I/O port range (control port)\n"); - return ENXIO; + if (fdc->res_ctl == NULL) { + fdc->ctl_off = 7 + fdc->port_off; + fdc->res_ctl = NULL; + fdc->ctlt = fdc->portt; + fdc->ctlh = fdc->porth; + } else { + fdc->ctl_off = 0; + fdc->ctlt = rman_get_bustag(fdc->res_ctl); + fdc->ctlh = rman_get_bushandle(fdc->res_ctl); } - fdc->ctlt = rman_get_bustag(fdc->res_ctl); - fdc->ctlh = rman_get_bushandle(fdc->res_ctl); - fdc->ctl_off = 0; fdc->res_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &fdc->rid_irq, - RF_ACTIVE | RF_SHAREABLE); + RF_ACTIVE | RF_SHAREABLE); if (fdc->res_irq == 0) { device_printf(dev, "cannot reserve interrupt line\n"); - return ENXIO; + return (ENXIO); } if ((fdc->flags & FDC_NODMA) == 0) { @@ -169,12 +158,13 @@ &fdc->rid_drq, RF_ACTIVE | RF_SHAREABLE); if (fdc->res_drq == 0) { device_printf(dev, "cannot reserve DMA request line\n"); + /* This is broken and doesn't work for ISA case */ fdc->flags |= FDC_NODMA; } else fdc->dmachan = rman_get_start(fdc->res_drq); } - return 0; + return (0); } static int ==== //depot/projects/nsched/sys/dev/fdc/fdc_pccard.c#3 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/fdc/fdc_pccard.c,v 1.9 2004/08/20 15:14:25 phk Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/fdc/fdc_pccard.c,v 1.10 2004/09/14 07:06:49 imp Exp $"); #include <sys/param.h> #include <sys/bio.h> @@ -65,6 +65,9 @@ } fdc->portt = rman_get_bustag(fdc->res_ioport); fdc->porth = rman_get_bushandle(fdc->res_ioport); + fdc->stst = fdc->portt; + fdc->stsh = fdc->porth; + fdc->sts_off = 0; fdc->ctlt = fdc->portt; fdc->ctlh = fdc->porth; fdc->ctl_off = 7; @@ -86,8 +89,7 @@ if ((pp = pccard_product_lookup(dev, fdc_pccard_products, sizeof(fdc_pccard_products[0]), NULL)) != NULL) { - if (pp->pp_name != NULL) - device_set_desc(dev, pp->pp_name); + device_set_desc(dev, "PC Card Floppy"); return (0); } return (ENXIO); @@ -98,8 +100,7 @@ { int error; struct fdc_data *fdc; - - return ENXIO; + device_t child; fdc = device_get_softc(dev); fdc->flags = FDC_NODMA; @@ -107,6 +108,11 @@ error = fdc_pccard_alloc_resources(dev, fdc); if (error == 0) error = fdc_attach(dev); + if (error == 0) { + child = fdc_add_child(dev, "fd", -1); + device_set_flags(child, 0x24); + error = bus_generic_attach(dev); + } if (error) fdc_release_resources(fdc); return (error); ==== //depot/projects/nsched/sys/dev/fdc/fdcvar.h#3 (text+ko) ==== @@ -25,7 +25,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/fdc/fdcvar.h,v 1.4 2004/08/20 15:14:25 phk Exp $ + * $FreeBSD: src/sys/dev/fdc/fdcvar.h,v 1.5 2004/09/14 07:06:49 imp Exp $ */ /* XXX should audit this file to see if additional copyrights needed */ @@ -57,14 +57,17 @@ int fdc_errs; /* number of logged errors */ struct bio_queue_head head; struct bio *bp; /* active buffer */ - struct resource *res_ioport, *res_ctl, *res_irq, *res_drq; - int rid_ioport, rid_ctl, rid_irq, rid_drq; - int port_off; + struct resource *res_ioport, *res_sts, *res_ctl, *res_irq, *res_drq; + int rid_ioport, rid_sts, rid_ctl, rid_irq, rid_drq; bus_space_tag_t portt; bus_space_handle_t porth; + bus_space_tag_t stst; + bus_space_handle_t stsh; bus_space_tag_t ctlt; bus_space_handle_t ctlh; + int port_off; int ctl_off; + int sts_off; void *fdc_intr; struct device *fdc_dev; struct mtx fdc_mtx; ==== //depot/projects/nsched/sys/dev/md/md.c#11 (text+ko) ==== @@ -6,7 +6,7 @@ * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp * ---------------------------------------------------------------------------- * - * $FreeBSD: src/sys/dev/md/md.c,v 1.130 2004/09/07 07:54:45 phk Exp $ + * $FreeBSD: src/sys/dev/md/md.c,v 1.134 2004/09/14 19:55:07 pjd Exp $ * */ @@ -828,6 +828,7 @@ } } if (error) { + uma_zdestroy(sc->uma); mddestroy(sc, NULL); return (error); } @@ -891,15 +892,16 @@ NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, mdio->md_file, td); error = vn_open(&nd, &flags, 0, -1); if (error) { + NDFREE(&nd, NDF_ONLY_PNBUF); if (error != EACCES && error != EPERM && error != EROFS) return (error); flags &= ~FWRITE; NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, mdio->md_file, td); error = vn_open(&nd, &flags, 0, -1); - if (error) - return (error); } NDFREE(&nd, NDF_ONLY_PNBUF); + if (error) + return (error); if (nd.ni_vp->v_type != VREG || (error = VOP_GETATTR(nd.ni_vp, &vattr, td->td_ucred, td))) { VOP_UNLOCK(nd.ni_vp, 0, td); @@ -938,11 +940,13 @@ else sc->nsect = vattr.va_size / sc->secsize; /* XXX: round up ? */ if (sc->nsect == 0) { + (void) vn_close(nd.ni_vp, flags, td->td_ucred, td); mddestroy(sc, td); return (EINVAL); } error = mdsetcred(sc, td->td_ucred); if (error) { + (void) vn_close(nd.ni_vp, flags, td->td_ucred, td); mddestroy(sc, td); return (error); } @@ -1053,6 +1057,8 @@ } error = mdsetcred(sc, td->td_ucred); if (error) { + vm_object_deallocate(sc->object); + sc->object = NULL; mddestroy(sc, td); return (error); } ==== //depot/projects/nsched/sys/dev/nge/if_nge.c#7 (text+ko) ==== @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/nge/if_nge.c,v 1.65 2004/08/13 23:22:53 rwatson Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/nge/if_nge.c,v 1.68 2004/09/15 03:39:17 alc Exp $"); /* * National Semiconductor DP83820/DP83821 gigabit ethernet driver @@ -149,20 +149,21 @@ static int nge_attach(device_t); static int nge_detach(device_t); -static int nge_alloc_jumbo_mem(struct nge_softc *); -static void nge_free_jumbo_mem(struct nge_softc *); -static void *nge_jalloc(struct nge_softc *); -static void nge_jfree(void *, void *); - static int nge_newbuf(struct nge_softc *, struct nge_desc *, struct mbuf *); static int nge_encap(struct nge_softc *, struct mbuf *, u_int32_t *); +#ifdef NGE_FIXUP_RX +static __inline void nge_fixup_rx (struct mbuf *); +#endif static void nge_rxeof(struct nge_softc *); static void nge_txeof(struct nge_softc *); static void nge_intr(void *); static void nge_tick(void *); +static void nge_tick_locked(struct nge_softc *); static void nge_start(struct ifnet *); +static void nge_start_locked(struct ifnet *); static int nge_ioctl(struct ifnet *, u_long, caddr_t); static void nge_init(void *); +static void nge_init_locked(struct nge_softc *); static void nge_stop(struct nge_softc *); static void nge_watchdog(struct ifnet *); static void nge_shutdown(device_t); @@ -441,9 +442,7 @@ struct nge_mii_frame *frame; { - int i, ack, s; - - s = splimp(); + int i, ack; /* * Set up frame for RX. @@ -518,8 +517,6 @@ SIO_SET(NGE_MEAR_MII_CLK); DELAY(1); - splx(s); - if (ack) return(1); return(0); @@ -534,9 +531,7 @@ struct nge_mii_frame *frame; { - int s; - s = splimp(); /* * Set up frame for TX. */ @@ -570,8 +565,6 @@ */ SIO_CLR(NGE_MEAR_MII_DIR); - splx(s); - return(0); } @@ -680,6 +673,7 @@ u_int32_t h = 0, i, filtsave; int bit, index; + NGE_LOCK_ASSERT(sc); ifp = &sc->arpcom.ac_if; if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) { @@ -791,21 +785,17 @@ nge_attach(dev) device_t dev; { - int s; u_char eaddr[ETHER_ADDR_LEN]; struct nge_softc *sc; struct ifnet *ifp; int unit, error = 0, rid; const char *sep = ""; - s = splimp(); - sc = device_get_softc(dev); unit = device_get_unit(dev); bzero(sc, sizeof(struct nge_softc)); - mtx_init(&sc->nge_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, - MTX_DEF | MTX_RECURSE); + NGE_LOCK_INIT(sc, device_get_nameunit(dev)); /* * Map control/status registers. */ @@ -835,16 +825,6 @@ goto fail; } - error = bus_setup_intr(dev, sc->nge_irq, INTR_TYPE_NET, - nge_intr, sc, &sc->nge_intrhand); - - if (error) { - bus_release_resource(dev, SYS_RES_IRQ, 0, sc->nge_irq); - bus_release_resource(dev, NGE_RES, NGE_RID, sc->nge_res); - printf("nge%d: couldn't set up irq\n", unit); - goto fail; - } - /* Reset the adapter. */ nge_reset(sc); @@ -863,7 +843,6 @@ if (sc->nge_ldata == NULL) { printf("nge%d: no memory for list buffers!\n", unit); - bus_teardown_intr(dev, sc->nge_irq, sc->nge_intrhand); bus_release_resource(dev, SYS_RES_IRQ, 0, sc->nge_irq); bus_release_resource(dev, NGE_RES, NGE_RID, sc->nge_res); error = ENXIO; @@ -871,25 +850,11 @@ } bzero(sc->nge_ldata, sizeof(struct nge_list_data)); - /* Try to allocate memory for jumbo buffers. */ - if (nge_alloc_jumbo_mem(sc)) { - printf("nge%d: jumbo buffer allocation failed\n", - sc->nge_unit); - contigfree(sc->nge_ldata, - sizeof(struct nge_list_data), M_DEVBUF); - bus_teardown_intr(dev, sc->nge_irq, sc->nge_intrhand); - bus_release_resource(dev, SYS_RES_IRQ, 0, sc->nge_irq); - bus_release_resource(dev, NGE_RES, NGE_RID, sc->nge_res); - error = ENXIO; - goto fail; - } - ifp = &sc->arpcom.ac_if; ifp->if_softc = sc; if_initname(ifp, device_get_name(dev), device_get_unit(dev)); ifp->if_mtu = ETHERMTU; - ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST | - IFF_NEEDSGIANT; + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = nge_ioctl; ifp->if_start = nge_start; ifp->if_watchdog = nge_watchdog; @@ -941,8 +906,6 @@ } else { printf("nge%d: MII without any PHY!\n", sc->nge_unit); - nge_free_jumbo_mem(sc); - bus_teardown_intr(dev, sc->nge_irq, sc->nge_intrhand); bus_release_resource(dev, SYS_RES_IRQ, 0, sc->nge_irq); bus_release_resource(dev, NGE_RES, NGE_RID, sc->nge_res); @@ -955,12 +918,23 @@ * Call MI attach routine. */ ether_ifattach(ifp, eaddr); - callout_handle_init(&sc->nge_stat_ch); + callout_init(&sc->nge_stat_ch, CALLOUT_MPSAFE); + + /* >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200409151857.i8FIv2Uh092908>