1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-05 09:14:03 +00:00

Make the selection of pccard IRQs fully selectable at installation time.

Submitted by:	"Sean O'Connell" <sean@stat.Duke.EDU>
This commit is contained in:
Jordan K. Hubbard 2000-08-12 07:48:25 +00:00
parent 9300e1bae2
commit 3fdc3c548d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=64554
2 changed files with 214 additions and 90 deletions

View File

@ -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;

View File

@ -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;