]> Zhao Yanbai Git Server - minix.git/commitdiff
. pci driver now returns devices, even when they have been pci_reserve()d
authorBen Gras <ben@minix3.org>
Tue, 20 Feb 2007 17:09:19 +0000 (17:09 +0000)
committerBen Gras <ben@minix3.org>
Tue, 20 Feb 2007 17:09:19 +0000 (17:09 +0000)
. 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

drivers/at_wini/at_wini.c
drivers/pci/main.c
drivers/pci/pci.c
drivers/pci/pci.h
include/minix/syslib.h
lib/syslib/pci_reserve.c

index 353632dd4ab54c04c05f586f0c4142a1b01c5ed6..5a8acb839a2c8863d0c75e8feba10c967db4fffd 100644 (file)
@@ -581,8 +581,6 @@ PRIVATE void init_params_pci(int skip)
        else
                continue;       /* Unsupported device class */
 
-       pci_reserve(devind);
-
        /* Found a controller.
         * Programming interface register tells us more.
         */
@@ -611,6 +609,12 @@ PRIVATE void init_params_pci(int skip)
                        skip--;
                        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) {
                        printf("atapci: couldn't set IRQ policy %d\n", irq);
                        continue;
index 03b417beb38e51cc0b67a6fa7b6e21ddc3b9cb70..9283e46176dd81e69dc4544387f8278998f0bef9 100644 (file)
@@ -140,8 +140,10 @@ message *mp;
        {
                /* 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;
@@ -440,8 +442,8 @@ message *mp;
 
        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);
        if (r != 0)
        {
index 5cd173a272647d5b45a5ac243df8016b8fd95bfa..929c9d27b87e0e48d573356fb8e856fcada6b1c6 100644 (file)
@@ -243,8 +243,10 @@ int *devindp;
        }
        if (devind >= nr_pcidev)
                return 0;
+#if 0
        if (pcidev[devind].pd_inuse)
                return 0;
+#endif
        *devindp= devind;
        return 1;
 }
@@ -262,8 +264,10 @@ u16_t *didp;
 
        for (devind= 0; devind < nr_pcidev; devind++)
        {
+#if 0
                if (pcidev[devind].pd_inuse)
                        continue;
+#endif
                if (!visible(aclp, devind))
                        continue;
                break;
@@ -289,8 +293,10 @@ u16_t *didp;
 
        for (devind= *devindp+1; devind < nr_pcidev; devind++)
        {
+#if 0
                if (pcidev[devind].pd_inuse)
                        continue;
+#endif
                if (!visible(aclp, devind))
                        continue;
                break;
@@ -306,7 +312,7 @@ u16_t *didp;
 /*===========================================================================*
  *                             pci_reserve3                                 *
  *===========================================================================*/
-PUBLIC void pci_reserve3(devind, proc, name)
+PUBLIC int pci_reserve3(devind, proc, name)
 int devind;
 int proc;
 char *name;
@@ -317,7 +323,8 @@ char *name;
        struct mem_range mr;
 
        assert(devind <= nr_pcidev);
-       assert(!pcidev[devind].pd_inuse);
+       if(pcidev[devind].pd_inuse)
+               return EBUSY;
        pcidev[devind].pd_inuse= 1;
        strcpy(pcidev[devind].pd_name, name);
 
@@ -376,8 +383,11 @@ char *name;
                                proc, r);
                }
        }
+
+       return OK;
 }
 
+#if 0
 /*===========================================================================*
  *                             pci_release                                  *
  *===========================================================================*/
@@ -395,6 +405,7 @@ char *name;
                pcidev[i].pd_inuse= 0;
        }
 }
+#endif
 
 /*===========================================================================*
  *                             pci_ids                                      *
index 898090484a383dd78cf8f0d2a370643f6d21ee72..b20942659b95918bbcd5e62f58b5f700d3e4f23c 100644 (file)
@@ -82,7 +82,7 @@ extern struct pci_isabridge pci_isabridge[];
 extern struct pci_pcibridge pci_pcibridge[];
 
 /* 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( int pci_first_dev_a, (struct rs_pci *aclp, int *devindp,
                                        u16_t *vidp, u16_t *didp)       );
index 9eeb93a03fe473c7958f17c94de576bd3eb090cc..dddd916df33a97621279eb99bab3a86f8d3a52ab 100755 (executable)
@@ -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,
                                                        int *devindp)   );
 _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_rescan_bus, (U8_t busnr)                          );
 _PROTOTYPE( u8_t pci_attr_r8, (int devind, int port)                   );
index 84d7ad0d1baa9e2a6c0355e630f94ba95bd8b5c4..3c0941ad0fbbf0ce1d3b9099c69ef84851a71f6e 100644 (file)
@@ -26,3 +26,17 @@ int devind;
                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));
+}
+