NetBSD Problem Report #41428

From www@NetBSD.org  Thu May 14 14:27:40 2009
Return-Path: <www@NetBSD.org>
Received: from mail.netbsd.org (mail.netbsd.org [204.152.190.11])
	by www.NetBSD.org (Postfix) with ESMTP id 07C4063B84D
	for <gnats-bugs@gnats.netbsd.org>; Thu, 14 May 2009 14:27:40 +0000 (UTC)
Message-Id: <20090514142739.8E22C63B121@www.NetBSD.org>
Date: Thu, 14 May 2009 14:27:39 +0000 (UTC)
From: kanaoka@ann.hi-ho.ne.jp
Reply-To: kanaoka@ann.hi-ho.ne.jp
To: gnats-bugs@NetBSD.org
Subject: ath_cardbus does not setup latency timer
X-Send-Pr-Version: www-1.0

>Number:         41428
>Category:       kern
>Synopsis:       ath_cardbus does not setup latency timer
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu May 14 14:30:00 +0000 2009
>Originator:     Masanori Kanaoka
>Release:        NetBSD-5.0RELEASE
>Organization:
>Environment:
NetBSD kana1.k.vnop.net 5.0 NetBSD 5.0 (KANA1-M2) #1: Tue May 12 23:20:40 JST 2009  root@kana1.k.vnop.net:/usr/obj/sys/arch/i386/compile/KANA1-M2
>Description:
ath_pci_setup() set latency timer. but ath_cardbus_setup() does not.

>How-To-Repeat:
See ath_cardbus_setup and ath_pci_setup
>Fix:
Index: if_ath_cardbus.c
===================================================================
RCS file: /ftp/cvs/src/sys/dev/cardbus/if_ath_cardbus.c,v
retrieving revision 1.31
diff -u -r1.31 if_ath_cardbus.c
--- if_ath_cardbus.c	10 Jul 2008 05:11:10 -0000	1.31
+++ if_ath_cardbus.c	11 May 2009 14:31:28 -0000
@@ -267,7 +267,7 @@
 	cardbus_chipset_tag_t cc = ct->ct_cc;
 	cardbus_function_tag_t cf = ct->ct_cf;
 	int rc;
-	pcireg_t reg;
+	pcireg_t reg,bhlc,icr,lattimer;

 	if ((rc = cardbus_set_powerstate(ct, csc->sc_tag, PCI_PWR_D0)) != 0)
 		aprint_debug("%s: cardbus_set_powerstate %d\n", __func__, rc);
@@ -280,4 +280,17 @@
 	    PCI_COMMAND_STATUS_REG);
 	reg |= PCI_COMMAND_MASTER_ENABLE | PCI_COMMAND_MEM_ENABLE;
 	cardbus_conf_write(cc, cf, csc->sc_tag, PCI_COMMAND_STATUS_REG, reg);
+
+	/*
+	 * Make sure the latency timer is set to some reasonable
+	 * value.
+	 */
+	bhlc = cardbus_conf_read(cc, cf, csc->sc_tag, CARDBUS_BHLC_REG);
+	icr = cardbus_conf_read(cc, cf, csc->sc_tag, CARDBUS_INTERRUPT_REG);
+	lattimer = MAX(0x10, MIN(0xf8, 8 * PCI_MIN_GNT(icr)));
+	if (CARDBUS_LATTIMER(reg) < lattimer) {
+		bhlc &= ~(CARDBUS_LATTIMER_MASK << CARDBUS_LATTIMER_SHIFT);
+		bhlc |= (lattimer << CARDBUS_LATTIMER_SHIFT);
+		cardbus_conf_write(cc, cf, csc->sc_tag, CARDBUS_BHLC_REG, bhlc);
+	}
 }

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2007 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.