Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 19 May 2012 02:37:58 +0200
From:      Oliver Pinter <oliver.pntr@gmail.com>
To:        Sean Bruno <sbruno@freebsd.org>
Cc:        svn-src-stable@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   Re: svn commit: r235636 - in stable/7/sys: conf dev/mfi modules/mfi
Message-ID:  <CAPjTQNGjc7YkdqpfDtrPsJP0efNktnp_uP=_b2Q3taBVedLwFg@mail.gmail.com>
In-Reply-To: <CAPjTQNGa8-Kv0wOjvU0jokgVMesR6H%2BRCnjBOHb7SgiGTaLN1A@mail.gmail.com>
References:  <201205182329.q4INTU4X086651@svn.freebsd.org> <CAPjTQNGa8-Kv0wOjvU0jokgVMesR6H%2BRCnjBOHb7SgiGTaLN1A@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
--20cf300fb37172126b04c058e103
Content-Type: text/plain; charset=ISO-8859-1

On 5/19/12, Oliver Pinter <oliver.pntr@gmail.com> wrote:
> cc -O2 -fno-strict-aliasing -pipe -fno-delete-null-pointer-checks
> -march=core2 -
> fno-builtin-strftime -Wsystem-headers -Wall -Wno-format-y2k -W
> -Wno-unused-param
> eter -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith
> -Wno-uninitialized
>  -Wno-pointer-sign -c /usr/src/usr.sbin/mfiutil/mfi_evt.c
> /usr/src/usr.sbin/mfiutil/mfi_evt.c: In function 'mfi_decode_evt':
> /usr/src/usr.sbin/mfiutil/mfi_evt.c:366: error: 'struct mfi_evt_detail' has
> no m
> ember named 'class'
> /usr/src/usr.sbin/mfiutil/mfi_evt.c:367: error: 'struct mfi_evt_detail' has
> no m
> ember named 'class'
> /usr/src/usr.sbin/mfiutil/mfi_evt.c: In function 'show_events':
> /usr/src/usr.sbin/mfiutil/mfi_evt.c:562: error: 'struct <anonymous>' has no
> memb
> er named 'class'
> /usr/src/usr.sbin/mfiutil/mfi_evt.c:572: error: 'struct <anonymous>' has no
> memb
> er named 'class'
> cc -O2 -fno-strict-aliasing -pipe -fno-delete-null-pointer-checks
> -march=core2 -
> DGTAGS -DSYSV_CURSES -I/usr/src/usr.bin/vi
> -I/usr/src/usr.bin/vi/../../contrib/n
> vi -I/usr/src/usr.bin/vi/../../contrib/nvi/include  -c
> /usr/src/usr.bin/vi/../..
> /contrib/nvi/ex/ex_put.c
> *** Error code 1
>
> ---------------
>
> diff --git a/usr.sbin/mfiutil/mfi_evt.c b/usr.sbin/mfiutil/mfi_evt.c
> index a14bb19..336fbd3 100644
> --- a/usr.sbin/mfiutil/mfi_evt.c
> +++ b/usr.sbin/mfiutil/mfi_evt.c
> @@ -363,8 +363,8 @@ mfi_decode_evt(int fd, struct mfi_evt_detail
> *detail, int verbose)
>  {
>
>         printf("%5d (%s/%s/%s) - ", detail->seq,
> format_timestamp(detail->time),
> -           format_locale(detail->class.members.locale),
> -           format_class(detail->class.members.class));
> +           format_locale(detail->evt_class.members.locale),
> +           format_class(detail->evt_class.members.evt_class));
>         switch (detail->arg_type) {
>         case MR_EVT_ARGS_NONE:
>                 break;
> @@ -559,7 +559,7 @@ show_events(int ac, char **av)
>         num_events = 15;
>         filter.members.reserved = 0;
>         filter.members.locale = MFI_EVT_LOCALE_ALL;
> -       filter.members.class = MFI_EVT_CLASS_WARNING;
> +       filter.members.evt_class = MFI_EVT_CLASS_WARNING;
>         start = info.boot_seq_num;
>         stop = info.newest_seq_num;
>         verbose = 0;
> @@ -569,7 +569,7 @@ show_events(int ac, char **av)
>         while ((ch = getopt(ac, av, "c:l:n:v")) != -1) {
>                 switch (ch) {
>                 case 'c':
> -                       if (parse_class(optarg, &filter.members.class) < 0)
> {
> +                       if (parse_class(optarg,
> &filter.members.evt_class) < 0) {
>                                 error = errno;
>                                 warn("Error parsing event class");
>                                 close(fd);
>
>
> --------------
>
> not tested, compiling now
>
> On 5/19/12, Sean Bruno <sbruno@freebsd.org> wrote:
>> Author: sbruno
>> Date: Fri May 18 23:29:30 2012
>> New Revision: 235636
>> URL: http://svn.freebsd.org/changeset/base/235636
>>
>> Log:
>>   MFC of head thunderbolt support for mfi(4)
>>
>>   r233711 -- IFV head_mfi into head for initial thunderbolt support
>>   r233768 -- atomic_t --> mfi_atomic
>>   r233805 -- fix tinderbuild, move megasas_sge to mfivar.h
>>   r233877 -- remove atomic.h from includes
>>   r235014 -- fix reading of sector >= 2^32 or 2^21, repair RAID handling
>>   r235016 -- style(9)
>>   r235040 -- fix returns from mfi_tbolt_sync_map_info()
>>   r235318 -- repair panic on PAE i386
>>   r235321 -- repair the repair of panics on PAE i386
>>
>> Added:
>>   stable/7/sys/dev/mfi/mfi_syspd.c
>>      - copied unchanged from r233711, head/sys/dev/mfi/mfi_syspd.c
>>   stable/7/sys/dev/mfi/mfi_tbolt.c
>>      - copied, changed from r233711, head/sys/dev/mfi/mfi_tbolt.c
>> Modified:
>>   stable/7/sys/conf/files
>>   stable/7/sys/dev/mfi/mfi.c
>>   stable/7/sys/dev/mfi/mfi_cam.c
>>   stable/7/sys/dev/mfi/mfi_debug.c
>>   stable/7/sys/dev/mfi/mfi_disk.c
>>   stable/7/sys/dev/mfi/mfi_ioctl.h
>>   stable/7/sys/dev/mfi/mfi_linux.c
>>   stable/7/sys/dev/mfi/mfi_pci.c
>>   stable/7/sys/dev/mfi/mfireg.h
>>   stable/7/sys/dev/mfi/mfivar.h
>>   stable/7/sys/modules/mfi/Makefile
>> Directory Properties:
>>   stable/7/sys/   (props changed)
>>
>> Modified: stable/7/sys/conf/files
>> ==============================================================================
>> --- stable/7/sys/conf/files	Fri May 18 21:50:26 2012	(r235635)
>> +++ stable/7/sys/conf/files	Fri May 18 23:29:30 2012	(r235636)
>> @@ -948,6 +948,8 @@ dev/mfi/mfi.c			optional mfi
>>  dev/mfi/mfi_debug.c		optional mfi
>>  dev/mfi/mfi_pci.c		optional mfi pci
>>  dev/mfi/mfi_disk.c		optional mfi
>> +dev/mfi/mfi_syspd.c		optional mfi
>> +dev/mfi/mfi_tbolt.c		optional mfi
>>  dev/mfi/mfi_linux.c		optional mfi compat_linux
>>  dev/mfi/mfi_cam.c		optional mfip scbus
>>  dev/mii/acphy.c			optional miibus | acphy
>>
>> Modified: stable/7/sys/dev/mfi/mfi.c
>> ==============================================================================
>> --- stable/7/sys/dev/mfi/mfi.c	Fri May 18 21:50:26 2012	(r235635)
>> +++ stable/7/sys/dev/mfi/mfi.c	Fri May 18 23:29:30 2012	(r235636)
>> @@ -53,6 +53,7 @@
>>  #include <sys/cdefs.h>
>>  __FBSDID("$FreeBSD$");
>>
>> +#include "opt_compat.h"
>>  #include "opt_mfi.h"
>>
>>  #include <sys/param.h>
>> @@ -72,6 +73,7 @@ __FBSDID("$FreeBSD$");
>>  #include <sys/uio.h>
>>  #include <sys/proc.h>
>>  #include <sys/signalvar.h>
>> +#include <sys/taskqueue.h>
>>
>>  #include <machine/bus.h>
>>  #include <machine/resource.h>
>> @@ -79,43 +81,52 @@ __FBSDID("$FreeBSD$");
>>  #include <dev/mfi/mfireg.h>
>>  #include <dev/mfi/mfi_ioctl.h>
>>  #include <dev/mfi/mfivar.h>
>> +#include <sys/interrupt.h>
>> +#include <sys/priority.h>
>>
>>  static int	mfi_alloc_commands(struct mfi_softc *);
>>  static int	mfi_comms_init(struct mfi_softc *);
>> -static int	mfi_wait_command(struct mfi_softc *, struct mfi_command *);
>>  static int	mfi_get_controller_info(struct mfi_softc *);
>>  static int	mfi_get_log_state(struct mfi_softc *,
>>  		    struct mfi_evt_log_state **);
>>  static int	mfi_parse_entries(struct mfi_softc *, int, int);
>> -static int	mfi_dcmd_command(struct mfi_softc *, struct mfi_command **,
>> -		    uint32_t, void **, size_t);
>>  static void	mfi_data_cb(void *, bus_dma_segment_t *, int, int);
>>  static void	mfi_startup(void *arg);
>>  static void	mfi_intr(void *arg);
>>  static void	mfi_ldprobe(struct mfi_softc *sc);
>> +static void	mfi_syspdprobe(struct mfi_softc *sc);
>> +static void	mfi_handle_evt(void *context, int pending);
>>  static int	mfi_aen_register(struct mfi_softc *sc, int seq, int locale);
>>  static void	mfi_aen_complete(struct mfi_command *);
>> -static int	mfi_aen_setup(struct mfi_softc *, uint32_t);
>>  static int	mfi_add_ld(struct mfi_softc *sc, int);
>>  static void	mfi_add_ld_complete(struct mfi_command *);
>> +static int	mfi_add_sys_pd(struct mfi_softc *sc, int);
>> +static void	mfi_add_sys_pd_complete(struct mfi_command *);
>>  static struct mfi_command * mfi_bio_command(struct mfi_softc *);
>>  static void	mfi_bio_complete(struct mfi_command *);
>> -static int	mfi_mapcmd(struct mfi_softc *, struct mfi_command *);
>> +static struct mfi_command *mfi_build_ldio(struct mfi_softc *,struct
>> bio*);
>> +static struct mfi_command *mfi_build_syspdio(struct mfi_softc *,struct
>> bio*);
>>  static int	mfi_send_frame(struct mfi_softc *, struct mfi_command *);
>> -static void	mfi_complete(struct mfi_softc *, struct mfi_command *);
>>  static int	mfi_abort(struct mfi_softc *, struct mfi_command *);
>> -static int	mfi_linux_ioctl_int(struct cdev *, u_long, caddr_t, int,
>> d_thread_t *);
>> +static int	mfi_linux_ioctl_int(struct cdev *, u_long, caddr_t, int,
>> struct
>> thread *);
>>  static void	mfi_timeout(void *);
>>  static int	mfi_user_command(struct mfi_softc *,
>>  		    struct mfi_ioc_passthru *);
>> -static void 	mfi_enable_intr_xscale(struct mfi_softc *sc);
>> -static void 	mfi_enable_intr_ppc(struct mfi_softc *sc);
>> -static int32_t 	mfi_read_fw_status_xscale(struct mfi_softc *sc);
>> -static int32_t 	mfi_read_fw_status_ppc(struct mfi_softc *sc);
>> -static int 	mfi_check_clear_intr_xscale(struct mfi_softc *sc);
>> -static int 	mfi_check_clear_intr_ppc(struct mfi_softc *sc);
>> -static void 	mfi_issue_cmd_xscale(struct mfi_softc *sc,uint32_t
>> bus_add,uint32_t frame_cnt);
>> -static void 	mfi_issue_cmd_ppc(struct mfi_softc *sc,uint32_t
>> bus_add,uint32_t frame_cnt);
>> +static void	mfi_enable_intr_xscale(struct mfi_softc *sc);
>> +static void	mfi_enable_intr_ppc(struct mfi_softc *sc);
>> +static int32_t	mfi_read_fw_status_xscale(struct mfi_softc *sc);
>> +static int32_t	mfi_read_fw_status_ppc(struct mfi_softc *sc);
>> +static int	mfi_check_clear_intr_xscale(struct mfi_softc *sc);
>> +static int	mfi_check_clear_intr_ppc(struct mfi_softc *sc);
>> +static void 	mfi_issue_cmd_xscale(struct mfi_softc *sc, bus_addr_t
>> bus_add,
>> +		    uint32_t frame_cnt);
>> +static void 	mfi_issue_cmd_ppc(struct mfi_softc *sc, bus_addr_t bus_add,
>> +		    uint32_t frame_cnt);
>> +static int mfi_config_lock(struct mfi_softc *sc, uint32_t opcode);
>> +static void mfi_config_unlock(struct mfi_softc *sc, int locked);
>> +static int mfi_check_command_pre(struct mfi_softc *sc, struct
>> mfi_command
>> *cm);
>> +static void mfi_check_command_post(struct mfi_softc *sc, struct
>> mfi_command
>> *cm);
>> +static int mfi_check_for_sscd(struct mfi_softc *sc, struct mfi_command
>> *cm);
>>
>>  SYSCTL_NODE(_hw, OID_AUTO, mfi, CTLFLAG_RD, 0, "MFI driver parameters");
>>  static int	mfi_event_locale = MFI_EVT_LOCALE_ALL;
>> @@ -133,6 +144,11 @@ TUNABLE_INT("hw.mfi.max_cmds", &mfi_max_
>>  SYSCTL_INT(_hw_mfi, OID_AUTO, max_cmds, CTLFLAG_RD, &mfi_max_cmds,
>>  	   0, "Max commands");
>>
>> +static int	mfi_detect_jbod_change = 1;
>> +TUNABLE_INT("hw.mfi.detect_jbod_change", &mfi_detect_jbod_change);
>> +SYSCTL_INT(_hw_mfi, OID_AUTO, detect_jbod_change, CTLFLAG_RW,
>> +	   &mfi_detect_jbod_change, 0, "Detect a change to a JBOD");
>> +
>>  /* Management interface */
>>  static d_open_t		mfi_open;
>>  static d_close_t	mfi_close;
>> @@ -152,6 +168,7 @@ static struct cdevsw mfi_cdevsw = {
>>  MALLOC_DEFINE(M_MFIBUF, "mfibuf", "Buffers for the MFI driver");
>>
>>  #define MFI_INQ_LENGTH SHORT_INQUIRY_LENGTH
>> +struct mfi_skinny_dma_info mfi_skinny;
>>
>>  static void
>>  mfi_enable_intr_xscale(struct mfi_softc *sc)
>> @@ -162,12 +179,17 @@ mfi_enable_intr_xscale(struct mfi_softc
>>  static void
>>  mfi_enable_intr_ppc(struct mfi_softc *sc)
>>  {
>> -	MFI_WRITE4(sc, MFI_ODCR0, 0xFFFFFFFF);
>>  	if (sc->mfi_flags & MFI_FLAGS_1078) {
>> +		MFI_WRITE4(sc, MFI_ODCR0, 0xFFFFFFFF);
>>  		MFI_WRITE4(sc, MFI_OMSK, ~MFI_1078_EIM);
>> -	} else if (sc->mfi_flags & MFI_FLAGS_GEN2) {
>> +	}
>> +	else if (sc->mfi_flags & MFI_FLAGS_GEN2) {
>> +		MFI_WRITE4(sc, MFI_ODCR0, 0xFFFFFFFF);
>>  		MFI_WRITE4(sc, MFI_OMSK, ~MFI_GEN2_EIM);
>>  	}
>> +	else if (sc->mfi_flags & MFI_FLAGS_SKINNY) {
>> +		MFI_WRITE4(sc, MFI_OMSK, ~0x00000001);
>> +	}
>>  }
>>
>>  static int32_t
>> @@ -205,35 +227,51 @@ mfi_check_clear_intr_ppc(struct mfi_soft
>>  		if (!(status & MFI_1078_RM)) {
>>  			return 1;
>>  		}
>> -	} else if (sc->mfi_flags & MFI_FLAGS_GEN2) {
>> +	}
>> +	else if (sc->mfi_flags & MFI_FLAGS_GEN2) {
>>  		if (!(status & MFI_GEN2_RM)) {
>>  			return 1;
>>  		}
>>  	}
>> -
>> -	MFI_WRITE4(sc, MFI_ODCR0, status);
>> +	else if (sc->mfi_flags & MFI_FLAGS_SKINNY) {
>> +		if (!(status & MFI_SKINNY_RM)) {
>> +			return 1;
>> +		}
>> +	}
>> +	if (sc->mfi_flags & MFI_FLAGS_SKINNY)
>> +		MFI_WRITE4(sc, MFI_OSTS, status);
>> +	else
>> +		MFI_WRITE4(sc, MFI_ODCR0, status);
>>  	return 0;
>>  }
>>
>>  static void
>> -mfi_issue_cmd_xscale(struct mfi_softc *sc,uint32_t bus_add,uint32_t
>> frame_cnt)
>> +mfi_issue_cmd_xscale(struct mfi_softc *sc, bus_addr_t bus_add, uint32_t
>> frame_cnt)
>>  {
>>  	MFI_WRITE4(sc, MFI_IQP,(bus_add >>3)|frame_cnt);
>>  }
>>
>>  static void
>> -mfi_issue_cmd_ppc(struct mfi_softc *sc,uint32_t bus_add,uint32_t
>> frame_cnt)
>> +mfi_issue_cmd_ppc(struct mfi_softc *sc, bus_addr_t bus_add, uint32_t
>> frame_cnt)
>>  {
>> -	MFI_WRITE4(sc, MFI_IQP, (bus_add |frame_cnt <<1)|1 );
>> +	if (sc->mfi_flags & MFI_FLAGS_SKINNY) {
>> +	    MFI_WRITE4(sc, MFI_IQPL, (bus_add | frame_cnt <<1)|1 );
>> +	    MFI_WRITE4(sc, MFI_IQPH, 0x00000000);
>> +	} else {
>> +	    MFI_WRITE4(sc, MFI_IQP, (bus_add | frame_cnt <<1)|1 );
>> +	}
>>  }
>>
>> -static int
>> +int
>>  mfi_transition_firmware(struct mfi_softc *sc)
>>  {
>> -	int32_t fw_state, cur_state;
>> +	uint32_t fw_state, cur_state;
>>  	int max_wait, i;
>> +	uint32_t cur_abs_reg_val = 0;
>> +	uint32_t prev_abs_reg_val = 0;
>>
>> -	fw_state = sc->mfi_read_fw_status(sc)& MFI_FWSTATE_MASK;
>> +	cur_abs_reg_val = sc->mfi_read_fw_status(sc);
>> +	fw_state = cur_abs_reg_val & MFI_FWSTATE_MASK;
>>  	while (fw_state != MFI_FWSTATE_READY) {
>>  		if (bootverbose)
>>  			device_printf(sc->mfi_dev, "Waiting for firmware to "
>> @@ -244,36 +282,62 @@ mfi_transition_firmware(struct mfi_softc
>>  			device_printf(sc->mfi_dev, "Firmware fault\n");
>>  			return (ENXIO);
>>  		case MFI_FWSTATE_WAIT_HANDSHAKE:
>> -			MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_CLEAR_HANDSHAKE);
>> -			max_wait = 2;
>> +			if (sc->mfi_flags & MFI_FLAGS_SKINNY || sc->mfi_flags &
>> MFI_FLAGS_TBOLT)
>> +			    MFI_WRITE4(sc, MFI_SKINNY_IDB, MFI_FWINIT_CLEAR_HANDSHAKE);
>> +			else
>> +			    MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_CLEAR_HANDSHAKE);
>> +			max_wait = MFI_RESET_WAIT_TIME;
>>  			break;
>>  		case MFI_FWSTATE_OPERATIONAL:
>> -			MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_READY);
>> -			max_wait = 10;
>> +			if (sc->mfi_flags & MFI_FLAGS_SKINNY || sc->mfi_flags &
>> MFI_FLAGS_TBOLT)
>> +			    MFI_WRITE4(sc, MFI_SKINNY_IDB, 7);
>> +			else
>> +			    MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_READY);
>> +			max_wait = MFI_RESET_WAIT_TIME;
>>  			break;
>>  		case MFI_FWSTATE_UNDEFINED:
>>  		case MFI_FWSTATE_BB_INIT:
>> -			max_wait = 2;
>> +			max_wait = MFI_RESET_WAIT_TIME;
>> +			break;
>> +		case MFI_FWSTATE_FW_INIT_2:
>> +			max_wait = MFI_RESET_WAIT_TIME;
>>  			break;
>>  		case MFI_FWSTATE_FW_INIT:
>> -		case MFI_FWSTATE_DEVICE_SCAN:
>>  		case MFI_FWSTATE_FLUSH_CACHE:
>> -			max_wait = 20;
>> +			max_wait = MFI_RESET_WAIT_TIME;
>> +			break;
>> +		case MFI_FWSTATE_DEVICE_SCAN:
>> +			max_wait = MFI_RESET_WAIT_TIME; /* wait for 180 seconds */
>> +			prev_abs_reg_val = cur_abs_reg_val;
>> +			break;
>> +		case MFI_FWSTATE_BOOT_MESSAGE_PENDING:
>> +			if (sc->mfi_flags & MFI_FLAGS_SKINNY || sc->mfi_flags &
>> MFI_FLAGS_TBOLT)
>> +			    MFI_WRITE4(sc, MFI_SKINNY_IDB, MFI_FWINIT_HOTPLUG);
>> +			else
>> +			    MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_HOTPLUG);
>> +			max_wait = MFI_RESET_WAIT_TIME;
>>  			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);
>>  		}
>>  		for (i = 0; i < (max_wait * 10); i++) {
>> -			fw_state = sc->mfi_read_fw_status(sc) & MFI_FWSTATE_MASK;
>> +			cur_abs_reg_val = sc->mfi_read_fw_status(sc);
>> +			fw_state = cur_abs_reg_val & MFI_FWSTATE_MASK;
>>  			if (fw_state == cur_state)
>>  				DELAY(100000);
>>  			else
>>  				break;
>>  		}
>> +		if (fw_state == MFI_FWSTATE_DEVICE_SCAN) {
>> +			/* Check the device scanning progress */
>> +			if (prev_abs_reg_val != cur_abs_reg_val) {
>> +				continue;
>> +			}
>> +		}
>>  		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);
>>  		}
>> @@ -282,26 +346,36 @@ mfi_transition_firmware(struct mfi_softc
>>  }
>>
>>  static void
>> -mfi_addr32_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
>> +mfi_addr_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
>>  {
>> -	uint32_t *addr;
>> +	bus_addr_t *addr;
>>
>>  	addr = arg;
>>  	*addr = segs[0].ds_addr;
>>  }
>>
>> +
>>  int
>>  mfi_attach(struct mfi_softc *sc)
>>  {
>>  	uint32_t status;
>>  	int error, commsz, framessz, sensesz;
>>  	int frames, unit, max_fw_sge;
>> +	uint32_t tb_mem_size = 0;
>>
>> -	device_printf(sc->mfi_dev, "Megaraid SAS driver Ver 3.00 \n");
>> +	if (sc == NULL)
>> +		return EINVAL;
>> +
>> +	device_printf(sc->mfi_dev, "Megaraid SAS driver Ver %s \n",
>> +	    MEGASAS_VERSION);
>>
>>  	mtx_init(&sc->mfi_io_lock, "MFI I/O lock", NULL, MTX_DEF);
>>  	sx_init(&sc->mfi_config_lock, "MFI config");
>>  	TAILQ_INIT(&sc->mfi_ld_tqh);
>> +	TAILQ_INIT(&sc->mfi_syspd_tqh);
>> +	TAILQ_INIT(&sc->mfi_evt_queue);
>> +	TASK_INIT(&sc->mfi_evt_task, 0, mfi_handle_evt, sc);
>> +	TASK_INIT(&sc->mfi_map_sync_task, 0, mfi_handle_map_sync, sc);
>>  	TAILQ_INIT(&sc->mfi_aen_pids);
>>  	TAILQ_INIT(&sc->mfi_cam_ccbq);
>>
>> @@ -310,15 +384,29 @@ mfi_attach(struct mfi_softc *sc)
>>  	mfi_initq_busy(sc);
>>  	mfi_initq_bio(sc);
>>
>> +	sc->adpreset = 0;
>> +	sc->last_seq_num = 0;
>> +	sc->disableOnlineCtrlReset = 1;
>> +	sc->issuepend_done = 1;
>> +	sc->hw_crit_error = 0;
>> +
>>  	if (sc->mfi_flags & MFI_FLAGS_1064R) {
>>  		sc->mfi_enable_intr = mfi_enable_intr_xscale;
>>  		sc->mfi_read_fw_status = mfi_read_fw_status_xscale;
>>  		sc->mfi_check_clear_intr = mfi_check_clear_intr_xscale;
>>  		sc->mfi_issue_cmd = mfi_issue_cmd_xscale;
>> -	}
>> -	else {
>> +	} else if (sc->mfi_flags & MFI_FLAGS_TBOLT) {
>> +		sc->mfi_enable_intr = mfi_tbolt_enable_intr_ppc;
>> +		sc->mfi_disable_intr = mfi_tbolt_disable_intr_ppc;
>> +		sc->mfi_read_fw_status = mfi_tbolt_read_fw_status_ppc;
>> +		sc->mfi_check_clear_intr = mfi_tbolt_check_clear_intr_ppc;
>> +		sc->mfi_issue_cmd = mfi_tbolt_issue_cmd_ppc;
>> +		sc->mfi_adp_reset = mfi_tbolt_adp_reset;
>> +		sc->mfi_tbolt = 1;
>> +		TAILQ_INIT(&sc->mfi_cmd_tbolt_tqh);
>> +	} else {
>>  		sc->mfi_enable_intr =  mfi_enable_intr_ppc;
>> - 		sc->mfi_read_fw_status = mfi_read_fw_status_ppc;
>> +		sc->mfi_read_fw_status = mfi_read_fw_status_ppc;
>>  		sc->mfi_check_clear_intr = mfi_check_clear_intr_ppc;
>>  		sc->mfi_issue_cmd = mfi_issue_cmd_ppc;
>>  	}
>> @@ -331,6 +419,32 @@ mfi_attach(struct mfi_softc *sc)
>>  		return (ENXIO);
>>  	}
>>
>> +	/* Start: LSIP200113393 */
>> +	if (bus_dma_tag_create( sc->mfi_parent_dmat,	/* parent */
>> +				1, 0,			/* algnmnt, boundary */
>> +				BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
>> +				BUS_SPACE_MAXADDR,	/* highaddr */
>> +				NULL, NULL,		/* filter, filterarg */
>> +				MEGASAS_MAX_NAME*sizeof(bus_addr_t),			/* maxsize */
>> +				1,			/* msegments */
>> +				MEGASAS_MAX_NAME*sizeof(bus_addr_t),			/* maxsegsize */
>> +				0,			/* flags */
>> +				NULL, NULL,		/* lockfunc, lockarg */
>> +				&sc->verbuf_h_dmat)) {
>> +		device_printf(sc->mfi_dev, "Cannot allocate verbuf_h_dmat DMA tag\n");
>> +		return (ENOMEM);
>> +	}
>> +	if (bus_dmamem_alloc(sc->verbuf_h_dmat, (void **)&sc->verbuf,
>> +	    BUS_DMA_NOWAIT, &sc->verbuf_h_dmamap)) {
>> +		device_printf(sc->mfi_dev, "Cannot allocate verbuf_h_dmamap
>> memory\n");
>> +		return (ENOMEM);
>> +	}
>> +	bzero(sc->verbuf, MEGASAS_MAX_NAME*sizeof(bus_addr_t));
>> +	bus_dmamap_load(sc->verbuf_h_dmat, sc->verbuf_h_dmamap,
>> +	    sc->verbuf, MEGASAS_MAX_NAME*sizeof(bus_addr_t),
>> +	    mfi_addr_cb, &sc->verbuf_h_busaddr, 0);
>> +	/* End: LSIP200113393 */
>> +
>>  	/*
>>  	 * Get information needed for sizing the contiguous memory for the
>>  	 * frame pool.  Size down the sgl parameter since we know that
>> @@ -341,8 +455,102 @@ mfi_attach(struct mfi_softc *sc)
>>  	status = sc->mfi_read_fw_status(sc);
>>  	sc->mfi_max_fw_cmds = status & MFI_FWSTATE_MAXCMD_MASK;
>>  	max_fw_sge = (status & MFI_FWSTATE_MAXSGL_MASK) >> 16;
>> -	sc->mfi_max_sge = min(max_fw_sge, ((MAXPHYS / PAGE_SIZE) + 1));
>> +	sc->mfi_max_sge = min(max_fw_sge, ((MFI_MAXPHYS / PAGE_SIZE) + 1));
>> +
>> +	/* ThunderBolt Support get the contiguous memory */
>> +
>> +	if (sc->mfi_flags & MFI_FLAGS_TBOLT) {
>> +		mfi_tbolt_init_globals(sc);
>> +		device_printf(sc->mfi_dev, "MaxCmd = %x MaxSgl = %x state = %x \n",
>> +		    sc->mfi_max_fw_cmds, sc->mfi_max_sge, status);
>> +		tb_mem_size = mfi_tbolt_get_memory_requirement(sc);
>> +
>> +		if (bus_dma_tag_create( sc->mfi_parent_dmat,	/* parent */
>> +				1, 0,			/* algnmnt, boundary */
>> +				BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
>> +				BUS_SPACE_MAXADDR,	/* highaddr */
>> +				NULL, NULL,		/* filter, filterarg */
>> +				tb_mem_size,		/* maxsize */
>> +				1,			/* msegments */
>> +				tb_mem_size,		/* maxsegsize */
>> +				0,			/* flags */
>> +				NULL, NULL,		/* lockfunc, lockarg */
>> +				&sc->mfi_tb_dmat)) {
>> +			device_printf(sc->mfi_dev, "Cannot allocate comms DMA tag\n");
>> +			return (ENOMEM);
>> +		}
>> +		if (bus_dmamem_alloc(sc->mfi_tb_dmat, (void
>> **)&sc->request_message_pool,
>> +		BUS_DMA_NOWAIT, &sc->mfi_tb_dmamap)) {
>> +			device_printf(sc->mfi_dev, "Cannot allocate comms memory\n");
>> +			return (ENOMEM);
>> +		}
>> +		bzero(sc->request_message_pool, tb_mem_size);
>> +		bus_dmamap_load(sc->mfi_tb_dmat, sc->mfi_tb_dmamap,
>> +		sc->request_message_pool, tb_mem_size, mfi_addr_cb,
>> &sc->mfi_tb_busaddr,
>> 0);
>> +
>> +		/* For ThunderBolt memory init */
>> +		if (bus_dma_tag_create( sc->mfi_parent_dmat,	/* parent */
>> +				0x100, 0,		/* alignmnt, boundary */
>> +				BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
>> +				BUS_SPACE_MAXADDR,	/* highaddr */
>> +				NULL, NULL,		/* filter, filterarg */
>> +				MFI_FRAME_SIZE,		/* maxsize */
>> +				1,			/* msegments */
>> +				MFI_FRAME_SIZE,		/* maxsegsize */
>> +				0,			/* flags */
>> +				NULL, NULL,		/* lockfunc, lockarg */
>> +				&sc->mfi_tb_init_dmat)) {
>> +		device_printf(sc->mfi_dev, "Cannot allocate init DMA tag\n");
>> +		return (ENOMEM);
>> +		}
>> +		if (bus_dmamem_alloc(sc->mfi_tb_init_dmat, (void **)&sc->mfi_tb_init,
>> +		    BUS_DMA_NOWAIT, &sc->mfi_tb_init_dmamap)) {
>> +			device_printf(sc->mfi_dev, "Cannot allocate init memory\n");
>> +			return (ENOMEM);
>> +		}
>> +		bzero(sc->mfi_tb_init, MFI_FRAME_SIZE);
>> +		bus_dmamap_load(sc->mfi_tb_init_dmat, sc->mfi_tb_init_dmamap,
>> +		sc->mfi_tb_init, MFI_FRAME_SIZE, mfi_addr_cb,
>> +		    &sc->mfi_tb_init_busaddr, 0);
>> +		if (mfi_tbolt_init_desc_pool(sc, sc->request_message_pool,
>> +		    tb_mem_size)) {
>> +			device_printf(sc->mfi_dev,
>> +			    "Thunderbolt pool preparation error\n");
>> +			return 0;
>> +		}
>>
>> +		/*
>> +		  Allocate DMA memory mapping for MPI2 IOC Init descriptor,
>> +		  we are taking it diffrent from what we have allocated for Request
>> +		  and reply descriptors to avoid confusion later
>> +		*/
>> +		tb_mem_size = sizeof(struct MPI2_IOC_INIT_REQUEST);
>> +		if (bus_dma_tag_create( sc->mfi_parent_dmat,	/* parent */
>> +				1, 0,			/* algnmnt, boundary */
>> +				BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
>> +				BUS_SPACE_MAXADDR,	/* highaddr */
>> +				NULL, NULL,		/* filter, filterarg */
>> +				tb_mem_size,		/* maxsize */
>> +				1,			/* msegments */
>> +				tb_mem_size,		/* maxsegsize */
>> +				0,			/* flags */
>> +				NULL, NULL,		/* lockfunc, lockarg */
>> +				&sc->mfi_tb_ioc_init_dmat)) {
>> +			device_printf(sc->mfi_dev,
>> +			    "Cannot allocate comms DMA tag\n");
>> +			return (ENOMEM);
>> +		}
>> +		if (bus_dmamem_alloc(sc->mfi_tb_ioc_init_dmat,
>> +		    (void **)&sc->mfi_tb_ioc_init_desc,
>> +		    BUS_DMA_NOWAIT, &sc->mfi_tb_ioc_init_dmamap)) {
>> +			device_printf(sc->mfi_dev, "Cannot allocate comms memory\n");
>> +			return (ENOMEM);
>> +		}
>> +		bzero(sc->mfi_tb_ioc_init_desc, tb_mem_size);
>> +		bus_dmamap_load(sc->mfi_tb_ioc_init_dmat, sc->mfi_tb_ioc_init_dmamap,
>> +		sc->mfi_tb_ioc_init_desc, tb_mem_size, mfi_addr_cb,
>> +		    &sc->mfi_tb_ioc_init_busaddr, 0);
>> +	}
>>  	/*
>>  	 * Create the dma tag for data buffers.  Used both for block I/O
>>  	 * and for various internal data queries.
>> @@ -392,8 +600,7 @@ mfi_attach(struct mfi_softc *sc)
>>  	}
>>  	bzero(sc->mfi_comms, commsz);
>>  	bus_dmamap_load(sc->mfi_comms_dmat, sc->mfi_comms_dmamap,
>> -	    sc->mfi_comms, commsz, mfi_addr32_cb, &sc->mfi_comms_busaddr, 0);
>> -
>> +	    sc->mfi_comms, commsz, mfi_addr_cb, &sc->mfi_comms_busaddr, 0);
>>  	/*
>>  	 * Allocate DMA memory for the command frames.  Keep them in the
>>  	 * lower 4GB for efficiency.  Calculate the size of the commands at
>> @@ -410,6 +617,8 @@ mfi_attach(struct mfi_softc *sc)
>>  	} else {
>>  		sc->mfi_sge_size = sizeof(struct mfi_sg32);
>>  	}
>> +	if (sc->mfi_flags & MFI_FLAGS_SKINNY)
>> +		sc->mfi_sge_size = sizeof(struct mfi_sg_skinny);
>>  	frames = (sc->mfi_sge_size * sc->mfi_max_sge - 1) / MFI_FRAME_SIZE + 2;
>>  	sc->mfi_cmd_size = frames * MFI_FRAME_SIZE;
>>  	framessz = sc->mfi_cmd_size * sc->mfi_max_fw_cmds;
>> @@ -434,8 +643,7 @@ mfi_attach(struct mfi_softc *sc)
>>  	}
>>  	bzero(sc->mfi_frames, framessz);
>>  	bus_dmamap_load(sc->mfi_frames_dmat, sc->mfi_frames_dmamap,
>> -	    sc->mfi_frames, framessz, mfi_addr32_cb,
>> &sc->mfi_frames_busaddr,0);
>> -
>> +	    sc->mfi_frames, framessz, mfi_addr_cb, &sc->mfi_frames_busaddr,0);
>>  	/*
>>  	 * Allocate DMA memory for the frame sense data.  Keep them in the
>>  	 * lower 4GB for efficiency
>> @@ -461,39 +669,46 @@ mfi_attach(struct mfi_softc *sc)
>>  		return (ENOMEM);
>>  	}
>>  	bus_dmamap_load(sc->mfi_sense_dmat, sc->mfi_sense_dmamap,
>> -	    sc->mfi_sense, sensesz, mfi_addr32_cb, &sc->mfi_sense_busaddr, 0);
>> -
>> +	    sc->mfi_sense, sensesz, mfi_addr_cb, &sc->mfi_sense_busaddr, 0);
>>  	if ((error = mfi_alloc_commands(sc)) != 0)
>>  		return (error);
>>
>> -	if ((error = mfi_comms_init(sc)) != 0)
>> -		return (error);
>> +	/* Before moving the FW to operational state, check whether
>> +	 * hostmemory is required by the FW or not
>> +	 */
>>
>> -	if ((error = mfi_get_controller_info(sc)) != 0)
>> -		return (error);
>> +	/* ThunderBolt MFI_IOC2 INIT */
>> +	if (sc->mfi_flags & MFI_FLAGS_TBOLT) {
>> +		sc->mfi_disable_intr(sc);
>> +		if ((error = mfi_tbolt_init_MFI_queue(sc)) != 0) {
>> +			device_printf(sc->mfi_dev,
>> +			    "TB Init has failed with error %d\n",error);
>> +			return error;
>> +		}
>>
>> -	mtx_lock(&sc->mfi_io_lock);
>> -	if ((error = mfi_aen_setup(sc, 0), 0) != 0) {
>> -		mtx_unlock(&sc->mfi_io_lock);
>> -		return (error);
>> -	}
>> -	mtx_unlock(&sc->mfi_io_lock);
>> +		if ((error = mfi_tbolt_alloc_cmd(sc)) != 0)
>> +			return error;
>> +		if (bus_setup_intr(sc->mfi_dev, sc->mfi_irq,
>> +		    INTR_MPSAFE|INTR_TYPE_BIO, NULL, mfi_intr_tbolt, sc,
>> +		    &sc->mfi_intr)) {
>> +			device_printf(sc->mfi_dev, "Cannot set up interrupt\n");
>> +			return (EINVAL);
>> +		}
>> +		sc->mfi_enable_intr(sc);
>> +	} else {
>> +		if ((error = mfi_comms_init(sc)) != 0)
>> +			return (error);
>>
>> -	/*
>> -	 * Set up the interrupt handler.  XXX This should happen in
>> -	 * mfi_pci.c
>> -	 */
>> -	sc->mfi_irq_rid = 0;
>> -	if ((sc->mfi_irq = bus_alloc_resource_any(sc->mfi_dev, SYS_RES_IRQ,
>> -	    &sc->mfi_irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) {
>> -		device_printf(sc->mfi_dev, "Cannot allocate interrupt\n");
>> -		return (EINVAL);
>> -	}
>> -	if (bus_setup_intr(sc->mfi_dev, sc->mfi_irq, INTR_MPSAFE|INTR_TYPE_BIO,
>> -	    NULL, mfi_intr, sc, &sc->mfi_intr)) {
>> -		device_printf(sc->mfi_dev, "Cannot set up interrupt\n");
>> -		return (EINVAL);
>> +		if (bus_setup_intr(sc->mfi_dev, sc->mfi_irq,
>> +		    INTR_MPSAFE|INTR_TYPE_BIO, NULL, mfi_intr, sc, &sc->mfi_intr)) {
>> +			device_printf(sc->mfi_dev, "Cannot set up interrupt\n");
>> +			return (EINVAL);
>> +		}
>> +		sc->mfi_enable_intr(sc);
>>  	}
>> +	if ((error = mfi_get_controller_info(sc)) != 0)
>> +		return (error);
>> +	sc->disableOnlineCtrlReset = 0;
>>
>>  	/* Register a config hook to probe the bus for arrays */
>>  	sc->mfi_ich.ich_func = mfi_startup;
>> @@ -503,6 +718,10 @@ mfi_attach(struct mfi_softc *sc)
>>  		    "hook\n");
>>  		return (EINVAL);
>>  	}
>> +	if ((error = mfi_aen_setup(sc, 0), 0) != 0) {
>> +		mtx_unlock(&sc->mfi_io_lock);
>> +		return (error);
>> +	}
>>
>>  	/*
>>  	 * Register a shutdown handler.
>> @@ -541,6 +760,10 @@ mfi_attach(struct mfi_softc *sc)
>>  	callout_reset(&sc->mfi_watchdog_callout, MFI_CMD_TIMEOUT * hz,
>>  	    mfi_timeout, sc);
>>
>> +	if (sc->mfi_flags & MFI_FLAGS_TBOLT) {
>> +		mfi_tbolt_sync_map_info(sc);
>> +	}
>> +
>>  	return (0);
>>  }
>>
>> @@ -574,8 +797,11 @@ mfi_alloc_commands(struct mfi_softc *sc)
>>  		cm->cm_sc = sc;
>>  		cm->cm_index = i;
>>  		if (bus_dmamap_create(sc->mfi_buffer_dmat, 0,
>> -		    &cm->cm_dmamap) == 0)
>> +		    &cm->cm_dmamap) == 0) {
>> +			mtx_lock(&sc->mfi_io_lock);
>>  			mfi_release_command(cm);
>> +			mtx_unlock(&sc->mfi_io_lock);
>> +		}
>>  		else
>>  			break;
>>  		sc->mfi_total_cmds++;
>> @@ -590,6 +816,8 @@ mfi_release_command(struct mfi_command *
>>  	struct mfi_frame_header *hdr;
>>  	uint32_t *hdr_data;
>>
>> +	mtx_assert(&cm->cm_sc->mfi_io_lock, MA_OWNED);
>> +
>>  	/*
>>  	 * Zero out the important fields of the frame, but make sure the
>>  	 * context field is preserved.  For efficiency, handle the fields
>> @@ -614,24 +842,31 @@ mfi_release_command(struct mfi_command *
>>  	cm->cm_data = NULL;
>>  	cm->cm_sg = 0;
>>  	cm->cm_total_frame_size = 0;
>> +	cm->retry_for_fw_reset = 0;
>>
>>  	mfi_enqueue_free(cm);
>>  }
>>
>> -static int
>> -mfi_dcmd_command(struct mfi_softc *sc, struct mfi_command **cmp,
>> uint32_t
>> opcode,
>> -    void **bufp, size_t bufsize)
>> +int
>> +mfi_dcmd_command(struct mfi_softc *sc, struct mfi_command **cmp,
>> +    uint32_t opcode, void **bufp, size_t bufsize)
>>  {
>>  	struct mfi_command *cm;
>>  	struct mfi_dcmd_frame *dcmd;
>>  	void *buf = NULL;
>> -	
>> +	uint32_t context = 0;
>> +
>>  	mtx_assert(&sc->mfi_io_lock, MA_OWNED);
>> -	
>> +
>>  	cm = mfi_dequeue_free(sc);
>>  	if (cm == NULL)
>>  		return (EBUSY);
>>
>> +	/* Zero out the MFI frame */
>> +	context = cm->cm_frame->header.context;
>> +	bzero(cm->cm_frame, sizeof(union mfi_frame));
>> +	cm->cm_frame->header.context = context;
>> +
>>  	if ((bufsize > 0) && (bufp != NULL)) {
>>  		if (*bufp == NULL) {
>>  			buf = malloc(bufsize, M_MFIBUF, M_NOWAIT|M_ZERO);
>> @@ -651,6 +886,7 @@ mfi_dcmd_command(struct mfi_softc *sc, s
>>  	dcmd->header.timeout = 0;
>>  	dcmd->header.flags = 0;
>>  	dcmd->header.data_len = bufsize;
>> +	dcmd->header.scsi_status = 0;
>>  	dcmd->opcode = opcode;
>>  	cm->cm_sg = &dcmd->sgl;
>>  	cm->cm_total_frame_size = MFI_DCMD_FRAME_SIZE;
>> @@ -672,11 +908,17 @@ mfi_comms_init(struct mfi_softc *sc)
>>  	struct mfi_init_frame *init;
>>  	struct mfi_init_qinfo *qinfo;
>>  	int error;
>> +	uint32_t context = 0;
>>
>>  	mtx_lock(&sc->mfi_io_lock);
>>  	if ((cm = mfi_dequeue_free(sc)) == NULL)
>>  		return (EBUSY);
>>
>> +	/* Zero out the MFI frame */
>> +	context = cm->cm_frame->header.context;
>> +	bzero(cm->cm_frame, sizeof(union mfi_frame));
>> +	cm->cm_frame->header.context = context;
>> +
>>  	/*
>>  	 * Abuse the SG list area of the frame to hold the init_qinfo
>>  	 * object;
>> @@ -737,9 +979,11 @@ mfi_get_controller_info(struct mfi_softc
>>  	    BUS_DMASYNC_POSTREAD);
>>  	bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap);
>>
>> -	max_sectors_1 = (1 << ci->stripe_sz_ops.min) * ci->max_strips_per_io;
>> +	max_sectors_1 = (1 << ci->stripe_sz_ops.max) * ci->max_strips_per_io;
>>  	max_sectors_2 = ci->max_request_size;
>>  	sc->mfi_max_io = min(max_sectors_1, max_sectors_2);
>> +	sc->disableOnlineCtrlReset =
>> +	    ci->properties.OnOffProperties.disableOnlineCtrlReset;
>>
>>  out:
>>  	if (ci)
>> @@ -756,6 +1000,7 @@ mfi_get_log_state(struct mfi_softc *sc,
>>  	struct mfi_command *cm = NULL;
>>  	int error;
>>
>> +	mtx_lock(&sc->mfi_io_lock);
>>  	error = mfi_dcmd_command(sc, &cm, MFI_DCMD_CTRL_EVENT_GETINFO,
>>  	    (void **)log_state, sizeof(**log_state));
>>  	if (error)
>> @@ -774,11 +1019,12 @@ mfi_get_log_state(struct mfi_softc *sc,
>>  out:
>>  	if (cm)
>>  		mfi_release_command(cm);
>> +	mtx_unlock(&sc->mfi_io_lock);
>>
>>  	return (error);
>>  }
>>
>> -static int
>> +int
>>  mfi_aen_setup(struct mfi_softc *sc, uint32_t seq_start)
>>  {
>>  	struct mfi_evt_log_state *log_state = NULL;
>> @@ -788,10 +1034,11 @@ mfi_aen_setup(struct mfi_softc *sc, uint
>>
>>  	class_locale.members.reserved = 0;
>>  	class_locale.members.locale = mfi_event_locale;
>> -	class_locale.members.class  = mfi_event_class;
>> +	class_locale.members.evt_class  = mfi_event_class;
>>
>>  	if (seq_start == 0) {
>>  		error = mfi_get_log_state(sc, &log_state);
>> +		sc->mfi_boot_seq_num = log_state->boot_seq_num;
>>  		if (error) {
>>  			if (log_state)
>>  				free(log_state, M_MFIBUF);
>> @@ -813,7 +1060,7 @@ mfi_aen_setup(struct mfi_softc *sc, uint
>>  	return 0;
>>  }
>>
>> -static int
>> +int
>>  mfi_wait_command(struct mfi_softc *sc, struct mfi_command *cm)
>>  {
>>
>> @@ -886,6 +1133,64 @@ mfi_free(struct mfi_softc *sc)
>>  	if (sc->mfi_comms_dmat != NULL)
>>  		bus_dma_tag_destroy(sc->mfi_comms_dmat);
>>
>> +	/* ThunderBolt contiguous memory free here */
>> +	if (sc->mfi_flags & MFI_FLAGS_TBOLT) {
>> +		if (sc->mfi_tb_busaddr != 0)
>> +			bus_dmamap_unload(sc->mfi_tb_dmat, sc->mfi_tb_dmamap);
>> +		if (sc->request_message_pool != NULL)
>> +			bus_dmamem_free(sc->mfi_tb_dmat, sc->request_message_pool,
>> +			    sc->mfi_tb_dmamap);
>> +		if (sc->mfi_tb_dmat != NULL)
>> +			bus_dma_tag_destroy(sc->mfi_tb_dmat);
>> +
>> +		/* Version buffer memory free */
>> +		/* Start LSIP200113393 */
>> +		if (sc->verbuf_h_busaddr != 0)
>> +			bus_dmamap_unload(sc->verbuf_h_dmat, sc->verbuf_h_dmamap);
>> +		if (sc->verbuf != NULL)
>> +			bus_dmamem_free(sc->verbuf_h_dmat, sc->verbuf,
>> +			    sc->verbuf_h_dmamap);
>> +		if (sc->verbuf_h_dmat != NULL)
>> +			bus_dma_tag_destroy(sc->verbuf_h_dmat);
>> +
>> +		/* End LSIP200113393 */
>> +		/* ThunderBolt INIT packet memory Free */
>> +		if (sc->mfi_tb_init_busaddr != 0)
>> +			bus_dmamap_unload(sc->mfi_tb_init_dmat, sc->mfi_tb_init_dmamap);
>> +		if (sc->mfi_tb_init != NULL)
>> +			bus_dmamem_free(sc->mfi_tb_init_dmat, sc->mfi_tb_init,
>> +			    sc->mfi_tb_init_dmamap);
>> +		if (sc->mfi_tb_init_dmat != NULL)
>> +			bus_dma_tag_destroy(sc->mfi_tb_init_dmat);
>> +
>> +		/* ThunderBolt IOC Init Desc memory free here */
>> +		if (sc->mfi_tb_ioc_init_busaddr != 0)
>> +			bus_dmamap_unload(sc->mfi_tb_ioc_init_dmat,
>> +			    sc->mfi_tb_ioc_init_dmamap);
>> +		if (sc->mfi_tb_ioc_init_desc != NULL)
>> +			bus_dmamem_free(sc->mfi_tb_ioc_init_dmat,
>> +			    sc->mfi_tb_ioc_init_desc,
>> +			    sc->mfi_tb_ioc_init_dmamap);
>> +		if (sc->mfi_tb_ioc_init_dmat != NULL)
>> +			bus_dma_tag_destroy(sc->mfi_tb_ioc_init_dmat);
>> +		for (int i = 0; i < sc->mfi_max_fw_cmds; i++) {
>> +			if (sc->mfi_cmd_pool_tbolt != NULL) {
>> +				if (sc->mfi_cmd_pool_tbolt[i] != NULL) {
>> +					free(sc->mfi_cmd_pool_tbolt[i],
>> +					    M_MFIBUF);
>> +					sc->mfi_cmd_pool_tbolt[i] = NULL;
>> +				}
>> +			}
>> +		}
>> +		if (sc->mfi_cmd_pool_tbolt != NULL) {
>> +			free(sc->mfi_cmd_pool_tbolt, M_MFIBUF);
>> +			sc->mfi_cmd_pool_tbolt = NULL;
>> +		}
>> +		if (sc->request_desc_pool != NULL) {
>> +			free(sc->request_desc_pool, M_MFIBUF);
>> +			sc->request_desc_pool = NULL;
>> +		}
>> +	}
>>  	if (sc->mfi_buffer_dmat != NULL)
>>  		bus_dma_tag_destroy(sc->mfi_buffer_dmat);
>>  	if (sc->mfi_parent_dmat != NULL)
>> @@ -912,6 +1217,8 @@ mfi_startup(void *arg)
>>  	sx_xlock(&sc->mfi_config_lock);
>>  	mtx_lock(&sc->mfi_io_lock);
>>  	mfi_ldprobe(sc);
>> +	if (sc->mfi_flags & MFI_FLAGS_SKINNY)
>> +	    mfi_syspdprobe(sc);
>>  	mtx_unlock(&sc->mfi_io_lock);
>>  	sx_xunlock(&sc->mfi_config_lock);
>>  }
>> @@ -928,12 +1235,7 @@ mfi_intr(void *arg)
>>  	if (sc->mfi_check_clear_intr(sc))
>>  		return;
>>
>> -	/*
>> -	 * Do a dummy read to flush the interrupt ACK that we just performed,
>> -	 * ensuring that everything is really, truly consistent.
>> -	 */
>> -	(void)sc->mfi_read_fw_status(sc);
>> -
>> +restart:
>>  	pi = sc->mfi_comms->hw_pi;
>>  	ci = sc->mfi_comms->hw_ci;
>>  	mtx_lock(&sc->mfi_io_lock);
>> @@ -958,6 +1260,14 @@ mfi_intr(void *arg)
>>  	mfi_startio(sc);
>>  	mtx_unlock(&sc->mfi_io_lock);
>>
>> +	/*
>> +	 * Dummy read to flush the bus; this ensures that the indexes are up
>> +	 * to date.  Restart processing if more commands have come it.
>> +	 */
>> +	(void)sc->mfi_read_fw_status(sc);
>> +	if (pi != sc->mfi_comms->hw_pi)
>> +		goto restart;
>> +
>>  	return;
>>  }
>>
>> @@ -978,6 +1288,9 @@ mfi_shutdown(struct mfi_softc *sc)
>>  	if (sc->mfi_aen_cm != NULL)
>>  		mfi_abort(sc, sc->mfi_aen_cm);
>>
>> +	if (sc->mfi_map_sync_cm != NULL)
>> +		mfi_abort(sc, sc->mfi_map_sync_cm);
>> +
>>  	dcmd = &cm->cm_frame->dcmd;
>>  	dcmd->header.flags = MFI_FRAME_DIR_NONE;
>>  	cm->cm_flags = MFI_CMD_POLLED;
>> @@ -993,6 +1306,81 @@ mfi_shutdown(struct mfi_softc *sc)
>>  }
>>
>>  static void
>> +mfi_syspdprobe(struct mfi_softc *sc)
>> +{
>> +	struct mfi_frame_header *hdr;
>> +	struct mfi_command *cm = NULL;
>> +	struct mfi_pd_list *pdlist = NULL;
>> +	struct mfi_system_pd *syspd, *tmp;
>> +	int error, i, found;
>> +
>> +	sx_assert(&sc->mfi_config_lock, SA_XLOCKED);
>> +	mtx_assert(&sc->mfi_io_lock, MA_OWNED);
>> +	/* Add SYSTEM PD's */
>> +	error = mfi_dcmd_command(sc, &cm, MFI_DCMD_PD_LIST_QUERY,
>> +	    (void **)&pdlist, sizeof(*pdlist));
>> +	if (error) {
>> +		device_printf(sc->mfi_dev,
>> +		    "Error while forming SYSTEM PD list\n");
>> +		goto out;
>> +	}
>> +
>> +	cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_POLLED;
>> +	cm->cm_frame->dcmd.mbox[0] = MR_PD_QUERY_TYPE_EXPOSED_TO_HOST;
>> +	cm->cm_frame->dcmd.mbox[1] = 0;
>> +	if (mfi_mapcmd(sc, cm) != 0) {
>> +		device_printf(sc->mfi_dev,
>> +		    "Failed to get syspd device listing\n");
>> +		goto out;
>> +	}
>> +	bus_dmamap_sync(sc->mfi_buffer_dmat,cm->cm_dmamap,
>> +	    BUS_DMASYNC_POSTREAD);
>> +	bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap);
>> +	hdr = &cm->cm_frame->header;
>> +	if (hdr->cmd_status != MFI_STAT_OK) {
>> +		device_printf(sc->mfi_dev,
>> +		    "MFI_DCMD_PD_LIST_QUERY failed %x\n", hdr->cmd_status);
>> +		goto out;
>> +	}
>> +	/* Get each PD and add it to the system */
>> +	for (i = 0; i < pdlist->count; i++) {
>> +		if (pdlist->addr[i].device_id ==
>> +		    pdlist->addr[i].encl_device_id)
>> +			continue;
>> +		found = 0;
>> +		TAILQ_FOREACH(syspd, &sc->mfi_syspd_tqh, pd_link) {
>> +			if (syspd->pd_id == pdlist->addr[i].device_id)
>> +				found = 1;
>> +		}
>> +		if (found == 0)
>> +			mfi_add_sys_pd(sc, pdlist->addr[i].device_id);
>> +	}
>> +	/* Delete SYSPD's whose state has been changed */
>> +	TAILQ_FOREACH_SAFE(syspd, &sc->mfi_syspd_tqh, pd_link, tmp) {
>> +		found = 0;
>> +		for (i = 0; i < pdlist->count; i++) {
>> +			if (syspd->pd_id == pdlist->addr[i].device_id)
>> +				found = 1;
>> +		}
>> +		if (found == 0) {
>> +			printf("DELETE\n");
>> +			mtx_unlock(&sc->mfi_io_lock);
>> +			mtx_lock(&Giant);
>> +			device_delete_child(sc->mfi_dev, syspd->pd_dev);
>> +			mtx_unlock(&Giant);
>> +			mtx_lock(&sc->mfi_io_lock);
>> +		}
>> +	}
>> +out:
>> +	if (pdlist)
>> +	    free(pdlist, M_MFIBUF);
>> +	if (cm)
>> +	    mfi_release_command(cm);
>> +
>> +	return;
>> +}
>> +
>> +static void
>>  mfi_ldprobe(struct mfi_softc *sc)
>>  {
>>  	struct mfi_frame_header *hdr;
>> @@ -1086,10 +1474,124 @@ format_class(int8_t class)
>>  static void
>>  mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
>>  {
>> +	struct mfi_system_pd *syspd = NULL;
>>
>>  	device_printf(sc->mfi_dev, "%d (%s/0x%04x/%s) - %s\n", detail->seq,
>> -	    format_timestamp(detail->time), detail->class.members.locale,
>> -	    format_class(detail->class.members.class), detail->description);
>> +	    format_timestamp(detail->time), detail->evt_class.members.locale,
>> +	    format_class(detail->evt_class.members.evt_class),
>> +	    detail->description);
>> +
>> +        /* Don't act on old AEN's or while shutting down */
>> +        if (detail->seq < sc->mfi_boot_seq_num || sc->mfi_detaching)
>> +                return;
>> +
>> +	switch (detail->arg_type) {
>> +	case MR_EVT_ARGS_NONE:
>> +		if (detail->code == MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED) {
>> +		    device_printf(sc->mfi_dev, "HostBus scan raised\n");
>> +			if (mfi_detect_jbod_change) {
>> +				/*
>> +				 * Probe for new SYSPD's and Delete
>> +				 * invalid SYSPD's
>> +				 */
>> +				sx_xlock(&sc->mfi_config_lock);
>> +				mtx_lock(&sc->mfi_io_lock);
>> +				mfi_syspdprobe(sc);
>> +				mtx_unlock(&sc->mfi_io_lock);
>> +				sx_xunlock(&sc->mfi_config_lock);
>> +			}
>> +		}
>> +		break;
>> +	case MR_EVT_ARGS_LD_STATE:
>> +		/* During load time driver reads all the events starting
>> +		 * from the one that has been logged after shutdown. Avoid
>> +		 * these old events.
>> +		 */
>> +		if (detail->args.ld_state.new_state == MFI_LD_STATE_OFFLINE ) {
>> +			/* Remove the LD */
>> +			struct mfi_disk *ld;
>> +			TAILQ_FOREACH(ld, &sc->mfi_ld_tqh, ld_link) {
>> +				if (ld->ld_id ==
>> +				    detail->args.ld_state.ld.target_id)
>> +					break;
>> +			}
>> +			/*
>> +			Fix: for kernel panics when SSCD is removed
>> +			KASSERT(ld != NULL, ("volume dissappeared"));
>> +			*/
>> +			if (ld != NULL) {
>> +				mtx_lock(&Giant);
>> +				device_delete_child(sc->mfi_dev, ld->ld_dev);
>> +				mtx_unlock(&Giant);
>> +			}
>> +		}
>> +		break;
>>
>> *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
>> _______________________________________________
>> svn-src-stable@freebsd.org mailing list
>> http://lists.freebsd.org/mailman/listinfo/svn-src-stable
>> To unsubscribe, send any mail to "svn-src-stable-unsubscribe@freebsd.org"
>>
>

--20cf300fb37172126b04c058e103
Content-Type: text/x-diff; charset=US-ASCII; 
	name="20120519023614-mfi-compile-fix-after-r235636.diff"
Content-Disposition: attachment; 
	filename="20120519023614-mfi-compile-fix-after-r235636.diff"
Content-Transfer-Encoding: base64
X-Attachment-Id: file0

ZGlmZiAtLWdpdCBhL3Vzci5zYmluL21maXV0aWwvbWZpX2V2dC5jIGIvdXNyLnNiaW4vbWZpdXRp
bC9tZmlfZXZ0LmMKaW5kZXggYTE0YmIxOS4uMzM2ZmJkMyAxMDA2NDQKLS0tIGEvdXNyLnNiaW4v
bWZpdXRpbC9tZmlfZXZ0LmMKKysrIGIvdXNyLnNiaW4vbWZpdXRpbC9tZmlfZXZ0LmMKQEAgLTM2
Myw4ICszNjMsOCBAQCBtZmlfZGVjb2RlX2V2dChpbnQgZmQsIHN0cnVjdCBtZmlfZXZ0X2RldGFp
bCAqZGV0YWlsLCBpbnQgdmVyYm9zZSkKIHsKIAogCXByaW50ZigiJTVkICglcy8lcy8lcykgLSAi
LCBkZXRhaWwtPnNlcSwgZm9ybWF0X3RpbWVzdGFtcChkZXRhaWwtPnRpbWUpLAotCSAgICBmb3Jt
YXRfbG9jYWxlKGRldGFpbC0+Y2xhc3MubWVtYmVycy5sb2NhbGUpLAotCSAgICBmb3JtYXRfY2xh
c3MoZGV0YWlsLT5jbGFzcy5tZW1iZXJzLmNsYXNzKSk7CisJICAgIGZvcm1hdF9sb2NhbGUoZGV0
YWlsLT5ldnRfY2xhc3MubWVtYmVycy5sb2NhbGUpLAorCSAgICBmb3JtYXRfY2xhc3MoZGV0YWls
LT5ldnRfY2xhc3MubWVtYmVycy5ldnRfY2xhc3MpKTsKIAlzd2l0Y2ggKGRldGFpbC0+YXJnX3R5
cGUpIHsKIAljYXNlIE1SX0VWVF9BUkdTX05PTkU6CiAJCWJyZWFrOwpAQCAtNTU5LDcgKzU1OSw3
IEBAIHNob3dfZXZlbnRzKGludCBhYywgY2hhciAqKmF2KQogCW51bV9ldmVudHMgPSAxNTsKIAlm
aWx0ZXIubWVtYmVycy5yZXNlcnZlZCA9IDA7CiAJZmlsdGVyLm1lbWJlcnMubG9jYWxlID0gTUZJ
X0VWVF9MT0NBTEVfQUxMOwotCWZpbHRlci5tZW1iZXJzLmNsYXNzID0gTUZJX0VWVF9DTEFTU19X
QVJOSU5HOworCWZpbHRlci5tZW1iZXJzLmV2dF9jbGFzcyA9IE1GSV9FVlRfQ0xBU1NfV0FSTklO
RzsKIAlzdGFydCA9IGluZm8uYm9vdF9zZXFfbnVtOwogCXN0b3AgPSBpbmZvLm5ld2VzdF9zZXFf
bnVtOwogCXZlcmJvc2UgPSAwOwpAQCAtNTY5LDcgKzU2OSw3IEBAIHNob3dfZXZlbnRzKGludCBh
YywgY2hhciAqKmF2KQogCXdoaWxlICgoY2ggPSBnZXRvcHQoYWMsIGF2LCAiYzpsOm46diIpKSAh
PSAtMSkgewogCQlzd2l0Y2ggKGNoKSB7CiAJCWNhc2UgJ2MnOgotCQkJaWYgKHBhcnNlX2NsYXNz
KG9wdGFyZywgJmZpbHRlci5tZW1iZXJzLmNsYXNzKSA8IDApIHsKKwkJCWlmIChwYXJzZV9jbGFz
cyhvcHRhcmcsICZmaWx0ZXIubWVtYmVycy5ldnRfY2xhc3MpIDwgMCkgewogCQkJCWVycm9yID0g
ZXJybm87CiAJCQkJd2FybigiRXJyb3IgcGFyc2luZyBldmVudCBjbGFzcyIpOwogCQkJCWNsb3Nl
KGZkKTsK
--20cf300fb37172126b04c058e103--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAPjTQNGjc7YkdqpfDtrPsJP0efNktnp_uP=_b2Q3taBVedLwFg>