From: thomas schorpp <t.schorpp@gmx.de>
To: SCSI development list <linux-scsi@vger.kernel.org>
Cc: 415864@bugs.debian.org
Subject: Re: aic7xxx: aic7892(B): BUG: soft lockup detected on CPU#0!
Date: Thu, 29 Mar 2007 22:13:32 +0200 [thread overview]
Message-ID: <460C1DEC.4020109@gmx.de> (raw)
In-Reply-To: <4608BF16.3000100@gmx.de>
thomas schorpp wrote:
> thomas schorpp wrote:
>> thomas schorpp wrote:
>>> James Bottomley wrote:
>>>> On Sat, 2007-03-24 at 01:51 +0100, thomas schorpp wrote:
>>>>>> no. so the pci layer reports wrong start:
>>>>> nonsense. it succeeds, confused function return with the error flag:
>>>>>
>>>>> // u_long start;
>>>>> // u_long start = 0xFFEFF000;
>>>>> u_long start = 0x30000000;
>>>>> int error;
>>>>>
>>>>> struct resource* ret1;
>>>>> error = 0;
>>>>> // start = pci_resource_start(ahc->dev_softc, 1);
>>>>> if (start != 0) {
>>>>> *bus_addr = start;
>>>>> if ((ret1 = request_mem_region(start, 0x1000,
>>>>> "aic7xxx")) == 0)
>>>>
>>>> You can't do this. The pci_resource_start is getting the address of
>>>> something called a Bus Address Register (BAR) it says in physical
>>>> address space where the card is responding ... you can't simply set
>>>> that
>>>> to a random value.
>>>>
>>>> The problem you seem to have is that your system is reporting a BAR
>>>> beyond 32 bits (4GB) which the card physically can't use. This
>>>> could be
>>>> because of a BIOS misconfiguration or because there's a bug in the PCI
>>>> subsystem somewhere.
>>>>
>>>> James
>>>
>>> understood. waiting for LKML answers... meanwhile i found harder
>>> reason for a possible bounds problem with the driver code on x86_64:
>>>
>>> if i do:
>>>
>>> static int
>>> ahc_linux_pci_reserve_mem_region(struct ahc_softc *ahc,
>>> u_long *bus_addr,
>>> uint8_t __iomem **maddr)
>>> {
>>> // u_long start;
>>> uint32_t start;
>>>
>>> i get no free warning of "*nonexistant* resource" (it cant be
>>> nonexistant, cause it was definitely something mapped):
>>>
>>> tom1:/usr/src/linux# dmesg |grep -i free
>>> Freeing unused kernel memory: 208k freed
>>>
>>> with u_long type start i get it:
>>> Mar 24 03:41:47 localhost kernel: Trying to free nonexistent resource
>>> <00000000fffff000-00000000ffffffff>
>>>
>>> investigating further...
>>> -
>>
>> hmm well i dont get the free warning cause
>>
>> release_mem_region(ahc->platform_data->mem_busaddr,
>> 0x1000);
>> isnt called, the hack fails
>> error = ahc_linux_pci_reserve_mem_region(ahc, &base, &maddr);
>> if (error == 0) {
>>
>> ok, so no bounds issue in the driver.
>>
>
> LKML people are ignoring my report, i take this as agreement to a mb
> bios issue.
> will test the card with a latest debian kernel x86_64 netinstall cd on
> some other amd64 machine, but i need to find some in my reach here.
> i need more confirmation before working in the linux pci hal.
>
no other amd64 machines in reach.
here's my "fix". seems to be a h/w bug of the adaptec 19160 hba card,
it is just faking 64bit BAR from the register read, doesn't care on i386 arch
due to incomplete error handling ;) , but on x86_64 arch. since here and on
LKML is no public interest in a real fix, I do no further investigation.
Users, *DON'T try this at home, it may break real 64bit BAR cards* (if there're any for PCI32)!
drivers/pci/probe.c
static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
{
[...]
if ((l & (PCI_BASE_ADDRESS_SPACE | PCI_BASE_ADDRESS_MEM_TYPE_MASK))
== (PCI_BASE_ADDRESS_SPACE_MEMORY | PCI_BASE_ADDRESS_MEM_TYPE_64)) {
u32 szhi, lhi;
pci_read_config_dword(dev, reg+4, &lhi);
lhi = 0; //schorpp
pci_write_config_dword(dev, reg+4, ~0);
pci_read_config_dword(dev, reg+4, &szhi);
pci_write_config_dword(dev, reg+4, lhi); //kill the wrong read 0x0F
szhi = pci_size(lhi, szhi, 0xffffffff);
next++;
printk(KERN_ERR "PCI: 64-bit check REG for device %s l %lx%lx sz %lx%lx start %llx end %llx flags $
pci_name(dev), lhi, l, szhi, sz, res->start, res->end, res->flags);
#if BITS_PER_LONG == 64 //the cause, more checks for buggy h/w needed or platform dep. bug somewhere deeper
res->start |= ((unsigned long) lhi) << 32;
res->end = res->start + sz;
printk(KERN_ERR "PCI: 64-bit BAR check 1 for device %s l %lx%lx sz %lx%lx start %llx end %llx flag$
pci_name(dev), lhi, l, szhi, sz, res->start, res->end, res->flags);
[...]
hba fine again:
tom1:/usr/src/linux# lspci -vvv -s 00:06.0
00:06.0 SCSI storage controller: Adaptec AIC-7892B U160/m (rev 02)
Subsystem: Adaptec 19160 Ultra160 SCSI Controller
Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR+ FastB2B-
Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR-
Latency: 32 (10000ns min, 6250ns max), Cache Line Size: 64 bytes
Interrupt: pin A routed to IRQ 17
BIST result: 00
Region 0: I/O ports at d800 [disabled] [size=256]
Region 1: Memory at 30000000 (64-bit, non-prefetchable) [size=4K]
Expansion ROM at fbee0000 [disabled] [size=128K]
Capabilities: [dc] Power Management version 2
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
Status: D0 PME-Enable- DSel=0 DScale=0 PME-
tom1:/usr/src/linux# uname -a
Linux tom1 2.6.20.4 #30 PREEMPT Thu Mar 29 21:07:10 CEST 2007 x86_64 GNU/Linux
@debian-maintainers: Your decision if close 415864 or not. but if no one else complains why not.
y
tom
prev parent reply other threads:[~2007-03-29 20:13 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-03-22 15:14 aic7xxx: aic7892(B): BUG: soft lockup detected on CPU#0! thomas schorpp
2007-03-22 16:57 ` thomas schorpp
2007-03-22 21:02 ` thomas schorpp
2007-03-22 23:00 ` thomas schorpp
2007-03-23 1:26 ` thomas schorpp
2007-03-23 4:45 ` James Bottomley
2007-03-23 7:32 ` thomas schorpp
2007-03-23 16:28 ` thomas schorpp
2007-03-23 17:23 ` James Bottomley
2007-03-23 18:23 ` thomas schorpp
2007-03-23 18:59 ` thomas schorpp
2007-03-24 0:51 ` thomas schorpp
2007-03-24 1:17 ` James Bottomley
2007-03-24 3:44 ` thomas schorpp
2007-03-24 4:05 ` thomas schorpp
2007-03-27 6:52 ` thomas schorpp
2007-03-29 20:13 ` thomas schorpp [this message]
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=460C1DEC.4020109@gmx.de \
--to=t.schorpp@gmx.de \
--cc=415864@bugs.debian.org \
--cc=linux-scsi@vger.kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.