RE: [PATCH] mpt2sas : WarpDrive New product SSS6200 support added

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



James,

This patch is missing for commit to your branch. I have seen you have included, below patch
http://marc.info/?l=linux-scsi&m=130019897505773&w=2

_BUT_ this patch, I have submitted earlier which is still not committed.

Anything wrong with the patch?

` Kashyap

> -----Original Message-----
> From: Desai, Kashyap
> Sent: Thursday, March 10, 2011 6:42 PM
> To: linux-scsi@xxxxxxxxxxxxxxx
> Cc: James.Bottomley@xxxxxxxxxxxxxxxxxxxxx; Moore, Eric; Prakash, Sathya
> Subject: RE: [PATCH] mpt2sas : WarpDrive New product SSS6200 support
> added
>
> James,
> Any feedback on this patch submission?  I observe that this patch is
> not following relative depth.
> It has "mpt2sas-phase8.0_wd/mpt2sas_base.c" path, so need to apply
> using -p1 instead of -p4.
>
> Is there any need to resend patch with correct relative depth? Please
> let me know I will resend in that case.
>
> ~ Kashyap
>
>
>
>
> > -----Original Message-----
> > From: linux-scsi-owner@xxxxxxxxxxxxxxx [mailto:linux-scsi-
> > owner@xxxxxxxxxxxxxxx] On Behalf Of Kashyap, Desai
> > Sent: Thursday, February 03, 2011 3:38 PM
> > To: linux-scsi@xxxxxxxxxxxxxxx
> > Cc: James.Bottomley@xxxxxxxxxxxxxxxxxxxxx; Moore, Eric; Prakash,
> Sathya
> > Subject: [PATCH] mpt2sas : WarpDrive New product SSS6200 support
> added
> >
> >
> > Introduction
> > This patch has
> > Support for the new solid state device product SSS6200 from LSI and
> > relavent
> > features w.r.t SSS6200.
> >
> > The major feature added in this driver is supporting Direct-I/O to
> the
> > SSS6200 storage.There are some additional changes done to avoid
> > exposing
> > the RAID member disks to the OS and hiding/exposing drives based on
> the
> > OEM Specific Flag in Manufacturing Page10 (this is required to handle
> > specific changes in the SSS6200 firmware).
> >
> > Each and every changes are listed below.
> > 1. Hiding IR related messages.
> > For SSS6200, the driver is modified not to print IR related events.
> > Even if the debugging is enabled the IR related messages will not be
> > displayed.
> > In some places if there is a need to display a message related to IR
> > the
> > string "IR" is replaced with string "DD" and the string "volume" is
> > replaced
> > with "direct drive". But the function names are not changed hence
> there
> > are
> > some places where the reference to volume can be seen if debug level
> is
> > set.
> >
> > 2. Removed RAID transport support
> > In Linux the user can retrieve RAID volume information from the sysfs
> > directory.
> > This support is removed for SSS6200.
> >
> > 3. Direct I/O support.
> > The driver tries to enable direct I/O when a volume is reported to
> the
> > driver
> > by the firmware through IRCC events and the driver does this just
> > before
> > reporting to the OS, hence all the OS issued I/O can go through
> direct
> > path
> > if they can, The first validation is to see whether the manufacturing
> > page10
> > flag is set to expose all drives always. If that is set, the driver
> > will not
> > enable direct I/O and displays the message "DDIO" is disabled
> globally
> > as
> > drives are exposed. The driver checks whether there is more than one
> > volume
> > in the controller, if so the direct I/O will be disabled globally for
> > all
> > volumes in the controller and the message displayed will be "DDIO is
> > disabled
> > globally as number of drives > 1.
> > If retrieving number of PD is failed the driver will not enable
> direct
> > I/O
> > and displays the message Failure in computing number of drives DDIO
> > disabled.
> > If memory allocation for RAIDVolumePage0 is failed, the driver will
> not
> > enable
> > direct I/O and displays the message Memory allocation failure for
> > RVPG0 DDIO disabled.  If retrieving RAIDVolumePage0 is failed the
> > driver will
> > not enable direct I/O and displays the message Failure in retrieving
> > RVPG0 DDIO disabled
> >
> > If the number of PD in a volume is greater than 8, then the direct
> I/O
> > will
> > be disabled.
> > If any of individual drives handle retrieval is failed then the DD-IO
> > will
> > be disabled.
> > If the volume is not RAID0 or if the block size is not 512 then the
> DD-
> > IO will
> > be disabled.
> > If the volume size is greater than 2TB then the DD-IO will be
> disabled.
> > If the driver is not able to find a valid stripe exponent using the
> > configured
> > stripe size then the DD-IO will be disabled
> >
> > When the DD-IO is enabled the driver will check every I/O request
> > issued to
> > the storage and checks whether the request is either
> > READ6/WRITE6/READ10/WRITE10, if it is and if the complete I/O
> transfer
> > is within a stripe size then the I/O is redirected to
> > the drive directly instead of the volume.
> >
> > On completion of every I/O, if the completion is failure means if the
> > reply
> > is address reply with a reply frame associated with it, then the type
> > of I/O
> > will be checked, if the I/O is direct then the I/O will be retried to
> > the volume once.
> >
> > Signed-off-by: Kashyap Desai <kashyap.desai@xxxxxxx>
> > Reviewed-by: Eric Moore <eric.moore@xxxxxxx>
> > Reviewed-by: Sathya Prakash <sathya.prakash@xxxxxxx>
> > ---
> >
> > diff -aurp mpt2sas-phase8.0/mpt2sas_base.c mpt2sas-
> > phase8.0_wd/mpt2sas_base.c
> > --- mpt2sas-phase8.0/mpt2sas_base.c 2011-01-18 11:33:41.384202609
> +0530
> > +++ mpt2sas-phase8.0_wd/mpt2sas_base.c      2011-01-27 20:48:35.080000040
> > +0530
> > @@ -522,7 +522,8 @@ _base_display_event_data(struct MPT2SAS_
> >             desc = "Device Status Change";
> >             break;
> >     case MPI2_EVENT_IR_OPERATION_STATUS:
> > -           desc = "IR Operation Status";
> > +           if (!ioc->hide_ir_msg)
> > +                   desc = "IR Operation Status";
> >             break;
> >     case MPI2_EVENT_SAS_DISCOVERY:
> >     {
> > @@ -553,16 +554,20 @@ _base_display_event_data(struct MPT2SAS_
> >             desc = "SAS Enclosure Device Status Change";
> >             break;
> >     case MPI2_EVENT_IR_VOLUME:
> > -           desc = "IR Volume";
> > +           if (!ioc->hide_ir_msg)
> > +                   desc = "IR Volume";
> >             break;
> >     case MPI2_EVENT_IR_PHYSICAL_DISK:
> > -           desc = "IR Physical Disk";
> > +           if (!ioc->hide_ir_msg)
> > +                   desc = "IR Physical Disk";
> >             break;
> >     case MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST:
> > -           desc = "IR Configuration Change List";
> > +           if (!ioc->hide_ir_msg)
> > +                   desc = "IR Configuration Change List";
> >             break;
> >     case MPI2_EVENT_LOG_ENTRY_ADDED:
> > -           desc = "Log Entry Added";
> > +           if (!ioc->hide_ir_msg)
> > +                   desc = "Log Entry Added";
> >             break;
> >     }
> >
> > @@ -616,7 +621,10 @@ _base_sas_log_info(struct MPT2SAS_ADAPTE
> >             originator_str = "PL";
> >             break;
> >     case 2:
> > -           originator_str = "IR";
> > +           if (!ioc->hide_ir_msg)
> > +                   originator_str = "IR";
> > +           else
> > +                   originator_str = "WarpDrive";
> >             break;
> >     }
> >
> > @@ -1508,6 +1516,7 @@ mpt2sas_base_free_smid(struct MPT2SAS_AD
> >             }
> >             ioc->scsi_lookup[i].cb_idx = 0xFF;
> >             ioc->scsi_lookup[i].scmd = NULL;
> > +           ioc->scsi_lookup[i].direct_io = 0;
> >             list_add_tail(&ioc->scsi_lookup[i].tracker_list,
> >                 &ioc->free_list);
> >             spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
> > @@ -1795,10 +1804,12 @@ _base_display_ioc_capabilities(struct MP
> >     printk("), ");
> >     printk("Capabilities=(");
> >
> > -   if (ioc->facts.IOCCapabilities &
> > -       MPI2_IOCFACTS_CAPABILITY_INTEGRATED_RAID) {
> > -           printk("Raid");
> > -           i++;
> > +   if (!ioc->hide_ir_msg) {
> > +           if (ioc->facts.IOCCapabilities &
> > +               MPI2_IOCFACTS_CAPABILITY_INTEGRATED_RAID) {
> > +                   printk("Raid");
> > +                   i++;
> > +           }
> >     }
> >
> >     if (ioc->facts.IOCCapabilities & MPI2_IOCFACTS_CAPABILITY_TLR) {
> > @@ -3631,6 +3642,7 @@ _base_make_ioc_operational(struct MPT2SA
> >     u32 reply_address;
> >     u16 smid;
> >     struct _tr_list *delayed_tr, *delayed_tr_next;
> > +   u8 hide_flag;
> >
> >     dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "%s\n", ioc->name,
> >         __func__));
> > @@ -3657,6 +3669,7 @@ _base_make_ioc_operational(struct MPT2SA
> >             ioc->scsi_lookup[i].cb_idx = 0xFF;
> >             ioc->scsi_lookup[i].smid = smid;
> >             ioc->scsi_lookup[i].scmd = NULL;
> > +           ioc->scsi_lookup[i].direct_io = 0;
> >             list_add_tail(&ioc->scsi_lookup[i].tracker_list,
> >                 &ioc->free_list);
> >     }
> > @@ -3717,6 +3730,15 @@ _base_make_ioc_operational(struct MPT2SA
> >     if (sleep_flag == CAN_SLEEP)
> >             _base_static_config_pages(ioc);
> >
> > +   if (ioc->wait_for_port_enable_to_complete && ioc->is_warpdrive) {
> > +           if (ioc->manu_pg10.OEMIdentifier  == 0x80) {
> > +                   hide_flag = (u8) (ioc->manu_pg10.OEMSpecificFlags0 &
> > +                       MFG_PAGE10_HIDE_SSDS_MASK);
> > +                   if (hide_flag != MFG_PAGE10_HIDE_SSDS_MASK)
> > +                           ioc->mfg_pg10_hide_flag = hide_flag;
> > +           }
> > +   }
> > +
> >     if (ioc->wait_for_port_enable_to_complete) {
> >             if (diag_buffer_enable != 0)
> >                     mpt2sas_enable_diag_buffer(ioc, diag_buffer_enable);
> > diff -aurp mpt2sas-phase8.0/mpt2sas_base.h mpt2sas-
> > phase8.0_wd/mpt2sas_base.h
> > --- mpt2sas-phase8.0/mpt2sas_base.h 2011-01-18 11:33:45.711139872
> +0530
> > +++ mpt2sas-phase8.0_wd/mpt2sas_base.h      2011-01-27 20:57:45.016000126
> > +0530
> > @@ -69,11 +69,11 @@
> >  #define MPT2SAS_DRIVER_NAME                "mpt2sas"
> >  #define MPT2SAS_AUTHOR     "LSI Corporation <DL-
> MPTFusionLinux@xxxxxxx>"
> >  #define MPT2SAS_DESCRIPTION        "LSI MPT Fusion SAS 2.0 Device
> Driver"
> > -#define MPT2SAS_DRIVER_VERSION             "08.100.00.00"
> > +#define MPT2SAS_DRIVER_VERSION             "08.100.00.01"
> >  #define MPT2SAS_MAJOR_VERSION              08
> >  #define MPT2SAS_MINOR_VERSION              100
> >  #define MPT2SAS_BUILD_VERSION              00
> > -#define MPT2SAS_RELEASE_VERSION            00
> > +#define MPT2SAS_RELEASE_VERSION            01
> >
> >  /*
> >   * Set MPT2SAS_SG_DEPTH value based on user input.
> > @@ -169,6 +169,16 @@
> >  #define MPT2SAS_INTEL_RMS2LL040_SSDID          0x350F
> >
> >  /*
> > + *  WarpDrive Specific Log codes
> > + */
> > +
> > +#define MPT2_WARPDRIVE_LOGENTRY            (0x8002)
> > +#define MPT2_WARPDRIVE_LC_SSDT             (0x41)
> > +#define MPT2_WARPDRIVE_LC_SSDLW            (0x43)
> > +#define MPT2_WARPDRIVE_LC_SSDLF            (0x44)
> > +#define MPT2_WARPDRIVE_LC_BRMF             (0x4D)
> > +
> > +/*
> >   * per target private data
> >   */
> >  #define MPT_TARGET_FLAGS_RAID_COMPONENT    0x01
> > @@ -179,6 +189,7 @@
> >   * struct MPT2SAS_TARGET - starget private hostdata
> >   * @starget: starget object
> >   * @sas_address: target sas address
> > + * @raid_device: raid_device pointer to access volume data
> >   * @handle: device handle
> >   * @num_luns: number luns
> >   * @flags: MPT_TARGET_FLAGS_XXX flags
> > @@ -188,6 +199,7 @@
> >  struct MPT2SAS_TARGET {
> >     struct scsi_target *starget;
> >     u64     sas_address;
> > +   struct _raid_device *raid_device;
> >     u16     handle;
> >     int     num_luns;
> >     u32     flags;
> > @@ -195,6 +207,7 @@ struct MPT2SAS_TARGET {
> >     u8      tm_busy;
> >  };
> >
> > +
> >  /*
> >   * per device private data
> >   */
> > @@ -242,6 +255,12 @@ typedef struct _MPI2_CONFIG_PAGE_MAN_10
> >    MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_10,
> >    Mpi2ManufacturingPage10_t, MPI2_POINTER
> pMpi2ManufacturingPage10_t;
> >
> > +#define MFG_PAGE10_HIDE_SSDS_MASK  (0x00000003)
> > +#define MFG_PAGE10_HIDE_ALL_DISKS  (0x00)
> > +#define MFG_PAGE10_EXPOSE_ALL_DISKS        (0x01)
> > +#define MFG_PAGE10_HIDE_IF_VOL_PRESENT     (0x02)
> > +
> > +
> >  struct MPT2SAS_DEVICE {
> >     struct MPT2SAS_TARGET *sas_target;
> >     unsigned int    lun;
> > @@ -321,6 +340,7 @@ struct _sas_device {
> >   * @sdev: scsi device struct (volumes are single lun)
> >   * @wwid: unique identifier for the volume
> >   * @handle: device handle
> > + * @block_size: Block size of the volume
> >   * @id: target id
> >   * @channel: target channel
> >   * @volume_type: the raid level
> > @@ -328,20 +348,33 @@ struct _sas_device {
> >   * @num_pds: number of hidden raid components
> >   * @responding: used in _scsih_raid_device_mark_responding
> >   * @percent_complete: resync percent complete
> > + * @direct_io_enabled: Whether direct io to PDs are allowed or not
> > + * @stripe_exponent: X where 2powX is the stripe sz in blocks
> > + * @max_lba: Maximum number of LBA in the volume
> > + * @stripe_sz: Stripe Size of the volume
> > + * @device_info: Device info of the volume member disk
> > + * @pd_handle: Array of handles of the physical drives for direct
> I/O
> > in le16
> >   */
> > +#define MPT_MAX_WARPDRIVE_PDS              8
> >  struct _raid_device {
> >     struct list_head list;
> >     struct scsi_target *starget;
> >     struct scsi_device *sdev;
> >     u64     wwid;
> >     u16     handle;
> > +   u16     block_sz;
> >     int     id;
> >     int     channel;
> >     u8      volume_type;
> > -   u32     device_info;
> >     u8      num_pds;
> >     u8      responding;
> >     u8      percent_complete;
> > +   u8      direct_io_enabled;
> > +   u8      stripe_exponent;
> > +   u64     max_lba;
> > +   u32     stripe_sz;
> > +   u32     device_info;
> > +   u16     pd_handle[MPT_MAX_WARPDRIVE_PDS];
> >  };
> >
> >  /**
> > @@ -450,6 +483,7 @@ struct chain_tracker {
> >   * @smid: system message id
> >   * @scmd: scsi request pointer
> >   * @cb_idx: callback index
> > + * @direct_io: To indicate whether I/O is direct (WARPDRIVE)
> >   * @chain_list: list of chains associated to this IO
> >   * @tracker_list: list of free request (ioc->free_list)
> >   */
> > @@ -457,14 +491,14 @@ struct scsiio_tracker {
> >     u16     smid;
> >     struct scsi_cmnd *scmd;
> >     u8      cb_idx;
> > +   u8      direct_io;
> >     struct list_head chain_list;
> >     struct list_head tracker_list;
> >  };
> >
> >  /**
> > - * struct request_tracker - misc mf request tracker
> > + * struct request_tracker - firmware request tracker
> >   * @smid: system message id
> > - * @scmd: scsi request pointer
> >   * @cb_idx: callback index
> >   * @tracker_list: list of free request (ioc->free_list)
> >   */
> > @@ -812,6 +846,11 @@ struct MPT2SAS_ADAPTER {
> >     u32             diagnostic_flags[MPI2_DIAG_BUF_TYPE_COUNT];
> >     u32             ring_buffer_offset;
> >     u32             ring_buffer_sz;
> > +   u8              is_warpdrive;
> > +   u8              hide_ir_msg;
> > +   u8              mfg_pg10_hide_flag;
> > +   u8              hide_drives;
> > +
> >  };
> >
> >  typedef u8 (*MPT_CALLBACK)(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8
> > msix_index,
> > diff -aurp mpt2sas-phase8.0/mpt2sas_ctl.c mpt2sas-
> > phase8.0_wd/mpt2sas_ctl.c
> > --- mpt2sas-phase8.0/mpt2sas_ctl.c  2011-01-18 11:30:28.453140352
> +0530
> > +++ mpt2sas-phase8.0_wd/mpt2sas_ctl.c       2011-01-27 20:48:35.096000040
> > +0530
> > @@ -1034,7 +1034,10 @@ _ctl_getiocinfo(void __user *arg)
> >         __func__));
> >
> >     memset(&karg, 0 , sizeof(karg));
> > -   karg.adapter_type = MPT2_IOCTL_INTERFACE_SAS2;
> > +   if (ioc->is_warpdrive)
> > +           karg.adapter_type = MPT2_IOCTL_INTERFACE_SAS2_SSS6200;
> > +   else
> > +           karg.adapter_type = MPT2_IOCTL_INTERFACE_SAS2;
> >     if (ioc->pfacts)
> >             karg.port_number = ioc->pfacts[0].PortNumber;
> >     pci_read_config_byte(ioc->pdev, PCI_CLASS_REVISION, &revision);
> > diff -aurp mpt2sas-phase8.0/mpt2sas_ctl.h mpt2sas-
> > phase8.0_wd/mpt2sas_ctl.h
> > --- mpt2sas-phase8.0/mpt2sas_ctl.h  2011-01-18 11:30:28.450141059
> +0530
> > +++ mpt2sas-phase8.0_wd/mpt2sas_ctl.h       2011-01-19 12:13:47.568012329
> > +0530
> > @@ -133,6 +133,7 @@ struct mpt2_ioctl_pci_info {
> >  #define MPT2_IOCTL_INTERFACE_FC_IP (0x02)
> >  #define MPT2_IOCTL_INTERFACE_SAS   (0x03)
> >  #define MPT2_IOCTL_INTERFACE_SAS2  (0x04)
> > +#define MPT2_IOCTL_INTERFACE_SAS2_SSS6200  (0x05)
> >  #define MPT2_IOCTL_VERSION_LENGTH  (32)
> >
> >  /**
> > diff -aurp mpt2sas-phase8.0/mpt2sas_scsih.c mpt2sas-
> > phase8.0_wd/mpt2sas_scsih.c
> > --- mpt2sas-phase8.0/mpt2sas_scsih.c        2011-01-18 11:33:43.225202675
> > +0530
> > +++ mpt2sas-phase8.0_wd/mpt2sas_scsih.c     2011-02-03 15:42:45.974149344
> > +0530
> > @@ -233,6 +233,9 @@ static struct pci_device_id scsih_pci_ta
> >             PCI_ANY_ID, PCI_ANY_ID },
> >     { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2308_3,
> >             PCI_ANY_ID, PCI_ANY_ID },
> > +   /* SSS6200 */
> > +   { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SSS6200,
> > +           PCI_ANY_ID, PCI_ANY_ID },
> >     {0}     /* Terminating entry */
> >  };
> >  MODULE_DEVICE_TABLE(pci, scsih_pci_table);
> > @@ -1256,6 +1259,7 @@ _scsih_target_alloc(struct scsi_target *
> >                     sas_target_priv_data->handle = raid_device->handle;
> >                     sas_target_priv_data->sas_address = raid_device-
> > >wwid;
> >                     sas_target_priv_data->flags |=
> > MPT_TARGET_FLAGS_VOLUME;
> > +                   sas_target_priv_data->raid_device = raid_device;
> >                     raid_device->starget = starget;
> >             }
> >             spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
> > @@ -1455,7 +1459,10 @@ static int
> >  _scsih_is_raid(struct device *dev)
> >  {
> >     struct scsi_device *sdev = to_scsi_device(dev);
> > +   struct MPT2SAS_ADAPTER *ioc = shost_priv(sdev->host);
> >
> > +   if (ioc->is_warpdrive)
> > +           return 0;
> >     return (sdev->channel == RAID_CHANNEL) ? 1 : 0;
> >  }
> >
> > @@ -1480,7 +1487,7 @@ _scsih_get_resync(struct device *dev)
> >         sdev->channel);
> >     spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
> >
> > -   if (!raid_device)
> > +   if (!raid_device || ioc->is_warpdrive)
> >             goto out;
> >
> >     if (mpt2sas_config_get_raid_volume_pg0(ioc, &mpi_reply, &vol_pg0,
> > @@ -1640,6 +1647,212 @@ _scsih_get_volume_capabilities(struct MP
> >
> >     kfree(vol_pg0);
> >  }
> > +/**
> > + * _scsih_disable_ddio - Disable direct I/O for all the volumes
> > + * @ioc: per adapter object
> > + */
> > +static void
> > +_scsih_disable_ddio(struct MPT2SAS_ADAPTER *ioc)
> > +{
> > +   Mpi2RaidVolPage1_t vol_pg1;
> > +   Mpi2ConfigReply_t mpi_reply;
> > +   struct _raid_device *raid_device;
> > +   u16 handle;
> > +   u16 ioc_status;
> > +
> > +   handle = 0xFFFF;
> > +   while (!(mpt2sas_config_get_raid_volume_pg1(ioc, &mpi_reply,
> > +       &vol_pg1, MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE,
> > handle))) {
> > +           ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
> > +               MPI2_IOCSTATUS_MASK;
> > +           if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)
> > +                   break;
> > +           handle = le16_to_cpu(vol_pg1.DevHandle);
> > +           raid_device = _scsih_raid_device_find_by_handle(ioc,
> > handle);
> > +           if (raid_device)
> > +                   raid_device->direct_io_enabled = 0;
> > +   }
> > +   return;
> > +}
> > +
> > +
> > +/**
> > + * _scsih_get_num_volumes - Get number of volumes in the ioc
> > + * @ioc: per adapter object
> > + */
> > +static u8
> > +_scsih_get_num_volumes(struct MPT2SAS_ADAPTER *ioc)
> > +{
> > +   Mpi2RaidVolPage1_t vol_pg1;
> > +   Mpi2ConfigReply_t mpi_reply;
> > +   u16 handle;
> > +   u8 vol_cnt = 0;
> > +   u16 ioc_status;
> > +
> > +   handle = 0xFFFF;
> > +   while (!(mpt2sas_config_get_raid_volume_pg1(ioc, &mpi_reply,
> > +       &vol_pg1, MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE,
> > handle))) {
> > +           ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
> > +               MPI2_IOCSTATUS_MASK;
> > +           if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)
> > +                   break;
> > +           vol_cnt++;
> > +           handle = le16_to_cpu(vol_pg1.DevHandle);
> > +   }
> > +   return vol_cnt;
> > +}
> > +
> > +
> > +/**
> > + * _scsih_init_warpdrive_properties - Set properties for warpdrive
> > direct I/O.
> > + * @ioc: per adapter object
> > + * @raid_device: the raid_device object
> > + */
> > +static void
> > +_scsih_init_warpdrive_properties(struct MPT2SAS_ADAPTER *ioc,
> > +   struct _raid_device *raid_device)
> > +{
> > +   Mpi2RaidVolPage0_t *vol_pg0;
> > +   Mpi2RaidPhysDiskPage0_t pd_pg0;
> > +   Mpi2ConfigReply_t mpi_reply;
> > +   u16 sz;
> > +   u8 num_pds, count;
> > +   u64 mb = 1024 * 1024;
> > +   u64 tb_2 = 2 * mb * mb;
> > +   u64 capacity;
> > +   u32 stripe_sz;
> > +   u8 i, stripe_exp;
> > +
> > +   if (!ioc->is_warpdrive)
> > +           return;
> > +
> > +   if (ioc->mfg_pg10_hide_flag ==  MFG_PAGE10_EXPOSE_ALL_DISKS) {
> > +           printk(MPT2SAS_INFO_FMT "WarpDrive : Direct IO is disabled
> > "
> > +               "globally as drives are exposed\n", ioc->name);
> > +           return;
> > +   }
> > +   if (_scsih_get_num_volumes(ioc) > 1) {
> > +           _scsih_disable_ddio(ioc);
> > +           printk(MPT2SAS_INFO_FMT "WarpDrive : Direct IO is disabled
> > "
> > +               "globally as number of drives > 1\n", ioc->name);
> > +           return;
> > +   }
> > +   if ((mpt2sas_config_get_number_pds(ioc, raid_device->handle,
> > +       &num_pds)) || !num_pds) {
> > +           printk(MPT2SAS_INFO_FMT "WarpDrive : Direct IO is disabled
> > "
> > +               "Failure in computing number of drives\n", ioc->name);
> > +           return;
> > +   }
> > +
> > +   sz = offsetof(Mpi2RaidVolPage0_t, PhysDisk) + (num_pds *
> > +       sizeof(Mpi2RaidVol0PhysDisk_t));
> > +   vol_pg0 = kzalloc(sz, GFP_KERNEL);
> > +   if (!vol_pg0) {
> > +           printk(MPT2SAS_INFO_FMT "WarpDrive : Direct IO is disabled
> > "
> > +               "Memory allocation failure for RVPG0\n", ioc->name);
> > +           return;
> > +   }
> > +
> > +   if ((mpt2sas_config_get_raid_volume_pg0(ioc, &mpi_reply, vol_pg0,
> > +        MPI2_RAID_VOLUME_PGAD_FORM_HANDLE, raid_device->handle,
> > sz))) {
> > +           printk(MPT2SAS_INFO_FMT "WarpDrive : Direct IO is disabled
> > "
> > +               "Failure in retrieving RVPG0\n", ioc->name);
> > +           kfree(vol_pg0);
> > +           return;
> > +   }
> > +
> > +   /*
> > +    * WARPDRIVE:If number of physical disks in a volume exceeds the
> > max pds
> > +    * assumed for WARPDRIVE, disable direct I/O
> > +    */
> > +   if (num_pds > MPT_MAX_WARPDRIVE_PDS) {
> > +           printk(MPT2SAS_WARN_FMT "WarpDrive : Direct IO is disabled
> > "
> > +               "for the drive with handle(0x%04x): num_mem=%d, "
> > +               "max_mem_allowed=%d\n", ioc->name, raid_device->handle,
> > +               num_pds, MPT_MAX_WARPDRIVE_PDS);
> > +           kfree(vol_pg0);
> > +           return;
> > +   }
> > +   for (count = 0; count < num_pds; count++) {
> > +           if (mpt2sas_config_get_phys_disk_pg0(ioc, &mpi_reply,
> > +               &pd_pg0, MPI2_PHYSDISK_PGAD_FORM_PHYSDISKNUM,
> > +               vol_pg0->PhysDisk[count].PhysDiskNum) ||
> > +               pd_pg0.DevHandle == MPT2SAS_INVALID_DEVICE_HANDLE) {
> > +                   printk(MPT2SAS_INFO_FMT "WarpDrive : Direct IO is "
> > +                       "disabled for the drive with handle(0x%04x)
> > member"
> > +                       "handle retrieval failed for member number=%d\n",
> > +                       ioc->name, raid_device->handle,
> > +                       vol_pg0->PhysDisk[count].PhysDiskNum);
> > +                   goto out_error;
> > +           }
> > +           raid_device->pd_handle[count] =
> > le16_to_cpu(pd_pg0.DevHandle);
> > +   }
> > +
> > +   /*
> > +    * Assumption for WD: Direct I/O is not supported if the volume
> > is
> > +    * not RAID0, if the stripe size is not 64KB, if the block size
> > is
> > +    * not 512 and if the volume size is >2TB
> > +    */
> > +   if (raid_device->volume_type != MPI2_RAID_VOL_TYPE_RAID0 ||
> > +       le16_to_cpu(vol_pg0->BlockSize) != 512) {
> > +           printk(MPT2SAS_INFO_FMT "WarpDrive : Direct IO is disabled
> > "
> > +               "for the drive with handle(0x%04x): type=%d, "
> > +               "s_sz=%uK, blk_size=%u\n", ioc->name,
> > +               raid_device->handle, raid_device->volume_type,
> > +               le32_to_cpu(vol_pg0->StripeSize)/2,
> > +               le16_to_cpu(vol_pg0->BlockSize));
> > +           goto out_error;
> > +   }
> > +
> > +   capacity = (u64) le16_to_cpu(vol_pg0->BlockSize) *
> > +       (le64_to_cpu(vol_pg0->MaxLBA) + 1);
> > +
> > +   if (capacity > tb_2) {
> > +           printk(MPT2SAS_INFO_FMT "WarpDrive : Direct IO is disabled
> > "
> > +           "for the drive with handle(0x%04x) since drive sz > 2TB\n",
> > +           ioc->name, raid_device->handle);
> > +           goto out_error;
> > +   }
> > +
> > +   stripe_sz = le32_to_cpu(vol_pg0->StripeSize);
> > +   stripe_exp = 0;
> > +   for (i = 0; i < 32; i++) {
> > +           if (stripe_sz & 1)
> > +                   break;
> > +           stripe_exp++;
> > +           stripe_sz >>= 1;
> > +   }
> > +   if (i == 32) {
> > +           printk(MPT2SAS_INFO_FMT "WarpDrive : Direct IO is disabled
> > "
> > +               "for the drive with handle(0x%04x) invalid stripe sz
> > %uK\n",
> > +               ioc->name, raid_device->handle,
> > +               le32_to_cpu(vol_pg0->StripeSize)/2);
> > +           goto out_error;
> > +   }
> > +   raid_device->stripe_exponent = stripe_exp;
> > +   raid_device->direct_io_enabled = 1;
> > +
> > +   printk(MPT2SAS_INFO_FMT "WarpDrive : Direct IO is Enabled for the
> > drive"
> > +       " with handle(0x%04x)\n", ioc->name, raid_device->handle);
> > +   /*
> > +    * WARPDRIVE: Though the following fields are not used for direct
> > IO,
> > +    * stored for future purpose:
> > +    */
> > +   raid_device->max_lba = le64_to_cpu(vol_pg0->MaxLBA);
> > +   raid_device->stripe_sz = le32_to_cpu(vol_pg0->StripeSize);
> > +   raid_device->block_sz = le16_to_cpu(vol_pg0->BlockSize);
> > +
> > +
> > +   kfree(vol_pg0);
> > +   return;
> > +
> > +out_error:
> > +   raid_device->direct_io_enabled = 0;
> > +   for (count = 0; count < num_pds; count++)
> > +           raid_device->pd_handle[count] = 0;
> > +   kfree(vol_pg0);
> > +   return;
> > +}
> >
> >  /**
> >   * _scsih_enable_tlr - setting TLR flags
> > @@ -1710,6 +1923,11 @@ _scsih_slave_configure(struct scsi_devic
> >
> >             _scsih_get_volume_capabilities(ioc, raid_device);
> >
> > +           /*
> > +            * WARPDRIVE: Initialize the required data for Direct IO
> > +            */
> > +           _scsih_init_warpdrive_properties(ioc, raid_device);
> > +
> >             /* RAID Queue Depth Support
> >              * IS volume = underlying qdepth of drive type, either
> >              *    MPT2SAS_SAS_QUEUE_DEPTH or MPT2SAS_SATA_QUEUE_DEPTH
> > @@ -1757,14 +1975,16 @@ _scsih_slave_configure(struct scsi_devic
> >                     break;
> >             }
> >
> > -           sdev_printk(KERN_INFO, sdev, "%s: "
> > -               "handle(0x%04x), wwid(0x%016llx), pd_count(%d),
> > type(%s)\n",
> > -               r_level, raid_device->handle,
> > -               (unsigned long long)raid_device->wwid,
> > -               raid_device->num_pds, ds);
> > +           if (!ioc->hide_ir_msg)
> > +                   sdev_printk(KERN_INFO, sdev, "%s: handle(0x%04x), "
> > +                       "wwid(0x%016llx), pd_count(%d), type(%s)\n",
> > +                       r_level, raid_device->handle,
> > +                       (unsigned long long)raid_device->wwid,
> > +                       raid_device->num_pds, ds);
> >             _scsih_change_queue_depth(sdev, qdepth,
> > SCSI_QDEPTH_DEFAULT);
> >             /* raid transport support */
> > -           _scsih_set_level(sdev, raid_device);
> > +           if (!ioc->is_warpdrive)
> > +                   _scsih_set_level(sdev, raid_device);
> >             return 0;
> >     }
> >
> > @@ -2182,16 +2402,20 @@ _scsih_tm_display_info(struct MPT2SAS_AD
> >     struct MPT2SAS_TARGET *priv_target = starget->hostdata;
> >     struct _sas_device *sas_device = NULL;
> >     unsigned long flags;
> > +   char *device_str = NULL;
> >
> >     if (!priv_target)
> >             return;
> > +   if (ioc->hide_ir_msg)
> > +           device_str = "WarpDrive";
> > +   else
> > +           device_str = "volume";
> >
> >     scsi_print_command(scmd);
> >     if (priv_target->flags & MPT_TARGET_FLAGS_VOLUME) {
> > -           starget_printk(KERN_INFO, starget, "volume handle(0x%04x),
> > "
> > -               "volume wwid(0x%016llx)\n",
> > -               priv_target->handle,
> > -               (unsigned long long)priv_target->sas_address);
> > +           starget_printk(KERN_INFO, starget, "%s handle(0x%04x), "
> > +               "%s wwid(0x%016llx)\n", device_str, priv_target-
> > >handle,
> > +               device_str, (unsigned long long)priv_target-
> > >sas_address);
> >     } else {
> >             spin_lock_irqsave(&ioc->sas_device_lock, flags);
> >             sas_device =
> > mpt2sas_scsih_sas_device_find_by_sas_address(ioc,
> > @@ -3130,6 +3354,9 @@ _scsih_check_ir_config_unhide_events(str
> >     a = 0;
> >     b = 0;
> >
> > +   if (ioc->is_warpdrive)
> > +           return;
> > +
> >     /* Volume Resets for Deleted or Removed */
> >     element = (Mpi2EventIrConfigElement_t *)&event_data-
> > >ConfigElement[0];
> >     for (i = 0; i < event_data->NumElements; i++, element++) {
> > @@ -3347,6 +3574,105 @@ _scsih_eedp_error_handling(struct scsi_c
> >  }
> >
> >  /**
> > + * _scsih_scsi_direct_io_get - returns direct io flag
> > + * @ioc: per adapter object
> > + * @smid: system request message index
> > + *
> > + * Returns the smid stored scmd pointer.
> > + */
> > +static inline u8
> > +_scsih_scsi_direct_io_get(struct MPT2SAS_ADAPTER *ioc, u16 smid)
> > +{
> > +   return ioc->scsi_lookup[smid - 1].direct_io;
> > +}
> > +
> > +/**
> > + * _scsih_scsi_direct_io_set - sets direct io flag
> > + * @ioc: per adapter object
> > + * @smid: system request message index
> > + * @direct_io: Zero or non-zero value to set in the direct_io flag
> > + *
> > + * Returns Nothing.
> > + */
> > +static inline void
> > +_scsih_scsi_direct_io_set(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8
> > direct_io)
> > +{
> > +   ioc->scsi_lookup[smid - 1].direct_io = direct_io;
> > +}
> > +
> > +
> > +/**
> > + * _scsih_setup_direct_io - setup MPI request for WARPDRIVE Direct
> I/O
> > + * @ioc: per adapter object
> > + * @scmd: pointer to scsi command object
> > + * @raid_device: pointer to raid device data structure
> > + * @mpi_request: pointer to the SCSI_IO reqest message frame
> > + * @smid: system request message index
> > + *
> > + * Returns nothing
> > + */
> > +static void
> > +_scsih_setup_direct_io(struct MPT2SAS_ADAPTER *ioc, struct scsi_cmnd
> > *scmd,
> > +   struct _raid_device *raid_device, Mpi2SCSIIORequest_t
> > *mpi_request,
> > +   u16 smid)
> > +{
> > +   u32 v_lba, p_lba, stripe_off, stripe_unit, column, io_size;
> > +   u32 stripe_sz, stripe_exp;
> > +   u8 num_pds, *cdb_ptr, *tmp_ptr, *lba_ptr1, *lba_ptr2;
> > +   u8 cdb0 = scmd->cmnd[0];
> > +
> > +   /*
> > +    * Try Direct I/O to RAID memeber disks
> > +    */
> > +   if (cdb0 == READ_16 || cdb0 == READ_10 ||
> > +       cdb0 == WRITE_16 || cdb0 == WRITE_10) {
> > +           cdb_ptr = mpi_request->CDB.CDB32;
> > +
> > +           if ((cdb0 < READ_16) || !(cdb_ptr[2] | cdb_ptr[3] |
> > cdb_ptr[4]
> > +                   | cdb_ptr[5])) {
> > +                   io_size = scsi_bufflen(scmd) >> 9;
> > +                   /* get virtual lba */
> > +                   lba_ptr1 = lba_ptr2 = (cdb0 < READ_16) ? &cdb_ptr[2]
> > :
> > +                       &cdb_ptr[6];
> > +                   tmp_ptr = (u8 *)&v_lba + 3;
> > +                   *tmp_ptr-- = *lba_ptr1++;
> > +                   *tmp_ptr-- = *lba_ptr1++;
> > +                   *tmp_ptr-- = *lba_ptr1++;
> > +                   *tmp_ptr = *lba_ptr1;
> > +
> > +                   if (((u64)v_lba + (u64)io_size - 1) <=
> > +                       (u32)raid_device->max_lba) {
> > +                           stripe_sz = raid_device->stripe_sz;
> > +                           stripe_exp = raid_device->stripe_exponent;
> > +                           stripe_off = v_lba & (stripe_sz - 1);
> > +
> > +                           /* Check whether IO falls within a stripe */
> > +                           if ((stripe_off + io_size) <= stripe_sz) {
> > +                                   num_pds = raid_device->num_pds;
> > +                                   p_lba = v_lba >> stripe_exp;
> > +                                   stripe_unit = p_lba / num_pds;
> > +                                   column = p_lba % num_pds;
> > +                                   p_lba = (stripe_unit << stripe_exp) +
> > +                                       stripe_off;
> > +                                   mpi_request->DevHandle =
> > +                                           cpu_to_le16(raid_device->
> > +                                               pd_handle[column]);
> > +                                   tmp_ptr = (u8 *)&p_lba + 3;
> > +                                   *lba_ptr2++ = *tmp_ptr--;
> > +                                   *lba_ptr2++ = *tmp_ptr--;
> > +                                   *lba_ptr2++ = *tmp_ptr--;
> > +                                   *lba_ptr2 = *tmp_ptr;
> > +                                   /*
> > +                                   * WD: To indicate this I/O is directI/O
> > +                                   */
> > +                                   _scsih_scsi_direct_io_set(ioc, smid, 1);
> > +                           }
> > +                   }
> > +           }
> > +   }
> > +}
> > +
> > +/**
> >   * _scsih_qcmd - main scsi request entry point
> >   * @scmd: pointer to scsi command object
> >   * @done: function pointer to be invoked on completion
> > @@ -3363,6 +3689,7 @@ _scsih_qcmd_lck(struct scsi_cmnd *scmd,
> >     struct MPT2SAS_ADAPTER *ioc = shost_priv(scmd->device->host);
> >     struct MPT2SAS_DEVICE *sas_device_priv_data;
> >     struct MPT2SAS_TARGET *sas_target_priv_data;
> > +   struct _raid_device *raid_device;
> >     Mpi2SCSIIORequest_t *mpi_request;
> >     u32 mpi_control;
> >     u16 smid;
> > @@ -3424,8 +3751,10 @@ _scsih_qcmd_lck(struct scsi_cmnd *scmd,
> >
> >     } else
> >             mpi_control |= MPI2_SCSIIO_CONTROL_SIMPLEQ;
> > -   /* Make sure Device is not raid volume */
> > -   if (!_scsih_is_raid(&scmd->device->sdev_gendev) &&
> > +   /* Make sure Device is not raid volume.
> > +    * We do not expose raid functionality to upper layer for
> > warpdrive.
> > +    */
> > +   if (!ioc->is_warpdrive && _scsih_is_raid(&scmd->device-
> > >sdev_gendev) &&
> >         sas_is_tlr_enabled(scmd->device) && scmd->cmd_len != 32)
> >             mpi_control |= MPI2_SCSIIO_CONTROL_TLR_ON;
> >
> > @@ -3473,9 +3802,14 @@ _scsih_qcmd_lck(struct scsi_cmnd *scmd,
> >             }
> >     }
> >
> > +   raid_device = sas_target_priv_data->raid_device;
> > +   if (raid_device && raid_device->direct_io_enabled)
> > +           _scsih_setup_direct_io(ioc, scmd, raid_device, mpi_request,
> > +               smid);
> > +
> >     if (likely(mpi_request->Function ==
> > MPI2_FUNCTION_SCSI_IO_REQUEST))
> >             mpt2sas_base_put_smid_scsi_io(ioc, smid,
> > -               sas_device_priv_data->sas_target->handle);
> > +               le16_to_cpu(mpi_request->DevHandle));
> >     else
> >             mpt2sas_base_put_smid_default(ioc, smid);
> >     return 0;
> > @@ -3540,10 +3874,16 @@ _scsih_scsi_ioc_info(struct MPT2SAS_ADAP
> >     unsigned long flags;
> >     struct scsi_target *starget = scmd->device->sdev_target;
> >     struct MPT2SAS_TARGET *priv_target = starget->hostdata;
> > +   char *device_str = NULL;
> >
> >     if (!priv_target)
> >             return;
> >
> > +   if (ioc->hide_ir_msg)
> > +           device_str = "WarpDrive";
> > +   else
> > +           device_str = "volume";
> > +
> >     if (log_info == 0x31170000)
> >             return;
> >
> > @@ -3660,8 +4000,8 @@ _scsih_scsi_ioc_info(struct MPT2SAS_ADAP
> >     scsi_print_command(scmd);
> >
> >     if (priv_target->flags & MPT_TARGET_FLAGS_VOLUME) {
> > -           printk(MPT2SAS_WARN_FMT "\tvolume wwid(0x%016llx)\n", ioc-
> > >name,
> > -               (unsigned long long)priv_target->sas_address);
> > +           printk(MPT2SAS_WARN_FMT "\t%s wwid(0x%016llx)\n", ioc-
> > >name,
> > +               device_str, (unsigned long long)priv_target-
> > >sas_address);
> >     } else {
> >             spin_lock_irqsave(&ioc->sas_device_lock, flags);
> >             sas_device =
> > mpt2sas_scsih_sas_device_find_by_sas_address(ioc,
> > @@ -3840,6 +4180,20 @@ _scsih_io_done(struct MPT2SAS_ADAPTER *i
> >             scmd->result = DID_NO_CONNECT << 16;
> >             goto out;
> >     }
> > +   /*
> > +    * WARPDRIVE: If direct_io is set then it is directIO,
> > +    * the failed direct I/O should be redirected to volume
> > +    */
> > +   if (_scsih_scsi_direct_io_get(ioc, smid)) {
> > +           _scsih_scsi_direct_io_set(ioc, smid, 0);
> > +           memcpy(mpi_request->CDB.CDB32, scmd->cmnd, scmd->cmd_len);
> > +           mpi_request->DevHandle =
> > +               cpu_to_le16(sas_device_priv_data->sas_target->handle);
> > +           mpt2sas_base_put_smid_scsi_io(ioc, smid,
> > +               sas_device_priv_data->sas_target->handle);
> > +           return 0;
> > +   }
> > +
> >
> >     /* turning off TLR */
> >     scsi_state = mpi_reply->SCSIState;
> > @@ -3848,7 +4202,10 @@ _scsih_io_done(struct MPT2SAS_ADAPTER *i
> >                 le32_to_cpu(mpi_reply->ResponseInfo) & 0xFF;
> >     if (!sas_device_priv_data->tlr_snoop_check) {
> >             sas_device_priv_data->tlr_snoop_check++;
> > -   if (!_scsih_is_raid(&scmd->device->sdev_gendev) &&
> > +   /* Make sure Device is not raid volume.
> > +    * We do not expose raid functionality to upper layer for
> > warpdrive.
> > +    */
> > +   if (!ioc->is_warpdrive && !_scsih_is_raid(&scmd->device-
> > >sdev_gendev) &&
> >             sas_is_tlr_enabled(scmd->device) &&
> >                 response_code == MPI2_SCSITASKMGMT_RSP_INVALID_FRAME) {
> >                     sas_disable_tlr(scmd->device);
> > @@ -4681,8 +5038,10 @@ _scsih_remove_device(struct MPT2SAS_ADAP
> >
> >     _scsih_ublock_io_device(ioc, sas_device_backup.handle);
> >
> > -   mpt2sas_transport_port_remove(ioc, sas_device_backup.sas_address,
> > -       sas_device_backup.sas_address_parent);
> > +   if (!ioc->hide_drives)
> > +           mpt2sas_transport_port_remove(ioc,
> > +               sas_device_backup.sas_address,
> > +               sas_device_backup.sas_address_parent);
> >
> >     printk(MPT2SAS_INFO_FMT "removing handle(0x%04x), sas_addr"
> >         "(0x%016llx)\n", ioc->name, sas_device_backup.handle,
> > @@ -5413,6 +5772,7 @@ _scsih_sas_pd_hide(struct MPT2SAS_ADAPTE
> >         &sas_device->volume_wwid);
> >     set_bit(handle, ioc->pd_handles);
> >     _scsih_reprobe_target(sas_device->starget, 1);
> > +
> >  }
> >
> >  /**
> > @@ -5591,7 +5951,8 @@ _scsih_sas_ir_config_change_event(struct
> >     Mpi2EventDataIrConfigChangeList_t *event_data = fw_event-
> > >event_data;
> >
> >  #ifdef CONFIG_SCSI_MPT2SAS_LOGGING
> > -   if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
> > +   if ((ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
> > +       && !ioc->hide_ir_msg)
> >             _scsih_sas_ir_config_change_event_debug(ioc, event_data);
> >
> >  #endif
> > @@ -5614,16 +5975,20 @@ _scsih_sas_ir_config_change_event(struct
> >                                 le16_to_cpu(element->VolDevHandle));
> >                     break;
> >             case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED:
> > -                   _scsih_sas_pd_hide(ioc, element);
> > +                   if (!ioc->is_warpdrive)
> > +                           _scsih_sas_pd_hide(ioc, element);
> >                     break;
> >             case MPI2_EVENT_IR_CHANGE_RC_PD_DELETED:
> > -                   _scsih_sas_pd_expose(ioc, element);
> > +                   if (!ioc->is_warpdrive)
> > +                           _scsih_sas_pd_expose(ioc, element);
> >                     break;
> >             case MPI2_EVENT_IR_CHANGE_RC_HIDE:
> > -                   _scsih_sas_pd_add(ioc, element);
> > +                   if (!ioc->is_warpdrive)
> > +                           _scsih_sas_pd_add(ioc, element);
> >                     break;
> >             case MPI2_EVENT_IR_CHANGE_RC_UNHIDE:
> > -                   _scsih_sas_pd_delete(ioc, element);
> > +                   if (!ioc->is_warpdrive)
> > +                           _scsih_sas_pd_delete(ioc, element);
> >                     break;
> >             }
> >     }
> > @@ -5654,9 +6019,10 @@ _scsih_sas_ir_volume_event(struct MPT2SA
> >
> >     handle = le16_to_cpu(event_data->VolDevHandle);
> >     state = le32_to_cpu(event_data->NewValue);
> > -   dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: handle(0x%04x), "
> > -       "old(0x%08x), new(0x%08x)\n", ioc->name, __func__,  handle,
> > -       le32_to_cpu(event_data->PreviousValue), state));
> > +   if (!ioc->hide_ir_msg)
> > +           dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "%s:
> > handle(0x%04x), "
> > +               "old(0x%08x), new(0x%08x)\n", ioc->name, __func__,
> > handle,
> > +               le32_to_cpu(event_data->PreviousValue), state));
> >
> >     switch (state) {
> >     case MPI2_RAID_VOL_STATE_MISSING:
> > @@ -5736,9 +6102,10 @@ _scsih_sas_ir_physical_disk_event(struct
> >     handle = le16_to_cpu(event_data->PhysDiskDevHandle);
> >     state = le32_to_cpu(event_data->NewValue);
> >
> > -   dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: handle(0x%04x), "
> > -       "old(0x%08x), new(0x%08x)\n", ioc->name, __func__,  handle,
> > -       le32_to_cpu(event_data->PreviousValue), state));
> > +   if (!ioc->hide_ir_msg)
> > +           dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "%s:
> > handle(0x%04x), "
> > +               "old(0x%08x), new(0x%08x)\n", ioc->name, __func__,
> > handle,
> > +               le32_to_cpu(event_data->PreviousValue), state));
> >
> >     switch (state) {
> >     case MPI2_RAID_PD_STATE_ONLINE:
> > @@ -5747,7 +6114,8 @@ _scsih_sas_ir_physical_disk_event(struct
> >     case MPI2_RAID_PD_STATE_OPTIMAL:
> >     case MPI2_RAID_PD_STATE_HOT_SPARE:
> >
> > -           set_bit(handle, ioc->pd_handles);
> > +           if (!ioc->is_warpdrive)
> > +                   set_bit(handle, ioc->pd_handles);
> >
> >             spin_lock_irqsave(&ioc->sas_device_lock, flags);
> >             sas_device = _scsih_sas_device_find_by_handle(ioc, handle);
> > @@ -5851,7 +6219,8 @@ _scsih_sas_ir_operation_status_event(str
> >     u16 handle;
> >
> >  #ifdef CONFIG_SCSI_MPT2SAS_LOGGING
> > -   if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
> > +   if ((ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
> > +       && !ioc->hide_ir_msg)
> >             _scsih_sas_ir_operation_status_event_debug(ioc,
> >                  event_data);
> >  #endif
> > @@ -5910,7 +6279,7 @@ static void
> >  _scsih_mark_responding_sas_device(struct MPT2SAS_ADAPTER *ioc, u64
> > sas_address,
> >      u16 slot, u16 handle)
> >  {
> > -   struct MPT2SAS_TARGET *sas_target_priv_data;
> > +   struct MPT2SAS_TARGET *sas_target_priv_data = NULL;
> >     struct scsi_target *starget;
> >     struct _sas_device *sas_device;
> >     unsigned long flags;
> > @@ -5918,7 +6287,7 @@ _scsih_mark_responding_sas_device(struct
> >     spin_lock_irqsave(&ioc->sas_device_lock, flags);
> >     list_for_each_entry(sas_device, &ioc->sas_device_list, list) {
> >             if (sas_device->sas_address == sas_address &&
> > -               sas_device->slot == slot && sas_device->starget) {
> > +               sas_device->slot == slot) {
> >                     sas_device->responding = 1;
> >                     starget = sas_device->starget;
> >                     if (starget && starget->hostdata) {
> > @@ -5927,13 +6296,15 @@ _scsih_mark_responding_sas_device(struct
> >                             sas_target_priv_data->deleted = 0;
> >                     } else
> >                             sas_target_priv_data = NULL;
> > -                   starget_printk(KERN_INFO, sas_device->starget,
> > -                       "handle(0x%04x), sas_addr(0x%016llx), enclosure "
> > -                       "logical id(0x%016llx), slot(%d)\n", handle,
> > -                       (unsigned long long)sas_device->sas_address,
> > -                       (unsigned long long)
> > -                       sas_device->enclosure_logical_id,
> > -                       sas_device->slot);
> > +                   if (starget)
> > +                           starget_printk(KERN_INFO, starget,
> > +                               "handle(0x%04x), sas_addr(0x%016llx), "
> > +                               "enclosure logical id(0x%016llx), "
> > +                               "slot(%d)\n", handle,
> > +                               (unsigned long long)sas_device-
> > >sas_address,
> > +                               (unsigned long long)
> > +                               sas_device->enclosure_logical_id,
> > +                               sas_device->slot);
> >                     if (sas_device->handle == handle)
> >                             goto out;
> >                     printk(KERN_INFO "\thandle changed
> > from(0x%04x)!!!\n",
> > @@ -6025,6 +6396,12 @@ _scsih_mark_responding_raid_device(struc
> >                     starget_printk(KERN_INFO, raid_device->starget,
> >                         "handle(0x%04x), wwid(0x%016llx)\n", handle,
> >                         (unsigned long long)raid_device->wwid);
> > +                   /*
> > +                    * WARPDRIVE: The handles of the PDs might have
> > changed
> > +                    * across the host reset so re-initialize the
> > +                    * required data for Direct IO
> > +                    */
> > +                   _scsih_init_warpdrive_properties(ioc, raid_device);
> >                     if (raid_device->handle == handle)
> >                             goto out;
> >                     printk(KERN_INFO "\thandle changed
> > from(0x%04x)!!!\n",
> > @@ -6086,18 +6463,20 @@ _scsih_search_responding_raid_devices(st
> >     }
> >
> >     /* refresh the pd_handles */
> > -   phys_disk_num = 0xFF;
> > -   memset(ioc->pd_handles, 0, ioc->pd_handles_sz);
> > -   while (!(mpt2sas_config_get_phys_disk_pg0(ioc, &mpi_reply,
> > -       &pd_pg0, MPI2_PHYSDISK_PGAD_FORM_GET_NEXT_PHYSDISKNUM,
> > -       phys_disk_num))) {
> > -           ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
> > -               MPI2_IOCSTATUS_MASK;
> > -           if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)
> > -                   break;
> > -           phys_disk_num = pd_pg0.PhysDiskNum;
> > -           handle = le16_to_cpu(pd_pg0.DevHandle);
> > -           set_bit(handle, ioc->pd_handles);
> > +   if (!ioc->is_warpdrive) {
> > +           phys_disk_num = 0xFF;
> > +           memset(ioc->pd_handles, 0, ioc->pd_handles_sz);
> > +           while (!(mpt2sas_config_get_phys_disk_pg0(ioc, &mpi_reply,
> > +               &pd_pg0, MPI2_PHYSDISK_PGAD_FORM_GET_NEXT_PHYSDISKNUM,
> > +               phys_disk_num))) {
> > +                   ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
> > +                       MPI2_IOCSTATUS_MASK;
> > +                   if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)
> > +                           break;
> > +                   phys_disk_num = pd_pg0.PhysDiskNum;
> > +                   handle = le16_to_cpu(pd_pg0.DevHandle);
> > +                   set_bit(handle, ioc->pd_handles);
> > +           }
> >     }
> >  }
> >
> > @@ -6243,6 +6622,50 @@ _scsih_remove_unresponding_sas_devices(s
> >  }
> >
> >  /**
> > + * _scsih_hide_unhide_sas_devices - add/remove device to/from OS
> > + * @ioc: per adapter object
> > + *
> > + * Return nothing.
> > + */
> > +static void
> > +_scsih_hide_unhide_sas_devices(struct MPT2SAS_ADAPTER *ioc)
> > +{
> > +   struct _sas_device *sas_device, *sas_device_next;
> > +
> > +   if (!ioc->is_warpdrive || ioc->mfg_pg10_hide_flag !=
> > +       MFG_PAGE10_HIDE_IF_VOL_PRESENT)
> > +           return;
> > +
> > +   if (ioc->hide_drives) {
> > +           if (_scsih_get_num_volumes(ioc))
> > +                   return;
> > +           ioc->hide_drives = 0;
> > +           list_for_each_entry_safe(sas_device, sas_device_next,
> > +               &ioc->sas_device_list, list) {
> > +                   if (!mpt2sas_transport_port_add(ioc, sas_device-
> > >handle,
> > +                           sas_device->sas_address_parent)) {
> > +                           _scsih_sas_device_remove(ioc, sas_device);
> > +                   } else if (!sas_device->starget) {
> > +                           mpt2sas_transport_port_remove(ioc,
> > +                               sas_device->sas_address,
> > +                               sas_device->sas_address_parent);
> > +                           _scsih_sas_device_remove(ioc, sas_device);
> > +                   }
> > +           }
> > +   } else {
> > +           if (!_scsih_get_num_volumes(ioc))
> > +                   return;
> > +           ioc->hide_drives = 1;
> > +           list_for_each_entry_safe(sas_device, sas_device_next,
> > +               &ioc->sas_device_list, list) {
> > +                   mpt2sas_transport_port_remove(ioc,
> > +                       sas_device->sas_address,
> > +                       sas_device->sas_address_parent);
> > +           }
> > +   }
> > +}
> > +
> > +/**
> >   * mpt2sas_scsih_reset_handler - reset callback handler (for scsih)
> >   * @ioc: per adapter object
> >   * @reset_phase: phase
> > @@ -6326,6 +6749,7 @@ _firmware_event_work(struct work_struct
> >                     spin_unlock_irqrestore(&ioc-
> > >ioc_reset_in_progress_lock,
> >                         flags);
> >             _scsih_remove_unresponding_sas_devices(ioc);
> > +           _scsih_hide_unhide_sas_devices(ioc);
> >             return;
> >     }
> >
> > @@ -6425,6 +6849,53 @@ mpt2sas_scsih_event_callback(struct MPT2
> >                 (Mpi2EventDataIrVolume_t *)
> >                 mpi_reply->EventData);
> >             break;
> > +   case MPI2_EVENT_LOG_ENTRY_ADDED:
> > +   {
> > +           Mpi2EventDataLogEntryAdded_t *log_entry;
> > +           u32 *log_code;
> > +
> > +           if (!ioc->is_warpdrive)
> > +                   break;
> > +
> > +           log_entry = (Mpi2EventDataLogEntryAdded_t *)
> > +               mpi_reply->EventData;
> > +           log_code = (u32 *)log_entry->LogData;
> > +
> > +           if (le16_to_cpu(log_entry->LogEntryQualifier)
> > +               != MPT2_WARPDRIVE_LOGENTRY)
> > +                   break;
> > +
> > +           switch (le32_to_cpu(*log_code)) {
> > +           case MPT2_WARPDRIVE_LC_SSDT:
> > +                   printk(MPT2SAS_WARN_FMT "WarpDrive Warning: "
> > +                       "IO Throttling has occurred in the WarpDrive "
> > +                       "subsystem. Check WarpDrive documentation for "
> > +                       "additional details.\n", ioc->name);
> > +                   break;
> > +           case MPT2_WARPDRIVE_LC_SSDLW:
> > +                   printk(MPT2SAS_WARN_FMT "WarpDrive Warning: "
> > +                       "Program/Erase Cycles for the WarpDrive subsystem
> > "
> > +                       "in degraded range. Check WarpDrive documentation
> > "
> > +                       "for additional details.\n", ioc->name);
> > +                   break;
> > +           case MPT2_WARPDRIVE_LC_SSDLF:
> > +                   printk(MPT2SAS_ERR_FMT "WarpDrive Fatal Error: "
> > +                       "There are no Program/Erase Cycles for the "
> > +                       "WarpDrive subsystem. The storage device will be
> > "
> > +                       "in read-only mode. Check WarpDrive documentation
> > "
> > +                       "for additional details.\n", ioc->name);
> > +                   break;
> > +           case MPT2_WARPDRIVE_LC_BRMF:
> > +                   printk(MPT2SAS_ERR_FMT "WarpDrive Fatal Error: "
> > +                       "The Backup Rail Monitor has failed on the "
> > +                       "WarpDrive subsystem. Check WarpDrive "
> > +                       "documentation for additional details.\n",
> > +                       ioc->name);
> > +                   break;
> > +           }
> > +
> > +           break;
> > +   }
> >     case MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE:
> >     case MPI2_EVENT_IR_OPERATION_STATUS:
> >     case MPI2_EVENT_SAS_DISCOVERY:
> > @@ -6583,7 +7054,8 @@ _scsih_ir_shutdown(struct MPT2SAS_ADAPTE
> >     mpi_request->Function = MPI2_FUNCTION_RAID_ACTION;
> >     mpi_request->Action = MPI2_RAID_ACTION_SYSTEM_SHUTDOWN_INITIATED;
> >
> > -   printk(MPT2SAS_INFO_FMT "IR shutdown (sending)\n", ioc->name);
> > +   if (!ioc->hide_ir_msg)
> > +           printk(MPT2SAS_INFO_FMT "IR shutdown (sending)\n", ioc-
> > >name);
> >     init_completion(&ioc->scsih_cmds.done);
> >     mpt2sas_base_put_smid_default(ioc, smid);
> >     wait_for_completion_timeout(&ioc->scsih_cmds.done, 10*HZ);
> > @@ -6597,10 +7069,11 @@ _scsih_ir_shutdown(struct MPT2SAS_ADAPTE
> >     if (ioc->scsih_cmds.status & MPT2_CMD_REPLY_VALID) {
> >             mpi_reply = ioc->scsih_cmds.reply;
> >
> > -           printk(MPT2SAS_INFO_FMT "IR shutdown (complete): "
> > -               "ioc_status(0x%04x), loginfo(0x%08x)\n",
> > -               ioc->name, le16_to_cpu(mpi_reply->IOCStatus),
> > -               le32_to_cpu(mpi_reply->IOCLogInfo));
> > +           if (!ioc->hide_ir_msg)
> > +                   printk(MPT2SAS_INFO_FMT "IR shutdown (complete): "
> > +                       "ioc_status(0x%04x), loginfo(0x%08x)\n",
> > +                       ioc->name, le16_to_cpu(mpi_reply->IOCStatus),
> > +                       le32_to_cpu(mpi_reply->IOCLogInfo));
> >     }
> >
> >   out:
> > @@ -6759,6 +7232,9 @@ _scsih_probe_boot_devices(struct MPT2SAS
> >             spin_lock_irqsave(&ioc->sas_device_lock, flags);
> >             list_move_tail(&sas_device->list, &ioc->sas_device_list);
> >             spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
> > +
> > +           if (ioc->hide_drives)
> > +                   return;
> >             if (!mpt2sas_transport_port_add(ioc, sas_device->handle,
> >                 sas_device->sas_address_parent)) {
> >                     _scsih_sas_device_remove(ioc, sas_device);
> > @@ -6812,6 +7288,9 @@ _scsih_probe_sas(struct MPT2SAS_ADAPTER
> >             list_move_tail(&sas_device->list, &ioc->sas_device_list);
> >             spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
> >
> > +           if (ioc->hide_drives)
> > +                   continue;
> > +
> >             if (!mpt2sas_transport_port_add(ioc, sas_device->handle,
> >                 sas_device->sas_address_parent)) {
> >                     _scsih_sas_device_remove(ioc, sas_device);
> > @@ -6882,6 +7361,11 @@ _scsih_probe(struct pci_dev *pdev, const
> >     ioc->id = mpt_ids++;
> >     sprintf(ioc->name, "%s%d", MPT2SAS_DRIVER_NAME, ioc->id);
> >     ioc->pdev = pdev;
> > +   if (id->device == MPI2_MFGPAGE_DEVID_SSS6200) {
> > +           ioc->is_warpdrive = 1;
> > +           ioc->hide_ir_msg = 1;
> > +   } else
> > +           ioc->mfg_pg10_hide_flag = MFG_PAGE10_EXPOSE_ALL_DISKS;
> >     ioc->scsi_io_cb_idx = scsi_io_cb_idx;
> >     ioc->tm_cb_idx = tm_cb_idx;
> >     ioc->ctl_cb_idx = ctl_cb_idx;
> > @@ -6947,6 +7431,20 @@ _scsih_probe(struct pci_dev *pdev, const
> >     }
> >
> >     ioc->wait_for_port_enable_to_complete = 0;
> > +   if (ioc->is_warpdrive) {
> > +           if (ioc->mfg_pg10_hide_flag ==
> > MFG_PAGE10_EXPOSE_ALL_DISKS)
> > +                   ioc->hide_drives = 0;
> > +           else if (ioc->mfg_pg10_hide_flag ==
> > MFG_PAGE10_HIDE_ALL_DISKS)
> > +                   ioc->hide_drives = 1;
> > +           else {
> > +                   if (_scsih_get_num_volumes(ioc))
> > +                           ioc->hide_drives = 1;
> > +                   else
> > +                           ioc->hide_drives = 0;
> > +           }
> > +   } else
> > +           ioc->hide_drives = 0;
> > +
> >     _scsih_probe_devices(ioc);
> >     return 0;
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-scsi"
> > in
> > the body of a message to majordomo@xxxxxxxxxxxxxxx
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux