Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 26 Oct 2009 21:18:54 +0100
From:      Fabio <info@maconnect.ch>
To:        Andreas Tobler <andreast-list@fgznet.ch>
Cc:        Sean Bruno <sean.bruno@dsl-only.net>, freebsd-firewire <freebsd-firewire@freebsd.org>
Subject:   Re: [Fwd: Re: firewire issue]
Message-ID:  <B5913866-6BDA-486F-B620-9EBF8D7B39F6@maconnect.ch>
In-Reply-To: <4AE5FD28.8080208@fgznet.ch>
References:  <1256585472.2607.4.camel@Lappy> <4AE5FD28.8080208@fgznet.ch>

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

Dear Andreas and Sean,

Thank you both for your quick answer. I'll see what I can do with  
Andreas' diff. Right now, I'm still fighting with sysinstall (trying  
to get the proper partition map) so it may take a while.

Fabio

Le 26 oct. 2009 à 20:48, Andreas Tobler a écrit :

> Fabio,
>
> I do not know what the issue is.
>
> Sean Bruno wrote:
>> Look over this patch from Andreas.  I haven't done anything with it  
>> as I
>> don't have the h/w to test with.
>
> Please use the attached diff instead, it might bring you a bit  
> further.
>
> It is still not the final thing, but I did not have the time to  
> follow up here. Busy with other stuff.
>
> The patch forwared from Sean is a bit old.
>
> Regards,
> Andreas
>
>
>
> Index: sys/dev/firewire/fwohci_pci.c
> ===================================================================
> --- sys/dev/firewire/fwohci_pci.c	(revision 198452)
> +++ sys/dev/firewire/fwohci_pci.c	(working copy)
> @@ -196,6 +196,10 @@
> 		device_set_desc(dev, "Apple UniNorth");
> 		return BUS_PROBE_DEFAULT;
> 	}
> +	if (id == (FW_VENDORID_APPLE | FW_DEVICE_UNINORTH_V1)) {
> +		device_set_desc(dev, "Apple UniNorth, v1");
> +		return BUS_PROBE_DEFAULT;
> +	}
> 	if (id == (FW_VENDORID_LUCENT | FW_DEVICE_FW322)) {
> 		device_set_desc(dev, "Lucent FW322/323");
> 		return BUS_PROBE_DEFAULT;
> @@ -285,6 +289,10 @@
> 	fwohci_softc_t *sc = device_get_softc(self);
> 	int err;
> 	int rid;
> +	uint32_t id;
> +
> +	sc->old_uninorth = 0;
> +
> #if defined(__DragonFly__) || __FreeBSD_version < 500000
> 	int intr;
> 	/* For the moment, put in a message stating what is wrong */
> @@ -383,6 +391,12 @@
> 			return (ENOMEM);
> 	}
>
> +	id = pci_get_devid(self);
> +	if (id == (FW_VENDORID_APPLE | FW_DEVICE_UNINORTH_V1)) {
> +		sc->old_uninorth = 1;
> +		device_printf(self, "Uninorth V1\n");
> +	}
> +
> 	err = fwohci_init(sc, self);
>
> 	if (err) {
> Index: sys/dev/firewire/fwohci.c
> ===================================================================
> --- sys/dev/firewire/fwohci.c	(revision 198452)
> +++ sys/dev/firewire/fwohci.c	(working copy)
> @@ -79,6 +79,7 @@
> #undef OHCI_DEBUG
>
> static int nocyclemaster = 0;
> +static int old_uninorth = 0;
> int firewire_phydma_enable = 1;
> SYSCTL_DECL(_hw_firewire);
> SYSCTL_INT(_hw_firewire, OID_AUTO, nocyclemaster, CTLFLAG_RW,  
> &nocyclemaster, 0,
> @@ -266,6 +267,15 @@
>
> d_ioctl_t fwohci_ioctl;
>
> +#if BYTE_ORDER == BIG_ENDIAN
> +#define FWOHCI_DMA_READ_UNI(x)			\
> +	old_uninorth ? (x) : FWOHCI_DMA_READ(x)
> +#define FWOHCI_DMA_WRITE_UNI(x,y)				\
> +	old_uninorth ? ((x) = (y)) : FWOHCI_DMA_WRITE(x,y)
> +#else
> +#define FWOHCI_DMA_READ_UNI(x) FWOHCI_DMA_READ(x)
> +#define FWOHCI_DMA_WRITE_UNI(x,y) FWOHCI_DMA_WRITE(x,y)
> +#endif
> /*
>  * Communication with PHY device
>  */
> @@ -624,6 +634,8 @@
> 		return (ENXIO);
> 	}
>
> +	old_uninorth = sc->old_uninorth;
> +
> /* Available Isochronous DMA channel probe */
> 	OWRITE(sc, OHCI_IT_MASK, 0xffffffff);
> 	OWRITE(sc, OHCI_IR_MASK, 0xffffffff);
> @@ -1811,7 +1823,7 @@
> fwohci_dump_intr(struct fwohci_softc *sc, uint32_t stat)
> {
> 	if(stat & OREAD(sc, FWOHCI_INTMASK))
> -		device_printf(fc->dev, "INTERRUPT < %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s 
> %s%s%s%s%s%s> 0x%08x, 0x%08x\n",
> +		device_printf(sc->fc.dev, "INTERRUPT < %s%s%s%s%s%s%s%s%s%s%s%s%s 
> %s%s%s%s%s%s%s%s> 0x%08x, 0x%08x\n",
> 			stat & OHCI_INT_EN ? "DMA_EN ":"",
> 			stat & OHCI_INT_PHY_REG ? "PHY_REG ":"",
> 			stat & OHCI_INT_CYC_LONG ? "CYC_LONG ":"",
> @@ -1848,7 +1860,7 @@
> 		fc->status = FWBUSRESET;
> 		/* Disable bus reset interrupt until sid recv. */
> 		OWRITE(sc, FWOHCI_INTMASKCLR,  OHCI_INT_PHY_BUS_R);
> -	
> +
> 		device_printf(fc->dev, "%s: BUS reset\n", __func__);
> 		OWRITE(sc, FWOHCI_INTMASKCLR,  OHCI_INT_CYC_LOST);
> 		OWRITE(sc, OHCI_LNKCTLCLR, OHCI_CNTL_CYCSRC);
> @@ -2037,7 +2049,7 @@
> 		return;
> 	}
> 	for (i = 0; i < plen / 4; i ++)
> -		buf[i] = FWOHCI_DMA_READ(sc->sid_buf[i+1]);
> +		buf[i] = FWOHCI_DMA_READ_UNI(sc->sid_buf[i+1]);
>
> 	/* pending all pre-bus_reset packets */
> 	fwohci_txd(sc, &sc->atrq);
> @@ -2068,6 +2080,7 @@
> fwohci_check_stat(struct fwohci_softc *sc)
> {
> 	uint32_t stat, irstat, itstat;
> +	static int sid_count;
>
> 	FW_GLOCK_ASSERT(&sc->fc);
> 	stat = OREAD(sc, FWOHCI_INTSTAT);
> @@ -2076,8 +2089,14 @@
> 			"device physically ejected?\n");
> 		return (FILTER_STRAY);
> 	}
> -	if (stat)
> +	
> +	if (stat && old_uninorth && (sid_count < 5)) {
> +		OWRITE(sc, FWOHCI_INTSTATCLR,
> +		       stat & ~(OHCI_INT_PHY_BUS_R | OHCI_INT_PHY_SID));
> +		sid_count++;
> +	} else {
> 		OWRITE(sc, FWOHCI_INTSTATCLR, stat & ~OHCI_INT_PHY_BUS_R);
> +	}
>
> 	stat &= sc->intmask;
> 	if (stat == 0)
> @@ -2657,7 +2676,7 @@
> 	int i;
> #endif
>
> -	ld0 = FWOHCI_DMA_READ(fp->mode.ld[0]);
> +	ld0 = FWOHCI_DMA_READ_UNI(fp->mode.ld[0]);
> #if 0
> 	printf("ld0: x%08x\n", ld0);
> #endif
> @@ -2690,7 +2709,7 @@
> 	}
> #if BYTE_ORDER == BIG_ENDIAN
> 	for(i = 0; i < slen/4; i ++)
> -		fp->mode.ld[i] = FWOHCI_DMA_READ(fp->mode.ld[i]);
> +		fp->mode.ld[i] = FWOHCI_DMA_READ_UNI(fp->mode.ld[i]);
> #endif
> 	return(hlen);
> }
> @@ -2884,7 +2903,7 @@
> 				printf("nvec == 0\n");
>
> /* DMA result-code will be written at the tail of packet */
> -			stat = FWOHCI_DMA_READ(*(uint32_t *)(ld - sizeof(struct  
> fwohci_trailer)));
> +			stat = FWOHCI_DMA_READ_UNI(*(uint32_t *)(ld - sizeof(struct  
> fwohci_trailer)));
> #if 0
> 			printf("plen: %d, stat %x\n",
> 			    plen ,stat);
> Index: sys/dev/firewire/fwohcireg.h
> ===================================================================
> --- sys/dev/firewire/fwohcireg.h	(revision 198452)
> +++ sys/dev/firewire/fwohcireg.h	(working copy)
> @@ -73,6 +73,7 @@
> #define		FW_DEVICE_R5C552	(0x0552 << 16)
> #define		FW_DEVICE_PANGEA	(0x0030 << 16)
> #define		FW_DEVICE_UNINORTH	(0x0031 << 16)
> +#define		FW_DEVICE_UNINORTH_V1	(0x0018 << 16)
> #define		FW_DEVICE_AIC5800	(0x5800 << 16)
> #define		FW_DEVICE_FW322		(0x5811 << 16)
> #define		FW_DEVICE_7007		(0x7007 << 16)
> Index: sys/dev/firewire/fwohcivar.h
> ===================================================================
> --- sys/dev/firewire/fwohcivar.h	(revision 198452)
> +++ sys/dev/firewire/fwohcivar.h	(working copy)
> @@ -75,6 +75,7 @@
> 	struct task fwohci_task_sid;
> 	struct task fwohci_task_dma;
> 	int cycle_lost;
> +	int old_uninorth;
> } fwohci_softc_t;
>
> void fwohci_intr (void *arg);




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?B5913866-6BDA-486F-B620-9EBF8D7B39F6>