[Linux1394-cvslog] rev 523 - trunk
Brought to you by:
aeb,
bencollins
From: SVN U. <ben...@us...> - 2002-07-15 16:38:04
|
Author: bencollins Date: Sun, 14 Jul 2002 17:14:33 -0400 New Revision: 523 Modified: trunk/sbp2.c trunk/sbp2.h Log: Add a scsi_id->workarounds to list detected brokeness in some devices. Added detection of firmware revisions for a black list of devices that require 36byte inquiry. Modified: trunk/sbp2.c ============================================================================== --- trunk/sbp2.c (original) +++ trunk/sbp2.c Mon Jul 15 12:37:49 2002 @@ -427,7 +427,7 @@ * is not properly handling the SCSI inquiry command. This hack makes the inquiry look more * like a typical MS Windows inquiry. */ -MODULE_PARM(sbp2_force_inquiry_hack,"i") +MODULE_PARM(sbp2_force_inquiry_hack,"i"); MODULE_PARM_DESC(sbp2_force_inquiry_hack, "Force SCSI inquiry hack (default = 0)"); static int sbp2_force_inquiry_hack = 0; @@ -550,6 +550,10 @@ update: sbp2_update }; +/* List of device firmware's that require a forced 36 byte inquiry */ +static u32 sbp2_broken_inquiry_list[] = { + 0x00002800 +}; /************************************** * General utility functions @@ -1905,27 +1909,53 @@ break; case SBP2_FIRMWARE_REVISION_KEY: - /* - * Firmware revision (used to find broken - * devices). If the vendor id is 0xa0b8 - * (Symbios vendor id), then we have a - * bridge with 128KB max transfer size - * limitation. - */ + /* Firmware revision */ scsi_id->sbp2_firmware_revision = CONFIG_ROM_VALUE(ud->quadlets[i]); SBP2_DEBUG("sbp2_firmware_revision = %x", (unsigned int) scsi_id->sbp2_firmware_revision); - if ((scsi_id->sbp2_firmware_revision & 0xffff00) == - SBP2_128KB_BROKEN_FIRMWARE) { - SBP2_WARN("warning: Bridge chipset supports 128KB max transfer size"); - } break; default: break; } } + + /* This is the start of our broken device checking. We try to hack + * around oddities and known defects. */ + scsi_id->workarounds = 0x0; + + /* If the vendor id is 0xa0b8 (Symbios vendor id), then we have a + * bridge with 128KB max transfer size limitation. For sanity, we + * only voice this when the current sbp2_max_sectors setting + * exceeds the 128k limit. By default, that is not the case. + * + * It would be really nice if we could detect this before the scsi + * host gets initialized. That way we can down-force the + * sbp2_max_sectors to account for it. That is not currently + * possible. */ + if ((scsi_id->sbp2_firmware_revision & 0xffff00) == + SBP2_128KB_BROKEN_FIRMWARE && + (sbp2_max_sectors * 512) > (128 * 1024)) { + SBP2_WARN("Bridge only supports 128KB max transfer size."); + SBP2_WARN("WARNING: Current sbp2_max_sectors setting is larger than 128k (%d sectors)!", + sbp2_max_sectors); + scsi_id->workarounds |= SBP2_BREAKAGE_128K_MAX_TRANSFER; + } + + /* Check for a blacklisted set of devices that require us to force + * a 36 byte host inquiry. This can be overriden as a module param + * (to force all hosts). + * + * XXX If this does not detect your firmware as being defective, + * but using the sbp2_force_inquiry_hack allows your device to + * work, please submit the value of your firmware revision to the + * linux1394-devel mailing list. */ + for (i = 0; sbp2_broken_inquiry_list[i]; i++) { + if ((scsi_id->sbp2_firmware_revision & 0xffff00) == + sbp2_broken_inquiry_list[i]) + scsi_id->workarounds |= SBP2_BREAKAGE_INQUIRY_HACK; + } } /* @@ -2402,7 +2432,7 @@ * reject this inquiry command. Fix the request_bufflen. */ if (*cmd == INQUIRY) { - if (sbp2_force_inquiry_hack) + if (sbp2_force_inquiry_hack || scsi_id->workarounds & SBP2_BREAKAGE_INQUIRY_HACK) request_bufflen = cmd[4] = 0x24; else request_bufflen = cmd[4]; Modified: trunk/sbp2.h ============================================================================== --- trunk/sbp2.h (original) +++ trunk/sbp2.h Mon Jul 15 12:37:52 2002 @@ -357,6 +357,10 @@ }; +/* A list of flags for detected oddities and brokeness. */ +#define SBP2_BREAKAGE_128K_MAX_TRANSFER 0x1 +#define SBP2_BREAKAGE_INQUIRY_HACK 0x2 + /* * Information needed on a per scsi id basis (one for each sbp2 device) */ @@ -412,6 +416,9 @@ /* Node entry, as retrieved from NodeMgr entries */ struct node_entry *ne; + + /* Device specific workarounds/brokeness */ + u32 workarounds; }; /* |