From nobody@FreeBSD.org  Wed Feb 23 16:07:40 2011
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 9A7331065673
	for <freebsd-gnats-submit@FreeBSD.org>; Wed, 23 Feb 2011 16:07:40 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from red.freebsd.org (red.freebsd.org [IPv6:2001:4f8:fff6::22])
	by mx1.freebsd.org (Postfix) with ESMTP id 6F0398FC1B
	for <freebsd-gnats-submit@FreeBSD.org>; Wed, 23 Feb 2011 16:07:40 +0000 (UTC)
Received: from red.freebsd.org (localhost [127.0.0.1])
	by red.freebsd.org (8.14.4/8.14.4) with ESMTP id p1NG7esk009673
	for <freebsd-gnats-submit@FreeBSD.org>; Wed, 23 Feb 2011 16:07:40 GMT
	(envelope-from nobody@red.freebsd.org)
Received: (from nobody@localhost)
	by red.freebsd.org (8.14.4/8.14.4/Submit) id p1NG7eKT009672;
	Wed, 23 Feb 2011 16:07:40 GMT
	(envelope-from nobody)
Message-Id: <201102231607.p1NG7eKT009672@red.freebsd.org>
Date: Wed, 23 Feb 2011 16:07:40 GMT
From: Andrew Boyer <aboyer@averesystems.com>
To: freebsd-gnats-submit@FreeBSD.org
Subject: [patch] [mfi] Support MFI cards with boot option ROM disabled
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         154978
>Category:       kern
>Synopsis:       [patch] [mfi] Support MFI cards with boot option ROM disabled
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    jhb
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Feb 23 16:10:07 UTC 2011
>Closed-Date:    Fri Sep 16 17:47:34 UTC 2011
>Last-Modified:  Fri Sep 16 17:47:34 UTC 2011
>Originator:     Andrew Boyer
>Release:        -current
>Organization:
Avere Systems
>Environment:
amd64
>Description:
I noticed that the mfi driver fails to load if the card's option ROM is disabled in the BIOS.  (If you're not booting from it, it reduces the boot time a lot.)  The LSI supported driver includes support for this mode of operation but the driver in the FreeBSD tree doesn't.  The change is very simple.  See the attached patch.  Would someone please test it / clean it up / commit it?

It's been tested to work with the MegaRAID SAS 9261-8i.
>How-To-Repeat:
1) Disable the SAS option ROM in the BIOS
2) Boot the system

>Fix:


Patch attached with submission follows:

Index: sys/dev/mfi/mfireg.h
===================================================================
--- sys/dev/mfi/mfireg.h	(revision 218580)
+++ sys/dev/mfi/mfireg.h	(working copy)
@@ -112,6 +112,7 @@
 #define MFI_FWSTATE_WAIT_HANDSHAKE	0x60000000
 #define MFI_FWSTATE_FW_INIT_2		0x70000000
 #define MFI_FWSTATE_DEVICE_SCAN		0x80000000
+#define MFI_FWSTATE_BOOT_MESSAGE_PENDING	0x90000000
 #define MFI_FWSTATE_FLUSH_CACHE		0xa0000000
 #define MFI_FWSTATE_READY		0xb0000000
 #define MFI_FWSTATE_OPERATIONAL		0xc0000000
@@ -127,6 +128,7 @@
 #define MFI_FWINIT_READY	0x00000002 /* Move from operational to ready */
 #define MFI_FWINIT_MFIMODE	0x00000004 /* unknown */
 #define MFI_FWINIT_CLEAR_HANDSHAKE 0x00000008 /* Respond to WAIT_HANDSHAKE */
+#define MFI_FWINIT_HOTPLUG	0x00000010
 
 /* MFI Commands */
 typedef enum {
Index: sys/dev/mfi/mfi.c
===================================================================
--- sys/dev/mfi/mfi.c	(revision 218580)
+++ sys/dev/mfi/mfi.c	(working copy)
@@ -260,8 +260,12 @@
 		case MFI_FWSTATE_FLUSH_CACHE:
 			max_wait = 20;
 			break;
+		case MFI_FWSTATE_BOOT_MESSAGE_PENDING:
+			MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_HOTPLUG);
+			max_wait = 10;
+			break;
 		default:
-			device_printf(sc->mfi_dev,"Unknown firmware state %d\n",
+			device_printf(sc->mfi_dev,"Unknown firmware state %#x\n",
 			    fw_state);
 			return (ENXIO);
 		}
@@ -273,7 +277,7 @@
 				break;
 		}
 		if (fw_state == cur_state) {
-			device_printf(sc->mfi_dev, "firmware stuck in state "
+			device_printf(sc->mfi_dev, "Firmware stuck in state "
 			    "%#x\n", fw_state);
 			return (ENXIO);
 		}


>Release-Note:
>Audit-Trail:
State-Changed-From-To: open->patched 
State-Changed-By: jhb 
State-Changed-When: Thu Jul 14 20:22:30 UTC 2011 
State-Changed-Why:  
Fix applied to HEAD, thanks. 


Responsible-Changed-From-To: freebsd-bugs->jhb 
Responsible-Changed-By: jhb 
Responsible-Changed-When: Thu Jul 14 20:22:30 UTC 2011 
Responsible-Changed-Why:  
Fix applied to HEAD, thanks. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=154978 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/154978: commit references a PR
Date: Thu, 14 Jul 2011 20:20:43 +0000 (UTC)

 Author: jhb
 Date: Thu Jul 14 20:20:33 2011
 New Revision: 224041
 URL: http://svn.freebsd.org/changeset/base/224041
 
 Log:
   Support controllers whose option ROM is disabled in the BIOS by kicking
   the firmware so that it boots.
   
   PR:		kern/154978
   Submitted by:	Andrew Boyer  aboyer of averesystems com
   Obtained from:	LSI
   MFC after:	1 week
 
 Modified:
   head/sys/dev/mfi/mfi.c
   head/sys/dev/mfi/mfireg.h
 
 Modified: head/sys/dev/mfi/mfi.c
 ==============================================================================
 --- head/sys/dev/mfi/mfi.c	Thu Jul 14 20:17:05 2011	(r224040)
 +++ head/sys/dev/mfi/mfi.c	Thu Jul 14 20:20:33 2011	(r224041)
 @@ -260,8 +260,12 @@ mfi_transition_firmware(struct mfi_softc
  		case MFI_FWSTATE_FLUSH_CACHE:
  			max_wait = 20;
  			break;
 +		case MFI_FWSTATE_BOOT_MESSAGE_PENDING:
 +			MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_HOTPLUG);
 +			max_wait = 10;
 +			break;
  		default:
 -			device_printf(sc->mfi_dev,"Unknown firmware state %d\n",
 +			device_printf(sc->mfi_dev,"Unknown firmware state %#x\n",
  			    fw_state);
  			return (ENXIO);
  		}
 @@ -273,7 +277,7 @@ mfi_transition_firmware(struct mfi_softc
  				break;
  		}
  		if (fw_state == cur_state) {
 -			device_printf(sc->mfi_dev, "firmware stuck in state "
 +			device_printf(sc->mfi_dev, "Firmware stuck in state "
  			    "%#x\n", fw_state);
  			return (ENXIO);
  		}
 
 Modified: head/sys/dev/mfi/mfireg.h
 ==============================================================================
 --- head/sys/dev/mfi/mfireg.h	Thu Jul 14 20:17:05 2011	(r224040)
 +++ head/sys/dev/mfi/mfireg.h	Thu Jul 14 20:20:33 2011	(r224041)
 @@ -112,6 +112,7 @@ __FBSDID("$FreeBSD$");
  #define MFI_FWSTATE_WAIT_HANDSHAKE	0x60000000
  #define MFI_FWSTATE_FW_INIT_2		0x70000000
  #define MFI_FWSTATE_DEVICE_SCAN		0x80000000
 +#define MFI_FWSTATE_BOOT_MESSAGE_PENDING	0x90000000
  #define MFI_FWSTATE_FLUSH_CACHE		0xa0000000
  #define MFI_FWSTATE_READY		0xb0000000
  #define MFI_FWSTATE_OPERATIONAL		0xc0000000
 @@ -127,6 +128,7 @@ __FBSDID("$FreeBSD$");
  #define MFI_FWINIT_READY	0x00000002 /* Move from operational to ready */
  #define MFI_FWINIT_MFIMODE	0x00000004 /* unknown */
  #define MFI_FWINIT_CLEAR_HANDSHAKE 0x00000008 /* Respond to WAIT_HANDSHAKE */
 +#define MFI_FWINIT_HOTPLUG	0x00000010
  
  /* MFI Commands */
  typedef enum {
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: patched->closed 
State-Changed-By: jhb 
State-Changed-When: Fri Sep 16 17:47:18 UTC 2011 
State-Changed-Why:  
Fix merged to 8. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=154978 
>Unformatted:
