|
Lines 166-176
static unsigned int get_scr_cfg_addr(struct ata_port *ap, unsigned int sc_reg)
Link Here
|
| 166 |
return addr; |
166 |
return addr; |
| 167 |
} |
167 |
} |
| 168 |
|
168 |
|
| 169 |
static u32 sis_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg) |
169 |
static u32 sis_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg, u32 *val) |
| 170 |
{ |
170 |
{ |
| 171 |
struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
171 |
struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
| 172 |
unsigned int cfg_addr = get_scr_cfg_addr(ap, sc_reg); |
172 |
unsigned int cfg_addr = get_scr_cfg_addr(ap, sc_reg); |
| 173 |
u32 val, val2 = 0; |
173 |
u32 val2 = 0; |
| 174 |
u8 pmr; |
174 |
u8 pmr; |
| 175 |
|
175 |
|
| 176 |
if (sc_reg == SCR_ERROR) /* doesn't exist in PCI cfg space */ |
176 |
if (sc_reg == SCR_ERROR) /* doesn't exist in PCI cfg space */ |
|
Lines 178-190
static u32 sis_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg)
Link Here
|
| 178 |
|
178 |
|
| 179 |
pci_read_config_byte(pdev, SIS_PMR, &pmr); |
179 |
pci_read_config_byte(pdev, SIS_PMR, &pmr); |
| 180 |
|
180 |
|
| 181 |
pci_read_config_dword(pdev, cfg_addr, &val); |
181 |
pci_read_config_dword(pdev, cfg_addr, val); |
| 182 |
|
182 |
|
| 183 |
if ((pdev->device == 0x0182) || (pdev->device == 0x0183) || |
183 |
if ((pdev->device == 0x0182) || (pdev->device == 0x0183) || |
| 184 |
(pdev->device == 0x1182) || (pmr & SIS_PMR_COMBINED)) |
184 |
(pdev->device == 0x1182) || (pmr & SIS_PMR_COMBINED)) |
| 185 |
pci_read_config_dword(pdev, cfg_addr+0x10, &val2); |
185 |
pci_read_config_dword(pdev, cfg_addr+0x10, &val2); |
| 186 |
|
186 |
|
| 187 |
return (val|val2) & 0xfffffffb; /* avoid problems with powerdowned ports */ |
187 |
*val |= val2; |
|
|
188 |
*val &= 0xfffffffb; /* avoid problems with powerdowned ports */ |
| 189 |
|
| 190 |
return 0; |
| 188 |
} |
191 |
} |
| 189 |
|
192 |
|
| 190 |
static void sis_scr_cfg_write (struct ata_port *ap, unsigned int sc_reg, u32 val) |
193 |
static void sis_scr_cfg_write (struct ata_port *ap, unsigned int sc_reg, u32 val) |
|
Lines 214-220
static int sis_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val)
Link Here
|
| 214 |
return -EINVAL; |
217 |
return -EINVAL; |
| 215 |
|
218 |
|
| 216 |
if (ap->flags & SIS_FLAG_CFGSCR) |
219 |
if (ap->flags & SIS_FLAG_CFGSCR) |
| 217 |
return sis_scr_cfg_read(ap, sc_reg); |
220 |
return sis_scr_cfg_read(ap, sc_reg, val); |
| 218 |
|
221 |
|
| 219 |
pci_read_config_byte(pdev, SIS_PMR, &pmr); |
222 |
pci_read_config_byte(pdev, SIS_PMR, &pmr); |
| 220 |
|
223 |
|