firewire disk stopped working

Boris Kotzev <[email protected]>
Newsgroups gmane.os.freebsd.devel.firewire
Organization Home
Message-ID <[email protected]>
>On Fri, 2009-03-13 at 14:42 +0900, Hidetoshi Shimokawa wrote:
>> Hi Sean,
>>
>> It looks like you broke Configuration ROM build procedure in firewire stack in
>> http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/firewire/firewire.c.diff?r1=1.104;r2=1.105
>>
>> In this change, you just copy "src" to "fc->config_rom" but it's wrong.
>> You have to call crom_load() to get CROM built correctly.
>> It is a critical problem for SCSI and dcons(4) target that highly
>> depend on CROM.
>> I think you can easily check this problem by 'fwcontrol -c [your own node_id]',
>> you'll get broken CROM and CRC. If there are anything I can help you to fix this
>> bug, let me know.
>>
>> Thanks,
>>
>> Hidetoshi at AsiaBSDCon2009
>>
>> @@ -739,19 +758,19 @@ fw_busreset(struct firewire_comm *fc, ui
>>  		free(devlistp, M_TEMP);
>>  	}
>>
>> -	newrom = malloc(CROMSIZE, M_FW, M_NOWAIT | M_ZERO);
>>  	src = &fc->crom_src_buf->src;
>> -	crom_load(src, (uint32_t *)newrom, CROMSIZE);
>> -	if (bcmp(newrom, fc->config_rom, CROMSIZE) != 0) {
>> -		/* bump generation and reload */
>> -		src->businfo.generation ++;
>> -		/* generation must be between 0x2 and 0xF */
>> -		if (src->businfo.generation < 2)
>> -			src->businfo.generation ++;
>> -		crom_load(src, (uint32_t *)newrom, CROMSIZE);
>> -		bcopy(newrom, (void *)fc->config_rom, CROMSIZE);
>> -	}
>> -	free(newrom, M_FW);
>> +	/*
>> +	 * If the old config rom needs to be overwritten,
>> +	 * bump the businfo.generation indicator to
>> +	 * indicate that we need to be reprobed
>> +	 */
>> +	if (bcmp(src, fc->config_rom, CROMSIZE) != 0) {
>> +		/* generation is a 2 bit field */
>> +		/* valid values are only from 0 - 3 */
>> +		src->businfo.generation = 1;
>> +		bcopy(src, (void *)fc->config_rom, CROMSIZE);
>> +	} else
>> +		src->businfo.generation = 0;
>>  }
>>
>>  /* Call once after reboot */
>> @@ -807,13 +826,7 @@ void fw_init(struct firewire_comm *fc)
>
>Please give this patch at try.  I think this should work.
>
>Sean

After updating the source to CURRENT from yesterday and applying your
last patch to firewire.c, I found out that the external firewire disk was
functional again.

The system information is:

FreeBSD laptop.universe 8.0-CURRENT FreeBSD 8.0-CURRENT #0: Mon Mar 16 09:13:13 EET 2009     
[email protected]:/mnt/ufs/usr/src/sys/CUSTOM  amd64

When the disk attaches the dmesg output is: 

fwohci0: fwohci_intr_core: BUS reset
fwohci0: fwohci_intr_core: node_id=0x00000001, SelfID Count=3, CYCLEMASTER mode
firewire0: 2 nodes, maxhop <= 1 cable IRM irm(1)  (me)
firewire0: bus manager 1
firewire0: New S400 device ID:0020370004a03421
sbp0: sbp_show_sdev_info: sbp0:0:0: ordered:1 type:0 EUI:0020370004a03421 node:0 speed:2 maxrec:8
sbp0: sbp_show_sdev_info: sbp0:0:0 'Seagate' 'ATA Device 00' '000102'
fwohci0: fwohci_intr_core: BUS reset
fwohci0: fwohci_intr_core: node_id=0x00000001, SelfID Count=4, CYCLEMASTER mode
firewire0: 2 nodes, maxhop <= 1 cable IRM irm(1)  (me)
firewire0: bus manager 1
sbp0: sbp_show_sdev_info: sbp0:0:0: ordered:1 type:0 EUI:0020370004a03421 node:0 speed:2 maxrec:8
sbp0: sbp_show_sdev_info: sbp0:0:0 'Seagate' 'ATA Device 00' '000102'
da0 at sbp0 bus 0 target 0 lun 0
da0: <Seagate ATA Device 00 0102> Fixed Direct Access SCSI-4 device
da0: 50.000MB/s transfers
da0: 715404MB (1465149168 512 byte sectors: 255H 63S/T 91201C)

I have not done much testing - so far it seems to be working o.k.

Thank you very much!

Best regards,

Boris Kotzev
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-firewire
To unsubscribe, send any mail to "[email protected]"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.