void *port = (void *)ap->ioaddr.cmd_addr;
void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr;
static void sil24_error_intr(struct ata_port *ap, u32 slot_stat){	struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag);	struct sil24_port_priv *pp = ap->private_data;	void *port = (void *)ap->ioaddr.cmd_addr;	u32 irq_stat, cmd_err, sstatus, serror;	irq_stat = readl(port + PORT_IRQ_STAT);	writel(irq_stat, port + PORT_IRQ_STAT);		/* clear irq */	if (!(irq_stat & PORT_IRQ_ERROR)) {		/* ignore non-completion, non-error irqs for now */		printk(KERN_WARNING DRV_NAME		       "ata%u: non-error exception irq (irq_stat %x)\n",		       ap->id, irq_stat);		return;	}	cmd_err = readl(port + PORT_CMD_ERR);	sstatus = readl(port + PORT_SSTATUS);	serror = readl(port + PORT_SERROR);	if (serror)		writel(serror, port + PORT_SERROR);	printk(KERN_ERR DRV_NAME " ata%u: error interrupt on port%d\n"	       "  stat=0x%x irq=0x%x cmd_err=%d sstatus=0x%x serror=0x%x\n",	       ap->id, ap->port_no, slot_stat, irq_stat, cmd_err, sstatus, serror);	if (cmd_err == PORT_CERR_DEV || cmd_err == PORT_CERR_SDB) {		/*		 * Device is reporting error, tf registers are valid.		 */		sil24_update_tf(ap);	} else {		/*		 * Other errors.  libata currently doesn't have any		 * mechanism to report these errors.  Just turn on		 * ATA_ERR.		 */		pp->tf.command = ATA_ERR;	}	if (qc)		ata_qc_complete(qc, pp->tf.command);	sil24_reset_controller(ap);}