Better handle incorrect io ranges, it should only be fixed for PC (around 0x3f0).
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26055 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -141,6 +141,8 @@ init_driver(void)
|
|||||||
struct floppy *last = NULL;
|
struct floppy *last = NULL;
|
||||||
int flops;
|
int flops;
|
||||||
if ((info.config_status != B_OK) ||
|
if ((info.config_status != B_OK) ||
|
||||||
|
((info.flags & B_DEVICE_INFO_ENABLED) == 0) ||
|
||||||
|
((info.flags & B_DEVICE_INFO_CONFIGURED) == 0) ||
|
||||||
(info.devtype.base != PCI_mass_storage) ||
|
(info.devtype.base != PCI_mass_storage) ||
|
||||||
(info.devtype.subtype != PCI_floppy) ||
|
(info.devtype.subtype != PCI_floppy) ||
|
||||||
(info.devtype.interface != 0) /* XXX: needed ?? */)
|
(info.devtype.interface != 0) /* XXX: needed ?? */)
|
||||||
@@ -157,8 +159,9 @@ init_driver(void)
|
|||||||
}
|
}
|
||||||
master = &(floppies[current]);
|
master = &(floppies[current]);
|
||||||
for (i = 0; i < conf->num_resources; i++) {
|
for (i = 0; i < conf->num_resources; i++) {
|
||||||
if (conf->resources[i].type == B_IO_PORT_RESOURCE)
|
if (conf->resources[i].type == B_IO_PORT_RESOURCE) {
|
||||||
master->iobase = conf->resources[i].d.r.minbase & 0x0FFF8;
|
int32 iobase = conf->resources[i].d.r.minbase;
|
||||||
|
int32 len = conf->resources[i].d.r.len;
|
||||||
/* WTF do I get
|
/* WTF do I get
|
||||||
* min 3f2 max 3f2 align 0 len 4 ?
|
* min 3f2 max 3f2 align 0 len 4 ?
|
||||||
* on my K6-2, I even get 2 bytes at 3f2 + 2 bytes at 3f4 !
|
* on my K6-2, I even get 2 bytes at 3f2 + 2 bytes at 3f4 !
|
||||||
@@ -166,6 +169,19 @@ init_driver(void)
|
|||||||
* answer: because the 8th byte is also for the IDE controller...
|
* answer: because the 8th byte is also for the IDE controller...
|
||||||
* good old PC stuff... PPC here I come !
|
* good old PC stuff... PPC here I come !
|
||||||
*/
|
*/
|
||||||
|
// XXX: maybe we shouldn't use DIGITAL_IN if register window
|
||||||
|
// is only 6 bytes ?
|
||||||
|
if (len != 8) {
|
||||||
|
if ((master->iobase & 0xfffffff8) == 0x3f0)
|
||||||
|
iobase = 0x3f0;
|
||||||
|
else {
|
||||||
|
dprintf(FLO "controller has weird register window len %ld !?\n",
|
||||||
|
len);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
master->iobase = iobase;
|
||||||
|
}
|
||||||
if (conf->resources[i].type == B_IRQ_RESOURCE) {
|
if (conf->resources[i].type == B_IRQ_RESOURCE) {
|
||||||
int val;
|
int val;
|
||||||
for (val = 0; val < 32; val++) {
|
for (val = 0; val < 32; val++) {
|
||||||
|
|||||||
Reference in New Issue
Block a user