Fixed releasing PCI resources after a driver terminates.
This commit is contained in:
parent
ac64c1b3dc
commit
0dc0d3fe5b
3 changed files with 15 additions and 62 deletions
|
@ -11,12 +11,6 @@ main.c
|
|||
|
||||
#define NR_DRIVERS 16
|
||||
|
||||
PRIVATE struct name
|
||||
{
|
||||
char name[M3_STRING];
|
||||
int tasknr;
|
||||
} names[NR_DRIVERS];
|
||||
|
||||
PRIVATE struct acl
|
||||
{
|
||||
int inuse;
|
||||
|
@ -55,9 +49,6 @@ int main(void)
|
|||
|
||||
pci_init();
|
||||
|
||||
for (i= 0; i<NR_DRIVERS; i++)
|
||||
names[i].tasknr= ANY;
|
||||
|
||||
for(;;)
|
||||
{
|
||||
r= receive(ANY, &m);
|
||||
|
@ -118,35 +109,11 @@ PRIVATE void do_sig_handler()
|
|||
PRIVATE void do_init(mp)
|
||||
message *mp;
|
||||
{
|
||||
int i, r, empty;
|
||||
int r;
|
||||
|
||||
#if DEBUG
|
||||
printf("PCI: pci_init: called by '%s'\n", mp->m3_ca1);
|
||||
printf("PCI: pci_init: called by '%d'\n", mp->m_source);
|
||||
#endif
|
||||
empty= -1;
|
||||
for (i= 0; i<NR_DRIVERS; i++)
|
||||
{
|
||||
if (empty == -1 && names[i].tasknr == ANY)
|
||||
empty= i;
|
||||
if (strcmp(names[i].name, mp->m3_ca1) == 0)
|
||||
break;
|
||||
}
|
||||
if (i >= NR_DRIVERS)
|
||||
{
|
||||
if (empty == -1)
|
||||
panic("pci", "do_init: too many clients", NR_DRIVERS);
|
||||
i= empty;
|
||||
strcpy(names[i].name, mp->m3_ca1);
|
||||
}
|
||||
else if (names[i].tasknr == mp->m_source)
|
||||
{
|
||||
/* Ignore all init calls for a process after the first one */
|
||||
}
|
||||
#if 0
|
||||
else
|
||||
pci_release(names[i].name);
|
||||
#endif
|
||||
names[i].tasknr= mp->m_source;
|
||||
|
||||
mp->m_type= 0;
|
||||
r= send(mp->m_source, mp);
|
||||
|
@ -457,6 +424,9 @@ message *mp;
|
|||
printf("do_acl: deleting ACL for %d ('%s') at entry %d\n",
|
||||
acl[i].acl.rsp_endpoint, acl[i].acl.rsp_label, i);
|
||||
|
||||
/* Also release all devices held by this process */
|
||||
pci_release(proc_nr);
|
||||
|
||||
reply(mp, OK);
|
||||
}
|
||||
|
||||
|
@ -465,23 +435,9 @@ message *mp;
|
|||
{
|
||||
int i, r, devind;
|
||||
|
||||
/* Find the name of the caller */
|
||||
for (i= 0; i<NR_DRIVERS; i++)
|
||||
{
|
||||
if (names[i].tasknr == mp->m_source)
|
||||
break;
|
||||
}
|
||||
if (i >= NR_DRIVERS)
|
||||
{
|
||||
printf("pci`do_reserve: task %d did not call pci_init\n",
|
||||
mp->m_source);
|
||||
return;
|
||||
}
|
||||
|
||||
devind= mp->m1_i1;
|
||||
|
||||
|
||||
mp->m_type= pci_reserve3(devind, mp->m_source, names[i].name);
|
||||
mp->m_type= pci_reserve2(devind, mp->m_source);
|
||||
r= send(mp->m_source, mp);
|
||||
if (r != 0)
|
||||
{
|
||||
|
|
|
@ -76,7 +76,9 @@ PRIVATE struct pcidev
|
|||
u16_t pd_vid;
|
||||
u16_t pd_did;
|
||||
u8_t pd_ilr;
|
||||
|
||||
u8_t pd_inuse;
|
||||
endpoint_t pd_proc;
|
||||
|
||||
struct bar
|
||||
{
|
||||
|
@ -86,8 +88,6 @@ PRIVATE struct pcidev
|
|||
u32_t pb_size;
|
||||
} pd_bar[BAM_NR];
|
||||
int pd_bar_nr;
|
||||
|
||||
char pd_name[M3_STRING];
|
||||
} pcidev[NR_PCIDEV];
|
||||
|
||||
/* pb_flags */
|
||||
|
@ -312,10 +312,9 @@ u16_t *didp;
|
|||
/*===========================================================================*
|
||||
* pci_reserve3 *
|
||||
*===========================================================================*/
|
||||
PUBLIC int pci_reserve3(devind, proc, name)
|
||||
PUBLIC int pci_reserve2(devind, proc)
|
||||
int devind;
|
||||
int proc;
|
||||
char *name;
|
||||
{
|
||||
int i, r;
|
||||
u8_t ilr;
|
||||
|
@ -326,7 +325,7 @@ char *name;
|
|||
if(pcidev[devind].pd_inuse)
|
||||
return EBUSY;
|
||||
pcidev[devind].pd_inuse= 1;
|
||||
strcpy(pcidev[devind].pd_name, name);
|
||||
pcidev[devind].pd_proc= proc;
|
||||
|
||||
for (i= 0; i<pcidev[devind].pd_bar_nr; i++)
|
||||
{
|
||||
|
@ -387,12 +386,11 @@ char *name;
|
|||
return OK;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/*===========================================================================*
|
||||
* pci_release *
|
||||
*===========================================================================*/
|
||||
PUBLIC void pci_release(name)
|
||||
char *name;
|
||||
PUBLIC void pci_release(proc)
|
||||
endpoint_t proc;
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -400,12 +398,11 @@ char *name;
|
|||
{
|
||||
if (!pcidev[i].pd_inuse)
|
||||
continue;
|
||||
if (strcmp(pcidev[i].pd_name, name) != 0)
|
||||
if (pcidev[i].pd_proc != proc)
|
||||
continue;
|
||||
pcidev[i].pd_inuse= 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*===========================================================================*
|
||||
* pci_ids *
|
||||
|
|
|
@ -82,8 +82,8 @@ extern struct pci_isabridge pci_isabridge[];
|
|||
extern struct pci_pcibridge pci_pcibridge[];
|
||||
|
||||
/* Utility functions */
|
||||
_PROTOTYPE( int pci_reserve3, (int devind, int proc, char name[M3_STRING]));
|
||||
_PROTOTYPE( void pci_release, (char name[M3_STRING]) );
|
||||
_PROTOTYPE( int pci_reserve2, (int devind, endpoint_t proc) );
|
||||
_PROTOTYPE( void pci_release, (endpoint_t proc) );
|
||||
_PROTOTYPE( int pci_first_dev_a, (struct rs_pci *aclp, int *devindp,
|
||||
u16_t *vidp, u16_t *didp) );
|
||||
_PROTOTYPE( int pci_next_dev_a, (struct rs_pci *aclp, int *devindp,
|
||||
|
|
Loading…
Reference in a new issue