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@xxxxxxx> > --- > 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