1*878a3234Szrj /*-
2*878a3234Szrj  * Copyright (c) 1998 - 2008 Søren Schmidt <sos@FreeBSD.org>
3*878a3234Szrj  * All rights reserved.
4*878a3234Szrj  *
5*878a3234Szrj  * Redistribution and use in source and binary forms, with or without
6*878a3234Szrj  * modification, are permitted provided that the following conditions
7*878a3234Szrj  * are met:
8*878a3234Szrj  * 1. Redistributions of source code must retain the above copyright
9*878a3234Szrj  *    notice, this list of conditions and the following disclaimer,
10*878a3234Szrj  *    without modification, immediately at the beginning of the file.
11*878a3234Szrj  * 2. Redistributions in binary form must reproduce the above copyright
12*878a3234Szrj  *    notice, this list of conditions and the following disclaimer in the
13*878a3234Szrj  *    documentation and/or other materials provided with the distribution.
14*878a3234Szrj  *
15*878a3234Szrj  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16*878a3234Szrj  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17*878a3234Szrj  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18*878a3234Szrj  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19*878a3234Szrj  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20*878a3234Szrj  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21*878a3234Szrj  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22*878a3234Szrj  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23*878a3234Szrj  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24*878a3234Szrj  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25*878a3234Szrj  */
26*878a3234Szrj 
27*878a3234Szrj /* local prototypes */
28*878a3234Szrj static int ata_micron_chipinit(device_t dev);
29*878a3234Szrj static void ata_micron_setmode(device_t dev, int mode);
30*878a3234Szrj 
31*878a3234Szrj /*
32*878a3234Szrj  * Micron chipset support functions
33*878a3234Szrj  */
34*878a3234Szrj int
ata_micron_ident(device_t dev)35*878a3234Szrj ata_micron_ident(device_t dev)
36*878a3234Szrj {
37*878a3234Szrj     struct ata_pci_controller *ctlr = device_get_softc(dev);
38*878a3234Szrj 
39*878a3234Szrj     if (pci_get_devid(dev) == ATA_MICRON_RZ1000 ||
40*878a3234Szrj 	pci_get_devid(dev) == ATA_MICRON_RZ1001) {
41*878a3234Szrj 	device_set_desc(dev,
42*878a3234Szrj 	    "RZ 100? ATA controller !WARNING! data loss/corruption risk");
43*878a3234Szrj 	ctlr->chipinit = ata_micron_chipinit;
44*878a3234Szrj 	return 0;
45*878a3234Szrj     }
46*878a3234Szrj     else
47*878a3234Szrj 	return ENXIO;
48*878a3234Szrj }
49*878a3234Szrj 
50*878a3234Szrj static int
ata_micron_chipinit(device_t dev)51*878a3234Szrj ata_micron_chipinit(device_t dev)
52*878a3234Szrj {
53*878a3234Szrj     struct ata_pci_controller *ctlr = device_get_softc(dev);
54*878a3234Szrj 
55*878a3234Szrj     if (ata_setup_interrupt(dev, ata_generic_intr))
56*878a3234Szrj 	return ENXIO;
57*878a3234Szrj 
58*878a3234Szrj     ctlr->setmode = ata_micron_setmode;
59*878a3234Szrj     return 0;
60*878a3234Szrj }
61*878a3234Szrj 
62*878a3234Szrj static void
ata_micron_setmode(device_t dev,int mode)63*878a3234Szrj ata_micron_setmode(device_t dev, int mode)
64*878a3234Szrj {
65*878a3234Szrj     struct ata_device *atadev = device_get_softc(dev);
66*878a3234Szrj 
67*878a3234Szrj     mode = ata_limit_mode(dev, mode, ATA_UDMA2);
68*878a3234Szrj     mode = ata_check_80pin(dev, mode);
69*878a3234Szrj     if (!ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode))
70*878a3234Szrj 	atadev->mode = mode;
71*878a3234Szrj }
72