o Check to make sure the card has a function (panic if not) in read_ivar.
o Use pf more consistantly for pccard_function. o Make sure we quote the strings properly (maybe this function belongs in subr_bus.c) o Tweak a comment to be more accurate after code changed.
This commit is contained in:
parent
c8d6e442b8
commit
e6e34c5689
@ -260,10 +260,10 @@ pccard_attach_card(device_t dev)
|
||||
resource_list_init(&ivar->resources);
|
||||
child = device_add_child(dev, NULL, -1);
|
||||
device_set_ivars(child, ivar);
|
||||
ivar->fcn = pf;
|
||||
ivar->pf = pf;
|
||||
pf->dev = child;
|
||||
/*
|
||||
* XXX We might want to move the next two lines into
|
||||
* XXX We might want to move the next three lines into
|
||||
* XXX the pccard interface layer. For the moment, this
|
||||
* XXX is OK, but some drivers want to pick the config
|
||||
* XXX entry to use as well as some address tweaks (mostly
|
||||
@ -878,8 +878,8 @@ pccard_print_child(device_t dev, device_t child)
|
||||
"%ld");
|
||||
pccard_print_resources(rl, "drq", SYS_RES_DRQ, PCCARD_NDRQ,
|
||||
"%ld");
|
||||
retval += printf(" function %d config %d", devi->fcn->number,
|
||||
devi->fcn->cfe->number);
|
||||
retval += printf(" function %d config %d", devi->pf->number,
|
||||
devi->pf->cfe->number);
|
||||
}
|
||||
|
||||
retval += bus_print_child_footer(dev, child);
|
||||
@ -889,7 +889,7 @@ pccard_print_child(device_t dev, device_t child)
|
||||
|
||||
static int
|
||||
pccard_set_resource(device_t dev, device_t child, int type, int rid,
|
||||
u_long start, u_long count)
|
||||
u_long start, u_long count)
|
||||
{
|
||||
struct pccard_ivar *devi = PCCARD_IVAR(child);
|
||||
struct resource_list *rl = &devi->resources;
|
||||
@ -965,12 +965,12 @@ static void
|
||||
pccard_probe_nomatch(device_t bus, device_t child)
|
||||
{
|
||||
struct pccard_ivar *devi = PCCARD_IVAR(child);
|
||||
struct pccard_function *func = devi->fcn;
|
||||
struct pccard_function *pf = devi->pf;
|
||||
struct pccard_softc *sc = PCCARD_SOFTC(bus);
|
||||
|
||||
device_printf(bus, "<unknown card>");
|
||||
printf(" (manufacturer=0x%04x, product=0x%04x) at function %d\n",
|
||||
sc->card.manufacturer, sc->card.product, func->number);
|
||||
sc->card.manufacturer, sc->card.product, pf->number);
|
||||
device_printf(bus, " CIS info: %s, %s, %s\n", sc->card.cis1_info[0],
|
||||
sc->card.cis1_info[1], sc->card.cis1_info[2]);
|
||||
return;
|
||||
@ -981,25 +981,46 @@ pccard_child_location_str(device_t bus, device_t child, char *buf,
|
||||
size_t buflen)
|
||||
{
|
||||
struct pccard_ivar *devi = PCCARD_IVAR(child);
|
||||
struct pccard_function *func = devi->fcn;
|
||||
struct pccard_function *pf = devi->pf;
|
||||
|
||||
snprintf(buf, buflen, "function=%d", func->number);
|
||||
snprintf(buf, buflen, "function=%d", pf->number);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* XXX Maybe this should be in subr_bus? */
|
||||
static void
|
||||
pccard_safe_quote(char *dst, const char *src, size_t len)
|
||||
{
|
||||
char *walker = dst, *ep = dst + len - 1;
|
||||
|
||||
if (len == 0)
|
||||
return;
|
||||
while (walker < ep)
|
||||
{
|
||||
if (*src == '"') {
|
||||
if (ep - walker < 2)
|
||||
break;
|
||||
*walker++ = '\\';
|
||||
}
|
||||
*walker++ = *src++;
|
||||
}
|
||||
*walker = '\0';
|
||||
}
|
||||
|
||||
static int
|
||||
pccard_child_pnpinfo_str(device_t bus, device_t child, char *buf,
|
||||
size_t buflen)
|
||||
{
|
||||
struct pccard_ivar *devi = PCCARD_IVAR(child);
|
||||
struct pccard_function *func = devi->fcn;
|
||||
struct pccard_function *pf = devi->pf;
|
||||
struct pccard_softc *sc = PCCARD_SOFTC(bus);
|
||||
char cis0[128], cis1[128];
|
||||
|
||||
/* XXX need to make sure that we've quoted the " in strings! */
|
||||
pccard_safe_quote(cis0, sc->card.cis1_info[0], sizeof(cis0));
|
||||
pccard_safe_quote(cis1, sc->card.cis1_info[1], sizeof(cis1));
|
||||
snprintf(buf, buflen, "manufacturer=0x%04x product=0x%04x "
|
||||
"cisvendor=\"%s\" cisproduct=\"%s\" function_type=%d",
|
||||
sc->card.manufacturer, sc->card.product, sc->card.cis1_info[0],
|
||||
sc->card.cis1_info[1], func->function);
|
||||
sc->card.manufacturer, sc->card.product, cis0, cis1, pf->function);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -1007,44 +1028,43 @@ static int
|
||||
pccard_read_ivar(device_t bus, device_t child, int which, u_char *result)
|
||||
{
|
||||
struct pccard_ivar *devi = PCCARD_IVAR(child);
|
||||
struct pccard_function *func = devi->fcn;
|
||||
struct pccard_function *pf = devi->pf;
|
||||
struct pccard_softc *sc = PCCARD_SOFTC(bus);
|
||||
|
||||
if (!pf)
|
||||
panic("No pccard function pointer");
|
||||
switch (which) {
|
||||
default:
|
||||
return (EINVAL);
|
||||
case PCCARD_IVAR_ETHADDR:
|
||||
bcopy(func->pf_funce_lan_nid, result, ETHER_ADDR_LEN);
|
||||
bcopy(pf->pf_funce_lan_nid, result, ETHER_ADDR_LEN);
|
||||
break;
|
||||
case PCCARD_IVAR_VENDOR:
|
||||
*(uint32_t *) result = sc->card.manufacturer;
|
||||
*(uint32_t *)result = sc->card.manufacturer;
|
||||
break;
|
||||
case PCCARD_IVAR_PRODUCT:
|
||||
*(uint32_t *) result = sc->card.product;
|
||||
*(uint32_t *)result = sc->card.product;
|
||||
break;
|
||||
case PCCARD_IVAR_PRODEXT:
|
||||
*(uint16_t *) result = sc->card.prodext;
|
||||
*(uint16_t *)result = sc->card.prodext;
|
||||
break;
|
||||
case PCCARD_IVAR_FUNCTION:
|
||||
*(uint32_t *) result = func->function;
|
||||
*(uint32_t *)result = pf->function;
|
||||
break;
|
||||
case PCCARD_IVAR_FUNCTION_NUMBER:
|
||||
if (!func) {
|
||||
device_printf(bus, "No function number, bug!\n");
|
||||
return (ENOENT);
|
||||
}
|
||||
*(uint32_t *) result = func->number;
|
||||
*(uint32_t *)result = pf->number;
|
||||
break;
|
||||
case PCCARD_IVAR_VENDOR_STR:
|
||||
*(char **) result = sc->card.cis1_info[0];
|
||||
*(const char **)result = sc->card.cis1_info[0];
|
||||
break;
|
||||
case PCCARD_IVAR_PRODUCT_STR:
|
||||
*(char **) result = sc->card.cis1_info[1];
|
||||
*(const char **)result = sc->card.cis1_info[1];
|
||||
break;
|
||||
case PCCARD_IVAR_CIS3_STR:
|
||||
*(char **) result = sc->card.cis1_info[2];
|
||||
*(const char **)result = sc->card.cis1_info[2];
|
||||
break;
|
||||
case PCCARD_IVAR_CIS4_STR:
|
||||
*(char **) result = sc->card.cis1_info[3];
|
||||
*(const char **)result = sc->card.cis1_info[3];
|
||||
break;
|
||||
}
|
||||
return (0);
|
||||
@ -1169,7 +1189,7 @@ static void
|
||||
pccard_child_detached(device_t parent, device_t dev)
|
||||
{
|
||||
struct pccard_ivar *ivar = PCCARD_IVAR(dev);
|
||||
struct pccard_function *pf = ivar->fcn;
|
||||
struct pccard_function *pf = ivar->pf;
|
||||
|
||||
pccard_function_disable(pf);
|
||||
}
|
||||
@ -1215,21 +1235,21 @@ pccard_setup_intr(device_t dev, device_t child, struct resource *irq,
|
||||
{
|
||||
struct pccard_softc *sc = PCCARD_SOFTC(dev);
|
||||
struct pccard_ivar *ivar = PCCARD_IVAR(child);
|
||||
struct pccard_function *func = ivar->fcn;
|
||||
struct pccard_function *pf = ivar->pf;
|
||||
int err;
|
||||
|
||||
if (func->intr_handler != NULL)
|
||||
if (pf->intr_handler != NULL)
|
||||
panic("Only one interrupt handler per function allowed");
|
||||
err = bus_generic_setup_intr(dev, child, irq, flags, pccard_intr,
|
||||
func, cookiep);
|
||||
pf, cookiep);
|
||||
if (err != 0)
|
||||
return (err);
|
||||
func->intr_handler = intr;
|
||||
func->intr_handler_arg = arg;
|
||||
func->intr_handler_cookie = *cookiep;
|
||||
pf->intr_handler = intr;
|
||||
pf->intr_handler_arg = arg;
|
||||
pf->intr_handler_cookie = *cookiep;
|
||||
if (pccard_mfc(sc)) {
|
||||
pccard_ccr_write(func, PCCARD_CCR_OPTION,
|
||||
pccard_ccr_read(func, PCCARD_CCR_OPTION) |
|
||||
pccard_ccr_write(pf, PCCARD_CCR_OPTION,
|
||||
pccard_ccr_read(pf, PCCARD_CCR_OPTION) |
|
||||
PCCARD_CCR_OPTION_IREQ_ENABLE);
|
||||
}
|
||||
return (0);
|
||||
@ -1241,19 +1261,19 @@ pccard_teardown_intr(device_t dev, device_t child, struct resource *r,
|
||||
{
|
||||
struct pccard_softc *sc = PCCARD_SOFTC(dev);
|
||||
struct pccard_ivar *ivar = PCCARD_IVAR(child);
|
||||
struct pccard_function *func = ivar->fcn;
|
||||
struct pccard_function *pf = ivar->pf;
|
||||
int ret;
|
||||
|
||||
if (pccard_mfc(sc)) {
|
||||
pccard_ccr_write(func, PCCARD_CCR_OPTION,
|
||||
pccard_ccr_read(func, PCCARD_CCR_OPTION) &
|
||||
pccard_ccr_write(pf, PCCARD_CCR_OPTION,
|
||||
pccard_ccr_read(pf, PCCARD_CCR_OPTION) &
|
||||
~PCCARD_CCR_OPTION_IREQ_ENABLE);
|
||||
}
|
||||
ret = bus_generic_teardown_intr(dev, child, r, cookie);
|
||||
if (ret == 0) {
|
||||
func->intr_handler = NULL;
|
||||
func->intr_handler_arg = NULL;
|
||||
func->intr_handler_cookie = NULL;
|
||||
pf->intr_handler = NULL;
|
||||
pf->intr_handler_arg = NULL;
|
||||
pf->intr_handler_cookie = NULL;
|
||||
}
|
||||
|
||||
return (ret);
|
||||
@ -1264,7 +1284,7 @@ pccard_activate_resource(device_t brdev, device_t child, int type, int rid,
|
||||
struct resource *r)
|
||||
{
|
||||
struct pccard_ivar *ivar = PCCARD_IVAR(child);
|
||||
struct pccard_function *pf = ivar->fcn;
|
||||
struct pccard_function *pf = ivar->pf;
|
||||
|
||||
switch(type) {
|
||||
case SYS_RES_IOPORT:
|
||||
|
@ -192,7 +192,7 @@ struct pccard_card {
|
||||
/* More later? */
|
||||
struct pccard_ivar {
|
||||
struct resource_list resources;
|
||||
struct pccard_function *fcn;
|
||||
struct pccard_function *pf;
|
||||
};
|
||||
|
||||
struct pccard_softc {
|
||||
|
Loading…
x
Reference in New Issue
Block a user