Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Aug 2010 06:49:51 GMT
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 181754 for review
Message-ID:  <201008030649.o736npc7030579@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@181754?ac=10

Change 181754 by hselasky@hselasky_laptop001 on 2010/08/03 06:49:04

	USB core:
		- USB device drivers should not reference the usb_device structure elements (umass, uhso, ubser).
		- Add new bus methods (endpoint_uninit, device_init, device_uninit)  for Super Speed USB
		which are required to setup the hardware driver. The endpoint_uninit function is not yet
		called.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb/net/uhso.c#8 edit
.. //depot/projects/usb/src/sys/dev/usb/serial/ubser.c#19 edit
.. //depot/projects/usb/src/sys/dev/usb/storage/umass.c#52 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_controller.h#21 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_device.c#72 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_device.h#39 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_generic.c#33 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_hub.c#52 edit
.. //depot/projects/usb/src/sys/dev/usb/usbdi_util.h#7 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb/net/uhso.c#8 (text+ko) ====

@@ -61,12 +61,10 @@
 #define USB_DEBUG_VAR uhso_debug
 #include <dev/usb/usb_debug.h>
 #include <dev/usb/usb_process.h>
-#include <dev/usb/usb_device.h>
 #include <dev/usb/usb_busdma.h>
-#include <dev/usb/usb_controller.h>
-#include <dev/usb/usb_bus.h>
+#include <dev/usb/usb_msctest.h>
+
 #include <dev/usb/serial/usb_serial.h>
-#include <dev/usb/usb_msctest.h>
 
 struct uhso_tty {
 	struct uhso_softc *ht_sc;
@@ -502,7 +500,7 @@
 		return (ENXIO);
 	if (uaa->info.bConfigIndex != 0)
 		return (ENXIO);
-	if (uaa->device->ddesc.bDeviceClass != 0xff)
+	if (uaa->info.bDeviceClass != 0xff)
 		return (ENXIO);
 
 	return (usbd_lookup_id_by_uaa(uhso_devs, sizeof(uhso_devs), uaa));
@@ -576,8 +574,9 @@
 	/* Announce device */
 	device_printf(self, "<%s port> at <%s %s> on %s\n",
 	    uhso_port_type[UHSO_IFACE_PORT_TYPE(sc->sc_type)],
-	    uaa->device->manufacturer, uaa->device->product,
-	    device_get_nameunit(uaa->device->bus->bdev));
+	    usb_get_manufacturer(uaa->device),
+	    usb_get_product(uaa->device),
+	    device_get_nameunit(device_get_parent(self)));
 
 	if (sc->sc_ttys > 0) {
 		SYSCTL_ADD_INT(sctx, SYSCTL_CHILDREN(soid), OID_AUTO, "ports",

==== //depot/projects/usb/src/sys/dev/usb/serial/ubser.c#19 (text+ko) ====

@@ -104,7 +104,6 @@
 #define	USB_DEBUG_VAR ubser_debug
 #include <dev/usb/usb_debug.h>
 #include <dev/usb/usb_process.h>
-#include <dev/usb/usb_device.h>
 
 #include <dev/usb/serial/usb_serial.h>
 
@@ -225,7 +224,7 @@
 		return (ENXIO);
 	}
 	/* check if this is a BWCT vendor specific ubser interface */
-	if ((strcmp(uaa->device->manufacturer, "BWCT") == 0) &&
+	if ((strcmp(usb_get_manufacturer(uaa->device), "BWCT") == 0) &&
 	    (uaa->info.bInterfaceClass == 0xff) &&
 	    (uaa->info.bInterfaceSubClass == 0x00))
 		return (0);

==== //depot/projects/usb/src/sys/dev/usb/storage/umass.c#52 (text+ko) ====

@@ -124,7 +124,7 @@
 
 #include <dev/usb/usb.h>
 #include <dev/usb/usbdi.h>
-#include <dev/usb/usb_device.h>
+#include <dev/usb/usbdi_util.h>
 #include "usbdevs.h"
 
 #include <dev/usb/quirk/usb_quirk.h>
@@ -2303,23 +2303,24 @@
 			if (umass_std_transform(sc, ccb, cmd, ccb->csio.cdb_len)) {
 
 				if (sc->sc_transfer.cmd_data[0] == INQUIRY) {
+					const char *pserial;
+
+					pserial = usb_get_serial(sc->sc_udev);
 
 					/*
 					 * Umass devices don't generally report their serial numbers
 					 * in the usual SCSI way.  Emulate it here.
 					 */
 					if ((sc->sc_transfer.cmd_data[1] & SI_EVPD) &&
-					    sc->sc_transfer.cmd_data[2] == SVPD_UNIT_SERIAL_NUMBER &&
-					    sc->sc_udev != NULL &&
-					    sc->sc_udev->serial != NULL &&
-					    sc->sc_udev->serial[0] != '\0') {
+					    (sc->sc_transfer.cmd_data[2] == SVPD_UNIT_SERIAL_NUMBER) &&
+					    (pserial[0] != '\0')) {
 						struct scsi_vpd_unit_serial_number *vpd_serial;
 
 						vpd_serial = (struct scsi_vpd_unit_serial_number *)ccb->csio.data_ptr;
-						vpd_serial->length = strlen(sc->sc_udev->serial);
+						vpd_serial->length = strlen(pserial);
 						if (vpd_serial->length > sizeof(vpd_serial->serial_num))
 							vpd_serial->length = sizeof(vpd_serial->serial_num);
-						memcpy(vpd_serial->serial_num, sc->sc_udev->serial, vpd_serial->length);
+						memcpy(vpd_serial->serial_num, pserial, vpd_serial->length);
 						ccb->csio.scsi_status = SCSI_STATUS_OK;
 						ccb->ccb_h.status = CAM_REQ_CMP;
 						xpt_done(ccb);
@@ -2552,9 +2553,7 @@
 		    sc->sc_transfer.cmd_data[0] == INQUIRY &&
 		    (sc->sc_transfer.cmd_data[1] & SI_EVPD) &&
 		    sc->sc_transfer.cmd_data[2] == SVPD_SUPPORTED_PAGE_LIST &&
-		    sc->sc_udev != NULL &&
-		    sc->sc_udev->serial != NULL &&
-		    sc->sc_udev->serial[0] != '\0') {
+		    (usb_get_serial(sc->sc_udev)[0] != '\0')) {
 			struct ccb_scsiio *csio;
 			struct scsi_vpd_supported_page_list *page_list;
 

==== //depot/projects/usb/src/sys/dev/usb/usb_controller.h#21 (text+ko) ====

@@ -106,6 +106,18 @@
 	/* Optional fixed power mode support */
 
 	void	(*get_power_mode) (struct usb_device *udev, int8_t *pmode);
+
+	/* Optional endpoint uninit */
+
+	void    (*endpoint_uninit) (struct usb_device *, struct usb_endpoint *);
+
+	/* Optional device init */
+
+	usb_error_t	(*device_init) (struct usb_device *);
+
+	/* Optional device uninit */
+
+	void	(*device_uninit) (struct usb_device *);
 };
 
 /*

==== //depot/projects/usb/src/sys/dev/usb/usb_device.c#72 (text+ko) ====

@@ -142,6 +142,33 @@
 	return ((state < USB_STATE_MAX) ? statestr[state] : "UNKNOWN");
 }
 
+const char *
+usb_get_manufacturer(struct usb_device *udev)
+{
+	if ((udev != NULL) && (udev->manufacturer != NULL))
+		return (udev->manufacturer);
+	else
+		return ("Unknown");
+}
+
+const char *
+usb_get_product(struct usb_device *udev)
+{
+	if ((udev != NULL) && (udev->product != NULL))
+		return (udev->product);
+	else
+		return ("");
+}
+
+const char *
+usb_get_serial(struct usb_device *udev)
+{
+	if ((udev != NULL) && (udev->serial != NULL))
+		return (udev->serial);
+	else
+		return ("");
+}
+
 /*------------------------------------------------------------------------*
  *	usbd_get_ep_by_addr
  *
@@ -1600,6 +1627,17 @@
 	/* Create a link from /dev/ugenX.X to the default endpoint */
 	make_dev_alias(udev->ctrl_dev, udev->ugen_name);
 #endif
+	/* Initialise device */
+	if (bus->methods->device_init != NULL) {
+		err = (bus->methods->device_init) (udev);
+		if (err != 0) {
+			DPRINTFN(0, "device init %d failed "
+			    "(%s, ignored)\n", device_index, 
+			    usbd_errstr(err));
+			goto done;
+		}
+	}
+
 	if (udev->flags.usb_mode == USB_MODE_HOST) {
 
 		err = usbd_req_set_address(udev, NULL, device_index);
@@ -1854,7 +1892,8 @@
 	udev->ugen_symlink = usb_alloc_symlink(udev->ugen_name);
 
 	/* Announce device */
-	printf("%s: <%s> at %s\n", udev->ugen_name, udev->manufacturer,
+	printf("%s: <%s> at %s\n", udev->ugen_name,
+	    usb_get_manufacturer(udev),
 	    device_get_nameunit(udev->bus->bdev));
 
 	usb_notify_addq("ATTACH", udev);
@@ -2006,7 +2045,7 @@
 	usb_notify_addq("DETACH", udev);
 
 	printf("%s: <%s> at %s (disconnected)\n", udev->ugen_name,
-	    udev->manufacturer, device_get_nameunit(bus->bdev));
+	    usb_get_manufacturer(udev), device_get_nameunit(bus->bdev));
 
 	/* Destroy UGEN symlink, if any */
 	if (udev->ugen_symlink) {
@@ -2070,6 +2109,10 @@
 	KASSERT(LIST_FIRST(&udev->pd_list) == NULL, ("leaked cdev entries"));
 #endif
 
+	/* Uninitialise device */
+	if (bus->methods->device_uninit != NULL)
+		(bus->methods->device_uninit) (udev);
+
 	/* free device */
 	free(udev->serial, M_USB);
 	free(udev->manufacturer, M_USB);
@@ -2171,7 +2214,8 @@
 	if (udd->bDeviceClass != 0xFF) {
 		snprintf(dst_ptr, dst_len, "%s %s, class %d/%d, rev %x.%02x/"
 		    "%x.%02x, addr %d",
-		    udev->manufacturer, udev->product,
+		    usb_get_manufacturer(udev),
+		    usb_get_product(udev),
 		    udd->bDeviceClass, udd->bDeviceSubClass,
 		    (bcdUSB >> 8), bcdUSB & 0xFF,
 		    (bcdDevice >> 8), bcdDevice & 0xFF,
@@ -2179,7 +2223,8 @@
 	} else {
 		snprintf(dst_ptr, dst_len, "%s %s, rev %x.%02x/"
 		    "%x.%02x, addr %d",
-		    udev->manufacturer, udev->product,
+		    usb_get_manufacturer(udev),
+		    usb_get_product(udev),
 		    (bcdUSB >> 8), bcdUSB & 0xFF,
 		    (bcdDevice >> 8), bcdDevice & 0xFF,
 		    udev->address);
@@ -2418,7 +2463,7 @@
 	    UGETW(udev->ddesc.idProduct),
 	    udev->ddesc.bDeviceClass,
 	    udev->ddesc.bDeviceSubClass,
-	    udev->serial,
+	    usb_get_serial(udev),
 	    UGETW(udev->ddesc.bcdDevice),
 	    udev->port_no,
 	    udev->parent_hub != NULL ?
@@ -2460,7 +2505,7 @@
 	    UGETW(udev->ddesc.idProduct),
 	    udev->ddesc.bDeviceClass,
 	    udev->ddesc.bDeviceSubClass,
-	    udev->serial,
+	    usb_get_serial(udev),
 	    UGETW(udev->ddesc.bcdDevice),
 	    (udev->flags.usb_mode == USB_MODE_HOST) ? "host" : "device",
 	    udev->port_no,
@@ -2499,7 +2544,7 @@
 		    UGETW(udev->ddesc.idProduct),
 		    udev->ddesc.bDeviceClass,
 		    udev->ddesc.bDeviceSubClass,
-		    udev->serial,
+		    usb_get_serial(udev),
 		    UGETW(udev->ddesc.bcdDevice),
 		    (udev->flags.usb_mode == USB_MODE_HOST) ? "host" : "device",
 		    iface->idesc->bInterfaceNumber,

==== //depot/projects/usb/src/sys/dev/usb/usb_device.h#39 (text+ko) ====

@@ -172,9 +172,9 @@
 	struct usb_endpoint_ss_comp_descriptor ctrl_ep_comp_desc;	/* for endpoint 0 */
 	struct usb_device_descriptor ddesc;	/* device descriptor */
 
-	char	*serial;		/* serial number */
-	char	*manufacturer;		/* manufacturer string */
-	char	*product;		/* product string */
+	char	*serial;		/* serial number, can be NULL */
+	char	*manufacturer;		/* manufacturer string, can be NULL */
+	char	*product;		/* product string, can be NULL */
 
 #if USB_HAVE_COMPAT_LINUX
 	/* Linux compat */

==== //depot/projects/usb/src/sys/dev/usb/usb_generic.c#33 (text+ko) ====

@@ -825,9 +825,9 @@
 	di->udi_bus = device_get_unit(udev->bus->bdev);
 	di->udi_addr = udev->address;
 	di->udi_index = udev->device_index;
-	strlcpy(di->udi_serial, udev->serial, sizeof(di->udi_serial));
-	strlcpy(di->udi_vendor, udev->manufacturer, sizeof(di->udi_vendor));
-	strlcpy(di->udi_product, udev->product, sizeof(di->udi_product));
+	strlcpy(di->udi_serial, usb_get_serial(udev), sizeof(di->udi_serial));
+	strlcpy(di->udi_vendor, usb_get_manufacturer(udev), sizeof(di->udi_vendor));
+	strlcpy(di->udi_product, usb_get_product(udev), sizeof(di->udi_product));
 	usb_printbcd(di->udi_release, sizeof(di->udi_release),
 	    UGETW(udev->ddesc.bcdDevice));
 	di->udi_vendorNo = UGETW(udev->ddesc.idVendor);

==== //depot/projects/usb/src/sys/dev/usb/usb_hub.c#52 (text+ko) ====

@@ -53,6 +53,7 @@
 #include <dev/usb/usb.h>
 #include <dev/usb/usb_ioctl.h>
 #include <dev/usb/usbdi.h>
+#include <dev/usb/usbdi_util.h>
 
 #define	USB_DEBUG_VAR uhub_debug
 
@@ -1263,7 +1264,7 @@
 		    UGETW(res.udev->ddesc.idProduct),
 		    res.udev->ddesc.bDeviceClass,
 		    res.udev->ddesc.bDeviceSubClass,
-		    res.udev->serial,
+		    usb_get_serial(res.udev),
 		    UGETW(res.udev->ddesc.bcdDevice),
 		    iface->idesc->bInterfaceClass,
 		    iface->idesc->bInterfaceSubClass);

==== //depot/projects/usb/src/sys/dev/usb/usbdi_util.h#7 (text+ko) ====

@@ -81,4 +81,11 @@
 usb_error_t usbd_req_set_report(struct usb_device *udev, struct mtx *mtx,
 		    void *data, uint16_t len, uint8_t iface_index,
 		    uint8_t type, uint8_t id);
+
+/* The following functions will not return NULL strings. */
+
+const char *usb_get_manufacturer(struct usb_device *);
+const char *usb_get_product(struct usb_device *);
+const char *usb_get_serial(struct usb_device *);
+
 #endif /* _USB_USBDI_UTIL_H_ */



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