* [PATCH v4 0/4] ata: pata_parport: fix EXP Computer CD-865 with MC-1285B EPP cable
@ 2023-10-05 20:55 Ondrej Zary
2023-10-05 20:55 ` [PATCH 1/4] ata: pata_parport: fix pata_parport_devchk Ondrej Zary
` (4 more replies)
0 siblings, 5 replies; 11+ messages in thread
From: Ondrej Zary @ 2023-10-05 20:55 UTC (permalink / raw)
To: Damien Le Moal, Sudip Mukherjee
Cc: Christoph Hellwig, Sergey Shtylyov, Tim Waugh, linux-parport,
linux-ide, linux-kernel
Two bugfixes, one workaround and IDE command set registers support for fit3
driver. All needed for EXP Computer CD-865 drive with MC-1285B EPP cable to
work.
Signed-off-by: Ondrej Zary <linux@zary.sk>
---
Changes in v4:
- coding style fixes in patch 3
drivers/ata/pata_parport/fit3.c | 14 +-----
drivers/ata/pata_parport/pata_parport.c | 78 ++++++++++++++++++++++++++++++++-
2 files changed, 78 insertions(+), 14 deletions(-)
--
Ondrej Zary
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH 1/4] ata: pata_parport: fix pata_parport_devchk 2023-10-05 20:55 [PATCH v4 0/4] ata: pata_parport: fix EXP Computer CD-865 with MC-1285B EPP cable Ondrej Zary @ 2023-10-05 20:55 ` Ondrej Zary 2023-10-05 20:55 ` [PATCH 2/4] ata: pata_parport: implement set_devctl Ondrej Zary ` (3 subsequent siblings) 4 siblings, 0 replies; 11+ messages in thread From: Ondrej Zary @ 2023-10-05 20:55 UTC (permalink / raw) To: Damien Le Moal, Sudip Mukherjee Cc: Christoph Hellwig, Sergey Shtylyov, Tim Waugh, linux-parport, linux-ide, linux-kernel There's a 'x' missing in 0x55 in pata_parport_devchk(), causing the detection to always fail. Fix it. Fixes: 246a1c4c6b7f ("ata: pata_parport: add driver (PARIDE replacement)") Cc: stable@vger.kernel.org Signed-off-by: Ondrej Zary <linux@zary.sk> Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru> --- drivers/ata/pata_parport/pata_parport.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/ata/pata_parport/pata_parport.c b/drivers/ata/pata_parport/pata_parport.c index 1af64d435d3c..258d189f42e5 100644 --- a/drivers/ata/pata_parport/pata_parport.c +++ b/drivers/ata/pata_parport/pata_parport.c @@ -64,7 +64,7 @@ static bool pata_parport_devchk(struct ata_port *ap, unsigned int device) pi->proto->write_regr(pi, 0, ATA_REG_NSECT, 0xaa); pi->proto->write_regr(pi, 0, ATA_REG_LBAL, 0x55); - pi->proto->write_regr(pi, 0, ATA_REG_NSECT, 055); + pi->proto->write_regr(pi, 0, ATA_REG_NSECT, 0x55); pi->proto->write_regr(pi, 0, ATA_REG_LBAL, 0xaa); nsect = pi->proto->read_regr(pi, 0, ATA_REG_NSECT); -- Ondrej Zary ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/4] ata: pata_parport: implement set_devctl 2023-10-05 20:55 [PATCH v4 0/4] ata: pata_parport: fix EXP Computer CD-865 with MC-1285B EPP cable Ondrej Zary 2023-10-05 20:55 ` [PATCH 1/4] ata: pata_parport: fix pata_parport_devchk Ondrej Zary @ 2023-10-05 20:55 ` Ondrej Zary 2023-10-05 20:55 ` [PATCH 3/4] ata: pata_parport: add custom version of wait_after_reset Ondrej Zary ` (2 subsequent siblings) 4 siblings, 0 replies; 11+ messages in thread From: Ondrej Zary @ 2023-10-05 20:55 UTC (permalink / raw) To: Damien Le Moal, Sudip Mukherjee Cc: Christoph Hellwig, Sergey Shtylyov, Tim Waugh, linux-parport, linux-ide, linux-kernel Add missing ops->sff_set_devctl implementation. Fixes: 246a1c4c6b7f ("ata: pata_parport: add driver (PARIDE replacement)") Cc: stable@vger.kernel.org Signed-off-by: Ondrej Zary <linux@zary.sk> Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru> --- drivers/ata/pata_parport/pata_parport.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/ata/pata_parport/pata_parport.c b/drivers/ata/pata_parport/pata_parport.c index 258d189f42e5..cf87bbb52f1f 100644 --- a/drivers/ata/pata_parport/pata_parport.c +++ b/drivers/ata/pata_parport/pata_parport.c @@ -51,6 +51,13 @@ static void pata_parport_dev_select(struct ata_port *ap, unsigned int device) ata_sff_pause(ap); } +static void pata_parport_set_devctl(struct ata_port *ap, u8 ctl) +{ + struct pi_adapter *pi = ap->host->private_data; + + pi->proto->write_regr(pi, 1, 6, ctl); +} + static bool pata_parport_devchk(struct ata_port *ap, unsigned int device) { struct pi_adapter *pi = ap->host->private_data; @@ -252,6 +259,7 @@ static struct ata_port_operations pata_parport_port_ops = { .hardreset = NULL, .sff_dev_select = pata_parport_dev_select, + .sff_set_devctl = pata_parport_set_devctl, .sff_check_status = pata_parport_check_status, .sff_check_altstatus = pata_parport_check_altstatus, .sff_tf_load = pata_parport_tf_load, -- Ondrej Zary ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 3/4] ata: pata_parport: add custom version of wait_after_reset 2023-10-05 20:55 [PATCH v4 0/4] ata: pata_parport: fix EXP Computer CD-865 with MC-1285B EPP cable Ondrej Zary 2023-10-05 20:55 ` [PATCH 1/4] ata: pata_parport: fix pata_parport_devchk Ondrej Zary 2023-10-05 20:55 ` [PATCH 2/4] ata: pata_parport: implement set_devctl Ondrej Zary @ 2023-10-05 20:55 ` Ondrej Zary 2023-10-05 20:55 ` [PATCH 4/4] ata: pata_parport: fit3: implement IDE command set registers Ondrej Zary 2023-10-06 9:47 ` [PATCH v4 0/4] ata: pata_parport: fix EXP Computer CD-865 with MC-1285B EPP cable Damien Le Moal 4 siblings, 0 replies; 11+ messages in thread From: Ondrej Zary @ 2023-10-05 20:55 UTC (permalink / raw) To: Damien Le Moal, Sudip Mukherjee Cc: Christoph Hellwig, Sergey Shtylyov, Tim Waugh, linux-parport, linux-ide, linux-kernel Some parallel adapters (e.g. EXP Computer MC-1285B EPP Cable) return bogus values when there's no master device present. This can cause reset to fail, preventing the lone slave device (such as EXP Computer CD-865) from working. Add custom version of wait_after_reset that ignores master failure when a slave device is present. The custom version is also needed because the generic ata_sff_wait_after_reset uses direct port I/O for slave device detection. Signed-off-by: Ondrej Zary <linux@zary.sk> Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru> --- drivers/ata/pata_parport/pata_parport.c | 68 ++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/drivers/ata/pata_parport/pata_parport.c b/drivers/ata/pata_parport/pata_parport.c index cf87bbb52f1f..a7adfdcb5e27 100644 --- a/drivers/ata/pata_parport/pata_parport.c +++ b/drivers/ata/pata_parport/pata_parport.c @@ -80,6 +80,72 @@ static bool pata_parport_devchk(struct ata_port *ap, unsigned int device) return (nsect == 0x55) && (lbal == 0xaa); } +static int pata_parport_wait_after_reset(struct ata_link *link, + unsigned int devmask, + unsigned long deadline) +{ + struct ata_port *ap = link->ap; + struct pi_adapter *pi = ap->host->private_data; + unsigned int dev0 = devmask & (1 << 0); + unsigned int dev1 = devmask & (1 << 1); + int rc, ret = 0; + + ata_msleep(ap, ATA_WAIT_AFTER_RESET); + + /* always check readiness of the master device */ + rc = ata_sff_wait_ready(link, deadline); + if (rc) { + /* + * some adapters return bogus values if master device is not + * present, so don't abort now if a slave device is present + */ + if (!dev1) + return rc; + ret = -ENODEV; + } + + /* + * if device 1 was found in ata_devchk, wait for register + * access briefly, then wait for BSY to clear. + */ + if (dev1) { + int i; + + pata_parport_dev_select(ap, 1); + + /* + * Wait for register access. Some ATAPI devices fail + * to set nsect/lbal after reset, so don't waste too + * much time on it. We're gonna wait for !BSY anyway. + */ + for (i = 0; i < 2; i++) { + u8 nsect, lbal; + + nsect = pi->proto->read_regr(pi, 0, ATA_REG_NSECT); + lbal = pi->proto->read_regr(pi, 0, ATA_REG_LBAL); + if (nsect == 1 && lbal == 1) + break; + /* give drive a breather */ + ata_msleep(ap, 50); + } + + rc = ata_sff_wait_ready(link, deadline); + if (rc) { + if (rc != -ENODEV) + return rc; + ret = rc; + } + } + + pata_parport_dev_select(ap, 0); + if (dev1) + pata_parport_dev_select(ap, 1); + if (dev0) + pata_parport_dev_select(ap, 0); + + return ret; +} + static int pata_parport_bus_softreset(struct ata_port *ap, unsigned int devmask, unsigned long deadline) { @@ -94,7 +160,7 @@ static int pata_parport_bus_softreset(struct ata_port *ap, unsigned int devmask, ap->last_ctl = ap->ctl; /* wait the port to become ready */ - return ata_sff_wait_after_reset(&ap->link, devmask, deadline); + return pata_parport_wait_after_reset(&ap->link, devmask, deadline); } static int pata_parport_softreset(struct ata_link *link, unsigned int *classes, -- Ondrej Zary ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 4/4] ata: pata_parport: fit3: implement IDE command set registers 2023-10-05 20:55 [PATCH v4 0/4] ata: pata_parport: fix EXP Computer CD-865 with MC-1285B EPP cable Ondrej Zary ` (2 preceding siblings ...) 2023-10-05 20:55 ` [PATCH 3/4] ata: pata_parport: add custom version of wait_after_reset Ondrej Zary @ 2023-10-05 20:55 ` Ondrej Zary 2023-10-06 9:47 ` [PATCH v4 0/4] ata: pata_parport: fix EXP Computer CD-865 with MC-1285B EPP cable Damien Le Moal 4 siblings, 0 replies; 11+ messages in thread From: Ondrej Zary @ 2023-10-05 20:55 UTC (permalink / raw) To: Damien Le Moal, Sudip Mukherjee Cc: Christoph Hellwig, Sergey Shtylyov, Tim Waugh, linux-parport, linux-ide, linux-kernel fit3 protocol driver does not support accessing IDE control registers (device control/altstatus). The DOS driver does not use these registers either (as observed from DOSEMU trace). But the HW seems to be capable of accessing these registers - I simply tried bit 3 and it works! The control register is required to properly reset ATAPI devices or they will be detected only once (after a power cycle). Tested with EXP Computer CD-865 with MC-1285B EPP cable and TransDisk 3000. Signed-off-by: Ondrej Zary <linux@zary.sk> Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru> --- drivers/ata/pata_parport/fit3.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/drivers/ata/pata_parport/fit3.c b/drivers/ata/pata_parport/fit3.c index bad7aa920cdc..d2b81cf2e16d 100644 --- a/drivers/ata/pata_parport/fit3.c +++ b/drivers/ata/pata_parport/fit3.c @@ -9,11 +9,6 @@ * * The TD-2000 and certain older devices use a different protocol. * Try the fit2 protocol module with them. - * - * NB: The FIT adapters do not appear to support the control - * registers. So, we map ALT_STATUS to STATUS and NO-OP writes - * to the device control register - this means that IDE reset - * will not work on these devices. */ #include <linux/module.h> @@ -37,8 +32,7 @@ static void fit3_write_regr(struct pi_adapter *pi, int cont, int regr, int val) { - if (cont == 1) - return; + regr += cont << 3; switch (pi->mode) { case 0: @@ -59,11 +53,7 @@ static int fit3_read_regr(struct pi_adapter *pi, int cont, int regr) { int a, b; - if (cont) { - if (regr != 6) - return 0xff; - regr = 7; - } + regr += cont << 3; switch (pi->mode) { case 0: -- Ondrej Zary ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v4 0/4] ata: pata_parport: fix EXP Computer CD-865 with MC-1285B EPP cable 2023-10-05 20:55 [PATCH v4 0/4] ata: pata_parport: fix EXP Computer CD-865 with MC-1285B EPP cable Ondrej Zary ` (3 preceding siblings ...) 2023-10-05 20:55 ` [PATCH 4/4] ata: pata_parport: fit3: implement IDE command set registers Ondrej Zary @ 2023-10-06 9:47 ` Damien Le Moal 4 siblings, 0 replies; 11+ messages in thread From: Damien Le Moal @ 2023-10-06 9:47 UTC (permalink / raw) To: Ondrej Zary, Sudip Mukherjee Cc: Christoph Hellwig, Sergey Shtylyov, Tim Waugh, linux-ide, linux-kernel On 10/6/23 05:55, Ondrej Zary wrote: > > Two bugfixes, one workaround and IDE command set registers support for fit3 > driver. All needed for EXP Computer CD-865 drive with MC-1285B EPP cable to > work. > > Signed-off-by: Ondrej Zary <linux@zary.sk> > --- > Changes in v4: > - coding style fixes in patch 3 > > drivers/ata/pata_parport/fit3.c | 14 +----- > drivers/ata/pata_parport/pata_parport.c | 78 ++++++++++++++++++++++++++++++++- > 2 files changed, 78 insertions(+), 14 deletions(-) Applied to for-6.6-fixes. Thanks ! -- Damien Le Moal Western Digital Research ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 0/4] ata: pata_parport: fix EXP Computer CD-865 with MC-1285B EPP cable @ 2023-10-05 19:24 Ondrej Zary 2023-10-05 19:24 ` [PATCH 4/4] ata: pata_parport: fit3: implement IDE command set registers Ondrej Zary 0 siblings, 1 reply; 11+ messages in thread From: Ondrej Zary @ 2023-10-05 19:24 UTC (permalink / raw) To: Damien Le Moal, Sudip Mukherjee Cc: Christoph Hellwig, Sergey Shtylyov, Tim Waugh, linux-parport, linux-ide, linux-kernel Two bugfixes, one workaround and IDE command set registers support for fit3 driver. All needed for EXP Computer CD-865 drive with MC-1285B EPP cable to work. Signed-off-by: Ondrej Zary <linux@zary.sk> --- Changes in v3: - add missing stable tag to first two patches - drop cont_map in patch 4 drivers/ata/pata_parport/fit3.c | 14 +----- drivers/ata/pata_parport/pata_parport.c | 77 ++++++++++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 14 deletions(-) -- Ondrej Zary ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 4/4] ata: pata_parport: fit3: implement IDE command set registers 2023-10-05 19:24 [PATCH v3 " Ondrej Zary @ 2023-10-05 19:24 ` Ondrej Zary 2023-10-05 19:53 ` Sergey Shtylyov 0 siblings, 1 reply; 11+ messages in thread From: Ondrej Zary @ 2023-10-05 19:24 UTC (permalink / raw) To: Damien Le Moal, Sudip Mukherjee Cc: Christoph Hellwig, Sergey Shtylyov, Tim Waugh, linux-parport, linux-ide, linux-kernel fit3 protocol driver does not support accessing IDE control registers (device control/altstatus). The DOS driver does not use these registers either (as observed from DOSEMU trace). But the HW seems to be capable of accessing these registers - I simply tried bit 3 and it works! The control register is required to properly reset ATAPI devices or they will be detected only once (after a power cycle). Tested with EXP Computer CD-865 with MC-1285B EPP cable and TransDisk 3000. Signed-off-by: Ondrej Zary <linux@zary.sk> --- drivers/ata/pata_parport/fit3.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/drivers/ata/pata_parport/fit3.c b/drivers/ata/pata_parport/fit3.c index bad7aa920cdc..d2b81cf2e16d 100644 --- a/drivers/ata/pata_parport/fit3.c +++ b/drivers/ata/pata_parport/fit3.c @@ -9,11 +9,6 @@ * * The TD-2000 and certain older devices use a different protocol. * Try the fit2 protocol module with them. - * - * NB: The FIT adapters do not appear to support the control - * registers. So, we map ALT_STATUS to STATUS and NO-OP writes - * to the device control register - this means that IDE reset - * will not work on these devices. */ #include <linux/module.h> @@ -37,8 +32,7 @@ static void fit3_write_regr(struct pi_adapter *pi, int cont, int regr, int val) { - if (cont == 1) - return; + regr += cont << 3; switch (pi->mode) { case 0: @@ -59,11 +53,7 @@ static int fit3_read_regr(struct pi_adapter *pi, int cont, int regr) { int a, b; - if (cont) { - if (regr != 6) - return 0xff; - regr = 7; - } + regr += cont << 3; switch (pi->mode) { case 0: -- Ondrej Zary ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 4/4] ata: pata_parport: fit3: implement IDE command set registers 2023-10-05 19:24 ` [PATCH 4/4] ata: pata_parport: fit3: implement IDE command set registers Ondrej Zary @ 2023-10-05 19:53 ` Sergey Shtylyov 2023-10-05 20:46 ` Ondrej Zary 0 siblings, 1 reply; 11+ messages in thread From: Sergey Shtylyov @ 2023-10-05 19:53 UTC (permalink / raw) To: Ondrej Zary, Damien Le Moal, Sudip Mukherjee Cc: Christoph Hellwig, Tim Waugh, linux-parport, linux-ide, linux-kernel On 10/5/23 10:24 PM, Ondrej Zary wrote: > fit3 protocol driver does not support accessing IDE control registers > (device control/altstatus). The DOS driver does not use these registers > either (as observed from DOSEMU trace). But the HW seems to be capable > of accessing these registers - I simply tried bit 3 and it works! > > The control register is required to properly reset ATAPI devices or > they will be detected only once (after a power cycle). > > Tested with EXP Computer CD-865 with MC-1285B EPP cable and > TransDisk 3000. > > Signed-off-by: Ondrej Zary <linux@zary.sk> Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru> > --- > drivers/ata/pata_parport/fit3.c | 14 ++------------ > 1 file changed, 2 insertions(+), 12 deletions(-) > > diff --git a/drivers/ata/pata_parport/fit3.c b/drivers/ata/pata_parport/fit3.c > index bad7aa920cdc..d2b81cf2e16d 100644 > --- a/drivers/ata/pata_parport/fit3.c > +++ b/drivers/ata/pata_parport/fit3.c [...] > @@ -59,11 +53,7 @@ static int fit3_read_regr(struct pi_adapter *pi, int cont, int regr) > { > int a, b; > > - if (cont) { > - if (regr != 6) > - return 0xff; > - regr = 7; > - } > + regr += cont << 3; So, is regr == 7 instead of 8 intentional? [...] MBR, Sergey ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 4/4] ata: pata_parport: fit3: implement IDE command set registers 2023-10-05 19:53 ` Sergey Shtylyov @ 2023-10-05 20:46 ` Ondrej Zary 0 siblings, 0 replies; 11+ messages in thread From: Ondrej Zary @ 2023-10-05 20:46 UTC (permalink / raw) To: Sergey Shtylyov Cc: Damien Le Moal, Sudip Mukherjee, Christoph Hellwig, Tim Waugh, linux-parport, linux-ide, linux-kernel On Thursday 05 October 2023 21:53:44 Sergey Shtylyov wrote: > On 10/5/23 10:24 PM, Ondrej Zary wrote: > > > fit3 protocol driver does not support accessing IDE control registers > > (device control/altstatus). The DOS driver does not use these registers > > either (as observed from DOSEMU trace). But the HW seems to be capable > > of accessing these registers - I simply tried bit 3 and it works! > > > > The control register is required to properly reset ATAPI devices or > > they will be detected only once (after a power cycle). > > > > Tested with EXP Computer CD-865 with MC-1285B EPP cable and > > TransDisk 3000. > > > > Signed-off-by: Ondrej Zary <linux@zary.sk> > > Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru> > > > --- > > drivers/ata/pata_parport/fit3.c | 14 ++------------ > > 1 file changed, 2 insertions(+), 12 deletions(-) > > > > diff --git a/drivers/ata/pata_parport/fit3.c b/drivers/ata/pata_parport/fit3.c > > index bad7aa920cdc..d2b81cf2e16d 100644 > > --- a/drivers/ata/pata_parport/fit3.c > > +++ b/drivers/ata/pata_parport/fit3.c > [...] > > @@ -59,11 +53,7 @@ static int fit3_read_regr(struct pi_adapter *pi, int cont, int regr) > > { > > int a, b; > > > > - if (cont) { > > - if (regr != 6) > > - return 0xff; > > - regr = 7; > > - } > > + regr += cont << 3; > > So, is regr == 7 instead of 8 intentional? The original code read ATA_REG_STATUS (7) in context 0 instead of ALT_STATUS (6) in context 1. -- Ondrej Zary ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v2 0/4] ata: pata_parport: fix EXP Computer CD-865 with MC-1285B EPP cable @ 2023-10-04 18:52 Ondrej Zary 2023-10-04 18:52 ` [PATCH 4/4] ata: pata_parport: fit3: implement IDE command set registers Ondrej Zary 0 siblings, 1 reply; 11+ messages in thread From: Ondrej Zary @ 2023-10-04 18:52 UTC (permalink / raw) To: Damien Le Moal, Sudip Mukherjee Cc: Christoph Hellwig, Sergey Shtylyov, Tim Waugh, linux-parport, linux-ide, linux-kernel Two bugfixes, one workaround and IDE command set registers support for fit3 driver. All needed for EXP Computer CD-865 drive with MC-1285B EPP cable to work. Signed-off-by: Ondrej Zary <linux@zary.sk> --- Changes in v2: - include "ata:" in commit names - fixed comments in patch 3 drivers/ata/pata_parport/fit3.c | 16 ++----- drivers/ata/pata_parport/pata_parport.c | 77 ++++++++++++++++++++++++++++++++- 2 files changed, 79 insertions(+), 14 deletions(-) -- Ondrej Zary ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 4/4] ata: pata_parport: fit3: implement IDE command set registers 2023-10-04 18:52 [PATCH v2 0/4] ata: pata_parport: fix EXP Computer CD-865 with MC-1285B EPP cable Ondrej Zary @ 2023-10-04 18:52 ` Ondrej Zary 2023-10-04 22:43 ` Damien Le Moal 0 siblings, 1 reply; 11+ messages in thread From: Ondrej Zary @ 2023-10-04 18:52 UTC (permalink / raw) To: Damien Le Moal, Sudip Mukherjee Cc: Christoph Hellwig, Sergey Shtylyov, Tim Waugh, linux-parport, linux-ide, linux-kernel fit3 protocol driver does not support accessing IDE control registers (device control/altstatus). The DOS driver does not use these registers either (as observed from DOSEMU trace). But the HW seems to be capable of accessing these registers - I simply tried bit 3 and it works! The control register is required to properly reset ATAPI devices or they will be detected only once (after a power cycle). Tested with EXP Computer CD-865 with MC-1285B EPP cable and TransDisk 3000. Signed-off-by: Ondrej Zary <linux@zary.sk> --- drivers/ata/pata_parport/fit3.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/drivers/ata/pata_parport/fit3.c b/drivers/ata/pata_parport/fit3.c index bad7aa920cdc..86b39966755b 100644 --- a/drivers/ata/pata_parport/fit3.c +++ b/drivers/ata/pata_parport/fit3.c @@ -9,11 +9,6 @@ * * The TD-2000 and certain older devices use a different protocol. * Try the fit2 protocol module with them. - * - * NB: The FIT adapters do not appear to support the control - * registers. So, we map ALT_STATUS to STATUS and NO-OP writes - * to the device control register - this means that IDE reset - * will not work on these devices. */ #include <linux/module.h> @@ -35,10 +30,11 @@ * cont = 1 - access the IDE command set */ +static int cont_map[] = { 0x00, 0x08 }; + static void fit3_write_regr(struct pi_adapter *pi, int cont, int regr, int val) { - if (cont == 1) - return; + regr += cont_map[cont]; switch (pi->mode) { case 0: @@ -59,11 +55,7 @@ static int fit3_read_regr(struct pi_adapter *pi, int cont, int regr) { int a, b; - if (cont) { - if (regr != 6) - return 0xff; - regr = 7; - } + regr += cont_map[cont]; switch (pi->mode) { case 0: -- Ondrej Zary ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 4/4] ata: pata_parport: fit3: implement IDE command set registers 2023-10-04 18:52 ` [PATCH 4/4] ata: pata_parport: fit3: implement IDE command set registers Ondrej Zary @ 2023-10-04 22:43 ` Damien Le Moal 0 siblings, 0 replies; 11+ messages in thread From: Damien Le Moal @ 2023-10-04 22:43 UTC (permalink / raw) To: Ondrej Zary, Sudip Mukherjee Cc: Christoph Hellwig, Sergey Shtylyov, Tim Waugh, linux-parport, linux-ide, linux-kernel On 10/5/23 03:52, Ondrej Zary wrote: > fit3 protocol driver does not support accessing IDE control registers > (device control/altstatus). The DOS driver does not use these registers > either (as observed from DOSEMU trace). But the HW seems to be capable > of accessing these registers - I simply tried bit 3 and it works! > > The control register is required to properly reset ATAPI devices or > they will be detected only once (after a power cycle). > > Tested with EXP Computer CD-865 with MC-1285B EPP cable and > TransDisk 3000. > > Signed-off-by: Ondrej Zary <linux@zary.sk> > --- > drivers/ata/pata_parport/fit3.c | 16 ++++------------ > 1 file changed, 4 insertions(+), 12 deletions(-) > > diff --git a/drivers/ata/pata_parport/fit3.c b/drivers/ata/pata_parport/fit3.c > index bad7aa920cdc..86b39966755b 100644 > --- a/drivers/ata/pata_parport/fit3.c > +++ b/drivers/ata/pata_parport/fit3.c > @@ -9,11 +9,6 @@ > * > * The TD-2000 and certain older devices use a different protocol. > * Try the fit2 protocol module with them. > - * > - * NB: The FIT adapters do not appear to support the control > - * registers. So, we map ALT_STATUS to STATUS and NO-OP writes > - * to the device control register - this means that IDE reset > - * will not work on these devices. > */ > > #include <linux/module.h> > @@ -35,10 +30,11 @@ > * cont = 1 - access the IDE command set > */ > > +static int cont_map[] = { 0x00, 0x08 }; > + > static void fit3_write_regr(struct pi_adapter *pi, int cont, int regr, int val) > { > - if (cont == 1) > - return; > + regr += cont_map[cont]; It is a little silly to have that cont_map array for this only... Why not simply "regr += cont << 3;" ? Sergey suggested that already I think. > > switch (pi->mode) { > case 0: > @@ -59,11 +55,7 @@ static int fit3_read_regr(struct pi_adapter *pi, int cont, int regr) > { > int a, b; > > - if (cont) { > - if (regr != 6) > - return 0xff; > - regr = 7; > - } > + regr += cont_map[cont]; > > switch (pi->mode) { > case 0: -- Damien Le Moal Western Digital Research ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2023-10-06 9:47 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-10-05 20:55 [PATCH v4 0/4] ata: pata_parport: fix EXP Computer CD-865 with MC-1285B EPP cable Ondrej Zary 2023-10-05 20:55 ` [PATCH 1/4] ata: pata_parport: fix pata_parport_devchk Ondrej Zary 2023-10-05 20:55 ` [PATCH 2/4] ata: pata_parport: implement set_devctl Ondrej Zary 2023-10-05 20:55 ` [PATCH 3/4] ata: pata_parport: add custom version of wait_after_reset Ondrej Zary 2023-10-05 20:55 ` [PATCH 4/4] ata: pata_parport: fit3: implement IDE command set registers Ondrej Zary 2023-10-06 9:47 ` [PATCH v4 0/4] ata: pata_parport: fix EXP Computer CD-865 with MC-1285B EPP cable Damien Le Moal -- strict thread matches above, loose matches on Subject: below -- 2023-10-05 19:24 [PATCH v3 " Ondrej Zary 2023-10-05 19:24 ` [PATCH 4/4] ata: pata_parport: fit3: implement IDE command set registers Ondrej Zary 2023-10-05 19:53 ` Sergey Shtylyov 2023-10-05 20:46 ` Ondrej Zary 2023-10-04 18:52 [PATCH v2 0/4] ata: pata_parport: fix EXP Computer CD-865 with MC-1285B EPP cable Ondrej Zary 2023-10-04 18:52 ` [PATCH 4/4] ata: pata_parport: fit3: implement IDE command set registers Ondrej Zary 2023-10-04 22:43 ` Damien Le Moal
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox