. pci driver now returns devices, even when they have been pci_reserve()d

. pci_reserve() returns an error on devices that have already been reserved,
  instead of panic()ing; the pci_reserve() library call still panics,
  pci_reserve_ok() returns an int.
. this allows at_wini to use the instance value as intended, as all devices
  are seen, even reserved ones
. only devices actually used by at_wini are pci_reserve()d
. pci doesn't release devices based on argv[0], as at_wini both have the
  same name and multiple instances won't work together properly
This commit is contained in:
Ben Gras 2007-02-20 17:09:19 +00:00
parent 825f29fd89
commit 168d766f32
6 changed files with 39 additions and 7 deletions

View file

@ -581,8 +581,6 @@ PRIVATE void init_params_pci(int skip)
else else
continue; /* Unsupported device class */ continue; /* Unsupported device class */
pci_reserve(devind);
/* Found a controller. /* Found a controller.
* Programming interface register tells us more. * Programming interface register tells us more.
*/ */
@ -611,6 +609,12 @@ PRIVATE void init_params_pci(int skip)
skip--; skip--;
continue; continue;
} }
if(pci_reserve_ok(devind) != OK) {
printf("at_wini%d: pci_reserve %d failed - "
"ignoring controller!\n",
w_instance, devind);
continue;
}
if ((s=sys_irqsetpolicy(irq, 0, &irq_hook)) != OK) { if ((s=sys_irqsetpolicy(irq, 0, &irq_hook)) != OK) {
printf("atapci: couldn't set IRQ policy %d\n", irq); printf("atapci: couldn't set IRQ policy %d\n", irq);
continue; continue;

View file

@ -140,8 +140,10 @@ message *mp;
{ {
/* Ignore all init calls for a process after the first one */ /* Ignore all init calls for a process after the first one */
} }
#if 0
else else
pci_release(names[i].name); pci_release(names[i].name);
#endif
names[i].tasknr= mp->m_source; names[i].tasknr= mp->m_source;
mp->m_type= 0; mp->m_type= 0;
@ -440,8 +442,8 @@ message *mp;
devind= mp->m1_i1; devind= mp->m1_i1;
pci_reserve3(devind, mp->m_source, names[i].name);
mp->m_type= OK; mp->m_type= pci_reserve3(devind, mp->m_source, names[i].name);
r= send(mp->m_source, mp); r= send(mp->m_source, mp);
if (r != 0) if (r != 0)
{ {

View file

@ -243,8 +243,10 @@ int *devindp;
} }
if (devind >= nr_pcidev) if (devind >= nr_pcidev)
return 0; return 0;
#if 0
if (pcidev[devind].pd_inuse) if (pcidev[devind].pd_inuse)
return 0; return 0;
#endif
*devindp= devind; *devindp= devind;
return 1; return 1;
} }
@ -262,8 +264,10 @@ u16_t *didp;
for (devind= 0; devind < nr_pcidev; devind++) for (devind= 0; devind < nr_pcidev; devind++)
{ {
#if 0
if (pcidev[devind].pd_inuse) if (pcidev[devind].pd_inuse)
continue; continue;
#endif
if (!visible(aclp, devind)) if (!visible(aclp, devind))
continue; continue;
break; break;
@ -289,8 +293,10 @@ u16_t *didp;
for (devind= *devindp+1; devind < nr_pcidev; devind++) for (devind= *devindp+1; devind < nr_pcidev; devind++)
{ {
#if 0
if (pcidev[devind].pd_inuse) if (pcidev[devind].pd_inuse)
continue; continue;
#endif
if (!visible(aclp, devind)) if (!visible(aclp, devind))
continue; continue;
break; break;
@ -306,7 +312,7 @@ u16_t *didp;
/*===========================================================================* /*===========================================================================*
* pci_reserve3 * * pci_reserve3 *
*===========================================================================*/ *===========================================================================*/
PUBLIC void pci_reserve3(devind, proc, name) PUBLIC int pci_reserve3(devind, proc, name)
int devind; int devind;
int proc; int proc;
char *name; char *name;
@ -317,7 +323,8 @@ char *name;
struct mem_range mr; struct mem_range mr;
assert(devind <= nr_pcidev); assert(devind <= nr_pcidev);
assert(!pcidev[devind].pd_inuse); if(pcidev[devind].pd_inuse)
return EBUSY;
pcidev[devind].pd_inuse= 1; pcidev[devind].pd_inuse= 1;
strcpy(pcidev[devind].pd_name, name); strcpy(pcidev[devind].pd_name, name);
@ -376,8 +383,11 @@ char *name;
proc, r); proc, r);
} }
} }
return OK;
} }
#if 0
/*===========================================================================* /*===========================================================================*
* pci_release * * pci_release *
*===========================================================================*/ *===========================================================================*/
@ -395,6 +405,7 @@ char *name;
pcidev[i].pd_inuse= 0; pcidev[i].pd_inuse= 0;
} }
} }
#endif
/*===========================================================================* /*===========================================================================*
* pci_ids * * pci_ids *

View file

@ -82,7 +82,7 @@ extern struct pci_isabridge pci_isabridge[];
extern struct pci_pcibridge pci_pcibridge[]; extern struct pci_pcibridge pci_pcibridge[];
/* Utility functions */ /* Utility functions */
_PROTOTYPE( void pci_reserve3, (int devind, int proc, char name[M3_STRING])); _PROTOTYPE( int pci_reserve3, (int devind, int proc, char name[M3_STRING]));
_PROTOTYPE( void pci_release, (char name[M3_STRING]) ); _PROTOTYPE( void pci_release, (char name[M3_STRING]) );
_PROTOTYPE( int pci_first_dev_a, (struct rs_pci *aclp, int *devindp, _PROTOTYPE( int pci_first_dev_a, (struct rs_pci *aclp, int *devindp,
u16_t *vidp, u16_t *didp) ); u16_t *vidp, u16_t *didp) );

View file

@ -185,6 +185,7 @@ _PROTOTYPE( int pci_next_dev, (int *devindp, u16_t *vidp, u16_t *didp) );
_PROTOTYPE( int pci_find_dev, (U8_t bus, U8_t dev, U8_t func, _PROTOTYPE( int pci_find_dev, (U8_t bus, U8_t dev, U8_t func,
int *devindp) ); int *devindp) );
_PROTOTYPE( void pci_reserve, (int devind) ); _PROTOTYPE( void pci_reserve, (int devind) );
_PROTOTYPE( int pci_reserve_ok, (int devind) );
_PROTOTYPE( void pci_ids, (int devind, u16_t *vidp, u16_t *didp) ); _PROTOTYPE( void pci_ids, (int devind, u16_t *vidp, u16_t *didp) );
_PROTOTYPE( void pci_rescan_bus, (U8_t busnr) ); _PROTOTYPE( void pci_rescan_bus, (U8_t busnr) );
_PROTOTYPE( u8_t pci_attr_r8, (int devind, int port) ); _PROTOTYPE( u8_t pci_attr_r8, (int devind, int port) );

View file

@ -26,3 +26,17 @@ int devind;
panic("pci", "pci_reserve: got bad reply from PCI", m.m_type); panic("pci", "pci_reserve: got bad reply from PCI", m.m_type);
} }
/*===========================================================================*
* pci_reserve_ok *
*===========================================================================*/
PUBLIC int pci_reserve_ok(devind)
int devind;
{
int r;
message m;
m.m1_i1= devind;
return(_taskcall(pci_procnr, BUSC_PCI_RESERVE, &m));
}