rndcontrol doesn't work very well for SMP systems. I have a system here
with IRQs 16 and 18 for Ethernet and SCSI:

fxp0: <Intel EtherExpress Pro 10/100B Ethernet> rev 0x05 int a irq 18 on 
pci0.10.0
ahc0: <Adaptec 2940 Ultra2 SCSI adapter> rev 0x00 int a irq 16 on pci0.12.0

and I'd like to use these with rndcontrol. However, the ioctl chokes on
IRQ >= 16. From i386/i386/mem.c:

        /*
         * XXX the data is 16-bit due to a historical botch, so we use
         * magic 16's instead of ICU_LEN and can't support 24 interrupts
         * under SMP.
         */
        intr = *(int16_t *)data;
        if (cmd != MEM_RETURNIRQ && (intr < 0 || intr >= 16))
                return (EINVAL);

What is needed to make this support a more sensible number of IRQs?


Also, rndcontrol naturally returns an error message, which could have
been better:

        rndcontrol: rndcontrol: Invalid argument

rndcontrol uses warn() with argv[0] as the argument - but warn() is
documented to always print the program name. So it gets doubled. Below
is a patch against 3.2-STABLE to make it slightly more intelligent, so
we get an error message like this instead:

        rndcontrol: setting irq 16: Invalid argument

Steinar Haug, Nethelp consulting, sth...@nethelp.no
----------------------------------------------------------------------
*** rndcontrol.c.orig   Mon Oct 13 13:08:47 1997
--- rndcontrol.c        Thu Jul 22 22:06:52 1999
***************
*** 76,82 ****
                                        printf("%s: setting irq %d\n", argv[0], 
irq);
                                result = ioctl(fd, MEM_SETIRQ, (char *)&irq);
                                if (result == -1) {
!                                       warn("%s", argv[0]);
                                        return (1);
                                }
                                break;
--- 76,82 ----
                                        printf("%s: setting irq %d\n", argv[0], 
irq);
                                result = ioctl(fd, MEM_SETIRQ, (char *)&irq);
                                if (result == -1) {
!                                       warn("setting irq %d", irq);
                                        return (1);
                                }
                                break;
***************
*** 86,92 ****
                                        printf("%s: clearing irq %d\n", 
argv[0], irq);
                                result = ioctl(fd, MEM_CLEARIRQ, (char *)&irq);
                                if (result == -1) {
!                                       warn("%s", argv[0]);
                                        return (1);
                                }
                                break;
--- 86,92 ----
                                        printf("%s: clearing irq %d\n", 
argv[0], irq);
                                result = ioctl(fd, MEM_CLEARIRQ, (char *)&irq);
                                if (result == -1) {
!                                       warn("clearing irq %d", irq);
                                        return (1);
                                }
                                break;
***************
*** 98,104 ****
                if (verbose) {
                        result = ioctl(fd, MEM_RETURNIRQ, (char *)&irq);
                        if (result == -1) {
!                               warn("%s", argv[0]);
                                return (1);
                        }
                        printf("%s: interrupts in use:", argv[0]);
--- 98,104 ----
                if (verbose) {
                        result = ioctl(fd, MEM_RETURNIRQ, (char *)&irq);
                        if (result == -1) {
!                               warn("");
                                return (1);
                        }
                        printf("%s: interrupts in use:", argv[0]);


To Unsubscribe: send mail to majord...@freebsd.org
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to