Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 9 Feb 2000 16:41:27 -0800 (PST)
From:      Doug Ambrisko <ambrisko@whistle.com>
To:        imp@village.org, freebsd-mobile@freebsd.org
Subject:   Updated patches for pccard ata driver -current
Message-ID:  <200002100041.QAA77975@whistle.com>

next in thread | raw e-mail | index | archive | help
This is for last nights -current (nuke any other patches).  I still don't 
have detach/removal working but might be closer to that now.  It's based 
on Warner latest patches so flash cards should work.  I verified it works 
with my external hard drive and cdrom.

Doug A.

Index: ata-all.c
===================================================================
RCS file: /cvs/freebsd/src/sys/dev/ata/ata-all.c,v
retrieving revision 1.47
diff -c -r1.47 ata-all.c
*** ata-all.c	2000/02/04 10:20:20	1.47
--- ata-all.c	2000/02/10 00:31:09
***************
*** 30,35 ****
--- 30,36 ----
  
  #include "ata.h"
  #include "apm.h"
+ #include "card.h"
  #include "isa.h"
  #include "pci.h"
  #include "atadisk.h"
***************
*** 88,93 ****
--- 89,103 ----
  static void btrim(int8_t *, int32_t);
  static void bpack(int8_t *, int8_t *, int32_t);
  
+ #if NCARD > 0
+ static	int	ata_pccard_attach __P((device_t dev));
+ static	int	ata_pccard_detach __P((device_t dev));
+ static	int	ata_pccard_probe __P((device_t dev));
+ /* XXX */
+ extern  void    ad_drvinit(void);
+ extern  void    atapi_init(void);
+ #endif /* NCARD > 0 */
+ 
  /* local vars */
  static int32_t atanlun = 2;
  static struct intr_config_hook *ata_attach_hook = NULL;
***************
*** 187,192 ****
--- 197,332 ----
  DRIVER_MODULE(ata, isa, ata_isa_driver, ata_devclass, 0, 0);
  #endif
  
+ #if NCARD > 0
+ static int
+ ata_pccard_probe(dev)
+ 	device_t	dev;
+ {
+     struct resource *port;
+     int rid;
+     int32_t res;
+     int32_t lun;
+     static struct intr_config_hook *tmp;
+ 
+     /* Allocate the port range */
+     rid = 0;
+     port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0, 16, RF_ACTIVE);
+     /* XXX 16 shouldn't be hard coded */
+ 
+     if (!port)
+ 	return (ENOMEM);
+     
+     /* don't worry about conflict since PCCard code should have checked 
+        already */
+     /*
+      * XXX ALTPORT not used in pccard XXX
+      * Here's the i/o map for isa vs pccard
+      * Offset		isa	pccard
+      * DATA		0	0
+      * ERROR		1	1	R
+      * FEATURE		1	1	W
+      * COUNT		2	2	W
+      * IREASON		2	2	R
+      * SECTOR		3	3
+      * CYL_LSB		4	4
+      * CYL_MSB		5	5
+      * DRIVE		6	6
+      * CMD		7	7
+      * STATUS		7	7
+      * ALTSTATUS	206	8	R
+      * CTLR		206	8	W
+      * wd_digin		207	9
+      */
+ 
+     /* trick ata_probe to not queue up interrupts since interupts 
+        are active now */
+     tmp=ata_attach_hook;
+     ata_attach_hook = 1;      
+ 
+     res = ata_probe(rman_get_start(port), 
+ 	rman_get_start(port) + ATA_ALTPORT_ONE_WINDOW, 0, dev, &lun);
+ 
+     /* restore hook */
+     ata_attach_hook = tmp;
+ 
+     bus_release_resource(dev, SYS_RES_IOPORT, rid, port);
+ 
+     if (res) {
+ 	isa_set_portsize(dev, res);
+ 	*(int *)device_get_softc(dev) = lun;
+         atadevices[lun]->flags |= ATA_USE_16BIT;
+ 	return 0;
+     }
+     return ENXIO;
+ }
+ 
+ static int
+ ata_pccard_attach(dev)
+ 	device_t	dev;
+ {
+     struct resource *port;
+     struct resource *irq;
+     void *ih;
+     int iorid;
+     int irqrid;
+     int status;
+     
+     /* Allocate the port range and interrupt */
+     iorid = 0;
+     port = bus_alloc_resource(dev, SYS_RES_IOPORT, &iorid, 0, ~0, 1, 
+ 	RF_ACTIVE);
+     if (!port) {
+ 	/* XXX Need to free things ? */
+ 	return (ENOMEM);
+     }
+ 
+     irqrid = 0;
+     irq = bus_alloc_resource(dev, SYS_RES_IRQ, &irqrid, 0, ~0, 1, RF_ACTIVE);
+     if (!irq) {
+ 	/* XXX Need to free things ? */
+ 	bus_release_resource(dev, SYS_RES_IOPORT, iorid, port);
+ 	return (ENOMEM);
+     }
+     status = bus_setup_intr(dev, irq, INTR_TYPE_BIO, ataintr, 
+ 			    atadevices[*(int *)device_get_softc(dev)], &ih);
+ 
+     /* XXX The following really should just scan *THIS* device XXX */
+     /* XXX Also, we need to do more than just ad XXX */
+ 
+     if (status == 0) {
+         ata_attach(dev);
+     }
+     return status;
+ }
+ 
+ 
+ static int
+ ata_pccard_detach(dev)
+ 	device_t	dev;
+ {
+     printf("I can't be dettached ata\n");
+     return EIO;
+ }
+ 
+ 
+ static device_method_t ata_pccard_methods[] = {
+ 	/* Device interface */
+ 	DEVMETHOD(device_probe,		ata_pccard_probe),
+ 	DEVMETHOD(device_attach,	ata_pccard_attach),
+ 	DEVMETHOD(device_detach,	ata_pccard_detach),
+ 
+ 	{ 0, 0 }
+ };
+ 
+ static driver_t ata_pccard_driver = {
+ 	"ata",
+ 	ata_pccard_methods,
+ 	sizeof(int),
+ };
+ 
+ DRIVER_MODULE(ata, pccard, ata_pccard_driver, ata_devclass, 0, 0);
+ #endif (NCARD > 0)
+ 
  #if NPCI > 0
  static const char *
  ata_pcimatch(device_t dev)
***************
*** 655,661 ****
       * of non-exsistent devices and thereby long delays
       */
      for (ctlr=0; ctlr<MAXATA; ctlr++) {
! 	if (!atadevices[ctlr]) continue;
  	if (atadevices[ctlr]->devices & ATA_ATA_SLAVE)
  	    if (ata_getparam(atadevices[ctlr], ATA_SLAVE, ATA_C_ATA_IDENTIFY))
  		atadevices[ctlr]->devices &= ~ATA_ATA_SLAVE;
--- 795,802 ----
       * of non-exsistent devices and thereby long delays
       */
      for (ctlr=0; ctlr<MAXATA; ctlr++) {
! 	if (!atadevices[ctlr] || 
! 	    (atadevices[ctlr]->devices & ATA_PROBED)) continue;
  	if (atadevices[ctlr]->devices & ATA_ATA_SLAVE)
  	    if (ata_getparam(atadevices[ctlr], ATA_SLAVE, ATA_C_ATA_IDENTIFY))
  		atadevices[ctlr]->devices &= ~ATA_ATA_SLAVE;
***************
*** 673,679 ****
  #if NATADISK > 0
      /* now we know whats there, do the real attach, first the ATA disks */
      for (ctlr=0; ctlr<MAXATA; ctlr++) {
! 	if (!atadevices[ctlr]) continue;
  	if (atadevices[ctlr]->devices & ATA_ATA_MASTER)
  	    ad_attach(atadevices[ctlr], ATA_MASTER);
  	if (atadevices[ctlr]->devices & ATA_ATA_SLAVE)
--- 814,821 ----
  #if NATADISK > 0
      /* now we know whats there, do the real attach, first the ATA disks */
      for (ctlr=0; ctlr<MAXATA; ctlr++) {
! 	if (!atadevices[ctlr] || 
! 	    (atadevices[ctlr]->devices & ATA_PROBED)) continue;
  	if (atadevices[ctlr]->devices & ATA_ATA_MASTER)
  	    ad_attach(atadevices[ctlr], ATA_MASTER);
  	if (atadevices[ctlr]->devices & ATA_ATA_SLAVE)
***************
*** 683,695 ****
  #if NATAPICD > 0 || NATAPIFD > 0 || NATAPIST > 0
      /* then the atapi devices */
      for (ctlr=0; ctlr<MAXATA; ctlr++) {
! 	if (!atadevices[ctlr]) continue;
  	if (atadevices[ctlr]->devices & ATA_ATAPI_MASTER)
  	    atapi_attach(atadevices[ctlr], ATA_MASTER);
  	if (atadevices[ctlr]->devices & ATA_ATAPI_SLAVE)
  	    atapi_attach(atadevices[ctlr], ATA_SLAVE);
      }
  #endif
      if (ata_attach_hook) {
  	config_intrhook_disestablish(ata_attach_hook);
  	free(ata_attach_hook, M_ATA);
--- 825,843 ----
  #if NATAPICD > 0 || NATAPIFD > 0 || NATAPIST > 0
      /* then the atapi devices */
      for (ctlr=0; ctlr<MAXATA; ctlr++) {
! 	if (!atadevices[ctlr] || 
! 	    (atadevices[ctlr]->devices & ATA_PROBED)) continue;
  	if (atadevices[ctlr]->devices & ATA_ATAPI_MASTER)
  	    atapi_attach(atadevices[ctlr], ATA_MASTER);
  	if (atadevices[ctlr]->devices & ATA_ATAPI_SLAVE)
  	    atapi_attach(atadevices[ctlr], ATA_SLAVE);
      }
  #endif
+     /* mark all current controllers probed for devices */
+     for (ctlr=0; ctlr<MAXATA; ctlr++) {
+ 	if (!atadevices[ctlr]) continue; 
+ 	atadevices[ctlr]->devices |= ATA_PROBED;
+     }
      if (ata_attach_hook) {
  	config_intrhook_disestablish(ata_attach_hook);
  	free(ata_attach_hook, M_ATA);
Index: ata-all.h
===================================================================
RCS file: /cvs/freebsd/src/sys/dev/ata/ata-all.h,v
retrieving revision 1.23
diff -c -r1.23 ata-all.h
*** ata-all.h	2000/01/28 13:35:42	1.23
--- ata-all.h	2000/02/10 00:31:09
***************
*** 87,92 ****
--- 87,93 ----
  #define		ATA_S_BUSY		0x80	/* busy */
  
  #define ATA_ALTPORT			0x206	/* alternate Status register */
+ #define ATA_ALTPORT_ONE_WINDOW		0x08	/* Alternate port for pccard */
  #define		ATA_A_IDS		0x02	/* disable interrupts */
  #define		ATA_A_RESET		0x04	/* RESET controller */
  #define		ATA_A_4BIT		0x08	/* 4 head bits */
***************
*** 281,286 ****
--- 282,288 ----
  #define		ATA_ATA_SLAVE		0x02
  #define		ATA_ATAPI_MASTER	0x04
  #define		ATA_ATAPI_SLAVE		0x08
+ #define		ATA_PROBED		0x10
  
      u_int8_t			status;		/* last controller status */
      u_int8_t			error;		/* last controller error */


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-mobile" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200002100041.QAA77975>