| .. | .. | 
|---|
| 1199 | 1199 | return sprintf(buf, "%d\n", emp->blink_policy); | 
|---|
| 1200 | 1200 | } | 
|---|
| 1201 | 1201 |  | 
|---|
|  | 1202 | +static void ahci_port_clear_pending_irq(struct ata_port *ap) | 
|---|
|  | 1203 | +{ | 
|---|
|  | 1204 | +	struct ahci_host_priv *hpriv = ap->host->private_data; | 
|---|
|  | 1205 | +	void __iomem *port_mmio = ahci_port_base(ap); | 
|---|
|  | 1206 | +	u32 tmp; | 
|---|
|  | 1207 | + | 
|---|
|  | 1208 | +	/* clear SError */ | 
|---|
|  | 1209 | +	tmp = readl(port_mmio + PORT_SCR_ERR); | 
|---|
|  | 1210 | +	dev_dbg(ap->host->dev, "PORT_SCR_ERR 0x%x\n", tmp); | 
|---|
|  | 1211 | +	writel(tmp, port_mmio + PORT_SCR_ERR); | 
|---|
|  | 1212 | + | 
|---|
|  | 1213 | +	/* clear port IRQ */ | 
|---|
|  | 1214 | +	tmp = readl(port_mmio + PORT_IRQ_STAT); | 
|---|
|  | 1215 | +	dev_dbg(ap->host->dev, "PORT_IRQ_STAT 0x%x\n", tmp); | 
|---|
|  | 1216 | +	if (tmp) | 
|---|
|  | 1217 | +		writel(tmp, port_mmio + PORT_IRQ_STAT); | 
|---|
|  | 1218 | + | 
|---|
|  | 1219 | +	writel(1 << ap->port_no, hpriv->mmio + HOST_IRQ_STAT); | 
|---|
|  | 1220 | +} | 
|---|
|  | 1221 | + | 
|---|
| 1202 | 1222 | static void ahci_port_init(struct device *dev, struct ata_port *ap, | 
|---|
| 1203 | 1223 | int port_no, void __iomem *mmio, | 
|---|
| 1204 | 1224 | void __iomem *port_mmio) | 
|---|
| .. | .. | 
|---|
| 1213 | 1233 | if (rc) | 
|---|
| 1214 | 1234 | dev_warn(dev, "%s (%d)\n", emsg, rc); | 
|---|
| 1215 | 1235 |  | 
|---|
| 1216 |  | -	/* clear SError */ | 
|---|
| 1217 |  | -	tmp = readl(port_mmio + PORT_SCR_ERR); | 
|---|
| 1218 |  | -	VPRINTK("PORT_SCR_ERR 0x%x\n", tmp); | 
|---|
| 1219 |  | -	writel(tmp, port_mmio + PORT_SCR_ERR); | 
|---|
| 1220 |  | - | 
|---|
| 1221 |  | -	/* clear port IRQ */ | 
|---|
| 1222 |  | -	tmp = readl(port_mmio + PORT_IRQ_STAT); | 
|---|
| 1223 |  | -	VPRINTK("PORT_IRQ_STAT 0x%x\n", tmp); | 
|---|
| 1224 |  | -	if (tmp) | 
|---|
| 1225 |  | -		writel(tmp, port_mmio + PORT_IRQ_STAT); | 
|---|
| 1226 |  | - | 
|---|
| 1227 |  | -	writel(1 << port_no, mmio + HOST_IRQ_STAT); | 
|---|
|  | 1236 | +	ahci_port_clear_pending_irq(ap); | 
|---|
| 1228 | 1237 |  | 
|---|
| 1229 | 1238 | /* mark esata ports */ | 
|---|
| 1230 | 1239 | tmp = readl(port_mmio + PORT_CMD); | 
|---|
| .. | .. | 
|---|
| 1251 | 1260 | } | 
|---|
| 1252 | 1261 |  | 
|---|
| 1253 | 1262 | tmp = readl(mmio + HOST_CTL); | 
|---|
| 1254 |  | -	VPRINTK("HOST_CTL 0x%x\n", tmp); | 
|---|
|  | 1263 | +	dev_dbg(host->dev, "HOST_CTL 0x%x\n", tmp); | 
|---|
| 1255 | 1264 | writel(tmp | HOST_IRQ_EN, mmio + HOST_CTL); | 
|---|
| 1256 | 1265 | tmp = readl(mmio + HOST_CTL); | 
|---|
| 1257 |  | -	VPRINTK("HOST_CTL 0x%x\n", tmp); | 
|---|
|  | 1266 | +	dev_dbg(host->dev, "HOST_CTL 0x%x\n", tmp); | 
|---|
| 1258 | 1267 | } | 
|---|
| 1259 | 1268 | EXPORT_SYMBOL_GPL(ahci_init_controller); | 
|---|
| 1260 | 1269 |  | 
|---|
| .. | .. | 
|---|
| 1454 | 1463 | *class = ahci_dev_classify(ap); | 
|---|
| 1455 | 1464 |  | 
|---|
| 1456 | 1465 | /* re-enable FBS if disabled before */ | 
|---|
| 1457 |  | -	if (fbs_disabled) | 
|---|
|  | 1466 | +	if (fbs_disabled || (!ata_is_host_link(link) && pp->fbs_supported)) | 
|---|
| 1458 | 1467 | ahci_enable_fbs(ap); | 
|---|
| 1459 | 1468 |  | 
|---|
| 1460 | 1469 | DPRINTK("EXIT, class=%u\n", *class); | 
|---|
| .. | .. | 
|---|
| 1553 | 1562 | ata_tf_init(link->device, &tf); | 
|---|
| 1554 | 1563 | tf.command = ATA_BUSY; | 
|---|
| 1555 | 1564 | ata_tf_to_fis(&tf, 0, 0, d2h_fis); | 
|---|
|  | 1565 | + | 
|---|
|  | 1566 | +	ahci_port_clear_pending_irq(ap); | 
|---|
| 1556 | 1567 |  | 
|---|
| 1557 | 1568 | rc = sata_link_hardreset(link, timing, deadline, online, | 
|---|
| 1558 | 1569 | ahci_check_ready); | 
|---|
| .. | .. | 
|---|
| 1905 | 1916 | void __iomem *port_mmio = ahci_port_base(ap); | 
|---|
| 1906 | 1917 | u32 status; | 
|---|
| 1907 | 1918 |  | 
|---|
| 1908 |  | -	VPRINTK("ENTER\n"); | 
|---|
| 1909 |  | - | 
|---|
| 1910 | 1919 | status = readl(port_mmio + PORT_IRQ_STAT); | 
|---|
| 1911 | 1920 | writel(status, port_mmio + PORT_IRQ_STAT); | 
|---|
| 1912 | 1921 |  | 
|---|
| 1913 | 1922 | spin_lock(ap->lock); | 
|---|
| 1914 | 1923 | ahci_handle_port_interrupt(ap, port_mmio, status); | 
|---|
| 1915 | 1924 | spin_unlock(ap->lock); | 
|---|
| 1916 |  | - | 
|---|
| 1917 |  | -	VPRINTK("EXIT\n"); | 
|---|
| 1918 | 1925 |  | 
|---|
| 1919 | 1926 | return IRQ_HANDLED; | 
|---|
| 1920 | 1927 | } | 
|---|
| .. | .. | 
|---|
| 1932 | 1939 | ap = host->ports[i]; | 
|---|
| 1933 | 1940 | if (ap) { | 
|---|
| 1934 | 1941 | ahci_port_intr(ap); | 
|---|
| 1935 |  | -			VPRINTK("port %u\n", i); | 
|---|
| 1936 | 1942 | } else { | 
|---|
| 1937 |  | -			VPRINTK("port %u (no irq)\n", i); | 
|---|
| 1938 | 1943 | if (ata_ratelimit()) | 
|---|
| 1939 | 1944 | dev_warn(host->dev, | 
|---|
| 1940 | 1945 | "interrupt on disabled port %u\n", i); | 
|---|
| .. | .. | 
|---|
| 1954 | 1959 | unsigned int rc = 0; | 
|---|
| 1955 | 1960 | void __iomem *mmio; | 
|---|
| 1956 | 1961 | u32 irq_stat, irq_masked; | 
|---|
| 1957 |  | - | 
|---|
| 1958 |  | -	VPRINTK("ENTER\n"); | 
|---|
| 1959 | 1962 |  | 
|---|
| 1960 | 1963 | hpriv = host->private_data; | 
|---|
| 1961 | 1964 | mmio = hpriv->mmio; | 
|---|
| .. | .. | 
|---|
| 1983 | 1986 | writel(irq_stat, mmio + HOST_IRQ_STAT); | 
|---|
| 1984 | 1987 |  | 
|---|
| 1985 | 1988 | spin_unlock(&host->lock); | 
|---|
| 1986 |  | - | 
|---|
| 1987 |  | -	VPRINTK("EXIT\n"); | 
|---|
| 1988 | 1989 |  | 
|---|
| 1989 | 1990 | return IRQ_RETVAL(rc); | 
|---|
| 1990 | 1991 | } | 
|---|