Lines Matching +full:host +full:- +full:port
2 * sata_vsc.c - Vitesse VSC7174 4 port DPA SATA
5 * Please ALWAYS copy linux-ide@vger.kernel.org
29 * as Documentation/driver-api/libata.rst
43 #include <linux/dma-mapping.h>
83 /* Port stride */
104 return -EINVAL; in vsc_sata_scr_read()
105 *val = readl(link->ap->ioaddr.scr_addr + (sc_reg * 4)); in vsc_sata_scr_read()
114 return -EINVAL; in vsc_sata_scr_write()
115 writel(val, link->ap->ioaddr.scr_addr + (sc_reg * 4)); in vsc_sata_scr_write()
124 mask_addr = ap->host->iomap[VSC_MMIO_BAR] + in vsc_freeze()
125 VSC_SATA_INT_MASK_OFFSET + ap->port_no; in vsc_freeze()
135 mask_addr = ap->host->iomap[VSC_MMIO_BAR] + in vsc_thaw()
136 VSC_SATA_INT_MASK_OFFSET + ap->port_no; in vsc_thaw()
147 mask_addr = ap->host->iomap[VSC_MMIO_BAR] + in vsc_intr_mask_update()
148 VSC_SATA_INT_MASK_OFFSET + ap->port_no; in vsc_intr_mask_update()
160 struct ata_ioports *ioaddr = &ap->ioaddr; in vsc_sata_tf_load()
161 unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR; in vsc_sata_tf_load()
169 if ((tf->ctl & ATA_NIEN) != (ap->last_ctl & ATA_NIEN)) { in vsc_sata_tf_load()
170 ap->last_ctl = tf->ctl; in vsc_sata_tf_load()
171 vsc_intr_mask_update(ap, tf->ctl & ATA_NIEN); in vsc_sata_tf_load()
173 if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) { in vsc_sata_tf_load()
174 writew(tf->feature | (((u16)tf->hob_feature) << 8), in vsc_sata_tf_load()
175 ioaddr->feature_addr); in vsc_sata_tf_load()
176 writew(tf->nsect | (((u16)tf->hob_nsect) << 8), in vsc_sata_tf_load()
177 ioaddr->nsect_addr); in vsc_sata_tf_load()
178 writew(tf->lbal | (((u16)tf->hob_lbal) << 8), in vsc_sata_tf_load()
179 ioaddr->lbal_addr); in vsc_sata_tf_load()
180 writew(tf->lbam | (((u16)tf->hob_lbam) << 8), in vsc_sata_tf_load()
181 ioaddr->lbam_addr); in vsc_sata_tf_load()
182 writew(tf->lbah | (((u16)tf->hob_lbah) << 8), in vsc_sata_tf_load()
183 ioaddr->lbah_addr); in vsc_sata_tf_load()
185 writew(tf->feature, ioaddr->feature_addr); in vsc_sata_tf_load()
186 writew(tf->nsect, ioaddr->nsect_addr); in vsc_sata_tf_load()
187 writew(tf->lbal, ioaddr->lbal_addr); in vsc_sata_tf_load()
188 writew(tf->lbam, ioaddr->lbam_addr); in vsc_sata_tf_load()
189 writew(tf->lbah, ioaddr->lbah_addr); in vsc_sata_tf_load()
192 if (tf->flags & ATA_TFLAG_DEVICE) in vsc_sata_tf_load()
193 writeb(tf->device, ioaddr->device_addr); in vsc_sata_tf_load()
201 struct ata_ioports *ioaddr = &ap->ioaddr; in vsc_sata_tf_read()
204 tf->command = ata_sff_check_status(ap); in vsc_sata_tf_read()
205 tf->device = readw(ioaddr->device_addr); in vsc_sata_tf_read()
206 feature = readw(ioaddr->error_addr); in vsc_sata_tf_read()
207 nsect = readw(ioaddr->nsect_addr); in vsc_sata_tf_read()
208 lbal = readw(ioaddr->lbal_addr); in vsc_sata_tf_read()
209 lbam = readw(ioaddr->lbam_addr); in vsc_sata_tf_read()
210 lbah = readw(ioaddr->lbah_addr); in vsc_sata_tf_read()
212 tf->feature = feature; in vsc_sata_tf_read()
213 tf->nsect = nsect; in vsc_sata_tf_read()
214 tf->lbal = lbal; in vsc_sata_tf_read()
215 tf->lbam = lbam; in vsc_sata_tf_read()
216 tf->lbah = lbah; in vsc_sata_tf_read()
218 if (tf->flags & ATA_TFLAG_LBA48) { in vsc_sata_tf_read()
219 tf->hob_feature = feature >> 8; in vsc_sata_tf_read()
220 tf->hob_nsect = nsect >> 8; in vsc_sata_tf_read()
221 tf->hob_lbal = lbal >> 8; in vsc_sata_tf_read()
222 tf->hob_lbam = lbam >> 8; in vsc_sata_tf_read()
223 tf->hob_lbah = lbah >> 8; in vsc_sata_tf_read()
245 qc = ata_qc_from_tag(ap, ap->link.active_tag); in vsc_port_intr()
246 if (qc && likely(!(qc->tf.flags & ATA_TFLAG_POLLING))) in vsc_port_intr()
255 ap->ops->sff_check_status(ap); in vsc_port_intr()
266 struct ata_host *host = dev_instance; in vsc_sata_interrupt() local
271 status = readl(host->iomap[VSC_MMIO_BAR] + VSC_SATA_INT_STAT_OFFSET); in vsc_sata_interrupt()
275 dev_err(host->dev, in vsc_sata_interrupt()
280 spin_lock(&host->lock); in vsc_sata_interrupt()
282 for (i = 0; i < host->n_ports; i++) { in vsc_sata_interrupt()
285 vsc_port_intr(port_status, host->ports[i]); in vsc_sata_interrupt()
290 spin_unlock(&host->lock); in vsc_sata_interrupt()
314 static void vsc_sata_setup_port(struct ata_ioports *port, void __iomem *base) in vsc_sata_setup_port() argument
316 port->cmd_addr = base + VSC_SATA_TF_CMD_OFFSET; in vsc_sata_setup_port()
317 port->data_addr = base + VSC_SATA_TF_DATA_OFFSET; in vsc_sata_setup_port()
318 port->error_addr = base + VSC_SATA_TF_ERROR_OFFSET; in vsc_sata_setup_port()
319 port->feature_addr = base + VSC_SATA_TF_FEATURE_OFFSET; in vsc_sata_setup_port()
320 port->nsect_addr = base + VSC_SATA_TF_NSECT_OFFSET; in vsc_sata_setup_port()
321 port->lbal_addr = base + VSC_SATA_TF_LBAL_OFFSET; in vsc_sata_setup_port()
322 port->lbam_addr = base + VSC_SATA_TF_LBAM_OFFSET; in vsc_sata_setup_port()
323 port->lbah_addr = base + VSC_SATA_TF_LBAH_OFFSET; in vsc_sata_setup_port()
324 port->device_addr = base + VSC_SATA_TF_DEVICE_OFFSET; in vsc_sata_setup_port()
325 port->status_addr = base + VSC_SATA_TF_STATUS_OFFSET; in vsc_sata_setup_port()
326 port->command_addr = base + VSC_SATA_TF_COMMAND_OFFSET; in vsc_sata_setup_port()
327 port->altstatus_addr = base + VSC_SATA_TF_ALTSTATUS_OFFSET; in vsc_sata_setup_port()
328 port->ctl_addr = base + VSC_SATA_TF_CTL_OFFSET; in vsc_sata_setup_port()
329 port->bmdma_addr = base + VSC_SATA_DMA_CMD_OFFSET; in vsc_sata_setup_port()
330 port->scr_addr = base + VSC_SATA_SCR_STATUS_OFFSET; in vsc_sata_setup_port()
347 struct ata_host *host; in vsc_sata_init_one() local
352 ata_print_version_once(&pdev->dev, DRV_VERSION); in vsc_sata_init_one()
354 /* allocate host */ in vsc_sata_init_one()
355 host = ata_host_alloc_pinfo(&pdev->dev, ppi, 4); in vsc_sata_init_one()
356 if (!host) in vsc_sata_init_one()
357 return -ENOMEM; in vsc_sata_init_one()
365 return -ENODEV; in vsc_sata_init_one()
367 /* map IO regions and initialize host accordingly */ in vsc_sata_init_one()
369 if (rc == -EBUSY) in vsc_sata_init_one()
373 host->iomap = pcim_iomap_table(pdev); in vsc_sata_init_one()
375 mmio_base = host->iomap[VSC_MMIO_BAR]; in vsc_sata_init_one()
377 for (i = 0; i < host->n_ports; i++) { in vsc_sata_init_one()
378 struct ata_port *ap = host->ports[i]; in vsc_sata_init_one()
381 vsc_sata_setup_port(&ap->ioaddr, mmio_base + offset); in vsc_sata_init_one()
383 ata_port_pbar_desc(ap, VSC_MMIO_BAR, -1, "mmio"); in vsc_sata_init_one()
384 ata_port_pbar_desc(ap, VSC_MMIO_BAR, offset, "port"); in vsc_sata_init_one()
390 rc = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); in vsc_sata_init_one()
393 rc = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); in vsc_sata_init_one()
399 * used (unless the default is non-zero). in vsc_sata_init_one()
412 * If bit 28 is clear, each port has its own LED. in vsc_sata_init_one()
417 return ata_host_activate(host, pdev->irq, vsc_sata_interrupt, in vsc_sata_init_one()
440 MODULE_DESCRIPTION("low-level driver for Vitesse VSC7174 SATA controller");