Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e62aa046 authored by Ondrej Zary's avatar Ondrej Zary Committed by Linus Torvalds
Browse files

paride: pf driver fixes



The pf driver for parallel port floppy drives seems to be broken.  At least
with Imation SuperDisk with EPAT chip, the driver calls pi_connect() and
pi_disconnect after each transferred sector.  At least with EPAT, this
operation is very expensive - causes drive recalibration.  Thus, transferring
even a single byte (dd if=/dev/pf0 of=/dev/null bs=1 count=1) takes 20
seconds, making the driver useless.

The pf_next_buf() function seems to be broken as it returns 1 always (except
when pf_run is non-zero), causing the loop in do_pf_read_drq (and
do_pf_write_drq) to be executed only once.

The following patch fixes this problem.  It also fixes swapped descriptions in
pf_lock() function and removes DBMSG macro, which seems useless.

Signed-off-by: default avatarOndrej Zary <linux@rainbow-software.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent ba0a7f39
Loading
Loading
Loading
Loading
+14 −11
Original line number Original line Diff line number Diff line
@@ -488,13 +488,11 @@ static int pf_atapi(struct pf_unit *pf, char *cmd, int dlen, char *buf, char *fu
	return r;
	return r;
}
}


#define DBMSG(msg)      ((verbose>1)?(msg):NULL)

static void pf_lock(struct pf_unit *pf, int func)
static void pf_lock(struct pf_unit *pf, int func)
{
{
	char lo_cmd[12] = { ATAPI_LOCK, pf->lun << 5, 0, 0, func, 0, 0, 0, 0, 0, 0, 0 };
	char lo_cmd[12] = { ATAPI_LOCK, pf->lun << 5, 0, 0, func, 0, 0, 0, 0, 0, 0, 0 };


	pf_atapi(pf, lo_cmd, 0, pf_scratch, func ? "unlock" : "lock");
	pf_atapi(pf, lo_cmd, 0, pf_scratch, func ? "lock" : "unlock");
}
}


static void pf_eject(struct pf_unit *pf)
static void pf_eject(struct pf_unit *pf)
@@ -555,7 +553,7 @@ static void pf_mode_sense(struct pf_unit *pf)
	    { ATAPI_MODE_SENSE, pf->lun << 5, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0 };
	    { ATAPI_MODE_SENSE, pf->lun << 5, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0 };
	char buf[8];
	char buf[8];


	pf_atapi(pf, ms_cmd, 8, buf, DBMSG("mode sense"));
	pf_atapi(pf, ms_cmd, 8, buf, "mode sense");
	pf->media_status = PF_RW;
	pf->media_status = PF_RW;
	if (buf[3] & 0x80)
	if (buf[3] & 0x80)
		pf->media_status = PF_RO;
		pf->media_status = PF_RO;
@@ -591,7 +589,7 @@ static void pf_get_capacity(struct pf_unit *pf)
	char buf[8];
	char buf[8];
	int bs;
	int bs;


	if (pf_atapi(pf, rc_cmd, 8, buf, DBMSG("get capacity"))) {
	if (pf_atapi(pf, rc_cmd, 8, buf, "get capacity")) {
		pf->media_status = PF_NM;
		pf->media_status = PF_NM;
		return;
		return;
	}
	}
@@ -804,13 +802,18 @@ static int pf_next_buf(void)
	pf_buf += 512;
	pf_buf += 512;
	pf_block++;
	pf_block++;
	if (!pf_run)
	if (!pf_run)
		return 0;
	if (!pf_count)
		return 1;
		return 1;
	if (!pf_count) {
		spin_lock_irqsave(&pf_spin_lock, saved_flags);
		spin_lock_irqsave(&pf_spin_lock, saved_flags);
		pf_end_request(1);
		pf_end_request(1);
		pf_req = elv_next_request(pf_queue);
		spin_unlock_irqrestore(&pf_spin_lock, saved_flags);
		spin_unlock_irqrestore(&pf_spin_lock, saved_flags);
		if (!pf_req)
			return 1;
			return 1;
		pf_count = pf_req->current_nr_sectors;
		pf_buf = pf_req->buffer;
	}
	return 0;
}
}


static inline void next_request(int success)
static inline void next_request(int success)