Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 26 Oct 2001 03:30:02 -0700 (PDT)
From:      Arjan Knepper <arjan@jak.nl>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: i386/30965: Cyclades Cyclom-Yep causes FreeBSD to hang during
Message-ID:  <200110261030.f9QAU2f35044@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR i386/30965; it has been noted by GNATS.

From: Arjan Knepper <arjan@jak.nl>
To: Bruce Evans <bde@zeta.org.au>
Cc: klemscot@klements.com, freebsd-gnats-submit@FreeBSD.org
Subject: Re: i386/30965: Cyclades Cyclom-Yep causes FreeBSD to hang during
Date: Fri, 26 Oct 2001 12:30:51 +0200

 Bruce Evans wrote:
 
 >>>Hello,
 >>>
 >>>There are problems with the Cyclades Cyclom YeP driver. (see PR
 >>>i386/30965). I've put printf's in the driver code on several places to
 >>>check where the point is of hard locking and its seems to be on line
 >>>136 in the /usr/src/sys/pci/cy_pci.c in my situation.
 >>>
 >>>--------<snipped>---------------------------------------------------------------------
 >>>
 >>>       case PLX_9050:
 >>>               outw(ioport + CY_PLX_9050_ICS,
 >>>                   inw(ioport + CY_PLX_9050_ICS) |
 >>>CY_PLX_9050_ICS_IENABLE |
 >>>                   CY_PLX_9050_ICS_LOCAL_IENABLE);
 >>>--------<snipped>---------------------------------------------------------------------
 >>>
 >
 >Sorry I didn't reply to this before.
 >
 >I think it locks up here just because this enables the interrupt, an
 >interrupt occures immediately, and interrupt handling never completes.
 >You could try putting printfs in the interrupt handler (cyintr()).
 >
 I did that already with result that booting the machine leaves it 
 looping in the interrupt handler.
 
 >Or using ddb, put breakpoints at interesting places in the interrupt
 >handler and see if they are hit.  The initial interesting places are
 >the start of the interrupt handler (cyintr()) and when it returns (get
 >the return address using a trace command).
 >
 Ehhummm never used DDB before, I've never done kernel debugging at all 
 but I will give it a try today.
 
 >
 >
 >>>Attached my kernel conf file and below the piece of code containg the
 >>>lines.
 >>>...
 >>>       case PLX_9050:
 >>>               outw(ioport + CY_PLX_9050_ICS,
 >>>                   inw(ioport + CY_PLX_9050_ICS) |
 >>>CY_PLX_9050_ICS_IENABLE |
 >>>                   CY_PLX_9050_ICS_LOCAL_IENABLE);
 >>>               break;
 >>>       case PLX_9060:
 >>>       case PLX_9080:
 >>>       default:                /* Old board, use PLX_9060 values. */
 >>>               outw(ioport + CY_PLX_9060_ICS,
 >>>                   inw(ioport + CY_PLX_9060_ICS) |
 >>>CY_PLX_9060_ICS_IENABLE |
 >>>                   CY_PLX_9060_ICS_LOCAL_IENABLE);
 >>>               break;
 >>>       }
 >>>...
 >>>
 >The corresponding code in Linux has interesting similarities and
 >differences.
 >
 >%                 /* enable interrupts in the PCI interface */
 >% 		plx_ver = cy_readb(cy_pci_addr2 + CyPLX_VER) & 0x0f;
 >% 		switch (plx_ver) {
 >% 		    case PLX_9050:
 >%
 >% 		    cy_writeb(cy_pci_addr0+0x4c, 0x43);
 >% 		    break;
 >%
 >% 		    case PLX_9060:
 >% 		    case PLX_9080:
 >% 		    default: /* Old boards, use PLX_9060 */
 >%
 >% 		    plx_init(cy_pci_addr0, 0x6c);
 >% 		    /* For some yet unknown reason, once the PLX9060 reloads
 >% 		       the EEPROM, the IRQ is lost and, thus, we have to
 >% 		       re-write it to the PCI config. registers.
 >% 		       This will remain here until we find a permanent fix. */
 >% 		    pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, cy_pci_irq);
 >%
 >% 		    cy_writew(cy_pci_addr0+0x68,
 >% 			cy_readw(cy_pci_addr0+0x68)|0x0900);
 >% 		    break;
 >
 >Differences:
 >- for the PLX_9050 case, the magic number 0x43 is spelled non-magically
 >  in FreeBSD, and has a different value (0x41).
 >
 Could you explain this a bit more? What does 'magic number' mean? And 
 why or how is it 'non-magically spelled' in FreeBSD? What does that mean?
 
 >
 >- for the other cases, FreeBSD doesn't do the plx_init() or the IRQ reload
 >  hack.
 >
 >Thes differences may be related to the following commits in the Linux
 >driver:
 >
 >%  * Revision 2.3.2.6   2000/05/05 13:56:05 ivan
 >%  ...
 >%  * Implemented workaround for PLX9050 bug that would cause a system lockup
 >%  * in certain systems, depending on the MMIO addresses allocated to the
 >%  * board
 >
 >%  * ...
 >%  * Revision 2.2.1.9  1998/12/30 18:18:30 ivan
 >%  * Changed access to PLX PCI bridge registers from I/O to MMIO, in
 >%  * order to make PLX9050-based boards work with certain motherboards.
 >%  ...
 >%  * Revision 2.2.2.3   1999/06/28 11:13:29 ivan
 >%  ...
 >%  * Implemented workaround for IRQ setting loss on the PCI configuration
 >%  * registers after a PCI bridge EEPROM reload (affects PLX9060 only);
 >
 >You could try the 0x41 -> 0x43 change easily.  Unfortunately, I don't
 >have docs for any of this.  I have corresponded with ivan@cyclades.com,
 >but not for 2.5 years.
 >
 >Bruce
 >
 

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200110261030.f9QAU2f35044>