From: Ben Collins <bcollins@debian.org>
To: gaxt <gaxt@rogers.com>
Cc: Torrey Hoffman <thoffman@arnor.net>,
Sam Bromley <sbromley@cogeco.ca>,
Linux Kernel <linux-kernel@vger.kernel.org>,
linux firewire devel <linux1394-devel@lists.sourceforge.net>
Subject: Re: Firewire
Date: Fri, 25 Jul 2003 14:45:06 -0400 [thread overview]
Message-ID: <20030725184506.GE607@phunnypharm.org> (raw)
In-Reply-To: <20030725182642.GD607@phunnypharm.org>
Maybe it wont. Try reverting back to stock, and apply this patch. I am
pretty sure this will fix the problem for anyone having this issue.
Index: linux-2.6/drivers/ieee1394/ieee1394_core.c
===================================================================
--- linux-2.6/drivers/ieee1394/ieee1394_core.c (revision 1013)
+++ linux-2.6/drivers/ieee1394/ieee1394_core.c (working copy)
@@ -30,7 +30,6 @@
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/bitops.h>
-#include <linux/workqueue.h>
#include <linux/kdev_t.h>
#include <asm/byteorder.h>
#include <asm/semaphore.h>
@@ -441,7 +440,10 @@
spin_unlock_irqrestore(&host->pending_pkt_lock, flags);
up(&packet->state_change);
- schedule_work(&host->timeout_tq);
+ if (!timer_pending(&host->timeout)) {
+ host->timeout.expires = jiffies + IEEE1394_TIMEOUT_INTERVAL;
+ add_timer(&host->timeout);
+ }
}
/**
@@ -618,7 +617,7 @@
}
if (lh == &host->pending_packets) {
- HPSB_DEBUG("unsolicited response packet received - np");
+ HPSB_DEBUG("unsolicited response packet received - no tlabel match");
dump_packet("contents:", data, 16);
spin_unlock_irqrestore(&host->pending_pkt_lock, flags);
return;
@@ -642,7 +641,7 @@
if (!tcode_match || (packet->tlabel != tlabel)
|| (packet->node_id != (data[1] >> 16))) {
- HPSB_INFO("unsolicited response packet received");
+ HPSB_INFO("unsolicited response packet received - tcode mismatch");
dump_packet("contents:", data, 16);
spin_unlock_irqrestore(&host->pending_pkt_lock, flags);
@@ -960,36 +957,33 @@
}
}
-void abort_timedouts(struct hpsb_host *host)
+void abort_timedouts(unsigned long __opaque)
{
+ struct hpsb_host *host = (struct hpsb_host *)__opaque;
unsigned long flags;
struct hpsb_packet *packet;
unsigned long expire;
- struct list_head *lh, *next, *tlh;
+ struct list_head *lh, *tlh;
LIST_HEAD(expiredlist);
spin_lock_irqsave(&host->csr.lock, flags);
- expire = (host->csr.split_timeout_hi * 8000
- + (host->csr.split_timeout_lo >> 19))
- * HZ / 8000;
- /* Avoid shortening of timeout due to rounding errors: */
- expire++;
+ expire = host->csr.expire;
spin_unlock_irqrestore(&host->csr.lock, flags);
-
spin_lock_irqsave(&host->pending_pkt_lock, flags);
- for (lh = host->pending_packets.next; lh != &host->pending_packets; lh = next) {
+ list_for_each_safe(lh, tlh, &host->pending_packets) {
packet = list_entry(lh, struct hpsb_packet, list);
- next = lh->next;
if (time_before(packet->sendtime + expire, jiffies)) {
list_del(&packet->list);
list_add(&packet->list, &expiredlist);
}
}
- if (!list_empty(&host->pending_packets))
- schedule_work(&host->timeout_tq);
+ if (!list_empty(&host->pending_packets)) {
+ host->timeout.expires = jiffies + IEEE1394_TIMEOUT_INTERVAL;
+ add_timer(&host->timeout);
+ }
spin_unlock_irqrestore(&host->pending_pkt_lock, flags);
Index: linux-2.6/drivers/ieee1394/ieee1394_core.h
===================================================================
--- linux-2.6/drivers/ieee1394/ieee1394_core.h (revision 1013)
+++ linux-2.6/drivers/ieee1394/ieee1394_core.h (working copy)
@@ -87,7 +87,7 @@
return list_entry(l, struct hpsb_packet, driver_list);
}
-void abort_timedouts(struct hpsb_host *host);
+void abort_timedouts(unsigned long __opaque);
void abort_requests(struct hpsb_host *host);
struct hpsb_packet *alloc_hpsb_packet(size_t data_size);
Index: linux-2.6/drivers/ieee1394/hosts.c
===================================================================
--- linux-2.6/drivers/ieee1394/hosts.c (revision 1013)
+++ linux-2.6/drivers/ieee1394/hosts.c (working copy)
@@ -16,7 +16,6 @@
#include <linux/list.h>
#include <linux/init.h>
#include <linux/slab.h>
-#include <linux/workqueue.h>
#include "ieee1394_types.h"
#include "hosts.h"
@@ -139,7 +138,9 @@
atomic_set(&h->generation, 0);
- INIT_WORK(&h->timeout_tq, (void (*)(void*))abort_timedouts, h);
+ init_timer(&h->timeout);
+ h->timeout.data = (unsigned long) h;
+ h->timeout.function = abort_timedouts;
h->topology_map = h->csr.topology_map + 3;
h->speed_map = (u8 *)(h->csr.speed_map + 2);
Index: linux-2.6/drivers/ieee1394/hosts.h
===================================================================
--- linux-2.6/drivers/ieee1394/hosts.h (revision 1013)
+++ linux-2.6/drivers/ieee1394/hosts.h (working copy)
@@ -4,7 +4,7 @@
#include <linux/device.h>
#include <linux/wait.h>
#include <linux/list.h>
-#include <linux/workqueue.h>
+#include <linux/timer.h>
#include <asm/semaphore.h>
#include "ieee1394_types.h"
@@ -19,6 +19,11 @@
*/
#define CSR_CONFIG_ROM_SIZE 0x100
+/* The interval which our timer checks for pending packets that have timed
+ * out. This is pretty much 50ms, which is half our default split_timeout
+ * value. */
+#define IEEE1394_TIMEOUT_INTERVAL (HZ / 20)
+
struct hpsb_packet;
struct hpsb_iso;
@@ -33,7 +38,7 @@
struct list_head pending_packets;
spinlock_t pending_pkt_lock;
- struct work_struct timeout_tq;
+ struct timer_list timeout;
unsigned char iso_listen_count[64];
Index: linux-2.6/drivers/ieee1394/csr.c
===================================================================
--- linux-2.6/drivers/ieee1394/csr.c (revision 1013)
+++ linux-2.6/drivers/ieee1394/csr.c (working copy)
@@ -89,7 +89,38 @@
0x3f1));
}
+/*
+ * HI == seconds (bits 0:2)
+ * LO == fraction units of 1/8000 of a second, as per 1394 (bits 19:31)
+ *
+ * Convert to units and then to HZ, for comparison to jiffies.
+ *
+ * By default this will end up being 800 units, or 100ms (125usec per
+ * unit).
+ *
+ * NOTE: The spec says 1/8000, but also says we can compute based on 1/8192
+ * like CSR specifies. Should make our math less complex.
+ */
+static inline void calculate_expire(struct csr_control *csr)
+{
+ unsigned long units;
+
+ /* Take the seconds, and convert to units */
+ units = (unsigned long)(csr->split_timeout_hi & 0x07) << 13;
+ /* Add in the fractional units */
+ units += (unsigned long)(csr->split_timeout_lo >> 19);
+
+ /* Convert to jiffies */
+ csr->expire = (unsigned long)(units * HZ) >> 13UL;
+
+ /* Just to keep from rounding low */
+ csr->expire++;
+
+ HPSB_VERBOSE("CSR: setting expire to %lu, HZ=%lu", csr->expire, HZ);
+}
+
+
static void add_host(struct hpsb_host *host)
{
host->csr.lock = SPIN_LOCK_UNLOCKED;
@@ -100,6 +131,7 @@
host->csr.node_ids = 0;
host->csr.split_timeout_hi = 0;
host->csr.split_timeout_lo = 800 << 19;
+ calculate_expire(&host->csr);
host->csr.cycle_time = 0;
host->csr.bus_time = 0;
host->csr.bus_manager_id = 0x3f;
@@ -336,10 +368,12 @@
case CSR_SPLIT_TIMEOUT_HI:
host->csr.split_timeout_hi =
be32_to_cpu(*(data++)) & 0x00000007;
+ calculate_expire(&host->csr);
out;
case CSR_SPLIT_TIMEOUT_LO:
host->csr.split_timeout_lo =
be32_to_cpu(*(data++)) & 0xfff80000;
+ calculate_expire(&host->csr);
out;
/* address gap */
Index: linux-2.6/drivers/ieee1394/csr.h
===================================================================
--- linux-2.6/drivers/ieee1394/csr.h (revision 1013)
+++ linux-2.6/drivers/ieee1394/csr.h (working copy)
@@ -41,6 +41,7 @@
quadlet_t state;
quadlet_t node_ids;
quadlet_t split_timeout_hi, split_timeout_lo;
+ unsigned long expire; // Calculated from split_timeout
quadlet_t cycle_time;
quadlet_t bus_time;
quadlet_t bus_manager_id;
--
Debian - http://www.debian.org/
Linux 1394 - http://www.linux1394.org/
Subversion - http://subversion.tigris.org/
next prev parent reply other threads:[~2003-07-25 18:41 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-07-24 13:34 Firewire gaxt
2003-07-24 22:35 ` Firewire Chris Ruvolo
2003-07-24 22:36 ` Firewire Ben Collins
2003-07-24 23:09 ` Firewire Chris Ruvolo
2003-07-24 23:14 ` Firewire Ben Collins
2003-07-24 23:48 ` Firewire Chris Ruvolo
2003-07-24 23:45 ` Firewire Ben Collins
2003-07-25 0:07 ` Firewire Chris Ruvolo
2003-07-25 0:14 ` Firewire Chris Ruvolo
2003-07-25 1:13 ` Firewire Torrey Hoffman
2003-07-25 1:27 ` Firewire Chris Ruvolo
2003-07-25 1:29 ` Firewire Ben Collins
2003-07-25 2:00 ` Firewire Chris Ruvolo
2003-07-25 2:19 ` Firewire Ben Collins
2003-07-25 3:23 ` Firewire Sam Bromley
2003-07-25 4:12 ` Firewire Ben Collins
2003-07-25 5:39 ` Firewire Chris Ruvolo
2003-07-25 13:34 ` Firewire Ben Collins
2003-07-25 14:06 ` Firewire gaxt
2003-07-25 13:47 ` Firewire Ben Collins
2003-07-25 14:23 ` Firewire gaxt
2003-07-25 15:28 ` Firewire gaxt
2003-07-25 14:29 ` Firewire Chris Ruvolo
2003-07-25 14:29 ` Firewire Ben Collins
2003-07-25 15:40 ` Firewire Ben Collins
2003-07-25 16:07 ` Firewire Chris Ruvolo
2003-07-25 16:18 ` Firewire Ben Collins
2003-07-25 17:02 ` Firewire Chris Ruvolo
2003-07-25 17:07 ` Firewire Ben Collins
2003-07-25 17:51 ` Firewire Torrey Hoffman
2003-07-25 18:13 ` Firewire Chris Ruvolo
2003-07-25 18:12 ` Firewire Ben Collins
2003-07-25 18:43 ` Firewire gaxt
2003-07-25 18:26 ` Firewire Ben Collins
2003-07-25 18:45 ` Ben Collins [this message]
2003-07-25 19:16 ` Firewire gaxt
2003-07-25 19:35 ` Firewire Chris Ruvolo
2003-07-25 20:11 ` Firewire Ben Collins
2003-07-25 21:48 ` Firewire gaxt
2003-07-26 4:41 ` Firewire (One fix worked, now getting oops) Sam Bromley
2003-07-26 15:12 ` Ben Collins
2003-07-26 17:41 ` Sam Bromley
2003-07-26 17:45 ` Ben Collins
2003-07-26 16:52 ` Firewire Chris Ruvolo
2003-07-26 17:45 ` Firewire Ben Collins
2003-07-25 20:48 ` Firewire Torrey Hoffman
2003-07-25 20:44 ` Firewire Ben Collins
2003-07-25 18:18 ` Firewire Torrey Hoffman
2003-07-25 18:33 ` Firewire gaxt
2003-07-25 16:28 ` Firewire gaxt
2003-07-25 15:53 ` Firewire Chris Ruvolo
2003-07-25 15:47 ` Firewire Ben Collins
2003-07-25 16:14 ` Firewire Chris Ruvolo
2003-07-25 13:34 ` Firewire Ben Collins
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20030725184506.GE607@phunnypharm.org \
--to=bcollins@debian.org \
--cc=gaxt@rogers.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux1394-devel@lists.sourceforge.net \
--cc=sbromley@cogeco.ca \
--cc=thoffman@arnor.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox