Commit 80265bb3 authored by Chas Williams's avatar Chas Williams Committed by David S. Miller

[ATM]: [he] unconditionalize extra pci reads to flush posted writes

parent 60ce3fec
...@@ -177,9 +177,7 @@ he_writel_internal(struct he_dev *he_dev, unsigned val, unsigned addr, ...@@ -177,9 +177,7 @@ he_writel_internal(struct he_dev *he_dev, unsigned val, unsigned addr,
unsigned flags) unsigned flags)
{ {
he_writel(he_dev, val, CON_DAT); he_writel(he_dev, val, CON_DAT);
#ifdef CONFIG_IA64_SGI_SN2 (void) he_readl(he_dev, CON_DAT); /* flush posted writes */
(void) he_readl(he_dev, CON_DAT);
#endif
he_writel(he_dev, flags | CON_CTL_WRITE | CON_CTL_ADDR(addr), CON_CTL); he_writel(he_dev, flags | CON_CTL_WRITE | CON_CTL_ADDR(addr), CON_CTL);
while (he_readl(he_dev, CON_CTL) & CON_CTL_BUSY); while (he_readl(he_dev, CON_CTL) & CON_CTL_BUSY);
} }
...@@ -1950,9 +1948,6 @@ he_service_rbrq(struct he_dev *he_dev, int group) ...@@ -1950,9 +1948,6 @@ he_service_rbrq(struct he_dev *he_dev, int group)
he_writel(he_dev, RBRQ_MASK(he_dev->rbrq_head), he_writel(he_dev, RBRQ_MASK(he_dev->rbrq_head),
G0_RBRQ_H + (group * 16)); G0_RBRQ_H + (group * 16));
#ifdef CONFIG_IA64_SGI_SN2
(void) he_readl(he_dev, G0_RBRQ_H + (group * 16));
#endif
} }
return pdus_assembled; return pdus_assembled;
...@@ -2045,9 +2040,6 @@ he_service_tbrq(struct he_dev *he_dev, int group) ...@@ -2045,9 +2040,6 @@ he_service_tbrq(struct he_dev *he_dev, int group)
he_writel(he_dev, TBRQ_MASK(he_dev->tbrq_head), he_writel(he_dev, TBRQ_MASK(he_dev->tbrq_head),
G0_TBRQ_H + (group * 16)); G0_TBRQ_H + (group * 16));
#ifdef CONFIG_IA64_SGI_SN2
(void) he_readl(he_dev, G0_TBRQ_H + (group * 16));
#endif
} }
} }
...@@ -2075,12 +2067,8 @@ he_service_rbpl(struct he_dev *he_dev, int group) ...@@ -2075,12 +2067,8 @@ he_service_rbpl(struct he_dev *he_dev, int group)
++moved; ++moved;
} }
if (moved) { if (moved)
he_writel(he_dev, RBPL_MASK(he_dev->rbpl_tail), G0_RBPL_T); he_writel(he_dev, RBPL_MASK(he_dev->rbpl_tail), G0_RBPL_T);
#ifdef CONFIG_IA64_SGI_SN2
(void) he_readl(he_dev, G0_RBPL_T);
#endif
}
} }
#ifdef USE_RBPS #ifdef USE_RBPS
...@@ -2107,12 +2095,8 @@ he_service_rbps(struct he_dev *he_dev, int group) ...@@ -2107,12 +2095,8 @@ he_service_rbps(struct he_dev *he_dev, int group)
++moved; ++moved;
} }
if (moved) { if (moved)
he_writel(he_dev, RBPS_MASK(he_dev->rbps_tail), G0_RBPS_T); he_writel(he_dev, RBPS_MASK(he_dev->rbps_tail), G0_RBPS_T);
#ifdef CONFIG_IA64_SGI_SN2
(void) he_readl(he_dev, G0_RBPS_T);
#endif
}
} }
#endif /* USE_RBPS */ #endif /* USE_RBPS */
...@@ -2209,7 +2193,7 @@ he_tasklet(unsigned long data) ...@@ -2209,7 +2193,7 @@ he_tasklet(unsigned long data)
IRQ_SIZE(CONFIG_IRQ_SIZE) | IRQ_SIZE(CONFIG_IRQ_SIZE) |
IRQ_THRESH(CONFIG_IRQ_THRESH) | IRQ_THRESH(CONFIG_IRQ_THRESH) |
IRQ_TAIL(he_dev->irq_tail), IRQ0_HEAD); IRQ_TAIL(he_dev->irq_tail), IRQ0_HEAD);
(void) he_readl(he_dev, INT_FIFO); /* 8.1.2 controller errata */ (void) he_readl(he_dev, INT_FIFO); /* 8.1.2 controller errata; flush posted writes */
} }
#ifdef USE_TASKLET #ifdef USE_TASKLET
spin_unlock_irqrestore(&he_dev->global_lock, flags); spin_unlock_irqrestore(&he_dev->global_lock, flags);
...@@ -2250,11 +2234,8 @@ he_irq_handler(int irq, void *dev_id, struct pt_regs *regs) ...@@ -2250,11 +2234,8 @@ he_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
#else #else
he_tasklet((unsigned long) he_dev); he_tasklet((unsigned long) he_dev);
#endif #endif
he_writel(he_dev, INT_CLEAR_A, INT_FIFO); he_writel(he_dev, INT_CLEAR_A, INT_FIFO); /* clear interrupt */
/* clear interrupt */ (void) he_readl(he_dev, INT_FIFO); /* flush posted writes */
#ifdef CONFIG_IA64_SGI_SN2
(void) he_readl(he_dev, INT_FIFO);
#endif
} }
spin_unlock_irqrestore(&he_dev->global_lock, flags); spin_unlock_irqrestore(&he_dev->global_lock, flags);
return IRQ_RETVAL(handled); return IRQ_RETVAL(handled);
...@@ -2323,9 +2304,7 @@ __enqueue_tpd(struct he_dev *he_dev, struct he_tpd *tpd, unsigned cid) ...@@ -2323,9 +2304,7 @@ __enqueue_tpd(struct he_dev *he_dev, struct he_tpd *tpd, unsigned cid)
he_dev->tpdrq_tail = new_tail; he_dev->tpdrq_tail = new_tail;
he_writel(he_dev, TPDRQ_MASK(he_dev->tpdrq_tail), TPDRQ_T); he_writel(he_dev, TPDRQ_MASK(he_dev->tpdrq_tail), TPDRQ_T);
#ifdef CONFIG_IA64_SGI_SN2 (void) he_readl(he_dev, TPDRQ_T); /* flush posted writes */
(void) he_readl(he_dev, TPDRQ_T);
#endif
} }
static int static int
...@@ -2475,9 +2454,7 @@ he_open(struct atm_vcc *vcc) ...@@ -2475,9 +2454,7 @@ he_open(struct atm_vcc *vcc)
he_writel_tsr12(he_dev, 0x0, cid); he_writel_tsr12(he_dev, 0x0, cid);
he_writel_tsr13(he_dev, 0x0, cid); he_writel_tsr13(he_dev, 0x0, cid);
he_writel_tsr14(he_dev, 0x0, cid); he_writel_tsr14(he_dev, 0x0, cid);
#ifdef CONFIG_IA64_SGI_SN2 (void) he_readl_tsr0(he_dev, cid); /* flush posted writes */
(void) he_readl_tsr0(he_dev, cid);
#endif
spin_unlock_irqrestore(&he_dev->global_lock, flags); spin_unlock_irqrestore(&he_dev->global_lock, flags);
} }
...@@ -2531,9 +2508,7 @@ he_open(struct atm_vcc *vcc) ...@@ -2531,9 +2508,7 @@ he_open(struct atm_vcc *vcc)
the open/closed indication in rsr0 */ the open/closed indication in rsr0 */
he_writel_rsr0(he_dev, he_writel_rsr0(he_dev,
rsr0 | RSR0_START_PDU | RSR0_OPEN_CONN | aal, cid); rsr0 | RSR0_START_PDU | RSR0_OPEN_CONN | aal, cid);
#ifdef CONFIG_IA64_SGI_SN2 (void) he_readl_rsr0(he_dev, cid); /* flush posted writes */
(void) he_readl_rsr0(he_dev, cid);
#endif
spin_unlock_irqrestore(&he_dev->global_lock, flags); spin_unlock_irqrestore(&he_dev->global_lock, flags);
} }
...@@ -2587,9 +2562,7 @@ he_close(struct atm_vcc *vcc) ...@@ -2587,9 +2562,7 @@ he_close(struct atm_vcc *vcc)
set_current_state(TASK_UNINTERRUPTIBLE); set_current_state(TASK_UNINTERRUPTIBLE);
he_writel_rsr0(he_dev, RSR0_CLOSE_CONN, cid); he_writel_rsr0(he_dev, RSR0_CLOSE_CONN, cid);
#ifdef CONFIG_IA64_SGI_SN2 (void) he_readl_rsr0(he_dev, cid); /* flush posted writes */
(void) he_readl_rsr0(he_dev, cid);
#endif
he_writel_mbox(he_dev, cid, RXCON_CLOSE); he_writel_mbox(he_dev, cid, RXCON_CLOSE);
spin_unlock_irqrestore(&he_dev->global_lock, flags); spin_unlock_irqrestore(&he_dev->global_lock, flags);
...@@ -2638,9 +2611,6 @@ he_close(struct atm_vcc *vcc) ...@@ -2638,9 +2611,6 @@ he_close(struct atm_vcc *vcc)
spin_lock_irqsave(&he_dev->global_lock, flags); spin_lock_irqsave(&he_dev->global_lock, flags);
he_writel_tsr4_upper(he_dev, TSR4_FLUSH_CONN, cid); he_writel_tsr4_upper(he_dev, TSR4_FLUSH_CONN, cid);
/* also clears TSR4_SESSION_ENDED */ /* also clears TSR4_SESSION_ENDED */
#ifdef CONFIG_IA64_SGI_SN2
(void) he_readl_tsr4(he_dev, cid);
#endif
switch (vcc->qos.txtp.traffic_class) { switch (vcc->qos.txtp.traffic_class) {
case ATM_UBR: case ATM_UBR:
...@@ -2652,6 +2622,7 @@ he_close(struct atm_vcc *vcc) ...@@ -2652,6 +2622,7 @@ he_close(struct atm_vcc *vcc)
he_writel_tsr14_upper(he_dev, TSR14_DELETE, cid); he_writel_tsr14_upper(he_dev, TSR14_DELETE, cid);
break; break;
} }
(void) he_readl_tsr4(he_dev, cid); /* flush posted writes */
tpd = __alloc_tpd(he_dev); tpd = __alloc_tpd(he_dev);
if (tpd == NULL) { if (tpd == NULL) {
...@@ -2904,9 +2875,7 @@ he_phy_put(struct atm_dev *atm_dev, unsigned char val, unsigned long addr) ...@@ -2904,9 +2875,7 @@ he_phy_put(struct atm_dev *atm_dev, unsigned char val, unsigned long addr)
spin_lock_irqsave(&he_dev->global_lock, flags); spin_lock_irqsave(&he_dev->global_lock, flags);
he_writel(he_dev, val, FRAMER + (addr*4)); he_writel(he_dev, val, FRAMER + (addr*4));
#ifdef CONFIG_IA64_SGI_SN2 (void) he_readl(he_dev, FRAMER + (addr*4)); /* flush posted writes */
(void) he_readl(he_dev, FRAMER + (addr*4));
#endif
spin_unlock_irqrestore(&he_dev->global_lock, flags); spin_unlock_irqrestore(&he_dev->global_lock, flags);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment