patch-2.2.17 linux/drivers/scsi/ppa.c
Next file: linux/drivers/scsi/ppa.h
Previous file: linux/drivers/scsi/mesh.c
Back to the patch index
Back to the overall index
- Lines: 92
- Date:
Mon Sep 4 18:39:21 2000
- Orig file:
v2.2.16/drivers/scsi/ppa.c
- Orig date:
Mon Sep 4 18:37:35 2000
diff -u --recursive --new-file v2.2.16/drivers/scsi/ppa.c linux/drivers/scsi/ppa.c
@@ -125,7 +125,7 @@
}
retry_entry:
for (i = 0; pb; i++, pb = pb->next) {
- int modes, ppb;
+ int modes, ppb, ppb_hi;
ppa_hosts[i].dev =
parport_register_device(pb, "ppa", NULL, ppa_wakeup,
@@ -150,6 +150,7 @@
}
}
ppb = PPA_BASE(i) = ppa_hosts[i].dev->port->base;
+ ppb_hi = ppa_hosts[i].dev->port->base_hi;
w_ctr(ppb, 0x0c);
modes = ppa_hosts[i].dev->port->modes;
@@ -162,11 +163,11 @@
ppa_hosts[i].mode = PPA_PS2;
if (modes & PARPORT_MODE_PCECPPS2) {
- w_ecr(ppb, 0x20);
+ w_ecr(ppb_hi, 0x20);
ppa_hosts[i].mode = PPA_PS2;
}
if (modes & PARPORT_MODE_PCECPEPP)
- w_ecr(ppb, 0x80);
+ w_ecr(ppb_hi, 0x80);
/* Done configuration */
ppa_pb_release(i);
@@ -322,8 +323,7 @@
}
/*
- * output a string, in whatever mode is available, according to the
- * PPA protocol.
+ * Clear EPP Timeout Bit
*/
static inline void epp_reset(unsigned short ppb)
{
@@ -334,19 +334,23 @@
w_str(ppb, i & 0xfe);
}
-static inline void ecp_sync(unsigned short ppb)
+/*
+ * Wait for empty ECP fifo (if we are in ECP fifo mode only)
+ */
+static inline void ecp_sync(unsigned short hostno)
{
- int i;
+ int i, ppb_hi=ppa_hosts[hostno].dev->port->base_hi;
- if ((r_ecr(ppb) & 0xe0) != 0x80)
- return;
+ if (ppb_hi == 0) return;
- for (i = 0; i < 100; i++) {
- if (r_ecr(ppb) & 0x01)
- return;
- udelay(5);
+ if ((r_ecr(ppb_hi) & 0xe0) == 0x60) { /* mode 011 == ECP fifo mode */
+ for (i = 0; i < 100; i++) {
+ if (r_ecr(ppb_hi) & 0x01)
+ return;
+ udelay(5);
+ }
+ printk("ppa: ECP sync failed as data still present in FIFO.\n");
}
- printk("ppa: ECP sync failed as data still present in FIFO.\n");
}
static int ppa_byte_out(unsigned short base, const char *buffer, int len)
@@ -421,7 +425,7 @@
w_ctr(ppb, 0xc);
r = !(r_str(ppb) & 0x01);
w_ctr(ppb, 0xc);
- ecp_sync(ppb);
+ ecp_sync(host_no);
break;
default:
@@ -474,7 +478,7 @@
w_ctr(ppb, 0x2c);
r = !(r_str(ppb) & 0x01);
w_ctr(ppb, 0x2c);
- ecp_sync(ppb);
+ ecp_sync(host_no);
break;
default:
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)