ata-amd.c (09c817ba36db7c3a4ff5e25ac55816ca181a403d) | ata-amd.c (066f913a94b134b6d5e32b6af88f297c7da9c031) |
---|---|
1/*- 2 * Copyright (c) 1998 - 2008 S�ren Schmidt <sos@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 39 unchanged lines hidden (view full) --- 48#include <dev/pci/pcivar.h> 49#include <dev/pci/pcireg.h> 50#include <dev/ata/ata-all.h> 51#include <dev/ata/ata-pci.h> 52#include <ata_if.h> 53 54/* local prototypes */ 55static int ata_amd_chipinit(device_t dev); | 1/*- 2 * Copyright (c) 1998 - 2008 S�ren Schmidt <sos@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 39 unchanged lines hidden (view full) --- 48#include <dev/pci/pcivar.h> 49#include <dev/pci/pcireg.h> 50#include <dev/ata/ata-all.h> 51#include <dev/ata/ata-pci.h> 52#include <ata_if.h> 53 54/* local prototypes */ 55static int ata_amd_chipinit(device_t dev); |
56static void ata_amd_setmode(device_t dev, int mode); | 56static int ata_amd_setmode(device_t dev, int target, int mode); |
57 58/* misc defines */ 59#define AMD_BUG 0x01 60#define AMD_CABLE 0x02 61 62 63/* 64 * American Micro Devices (AMD) chipset support functions --- 34 unchanged lines hidden (view full) --- 99 pci_write_config(dev, 0x41, pci_read_config(dev, 0x41, 1) & 0x0f, 1); 100 else 101 pci_write_config(dev, 0x41, pci_read_config(dev, 0x41, 1) | 0xf0, 1); 102 103 ctlr->setmode = ata_amd_setmode; 104 return 0; 105} 106 | 57 58/* misc defines */ 59#define AMD_BUG 0x01 60#define AMD_CABLE 0x02 61 62 63/* 64 * American Micro Devices (AMD) chipset support functions --- 34 unchanged lines hidden (view full) --- 99 pci_write_config(dev, 0x41, pci_read_config(dev, 0x41, 1) & 0x0f, 1); 100 else 101 pci_write_config(dev, 0x41, pci_read_config(dev, 0x41, 1) | 0xf0, 1); 102 103 ctlr->setmode = ata_amd_setmode; 104 return 0; 105} 106 |
107static void 108ata_amd_setmode(device_t dev, int mode) | 107static int 108ata_amd_setmode(device_t dev, int target, int mode) |
109{ | 109{ |
110 device_t gparent = GRANDPARENT(dev); 111 struct ata_pci_controller *ctlr = device_get_softc(gparent); 112 struct ata_channel *ch = device_get_softc(device_get_parent(dev)); 113 struct ata_device *atadev = device_get_softc(dev); 114 u_int8_t timings[] = { 0xa8, 0x65, 0x42, 0x22, 0x20, 0x42, 0x22, 0x20, 115 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }; 116 int modes[7] = { 0xc2, 0xc1, 0xc0, 0xc4, 0xc5, 0xc6, 0xc7 }; 117 int devno = (ch->unit << 1) + atadev->unit; 118 int reg = 0x53 - devno; 119 int error; | 110 device_t parent = device_get_parent(dev); 111 struct ata_pci_controller *ctlr = device_get_softc(parent); 112 struct ata_channel *ch = device_get_softc(dev); 113 int devno = (ch->unit << 1) + target; 114 int piomode; 115 u_int8_t timings[] = { 0xa8, 0x65, 0x42, 0x22, 0x20, 0xa8, 0x22, 0x20 }; 116 int modes[7] = { 0xc2, 0xc1, 0xc0, 0xc4, 0xc5, 0xc6, 0xc7 }; 117 int reg = 0x53 - devno; |
120 | 118 |
121 mode = ata_limit_mode(dev, mode, ctlr->chip->max_dma); 122 123 if (ctlr->chip->cfg1 & AMD_CABLE) { 124 if (mode > ATA_UDMA2 && 125 !(pci_read_config(gparent, 0x42, 1) & (1 << devno))) { 126 ata_print_cable(dev, "controller"); 127 mode = ATA_UDMA2; | 119 mode = min(mode, ctlr->chip->max_dma); 120 if (ctlr->chip->cfg1 & AMD_CABLE) { 121 if (mode > ATA_UDMA2 && 122 !(pci_read_config(parent, 0x42, 1) & (1 << devno))) { 123 ata_print_cable(dev, "controller"); 124 mode = ATA_UDMA2; 125 } |
128 } | 126 } |
129 } 130 else 131 mode = ata_check_80pin(dev, mode); 132 133 134 error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); 135 if (bootverbose) 136 device_printf(dev, "%ssetting %s on %s chip\n", 137 (error) ? "FAILURE " : "", ata_mode2str(mode), 138 ctlr->chip->text); 139 if (!error) { 140 pci_write_config(gparent, reg - 0x08, timings[ata_mode2idx(mode)], 1); 141 if (mode >= ATA_UDMA0) 142 pci_write_config(gparent, reg, modes[mode & ATA_MODE_MASK], 1); 143 else 144 pci_write_config(gparent, reg, 0x8b, 1); 145 atadev->mode = mode; 146 } | 127 /* Set UDMA timings. */ 128 if (mode >= ATA_UDMA0) { 129 pci_write_config(parent, reg, modes[mode & ATA_MODE_MASK], 1); 130 piomode = ATA_PIO4; 131 } else { 132 pci_write_config(parent, reg, 0x8b, 1); 133 piomode = mode; 134 } 135 /* Set WDMA/PIO timings. */ 136 pci_write_config(parent, reg - 0x08, timings[ata_mode2idx(piomode)], 1); 137 return (mode); |
147} 148 149ATA_DECLARE_DRIVER(ata_amd); | 138} 139 140ATA_DECLARE_DRIVER(ata_amd); |