diff options
author | jkh <jkh@FreeBSD.org> | 2000-08-12 07:48:25 +0000 |
---|---|---|
committer | jkh <jkh@FreeBSD.org> | 2000-08-12 07:48:25 +0000 |
commit | 0f9d7e675d007edbbc28ad5299e578b24acae95f (patch) | |
tree | 4a1ea887dbad9693f26d8b564af63fbfe4f03bba | |
parent | 249914291a3b7b98be9d3515356136857a7f3668 (diff) | |
download | FreeBSD-src-0f9d7e675d007edbbc28ad5299e578b24acae95f.zip FreeBSD-src-0f9d7e675d007edbbc28ad5299e578b24acae95f.tar.gz |
Make the selection of pccard IRQs fully selectable at installation time.
Submitted by: "Sean O'Connell" <sean@stat.Duke.EDU>
-rw-r--r-- | release/sysinstall/pccard.c | 152 | ||||
-rw-r--r-- | usr.sbin/sysinstall/pccard.c | 152 |
2 files changed, 214 insertions, 90 deletions
diff --git a/release/sysinstall/pccard.c b/release/sysinstall/pccard.c index 5ad1967..bce9231e 100644 --- a/release/sysinstall/pccard.c +++ b/release/sysinstall/pccard.c @@ -21,6 +21,56 @@ int pccard_mode = 0; +/* + * Set up defines for pccardd interrupt selection. + */ +#define IRQ_COUNT 9 +#define IRQ_10 0x00001 +#define IRQ_11 0x00002 +#define IRQ_03 0x00004 +#define IRQ_09 0x00008 +#define IRQ_04 0x00010 +#define IRQ_07 0x00020 +#define IRQ_05 0x00040 +#define IRQ_06 0x00080 +#define IRQ_15 0x00100 + +unsigned int CardIrq; + +typedef struct _irq { + char *my_name; + char *my_flag; + unsigned int my_mask; + unsigned int my_bit; +} Irq; + +/* Fill in with potential free IRQs for pccardd */ +static Irq IrqTable[] = { + { "irq_03", "-i 3", ~IRQ_03, IRQ_03 }, + { "irq_04", "-i 4", ~IRQ_04, IRQ_04 }, + { "irq_05", "-i 5", ~IRQ_05, IRQ_05 }, + { "irq_06", "-i 6", ~IRQ_06, IRQ_06 }, + { "irq_07", "-i 7", ~IRQ_07, IRQ_07 }, + { "irq_09", "-i 9", ~IRQ_09, IRQ_09 }, + { "irq_10", "-i 10", ~IRQ_10, IRQ_10 }, + { "irq_11", "-i 11", ~IRQ_11, IRQ_11 }, + { "irq_15", "-i 15", ~IRQ_15, IRQ_15 }, + {NULL}, +}; + +int +pccardIrqReset(dialogMenuItem *self) +{ + CardIrq = 0; + return DITEM_SUCCESS | DITEM_REDRAW; +} + +static int +checkTrue(dialogMenuItem *item) +{ + return TRUE; +} + DMenu MenuPCICMem = { DMENU_NORMAL_TYPE | DMENU_SELECTION_RETURNS, "Please select free address area used by PC-card controller", @@ -30,33 +80,51 @@ DMenu MenuPCICMem = { "leave it untouched (default == 0xd0000).", "Press F1 for more HELP", "pccard", - { { "Default", "I/O address 0xd0000 - 0xd3fff", - NULL, dmenuSetVariable, NULL, "_pcicmem=0"}, - { "D4", "I/O address 0xd4000 - 0xd7fff", - NULL, dmenuSetVariable, NULL, "_pcicmem=1"}, - { "D8", "I/O address 0xd8000 - 0xdbfff", - NULL, dmenuSetVariable, NULL, "_pcicmem=2"}, - { "DC", "I/O address 0xdc000 - 0xdffff", - NULL, dmenuSetVariable, NULL, "_pcicmem=3"}, - { NULL } }, + { { "Default", "I/O address 0xd0000 - 0xd3fff", + NULL, dmenuSetVariable, NULL, "_pcicmem=0"}, + { "D4", "I/O address 0xd4000 - 0xd7fff", + NULL, dmenuSetVariable, NULL, "_pcicmem=1"}, + { "D8", "I/O address 0xd8000 - 0xdbfff", + NULL, dmenuSetVariable, NULL, "_pcicmem=2"}, + { "DC", "I/O address 0xdc000 - 0xdffff", + NULL, dmenuSetVariable, NULL, "_pcicmem=3"}, + { NULL } }, }; DMenu MenuCardIRQ = { - DMENU_NORMAL_TYPE | DMENU_SELECTION_RETURNS, - "Please select IRQs that can be used by PC-cards", - "Please specify IRQs that CAN be used by PC-card.\n" - "For example, if you have a sound card that can't be probed by\n" - "this installation floppy and it uses IRQ 10, you have to \n" - "choose \"Option 1\" or \"Option 2\" at this menu.\n", - "Press F1 for more HELP", - "pccard", - { { "Default", "IRQ 10, 11", - NULL, dmenuSetVariable, NULL, "_cardirq=0"}, - { "Option 1", "IRQ 5, 11 (ex. soundcard on IRQ 10)", - NULL, dmenuSetVariable, NULL, "_cardirq=1"}, - { "Option 2", "IRQ 11 (ex. something on IRQ 5 and 10)", - NULL, dmenuSetVariable, NULL, "_cardirq=2"}, - { NULL } }, + DMENU_CHECKLIST_TYPE | DMENU_SELECTION_RETURNS, + "Please specify the IRQs that may be used by PC-Cards", + "(NOTE: remove any cards that will NOT be used for installation).\n" + "The IRQs that you choose must be free (unshared), or you risk \n" + "subpar performance and/or a complete system lockup (choose wisely).\n" + "One way to determine which IRQs are available is to \"cheat\" and\n" + "use the Windows 9x/2000 Device Manager as a reference prior to the\n" + "installation.\n", + "Select Free IRQ for PC-Cardd", + NULL, + { { "X Exit", "Exit this menu", + checkTrue, dmenuExit, NULL, NULL, '<', '<', '<' }, + { "Reset", "Reset selected IRQ list", + NULL, pccardIrqReset, NULL, NULL, ' ', ' ', ' ' }, + { "3 IRQ 10", "IRQ 10 is often free (verify in BIOS)", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_10 }, + { "4 IRQ 11", "Verify IRQ 11 is not being used as PCI shared interrupt", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_11 }, + { "5 IRQ 3", "IRQ 3 is often free in most laptops", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_03 }, + { "6 IRQ 9", "IRQ 9 may be used by video or sound or USB", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_09 }, + { "7 IRQ 4", "IRQ 4, usually COM1 (disable in BIOS to make free)", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_04 }, + { "8 IRQ 7", "IRQ 7, usually LPT1 (disable in BIOS to make free)", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_07 }, + { "9 IRQ 5", "IRQ 5, usually ISA Audio (disable in BIOS to make free)", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_05 }, + { "10 IRQ 15", "IRQ 15, usually Secondary IDE channel", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_15 }, + { "11 IRQ 6", "IRQ 6 will be free if laptop only has USB floppy drive", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_06 }, + { NULL } }, }; void @@ -64,11 +132,12 @@ pccardInitialize(void) { int fd; int t; + int i; int pcic_mem = 0xd0000; char card_device[16]; char *card_irq = ""; + char temp[256]; char *spcic_mem; - char *scard_irq; char pccardd_cmd[256]; WINDOW *w; @@ -82,12 +151,11 @@ pccardInitialize(void) sprintf(card_device, CARD_DEVICE, 0); if ((fd = open(card_device, O_RDWR)) < 0) { - msgDebug("Can't open PC-card controller %s.\n", - card_device); + msgDebug("Can't open PC-card controller %s.\n", card_device); return; } else if (msgYesNo("Found PC-card slot(s).\n" - "Use PC-card device as installation media?\n")) { + "Use PC-card device as installation media?\n")) { return; } close(fd); @@ -97,7 +165,6 @@ pccardInitialize(void) dmenuOpenSimple(&MenuPCICMem, FALSE); spcic_mem = variable_get("_pcicmem"); dmenuOpenSimple(&MenuCardIRQ, FALSE); - scard_irq = variable_get("_cardirq"); sscanf(spcic_mem, "%d", &t); switch (t) { @@ -119,18 +186,14 @@ pccardInitialize(void) break; } - sscanf(scard_irq, "%d", &t); - - switch (t) { - case 0: - card_irq = "-i 10 -i 11"; - break; - case 1: - card_irq = "-i 5 -i 11"; - break; - case 2: - card_irq = "-i 11"; - break; + /* get card_irq out of CardIrq somehow */ + if (CardIrq) { + for (i = 0; i < IRQ_COUNT; i++) { + if ((CardIrq & IrqTable[i].my_bit) != 0) { + sprintf(temp, "%s %s", card_irq, IrqTable[i].my_flag); + variable_set2("card_irq", temp, 1); + } + } } w = savescr(); @@ -146,16 +209,15 @@ pccardInitialize(void) dialog_clear(); msgNotify("Initializing PC-card controller...."); - + if (!Fake) { if ((fd = open(card_device, O_RDWR)) < 1) { - msgNotify("Can't open PC-card controller %s.\n", - card_device); + msgNotify("Can't open PC-card controller %s.\n", card_device); restorescr(w); return; } - if (ioctl(fd, PIOCRWMEM, &pcic_mem) < 0){ + if (ioctl(fd, PIOCRWMEM, &pcic_mem) < 0) { msgNotify("ioctl %s failed.\n", card_device); restorescr(w); return; diff --git a/usr.sbin/sysinstall/pccard.c b/usr.sbin/sysinstall/pccard.c index 5ad1967..bce9231e 100644 --- a/usr.sbin/sysinstall/pccard.c +++ b/usr.sbin/sysinstall/pccard.c @@ -21,6 +21,56 @@ int pccard_mode = 0; +/* + * Set up defines for pccardd interrupt selection. + */ +#define IRQ_COUNT 9 +#define IRQ_10 0x00001 +#define IRQ_11 0x00002 +#define IRQ_03 0x00004 +#define IRQ_09 0x00008 +#define IRQ_04 0x00010 +#define IRQ_07 0x00020 +#define IRQ_05 0x00040 +#define IRQ_06 0x00080 +#define IRQ_15 0x00100 + +unsigned int CardIrq; + +typedef struct _irq { + char *my_name; + char *my_flag; + unsigned int my_mask; + unsigned int my_bit; +} Irq; + +/* Fill in with potential free IRQs for pccardd */ +static Irq IrqTable[] = { + { "irq_03", "-i 3", ~IRQ_03, IRQ_03 }, + { "irq_04", "-i 4", ~IRQ_04, IRQ_04 }, + { "irq_05", "-i 5", ~IRQ_05, IRQ_05 }, + { "irq_06", "-i 6", ~IRQ_06, IRQ_06 }, + { "irq_07", "-i 7", ~IRQ_07, IRQ_07 }, + { "irq_09", "-i 9", ~IRQ_09, IRQ_09 }, + { "irq_10", "-i 10", ~IRQ_10, IRQ_10 }, + { "irq_11", "-i 11", ~IRQ_11, IRQ_11 }, + { "irq_15", "-i 15", ~IRQ_15, IRQ_15 }, + {NULL}, +}; + +int +pccardIrqReset(dialogMenuItem *self) +{ + CardIrq = 0; + return DITEM_SUCCESS | DITEM_REDRAW; +} + +static int +checkTrue(dialogMenuItem *item) +{ + return TRUE; +} + DMenu MenuPCICMem = { DMENU_NORMAL_TYPE | DMENU_SELECTION_RETURNS, "Please select free address area used by PC-card controller", @@ -30,33 +80,51 @@ DMenu MenuPCICMem = { "leave it untouched (default == 0xd0000).", "Press F1 for more HELP", "pccard", - { { "Default", "I/O address 0xd0000 - 0xd3fff", - NULL, dmenuSetVariable, NULL, "_pcicmem=0"}, - { "D4", "I/O address 0xd4000 - 0xd7fff", - NULL, dmenuSetVariable, NULL, "_pcicmem=1"}, - { "D8", "I/O address 0xd8000 - 0xdbfff", - NULL, dmenuSetVariable, NULL, "_pcicmem=2"}, - { "DC", "I/O address 0xdc000 - 0xdffff", - NULL, dmenuSetVariable, NULL, "_pcicmem=3"}, - { NULL } }, + { { "Default", "I/O address 0xd0000 - 0xd3fff", + NULL, dmenuSetVariable, NULL, "_pcicmem=0"}, + { "D4", "I/O address 0xd4000 - 0xd7fff", + NULL, dmenuSetVariable, NULL, "_pcicmem=1"}, + { "D8", "I/O address 0xd8000 - 0xdbfff", + NULL, dmenuSetVariable, NULL, "_pcicmem=2"}, + { "DC", "I/O address 0xdc000 - 0xdffff", + NULL, dmenuSetVariable, NULL, "_pcicmem=3"}, + { NULL } }, }; DMenu MenuCardIRQ = { - DMENU_NORMAL_TYPE | DMENU_SELECTION_RETURNS, - "Please select IRQs that can be used by PC-cards", - "Please specify IRQs that CAN be used by PC-card.\n" - "For example, if you have a sound card that can't be probed by\n" - "this installation floppy and it uses IRQ 10, you have to \n" - "choose \"Option 1\" or \"Option 2\" at this menu.\n", - "Press F1 for more HELP", - "pccard", - { { "Default", "IRQ 10, 11", - NULL, dmenuSetVariable, NULL, "_cardirq=0"}, - { "Option 1", "IRQ 5, 11 (ex. soundcard on IRQ 10)", - NULL, dmenuSetVariable, NULL, "_cardirq=1"}, - { "Option 2", "IRQ 11 (ex. something on IRQ 5 and 10)", - NULL, dmenuSetVariable, NULL, "_cardirq=2"}, - { NULL } }, + DMENU_CHECKLIST_TYPE | DMENU_SELECTION_RETURNS, + "Please specify the IRQs that may be used by PC-Cards", + "(NOTE: remove any cards that will NOT be used for installation).\n" + "The IRQs that you choose must be free (unshared), or you risk \n" + "subpar performance and/or a complete system lockup (choose wisely).\n" + "One way to determine which IRQs are available is to \"cheat\" and\n" + "use the Windows 9x/2000 Device Manager as a reference prior to the\n" + "installation.\n", + "Select Free IRQ for PC-Cardd", + NULL, + { { "X Exit", "Exit this menu", + checkTrue, dmenuExit, NULL, NULL, '<', '<', '<' }, + { "Reset", "Reset selected IRQ list", + NULL, pccardIrqReset, NULL, NULL, ' ', ' ', ' ' }, + { "3 IRQ 10", "IRQ 10 is often free (verify in BIOS)", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_10 }, + { "4 IRQ 11", "Verify IRQ 11 is not being used as PCI shared interrupt", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_11 }, + { "5 IRQ 3", "IRQ 3 is often free in most laptops", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_03 }, + { "6 IRQ 9", "IRQ 9 may be used by video or sound or USB", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_09 }, + { "7 IRQ 4", "IRQ 4, usually COM1 (disable in BIOS to make free)", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_04 }, + { "8 IRQ 7", "IRQ 7, usually LPT1 (disable in BIOS to make free)", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_07 }, + { "9 IRQ 5", "IRQ 5, usually ISA Audio (disable in BIOS to make free)", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_05 }, + { "10 IRQ 15", "IRQ 15, usually Secondary IDE channel", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_15 }, + { "11 IRQ 6", "IRQ 6 will be free if laptop only has USB floppy drive", + dmenuFlagCheck, dmenuSetFlag, NULL, &CardIrq, '[', 'X', ']', IRQ_06 }, + { NULL } }, }; void @@ -64,11 +132,12 @@ pccardInitialize(void) { int fd; int t; + int i; int pcic_mem = 0xd0000; char card_device[16]; char *card_irq = ""; + char temp[256]; char *spcic_mem; - char *scard_irq; char pccardd_cmd[256]; WINDOW *w; @@ -82,12 +151,11 @@ pccardInitialize(void) sprintf(card_device, CARD_DEVICE, 0); if ((fd = open(card_device, O_RDWR)) < 0) { - msgDebug("Can't open PC-card controller %s.\n", - card_device); + msgDebug("Can't open PC-card controller %s.\n", card_device); return; } else if (msgYesNo("Found PC-card slot(s).\n" - "Use PC-card device as installation media?\n")) { + "Use PC-card device as installation media?\n")) { return; } close(fd); @@ -97,7 +165,6 @@ pccardInitialize(void) dmenuOpenSimple(&MenuPCICMem, FALSE); spcic_mem = variable_get("_pcicmem"); dmenuOpenSimple(&MenuCardIRQ, FALSE); - scard_irq = variable_get("_cardirq"); sscanf(spcic_mem, "%d", &t); switch (t) { @@ -119,18 +186,14 @@ pccardInitialize(void) break; } - sscanf(scard_irq, "%d", &t); - - switch (t) { - case 0: - card_irq = "-i 10 -i 11"; - break; - case 1: - card_irq = "-i 5 -i 11"; - break; - case 2: - card_irq = "-i 11"; - break; + /* get card_irq out of CardIrq somehow */ + if (CardIrq) { + for (i = 0; i < IRQ_COUNT; i++) { + if ((CardIrq & IrqTable[i].my_bit) != 0) { + sprintf(temp, "%s %s", card_irq, IrqTable[i].my_flag); + variable_set2("card_irq", temp, 1); + } + } } w = savescr(); @@ -146,16 +209,15 @@ pccardInitialize(void) dialog_clear(); msgNotify("Initializing PC-card controller...."); - + if (!Fake) { if ((fd = open(card_device, O_RDWR)) < 1) { - msgNotify("Can't open PC-card controller %s.\n", - card_device); + msgNotify("Can't open PC-card controller %s.\n", card_device); restorescr(w); return; } - if (ioctl(fd, PIOCRWMEM, &pcic_mem) < 0){ + if (ioctl(fd, PIOCRWMEM, &pcic_mem) < 0) { msgNotify("ioctl %s failed.\n", card_device); restorescr(w); return; |