Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 89639
b: refs/heads/master
c: d34316a
h: refs/heads/master
i:
  89637: 977a3b1
  89635: e7658d5
  89631: e5201c0
v: v3
  • Loading branch information
Stefan Richter committed Apr 18, 2008
1 parent 5836ac6 commit eff98de
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 6 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 08ddb2f4c270b5dff063f7dbcd7e9248a52e7c65
refs/heads/master: d34316a4bdcd4fef050da584401c7f4ed22482f2
21 changes: 16 additions & 5 deletions trunk/drivers/firewire/fw-ohci.c
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ struct fw_ohci {
int request_generation;
u32 bus_seconds;
bool old_uninorth;
bool bus_reset_packet_quirk;

/*
* Spinlock for accessing fw_ohci data. Never call out of
Expand Down Expand Up @@ -571,14 +572,19 @@ static __le32 *handle_ar_packet(struct ar_context *ctx, __le32 *buffer)
* generation. We only need this for requests; for responses
* we use the unique tlabel for finding the matching
* request.
*
* Alas some chips sometimes emit bus reset packets with a
* wrong generation. We set the correct generation for these
* at a slightly incorrect time (in bus_reset_tasklet).
*/

if (evt == OHCI1394_evt_bus_reset)
ohci->request_generation = (p.header[2] >> 16) & 0xff;
else if (ctx == &ohci->ar_request_ctx)
if (evt == OHCI1394_evt_bus_reset) {
if (!ohci->bus_reset_packet_quirk)
ohci->request_generation = (p.header[2] >> 16) & 0xff;
} else if (ctx == &ohci->ar_request_ctx) {
fw_core_handle_request(&ohci->card, &p);
else
} else {
fw_core_handle_response(&ohci->card, &p);
}

return buffer + length + 1;
}
Expand Down Expand Up @@ -1285,6 +1291,9 @@ static void bus_reset_tasklet(unsigned long data)
context_stop(&ohci->at_response_ctx);
reg_write(ohci, OHCI1394_IntEventClear, OHCI1394_busReset);

if (ohci->bus_reset_packet_quirk)
ohci->request_generation = generation;

/*
* This next bit is unrelated to the AT context stuff but we
* have to do it under the spinlock also. If a new config rom
Expand Down Expand Up @@ -2360,6 +2369,8 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent)
ohci->old_uninorth = dev->vendor == PCI_VENDOR_ID_APPLE &&
dev->device == PCI_DEVICE_ID_APPLE_UNI_N_FW;
#endif
ohci->bus_reset_packet_quirk = dev->vendor == PCI_VENDOR_ID_TI;

spin_lock_init(&ohci->lock);

tasklet_init(&ohci->bus_reset_tasklet,
Expand Down

0 comments on commit eff98de

Please sign in to comment.