]>
Commit | Line | Data |
---|---|---|
d63719e5 | 1 | diff -urN linux-2.6.16.16/drivers/scsi/libata-core.c mod/drivers/scsi/libata-core.c |
2 | --- linux-2.6.16.16/drivers/scsi/libata-core.c 2006-05-11 03:56:24.000000000 +0200 | |
3 | +++ mod/drivers/scsi/libata-core.c 2006-05-20 03:14:57.165778500 +0200 | |
4 | @@ -4431,6 +4431,7 @@ | |
5 | ap->mwdma_mask = ent->mwdma_mask; | |
6 | ap->udma_mask = ent->udma_mask; | |
7 | ap->flags |= ent->host_flags; | |
8 | + ap->flags |= ent->port_flags[port_no]; /* pata fix */ | |
9 | ap->ops = ent->port_ops; | |
10 | ap->cbl = ATA_CBL_NONE; | |
11 | ap->active_tag = ATA_TAG_POISON; | |
12 | diff -urN linux-2.6.16.16/drivers/scsi/sata_promise.c mod/drivers/scsi/sata_promise.c | |
13 | --- linux-2.6.16.16/drivers/scsi/sata_promise.c 2006-05-11 03:56:24.000000000 +0200 | |
14 | +++ mod/drivers/scsi/sata_promise.c 2006-05-20 03:29:36.708746500 +0200 | |
15 | @@ -165,7 +165,7 @@ | |
16 | /* board_2037x */ | |
17 | { | |
18 | .sht = &pdc_ata_sht, | |
19 | - .host_flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA, | |
20 | + .host_flags = PDC_COMMON_FLAGS /* | ATA_FLAG_SATA */, /* pata fix */ | |
21 | .pio_mask = 0x1f, /* pio0-4 */ | |
22 | .mwdma_mask = 0x07, /* mwdma0-2 */ | |
23 | .udma_mask = 0x7f, /* udma0-6 ; FIXME */ | |
24 | @@ -322,15 +322,34 @@ | |
25 | ||
26 | static void pdc_sata_phy_reset(struct ata_port *ap) | |
27 | { | |
28 | - pdc_reset_port(ap); | |
29 | - sata_phy_reset(ap); | |
30 | +/* pdc_reset_port(ap); */ /* pata fix */ | |
31 | +/* sata_phy_reset(ap); */ /* pata fix */ | |
32 | + /* if no sata flag, test for pata drive */ /* pata fix */ | |
33 | + if (ap->flags & ATA_FLAG_SATA) /* pata fix */ | |
34 | + { /* pata fix */ | |
35 | + pdc_reset_port(ap); /* pata fix */ | |
36 | + sata_phy_reset(ap); /* pata fix */ | |
37 | + } /* pata fix */ | |
38 | + else /* pata fix */ | |
39 | + pdc_pata_phy_reset(ap); /* pata fix */ | |
40 | } | |
41 | ||
42 | static void pdc_pata_phy_reset(struct ata_port *ap) | |
43 | { | |
44 | /* FIXME: add cable detect. Don't assume 40-pin cable */ | |
45 | - ap->cbl = ATA_CBL_PATA40; | |
46 | - ap->udma_mask &= ATA_UDMA_MASK_40C; | |
47 | +/* ap->cbl = ATA_CBL_PATA40; */ /* pata fix */ | |
48 | +/* ap->udma_mask &= ATA_UDMA_MASK_40C; */ /* pata fix */ | |
49 | + /* add cable detection code for pata drives */ /* pata fix */ | |
50 | + u8 tmp; /* pata fix */ | |
51 | + void *mmio = (void *) ap->ioaddr.cmd_addr + PDC_CTLSTAT + 0x03; /* pata fix */ | |
52 | + tmp = readb(mmio); /* pata fix */ | |
53 | + if (tmp & 0x01) /* pata fix */ | |
54 | + { /* pata fix */ | |
55 | + ap->cbl = ATA_CBL_PATA40; /* pata fix */ | |
56 | + ap->udma_mask &= ATA_UDMA_MASK_40C; /* pata fix */ | |
57 | + } /* pata fix */ | |
58 | + else /* pata fix */ | |
59 | + ap->cbl = ATA_CBL_PATA80; /* pata fix */ | |
60 | ||
61 | pdc_reset_port(ap); | |
62 | ata_port_probe(ap); | |
63 | @@ -646,6 +665,7 @@ | |
64 | unsigned int board_idx = (unsigned int) ent->driver_data; | |
65 | int pci_dev_busy = 0; | |
66 | int rc; | |
67 | + u8 tmp; /* pata fix */ | |
68 | ||
69 | if (!printed_version++) | |
70 | dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); | |
71 | @@ -705,6 +725,9 @@ | |
72 | probe_ent->port[0].scr_addr = base + 0x400; | |
73 | probe_ent->port[1].scr_addr = base + 0x500; | |
74 | ||
75 | + probe_ent->port_flags[0] = ATA_FLAG_SATA; /* pata fix */ | |
76 | + probe_ent->port_flags[1] = ATA_FLAG_SATA; /* pata fix */ | |
77 | + | |
78 | /* notice 4-port boards */ | |
79 | switch (board_idx) { | |
80 | case board_20319: | |
81 | @@ -715,9 +738,25 @@ | |
82 | ||
83 | probe_ent->port[2].scr_addr = base + 0x600; | |
84 | probe_ent->port[3].scr_addr = base + 0x700; | |
85 | + | |
86 | + probe_ent->port_flags[2] = ATA_FLAG_SATA; /* pata fix */ | |
87 | + probe_ent->port_flags[3] = ATA_FLAG_SATA; /* pata fix */ | |
88 | break; | |
89 | case board_2037x: | |
90 | - probe_ent->n_ports = 2; | |
91 | +/* probe_ent->n_ports = 2; */ /* pata fix */ | |
92 | +/* Some boards have also PATA port */ /* pata fix */ | |
93 | + | |
94 | + tmp = readb(mmio_base + PDC_FLASH_CTL+1); /* pata fix */ | |
95 | + if (!(tmp & 0x80)) /* pata fix */ | |
96 | + { /* pata fix */ | |
97 | + probe_ent->n_ports = 3; /* pata fix */ | |
98 | + pdc_ata_setup_port(&probe_ent->port[2], base + 0x300); /* pata fix */ | |
99 | + probe_ent->port_flags[2] = ATA_FLAG_SLAVE_POSS; /* pata fix */ | |
100 | + printk(KERN_INFO DRV_NAME " PATA port found\n"); /* pata fix */ | |
101 | + } /* pata fix */ | |
102 | + else /* pata fix */ | |
103 | + probe_ent->n_ports = 2; /* pata fix */ | |
104 | + | |
105 | break; | |
106 | case board_20771: | |
107 | probe_ent->n_ports = 2; | |
108 | @@ -730,6 +769,9 @@ | |
109 | ||
110 | probe_ent->port[2].scr_addr = base + 0x600; | |
111 | probe_ent->port[3].scr_addr = base + 0x700; | |
112 | + | |
113 | + probe_ent->port_flags[2] = ATA_FLAG_SATA; /* pata fix */ | |
114 | + probe_ent->port_flags[3] = ATA_FLAG_SATA; /* pata fix */ | |
115 | break; | |
116 | default: | |
117 | BUG(); | |
118 | diff -urN linux-2.6.16.16/include/linux/libata.h mod/include/linux/libata.h | |
119 | --- linux-2.6.16.16/include/linux/libata.h 2006-05-11 03:56:24.000000000 +0200 | |
120 | +++ mod/include/linux/libata.h 2006-05-20 03:31:46.216840250 +0200 | |
121 | @@ -237,6 +237,7 @@ | |
122 | unsigned long irq; | |
123 | unsigned int irq_flags; | |
124 | unsigned long host_flags; | |
125 | + unsigned long port_flags[ATA_MAX_PORTS]; /* pata fix */ | |
126 | void __iomem *mmio_base; | |
127 | void *private_data; | |
128 | }; |