mirror of
https://git.hardenedbsd.org/hardenedbsd/HardenedBSD.git
synced 2024-12-30 15:38:06 +01:00
1) Fixed irq logic so that it uses the kernel configured irq if it doesn't
match the board setting. 2) Fixed the warning message to properly print the irq mismatch (as opposed to the bit encoded value). 3) Add irq autodetection if the kernel has "?" or no irq specified. 4) Add missing splimp protection in ixioctl().
This commit is contained in:
parent
f2caf6f548
commit
edeea08413
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=11195
@ -28,7 +28,7 @@
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Id: if_ix.c,v 1.7 1995/05/30 08:02:15 rgrimes Exp $
|
||||
* $Id: if_ix.c,v 1.8 1995/09/19 18:55:11 bde Exp $
|
||||
*/
|
||||
|
||||
#include "ix.h"
|
||||
@ -318,6 +318,7 @@ ixprobe(struct isa_device *dvp) {
|
||||
/* ZZZ irq_translate should really be unsigned, but until
|
||||
* isa_device.h and all uses are fixed we have to live with it */
|
||||
short irq_translate[] = {0, IRQ9, IRQ3, IRQ4, IRQ5, IRQ10, IRQ11, 0};
|
||||
char irq_encode[] = { 0, 0, 0, 2, 3, 4, 0, 0, 0, 1, 5, 6, 0, 0, 0, 0 };
|
||||
|
||||
DEBUGBEGIN(DEBUGPROBE)
|
||||
DEBUGDO(printf ("ixprobe:");)
|
||||
@ -498,10 +499,20 @@ ixprobe(struct isa_device *dvp) {
|
||||
*/
|
||||
irq = ixeeprom_read(unit, eeprom_config1);
|
||||
irq = (irq & IRQ) >> IRQ_SHIFT;
|
||||
sc->irq_encoded = irq;
|
||||
irq = irq_translate[irq];
|
||||
if (irq != dvp->id_irq) {
|
||||
printf("Warning board is configured for IRQ %d\n", irq);
|
||||
if (dvp->id_irq > 0) {
|
||||
if (irq != dvp->id_irq) {
|
||||
printf("ix%d: WARNING: board is configured for IRQ %d, using %d\n",
|
||||
unit, ffs(irq) - 1, ffs(dvp->id_irq) - 1);
|
||||
irq = dvp->id_irq;
|
||||
}
|
||||
} else {
|
||||
dvp->id_irq = irq;
|
||||
}
|
||||
sc->irq_encoded = irq_encode[ffs(irq) - 1];
|
||||
if (sc->irq_encoded == 0) {
|
||||
printf("ix%d: invalid irq (%d)\n", ffs(irq) - 1);
|
||||
goto ixprobe_exit;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1516,13 +1527,16 @@ int
|
||||
ixioctl(struct ifnet *ifp, int cmd, caddr_t data) {
|
||||
int unit = ifp->if_unit;
|
||||
int status = 0;
|
||||
int s;
|
||||
ix_softc_t *sc = &ix_softc[unit];
|
||||
|
||||
DEBUGBEGIN(DEBUGIOCTL)
|
||||
DEBUGDO(printf("ixioctl:");)
|
||||
DEBUGEND
|
||||
switch(cmd) {
|
||||
|
||||
s = splimp();
|
||||
|
||||
switch(cmd) {
|
||||
case SIOCSIFADDR: {
|
||||
struct ifaddr *ifa = (struct ifaddr *)data;
|
||||
|
||||
@ -1574,6 +1588,7 @@ ixioctl(struct ifnet *ifp, int cmd, caddr_t data) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
splx(s);
|
||||
|
||||
DEBUGBEGIN(DEBUGIOCTL)
|
||||
DEBUGDO(printf("ixioctl exit\n");)
|
||||
|
Loading…
Reference in New Issue
Block a user