Add a much-requested feature: The ability for pccard attachments to
scan the CIS for interesting tuples. 95% of what can be obtained from the CIS is harvested by the pccard layer and presented to the user in standard function calls. However, there are special needs at times where the standard stuff doesn't suffice. This is for those special cases. CARD_SCAN_CIS(device_get_parent(dev), function, argp) scans the CIS of the card, passing each tuple to function with the tuple and argp as its arguments. Returning 0 continues the scan, while returning 1 terminates the scan. The value of the last invocation of function is returned from this function. int (*pccard_scan_t)(struct pccard_tuple *tuple, void *argp) function called for each tuple. Elements of the CIS tuple can be read with pccard_tuple_read_{1,2,3,4,n}(). You are reading the actual tuple memory each time, in case your card has registers in the CIS. # I suppose these things should be documented in pccard(4) or something like # that. # I plan on unifying cardbus CIS support in a similar way. Approved by: re (scottl)
This commit is contained in:
parent
3cade8d074
commit
64e8045b62
@ -169,3 +169,12 @@ METHOD struct pccard_product * do_product_lookup {
|
||||
METHOD int compat_match {
|
||||
device_t dev;
|
||||
}
|
||||
|
||||
#
|
||||
# Scanning function for accessing the CIS of a card in its driver.
|
||||
#
|
||||
METHOD int cis_scan {
|
||||
device_t bus;
|
||||
pccard_scan_t fnp;
|
||||
void *argp;
|
||||
};
|
||||
|
@ -1325,6 +1325,7 @@ static device_method_t pccard_methods[] = {
|
||||
DEVMETHOD(card_compat_do_probe, pccard_compat_do_probe),
|
||||
DEVMETHOD(card_compat_do_attach, pccard_compat_do_attach),
|
||||
DEVMETHOD(card_do_product_lookup, pccard_do_product_lookup),
|
||||
DEVMETHOD(card_cis_scan, pccard_scan_cis),
|
||||
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
@ -71,7 +71,7 @@ struct cis_state {
|
||||
struct pccard_function *pf;
|
||||
};
|
||||
|
||||
int pccard_parse_cis_tuple(struct pccard_tuple *, void *);
|
||||
static int pccard_parse_cis_tuple(struct pccard_tuple *, void *);
|
||||
static int decode_funce(struct pccard_tuple *, struct pccard_function *);
|
||||
|
||||
void
|
||||
@ -103,8 +103,7 @@ pccard_read_cis(struct pccard_softc *sc)
|
||||
}
|
||||
|
||||
int
|
||||
pccard_scan_cis(device_t dev, int (*fct)(struct pccard_tuple *, void *),
|
||||
void *arg)
|
||||
pccard_scan_cis(device_t dev, pccard_scan_t fct, void *arg)
|
||||
{
|
||||
struct resource *res;
|
||||
int rid;
|
||||
@ -193,7 +192,7 @@ pccard_scan_cis(device_t dev, int (*fct)(struct pccard_tuple *, void *),
|
||||
DPRINTF(("CISTPL_END\n ff\n"));
|
||||
/* Call the function for the END tuple, since
|
||||
the CIS semantics depend on it */
|
||||
if ((*fct) (&tuple, arg)) {
|
||||
if ((*fct)(&tuple, arg)) {
|
||||
ret = 1;
|
||||
goto done;
|
||||
}
|
||||
@ -353,7 +352,7 @@ pccard_scan_cis(device_t dev, int (*fct)(struct pccard_tuple *, void *),
|
||||
*/
|
||||
default:
|
||||
{
|
||||
if ((*fct) (&tuple, arg)) {
|
||||
if ((*fct)(&tuple, arg)) {
|
||||
ret = 1;
|
||||
goto done;
|
||||
}
|
||||
@ -616,7 +615,7 @@ pccard_print_cis(device_t dev)
|
||||
card->error);
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
pccard_parse_cis_tuple(struct pccard_tuple *tuple, void *arg)
|
||||
{
|
||||
/* most of these are educated guesses */
|
||||
|
@ -221,6 +221,8 @@ struct pccard_tuple {
|
||||
bus_space_handle_t memh;
|
||||
};
|
||||
|
||||
typedef int (*pccard_scan_t)(struct pccard_tuple *, void *);
|
||||
|
||||
struct pccard_product {
|
||||
const char *pp_name; /* NULL if end of table */
|
||||
#define PCCARD_VENDOR_ANY (0xffffffff)
|
||||
@ -250,8 +252,7 @@ pccard_product_lookup(device_t dev, const struct pccard_product *tab,
|
||||
void pccard_read_cis(struct pccard_softc *);
|
||||
void pccard_check_cis_quirks(device_t);
|
||||
void pccard_print_cis(device_t);
|
||||
int pccard_scan_cis(device_t,
|
||||
int (*) (struct pccard_tuple *, void *), void *);
|
||||
int pccard_scan_cis(device_t, pccard_scan_t, void *);
|
||||
|
||||
#define pccard_cis_read_1(tuple, idx0) \
|
||||
(bus_space_read_1((tuple)->memt, (tuple)->memh, (tuple)->mult*(idx0)))
|
||||
|
Loading…
Reference in New Issue
Block a user