Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
edf3d92b
Commit
edf3d92b
authored
Aug 14, 2002
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
http://linuxusb.bkbits.net/linus-2.5
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
17454310
f601a8a6
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
92 additions
and
107 deletions
+92
-107
drivers/usb/core/devio.c
drivers/usb/core/devio.c
+13
-7
drivers/usb/core/hcd.h
drivers/usb/core/hcd.h
+10
-0
drivers/usb/core/hub.h
drivers/usb/core/hub.h
+4
-0
drivers/usb/core/message.c
drivers/usb/core/message.c
+2
-0
drivers/usb/core/usb.c
drivers/usb/core/usb.c
+54
-81
drivers/usb/host/ehci-dbg.c
drivers/usb/host/ehci-dbg.c
+2
-2
drivers/usb/serial/usbserial.c
drivers/usb/serial/usbserial.c
+1
-1
drivers/usb/storage/scsiglue.c
drivers/usb/storage/scsiglue.c
+1
-1
include/linux/usb.h
include/linux/usb.h
+5
-15
No files found.
drivers/usb/core/devio.c
View file @
edf3d92b
...
...
@@ -46,6 +46,7 @@
#include <asm/uaccess.h>
#include <asm/byteorder.h>
#include "hcd.h"
/* for usbcore internals */
struct
async
{
struct
list_head
asynclist
;
...
...
@@ -724,7 +725,7 @@ static int proc_resetdevice(struct dev_state *ps)
lock_kernel
();
if
(
intf
->
driver
&&
ps
->
dev
)
{
usb_bind_driver
(
intf
->
driver
,
ps
->
dev
,
i
);
usb_bind_driver
(
intf
->
driver
,
intf
);
}
unlock_kernel
();
}
...
...
@@ -1104,7 +1105,7 @@ static int proc_ioctl (struct dev_state *ps, void *arg)
/* let kernel drivers try to (re)bind to the interface */
case
USBDEVFS_CONNECT
:
usb_find_interface_driver_for_ifnum
(
ps
->
dev
,
ctrl
.
ifno
);
usb_find_interface_driver
(
ps
->
dev
,
ifp
);
break
;
/* talk directly to the interface's driver */
...
...
@@ -1144,6 +1145,11 @@ static int proc_ioctl (struct dev_state *ps, void *arg)
return
retval
;
}
/*
* NOTE: All requests here that have interface numbers as parameters
* are assuming that somehow the configuration has been prevented from
* changing. But there's no mechanism to ensure that...
*/
static
int
usbdev_ioctl
(
struct
inode
*
inode
,
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
struct
dev_state
*
ps
=
(
struct
dev_state
*
)
file
->
private_data
;
...
...
drivers/usb/core/hcd.h
View file @
edf3d92b
...
...
@@ -348,6 +348,16 @@ extern struct semaphore usb_bus_list_lock;
extern
void
usb_bus_get
(
struct
usb_bus
*
bus
);
extern
void
usb_bus_put
(
struct
usb_bus
*
bus
);
extern
struct
usb_interface
*
usb_ifnum_to_if
(
struct
usb_device
*
dev
,
unsigned
ifnum
);
extern
int
usb_find_interface_driver
(
struct
usb_device
*
dev
,
struct
usb_interface
*
interface
);
/* for probe/disconnect with correct module usage counting */
void
*
usb_bind_driver
(
struct
usb_driver
*
driver
,
struct
usb_interface
*
intf
);
void
usb_unbind_driver
(
struct
usb_device
*
device
,
struct
usb_interface
*
intf
);
/*-------------------------------------------------------------------------*/
/* hub.h ... DeviceRemovable in 2.4.2-ac11, gone in 2.4.10 */
...
...
drivers/usb/core/hub.h
View file @
edf3d92b
...
...
@@ -123,6 +123,10 @@ struct usb_hub_status {
* Hub descriptor
* See USB 2.0 spec Table 11-13
*/
#define USB_DT_HUB (USB_TYPE_CLASS | 0x09)
#define USB_DT_HUB_NONVAR_SIZE 7
struct
usb_hub_descriptor
{
__u8
bDescLength
;
__u8
bDescriptorType
;
...
...
drivers/usb/core/message.c
View file @
edf3d92b
...
...
@@ -8,6 +8,8 @@
#include <linux/init.h>
#include <asm/byteorder.h>
#include "hcd.h"
/* for usbcore internals */
struct
usb_api_data
{
wait_queue_head_t
wqh
;
int
done
;
...
...
drivers/usb/core/usb.c
View file @
edf3d92b
...
...
@@ -52,7 +52,6 @@ extern void usb_major_cleanup(void);
* Prototypes for the device driver probing/loading functions
*/
static
void
usb_find_drivers
(
struct
usb_device
*
);
static
int
usb_find_interface_driver
(
struct
usb_device
*
,
unsigned
int
);
static
void
usb_check_support
(
struct
usb_device
*
);
/*
...
...
@@ -119,7 +118,7 @@ void usb_scan_devices(void)
}
/**
* usb_unbind_driver - disconnects a driver from a device
* usb_unbind_driver - disconnects a driver from a device
(usbcore-internal)
* @device: usb device to be disconnected
* @intf: interface of the device to be disconnected
* Context: BKL held
...
...
@@ -164,21 +163,27 @@ void usb_unbind_driver(struct usb_device *device, struct usb_interface *intf)
}
/**
* usb_bind_driver - connect a driver to a device's interface
* @driver: device driver to be bound to a devices interface
* @dev: device to be bound
* @ifnum: index number of the interface to be used
* usb_bind_driver - connect a driver to a device's interface (usbcore-internal)
* @driver: device driver to be bound to interface
* @interface: interface that the driver will be using
* Context: BKL held
*
* Does a safe binding of a driver to one of a device's interfaces.
* Returns the driver's data for the binding, or null indicating
* that the driver did not bind to this interface.
*
* Does a save binding of a driver to a device's interface
* Returns a pointer to the drivers private description of the binding
* This differs from usb_driver_claim_interface(), which is called from
* drivers and neither calls the driver's probe() entry nor does any
* locking to guard against removing driver modules.
*/
void
*
usb_bind_driver
(
struct
usb_driver
*
driver
,
struct
usb_device
*
dev
,
unsigned
int
ifnum
)
void
*
usb_bind_driver
(
struct
usb_driver
*
driver
,
struct
usb_interface
*
interface
)
{
int
i
,
m
;
void
*
private
=
NULL
;
const
struct
usb_device_id
*
id
;
struct
usb_interface
*
interface
;
struct
usb_device
*
dev
=
interface_to_usbdev
(
interface
);
int
ifnum
;
if
(
driver
->
owner
)
{
m
=
try_inc_mod_count
(
driver
->
owner
);
...
...
@@ -187,14 +192,21 @@ void *usb_bind_driver(struct usb_driver *driver, struct usb_device *dev, unsigne
unlock_kernel
();
}
interface
=
&
dev
->
actconfig
->
interface
[
ifnum
];
// START TEMPORARY
// driver->probe() hasn't yet changed to take interface not dev+ifnum,
// so we still need ifnum here.
for
(
ifnum
=
0
;
ifnum
<
dev
->
actconfig
->
bNumInterfaces
;
ifnum
++
)
if
(
&
dev
->
actconfig
->
interface
[
ifnum
]
==
interface
)
break
;
BUG_ON
(
ifnum
==
dev
->
actconfig
->
bNumInterfaces
);
// END TEMPORARY
id
=
driver
->
id_table
;
/* new style driver? */
if
(
id
)
{
for
(
i
=
0
;
i
<
interface
->
num_altsetting
;
i
++
)
{
interface
->
act_altsetting
=
i
;
id
=
usb_match_id
(
dev
,
interface
,
id
);
id
=
usb_match_id
(
interface
,
id
);
if
(
id
)
{
down
(
&
driver
->
serialize
);
private
=
driver
->
probe
(
dev
,
ifnum
,
id
);
...
...
@@ -252,7 +264,7 @@ static void usb_drivers_purge(struct usb_driver *driver,struct usb_device *dev)
* This will go through the list looking for another
* driver that can handle the device
*/
usb_find_interface_driver
(
dev
,
i
);
usb_find_interface_driver
(
dev
,
i
nterface
);
}
}
}
...
...
@@ -294,29 +306,7 @@ void usb_deregister(struct usb_driver *driver)
}
/**
* usb_ifnum_to_ifpos - convert the interface number to the interface position
* @dev: the device to use
* @ifnum: the interface number (bInterfaceNumber); not interface position
*
* This is used to convert the interface _number_ (as in
* interface.bInterfaceNumber) to the interface _position_ (as in
* dev->actconfig->interface + position). Note that the number is the same as
* the position for all interfaces _except_ devices with interfaces not
* sequentially numbered (e.g., 0, 2, 3, etc).
*/
int
usb_ifnum_to_ifpos
(
struct
usb_device
*
dev
,
unsigned
ifnum
)
{
int
i
;
for
(
i
=
0
;
i
<
dev
->
actconfig
->
bNumInterfaces
;
i
++
)
if
(
dev
->
actconfig
->
interface
[
i
].
altsetting
[
0
].
bInterfaceNumber
==
ifnum
)
return
i
;
return
-
EINVAL
;
}
/**
* usb_ifnum_to_if - get the interface object with a given interface number
* usb_ifnum_to_if - get the interface object with a given interface number (usbcore-internal)
* @dev: the device whose current configuration is considered
* @ifnum: the desired interface
*
...
...
@@ -392,7 +382,8 @@ static void usb_check_support(struct usb_device *dev)
/* now we check this device */
if
(
dev
->
devnum
>
0
)
for
(
i
=
0
;
i
<
dev
->
actconfig
->
bNumInterfaces
;
i
++
)
usb_find_interface_driver
(
dev
,
i
);
usb_find_interface_driver
(
dev
,
dev
->
actconfig
->
interface
+
i
);
}
...
...
@@ -475,7 +466,6 @@ void usb_driver_release_interface(struct usb_driver *driver, struct usb_interfac
/**
* usb_match_id - find first usb_device_id matching device or interface
* @dev: the device whose descriptors are considered when matching
* @interface: the interface of interest
* @id: array of usb_device_id structures, terminated by zero entry
*
...
...
@@ -537,15 +527,18 @@ void usb_driver_release_interface(struct usb_driver *driver, struct usb_interfac
* its associated class and subclass.
*/
const
struct
usb_device_id
*
usb_match_id
(
struct
usb_device
*
dev
,
struct
usb_interface
*
interface
,
const
struct
usb_device_id
*
id
)
usb_match_id
(
struct
usb_interface
*
interface
,
const
struct
usb_device_id
*
id
)
{
struct
usb_interface_descriptor
*
intf
=
0
;
struct
usb_interface_descriptor
*
intf
;
struct
usb_device
*
dev
;
/* proc_connectinfo in devio.c may call us with id == NULL. */
if
(
id
==
NULL
)
return
NULL
;
intf
=
&
interface
->
altsetting
[
interface
->
act_altsetting
];
dev
=
interface_to_usbdev
(
interface
);
/* It is important to check that id->driver_info is nonzero,
since an entry that is all zeroes except for a nonzero
id->driver_info is the way to create an entry that
...
...
@@ -584,8 +577,6 @@ usb_match_id(struct usb_device *dev, struct usb_interface *interface,
(
id
->
bDeviceProtocol
!=
dev
->
descriptor
.
bDeviceProtocol
))
continue
;
intf
=
&
interface
->
altsetting
[
interface
->
act_altsetting
];
if
((
id
->
match_flags
&
USB_DEVICE_ID_MATCH_INT_CLASS
)
&&
(
id
->
bInterfaceClass
!=
intf
->
bInterfaceClass
))
continue
;
...
...
@@ -605,7 +596,7 @@ usb_match_id(struct usb_device *dev, struct usb_interface *interface,
}
/*
* This entrypoint gets called for
each new device
.
* This entrypoint gets called for
unclaimed interfaces
.
*
* We now walk the list of registered USB drivers,
* looking for one that will accept this interface.
...
...
@@ -620,21 +611,27 @@ usb_match_id(struct usb_device *dev, struct usb_interface *interface,
*
* Returns: 0 if a driver accepted the interface, -1 otherwise
*/
static
int
usb_find_interface_driver
(
struct
usb_device
*
dev
,
unsigned
ifnum
)
int
usb_find_interface_driver
(
struct
usb_device
*
dev
,
struct
usb_interface
*
interface
)
{
struct
list_head
*
tmp
;
struct
usb_interface
*
interface
;
void
*
private
;
struct
usb_driver
*
driver
;
if
((
!
dev
)
||
(
ifnum
>=
dev
->
actconfig
->
bNumInterfaces
))
{
err
(
"bad find_interface_driver params"
);
return
-
1
;
}
int
ifnum
;
down
(
&
dev
->
serialize
);
interface
=
dev
->
actconfig
->
interface
+
ifnum
;
/* FIXME It's just luck that for some devices with drivers that set
* configuration in probe(), the interface numbers still make sense.
* That's one of several unsafe assumptions involved in configuring
* devices, and in binding drivers to their interfaces.
*/
for
(
ifnum
=
0
;
ifnum
<
dev
->
actconfig
->
bNumInterfaces
;
ifnum
++
)
if
(
&
dev
->
actconfig
->
interface
[
ifnum
]
==
interface
)
break
;
BUG_ON
(
ifnum
==
dev
->
actconfig
->
bNumInterfaces
);
if
(
usb_interface_claimed
(
interface
))
goto
out_err
;
...
...
@@ -645,7 +642,7 @@ static int usb_find_interface_driver(struct usb_device *dev, unsigned ifnum)
driver
=
list_entry
(
tmp
,
struct
usb_driver
,
driver_list
);
tmp
=
tmp
->
next
;
private
=
usb_bind_driver
(
driver
,
dev
,
ifnum
);
private
=
usb_bind_driver
(
driver
,
interface
);
/* probe() may have changed the config on us */
interface
=
dev
->
actconfig
->
interface
+
ifnum
;
...
...
@@ -664,25 +661,6 @@ static int usb_find_interface_driver(struct usb_device *dev, unsigned ifnum)
return
-
1
;
}
/**
* usb_find_interface_driver_for_ifnum - finds a usb interface driver for the specified ifnum
* @dev: the device to use
* @ifnum: the interface number (bInterfaceNumber); not interface position!
*
* This converts a ifnum to ifpos via a call to usb_ifnum_to_ifpos and then
* calls usb_find_interface_driver() with the found ifpos. Note
* usb_find_interface_driver's ifnum parameter is actually interface position.
*/
int
usb_find_interface_driver_for_ifnum
(
struct
usb_device
*
dev
,
unsigned
ifnum
)
{
int
ifpos
=
usb_ifnum_to_ifpos
(
dev
,
ifnum
);
if
(
0
>
ifpos
)
return
-
EINVAL
;
return
usb_find_interface_driver
(
dev
,
ifpos
);
}
#ifdef CONFIG_HOTPLUG
/*
...
...
@@ -956,7 +934,7 @@ static void usb_find_drivers(struct usb_device *dev)
/* if this interface hasn't already been claimed */
if
(
!
usb_interface_claimed
(
interface
))
{
if
(
usb_find_interface_driver
(
dev
,
i
fnum
))
if
(
usb_find_interface_driver
(
dev
,
i
nterface
))
rejected
++
;
else
claimed
++
;
...
...
@@ -1655,8 +1633,6 @@ module_exit(usb_exit);
* These symbols are exported for device (or host controller)
* driver modules to use.
*/
EXPORT_SYMBOL
(
usb_ifnum_to_ifpos
);
EXPORT_SYMBOL
(
usb_ifnum_to_if
);
EXPORT_SYMBOL
(
usb_epnum_to_ep_desc
);
EXPORT_SYMBOL
(
usb_register
);
...
...
@@ -1668,7 +1644,6 @@ EXPORT_SYMBOL(usb_free_dev);
EXPORT_SYMBOL
(
usb_get_dev
);
EXPORT_SYMBOL
(
usb_hub_tt_clear_buffer
);
EXPORT_SYMBOL
(
usb_find_interface_driver_for_ifnum
);
EXPORT_SYMBOL
(
usb_driver_claim_interface
);
EXPORT_SYMBOL
(
usb_interface_claimed
);
EXPORT_SYMBOL
(
usb_driver_release_interface
);
...
...
@@ -1679,8 +1654,6 @@ EXPORT_SYMBOL(usb_new_device);
EXPORT_SYMBOL
(
usb_reset_device
);
EXPORT_SYMBOL
(
usb_connect
);
EXPORT_SYMBOL
(
usb_disconnect
);
EXPORT_SYMBOL
(
usb_bind_driver
);
EXPORT_SYMBOL
(
usb_unbind_driver
);
EXPORT_SYMBOL
(
__usb_get_extra_descriptor
);
...
...
drivers/usb/host/ehci-dbg.c
View file @
edf3d92b
...
...
@@ -252,7 +252,7 @@ show_async (struct device *dev, char *buf, size_t count, loff_t off)
return
count
-
size
;
}
static
DEVICE_ATTR
(
async
,
"sched-async"
,
S_IRUSR
,
show_async
,
NULL
);
static
DEVICE_ATTR
(
async
,
S_IRUSR
,
show_async
,
NULL
);
#define DBG_SCHED_LIMIT 64
...
...
@@ -360,7 +360,7 @@ show_periodic (struct device *dev, char *buf, size_t count, loff_t off)
return
count
-
size
;
}
static
DEVICE_ATTR
(
periodic
,
"sched-periodic"
,
S_IRUSR
,
show_periodic
,
NULL
);
static
DEVICE_ATTR
(
periodic
,
S_IRUSR
,
show_periodic
,
NULL
);
#undef DBG_SCHED_LIMIT
...
...
drivers/usb/serial/usbserial.c
View file @
edf3d92b
...
...
@@ -1193,7 +1193,7 @@ static void * usb_serial_probe(struct usb_device *dev, unsigned int ifnum,
interface
=
&
dev
->
actconfig
->
interface
[
ifnum
];
list_for_each
(
tmp
,
&
usb_serial_driver_list
)
{
type
=
list_entry
(
tmp
,
struct
usb_serial_device_type
,
driver_list
);
id_pattern
=
usb_match_id
(
dev
,
interface
,
type
->
id_table
);
id_pattern
=
usb_match_id
(
interface
,
type
->
id_table
);
if
(
id_pattern
!=
NULL
)
{
dbg
(
"descriptor matches"
);
found
=
1
;
...
...
drivers/usb/storage/scsiglue.c
View file @
edf3d92b
...
...
@@ -265,7 +265,7 @@ static int bus_reset( Scsi_Cmnd *srb )
US_DEBUGPX
(
"simulating disconnect/reconnect.
\n
"
);
down
(
&
intf
->
driver
->
serialize
);
intf
->
driver
->
disconnect
(
pusb_dev_save
,
intf
->
private_data
);
id
=
usb_match_id
(
pusb_dev_save
,
intf
,
intf
->
driver
->
id_table
);
id
=
usb_match_id
(
intf
,
intf
->
driver
->
id_table
);
intf
->
driver
->
probe
(
pusb_dev_save
,
i
,
id
);
up
(
&
intf
->
driver
->
serialize
);
}
...
...
include/linux/usb.h
View file @
edf3d92b
...
...
@@ -167,10 +167,6 @@ struct usb_device;
#define USB_DT_OTHER_SPEED_CONFIG 0x07
#define USB_DT_INTERFACE_POWER 0x08
// FIXME should be internal to hub driver
#define USB_DT_HUB (USB_TYPE_CLASS | 0x09)
#define USB_DT_HUB_NONVAR_SIZE 7
/*
* Descriptor sizes per descriptor type
*/
...
...
@@ -258,6 +254,8 @@ struct usb_interface {
void
*
private_data
;
};
#define to_usb_interface(d) container_of(d, struct usb_interface, dev)
#define interface_to_usbdev(intf) \
container_of(intf->dev.parent, struct usb_device, dev)
/* USB_DT_CONFIG: Configuration descriptor information.
*
...
...
@@ -303,10 +301,8 @@ struct usb_qualifier_descriptor {
__u8
bRESERVED
;
}
__attribute__
((
packed
));
/* helpers for driver access to descriptors */
extern
int
usb_ifnum_to_ifpos
(
struct
usb_device
*
dev
,
unsigned
ifnum
);
extern
struct
usb_interface
*
usb_ifnum_to_if
(
struct
usb_device
*
dev
,
unsigned
ifnum
);
// FIXME remove; exported only for drivers/usb/misc/auserwald.c
// prefer usb_device->epnum[0..31]
extern
struct
usb_endpoint_descriptor
*
usb_epnum_to_ep_desc
(
struct
usb_device
*
dev
,
unsigned
epnum
);
...
...
@@ -435,10 +431,6 @@ extern void usb_free_dev(struct usb_device *);
/* for when layers above USB add new non-USB drivers */
extern
void
usb_scan_devices
(
void
);
/* for probe/disconnect with correct module usage counting */
void
*
usb_bind_driver
(
struct
usb_driver
*
driver
,
struct
usb_device
*
dev
,
unsigned
int
ifnum
);
void
usb_unbind_driver
(
struct
usb_device
*
device
,
struct
usb_interface
*
intf
);
/* mostly for devices emulating SCSI over USB */
extern
int
usb_reset_device
(
struct
usb_device
*
dev
);
...
...
@@ -446,14 +438,12 @@ extern int usb_reset_device(struct usb_device *dev);
extern
int
usb_get_current_frame_number
(
struct
usb_device
*
usb_dev
);
/* used these for multi-interface device registration */
extern
int
usb_find_interface_driver_for_ifnum
(
struct
usb_device
*
dev
,
unsigned
int
ifnum
);
extern
void
usb_driver_claim_interface
(
struct
usb_driver
*
driver
,
struct
usb_interface
*
iface
,
void
*
priv
);
extern
int
usb_interface_claimed
(
struct
usb_interface
*
iface
);
extern
void
usb_driver_release_interface
(
struct
usb_driver
*
driver
,
struct
usb_interface
*
iface
);
const
struct
usb_device_id
*
usb_match_id
(
struct
usb_device
*
dev
,
struct
usb_interface
*
interface
,
const
struct
usb_device_id
*
usb_match_id
(
struct
usb_interface
*
interface
,
const
struct
usb_device_id
*
id
);
/**
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment