firewire disk stopped working
Boris Kotzev
boris.kotzev at gmail.com
Mon Mar 16 05:09:24 PDT 2009
>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
user at laptop.universe:/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
More information about the freebsd-firewire
mailing list