From owner-freebsd-current@FreeBSD.ORG Mon Jan 26 23:17:27 2004 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6489316A4CF; Mon, 26 Jan 2004 23:17:27 -0800 (PST) Received: from cheer.mahoroba.org (flets20-024.kamome.or.jp [218.45.20.24]) by mx1.FreeBSD.org (Postfix) with ESMTP id BCD3643D2D; Mon, 26 Jan 2004 23:16:50 -0800 (PST) (envelope-from ume@FreeBSD.org) Received: from localhost (IDENT:7R5ou9j/8LveXh8zJInZZYYU0m3Yy4V9rweM8+0FbSUFA1KqxB2DZCZjVOiFiiIB@localhost [IPv6:::1]) (user=ume mech=CRAM-MD5 bits=0)i0R6mOZS063147 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 27 Jan 2004 15:48:24 +0900 (JST) (envelope-from ume@FreeBSD.org) Date: Tue, 27 Jan 2004 15:48:23 +0900 Message-ID: From: Hajimu UMEMOTO To: sos@FreeBSD.org User-Agent: Wanderlust/2.10.1 (Watching The Wheels) SEMI/1.14.5 (Awara-Onsen) FLIM/1.14.5 (Demachiyanagi) APEL/10.6 Emacs/21.3 (i386--freebsd) MULE/5.0 (=?ISO-2022-JP?B?GyRCOC1MWhsoQg==?=) X-Operating-System: FreeBSD 4.9-RELEASE MIME-Version: 1.0 (generated by SEMI 1.14.5 - "Awara-Onsen") Content-Type: text/plain; charset=US-ASCII X-Virus-Scanned: by amavisd-new X-Spam-Status: No, hits=0.3 required=5.0 tests=UPPERCASE_25_50 autolearn=no version=2.63 X-Spam-Checker-Version: SpamAssassin 2.63 (2004-01-11) on cheer.mahoroba.org cc: current@FreeBSD.org Subject: Panasonic KXLC005 support X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 27 Jan 2004 07:17:27 -0000 Hi, I have Panasonic KXLC005 CDROM drive which is connected via PC-CARD. Unfortunately, it requires extra initialization, and is not recognized by current ATA driver. So, I made a patch. Please review it. Index: sys/dev/ata/ata-card.c diff -u -p sys/dev/ata/ata-card.c.orig sys/dev/ata/ata-card.c --- sys/dev/ata/ata-card.c.orig Thu Jan 15 15:47:27 2004 +++ sys/dev/ata/ata-card.c Wed Jan 21 23:14:44 2004 @@ -49,15 +49,22 @@ __FBSDID("$FreeBSD: src/sys/dev/ata/ata- #include #include -static const struct pccard_product ata_pccard_products[] = { - PCMCIA_CARD(FREECOM, PCCARDIDE, 0), - PCMCIA_CARD(EXP, EXPMULTIMEDIA, 0), - PCMCIA_CARD(IODATA, CBIDE2, 0), - PCMCIA_CARD(OEM2, CDROM1, 0), - PCMCIA_CARD(OEM2, IDE, 0), - PCMCIA_CARD(PANASONIC, KXLC005, 0), - PCMCIA_CARD(TEAC, IDECARDII, 0), - {NULL} +#define KME_IO 0x1 +#define KME_TIMEOUT (hz / 5) + +static const struct ata_pccard_product { + struct pccard_product prod; + int flags; +} ata_pccard_products[] = { + { PCMCIA_CARD(FREECOM, PCCARDIDE, 0), 0 }, + { PCMCIA_CARD(EXP, EXPMULTIMEDIA, 0), 0 }, + { PCMCIA_CARD(IODATA, CBIDE2, 0), 0 }, + { PCMCIA_CARD(OEM2, CDROM1, 0), 0 }, + { PCMCIA_CARD(OEM2, IDE, 0), 0 }, + { PCMCIA_CARD(PANASONIC, KXLC005, 0), KME_IO }, + { PCMCIA_CARD(PANASONIC, KXLC005_1, 0), KME_IO }, + { PCMCIA_CARD(TEAC, IDECARDII, 0), 0 }, + { {NULL}, 0 } }; MALLOC_DECLARE(M_ATA); @@ -65,7 +72,7 @@ MALLOC_DECLARE(M_ATA); static int ata_pccard_match(device_t dev) { - const struct pccard_product *pp; + const struct ata_pccard_product *pp; u_int32_t fcn = PCCARD_FUNCTION_UNSPEC; int error = 0; @@ -78,10 +85,13 @@ ata_pccard_match(device_t dev) return (0); /* match other devices here, primarily cdrom/dvd rom */ - if ((pp = pccard_product_lookup(dev, ata_pccard_products, - sizeof(ata_pccard_products[0]), NULL))) { - if (pp->pp_name) - device_set_desc(dev, pp->pp_name); + if ((pp = (const struct ata_pccard_product *)pccard_product_lookup(dev, + (const struct pccard_product *)ata_pccard_products, + sizeof(ata_pccard_products[0]), NULL))) { + if (pp->prod.pp_name) + device_set_desc(dev, pp->prod.pp_name); + if (pp->flags == KME_IO) + device_set_flags(dev, KME_IO); return (0); } return(ENXIO); @@ -103,7 +113,7 @@ ata_pccard_probe(device_t dev) { struct ata_channel *ch = device_get_softc(dev); struct resource *io, *altio; - int i, rid, len; + int i, rid, len, ts; /* allocate the io range to get start and length */ rid = ATA_IOADDR_RID; @@ -129,8 +139,11 @@ ata_pccard_probe(device_t dev) } else { rid = ATA_ALTADDR_RID; - altio = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0, - ATA_ALTIOSIZE, RF_ACTIVE); + len = ATA_ALTIOSIZE; + if (device_get_flags(dev) == KME_IO) + ++len; + altio = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0, len, + RF_ACTIVE); if (!altio) { bus_release_resource(dev, SYS_RES_IOPORT, ATA_IOADDR_RID, io); for (i = ATA_DATA; i < ATA_MAX_RES; i++) @@ -139,6 +152,12 @@ ata_pccard_probe(device_t dev) } ch->r_io[ATA_ALTSTAT].res = altio; ch->r_io[ATA_ALTSTAT].offset = 0; + if (device_get_flags(dev) == KME_IO) { + bus_space_write_1(rman_get_bustag(altio), + rman_get_bushandle(altio), 1, 0x81); + if (!cold) + tsleep(&ts, PRIBIO, "atacard", KME_TIMEOUT); + } } /* initialize softc for this channel */ Sincerely, -- Hajimu UMEMOTO @ Internet Mutual Aid Society Yokohama, Japan ume@mahoroba.org ume@{,jp.}FreeBSD.org http://www.imasy.org/~ume/