Date: Wed, 13 Nov 2002 10:23:00 -0800 (PST) From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 21038 for review Message-ID: <200211131823.gADIN0PM052839@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=21038 Change 21038 by jhb@jhb_laptop on 2002/11/13 10:22:11 IFC @21020. I had to use p4 integ w/o @xxxx because bluetooth wasn't getting deleted otherwise. Affected files ... .. //depot/projects/smpng/sys/bluetooth/Makefile#2 delete .. //depot/projects/smpng/sys/bluetooth/common/Makefile#2 delete .. //depot/projects/smpng/sys/bluetooth/common/ng_bluetooth.c#2 delete .. //depot/projects/smpng/sys/bluetooth/drivers/Makefile#2 delete .. //depot/projects/smpng/sys/bluetooth/drivers/bt3c/Makefile#2 delete .. //depot/projects/smpng/sys/bluetooth/drivers/bt3c/ng_bt3c.4#2 delete .. //depot/projects/smpng/sys/bluetooth/drivers/bt3c/ng_bt3c_firmware.h#2 delete .. //depot/projects/smpng/sys/bluetooth/drivers/bt3c/ng_bt3c_pccard.c#2 delete .. //depot/projects/smpng/sys/bluetooth/drivers/bt3c/ng_bt3c_var.h#2 delete .. //depot/projects/smpng/sys/bluetooth/drivers/h4/Makefile#2 delete .. //depot/projects/smpng/sys/bluetooth/drivers/h4/TODO#2 delete .. //depot/projects/smpng/sys/bluetooth/drivers/h4/ng_h4.4#2 delete .. //depot/projects/smpng/sys/bluetooth/drivers/h4/ng_h4.c#2 delete .. //depot/projects/smpng/sys/bluetooth/drivers/h4/ng_h4_prse.h#2 delete .. //depot/projects/smpng/sys/bluetooth/drivers/h4/ng_h4_var.h#2 delete .. //depot/projects/smpng/sys/bluetooth/drivers/ubt/Makefile#2 delete .. //depot/projects/smpng/sys/bluetooth/drivers/ubt/TODO#2 delete .. //depot/projects/smpng/sys/bluetooth/drivers/ubt/ng_ubt.4#2 delete .. //depot/projects/smpng/sys/bluetooth/drivers/ubt/ng_ubt.c#2 delete .. //depot/projects/smpng/sys/bluetooth/drivers/ubt/ng_ubt_var.h#2 delete .. //depot/projects/smpng/sys/bluetooth/hci/Makefile#2 delete .. //depot/projects/smpng/sys/bluetooth/hci/TODO#2 delete .. //depot/projects/smpng/sys/bluetooth/hci/ng_hci.4#2 delete .. //depot/projects/smpng/sys/bluetooth/hci/ng_hci_cmds.c#2 delete .. //depot/projects/smpng/sys/bluetooth/hci/ng_hci_cmds.h#2 delete .. //depot/projects/smpng/sys/bluetooth/hci/ng_hci_evnt.c#2 delete .. //depot/projects/smpng/sys/bluetooth/hci/ng_hci_evnt.h#2 delete .. //depot/projects/smpng/sys/bluetooth/hci/ng_hci_main.c#2 delete .. //depot/projects/smpng/sys/bluetooth/hci/ng_hci_misc.c#2 delete .. //depot/projects/smpng/sys/bluetooth/hci/ng_hci_misc.h#2 delete .. //depot/projects/smpng/sys/bluetooth/hci/ng_hci_prse.h#2 delete .. //depot/projects/smpng/sys/bluetooth/hci/ng_hci_ulpi.c#2 delete .. //depot/projects/smpng/sys/bluetooth/hci/ng_hci_ulpi.h#2 delete .. //depot/projects/smpng/sys/bluetooth/hci/ng_hci_var.h#2 delete .. //depot/projects/smpng/sys/bluetooth/include/ng_bluetooth.h#2 delete .. //depot/projects/smpng/sys/bluetooth/include/ng_bt3c.h#2 delete .. //depot/projects/smpng/sys/bluetooth/include/ng_btsocket.h#2 delete .. //depot/projects/smpng/sys/bluetooth/include/ng_btsocket_hci_raw.h#2 delete .. //depot/projects/smpng/sys/bluetooth/include/ng_btsocket_l2cap.h#2 delete .. //depot/projects/smpng/sys/bluetooth/include/ng_h4.h#2 delete .. //depot/projects/smpng/sys/bluetooth/include/ng_hci.h#2 delete .. //depot/projects/smpng/sys/bluetooth/include/ng_l2cap.h#2 delete .. //depot/projects/smpng/sys/bluetooth/include/ng_ubt.h#2 delete .. //depot/projects/smpng/sys/bluetooth/l2cap/Makefile#2 delete .. //depot/projects/smpng/sys/bluetooth/l2cap/TODO#2 delete .. //depot/projects/smpng/sys/bluetooth/l2cap/ng_l2cap.4#2 delete .. //depot/projects/smpng/sys/bluetooth/l2cap/ng_l2cap_cmds.c#2 delete .. //depot/projects/smpng/sys/bluetooth/l2cap/ng_l2cap_cmds.h#2 delete .. //depot/projects/smpng/sys/bluetooth/l2cap/ng_l2cap_evnt.c#2 delete .. //depot/projects/smpng/sys/bluetooth/l2cap/ng_l2cap_evnt.h#2 delete .. //depot/projects/smpng/sys/bluetooth/l2cap/ng_l2cap_llpi.c#2 delete .. //depot/projects/smpng/sys/bluetooth/l2cap/ng_l2cap_llpi.h#2 delete .. //depot/projects/smpng/sys/bluetooth/l2cap/ng_l2cap_main.c#2 delete .. //depot/projects/smpng/sys/bluetooth/l2cap/ng_l2cap_misc.c#2 delete .. //depot/projects/smpng/sys/bluetooth/l2cap/ng_l2cap_misc.h#2 delete .. //depot/projects/smpng/sys/bluetooth/l2cap/ng_l2cap_prse.h#2 delete .. //depot/projects/smpng/sys/bluetooth/l2cap/ng_l2cap_ulpi.c#2 delete .. //depot/projects/smpng/sys/bluetooth/l2cap/ng_l2cap_ulpi.h#2 delete .. //depot/projects/smpng/sys/bluetooth/l2cap/ng_l2cap_var.h#2 delete .. //depot/projects/smpng/sys/bluetooth/socket/Makefile#2 delete .. //depot/projects/smpng/sys/bluetooth/socket/TODO#2 delete .. //depot/projects/smpng/sys/bluetooth/socket/ng_btsocket.4#2 delete .. //depot/projects/smpng/sys/bluetooth/socket/ng_btsocket.c#2 delete .. //depot/projects/smpng/sys/bluetooth/socket/ng_btsocket_hci_raw.c#2 delete .. //depot/projects/smpng/sys/bluetooth/socket/ng_btsocket_l2cap.c#2 delete .. //depot/projects/smpng/sys/bluetooth/socket/ng_btsocket_l2cap_raw.c#2 delete .. //depot/projects/smpng/sys/conf/files#56 integrate .. //depot/projects/smpng/sys/conf/majors#18 integrate .. //depot/projects/smpng/sys/dev/aic7xxx/aic79xx.c#4 integrate .. //depot/projects/smpng/sys/dev/cardbus/cardbus_cis.c#9 integrate .. //depot/projects/smpng/sys/dev/firewire/firewire.c#4 integrate .. //depot/projects/smpng/sys/dev/firewire/firewirereg.h#2 integrate .. //depot/projects/smpng/sys/dev/firewire/fwdev.c#1 branch .. //depot/projects/smpng/sys/dev/firewire/fwmem.c#2 integrate .. //depot/projects/smpng/sys/dev/firewire/fwmem.h#2 integrate .. //depot/projects/smpng/sys/dev/firewire/fwohci.c#3 integrate .. //depot/projects/smpng/sys/dev/firewire/fwohci_pci.c#4 integrate .. //depot/projects/smpng/sys/kern/kern_mac.c#9 integrate .. //depot/projects/smpng/sys/modules/firewire/firewire/Makefile#3 integrate .. //depot/projects/smpng/sys/netinet/in_pcb.h#16 integrate .. //depot/projects/smpng/sys/security/mac_biba/mac_biba.c#9 integrate .. //depot/projects/smpng/sys/security/mac_mls/mac_mls.c#9 integrate .. //depot/projects/smpng/sys/security/mac_none/mac_none.c#6 integrate .. //depot/projects/smpng/sys/security/mac_test/mac_test.c#6 integrate .. //depot/projects/smpng/sys/sys/mac.h#8 integrate .. //depot/projects/smpng/sys/sys/mac_policy.h#8 integrate Differences ... ==== //depot/projects/smpng/sys/conf/files#56 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/files,v 1.733 2002/11/08 22:33:14 jhb Exp $ +# $FreeBSD: src/sys/conf/files,v 1.734 2002/11/12 15:22:18 simokawa Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -385,6 +385,7 @@ dev/firewire/fwohci.c optional firewire dev/firewire/fwohci_pci.c optional firewire pci dev/firewire/fwmem.c optional firewire +dev/firewire/fwdev.c optional firewire dev/firewire/if_fwe.c optional fwe dev/firewire/sbp.c optional sbp dev/fxp/if_fxp.c optional fxp ==== //depot/projects/smpng/sys/conf/majors#18 (text+ko) ==== @@ -1,4 +1,4 @@ -$FreeBSD: src/sys/conf/majors,v 1.148 2002/11/06 02:19:28 rwatson Exp $ +$FreeBSD: src/sys/conf/majors,v 1.150 2002/11/13 01:42:59 peter Exp $ Hopefully, this list will one day be obsoleted by DEVFS, but for now this is the current allocation of device major numbers. @@ -63,6 +63,7 @@ 43 vn vnode "disk" device (retired) 44 gp GPIB 45 scd Sony CDROM interface +46 - - 47 gsc Genius Scanner 48 cy Cyclades 49 ?? was ssc @@ -117,6 +118,7 @@ 98 loe Loopback pseudo-ethernet (sbabkin@dcn.att.com) 99 ct Cronyx/Tau serial adaptor 100 xrpu Xilinx Reprogrammable Processing Unit +101 was:dgm was: Digiboard PC/Xem in <= RELENG_4 102 fla M-Systems DiskOnChip(r) 103 streams SVR4 Streams emulation <newton@atdot.dotat.org> 104 xpt CAM Transport Layer Services @@ -184,8 +186,9 @@ 166 ciss Compaq SmartArray 5* adapter <msmith> 167 ufm USB Fm Radio 168 sab Siemens SAB82532 serial chip <jake> +168 XXX used by pst in RELENG_4 169 ofwd OpenFirmware disk <benno> -170 pst Promise SuperTrak +170 pst Promise SuperTrak (uses 168 in RELENG_4) 171 mide LSI MegaRAID IDE (control device) 172 mided LSI MegaRAID IDE (disk device) 173 devctl Devd control device <imp> @@ -200,5 +203,6 @@ 182 mdsio RS-485 driver for 8250-family UARTs <doconnor@gsoft.com.au> 200 ?? entries from 200-252 are reserved for local use 252 ?? entries from 200-252 are reserved for local use +253 was:MFS was: used by MFS in <= RELENG_4 254 internal Used internally by the kernel 255 bad choice -1 is 255 which has magic meanings internally ==== //depot/projects/smpng/sys/dev/aic7xxx/aic79xx.c#4 (text+ko) ==== @@ -39,7 +39,7 @@ * * $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#113 $ * - * $FreeBSD: src/sys/dev/aic7xxx/aic79xx.c,v 1.4 2002/09/26 22:53:59 gibbs Exp $ + * $FreeBSD: src/sys/dev/aic7xxx/aic79xx.c,v 1.5 2002/11/12 10:22:49 scottl Exp $ */ #ifdef __linux__ @@ -181,8 +181,8 @@ struct scb *scb); #endif -static bus_size_t ahd_sglist_size(struct ahd_softc *ahd); -static bus_size_t ahd_sglist_allocsize(struct ahd_softc *ahd); +static u_int ahd_sglist_size(struct ahd_softc *ahd); +static u_int ahd_sglist_allocsize(struct ahd_softc *ahd); static bus_dmamap_callback_t ahd_dmamap_cb; static void ahd_initialize_hscbs(struct ahd_softc *ahd); @@ -4096,7 +4096,7 @@ } #endif /**************************** Initialization **********************************/ -static bus_size_t +static u_int ahd_sglist_size(struct ahd_softc *ahd) { bus_size_t list_size; @@ -4113,7 +4113,7 @@ * OS will allocate full pages to us, so it doesn't make sense to request * less than a page. */ -static bus_size_t +static u_int ahd_sglist_allocsize(struct ahd_softc *ahd) { bus_size_t sg_list_increment; @@ -4203,9 +4203,9 @@ } #ifdef AHD_DEBUG if ((ahd_debug & AHD_SHOW_MEMORY) != 0) { - printf("%s: scb size = 0x%x, hscb size - 0x%x\n", - ahd_name(ahd), sizeof(struct scb), - sizeof(struct hardware_scb)); + printf("%s: scb size = 0x%x, hscb size = 0x%x\n", + ahd_name(ahd), (u_int)sizeof(struct scb), + (u_int)sizeof(struct hardware_scb)); } #endif return (ahd); ==== //depot/projects/smpng/sys/dev/cardbus/cardbus_cis.c#9 (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/cardbus/cardbus_cis.c,v 1.22 2002/11/06 20:40:29 jhb Exp $ + * $FreeBSD: src/sys/dev/cardbus/cardbus_cis.c,v 1.24 2002/11/12 09:45:59 scottl Exp $ */ /* @@ -265,51 +265,48 @@ DECODE_PROTOTYPE(bar) { + struct cardbus_devinfo *dinfo = device_get_ivars(child); + int type; + int reg; + u_int32_t bar; + if (len != 6) { printf("*** ERROR *** BAR length not 6 (%d)\n", len); return (EINVAL); + } + reg = *(u_int16_t*)tupledata; + len = *(u_int32_t*)(tupledata + 2); + if (reg & TPL_BAR_REG_AS) { + type = SYS_RES_IOPORT; } else { - struct cardbus_devinfo *dinfo = device_get_ivars(child); - int type; - int reg; - u_int32_t bar; + type = SYS_RES_MEMORY; + } + bar = (reg & TPL_BAR_REG_ASI_MASK) - 1; + if (bar < 0 || bar > 5 || + (type == SYS_RES_IOPORT && bar == 5)) { + device_printf(cbdev, "Invalid BAR number: %02x(%02x)\n", + reg, bar); + return (0); + } + bar = CARDBUS_BASE0_REG + bar * 4; + if (type == SYS_RES_MEMORY) { + if (bar & TPL_BAR_REG_PREFETCHABLE) + dinfo->mprefetchable |= BARBIT(bar); + if (bar & TPL_BAR_REG_BELOW1MB) + dinfo->mbelow1mb |= BARBIT(bar); + } else if (type == SYS_RES_IOPORT) { + if (bar & TPL_BAR_REG_BELOW1MB) + dinfo->ibelow1mb |= BARBIT(bar); + } + DEVPRINTF((cbdev, "Opening BAR: type=%s, bar=%02x, len=%04x%s%s\n", + (type == SYS_RES_MEMORY) ? "MEM" : "IO", bar, len, + (type == SYS_RES_MEMORY && dinfo->mprefetchable & BARBIT(bar)) ? + " (Prefetchable)" : "", type == SYS_RES_MEMORY ? + ((dinfo->mbelow1mb & BARBIT(bar)) ? " (Below 1Mb)" : "") : + (dinfo->ibelow1mb & BARBIT(bar)) ? " (Below 1Mb)" : "" )); - reg = *(u_int16_t*)tupledata; - len = *(u_int32_t*)(tupledata + 2); - if (reg & TPL_BAR_REG_AS) { - type = SYS_RES_IOPORT; - } else { - type = SYS_RES_MEMORY; - } - bar = (reg & TPL_BAR_REG_ASI_MASK) - 1; - if (bar < 0 || bar > 5 || - (type == SYS_RES_IOPORT && bar == 5)) { - device_printf(cbdev, "Invalid BAR number: %02x(%02x)\n", - reg, bar); - return (0); - } - bar = CARDBUS_BASE0_REG + bar * 4; - if (type == SYS_RES_MEMORY) { - if (bar & TPL_BAR_REG_PREFETCHABLE) - dinfo->mprefetchable |= BARBIT(bar); - if (bar & TPL_BAR_REG_BELOW1MB) - dinfo->mbelow1mb |= BARBIT(bar); - } else if (type == SYS_RES_IOPORT) { - if (bar & TPL_BAR_REG_BELOW1MB) - dinfo->ibelow1mb |= BARBIT(bar); - } - DEVPRINTF((cbdev, "Opening BAR: type=%s, bar=%02x, " - "len=%04x%s%s\n", - (type==SYS_RES_MEMORY)?"MEM":"IO", bar, len, - (type==SYS_RES_MEMORY&&dinfo->mprefetchable&BARBIT(bar))? - " (Prefetchable)":"", - type==SYS_RES_MEMORY? - ((dinfo->mbelow1mb&BARBIT(bar))?" (Below 1Mb)":"") - :(dinfo->ibelow1mb&BARBIT(bar))?" (Below 1Mb)":"" - )); + resource_list_add(&dinfo->pci.resources, type, bar, 0UL, ~0UL, len); - resource_list_add(&dinfo->pci.resources, type, bar, 0UL, ~0UL, len); - } return (0); } @@ -412,7 +409,7 @@ switch (CARDBUS_CIS_SPACE(*start)) { case CARDBUS_CIS_ASI_TUPLE: - /* CIS in tuple space need no initialization */ + /* CIS in PCI config space need no initialization */ return ((struct resource*)~0UL); case CARDBUS_CIS_ASI_BAR0: case CARDBUS_CIS_ASI_BAR1: @@ -421,11 +418,16 @@ case CARDBUS_CIS_ASI_BAR4: case CARDBUS_CIS_ASI_BAR5: *rid = CARDBUS_BASE0_REG + (CARDBUS_CIS_SPACE(*start) - 1) * 4; - pci_write_config(child, *rid, 0xffffffff, 4); break; case CARDBUS_CIS_ASI_ROM: *rid = CARDBUS_ROM_REG; +#if 0 + /* + * This mask doesn't contain the bit that actually enables + * the Option ROM. + */ pci_write_config(child, *rid, CARDBUS_ROM_ADDRMASK, 4); +#endif break; default: device_printf(cbdev, "Unable to read CIS: Unknown space: %d\n", @@ -434,12 +436,20 @@ } /* figure out how much space we need */ + pci_write_config(child, *rid, 0xffffffff, 4); testval = pci_read_config(child, *rid, 4); - if (testval & 1) { + + /* + * This bit has a different meaning depending if we are dealing + * with a normal BAR or an Option ROM BAR. + */ + if (((testval & 0x1) == 0x1) && (*rid != CARDBUS_ROM_REG)) { device_printf(cbdev, "CIS Space is IO, expecting memory.\n"); return (NULL); } + size = CARDBUS_MAPREG_MEM_SIZE(testval); + /* XXX Is this some kind of hack? */ if (size < 4096) size = 4096; /* allocate the memory space to read CIS */ @@ -460,57 +470,73 @@ if (CARDBUS_CIS_SPACE(*start) == CARDBUS_CIS_ASI_ROM) { bus_space_tag_t bt; bus_space_handle_t bh; - int imagenum; u_int32_t imagesize; - int mystart = 0; + u_int32_t imagebase = 0; + u_int32_t pcidata; + u_int16_t romsig; int romnum = 0; - int dataptr; + int imagenum; bt = rman_get_bustag(res); bh = rman_get_bushandle(res); imagenum = CARDBUS_CIS_ASI_ROM_IMAGE(*start); for (romnum = 0;; romnum++) { - if (bus_space_read_2(bt, bh, - mystart+CARDBUS_EXROM_SIGNATURE) != 0xaa55) { + romsig = bus_space_read_2(bt, bh, + imagebase + CARDBUS_EXROM_SIGNATURE); + if (romsig != 0xaa55) { device_printf(cbdev, "Bad header in rom %d: " - "[%x] %04x\n", romnum, mystart + - CARDBUS_EXROM_SIGNATURE, - bus_space_read_2(bt, bh, - mystart+CARDBUS_EXROM_SIGNATURE)); + "[%x] %04x\n", romnum, imagebase + + CARDBUS_EXROM_SIGNATURE, romsig); bus_release_resource(cbdev, SYS_RES_MEMORY, *rid, res); *rid = 0; return (NULL); } - dataptr = mystart + bus_space_read_2(bt, bh, - mystart + CARDBUS_EXROM_DATA_PTR); + + /* + * If this was the Option ROM image that we were + * looking for, then we are done. + */ + if (romnum == imagenum) + break; + + /* Find out where the next Option ROM image is */ + pcidata = imagebase + bus_space_read_2(bt, bh, + imagebase + CARDBUS_EXROM_DATA_PTR); imagesize = bus_space_read_2(bt, bh, - dataptr + CARDBUS_EXROM_DATA_IMAGE_LENGTH); + pcidata + CARDBUS_EXROM_DATA_IMAGE_LENGTH); if (imagesize == 0) { /* * XXX some ROMs seem to have this as zero, * can we assume this means 1 block? */ + device_printf(cbdev, "Warning, size of Option " + "ROM image %d is 0 bytes, assuming 512 " + "bytes.\n", romnum); imagesize = 1; } + + /* Image size is in 512 byte units */ imagesize <<= 9; - if (romnum == imagenum) - break; - if ((bus_space_read_1(bt, bh, mystart + - CARDBUS_EXROM_DATA_INDICATOR) & 0x80) == 0) { - device_printf(cbdev, "Cannot read CIS: " - "Not enough images of rom\n"); + if ((bus_space_read_1(bt, bh, pcidata + + CARDBUS_EXROM_DATA_INDICATOR) & 0x80) != 0) { + device_printf(cbdev, "Cannot find CIS in " + "Option ROM\n"); + bus_release_resource(cbdev, SYS_RES_MEMORY, + *rid, res); + *rid = 0; return (NULL); } - mystart += imagesize; + imagebase += imagesize; } - *start = mystart + CARDBUS_CIS_ADDR(*start); + *start = imagebase + CARDBUS_CIS_ADDR(*start); } else { - *start = CARDBUS_CIS_SPACE(*start); + *start = CARDBUS_CIS_ADDR(*start); } + return (res); } @@ -553,7 +579,8 @@ bzero(tupledata, MAXTUPLESIZE); expect_linktarget = TRUE; - start = pci_read_config(child, CARDBUS_CIS_REG, 4); + if ((start = pci_read_config(child, CARDBUS_CIS_REG, 4)) == 0) + return (ENXIO); off = 0; res = cardbus_read_tuple_init(cbdev, child, &start, &rid); if (res == NULL) ==== //depot/projects/smpng/sys/dev/firewire/firewire.c#4 (text+ko) ==== @@ -30,7 +30,7 @@ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/firewire/firewire.c,v 1.4 2002/11/07 02:13:40 simokawa Exp $ + * $FreeBSD: src/sys/dev/firewire/firewire.c,v 1.8 2002/11/12 17:16:20 simokawa Exp $ * */ @@ -46,30 +46,14 @@ #include <sys/conf.h> #include <sys/uio.h> #include <sys/sysctl.h> -#include <sys/poll.h> #include <machine/cpufunc.h> /* for rdtsc proto for clock.h below */ #include <machine/clock.h> -#include <pci/pcivar.h> -#include <pci/pcireg.h> -#include <vm/vm.h> -#include <vm/pmap.h> /* for vtophys proto */ -#include <vm/vm_extern.h> - #include <sys/bus.h> /* used by smbus and newbus */ -#include <machine/bus.h> /* used by newbus */ -#include <sys/rman.h> /* used by newbus */ -#include <machine/resource.h> /* used by newbus */ - -#include <sys/signal.h> -#include <sys/mman.h> -#include <sys/ioccom.h> - #include <dev/firewire/firewire.h> #include <dev/firewire/firewirereg.h> -#include <dev/firewire/fwmem.h> #include <dev/firewire/iec13213.h> #include <dev/firewire/iec68113.h> @@ -78,24 +62,13 @@ SYSCTL_INT(_debug, OID_AUTO, firewire_debug, CTLFLAG_RW, &firewire_debug, 0, "Firewire driver debug flag"); -#define CDEV_MAJOR 127 #define FW_MAXASYRTY 4 #define FW_MAXDEVRCNT 4 -#define FWNODE_INVAL 0xffff #define XFER_TIMEOUT 0 -static d_open_t fw_open; -static d_close_t fw_close; -static d_ioctl_t fw_ioctl; -static d_poll_t fw_poll; -static d_read_t fw_read; /* for Isochronous packet */ -static d_write_t fw_write; -static d_mmap_t fw_mmap; - devclass_t firewire_devclass; - static int firewire_match __P((device_t)); static int firewire_attach __P((device_t)); static int firewire_detach __P((device_t)); @@ -103,10 +76,8 @@ static int firewire_shutdown __P((device_t)); #endif static device_t firewire_add_child __P((device_t, int, const char *, int)); -static struct fw_bind *fw_bindlookup __P((struct firewire_comm *, u_int32_t, u_int32_t)); static void fw_try_bmr __P((void *)); static void fw_try_bmr_callback __P((struct fw_xfer *)); -static u_int16_t fw_noderesolve __P((struct firewire_comm *, struct fw_eui64)); static void fw_asystart __P((struct fw_xfer *)); static int fw_get_tlabel __P((struct firewire_comm *, struct fw_xfer *)); static void fw_bus_probe __P((struct firewire_comm *)); @@ -138,442 +109,16 @@ #define MAX_GAPHOP 16 u_int gap_cnt[] = {1, 1, 4, 6, 9, 12, 14, 17, 20, 23, 25, 28, 31, 33, 36, 39, 42}; -/* - * The probe routine. - */ -struct cdevsw firewire_cdevsw = -{ - fw_open, fw_close, fw_read, fw_write, fw_ioctl, - fw_poll, fw_mmap, nostrategy, "fw", CDEV_MAJOR, nodump, nopsize, D_MEM -}; + +extern struct cdevsw firewire_cdevsw; + static driver_t firewire_driver = { "firewire", firewire_methods, sizeof(struct firewire_softc), }; -static int -fw_open (dev_t dev, int flags, int fmt, fw_proc *td) -{ - struct firewire_softc *sc; - int unit = DEV2UNIT(dev); - int sub = DEV2DMACH(dev); - - int err = 0; - - if (DEV_FWMEM(dev)) - return fwmem_open(dev, flags, fmt, td); - - sc = devclass_get_softc(firewire_devclass, unit); - if(sc->fc->ir[sub]->flag & FWXFERQ_OPEN){ - err = EBUSY; - return err; - } - if(sc->fc->it[sub]->flag & FWXFERQ_OPEN){ - err = EBUSY; - return err; - } - if(sc->fc->ir[sub]->flag & FWXFERQ_MODEMASK){ - err = EBUSY; - return err; - } -/* Default is per packet mode */ - sc->fc->ir[sub]->flag |= FWXFERQ_OPEN; - sc->fc->it[sub]->flag |= FWXFERQ_OPEN; - sc->fc->ir[sub]->flag |= FWXFERQ_PACKET; - return err; -} -static int -fw_close (dev_t dev, int flags, int fmt, fw_proc *td) -{ - struct firewire_softc *sc; - int unit = DEV2UNIT(dev); - int sub = DEV2DMACH(dev); - struct fw_xfer *xfer; - struct fw_dvbuf *dvbuf; - struct fw_bind *fwb; - int err = 0; - - if (DEV_FWMEM(dev)) - return fwmem_close(dev, flags, fmt, td); - - sc = devclass_get_softc(firewire_devclass, unit); - if(!(sc->fc->ir[sub]->flag & FWXFERQ_OPEN)){ - err = EINVAL; - return err; - } - sc->fc->ir[sub]->flag &= ~FWXFERQ_OPEN; - if(!(sc->fc->it[sub]->flag & FWXFERQ_OPEN)){ - err = EINVAL; - return err; - } - sc->fc->it[sub]->flag &= ~FWXFERQ_OPEN; - - if(sc->fc->ir[sub]->flag & FWXFERQ_RUNNING){ - sc->fc->irx_disable(sc->fc, sub); - } - if(sc->fc->it[sub]->flag & FWXFERQ_RUNNING){ - sc->fc->it[sub]->flag &= ~FWXFERQ_RUNNING; - sc->fc->itx_disable(sc->fc, sub); - } - if(sc->fc->it[sub]->flag & FWXFERQ_DV){ - if((dvbuf = sc->fc->it[sub]->dvproc) != NULL){ - free(dvbuf->buf, M_DEVBUF); - sc->fc->it[sub]->dvproc = NULL; - } - if((dvbuf = sc->fc->it[sub]->dvdma) != NULL){ - free(dvbuf->buf, M_DEVBUF); - sc->fc->it[sub]->dvdma = NULL; - } - while((dvbuf = STAILQ_FIRST(&sc->fc->it[sub]->dvvalid)) != NULL){ - STAILQ_REMOVE_HEAD(&sc->fc->it[sub]->dvvalid, link); - free(dvbuf->buf, M_DEVBUF); - } - while((dvbuf = STAILQ_FIRST(&sc->fc->it[sub]->dvfree)) != NULL){ - STAILQ_REMOVE_HEAD(&sc->fc->it[sub]->dvfree, link); - free(dvbuf->buf, M_DEVBUF); - } - free(sc->fc->it[sub]->dvbuf, M_DEVBUF); - sc->fc->it[sub]->dvbuf = NULL; - } - if(sc->fc->ir[sub]->flag & FWXFERQ_EXTBUF){ - free(sc->fc->ir[sub]->buf, M_DEVBUF); - sc->fc->ir[sub]->buf = NULL; - free(sc->fc->ir[sub]->bulkxfer, M_DEVBUF); - sc->fc->ir[sub]->bulkxfer = NULL; - sc->fc->ir[sub]->flag &= ~FWXFERQ_EXTBUF; - sc->fc->ir[sub]->psize = FWPMAX_S400; - sc->fc->ir[sub]->maxq = FWMAXQUEUE; - } - if(sc->fc->it[sub]->flag & FWXFERQ_EXTBUF){ - free(sc->fc->it[sub]->buf, M_DEVBUF); - sc->fc->it[sub]->buf = NULL; - free(sc->fc->it[sub]->bulkxfer, M_DEVBUF); - sc->fc->it[sub]->bulkxfer = NULL; - sc->fc->it[sub]->dvbuf = NULL; - sc->fc->it[sub]->flag &= ~FWXFERQ_EXTBUF; - sc->fc->it[sub]->psize = FWPMAX_S400; - sc->fc->it[sub]->maxq = FWMAXQUEUE; - } - for(xfer = STAILQ_FIRST(&sc->fc->ir[sub]->q); - xfer != NULL; xfer = STAILQ_FIRST(&sc->fc->ir[sub]->q)){ - sc->fc->ir[sub]->queued--; - STAILQ_REMOVE_HEAD(&sc->fc->ir[sub]->q, link); - - xfer->resp = 0; - switch(xfer->act_type){ - case FWACT_XFER: - fw_xfer_done(xfer); - break; - default: - break; - } - fw_xfer_free(xfer); - } - for(fwb = STAILQ_FIRST(&sc->fc->ir[sub]->binds); fwb != NULL; - fwb = STAILQ_FIRST(&sc->fc->ir[sub]->binds)){ - STAILQ_REMOVE(&sc->fc->binds, fwb, fw_bind, fclist); - STAILQ_REMOVE_HEAD(&sc->fc->ir[sub]->binds, chlist); - free(fwb, M_DEVBUF); - } - sc->fc->ir[sub]->flag &= ~FWXFERQ_MODEMASK; - sc->fc->it[sub]->flag &= ~FWXFERQ_MODEMASK; - return err; -} /* - * read request. - */ -static int -fw_read (dev_t dev, struct uio *uio, int ioflag) -{ - struct firewire_softc *sc; - struct fw_xferq *ir; - struct fw_xfer *xfer; - int err = 0, s, slept = 0; - int unit = DEV2UNIT(dev); - int sub = DEV2DMACH(dev); - struct fw_pkt *fp; - - if (DEV_FWMEM(dev)) - return fwmem_read(dev, uio, ioflag); - - sc = devclass_get_softc(firewire_devclass, unit); - - ir = sc->fc->ir[sub]; - - if(ir->flag & FWXFERQ_PACKET){ - ir->stproc = NULL; - } -readloop: - xfer = STAILQ_FIRST(&ir->q); - if(!(ir->flag & FWXFERQ_PACKET) && ir->stproc == NULL){ - ir->stproc = STAILQ_FIRST(&ir->stvalid); - if(ir->stproc != NULL){ - s = splfw(); - STAILQ_REMOVE_HEAD(&ir->stvalid, link); - splx(s); - ir->queued = 0; - } - } - - if(xfer == NULL && ir->stproc == NULL){ - if(slept == 0){ - slept = 1; - if(!(ir->flag & FWXFERQ_RUNNING) - && (ir->flag & FWXFERQ_PACKET)){ - err = sc->fc->irx_enable(sc->fc, sub); - } - if(err){ - return err; - } - ir->flag |= FWXFERQ_WAKEUP; - err = tsleep((caddr_t)ir, FWPRI, "fw_read", hz); - if(err){ - ir->flag &= ~FWXFERQ_WAKEUP; - return err; - } - goto readloop; - }else{ - err = EIO; - return err; - } - }else if(xfer != NULL){ - s = splfw(); - ir->queued --; - STAILQ_REMOVE_HEAD(&ir->q, link); - splx(s); - fp = (struct fw_pkt *)(xfer->recv.buf + xfer->recv.off); - if(sc->fc->irx_post != NULL) - sc->fc->irx_post(sc->fc, fp->mode.ld); - err = uiomove(xfer->recv.buf + xfer->recv.off, xfer->recv.len, uio); - fw_xfer_free( xfer); - }else if(ir->stproc != NULL){ - fp = (struct fw_pkt *)(ir->stproc->buf + ir->queued * ir->psize); - if(sc->fc->irx_post != NULL) - sc->fc->irx_post(sc->fc, fp->mode.ld); - if(ntohs(fp->mode.stream.len) == 0){ - err = EIO; - return err; - } - err = uiomove((caddr_t)fp, ntohs(fp->mode.stream.len) + sizeof(u_int32_t), uio); - fp->mode.stream.len = 0; - ir->queued ++; - if(ir->queued >= ir->bnpacket){ - s = splfw(); - ir->stproc->flag = 0; - STAILQ_INSERT_TAIL(&ir->stfree, ir->stproc, link); - splx(s); - ir->stproc = NULL; - } - } -#if 0 - if(STAILQ_FIRST(&ir->q) == NULL && - (ir->flag & FWXFERQ_RUNNING) && (ir->flag & FWXFERQ_PACKET)){ - err = sc->fc->irx_enable(sc->fc, sub); - } -#endif -#if 0 - if(STAILQ_FIRST(&ir->stvalid) == NULL && - (ir->flag & FWXFERQ_RUNNING) && !(ir->flag & FWXFERQ_PACKET)){ - err = sc->fc->irx_enable(sc->fc, sub); - } -#endif - return err; -} -static int -fw_write (dev_t dev, struct uio *uio, int ioflag) -{ - int err = 0; - struct firewire_softc *sc; - int unit = DEV2UNIT(dev); - int sub = DEV2DMACH(dev); - int tl, s, slept = 0; - struct fw_pkt *fp; - struct fw_xfer *xfer; - struct fw_xferq *xferq; - struct firewire_comm *fc; - struct fw_xferq *it; - - if (DEV_FWMEM(dev)) - return fwmem_write(dev, uio, ioflag); - - sc = devclass_get_softc(firewire_devclass, unit); - fc = sc->fc; - it = sc->fc->it[sub]; - - fp = (struct fw_pkt *)uio->uio_iov->iov_base; - switch(fp->mode.common.tcode){ - case FWTCODE_RREQQ: - case FWTCODE_RREQB: - case FWTCODE_LREQ: - err = EINVAL; - return err; - case FWTCODE_WREQQ: - case FWTCODE_WREQB: - xferq = fc->atq; - break; - case FWTCODE_STREAM: - if(it->flag & FWXFERQ_PACKET){ - xferq = fc->atq; - }else{ - xferq = NULL; - } - break; - case FWTCODE_WRES: - case FWTCODE_RRESQ: - case FWTCODE_RRESB: - case FWTCODE_LRES: - xferq = fc->ats; - break; - default: - err = EINVAL; - return err; - } - /* Discard unsent buffered stream packet, when sending Asyrequrst */ - if(xferq != NULL && it->stproc != NULL){ - s = splfw(); - it->stproc->flag = 0; - STAILQ_INSERT_TAIL(&it->stfree, it->stproc, link); - splx(s); - it->stproc = NULL; - } - if(xferq == NULL && !(it->flag & FWXFERQ_DV)){ -isoloop: - if(it->stproc == NULL){ - it->stproc = STAILQ_FIRST(&it->stfree); - if(it->stproc != NULL){ - s = splfw(); - STAILQ_REMOVE_HEAD(&it->stfree, link); - splx(s); - it->queued = 0; - }else if(slept == 0){ - slept = 1; - err = sc->fc->itx_enable(sc->fc, sub); - if(err){ - return err; - } - err = tsleep((caddr_t)it, FWPRI, "fw_write", hz); - if(err){ - return err; - } - goto isoloop; - }else{ - err = EIO; - return err; - } - } - fp = (struct fw_pkt *)(it->stproc->buf + it->queued * it->psize); - fp->mode.stream.len = htons(uio->uio_resid - sizeof(u_int32_t)); - err = uiomove(it->stproc->buf + it->queued * it->psize, - uio->uio_resid, uio); - it->queued ++; - if(it->queued >= it->btpacket){ - s = splfw(); - STAILQ_INSERT_TAIL(&it->stvalid, it->stproc, link); - splx(s); - it->stproc = NULL; - fw_tbuf_update(sc->fc, sub, 0); - err = sc->fc->itx_enable(sc->fc, sub); - } - return err; - } if(xferq == NULL && it->flag & FWXFERQ_DV){ -dvloop: - if(it->dvproc == NULL){ - it->dvproc = STAILQ_FIRST(&it->dvfree); - if(it->dvproc != NULL){ - s = splfw(); - STAILQ_REMOVE_HEAD(&it->dvfree, link); - splx(s); - it->dvptr = 0; - }else if(slept == 0){ - slept = 1; - err = sc->fc->itx_enable(sc->fc, sub); - if(err){ - return err; - } - err = tsleep((caddr_t)it, FWPRI, "fw_write", hz); - if(err){ - return err; - } - goto dvloop; - }else{ - err = EIO; - return err; - } - } - fp = (struct fw_pkt *)(it->dvproc->buf + it->queued * it->psize); - fp->mode.stream.len = htons(uio->uio_resid - sizeof(u_int32_t)); - err = uiomove(it->dvproc->buf + it->dvptr, - uio->uio_resid, uio); - it->dvptr += it->psize; - if(err){ - return err; - } - if(it->dvptr >= it->psize * it->dvpacket){ - s = splfw(); - STAILQ_INSERT_TAIL(&it->dvvalid, it->dvproc, link); - splx(s); - it->dvproc = NULL; - err = fw_tbuf_update(sc->fc, sub, 0); - if(err){ - return err; - } - err = sc->fc->itx_enable(sc->fc, sub); - } - return err; - } - if(xferq != NULL){ - xfer = fw_xfer_alloc(); - if(xfer == NULL){ - err = ENOMEM; - return err; - } - xfer->send.buf = malloc(uio->uio_resid, M_DEVBUF, M_NOWAIT); - if(xfer->send.buf == NULL){ - fw_xfer_free( xfer); - err = ENOBUFS; - return err; - } - xfer->dst = ntohs(fp->mode.hdr.dst); - - switch(fp->mode.common.tcode){ - case FWTCODE_WREQQ: - case FWTCODE_WREQB: - if((tl = fw_get_tlabel(fc, xfer)) == -1 ){ - fw_xfer_free( xfer); - err = EAGAIN; - return err; - } - fp->mode.hdr.tlrt = tl << 2; - default: - break; - } - - xfer->tl = fp->mode.hdr.tlrt >> 2; - xfer->send.len = uio->uio_resid; - xfer->send.off = 0; - xfer->tcode = fp->mode.common.tcode; - xfer->spd = 0;/* XXX: how to setup it */ - xfer->fc = fc; - xfer->q = xferq; - xfer->act_type = FWACT_XFER; - xfer->act.hand = fw_asy_callback; - xfer->retry_req = fw_asybusy; - - err = uiomove(xfer->send.buf, uio->uio_resid, uio); - if(err){ - return err; - } - fw_asystart(xfer); - err = tsleep((caddr_t)xfer, FWPRI, "fw_write", hz); - if(xfer->resp == EBUSY) - return EBUSY; - fw_xfer_free( xfer); - return err; - } - return EINVAL; -} -/* * transmitter buffer update. */ int @@ -752,409 +297,12 @@ ir->stdma2 = bulkxfer2; return err; } -/* - * ioctl support. - */ -int -fw_ioctl (dev_t dev, u_long cmd, caddr_t data, int flag, fw_proc *td) -{ - struct firewire_softc *sc; - int unit = DEV2UNIT(dev); >>> TRUNCATED FOR MAIL (1000 lines) <<< To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200211131823.gADIN0PM052839>