PERFORCE change 118747 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Tue Apr 24 17:27:25 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=118747
Change 118747 by hselasky at hselasky_mini_itx on 2007/04/24 17:26:25
Bugfixes. The CDC ethernet driver reads the mac address
from the wrong descriptor. usbd_find_descriptor() must
take an additional argument, and that is the interface
domain in which it should search for descriptors.
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/if_cdce.c#13 edit
.. //depot/projects/usb/src/sys/dev/usb/umodem.c#18 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_subr.c#33 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_subr.h#36 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/if_cdce.c#13 (text+ko) ====
@@ -252,9 +252,9 @@
goto alloc_transfers;
}
- ud = ((const void *)usbd_find_descriptor
- (usbd_get_config_descriptor(uaa->device),
- UDESC_CS_INTERFACE, UDESCSUB_CDC_UNION));
+ ud = usbd_find_descriptor
+ (uaa->device, uaa->iface_index,
+ UDESC_CS_INTERFACE, UDESCSUB_CDC_UNION);
if ((ud == NULL) || (ud->bLength < sizeof(*ud))) {
device_printf(dev, "no union descriptor!\n");
@@ -327,9 +327,9 @@
&cdce_ifmedia_upd_cb,
&cdce_ifmedia_sts_cb);
- ue = ((const void *)usbd_find_descriptor
- (usbd_get_config_descriptor(uaa->device),
- UDESC_INTERFACE, UDESCSUB_CDC_ENF));
+ ue = usbd_find_descriptor
+ (uaa->device, uaa->iface_index,
+ UDESC_CS_INTERFACE, UDESCSUB_CDC_ENF);
if ((ue == NULL) || (ue->bLength < sizeof(*ue)) ||
usbreq_get_string_any(uaa->device, ue->iMacAddress,
@@ -391,12 +391,8 @@
sc->sc_ifp = ifp;
- mtx_unlock(&(sc->sc_mtx));
-
ether_ifattach(ifp, eaddr);
- mtx_lock(&(sc->sc_mtx));
-
return 0; /* success */
detach:
==== //depot/projects/usb/src/sys/dev/usb/umodem.c#18 (text+ko) ====
@@ -166,7 +166,7 @@
static void umodem_stop_read(struct ucom_softc *ucom);
static void umodem_start_write(struct ucom_softc *ucom);
static void umodem_stop_write(struct ucom_softc *ucom);
-static void umodem_get_caps(struct usbd_device *udev, u_int8_t *cm, u_int8_t *acm);
+static void umodem_get_caps(struct usb_attach_arg *uaa, uint8_t *cm, uint8_t *acm);
static void umodem_cfg_get_status(struct ucom_softc *ucom, u_int8_t *lsr, u_int8_t *msr);
static int umodem_pre_param(struct ucom_softc *ucom, struct termios *t);
static void umodem_cfg_param(struct ucom_softc *ucom, struct termios *t);
@@ -174,7 +174,7 @@
static void umodem_cfg_set_dtr(struct ucom_softc *ucom, u_int8_t onoff);
static void umodem_cfg_set_rts(struct ucom_softc *ucom, u_int8_t onoff);
static void umodem_cfg_set_break(struct ucom_softc *ucom, u_int8_t onoff);
-static void * umodem_get_desc(struct usbd_device *udev, u_int8_t type, u_int8_t subtype);
+static void * umodem_get_desc(struct usb_attach_arg *uaa, uint8_t type, uint8_t subtype);
static usbd_status umodem_set_comm_feature(struct usbd_device *udev, u_int8_t iface_no, uint16_t feature, uint16_t state);
static void umodem_cfg_do_request(struct umodem_softc *sc, usb_device_request_t *req, void *data);
@@ -313,7 +313,7 @@
goto done;
}
- umodem_get_caps(uaa->device, &cm, &acm);
+ umodem_get_caps(uaa, &cm, &acm);
if (!(cm & USB_CDC_CM_DOES_CM) ||
!(cm & USB_CDC_CM_OVER_DATA) ||
!(acm & USB_CDC_ACM_HAS_LINE)) {
@@ -347,12 +347,11 @@
sc->sc_ctrl_iface_index = uaa->iface_index;
sc->sc_udev = uaa->device;
- umodem_get_caps(uaa->device, &sc->sc_cm_cap, &sc->sc_acm_cap);
+ umodem_get_caps(uaa, &sc->sc_cm_cap, &sc->sc_acm_cap);
/* get the data interface number */
- cmd = umodem_get_desc(uaa->device, UDESC_CS_INTERFACE,
- UDESCSUB_CDC_CM);
+ cmd = umodem_get_desc(uaa, UDESC_CS_INTERFACE, UDESCSUB_CDC_CM);
if ((cmd == NULL) || (cmd->bLength < sizeof(*cmd))) {
device_printf(dev, "no CM descriptor!\n");
@@ -491,21 +490,21 @@
}
static void
-umodem_get_caps(struct usbd_device *udev, u_int8_t *cm, u_int8_t *acm)
+umodem_get_caps(struct usb_attach_arg *uaa, uint8_t *cm, uint8_t *acm)
{
usb_cdc_cm_descriptor_t *cmd;
usb_cdc_acm_descriptor_t *cad;
*cm = *acm = 0;
- cmd = umodem_get_desc(udev, UDESC_CS_INTERFACE, UDESCSUB_CDC_CM);
+ cmd = umodem_get_desc(uaa, UDESC_CS_INTERFACE, UDESCSUB_CDC_CM);
if ((cmd == NULL) || (cmd->bLength < sizeof(*cmd))) {
DPRINTF(0, "no CM desc\n");
return;
}
*cm = cmd->bmCapabilities;
- cad = umodem_get_desc(udev, UDESC_CS_INTERFACE, UDESCSUB_CDC_ACM);
+ cad = umodem_get_desc(uaa, UDESC_CS_INTERFACE, UDESCSUB_CDC_ACM);
if ((cad == NULL) || (cad->bLength < sizeof(*cad))) {
DPRINTF(0, "no ACM desc\n");
return;
@@ -903,9 +902,8 @@
static void *
umodem_get_desc(struct usbd_device *udev, u_int8_t type, u_int8_t subtype)
{
- usb_config_descriptor_t *cd = usbd_get_config_descriptor(udev);
- usb_descriptor_t *desc = usbd_find_descriptor(cd, type, subtype);
- return desc;
+ return
+ usbd_find_descriptor(uaa->device, uaa->iface_index, type, subtype);
}
static usbd_status
==== //depot/projects/usb/src/sys/dev/usb/usb_subr.c#33 (text+ko) ====
@@ -360,21 +360,46 @@
return (NULL);
}
-usb_descriptor_t *
-usbd_find_descriptor(usb_config_descriptor_t *cd, int type, int subtype)
+void *
+usbd_find_descriptor(struct usbd_device *udev, uint16_t iface_index,
+ int16_t type, int16_t subtype)
{
- usb_descriptor_t *desc = NULL;
+ usb_descriptor_t *desc;
+ usb_config_descriptor_t *cd;
+ usb_interface_descriptor_t *id;
+ struct usbd_interface *iface;
+
+ cd = usbd_get_config_descriptor(udev);
+ if (cd == NULL) {
+ return NULL;
+ }
+
+ iface = usbd_get_iface(udev, iface_index);
+ if (iface == NULL) {
+ return NULL;
+ }
+
+ id = usbd_get_interface_descriptor(iface);
+ if (id == NULL) {
+ return NULL;
+ }
+
+ desc = (void *)id;
while ((desc = usbd_desc_foreach(cd, desc))) {
- if((desc->bDescriptorType == type) &&
- ((subtype == USBD_SUBTYPE_ANY) ||
- (subtype == desc->bDescriptorSubtype)))
+ if (desc->bDescriptorType == UDESC_INTERFACE) {
+ break;
+ }
+
+ if ((desc->bDescriptorType == type) &&
+ ((subtype == USBD_SUBTYPE_ANY) ||
+ (subtype == desc->bDescriptorSubtype)))
{
return desc;
}
}
- return (NULL);
+ return NULL;
}
int
==== //depot/projects/usb/src/sys/dev/usb/usb_subr.h#36 (text+ko) ====
@@ -552,7 +552,7 @@
struct usb_hid_descriptor *usbd_get_hdesc(usb_config_descriptor_t *cd, usb_interface_descriptor_t *id);
usb_interface_descriptor_t *usbd_find_idesc(usb_config_descriptor_t *cd, uint16_t iface_index, uint16_t alt_index);
usb_endpoint_descriptor_t *usbd_find_edesc(usb_config_descriptor_t *cd, uint16_t iface_index, uint16_t alt_index, uint16_t endptidx);
-usb_descriptor_t *usbd_find_descriptor(usb_config_descriptor_t *cd, int32_t type, int32_t subtype);
+void * usbd_find_descriptor(struct usbd_device *udev, uint16_t iface_index, int16_t type, int16_t subtype);
int usbd_get_no_alts(usb_config_descriptor_t *cd, uint8_t ifaceno);
usbd_status usbd_search_and_set_config(struct usbd_device *udev, int32_t no, int32_t msg);
usbd_status usbd_set_config_index(struct usbd_device *udev, int32_t index, int32_t msg);
More information about the p4-projects
mailing list