too, but that's not critical): real hubs send port status change
notifications until acknowledged, ehci/ohci send only once so there is
a chance that this gets lost if notifications are disabled during a scan.
The temporary fix is to force a rescan; the real fix will involve a
change in interrupt handling in ehci/ohci which needs more work and
testing.
ehci is critical because a port status change during scan regularely
happens if a full/lowspeed device is connected, due to the handover
process.
Fixes a problem where full/lowspeed devices were not reattached after
a disconnect, reported by Kouichirou Hiratsuka and Juan RP
on current-users.
through the interrupt pipe; during exploration check only the ports
where we got such a notification. This speeds up things.
(I believe we should go a step further and use a thread per hub
instead of per bus. If power management gets implemented, we should
be able to react quickly on a resume event.)
Try to simplify the logics in the explore function a bit. (The reattach
thing was hacked in badly, not sure whether I broke it. Only used
by if_atu.)
Clean up some dead code.
matching (and handling) a whole device and those which match an
interface only. This will allow to enforce some rules, eg that
the former don't use interface information for matching or that the
latter don't modify global device state.
The previous way left too much freedom do the drivers which led to
inconsistencies and abuse.
For now, I've not changed locators and submatch rules, this will
happen later.
There should not be any change in behaviour, except in the case of
some drivers which did behave inconsistently:
if_atu, if_axe, uep: matched the configured device in the interface
stage, but did configuration again. I've converted them to match
in the device stage.
ustir, utoppy: matched in the interface stage, but only against
vendor/device information, and used any configuration/interface
without checking. Changed to match in device stage, and added
some simple code to configure and use the first interface.
If you have one of those devices, please test!
the largest size which makes sense (254). See rev. 1.114-116 for
possible problems, but that was with len=255 which is an impossible
size for a string descriptor.
Someone with a "kue" please test this.
of the common USB spec
-Fix length of string descriptor: Descriptors have only a byte field
for length, so 2*127+2 is already too much. Some devices obviously
don't reply to string read requests with impossible length which
happened if "sizeof(usb_string_descriptor_t) was used.
"bDescriptorSubtype" field and change usb_find_desc()/usb_find_desc_if()
to use it. (The latter functions should not be used by generic code;
I've left the names for now for compatibility.)
Rename USBD_SUBTYPE_ANY to make clear that it is not generic.
-use <fs/unicode.h> for utf16->utf8 conversion instead of a private
implementation
-streamline the COMPAT_30 utf16->ascii conversion a bit: remove
length check (USB_MAX_STRING_LEN is too large to be useful) and
replace array index arithmetics
bus powered hub. While one can interpret the spec that way, it is not
stated clearly, and is at most a side effect of power budgeting.
Also, there are devices which don't report correctly whether they
are self powered, so the check was unreliable.
parentheses in return statements.
Cosmetic: don't open-code TAILQ_FOREACH().
Cosmetic: change types of variables to avoid oodles of casts: in
in6_src.c, avoid casts by changing several route_in6 pointers
to struct route pointers. Remove unnecessary casts to caddr_t
elsewhere.
Pave the way for eliminating address family-specific route caches:
soon, struct route will not embed a sockaddr, but it will hold
a reference to an external sockaddr, instead. We will set the
destination sockaddr using rtcache_setdst(). (I created a stub
for it, but it isn't used anywhere, yet.) rtcache_free() will
free the sockaddr. I have extracted from rtcache_free() a helper
subroutine, rtcache_clear(). rtcache_clear() will "forget" a
cached route, but it will not forget the destination by releasing
the sockaddr. I use rtcache_clear() instead of rtcache_free()
in rtcache_update(), because rtcache_update() is not supposed
to forget the destination.
Constify:
1 Introduce const accessor for route->ro_dst, rtcache_getdst().
2 Constify the 'dst' argument to ifnet->if_output(). This
led me to constify a lot of code called by output routines.
3 Constify the sockaddr argument to protosw->pr_ctlinput. This
led me to constify a lot of code called by ctlinput routines.
4 Introduce const macros for converting from a generic sockaddr
to family-specific sockaddrs, e.g., sockaddr_in: satocsin6,
satocsin, et cetera.
device gets removed. However, when the diagnostic check fails,
it is much better to complete the free operation than to abort
it, because this just causes an infinite loop.
From John Nielsen on freebsd-mobile.
Not tested, but almost certainly better than attaching as ugen.
FreeBSD has a UQ_ASSUME_CM_OVER_DATA quirk for this device; I can't
figure out what that means.