summaryrefslogtreecommitdiffstats
path: root/usr.sbin/sysinstall
diff options
context:
space:
mode:
authorjkh <jkh@FreeBSD.org>2000-08-12 07:48:25 +0000
committerjkh <jkh@FreeBSD.org>2000-08-12 07:48:25 +0000
commit0f9d7e675d007edbbc28ad5299e578b24acae95f (patch)
tree4a1ea887dbad9693f26d8b564af63fbfe4f03bba /usr.sbin/sysinstall
parent249914291a3b7b98be9d3515356136857a7f3668 (diff)
downloadFreeBSD-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>
Diffstat (limited to 'usr.sbin/sysinstall')
-rw-r--r--usr.sbin/sysinstall/pccard.c152
1 files changed, 107 insertions, 45 deletions
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;
OpenPOWER on IntegriCloud