Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 11 Oct 2009 20:46:56 +0000 (UTC)
From:      Lawrence Stewart <lstewart@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r197970 - in projects/tcp_ffcaia2008_head/sys: dev/usb dev/usb/controller dev/usb/input dev/usb/serial netinet/ipfw
Message-ID:  <200910112046.n9BKkuvX030117@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: lstewart
Date: Sun Oct 11 20:46:56 2009
New Revision: 197970
URL: http://svn.freebsd.org/changeset/base/197970

Log:
  Fix mismerged files.
  
  Sponsored by:	FreeBSD Foundation

Modified:
  projects/tcp_ffcaia2008_head/sys/dev/usb/controller/at91dci.c
  projects/tcp_ffcaia2008_head/sys/dev/usb/controller/atmegadci.c
  projects/tcp_ffcaia2008_head/sys/dev/usb/controller/ehci.c
  projects/tcp_ffcaia2008_head/sys/dev/usb/controller/ehci_pci.c
  projects/tcp_ffcaia2008_head/sys/dev/usb/controller/musb_otg.c
  projects/tcp_ffcaia2008_head/sys/dev/usb/controller/ohci.c
  projects/tcp_ffcaia2008_head/sys/dev/usb/controller/ohci_pci.c
  projects/tcp_ffcaia2008_head/sys/dev/usb/controller/uhci.c
  projects/tcp_ffcaia2008_head/sys/dev/usb/controller/uhci_pci.c
  projects/tcp_ffcaia2008_head/sys/dev/usb/controller/uss820dci.c
  projects/tcp_ffcaia2008_head/sys/dev/usb/input/ums.c
  projects/tcp_ffcaia2008_head/sys/dev/usb/serial/u3g.c
  projects/tcp_ffcaia2008_head/sys/dev/usb/serial/ulpt.c
  projects/tcp_ffcaia2008_head/sys/dev/usb/usb_compat_linux.h
  projects/tcp_ffcaia2008_head/sys/dev/usb/usb_controller.h
  projects/tcp_ffcaia2008_head/sys/dev/usb/usb_dev.h
  projects/tcp_ffcaia2008_head/sys/dev/usb/usb_device.c
  projects/tcp_ffcaia2008_head/sys/dev/usb/usb_hid.c
  projects/tcp_ffcaia2008_head/sys/dev/usb/usb_parse.c
  projects/tcp_ffcaia2008_head/sys/dev/usb/usb_request.c
  projects/tcp_ffcaia2008_head/sys/dev/usb/usbdevs
  projects/tcp_ffcaia2008_head/sys/netinet/ipfw/ip_fw_nat.c
  projects/tcp_ffcaia2008_head/sys/netinet/ipfw/ip_fw_pfil.c

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/controller/at91dci.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/controller/at91dci.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/controller/at91dci.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -2326,4 +2326,5 @@ struct usb_bus_methods at91dci_bus_metho
 	.set_stall = &at91dci_set_stall,
 	.clear_stall = &at91dci_clear_stall,
 	.roothub_exec = &at91dci_roothub_exec,
+	.xfer_poll = &at91dci_do_poll,
 };

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/controller/atmegadci.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/controller/atmegadci.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/controller/atmegadci.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -2143,4 +2143,5 @@ struct usb_bus_methods atmegadci_bus_met
 	.set_stall = &atmegadci_set_stall,
 	.clear_stall = &atmegadci_clear_stall,
 	.roothub_exec = &atmegadci_roothub_exec,
+	.xfer_poll = &atmegadci_do_poll,
 };

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/controller/ehci.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/controller/ehci.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/controller/ehci.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -3860,4 +3860,5 @@ struct usb_bus_methods ehci_bus_methods 
 	.device_suspend = ehci_device_suspend,
 	.set_hw_power = ehci_set_hw_power,
 	.roothub_exec = ehci_roothub_exec,
+	.xfer_poll = ehci_do_poll,
 };

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/controller/ehci_pci.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/controller/ehci_pci.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/controller/ehci_pci.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -206,6 +206,8 @@ ehci_pci_match(device_t self)
 		return "NVIDIA nForce3 250 USB 2.0 controller";
 	case 0x005b10de:
 		return "NVIDIA nForce4 USB 2.0 controller";
+	case 0x03f210de:
+		return "NVIDIA nForce MCP61 USB 2.0 controller";
 
 	case 0x15621131:
 		return "Philips ISP156x USB 2.0 controller";

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/controller/musb_otg.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/controller/musb_otg.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/controller/musb_otg.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -2736,4 +2736,5 @@ struct usb_bus_methods musbotg_bus_metho
 	.set_stall = &musbotg_set_stall,
 	.clear_stall = &musbotg_clear_stall,
 	.roothub_exec = &musbotg_roothub_exec,
+	.xfer_poll = &musbotg_do_poll,
 };

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/controller/ohci.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/controller/ohci.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/controller/ohci.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -2756,4 +2756,5 @@ struct usb_bus_methods ohci_bus_methods 
 	.device_suspend = ohci_device_suspend,
 	.set_hw_power = ohci_set_hw_power,
 	.roothub_exec = ohci_roothub_exec,
+	.xfer_poll = ohci_do_poll,
 };

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/controller/ohci_pci.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/controller/ohci_pci.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/controller/ohci_pci.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -172,6 +172,9 @@ ohci_pci_match(device_t self)
 	case 0x00d710de:
 		return ("nVidia nForce3 USB Controller");
 
+	case 0x03f110de:
+		return ("nVidia nForce MCP61 USB Controller");
+
 	case 0x70011039:
 		return ("SiS 5571 USB controller");
 

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/controller/uhci.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/controller/uhci.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/controller/uhci.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -3251,4 +3251,5 @@ struct usb_bus_methods uhci_bus_methods 
 	.device_suspend = uhci_device_suspend,
 	.set_hw_power = uhci_set_hw_power,
 	.roothub_exec = uhci_roothub_exec,
+	.xfer_poll = uhci_do_poll,
 };

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/controller/uhci_pci.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/controller/uhci_pci.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/controller/uhci_pci.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -200,6 +200,15 @@ uhci_pci_match(device_t self)
 	case 0x265b8086:
 		return ("Intel 82801FB/FR/FW/FRW (ICH6) USB controller USB-D");
 
+	case 0x27c88086:
+		return ("Intel 82801G (ICH7) USB controller USB-A");
+	case 0x27c98086:
+		return ("Intel 82801G (ICH7) USB controller USB-B");
+	case 0x27ca8086:
+		return ("Intel 82801G (ICH7) USB controller USB-C");
+	case 0x27cb8086:
+		return ("Intel 82801G (ICH7) USB controller USB-D");
+
 	case 0x28308086:
 		return ("Intel 82801H (ICH8) USB controller USB-A");
 	case 0x28318086:

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/controller/uss820dci.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/controller/uss820dci.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/controller/uss820dci.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -2360,4 +2360,5 @@ struct usb_bus_methods uss820dci_bus_met
 	.set_stall = &uss820dci_set_stall,
 	.clear_stall = &uss820dci_clear_stall,
 	.roothub_exec = &uss820dci_roothub_exec,
+	.xfer_poll = &uss820dci_do_poll,
 };

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/input/ums.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/input/ums.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/input/ums.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -140,6 +140,8 @@ struct ums_softc {
 
 	struct usb_xfer *sc_xfer[UMS_N_TRANSFER];
 
+	int sc_pollrate;
+
 	uint8_t	sc_buttons;
 	uint8_t	sc_iid;
 	uint8_t	sc_temp[64];
@@ -188,6 +190,7 @@ ums_intr_callback(struct usb_xfer *xfer,
 	struct usb_page_cache *pc;
 	uint8_t *buf = sc->sc_temp;
 	int32_t buttons = 0;
+	int32_t buttons_found = 0;
 	int32_t dw = 0;
 	int32_t dx = 0;
 	int32_t dy = 0;
@@ -263,16 +266,24 @@ ums_intr_callback(struct usb_xfer *xfer,
 			dt -= hid_get_data(buf, len, &info->sc_loc_t);
 
 		for (i = 0; i < info->sc_buttons; i++) {
+			uint32_t mask;
+			mask = 1UL << UMS_BUT(i);
+			/* check for correct button ID */
 			if (id != info->sc_iid_btn[i])
 				continue;
-			if (hid_get_data(buf, len, &info->sc_loc_btn[i])) {
-				buttons |= (1 << UMS_BUT(i));
-			}
+			/* check for button pressed */
+			if (hid_get_data(buf, len, &info->sc_loc_btn[i]))
+				buttons |= mask;
+			/* register button mask */
+			buttons_found |= mask;
 		}
 
 		if (++info != &sc->sc_info[UMS_INFO_MAX])
 			goto repeat;
 
+		/* keep old button value(s) for non-detected buttons */
+		buttons |= sc->sc_status.button & ~buttons_found;
+
 		if (dx || dy || dz || dt || dw ||
 		    (buttons != sc->sc_status.button)) {
 
@@ -514,6 +525,8 @@ ums_attach(device_t dev)
 		DPRINTF("error=%s\n", usbd_errstr(err));
 		goto detach;
 	}
+
+	/* Get HID descriptor */
 	err = usbd_req_get_hid_desc(uaa->device, NULL, &d_ptr,
 	    &d_len, M_TEMP, uaa->info.bIfaceIndex);
 
@@ -531,6 +544,9 @@ ums_attach(device_t dev)
 	 * it has two addional buttons and a tilt wheel.
 	 */
 	if (usb_test_quirk(uaa, UQ_MS_BAD_CLASS)) {
+
+		sc->sc_iid = 0;
+
 		info = &sc->sc_info[0];
 		info->sc_flags = (UMS_FLAG_X_AXIS |
 		    UMS_FLAG_Y_AXIS |
@@ -540,11 +556,17 @@ ums_attach(device_t dev)
 		isize = 5;
 		/* 1st byte of descriptor report contains garbage */
 		info->sc_loc_x.pos = 16;
+		info->sc_loc_x.size = 8;
 		info->sc_loc_y.pos = 24;
+		info->sc_loc_y.size = 8;
 		info->sc_loc_z.pos = 32;
+		info->sc_loc_z.size = 8;
 		info->sc_loc_btn[0].pos = 8;
+		info->sc_loc_btn[0].size = 1;
 		info->sc_loc_btn[1].pos = 9;
+		info->sc_loc_btn[1].size = 1;
 		info->sc_loc_btn[2].pos = 10;
+		info->sc_loc_btn[2].size = 1;
 
 		/* Announce device */
 		device_printf(dev, "3 buttons and [XYZ] "
@@ -653,6 +675,23 @@ static void
 ums_start_read(struct usb_fifo *fifo)
 {
 	struct ums_softc *sc = usb_fifo_softc(fifo);
+	int rate;
+
+	/* Check if we should override the default polling interval */
+	rate = sc->sc_pollrate;
+	/* Range check rate */
+	if (rate > 1000)
+		rate = 1000;
+	/* Check for set rate */
+	if ((rate > 0) && (sc->sc_xfer[UMS_INTR_DT] != NULL)) {
+		DPRINTF("Setting pollrate = %d\n", rate);
+		/* Stop current transfer, if any */
+		usbd_transfer_stop(sc->sc_xfer[UMS_INTR_DT]);
+		/* Set new interval */
+		usbd_xfer_set_interval(sc->sc_xfer[UMS_INTR_DT], 1000 / rate);
+		/* Only set pollrate once */
+		sc->sc_pollrate = 0;
+	}
 
 	usbd_transfer_start(sc->sc_xfer[UMS_INTR_DT]);
 }
@@ -791,6 +830,9 @@ ums_ioctl(struct usb_fifo *fifo, u_long 
 			sc->sc_mode.level = mode.level;
 		}
 
+		/* store polling rate */
+		sc->sc_pollrate = mode.rate;
+
 		if (sc->sc_mode.level == 0) {
 			if (sc->sc_buttons > MOUSE_MSC_MAXBUTTON)
 				sc->sc_hw.buttons = MOUSE_MSC_MAXBUTTON;

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/serial/u3g.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/serial/u3g.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/serial/u3g.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -188,6 +188,7 @@ static const struct usb_device_id u3g_de
 	U3G_DEV(QUALCOMMINC, CDMA_MSM, U3GFL_SCSI_EJECT),
 	/* OEM: Huawei */
 	U3G_DEV(HUAWEI, MOBILE, U3GFL_HUAWEI_INIT),
+	U3G_DEV(HUAWEI, E180V, U3GFL_HUAWEI_INIT),
 	U3G_DEV(HUAWEI, E220, U3GFL_HUAWEI_INIT),
 	/* OEM: Novatel */
 	U3G_DEV(NOVATEL, CDMA_MODEM, 0),

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/serial/ulpt.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/serial/ulpt.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/serial/ulpt.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -426,6 +426,9 @@ ulpt_open(struct usb_fifo *fifo, int ffl
 	/* we assume that open is a serial process */
 
 	if (sc->sc_fflags == 0) {
+
+		/* reset USB paralell port */
+
 		ulpt_reset(sc);
 	}
 	return (unlpt_open(fifo, fflags));
@@ -720,7 +723,12 @@ ulpt_watchdog(void *arg)
 
 	mtx_assert(&sc->sc_mtx, MA_OWNED);
 
-	usbd_transfer_start(sc->sc_xfer[ULPT_INTR_DT_RD]);
+	/* 
+	 * Only read status while the device is not opened, due to
+	 * possible hardware or firmware bug in some printers.
+	 */
+	if (sc->sc_fflags == 0)
+		usbd_transfer_start(sc->sc_xfer[ULPT_INTR_DT_RD]);
 
 	usb_callout_reset(&sc->sc_watchdog,
 	    hz, &ulpt_watchdog, sc);

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/usb_compat_linux.h
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/usb_compat_linux.h	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/usb_compat_linux.h	Sun Oct 11 20:46:56 2009	(r197970)
@@ -262,6 +262,7 @@ struct urb {
 	uint8_t	setup_dma;		/* (in) not used on FreeBSD */
 	uint8_t	transfer_dma;		/* (in) not used on FreeBSD */
 	uint8_t	bsd_isread;
+	uint8_t kill_count;		/* FreeBSD specific */
 
 	struct usb_iso_packet_descriptor iso_frame_desc[];	/* (in) ISO ONLY */
 };

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/usb_controller.h
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/usb_controller.h	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/usb_controller.h	Sun Oct 11 20:46:56 2009	(r197970)
@@ -99,6 +99,9 @@ struct usb_bus_methods {
 	void    (*set_stall) (struct usb_device *udev, struct usb_xfer *xfer, struct usb_endpoint *ep, uint8_t *did_stall);
 	void    (*clear_stall) (struct usb_device *udev, struct usb_endpoint *ep);
 
+	/* Optional transfer polling support */
+
+	void	(*xfer_poll) (struct usb_bus *);
 };
 
 /*

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/usb_dev.h
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/usb_dev.h	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/usb_dev.h	Sun Oct 11 20:46:56 2009	(r197970)
@@ -130,6 +130,8 @@ struct usb_fifo {
 	uint8_t	flag_short;		/* set if short_ok or force_short
 					 * transfer flags should be set */
 	uint8_t	flag_stall;		/* set if clear stall should be run */
+	uint8_t	flag_write_defrag;	/* set to defrag written data */
+	uint8_t	flag_have_fragment;	/* set if defragging */
 	uint8_t	iface_index;		/* set to the interface we belong to */
 	uint8_t	fifo_index;		/* set to the FIFO index in "struct
 					 * usb_device" */
@@ -144,11 +146,9 @@ extern struct cdevsw usb_devsw;
 int	usb_fifo_wait(struct usb_fifo *fifo);
 void	usb_fifo_signal(struct usb_fifo *fifo);
 uint8_t	usb_fifo_opened(struct usb_fifo *fifo);
-void	usb_fifo_free(struct usb_fifo *f);
 struct usb_symlink *usb_alloc_symlink(const char *target);
 void	usb_free_symlink(struct usb_symlink *ps);
 int	usb_read_symlink(uint8_t *user_ptr, uint32_t startentry,
 	    uint32_t user_len);
-void	usb_fifo_set_close_zlp(struct usb_fifo *, uint8_t);
 
 #endif					/* _USB_DEV_H_ */

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/usb_device.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/usb_device.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/usb_device.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -847,18 +847,13 @@ usbd_set_alt_interface_index(struct usb_
 		err = USB_ERR_INVAL;
 		goto done;
 	}
-	if (udev->flags.usb_mode == USB_MODE_DEVICE) {
-		usb_detach_device(udev, iface_index,
-		    USB_UNCFG_FLAG_FREE_SUBDEV);
-	} else {
-		if (iface->alt_index == alt_index) {
-			/* 
-			 * Optimise away duplicate setting of
-			 * alternate setting in USB Host Mode!
-			 */
-			err = 0;
-			goto done;
-		}
+	if (iface->alt_index == alt_index) {
+		/* 
+		 * Optimise away duplicate setting of
+		 * alternate setting in USB Host Mode!
+		 */
+		err = 0;
+		goto done;
 	}
 #if USB_HAVE_UGEN
 	/*
@@ -872,6 +867,12 @@ usbd_set_alt_interface_index(struct usb_
 	if (err) {
 		goto done;
 	}
+	if (iface->alt_index != alt_index) {
+		/* the alternate setting does not exist */
+		err = USB_ERR_INVAL;
+		goto done;
+	}
+
 	err = usbd_req_set_alt_interface_no(udev, NULL, iface_index,
 	    iface->idesc->bAlternateSetting);
 
@@ -973,7 +974,6 @@ usb_reset_iface_endpoints(struct usb_dev
 {
 	struct usb_endpoint *ep;
 	struct usb_endpoint *ep_end;
-	usb_error_t err;
 
 	ep = udev->endpoints;
 	ep_end = udev->endpoints + udev->endpoints_max;
@@ -985,10 +985,7 @@ usb_reset_iface_endpoints(struct usb_dev
 			continue;
 		}
 		/* simulate a clear stall from the peer */
-		err = usbd_set_endpoint_stall(udev, ep, 0);
-		if (err) {
-			/* just ignore */
-		}
+		usbd_set_endpoint_stall(udev, ep, 0);
 	}
 	return (0);
 }
@@ -1295,6 +1292,7 @@ usb_probe_and_attach(struct usb_device *
 		uaa.info.bIfaceNum =
 		    iface->idesc->bInterfaceNumber;
 		uaa.use_generic = 0;
+		uaa.driver_info = 0;	/* reset driver_info */
 
 		DPRINTFN(2, "iclass=%u/%u/%u iindex=%u/%u\n",
 		    uaa.info.bInterfaceClass,
@@ -1311,6 +1309,7 @@ usb_probe_and_attach(struct usb_device *
 		/* try generic interface drivers last */
 
 		uaa.use_generic = 1;
+		uaa.driver_info = 0;	/* reset driver_info */
 
 		if (usb_probe_and_attach_sub(udev, &uaa)) {
 			/* ignore */
@@ -2377,6 +2376,7 @@ usb_notify_addq(const char *type, struct
 	    "devclass=0x%02x "
 	    "devsubclass=0x%02x "
 	    "sernum=\"%s\" "
+	    "release=0x%04x "
 	    "at "
 	    "port=%u "
 	    "on "
@@ -2388,6 +2388,7 @@ usb_notify_addq(const char *type, struct
 	    udev->ddesc.bDeviceClass,
 	    udev->ddesc.bDeviceSubClass,
 	    udev->serial,
+	    UGETW(udev->ddesc.bcdDevice),
 	    udev->port_no,
 	    udev->parent_hub != NULL ?
 		udev->parent_hub->ugen_name :

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/usb_hid.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/usb_hid.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/usb_hid.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -78,11 +78,19 @@ static uint8_t hid_get_byte(struct hid_d
 
 #define	MAXUSAGE 64
 #define	MAXPUSH 4
+#define	MAXID 16
+
+struct hid_pos_data {
+	int32_t rid;
+	uint32_t pos;
+};
+
 struct hid_data {
 	const uint8_t *start;
 	const uint8_t *end;
 	const uint8_t *p;
 	struct hid_item cur[MAXPUSH];
+	struct hid_pos_data last_pos[MAXID];
 	int32_t	usages_min[MAXUSAGE];
 	int32_t	usages_max[MAXUSAGE];
 	int32_t usage_last;	/* last seen usage */
@@ -119,6 +127,58 @@ hid_clear_local(struct hid_item *c)
 	c->set_delimiter = 0;
 }
 
+static void
+hid_switch_rid(struct hid_data *s, struct hid_item *c, int32_t next_rID)
+{
+	uint8_t i;
+
+	/* check for same report ID - optimise */
+
+	if (c->report_ID == next_rID)
+		return;
+
+	/* save current position for current rID */
+
+	if (c->report_ID == 0) {
+		i = 0;
+	} else {
+		for (i = 1; i != MAXID; i++) {
+			if (s->last_pos[i].rid == c->report_ID)
+				break;
+			if (s->last_pos[i].rid == 0)
+				break;
+		}
+	}
+	if (i != MAXID) {
+		s->last_pos[i].rid = c->report_ID;
+		s->last_pos[i].pos = c->loc.pos;
+	}
+
+	/* store next report ID */
+
+	c->report_ID = next_rID;
+
+	/* lookup last position for next rID */
+
+	if (next_rID == 0) {
+		i = 0;
+	} else {
+		for (i = 1; i != MAXID; i++) {
+			if (s->last_pos[i].rid == next_rID)
+				break;
+			if (s->last_pos[i].rid == 0)
+				break;
+		}
+	}
+	if (i != MAXID) {
+		s->last_pos[i].rid = next_rID;
+		c->loc.pos = s->last_pos[i].pos;
+	} else {
+		DPRINTF("Out of RID entries, position is set to zero!\n");
+		c->loc.pos = 0;
+	}
+}
+
 /*------------------------------------------------------------------------*
  *	hid_start_parse
  *------------------------------------------------------------------------*/
@@ -373,9 +433,7 @@ hid_get_item(struct hid_data *s, struct 
 				s->loc_size = dval & mask;
 				break;
 			case 8:
-				c->report_ID = dval;
-				/* new report - reset position */
-				c->loc.pos = 0;
+				hid_switch_rid(s, c, dval);
 				break;
 			case 9:
 				/* mask because value is unsigned */

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/usb_parse.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/usb_parse.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/usb_parse.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -215,20 +215,29 @@ usbd_get_no_descriptors(struct usb_confi
  *	usbd_get_no_alts
  *
  * Return value:
- *   Number of alternate settings for the given interface descriptor pointer.
+ *   Number of alternate settings for the given interface descriptor
+ *   pointer. If the USB descriptor is corrupt, the returned value can
+ *   be greater than the actual number of alternate settings.
  *------------------------------------------------------------------------*/
 uint8_t
 usbd_get_no_alts(struct usb_config_descriptor *cd,
     struct usb_interface_descriptor *id)
 {
 	struct usb_descriptor *desc;
-	uint8_t n = 0;
+	uint8_t n;
 	uint8_t ifaceno;
 
+	/* Reset interface count */
+
+	n = 0;
+
+	/* Get the interface number */
+
 	ifaceno = id->bInterfaceNumber;
 
-	desc = (struct usb_descriptor *)id;
+	/* Iterate all the USB descriptors */
 
+	desc = NULL;
 	while ((desc = usb_desc_foreach(cd, desc))) {
 		if ((desc->bDescriptorType == UDESC_INTERFACE) &&
 		    (desc->bLength >= sizeof(*id))) {
@@ -237,8 +246,7 @@ usbd_get_no_alts(struct usb_config_descr
 				n++;
 				if (n == 0xFF)
 					break;		/* crazy */
-			} else
-				break;			/* end */
+			}
 		}
 	}
 	return (n);

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/usb_request.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/usb_request.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/usb_request.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -1059,9 +1059,9 @@ usbd_req_get_alt_interface_no(struct usb
 	struct usb_interface *iface = usbd_get_iface(udev, iface_index);
 	struct usb_device_request req;
 
-	if ((iface == NULL) || (iface->idesc == NULL)) {
+	if ((iface == NULL) || (iface->idesc == NULL))
 		return (USB_ERR_INVAL);
-	}
+
 	req.bmRequestType = UT_READ_INTERFACE;
 	req.bRequest = UR_GET_INTERFACE;
 	USETW(req.wValue, 0);
@@ -1085,9 +1085,9 @@ usbd_req_set_alt_interface_no(struct usb
 	struct usb_interface *iface = usbd_get_iface(udev, iface_index);
 	struct usb_device_request req;
 
-	if ((iface == NULL) || (iface->idesc == NULL)) {
+	if ((iface == NULL) || (iface->idesc == NULL))
 		return (USB_ERR_INVAL);
-	}
+
 	req.bmRequestType = UT_WRITE_INTERFACE;
 	req.bRequest = UR_SET_INTERFACE;
 	req.wValue[0] = alt_no;

Modified: projects/tcp_ffcaia2008_head/sys/dev/usb/usbdevs
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/dev/usb/usbdevs	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/dev/usb/usbdevs	Sun Oct 11 20:46:56 2009	(r197970)
@@ -1128,6 +1128,8 @@ product CYPRESS THERMO		0x0002	thermomet
 product CYPRESS WISPY1A		0x0bad	MetaGeek Wi-Spy
 product CYPRESS KBDHUB		0x0101	Keyboard/Hub
 product CYPRESS FMRADIO		0x1002	FM Radio
+product CYPRESS IKARILASER	0x121f	Ikari Laser SteelSeries ApS
+
 product CYPRESS USBRS232	0x5500	USB-RS232 Interface
 product CYPRESS SLIM_HUB	0x6560	Slim Hub
 product CYPRESS XX6830XX	0x6830	PATA Storage Device
@@ -1188,6 +1190,8 @@ product DLINK DSB650TX_PNA	0x4003	1/10/1
 product DLINK DSB650TX3		0x400b	10/100 Ethernet
 product DLINK DSB650TX2		0x4102	10/100 Ethernet
 product DLINK DSB650		0xabc1	10/100 Ethernet
+product DLINK2 DWA120_NF	0x3a0d	DWA-120 (no firmware)
+product DLINK2 DWA120		0x3a0e	DWA-120
 product DLINK2 DWLG122C1	0x3c03	DWL-G122 c1
 product DLINK2 WUA1340		0x3c04	WUA-1340
 product DLINK2 DWA111		0x3c06	DWA-111
@@ -1489,6 +1493,7 @@ product HTC SMARTPHONE		0x0a51	SmartPhon
 /* HUAWEI products */
 product HUAWEI MOBILE		0x1001	Huawei Mobile
 product HUAWEI E220		0x1003	Huawei HSDPA modem
+product HUAWEI E180V		0x140c	Huawei Mobile E180V
 
 /* HUAWEI 3com products */
 product HUAWEI3COM WUB320G	0x0009	Aolynk WUB320g

Modified: projects/tcp_ffcaia2008_head/sys/netinet/ipfw/ip_fw_nat.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/netinet/ipfw/ip_fw_nat.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/netinet/ipfw/ip_fw_nat.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -45,7 +45,6 @@ __FBSDID("$FreeBSD$");
 #include <sys/sysctl.h>
 #include <sys/syslog.h>
 #include <sys/ucred.h>
-#include <sys/vimage.h>
 
 #include <netinet/libalias/alias.h>
 #include <netinet/libalias/alias_local.h>

Modified: projects/tcp_ffcaia2008_head/sys/netinet/ipfw/ip_fw_pfil.c
==============================================================================
--- projects/tcp_ffcaia2008_head/sys/netinet/ipfw/ip_fw_pfil.c	Sun Oct 11 20:42:26 2009	(r197969)
+++ projects/tcp_ffcaia2008_head/sys/netinet/ipfw/ip_fw_pfil.c	Sun Oct 11 20:46:56 2009	(r197970)
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
 #include <sys/socketvar.h>
 #include <sys/sysctl.h>
 #include <sys/ucred.h>
-#include <sys/vimage.h>
 
 #include <net/if.h>
 #include <net/route.h>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200910112046.n9BKkuvX030117>