summaryrefslogtreecommitdiffstats
path: root/drivers/parport
diff options
context:
space:
mode:
authorOndrej Zary <linux@zary.sk>2023-03-07 23:46:06 +0100
committerDamien Le Moal <damien.lemoal@opensource.wdc.com>2023-03-23 12:22:19 +0900
commit05f0adefd48a2ccbd66b3793d220beb9dcaf6988 (patch)
tree0f25fd15dd5bda7097080a1904ca4a9410b9aa1c /drivers/parport
parent5e4696d5ed37e1b9128de9e557b2ae98e9699b52 (diff)
downloadlinux-05f0adefd48a2ccbd66b3793d220beb9dcaf6988.tar.gz
linux-05f0adefd48a2ccbd66b3793d220beb9dcaf6988.tar.bz2
linux-05f0adefd48a2ccbd66b3793d220beb9dcaf6988.zip
ata: parport_pc: add 16-bit and 8-bit fast EPP transfer flags
PARPORT_EPP_FAST flag currently uses 32-bit I/O port access for data read/write (insl/outsl). Add PARPORT_EPP_FAST_16 and PARPORT_EPP_FAST_8 that use insw/outsw and insb/outsb (and PARPORT_EPP_FAST_32 as alias for PARPORT_EPP_FAST). Signed-off-by: Ondrej Zary <linux@zary.sk> Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Diffstat (limited to 'drivers/parport')
-rw-r--r--drivers/parport/parport_pc.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/parport/parport_pc.c b/drivers/parport/parport_pc.c
index 88e125e36230..3bacbaf16f42 100644
--- a/drivers/parport/parport_pc.c
+++ b/drivers/parport/parport_pc.c
@@ -305,9 +305,15 @@ static size_t parport_pc_epp_read_data(struct parport *port, void *buf,
}
return got;
}
- if ((flags & PARPORT_EPP_FAST) && (length > 1)) {
- if (!(((long)buf | length) & 0x03))
+ if ((length > 1) && ((flags & PARPORT_EPP_FAST_32)
+ || flags & PARPORT_EPP_FAST_16
+ || flags & PARPORT_EPP_FAST_8)) {
+ if ((flags & PARPORT_EPP_FAST_32)
+ && !(((long)buf | length) & 0x03))
insl(EPPDATA(port), buf, (length >> 2));
+ else if ((flags & PARPORT_EPP_FAST_16)
+ && !(((long)buf | length) & 0x01))
+ insw(EPPDATA(port), buf, length >> 1);
else
insb(EPPDATA(port), buf, length);
if (inb(STATUS(port)) & 0x01) {
@@ -334,9 +340,15 @@ static size_t parport_pc_epp_write_data(struct parport *port, const void *buf,
{
size_t written = 0;
- if ((flags & PARPORT_EPP_FAST) && (length > 1)) {
- if (!(((long)buf | length) & 0x03))
+ if ((length > 1) && ((flags & PARPORT_EPP_FAST_32)
+ || flags & PARPORT_EPP_FAST_16
+ || flags & PARPORT_EPP_FAST_8)) {
+ if ((flags & PARPORT_EPP_FAST_32)
+ && !(((long)buf | length) & 0x03))
outsl(EPPDATA(port), buf, (length >> 2));
+ else if ((flags & PARPORT_EPP_FAST_16)
+ && !(((long)buf | length) & 0x01))
+ outsw(EPPDATA(port), buf, length >> 1);
else
outsb(EPPDATA(port), buf, length);
if (inb(STATUS(port)) & 0x01) {