Messages in this thread Patch in this message |  | | Date | Wed, 23 May 2001 17:53:33 -0500 (CDT) | From | Hal Duston <> | Subject | PS/2 Esdi Patch #6 |
| |
Use information from ADF file to update/correct the driver.
Save POS data. Rewrite /proc entry based on POS data only. (Gleaned from the ADF file.) Correct the I/O region requested. (Also gleaned from the ADF file.)
Also available etc... at http://www.sound.net/~hald/projects/ps2esdi/ps2esdi-2.4.4-patch2
Hal Duston hald@sound.net Use information from ADF file to update/correct the driver.
Save POS data. Rewrite /proc entry based on POS data only. (Gleaned from the ADF file.) Correct the I/O region requested. (Also gleaned from the ADF file.)
--- linux-2.4.5-pre4/drivers/block/ps2esdi.c.1 Mon May 21 00:00:00 2001 +++ linux-2.4.5-pre4/drivers/block/ps2esdi.c.2 Mon May 21 00:03:02 2001 @@ -123,6 +123,7 @@ static struct timer_list esdi_timer = { function: ps2esdi_reset_timer }; static int reset_status; static int ps2esdi_slot = -1; +static u_char ps2esdi_pos[8]; static int tp720esdi = 0; /* Is it Integrated ESDI of ThinkPad-720? */ static int intg_esdi = 0; /* If integrated adapter */ struct ps2esdi_i_struct { @@ -281,11 +282,93 @@ { int len = 0; + if (ps2esdi_pos[0] == 0xff && ps2esdi_pos[1] == 0xdd) { + len += sprintf(buf + len, "Adapter Memory Location: "); + switch(ps2esdi_pos[3] & 0x0f) { + case 0x02: + len += sprintf(buf + len, "Segment C800\n"); + break; + case 0x03: + len += sprintf(buf + len, "Segment CC00\n"); + break; + case 0x04: + len += sprintf(buf + len, "Segment D000\n"); + break; + case 0x05: + len += sprintf(buf + len, "Segment D400\n"); + break; + case 0x06: + len += sprintf(buf + len, "Segment D800\n"); + break; + case 0x07: + len += sprintf(buf + len, "Segment DC00\n"); + break; + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + case 0x0f: + len += sprintf(buf + len, "ROM Disabled\n"); + break; + } + } len += sprintf(buf + len, "DMA Arbitration Level: %d\n", - dma_arb_level); - len += sprintf(buf + len, "IO Port: %x\n", io_base); - len += sprintf(buf + len, "IRQ: 14\n"); - len += sprintf(buf + len, "Drives: %d\n", ps2esdi_drives); + (ps2esdi_pos[2] >> 2) & 0x07); + if (ps2esdi_pos[0] == 0x9f && ps2esdi_pos[1] == 0xdf) { + len += sprintf(buf + len, "DMA Burst Pacing Interval: "); + switch((ps2esdi_pos[3] >> 4) & 0x03) { + case 0x00: + len += sprintf(buf + len, "Burst Disabled\n"); + break; + case 0x01: + len += sprintf(buf + len, "16 Microseconds\n"); + break; + case 0x02: + len += sprintf(buf + len, "24 Microseconds\n"); + break; + case 0x03: + len += sprintf(buf + len, "31 Microseconds\n"); + break; + } + } + else { + len += sprintf(buf + len, "DMA Burst Pacing Length: "); + switch((ps2esdi_pos[3] >> 4) & 0x03) { + case 0x00: + len += sprintf(buf + len, "Burst Disabled\n"); + break; + case 0x01: + len += sprintf(buf + len, "8 Word Burst\n"); + break; + case 0x02: + len += sprintf(buf + len, "16 Word Burst\n"); + break; + case 0x03: + len += sprintf(buf + len, "24 Word Burst\n"); + break; + } + } + len += sprintf(buf + len, "DMA Pacing Control: %s\n", (ps2esdi_pos[4] & 0x01) ? "Disabled" : "Enabled"); + if (ps2esdi_pos[0] == 0x9f && ps2esdi_pos[1] == 0xdf) { + len += sprintf(buf + len, "Time to Release: "); + switch((ps2esdi_pos[4] >> 1) & 0x03) { + case 0x00: + len += sprintf(buf + len, "6 Microseconds\n"); + break; + case 0x01: + len += sprintf(buf + len, "3 Microseconds\n"); + break; + case 0x02: + case 0x03: + len += sprintf(buf + len, "Immediate\n"); + break; + } + } + len += sprintf(buf + len, "Fairness On/Off: %s\n", ((ps2esdi_pos[2] >> 6) & 0x01) ? "On" : "Off"); + len += sprintf(buf + len, "Primary/Alternate Port Addresses: %s\n", ((ps2esdi_pos[2] >> 1) & 0x01) ? "Alternate" : "Primary"); return len; } @@ -307,7 +390,6 @@ */ int slot = 0, i, reset_start, reset_end; - u_char status; unsigned short adapterID; if ((slot = mca_find_adapter(INTG_ESDI_ID, 0)) != MCA_NOTFOUND) { @@ -345,9 +427,11 @@ 0 adapter enable */ - status = mca_read_stored_pos(slot, 2); + for(i = 0; i < 8; ++i) { + ps2esdi_pos[i] = mca_read_stored_pos(slot, i); + } /* is it enabled ? */ - if (!(status & STATUS_ENABLED)) { + if (!(ps2esdi_pos[2] & STATUS_ENABLED)) { printk("%s: ESDI adapter disabled\n", DEVICE_NAME); return; } @@ -361,13 +445,13 @@ printk("%s: Unable to get IRQ %d\n", DEVICE_NAME, PS2ESDI_IRQ); return; } - if (status & STATUS_ALTERNATE) + if (ps2esdi_pos[2] & 0x02) io_base = ALT_IO_BASE; else io_base = PRIMARY_IO_BASE; /* get the dma arbitration level */ - dma_arb_level = (status >> 2) & 0xf; + dma_arb_level = (ps2esdi_pos[2] >> 2) & 0xf; /* BA */ printk("%s: DMA arbitration level : %d\n", @@ -418,7 +502,7 @@ ps2esdi_blocksizes[i] = 1024; request_dma(dma_arb_level, "ed"); - request_region(io_base, 4, "ed"); + request_region(io_base, 8, "ed"); blksize_size[MAJOR_NR] = ps2esdi_blocksizes; for (i = 0; i < ps2esdi_drives; i++) { |  |