linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeff Garzik <jgarzik@pobox.com>
To: Tejun Heo <htejun@gmail.com>
Cc: alan@lxorguk.ukuu.org.uk, mlord@pobox.com, albertcc@tw.ibm.com,
	uchang@tw.ibm.com, forrest.zhao@intel.com, brking@us.ibm.com,
	linux-ide@vger.kernel.org
Subject: Re: [PATCH 4/20] libata: separate out ata_host_alloc() and ata_host_attach()
Date: Tue, 19 Sep 2006 01:08:20 -0400	[thread overview]
Message-ID: <450F7B44.4010300@pobox.com> (raw)
In-Reply-To: <1155977971798-git-send-email-htejun@gmail.com>

Tejun Heo wrote:
> Separate out ata_host_alloc(), ata_host_add_ports() and
> ata_host_attach() from ata_device_add().  These functions will be used
> by new LLD init model where LLD allocates host directly, then
> intializes and attaches it instead of going through probe_ent.
> 
> ata_host_alloc() can be called with NULL @sht which indicates that
> Scsi_Host association is handled by the caller.  This will be used by
> SAS.
> 
> This patch does not introduce behavior changes.
> 
> Signed-off-by: Tejun Heo <htejun@gmail.com>

ACK in general, but minor nits are found in comments below.

Also, to make reviewing and git bisect easier, it would be nice to split 
ata_host_attach() separation into another patch.


> ---
>  drivers/ata/libata-core.c |  451 ++++++++++++++++++++++++++++++---------------
>  include/linux/libata.h    |    7 +
>  2 files changed, 312 insertions(+), 146 deletions(-)
> 
> diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
> index d7bf4a1..eeb9dc6 100644
> --- a/drivers/ata/libata-core.c
> +++ b/drivers/ata/libata-core.c
> @@ -5243,11 +5243,15 @@ void ata_dev_init(struct ata_device *dev
>   *	ata_port_init - Initialize an ata_port structure
>   *	@ap: Structure to initialize
>   *	@host: Collection of hosts to which @ap belongs
> - *	@ent: Probe information provided by low-level driver
> - *	@port_no: Port number associated with this ata_port
> + *	@ent: Probe information provided by low-level driver (optional)
> + *	@port_no: Port number associated with this ata_port (optional)

I would perhaps note that port_no is require iff ent != NULL


>   *	Initialize a new ata_port structure.
>   *
> + *	@ent and @port_no are to support sas interface.  These will be
> + *	removed once sas is converted to use new alloc/init/attach
> + *	interface.
> + *
>   *	LOCKING:
>   *	Inherited from caller.
>   */
> @@ -5261,13 +5265,17 @@ void ata_port_init(struct ata_port *ap, 
>  	ap->id = ata_unique_id++;
>  	ap->ctl = ATA_DEVCTL_OBS;
>  	ap->host = host;
> -	ap->dev = ent->dev;
> -	ap->port_no = port_no;
> -	ap->pio_mask = ent->pio_mask;
> -	ap->mwdma_mask = ent->mwdma_mask;
> -	ap->udma_mask = ent->udma_mask;
> -	ap->flags |= ent->port_flags;
> -	ap->ops = ent->port_ops;
> +	ap->dev = host->dev;
> +
> +	if (ent) {
> +		ap->port_no = port_no;
> +		ap->pio_mask = ent->pio_mask;
> +		ap->mwdma_mask = ent->mwdma_mask;
> +		ap->udma_mask = ent->udma_mask;
> +		ap->flags |= ent->port_flags;
> +		ap->ops = ent->port_ops;
> +	}
> +
>  	ap->hw_sata_spd_limit = UINT_MAX;
>  	ap->active_tag = ATA_TAG_POISON;
>  	ap->last_ctl = 0xFF;
> @@ -5287,10 +5295,7 @@ #endif
>  	INIT_LIST_HEAD(&ap->eh_done_q);
>  	init_waitqueue_head(&ap->eh_wait_q);
>  
> -	/* set cable type */
>  	ap->cbl = ATA_CBL_NONE;
> -	if (ap->flags & ATA_FLAG_SATA)
> -		ap->cbl = ATA_CBL_SATA;
>  
>  	for (i = 0; i < ATA_MAX_DEVICES; i++) {
>  		struct ata_device *dev = &ap->device[i];
> @@ -5304,7 +5309,12 @@ #ifdef ATA_IRQ_TRAP
>  	ap->stats.idle_irq = 1;
>  #endif
>  
> -	memcpy(&ap->ioaddr, &ent->port[port_no], sizeof(struct ata_ioports));
> +	if (ent) {
> +		if (ap->flags & ATA_FLAG_SATA)
> +			ap->cbl = ATA_CBL_SATA;
> +		memcpy(&ap->ioaddr, &ent->port[port_no],
> +		       sizeof(struct ata_ioports));
> +	}
>  }
>  
>  /**
> @@ -5329,47 +5339,140 @@ static void ata_port_init_shost(struct a
>  }
>  
>  /**
> - *	ata_port_add - Attach low-level ATA driver to system
> - *	@ent: Information provided by low-level driver
> - *	@host: Collections of ports to which we add
> - *	@port_no: Port number associated with this host
> + *	ata_port_alloc - allocate and initialize basic ATA port resources
> + *	@host: ATA host this allocated port belongs to
> + *	@sht: template for SCSI host (can be NULL)
>   *
> - *	Attach low-level ATA driver to system.
> + *	Allocate and initialize basic ATA port resources.
>   *
> - *	LOCKING:
> - *	PCI/etc. bus probe sem.
> + *	If @sht is NULL, SCSI host is not allocated nor freed later
> + *	with the port.  The caller is responsible for associating SCSI
> + *	host.  This is for SAS.
>   *
>   *	RETURNS:
> - *	New ata_port on success, for NULL on error.
> + *	Allocate ATA port on success, NULL on failure.
> + *
> + *	LOCKING:
> + *	Inherited from calling layer (may sleep).
>   */
> -static struct ata_port * ata_port_add(const struct ata_probe_ent *ent,
> -				      struct ata_host *host,
> -				      unsigned int port_no)
> +static struct ata_port *ata_port_alloc(struct ata_host *host,
> +				       struct scsi_host_template *sht)
>  {
> -	struct Scsi_Host *shost;
>  	struct ata_port *ap;
>  
>  	DPRINTK("ENTER\n");
>  
> -	if (!ent->port_ops->error_handler &&
> -	    !(ent->port_flags & (ATA_FLAG_SATA_RESET | ATA_FLAG_SRST))) {
> -		printk(KERN_ERR "ata%u: no reset mechanism available\n",
> -		       port_no);
> -		return NULL;
> +	if (sht) {
> +		struct Scsi_Host *shost;
> +
> +		shost = scsi_host_alloc(sht, sizeof(struct ata_port));
> +		if (!shost)
> +			return NULL;
> +
> +		shost->transportt = &ata_scsi_transport_template;
> +
> +		ap = ata_shost_to_port(shost);
> +		ata_port_init_shost(ap, shost);
> +
> +		ap->pflags |= ATA_PFLAG_SHOST_OWNER;
> +	} else {
> +		ap = kzalloc(sizeof(*ap), GFP_KERNEL);
> +		if (!ap)
> +			return NULL;
>  	}
>  
> -	shost = scsi_host_alloc(ent->sht, sizeof(struct ata_port));
> -	if (!shost)
> +	ata_port_init(ap, host, NULL, 0);
> +
> +	return ap;
> +}
> +
> +/**
> + *	ata_host_alloc - allocate and init basic ATA host resources
> + *	@dev: generic device this host is associated with
> + *	@sht: template for SCSI host
> + *	@n_ports: number of ATA ports associated with this host (can be 0)
> + *
> + *	Allocate and initialize basic ATA host resources.  LLD calls
> + *	this function to allocate a host, initializes it fully and
> + *	attaches it using ata_host_attach().
> + *
> + *	RETURNS:
> + *	Allocate ATA host on success, NULL on failure.
> + *
> + *	LOCKING:
> + *	Inherited from calling layer (may sleep).
> + */
> +struct ata_host *ata_host_alloc(struct device *dev,
> +				struct scsi_host_template *sht, int n_ports)
> +{
> +	struct ata_host *host;
> +	size_t sz;
> +
> +	DPRINTK("ENTER\n");
> +
> +	/* alloc a container for our list of ATA ports (buses) */
> +	sz = sizeof(struct ata_host) + n_ports * sizeof(void *);
> +	if (n_ports == 0)
> +		sz += ATA_MAX_PORTS * sizeof(void *);
> +
> +	host = kzalloc(sz, GFP_KERNEL);
> +	if (!host)
>  		return NULL;
>  
> -	shost->transportt = &ata_scsi_transport_template;
> +	spin_lock_init(&host->lock);
> +	host->dev = dev;
>  
> -	ap = ata_shost_to_port(shost);
> +	if (ata_host_add_ports(host, sht, n_ports))
> +		goto err_free;
>  
> -	ata_port_init(ap, host, ent, port_no);
> -	ata_port_init_shost(ap, shost);
> +	return host;
>  
> -	return ap;
> + err_free:
> +	ata_host_free(host);
> +	return NULL;
> +}
> +
> +/**
> + *	ata_host_add_ports - allocate ports to zero-port host
> + *	@host: target ATA host
> + *	@sht: template for SCSI host
> + *	@n_ports: number of ATA ports associated with this host
> + *
> + *	Allocate @n_ports ports and associate them with @host.
> + *	@n_ports must be less than or equal to ATA_MAX_PORTS and @host
> + *	must have been allocated with zero port.  This function is
> + *	used by LLDs which can't determine number of ports at host
> + *	allocation time.
> + *
> + *	RETURNS:
> + *	0 on success, -errno otherwise.
> + *
> + *	LOCKING:
> + *	Inherited from calling layer (may sleep).
> + */
> +int ata_host_add_ports(struct ata_host *host,
> +		       struct scsi_host_template *sht, int n_ports)
> +{
> +	int i;
> +
> +	if (host->n_ports || n_ports > ATA_MAX_PORTS)
> +		return -EINVAL;

For what code path would host->n_ports be non-zero?


> +	/* allocate ports bound to this host */
> +	for (i = 0; i < n_ports; i++) {
> +		struct ata_port *ap;
> +
> +		ap = ata_port_alloc(host, sht);
> +		if (!ap)
> +			return -ENOMEM;
> +
> +		ap->port_no = i;
> +		host->ports[i] = ap;
> +	}
> +
> +	host->n_ports = n_ports;
> +
> +	return 0;
>  }
>  
>  /**
> @@ -5401,6 +5504,9 @@ void ata_host_init(struct ata_host *host
>   *	ap->pflags, so this function can be called multiple times.
>   *	Ports are guaranteed to get started only once.
>   *
> + *	This function also initializes ap->cbl according to
> + *	ATA_FLAG_SATA if cable type isn't set yet.
> + *
>   *	LOCKING:
>   *	Inherited from calling layer (may sleep).
>   *
> @@ -5414,6 +5520,11 @@ int ata_host_start(struct ata_host *host
>  	for (i = 0; i < host->n_ports; i++) {
>  		struct ata_port *ap = host->ports[i];
>  
> +		/* set cable type */
> +		if (ap->cbl == ATA_CBL_NONE && (ap->flags & ATA_FLAG_SATA))
> +			ap->cbl = ATA_CBL_SATA;
> +
> +		/* start ports */
>  		if (ap->pflags & ATA_PFLAG_STARTED)
>  			continue;
>  
> @@ -5430,6 +5541,126 @@ int ata_host_start(struct ata_host *host
>  }
>  
>  /**
> + *	ata_host_attach - attach initialized ATA host
> + *	@host: ATA host to attach
> + *
> + *	Attach initialized ATA host.  @host is allocated using
> + *	ata_host_alloc() and fully initialized by LLD.  This function
> + *	registers @host with ATA and SCSI layers and probe attached
> + *	devices.
> + *
> + *	RETURNS:
> + *	0 on success, -errno otherwise.
> + *
> + *	LOCKING:
> + *	Inherited from calling layer (may sleep).
> + */
> +int ata_host_attach(struct ata_host *host)
> +{
> +	int i, rc;
> +
> +	/* make sure ports are started */
> +	rc = ata_host_start(host);
> +	if (rc)
> +		return rc;
> +
> +	/* perform each probe synchronously */
> +	DPRINTK("probe begin\n");
> +	for (i = 0; i < host->n_ports; i++) {
> +		struct ata_port *ap = host->ports[i];
> +		int irq_line = host->irq;
> +		unsigned long xfer_mode_mask;
> +		u32 scontrol;
> +		int rc;
> +
> +		/* report the secondary IRQ for second channel legacy */
> +		if (i == 1 && host->irq2)
> +			irq_line = host->irq2;
> +
> +		xfer_mode_mask = (ap->udma_mask << ATA_SHIFT_UDMA) |
> +				 (ap->mwdma_mask << ATA_SHIFT_MWDMA) |
> +				 (ap->pio_mask << ATA_SHIFT_PIO);
> +
> +		/* print per-port info to dmesg */
> +		if (ap->ops != &ata_dummy_port_ops)
> +			ata_port_printk(ap, KERN_INFO, "%cATA max %s cmd 0x%lu "
> +					"ctl 0x%lX bmdma 0x%lX irq %d\n",
> +					ap->flags & ATA_FLAG_SATA ? 'S' : 'P',
> +					ata_mode_string(xfer_mode_mask),
> +					ap->ioaddr.cmd_addr,
> +					ap->ioaddr.ctl_addr,
> +					ap->ioaddr.bmdma_addr, irq_line);
> +		else
> +			ata_port_printk(ap, KERN_INFO, "DUMMY port\n");
> +
> +		/* init sata_spd_limit to the current value */
> +		if (sata_scr_read(ap, SCR_CONTROL, &scontrol) == 0) {
> +			int spd = (scontrol >> 4) & 0xf;
> +			ap->hw_sata_spd_limit &= (1 << spd) - 1;
> +		}
> +		ap->sata_spd_limit = ap->hw_sata_spd_limit;
> +
> +		rc = scsi_add_host(ap->scsi_host, host->dev);
> +		if (rc) {
> +			ata_port_printk(ap, KERN_ERR, "scsi_add_host failed\n");
> +			/* FIXME: do something useful here */
> +			/* FIXME: handle unconditional calls to
> +			 * scsi_scan_host and ata_host_remove, below,
> +			 * at the very least
> +			 */
> +		}
> +
> +		if (ap->ops->error_handler) {
> +			struct ata_eh_info *ehi = &ap->eh_info;
> +			unsigned long flags;
> +
> +			ata_port_probe(ap);
> +
> +			/* kick EH for boot probing */
> +			spin_lock_irqsave(ap->lock, flags);
> +
> +			ehi->probe_mask = (1 << ATA_MAX_DEVICES) - 1;
> +			ehi->action |= ATA_EH_SOFTRESET;
> +			ehi->flags |= ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET;
> +
> +			ap->pflags |= ATA_PFLAG_LOADING;
> +			ata_port_schedule_eh(ap);
> +
> +			spin_unlock_irqrestore(ap->lock, flags);
> +
> +			/* wait for EH to finish */
> +			ata_port_wait_eh(ap);
> +		} else {
> +			DPRINTK("ata%u: bus probe begin\n", ap->id);
> +			rc = ata_bus_probe(ap);
> +			DPRINTK("ata%u: bus probe end\n", ap->id);
> +
> +			if (rc) {
> +				/* FIXME: do something useful here?
> +				 * Current libata behavior will
> +				 * tear down everything when
> +				 * the module is removed
> +				 * or the h/w is unplugged.
> +				 */
> +			}
> +		}
> +	}
> +
> +	/* probes are done, now scan each port's disk(s) */
> +	DPRINTK("host probe begin\n");
> +	for (i = 0; i < host->n_ports; i++) {
> +		struct ata_port *ap = host->ports[i];
> +
> +		ata_scsi_scan_host(ap);
> +	}
> +
> +	dev_set_drvdata(host->dev, host);
> +
> +	return 0;
> +}
> +
> +
> +/**
>   *	ata_device_add - Register hardware device with ATA and SCSI layers
>   *	@ent: Probe information describing hardware device to be registered
>   *
> @@ -5455,61 +5686,48 @@ int ata_device_add(const struct ata_prob
>  	int rc;
>  
>  	DPRINTK("ENTER\n");
> -	/* alloc a container for our list of ATA ports (buses) */
> -	host = kzalloc(sizeof(struct ata_host) +
> -		       (ent->n_ports * sizeof(void *)), GFP_KERNEL);
> +
> +	if (!ent->port_ops->error_handler &&
> +	    !(ent->port_flags & (ATA_FLAG_SATA_RESET | ATA_FLAG_SRST))) {
> +		dev_printk(KERN_ERR, dev, "no reset mechanism available\n");
> +		return 0;
> +	}
> +
> +	/* allocate host */
> +	host = ata_host_alloc(dev, ent->sht, ent->n_ports);
>  	if (!host)
>  		return 0;
>  
> -	ata_host_init(host, dev, ent->_host_flags, ent->port_ops);
> -	host->n_ports = ent->n_ports;
>  	host->irq = ent->irq;
>  	host->irq2 = ent->irq2;
>  	host->mmio_base = ent->mmio_base;
>  	host->private_data = ent->private_data;
> +	host->ops = ent->port_ops;
> +	host->flags = ent->_host_flags;
>  
> -	/* register each port bound to this device */
>  	for (i = 0; i < host->n_ports; i++) {
> -		struct ata_port *ap;
> -		unsigned long xfer_mode_mask;
> -		int irq_line = ent->irq;
> -
> -		ap = ata_port_add(ent, host, i);
> -		if (!ap)
> -			goto err_out;
> -
> -		host->ports[i] = ap;
> +		struct ata_port *ap = host->ports[i];
>  
>  		/* dummy? */
>  		if (ent->dummy_port_mask & (1 << i)) {
> -			ata_port_printk(ap, KERN_INFO, "DUMMY\n");
>  			ap->ops = &ata_dummy_port_ops;
>  			continue;
>  		}
>  
> -		/* Report the secondary IRQ for second channel legacy */
> -		if (i == 1 && ent->irq2)
> -			irq_line = ent->irq2;
> -
> -		xfer_mode_mask =(ap->udma_mask << ATA_SHIFT_UDMA) |
> -				(ap->mwdma_mask << ATA_SHIFT_MWDMA) |
> -				(ap->pio_mask << ATA_SHIFT_PIO);
> +		ap->pio_mask = ent->pio_mask;
> +		ap->mwdma_mask = ent->mwdma_mask;
> +		ap->udma_mask = ent->udma_mask;
> +		ap->flags |= ent->port_flags;
> +		ap->ops = ent->port_ops;
>  
> -		/* print per-port info to dmesg */
> -		ata_port_printk(ap, KERN_INFO, "%cATA max %s cmd 0x%lX "
> -				"ctl 0x%lX bmdma 0x%lX irq %d\n",
> -				ap->flags & ATA_FLAG_SATA ? 'S' : 'P',
> -				ata_mode_string(xfer_mode_mask),
> -				ap->ioaddr.cmd_addr,
> -				ap->ioaddr.ctl_addr,
> -				ap->ioaddr.bmdma_addr,
> -				irq_line);
> +		memcpy(&ap->ioaddr, &ent->port[ap->port_no],
> +		       sizeof(struct ata_ioports));
>  	}
>  
>  	/* start ports */
>  	rc = ata_host_start(host);
>  	if (rc)
> -		goto err_out;
> +		goto err_free_host;
>  
>  	/* freeze */
>  	for (i = 0; i < host->n_ports; i++) {
> @@ -5526,7 +5744,7 @@ int ata_device_add(const struct ata_prob
>  	if (rc) {
>  		dev_printk(KERN_ERR, dev, "irq %lu request failed: %d\n",
>  			   ent->irq, rc);
> -		goto err_out;
> +		goto err_free_host;
>  	}
>  
>  	/* do we have a second IRQ for the other channel, eg legacy mode */
> @@ -5540,86 +5758,22 @@ int ata_device_add(const struct ata_prob
>  		if (rc) {
>  			dev_printk(KERN_ERR, dev, "irq %lu request failed: %d\n",
>  				   ent->irq2, rc);
> -			goto err_out_free_irq;
> +			goto err_free_irq;
>  		}
>  	}
>  
> -	/* perform each probe synchronously */
> -	DPRINTK("probe begin\n");
> -	for (i = 0; i < host->n_ports; i++) {
> -		struct ata_port *ap = host->ports[i];
> -		u32 scontrol;
> -		int rc;
> -
> -		/* init sata_spd_limit to the current value */
> -		if (sata_scr_read(ap, SCR_CONTROL, &scontrol) == 0) {
> -			int spd = (scontrol >> 4) & 0xf;
> -			ap->hw_sata_spd_limit &= (1 << spd) - 1;
> -		}
> -		ap->sata_spd_limit = ap->hw_sata_spd_limit;
> -
> -		rc = scsi_add_host(ap->scsi_host, dev);
> -		if (rc) {
> -			ata_port_printk(ap, KERN_ERR, "scsi_add_host failed\n");
> -			/* FIXME: do something useful here */
> -			/* FIXME: handle unconditional calls to
> -			 * scsi_scan_host and ata_host_remove, below,
> -			 * at the very least
> -			 */
> -		}
> -
> -		if (ap->ops->error_handler) {
> -			struct ata_eh_info *ehi = &ap->eh_info;
> -			unsigned long flags;
> -
> -			ata_port_probe(ap);
> -
> -			/* kick EH for boot probing */
> -			spin_lock_irqsave(ap->lock, flags);
> -
> -			ehi->probe_mask = (1 << ATA_MAX_DEVICES) - 1;
> -			ehi->action |= ATA_EH_SOFTRESET;
> -			ehi->flags |= ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET;
> -
> -			ap->pflags |= ATA_PFLAG_LOADING;
> -			ata_port_schedule_eh(ap);
> -
> -			spin_unlock_irqrestore(ap->lock, flags);
> -
> -			/* wait for EH to finish */
> -			ata_port_wait_eh(ap);
> -		} else {
> -			DPRINTK("ata%u: bus probe begin\n", ap->id);
> -			rc = ata_bus_probe(ap);
> -			DPRINTK("ata%u: bus probe end\n", ap->id);
> -
> -			if (rc) {
> -				/* FIXME: do something useful here?
> -				 * Current libata behavior will
> -				 * tear down everything when
> -				 * the module is removed
> -				 * or the h/w is unplugged.
> -				 */
> -			}
> -		}
> -	}
> -
> -	/* probes are done, now scan each port's disk(s) */
> -	DPRINTK("host probe begin\n");
> -	for (i = 0; i < host->n_ports; i++) {
> -		struct ata_port *ap = host->ports[i];
> -
> -		ata_scsi_scan_host(ap);
> -	}
> -
> -	dev_set_drvdata(dev, host);
> +	rc = ata_host_attach(host);
> +	if (rc)
> +		goto err_free_irq2;
>  
> -	VPRINTK("EXIT, returning %u\n", ent->n_ports);
> -	return ent->n_ports; /* success */
> +	return host->n_ports; /* success */
>  
> -err_out_free_irq:
> + err_free_irq2:
> +	if (ent->irq2)
> +		free_irq(ent->irq2, host);
> + err_free_irq:
>  	free_irq(ent->irq, host);
> -err_out:
> + err_free_host:
>  	ata_host_stop(host);
>  	ata_host_free(host);
>  	VPRINTK("EXIT, returning 0\n");
> @@ -5755,8 +5909,10 @@ void ata_host_free(struct ata_host *host
>  	/* free */
>  	for (i = 0; i < host->n_ports; i++) {
>  		struct ata_port *ap = host->ports[i];
> -		if (ap)
> +		if (ap->pflags & ATA_PFLAG_SHOST_OWNER)
>  			scsi_host_put(ap->scsi_host);
> +		else
> +			kfree(ap);

Do we ever have a reason to care about ap->scsi_host in the SAS case?

It seems like we could kill ATA_PFLAG_SHOST_OWNER, and just test 
scsi_host for NULL.


  reply	other threads:[~2006-09-19  5:08 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-08-19  8:57 [PATCHSET] libata: implement new initialization model w/ iomap support, take 2 Tejun Heo
2006-08-19  8:59 ` [PATCH 1/20] libata: kill ata_host_stop() Tejun Heo
2006-08-19 14:51   ` Jeff Garzik
2006-08-19 15:29     ` Tejun Heo
2006-09-19  4:46   ` Jeff Garzik
2006-09-19  4:50     ` Tejun Heo
2006-08-19  8:59 ` [PATCH 2/20] libata: implement ata_host_start/stop() Tejun Heo
2006-08-19  8:59 ` [PATCH 4/20] libata: separate out ata_host_alloc() and ata_host_attach() Tejun Heo
2006-09-19  5:08   ` Jeff Garzik [this message]
2006-09-19  5:48     ` Tejun Heo
2006-08-19  8:59 ` [PATCH 7/20] libata: implement PCI ATA init helpers Tejun Heo
2006-09-19  5:29   ` Jeff Garzik
2006-08-19  8:59 ` [PATCH 6/20] libata: implement legacy " Tejun Heo
2006-09-19  5:26   ` Jeff Garzik
2006-08-19  8:59 ` [PATCH 3/20] libata: implement ata_host_detach() and ata_host_free() Tejun Heo
2006-09-19  4:59   ` Jeff Garzik
2006-08-19  8:59 ` [PATCH 5/20] libata: implement several LLD init helpers Tejun Heo
2006-08-22 22:11   ` Brian King
2006-08-27  9:52     ` Tejun Heo
2006-08-30 21:16       ` Brian King
2006-09-19  5:16   ` Jeff Garzik
2006-09-19  5:57     ` Tejun Heo
2006-08-19  8:59 ` [PATCH 12/20] libata: kill old " Tejun Heo
2006-08-19  8:59 ` [PATCH 8/20] libata: reimplement ata_pci_init_one() using new " Tejun Heo
2006-09-19  5:32   ` Jeff Garzik
2006-09-19  6:04     ` Tejun Heo
2006-09-19  6:09       ` Jeff Garzik
2006-08-19  8:59 ` [PATCH 11/20] libata: use remove_one() for deinit instead of ->host_stop() Tejun Heo
2006-09-19  5:42   ` Jeff Garzik
2006-08-19  8:59 ` [PATCH 10/20] libata: reimplement ata_pci_remove_one() using new PCI init helpers Tejun Heo
2006-08-19  8:59 ` [PATCH 13/20] libata: kill unused ->host_stop() operation and related functions Tejun Heo
2006-09-19  5:42   ` Jeff Garzik
2006-08-19  8:59 ` [PATCH 14/20] libata: use LLD name where possible Tejun Heo
2006-09-19  5:43   ` Jeff Garzik
2006-08-19  8:59 ` [PATCH 17/20] libata: make ata_pci_acquire_resources() handle iomap Tejun Heo
2006-09-19  5:47   ` Jeff Garzik
2006-09-19  6:27     ` Tejun Heo
2006-09-19  6:32       ` Jeff Garzik
2006-08-19  8:59 ` [PATCH 15/20] libata: move ->irq_handler from port_ops to port_info Tejun Heo
2006-09-19  5:43   ` Jeff Garzik
2006-08-19  8:59 ` [PATCH 16/20] libata: make ata_host_alloc() take care of hpriv alloc/free Tejun Heo
2006-09-19  5:45   ` Jeff Garzik
2006-08-19  8:59 ` [PATCH 19/20] libata: kill unused ATA_FLAG_MMIO Tejun Heo
2006-08-19  8:59 ` [PATCH 20/20] libata: move scattered PCI ATA functions into liata-pci.c Tejun Heo
2006-09-19  5:50   ` Jeff Garzik
2006-08-22 22:10 ` [PATCHSET] libata: implement new initialization model w/ iomap support, take 2 Brian King
2006-08-27 10:12   ` Tejun Heo
2006-08-30 20:58     ` Brian King
2006-09-01 13:45       ` Tejun Heo
2006-09-07 13:22         ` Brian King

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=450F7B44.4010300@pobox.com \
    --to=jgarzik@pobox.com \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=albertcc@tw.ibm.com \
    --cc=brking@us.ibm.com \
    --cc=forrest.zhao@intel.com \
    --cc=htejun@gmail.com \
    --cc=linux-ide@vger.kernel.org \
    --cc=mlord@pobox.com \
    --cc=uchang@tw.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).