34 #include <linux/kernel.h>
35 #include <linux/module.h>
36 #include <linux/pci.h>
43 #define DRV_NAME "pata_serverworks"
44 #define DRV_VERSION "0.4.3"
46 #define SVWKS_CSB5_REVISION_NEW 0x92
47 #define SVWKS_CSB6_REVISION 0xa0
52 static const char *csb_bad_ata100[] = {
68 static int oem_cable(
struct ata_port *ap)
103 static int serverworks_cable_detect(
struct ata_port *ap)
129 static u8 serverworks_is_csb(
struct pci_dev *pdev)
153 static unsigned long serverworks_osb4_filter(
struct ata_device *adev,
unsigned long mask)
169 static unsigned long serverworks_csb_filter(
struct ata_device *adev,
unsigned long mask)
182 for (i = 0; (p = csb_bad_ata100[
i]) !=
NULL; i++) {
183 if (!
strcmp(p, model_num))
199 static const u8 pio_mode[] = { 0x5d, 0x47, 0x34, 0x22, 0x20 };
206 pci_write_config_byte(pdev, 0x40 + offset, pio_mode[pio]);
210 if (serverworks_is_csb(pdev)) {
211 pci_read_config_word(pdev, 0x4A, &csb5_pio);
212 csb5_pio &= ~(0x0F << devbits);
213 pci_write_config_word(pdev, 0x4A, csb5_pio | (pio << devbits));
229 static const u8 dma_mode[] = { 0x77, 0x21, 0x20 };
236 pci_read_config_byte(pdev, 0x54, &ultra_cfg);
237 pci_read_config_byte(pdev, 0x56 + ap->
port_no, &ultra);
238 ultra &= ~(0x0F << (adev->
devno * 4));
241 pci_write_config_byte(pdev, 0x44 + offset, 0x20);
244 << (adev->
devno * 4);
245 ultra_cfg |= (1 << devbits);
247 pci_write_config_byte(pdev, 0x44 + offset,
249 ultra_cfg &= ~(1 << devbits);
251 pci_write_config_byte(pdev, 0x56 + ap->
port_no, ultra);
252 pci_write_config_byte(pdev, 0x54, ultra_cfg);
260 .inherits = &ata_bmdma_port_ops,
261 .cable_detect = serverworks_cable_detect,
262 .mode_filter = serverworks_osb4_filter,
263 .set_piomode = serverworks_set_piomode,
264 .set_dmamode = serverworks_set_dmamode,
268 .inherits = &serverworks_osb4_port_ops,
272 static int serverworks_fixup_osb4(
struct pci_dev *pdev)
278 pci_read_config_dword(isa_dev, 0x64, ®);
280 if (!(reg & 0x00004000))
283 pci_write_config_dword(isa_dev, 0x64, reg);
291 static int serverworks_fixup_csb(
struct pci_dev *pdev)
302 pci_read_config_dword(findev, 0x4C, ®4c);
303 reg4c &= ~0x000007FF;
306 pci_write_config_dword(findev, 0x4C, reg4c);
316 pci_read_config_byte(findev, 0x41, ®41);
318 pci_write_config_byte(findev, 0x41, reg41);
331 pci_read_config_byte(pdev, 0x5A, &btr);
337 pci_write_config_byte(pdev, 0x5A, btr);
342 static void serverworks_fixup_ht1000(
struct pci_dev *pdev)
346 pci_read_config_byte(pdev, 0x5A, &btr);
349 pci_write_config_byte(pdev, 0x5A, btr);
352 static int serverworks_fixup(
struct pci_dev *pdev)
361 rc = serverworks_fixup_osb4(pdev);
364 ata_pci_bmdma_clear_simplex(pdev);
368 rc = serverworks_fixup_csb(pdev);
371 serverworks_fixup_ht1000(pdev);
386 .port_ops = &serverworks_osb4_port_ops
392 .port_ops = &serverworks_osb4_port_ops
398 .port_ops = &serverworks_csb_port_ops
404 .port_ops = &serverworks_csb_port_ops
414 rc = serverworks_fixup(pdev);
437 return ata_pci_bmdma_init_one(pdev, ppi, &serverworks_sht,
NULL, 0);
441 static int serverworks_reinit_one(
struct pci_dev *pdev)
446 rc = ata_pci_device_do_resume(pdev);
450 (
void)serverworks_fixup(pdev);
452 ata_host_resume(host);
467 static struct pci_driver serverworks_pci_driver = {
469 .id_table = serverworks,
470 .probe = serverworks_init_one,
471 .remove = ata_pci_remove_one,
473 .suspend = ata_pci_device_suspend,
474 .resume = serverworks_reinit_one,