diff options
author | Marko Kohtala <marko.kohtala@gmail.com> | 2006-01-06 03:19:44 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-06 11:33:56 -0500 |
commit | 742ec650e9b63ea61891455bb6f76bac37025c78 (patch) | |
tree | 993a734fc7c412c0a0c37e107bff761e0071cfcf /drivers/parport | |
parent | c660629059abbbd0eb56e12f9bb4494f01800bbc (diff) |
[PATCH] parport: phase fixes
Did not move the parport interface properly into IEEE1284_PH_REV_IDLE phase at
end of data due to comparing bytes with nibbles. Internal phase
IEEE1284_PH_HBUSY_DNA became unused, so remove it.
Signed-off-by: Marko Kohtala <marko.kohtala@gmail.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/parport')
-rw-r--r-- | drivers/parport/ieee1284_ops.c | 62 |
1 files changed, 29 insertions, 33 deletions
diff --git a/drivers/parport/ieee1284_ops.c b/drivers/parport/ieee1284_ops.c index ce1e2aad8b10..d6c77658231e 100644 --- a/drivers/parport/ieee1284_ops.c +++ b/drivers/parport/ieee1284_ops.c | |||
@@ -165,17 +165,7 @@ size_t parport_ieee1284_read_nibble (struct parport *port, | |||
165 | /* Does the error line indicate end of data? */ | 165 | /* Does the error line indicate end of data? */ |
166 | if (((i & 1) == 0) && | 166 | if (((i & 1) == 0) && |
167 | (parport_read_status(port) & PARPORT_STATUS_ERROR)) { | 167 | (parport_read_status(port) & PARPORT_STATUS_ERROR)) { |
168 | port->physport->ieee1284.phase = IEEE1284_PH_HBUSY_DNA; | 168 | goto end_of_data; |
169 | DPRINTK (KERN_DEBUG | ||
170 | "%s: No more nibble data (%d bytes)\n", | ||
171 | port->name, i/2); | ||
172 | |||
173 | /* Go to reverse idle phase. */ | ||
174 | parport_frob_control (port, | ||
175 | PARPORT_CONTROL_AUTOFD, | ||
176 | PARPORT_CONTROL_AUTOFD); | ||
177 | port->physport->ieee1284.phase = IEEE1284_PH_REV_IDLE; | ||
178 | break; | ||
179 | } | 169 | } |
180 | 170 | ||
181 | /* Event 7: Set nAutoFd low. */ | 171 | /* Event 7: Set nAutoFd low. */ |
@@ -225,18 +215,25 @@ size_t parport_ieee1284_read_nibble (struct parport *port, | |||
225 | byte = nibble; | 215 | byte = nibble; |
226 | } | 216 | } |
227 | 217 | ||
228 | i /= 2; /* i is now in bytes */ | ||
229 | |||
230 | if (i == len) { | 218 | if (i == len) { |
231 | /* Read the last nibble without checking data avail. */ | 219 | /* Read the last nibble without checking data avail. */ |
232 | port = port->physport; | 220 | if (parport_read_status (port) & PARPORT_STATUS_ERROR) { |
233 | if (parport_read_status (port) & PARPORT_STATUS_ERROR) | 221 | end_of_data: |
234 | port->ieee1284.phase = IEEE1284_PH_HBUSY_DNA; | 222 | DPRINTK (KERN_DEBUG |
223 | "%s: No more nibble data (%d bytes)\n", | ||
224 | port->name, i/2); | ||
225 | |||
226 | /* Go to reverse idle phase. */ | ||
227 | parport_frob_control (port, | ||
228 | PARPORT_CONTROL_AUTOFD, | ||
229 | PARPORT_CONTROL_AUTOFD); | ||
230 | port->physport->ieee1284.phase = IEEE1284_PH_REV_IDLE; | ||
231 | } | ||
235 | else | 232 | else |
236 | port->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL; | 233 | port->physport->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL; |
237 | } | 234 | } |
238 | 235 | ||
239 | return i; | 236 | return i/2; |
240 | #endif /* IEEE1284 support */ | 237 | #endif /* IEEE1284 support */ |
241 | } | 238 | } |
242 | 239 | ||
@@ -256,17 +253,7 @@ size_t parport_ieee1284_read_byte (struct parport *port, | |||
256 | 253 | ||
257 | /* Data available? */ | 254 | /* Data available? */ |
258 | if (parport_read_status (port) & PARPORT_STATUS_ERROR) { | 255 | if (parport_read_status (port) & PARPORT_STATUS_ERROR) { |
259 | port->physport->ieee1284.phase = IEEE1284_PH_HBUSY_DNA; | 256 | goto end_of_data; |
260 | DPRINTK (KERN_DEBUG | ||
261 | "%s: No more byte data (%Zd bytes)\n", | ||
262 | port->name, count); | ||
263 | |||
264 | /* Go to reverse idle phase. */ | ||
265 | parport_frob_control (port, | ||
266 | PARPORT_CONTROL_AUTOFD, | ||
267 | PARPORT_CONTROL_AUTOFD); | ||
268 | port->physport->ieee1284.phase = IEEE1284_PH_REV_IDLE; | ||
269 | break; | ||
270 | } | 257 | } |
271 | 258 | ||
272 | /* Event 14: Place data bus in high impedance state. */ | 259 | /* Event 14: Place data bus in high impedance state. */ |
@@ -318,11 +305,20 @@ size_t parport_ieee1284_read_byte (struct parport *port, | |||
318 | 305 | ||
319 | if (count == len) { | 306 | if (count == len) { |
320 | /* Read the last byte without checking data avail. */ | 307 | /* Read the last byte without checking data avail. */ |
321 | port = port->physport; | 308 | if (parport_read_status (port) & PARPORT_STATUS_ERROR) { |
322 | if (parport_read_status (port) & PARPORT_STATUS_ERROR) | 309 | end_of_data: |
323 | port->ieee1284.phase = IEEE1284_PH_HBUSY_DNA; | 310 | DPRINTK (KERN_DEBUG |
311 | "%s: No more byte data (%Zd bytes)\n", | ||
312 | port->name, count); | ||
313 | |||
314 | /* Go to reverse idle phase. */ | ||
315 | parport_frob_control (port, | ||
316 | PARPORT_CONTROL_AUTOFD, | ||
317 | PARPORT_CONTROL_AUTOFD); | ||
318 | port->physport->ieee1284.phase = IEEE1284_PH_REV_IDLE; | ||
319 | } | ||
324 | else | 320 | else |
325 | port->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL; | 321 | port->physport->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL; |
326 | } | 322 | } |
327 | 323 | ||
328 | return count; | 324 | return count; |