kern/140251: commit references a PR

dfilter service dfilter at FreeBSD.ORG
Tue Dec 22 19:50:02 UTC 2009


The following reply was made to PR kern/140251; it has been noted by GNATS.

From: dfilter at FreeBSD.ORG (dfilter service)
To: bug-followup at FreeBSD.org
Cc:  
Subject: Re: kern/140251: commit references a PR
Date: Tue, 22 Dec 2009 19:48:21 +0000 (UTC)

 Author: mav
 Date: Tue Dec 22 19:48:06 2009
 New Revision: 200857
 URL: http://svn.freebsd.org/changeset/base/200857
 
 Log:
   Add support for Intel SCH PATA controller.
   
   PR:		kern/140251
 
 Modified:
   head/sys/dev/ata/ata-pci.h
   head/sys/dev/ata/chipsets/ata-intel.c
 
 Modified: head/sys/dev/ata/ata-pci.h
 ==============================================================================
 --- head/sys/dev/ata/ata-pci.h	Tue Dec 22 19:32:16 2009	(r200856)
 +++ head/sys/dev/ata/ata-pci.h	Tue Dec 22 19:48:06 2009	(r200857)
 @@ -204,6 +204,7 @@ struct ata_pci_controller {
  #define ATA_I82801JI_R1         0x3a258086
  #define ATA_I82801JI_S2         0x3a268086
  #define ATA_I31244              0x32008086
 +#define ATA_ISCH                0x811a8086
  
  #define ATA_ITE_ID              0x1283
  #define ATA_IT8211F             0x82111283
 
 Modified: head/sys/dev/ata/chipsets/ata-intel.c
 ==============================================================================
 --- head/sys/dev/ata/chipsets/ata-intel.c	Tue Dec 22 19:32:16 2009	(r200856)
 +++ head/sys/dev/ata/chipsets/ata-intel.c	Tue Dec 22 19:48:06 2009	(r200857)
 @@ -57,6 +57,7 @@ static int ata_intel_ch_attach(device_t 
  static void ata_intel_reset(device_t dev);
  static int ata_intel_old_setmode(device_t dev, int target, int mode);
  static int ata_intel_new_setmode(device_t dev, int target, int mode);
 +static int ata_intel_sch_setmode(device_t dev, int target, int mode);
  static int ata_intel_sata_getrev(device_t dev, int target);
  static int ata_intel_31244_ch_attach(device_t dev);
  static int ata_intel_31244_ch_detach(device_t dev);
 @@ -140,6 +141,7 @@ ata_intel_probe(device_t dev)
       { ATA_I82801JI_R1,  0, INTEL_AHCI, 0, ATA_SA300, "ICH10" },
       { ATA_I82801JI_S2,  0, INTEL_AHCI, 0, ATA_SA300, "ICH10" },
       { ATA_I31244,       0,          0, 2, ATA_SA150, "31244" },
 +     { ATA_ISCH,         0,          0, 1, ATA_UDMA5, "SCH" },
       { 0, 0, 0, 0, 0, 0}};
  
      if (pci_get_vendor(dev) != ATA_INTEL_ID)
 @@ -183,7 +185,13 @@ ata_intel_chipinit(device_t dev)
  	ctlr->setmode = ata_sata_setmode;
  	ctlr->getrev = ata_sata_getrev;
      }
 -
 +    /* SCH */
 +    else if (ctlr->chip->chipid == ATA_ISCH) {
 +	ctlr->channels = 1;
 +	ctlr->ch_attach = ata_intel_ch_attach;
 +	ctlr->ch_detach = ata_pci_ch_detach;
 +	ctlr->setmode = ata_intel_sch_setmode;
 +    }
      /* non SATA intel chips goes here */
      else if (ctlr->chip->max_dma < ATA_SA150) {
  	ctlr->channels = ctlr->chip->cfg2;
 @@ -245,7 +253,7 @@ ata_intel_ch_attach(device_t dev)
  		(pci_read_config(device_get_parent(dev), 0x90, 1) & 0x04) == 0)
  		    ch->flags |= ATA_NO_SLAVE;
  	    ch->flags |= ATA_SATA;
 -    } else
 +    } else if (ctlr->chip->chipid != ATA_ISCH)
  	    ch->flags |= ATA_CHECKS_CABLE;
      return 0;
  }
 @@ -360,6 +368,35 @@ ata_intel_new_setmode(device_t dev, int 
  }
  
  static int
 +ata_intel_sch_setmode(device_t dev, int target, int mode)
 +{
 +	device_t parent = device_get_parent(dev);
 +	struct ata_pci_controller *ctlr = device_get_softc(parent);
 +	u_int8_t dtim = 0x80 + (target << 2);
 +	u_int32_t tim = pci_read_config(parent, dtim, 4);
 +	int piomode;
 +
 +	mode = min(mode, ctlr->chip->max_dma);
 +	if (mode >= ATA_UDMA0) {
 +		tim |= (0x1 << 31);
 +		tim &= ~(0x7 << 16);
 +		tim |= ((mode & ATA_MODE_MASK) << 16);
 +		piomode = ATA_PIO4;
 +	} else if (mode >= ATA_WDMA0) {
 +		tim &= ~(0x1 << 31);
 +		tim &= ~(0x3 << 8);
 +		tim |= ((mode & ATA_MODE_MASK) << 8);
 +		piomode = (mode == ATA_WDMA0) ? ATA_PIO0 :
 +		    (mode == ATA_WDMA1) ? ATA_PIO3 : ATA_PIO4;
 +	} else
 +		piomode = mode;
 +	tim &= ~(0x7);
 +	tim |= (piomode & 0x7);
 +	pci_write_config(parent, dtim, tim, 4);
 +	return (mode);
 +}
 +
 +static int
  ata_intel_sata_getrev(device_t dev, int target)
  {
  	struct ata_channel *ch = device_get_softc(dev);
 _______________________________________________
 svn-src-all at freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
 


More information about the freebsd-bugs mailing list