Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 Jul 2002 11:11:49 +0100 (BST)
From:      Andrew Back <andrew@unfortu.net>
To:        "M. Warner Losh" <imp@bsdimp.com>
Cc:        tony@valemount.com, <mobile@FreeBSD.ORG>
Subject:   Re: PCI -> PCMCIA Adapter woes - patch
Message-ID:  <20020724110719.V82387-100000@plum.flirble.org>
In-Reply-To: <20020723.184204.123399222.imp@bsdimp.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi,

Well I tried both patches. First applying Tony's, rebuilding the kernel
and rebooting. Then with loader.conf changes. And then backed out the
patch and tried Warner's, with and without loader.conf mods.

I got the same result every time, detects card insertion and removal, but
'null' cards. When I try 'pccardc dumpcis' with a card inserted I get:

read returned -1 bytes (expected 2)
cannot allocate memory

Have I missed something else? Like set memory address in rc.conf for
pccard bridge?

Cheers,

Andrew

On Tue, 23 Jul 2002, M. Warner Losh wrote:

> OK.  Here's my first cut at a patch.  Lemme know if it works for you?
> Seems to work for me on my laptop, but its IRQMUX register is
> initialized so this code has no effect.  Also, if you are using
> hw.pcic.init_routing=1 can you try it w/o it too.  It is a little
> longer than your patch, but should work well.
>
> Warner
>
> Index: pcic_pci.c
> ===================================================================
> RCS file: /cache/ncvs/src/sys/pccard/pcic_pci.c,v
> diff -u -r1.58 -r1.57
> --- //depot/user/imp/newcard/pccard/pcic_pci.c	2002/07/20 15:35:40
> +++ //depot/user/imp/newcard/pccard/pcic_pci.c	2002/07/23 21:54:33
> @@ -699,6 +699,61 @@
>  static int
>  pcic_pci_ti12xx_func(struct pcic_slot *sp, enum pcic_intr_way way)
>  {
> +	u_int32_t	syscntl, devcntl, cardcntl, muxctl;
> +	device_t	dev = sp->sc->dev;
> +
> +	syscntl  = pci_read_config(dev, TI113X_PCI_SYSTEM_CONTROL, 4);
> +	devcntl  = pci_read_config(dev, TI113X_PCI_DEVICE_CONTROL, 1);
> +	cardcntl = pci_read_config(dev, TI113X_PCI_CARD_CONTROL,   1);
> +	muxctl  = pci_read_config(dev, TI12XX_PCI_IRQMUX, 4);
> +
> +	/*
> +	 * Special code for the Orinoco cards (and a few others).  They
> +	 * seem to need this special code to make them work only over pci
> +	 * interrupts.  Sadly, doing this code also causes problems for
> +	 * many laptops, so we have to make it controlled by a tunable.
> +	 * Actually, experience has shown that this rarely, if ever,
> +	 * helps.
> +	 */
> +	if (way == pcic_iw_pci) {
> +		/*
> +		 * pcic_init_routing seems to do nothing useful towards
> +		 * fixing the hang problems.  I plan on removing it in
> +		 * 4.8 or so.
> +		 */
> +		if (pcic_init_routing) {
> +			devcntl &= ~TI113X_DEVCNTL_INTR_MASK;
> +			pci_write_config(dev, TI113X_PCI_DEVICE_CONTROL,
> +			    devcntl, 1);
> +			syscntl |= TI113X_SYSCNTL_INTRTIE;
> +		}
> +		/*
> +		 * I'm not sure that this helps/hurts things at all and
> +		 * plan on removing it in the 4.8 time frame unless someone
> +		 * can show that it really helps.
> +		 */
> +		syscntl &= ~TI113X_SYSCNTL_SMIENB;
> +		pci_write_config(dev, TI113X_PCI_SYSTEM_CONTROL, syscntl, 1);
> +
> +		/*
> +		 * Some PCI add-in cards don't have good EEPROMs on them,
> +		 * so they get this MUX register wrong.  The MUX register
> +		 * defaults to 0, which is usually wrong for this register,
> +		 * so we initialize it to make sense.
> +		 *
> +		 * We don't bother to turn it off in the ISA case since it
> +		 * is an initialization issue.
> +		 */
> +		if (muxctl == 0) {
> +			muxctl = (muxctl & ~TI12XX_IRQMUX_PIN0) |
> +			    TI12XX_IRQMUX_PIN0_INTA;
> +			if ((syscntl & TI113X_SYSCNTL_INTRTIE) == 0)
> +				muxctl = (muxctl & ~TI12XX_IRQMUX_PIN1) |
> +				    TI12XX_IRQMUX_PIN1_INTB;
> +			pci_write_config(dev, TI12XX_PCI_IRQMUX, muxctl, 4);
> +		}
> +
> +	}
>  	return (pcic_pci_gen_func(sp, way));
>  }
>
> @@ -727,7 +782,6 @@
>  {
>  	u_int32_t	syscntl, diagctl, devcntl, cardcntl;
>  	u_int32_t	device_id = pci_get_devid(dev);
> -	struct pcic_softc *sc = device_get_softc(dev);
>  	int	 	ti113x = (device_id == PCI_DEVICE_ID_PCIC_TI1031) ||
>  	    (device_id == PCI_DEVICE_ID_PCIC_TI1130) ||
>  	    (device_id == PCI_DEVICE_ID_PCIC_TI1131);
> @@ -762,28 +816,10 @@
>  		 * register doesn't exist on the 1130 (and likely the 1131,
>  		 * but without a datasheet it is impossible to know).
>  		 * Some 12xx chips may not have it, but setting it is
> -		 * believed to be harmless.
> +		 * believed to be harmless on those models.
>  		 */
>  		pci_write_config(dev, TI12XX_PCI_MULTIMEDIA_CONTROL, 0, 4);
>  	}
> -	/*
> -	 * Special code for the Orinoco cards (and a few others).  They
> -	 * seem to need this special code to make them work only over pci
> -	 * interrupts.  Sadly, doing this code also causes problems for
> -	 * many laptops, so we have to make it controlled by a tunable.
> -	 */
> -	if (sc->func_route == pcic_iw_pci) {
> -		if (pcic_init_routing) {
> -			devcntl &= ~TI113X_DEVCNTL_INTR_MASK;
> -			pci_write_config(dev, TI113X_PCI_DEVICE_CONTROL,
> -			    devcntl, 1);
> -			devcntl = pci_read_config(dev,
> -			    TI113X_PCI_DEVICE_CONTROL, 1);
> -			syscntl |= TI113X_SYSCNTL_INTRTIE;
> -		}
> -		syscntl &= ~TI113X_SYSCNTL_SMIENB;
> -		pci_write_config(dev, TI113X_PCI_SYSTEM_CONTROL, syscntl, 1);
> -	}
>  	if (cardcntl & TI113X_CARDCNTL_RING_ENA)
>  		printf("[ring enable]");
>  	if (cardcntl & TI113X_CARDCNTL_SPKR_ENA)
> Index: pcic_pci.h
> ===================================================================
> RCS file: /cache/ncvs/src/sys/pccard/pcic_pci.h,v
> diff -u -r1.58 -r1.57
> --- //depot/user/imp/newcard/pccard/pcic_pci.h	2002/07/20 09:03:01
> +++ //depot/user/imp/newcard/pccard/pcic_pci.h	2002/07/23 21:54:33
> @@ -43,6 +43,7 @@
>  /* Texas Instruments PCI-1130/1131 CardBus Controller */
>  #define TI113X_PCI_SYSTEM_CONTROL	0x80	/* System Control */
>  #define TI12XX_PCI_MULTIMEDIA_CONTROL	0x84	/* Zoom Video */
> +#define TI12XX_PCI_IRQMUX		0x8c	/* multifunction pins */
>  #define TI113X_PCI_RETRY_STATUS		0x90	/* Retry Status */
>  #define TI113X_PCI_CARD_CONTROL		0x91	/* Card Control */
>  #define TI113X_PCI_DEVICE_CONTROL	0x92	/* Device Control */
> @@ -60,6 +61,17 @@
>  #define TI113X_SYSCNTL_KEEP_CLK		0x00000002u
>  #define TI113X_SYSCNTL_CLKRUN_ENA	0x00000001u
>
> +/* IRQMUX register (TI12XX_IRQMUX == 0x8c) */
> +#define TI12XX_IRQMUX_PIN0		0x0000000fu
> +#define   TI12XX_IRQMUX_PIN0_INTA	0x2
> +#define TI12XX_IRQMUX_PIN1		0x000000f0u
> +#define   TI12XX_IRQMUX_PIN1_INTB	0x20
> +#define TI12XX_IRQMUX_PIN2		0x00000f00u
> +#define TI12XX_IRQMUX_PIN3		0x0000f000u
> +#define TI12XX_IRQMUX_PIN4		0x000f0000u
> +#define TI12XX_IRQMUX_PIN5		0x00f00000u
> +#define TI12XX_IRQMUX_PIN6		0x0f000000u
> +
>  /* Card control register (TI113X_CARD_CONTROL == 0x91) */
>  #define TI113X_CARDCNTL_RING_ENA	0x80u
>  #define TI113X_CARDCNTL_ZOOM_VIDEO	0x40u
>
> To Unsubscribe: send mail to majordomo@FreeBSD.org
> with "unsubscribe freebsd-mobile" in the body of the message
>


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




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