mpii support for sas3.5 controllers

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

mpii support for sas3.5 controllers

Jonathan Matthew-4
This adds support for SAS3.5 controllers in mpii(4).

To get these working, I had to rearrange the initialisation code a bit.
The new controllers don't like being hard reset, which means we have to call
mpii_iocfacts() to determine whether soft reset is supported before calling
mpii_init().

The changes look pretty innocuous but could break older controllers (though
this is how the linux driver works), so it'd help if people could test those.
I found a SAS3008 (Dell HBA330) on my desk and that still works.

These controllers also support nvme devices, but that will have to remain
unimplemented for now.


Index: mpiireg.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/mpiireg.h,v
retrieving revision 1.12
diff -u -p -u -p -r1.12 mpiireg.h
--- mpiireg.h 16 Jan 2017 18:09:35 -0000 1.12
+++ mpiireg.h 16 Jun 2018 21:55:19 -0000
@@ -524,6 +524,7 @@ struct mpii_msg_portfacts_reply {
 #define MPII_PORTFACTS_PORTTYPE_ISCSI (0x20)
 #define MPII_PORTFACTS_PORTTYPE_SAS_PHYSICAL (0x30)
 #define MPII_PORTFACTS_PORTTYPE_SAS_VIRTUAL (0x31)
+#define MPII_PORTFACTS_PORTTYPE_TRI_MODE (0x40)
  u_int16_t reserved6;
 
  u_int16_t max_posted_cmd_buffers;
Index: mpii.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/mpii.c,v
retrieving revision 1.113
diff -u -p -u -p -r1.113 mpii.c
--- mpii.c 12 Dec 2017 11:18:32 -0000 1.113
+++ mpii.c 16 Jun 2018 21:55:20 -0000
@@ -431,7 +431,13 @@ static const struct pci_matchid mpii_dev
  { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3108_1 },
  { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3108_2 },
  { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3108_3 },
- { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3108_4 }
+ { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3108_4 },
+ { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3408 },
+ { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3416 },
+ { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3508 },
+ { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3508_1 },
+ { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3516 },
+ { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3516_1 }
 };
 
 int
@@ -492,13 +498,13 @@ mpii_attach(struct device *parent, struc
  }
  printf(": %s\n", pci_intr_string(sc->sc_pc, ih));
 
- if (mpii_init(sc) != 0) {
- printf("%s: unable to initialize ioc\n", DEVNAME(sc));
+ if (mpii_iocfacts(sc) != 0) {
+ printf("%s: unable to get iocfacts\n", DEVNAME(sc));
  goto unmap;
  }
 
- if (mpii_iocfacts(sc) != 0) {
- printf("%s: unable to get iocfacts\n", DEVNAME(sc));
+ if (mpii_init(sc) != 0) {
+ printf("%s: unable to initialize ioc\n", DEVNAME(sc));
  goto unmap;
  }
 
@@ -556,7 +562,8 @@ mpii_attach(struct device *parent, struc
 
  /* XXX bail on unsupported porttype? */
  if ((sc->sc_porttype == MPII_PORTFACTS_PORTTYPE_SAS_PHYSICAL) ||
-    (sc->sc_porttype == MPII_PORTFACTS_PORTTYPE_SAS_VIRTUAL)) {
+    (sc->sc_porttype == MPII_PORTFACTS_PORTTYPE_SAS_VIRTUAL) ||
+    (sc->sc_porttype == MPII_PORTFACTS_PORTTYPE_TRI_MODE)) {
  if (mpii_eventnotify(sc) != 0) {
  printf("%s: unable to enable events\n", DEVNAME(sc));
  goto free_queues;
@@ -876,7 +883,8 @@ mpii_scsi_probe(struct scsi_link *link)
  int flags;
 
  if ((sc->sc_porttype != MPII_PORTFACTS_PORTTYPE_SAS_PHYSICAL) &&
-    (sc->sc_porttype != MPII_PORTFACTS_PORTTYPE_SAS_VIRTUAL))
+    (sc->sc_porttype != MPII_PORTFACTS_PORTTYPE_SAS_VIRTUAL) &&
+    (sc->sc_porttype != MPII_PORTFACTS_PORTTYPE_TRI_MODE))
  return (ENXIO);
 
  dev = sc->sc_devs[link->target];
@@ -1261,12 +1269,16 @@ mpii_iocfacts(struct mpii_softc *sc)
  if (ISSET(lemtoh32(&ifp.ioc_capabilities),
     MPII_IOCFACTS_CAPABILITY_INTEGRATED_RAID))
  SET(sc->sc_flags, MPII_F_RAID);
+ if (ISSET(lemtoh32(&ifp.ioc_capabilities),
+    MPII_IOCFACTS_CAPABILITY_EVENT_REPLAY))
+ sc->sc_ioc_event_replay = 1;
 
  sc->sc_max_cmds = MIN(lemtoh16(&ifp.request_credit),
     MPII_REQUEST_CREDIT);
 
- /* SAS3 controllers have different sgl layouts */
- if (ifp.msg_version_maj == 2 && ifp.msg_version_min == 5)
+ /* SAS3 and 3.5 controllers have different sgl layouts */
+ if (ifp.msg_version_maj == 2 && ((ifp.msg_version_min == 5)
+    || (ifp.msg_version_min == 6)))
  SET(sc->sc_flags, MPII_F_SAS3);
 
  /*

Reply | Threaded
Open this post in threaded view
|

Re: mpii support for sas3.5 controllers

Robert Nagy
Hi

Obviously I am ok with this since it makes my controller work ;)

mpii0 at pci6 dev 0 function 0 "Symbios Logic MegaRAID SAS3408" rev 0x01: msi
scsibus3 at mpii0: 640 targets
st0 at scsibus3 targ 5 lun 0: <IBM, ULTRIUM-HH6, H991> SCSI4 1/sequential removable naa.5000e111c457f001
ch0 at scsibus3 targ 5 lun 1: <BDT, FlexStor II, 5.30> SCSI3 8/changer removable t10.BDT_FlexStor_II_00DE64104018_LL0
ses0 at scsibus3 targ 8 lun 0: <LSI, VirtualSES, 01> SCSI4 13/enclosure services fixed naa.510600b00dbc1490

On 17/06/18 08:06 +1000, Jonathan Matthew wrote:

> This adds support for SAS3.5 controllers in mpii(4).
>
> To get these working, I had to rearrange the initialisation code a bit.
> The new controllers don't like being hard reset, which means we have to call
> mpii_iocfacts() to determine whether soft reset is supported before calling
> mpii_init().
>
> The changes look pretty innocuous but could break older controllers (though
> this is how the linux driver works), so it'd help if people could test those.
> I found a SAS3008 (Dell HBA330) on my desk and that still works.
>
> These controllers also support nvme devices, but that will have to remain
> unimplemented for now.
>
>
> Index: mpiireg.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/mpiireg.h,v
> retrieving revision 1.12
> diff -u -p -u -p -r1.12 mpiireg.h
> --- mpiireg.h 16 Jan 2017 18:09:35 -0000 1.12
> +++ mpiireg.h 16 Jun 2018 21:55:19 -0000
> @@ -524,6 +524,7 @@ struct mpii_msg_portfacts_reply {
>  #define MPII_PORTFACTS_PORTTYPE_ISCSI (0x20)
>  #define MPII_PORTFACTS_PORTTYPE_SAS_PHYSICAL (0x30)
>  #define MPII_PORTFACTS_PORTTYPE_SAS_VIRTUAL (0x31)
> +#define MPII_PORTFACTS_PORTTYPE_TRI_MODE (0x40)
>   u_int16_t reserved6;
>  
>   u_int16_t max_posted_cmd_buffers;
> Index: mpii.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/mpii.c,v
> retrieving revision 1.113
> diff -u -p -u -p -r1.113 mpii.c
> --- mpii.c 12 Dec 2017 11:18:32 -0000 1.113
> +++ mpii.c 16 Jun 2018 21:55:20 -0000
> @@ -431,7 +431,13 @@ static const struct pci_matchid mpii_dev
>   { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3108_1 },
>   { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3108_2 },
>   { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3108_3 },
> - { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3108_4 }
> + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3108_4 },
> + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3408 },
> + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3416 },
> + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3508 },
> + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3508_1 },
> + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3516 },
> + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3516_1 }
>  };
>  
>  int
> @@ -492,13 +498,13 @@ mpii_attach(struct device *parent, struc
>   }
>   printf(": %s\n", pci_intr_string(sc->sc_pc, ih));
>  
> - if (mpii_init(sc) != 0) {
> - printf("%s: unable to initialize ioc\n", DEVNAME(sc));
> + if (mpii_iocfacts(sc) != 0) {
> + printf("%s: unable to get iocfacts\n", DEVNAME(sc));
>   goto unmap;
>   }
>  
> - if (mpii_iocfacts(sc) != 0) {
> - printf("%s: unable to get iocfacts\n", DEVNAME(sc));
> + if (mpii_init(sc) != 0) {
> + printf("%s: unable to initialize ioc\n", DEVNAME(sc));
>   goto unmap;
>   }
>  
> @@ -556,7 +562,8 @@ mpii_attach(struct device *parent, struc
>  
>   /* XXX bail on unsupported porttype? */
>   if ((sc->sc_porttype == MPII_PORTFACTS_PORTTYPE_SAS_PHYSICAL) ||
> -    (sc->sc_porttype == MPII_PORTFACTS_PORTTYPE_SAS_VIRTUAL)) {
> +    (sc->sc_porttype == MPII_PORTFACTS_PORTTYPE_SAS_VIRTUAL) ||
> +    (sc->sc_porttype == MPII_PORTFACTS_PORTTYPE_TRI_MODE)) {
>   if (mpii_eventnotify(sc) != 0) {
>   printf("%s: unable to enable events\n", DEVNAME(sc));
>   goto free_queues;
> @@ -876,7 +883,8 @@ mpii_scsi_probe(struct scsi_link *link)
>   int flags;
>  
>   if ((sc->sc_porttype != MPII_PORTFACTS_PORTTYPE_SAS_PHYSICAL) &&
> -    (sc->sc_porttype != MPII_PORTFACTS_PORTTYPE_SAS_VIRTUAL))
> +    (sc->sc_porttype != MPII_PORTFACTS_PORTTYPE_SAS_VIRTUAL) &&
> +    (sc->sc_porttype != MPII_PORTFACTS_PORTTYPE_TRI_MODE))
>   return (ENXIO);
>  
>   dev = sc->sc_devs[link->target];
> @@ -1261,12 +1269,16 @@ mpii_iocfacts(struct mpii_softc *sc)
>   if (ISSET(lemtoh32(&ifp.ioc_capabilities),
>      MPII_IOCFACTS_CAPABILITY_INTEGRATED_RAID))
>   SET(sc->sc_flags, MPII_F_RAID);
> + if (ISSET(lemtoh32(&ifp.ioc_capabilities),
> +    MPII_IOCFACTS_CAPABILITY_EVENT_REPLAY))
> + sc->sc_ioc_event_replay = 1;
>  
>   sc->sc_max_cmds = MIN(lemtoh16(&ifp.request_credit),
>      MPII_REQUEST_CREDIT);
>  
> - /* SAS3 controllers have different sgl layouts */
> - if (ifp.msg_version_maj == 2 && ifp.msg_version_min == 5)
> + /* SAS3 and 3.5 controllers have different sgl layouts */
> + if (ifp.msg_version_maj == 2 && ((ifp.msg_version_min == 5)
> +    || (ifp.msg_version_min == 6)))
>   SET(sc->sc_flags, MPII_F_SAS3);
>  
>   /*
>

Reply | Threaded
Open this post in threaded view
|

Re: mpii support for sas3.5 controllers

David Gwynne-5
works on sparc64 with a sas2008 too:

mpii0 at pci3 dev 0 function 0 "Symbios Logic SAS2008" rev 0x03: msi
mpii0: Intel(R) SSD 910, firmware 12.0.0.0, MPI 2.0
scsibus1 at mpii0: 512 targets

ok by me.

> On 18 Jun 2018, at 01:01, Robert Nagy <[hidden email]> wrote:
>
> Hi
>
> Obviously I am ok with this since it makes my controller work ;)
>
> mpii0 at pci6 dev 0 function 0 "Symbios Logic MegaRAID SAS3408" rev 0x01: msi
> scsibus3 at mpii0: 640 targets
> st0 at scsibus3 targ 5 lun 0: <IBM, ULTRIUM-HH6, H991> SCSI4 1/sequential removable naa.5000e111c457f001
> ch0 at scsibus3 targ 5 lun 1: <BDT, FlexStor II, 5.30> SCSI3 8/changer removable t10.BDT_FlexStor_II_00DE64104018_LL0
> ses0 at scsibus3 targ 8 lun 0: <LSI, VirtualSES, 01> SCSI4 13/enclosure services fixed naa.510600b00dbc1490
>
> On 17/06/18 08:06 +1000, Jonathan Matthew wrote:
>> This adds support for SAS3.5 controllers in mpii(4).
>>
>> To get these working, I had to rearrange the initialisation code a bit.
>> The new controllers don't like being hard reset, which means we have to call
>> mpii_iocfacts() to determine whether soft reset is supported before calling
>> mpii_init().
>>
>> The changes look pretty innocuous but could break older controllers (though
>> this is how the linux driver works), so it'd help if people could test those.
>> I found a SAS3008 (Dell HBA330) on my desk and that still works.
>>
>> These controllers also support nvme devices, but that will have to remain
>> unimplemented for now.
>>
>>
>> Index: mpiireg.h
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/pci/mpiireg.h,v
>> retrieving revision 1.12
>> diff -u -p -u -p -r1.12 mpiireg.h
>> --- mpiireg.h 16 Jan 2017 18:09:35 -0000 1.12
>> +++ mpiireg.h 16 Jun 2018 21:55:19 -0000
>> @@ -524,6 +524,7 @@ struct mpii_msg_portfacts_reply {
>> #define MPII_PORTFACTS_PORTTYPE_ISCSI (0x20)
>> #define MPII_PORTFACTS_PORTTYPE_SAS_PHYSICAL (0x30)
>> #define MPII_PORTFACTS_PORTTYPE_SAS_VIRTUAL (0x31)
>> +#define MPII_PORTFACTS_PORTTYPE_TRI_MODE (0x40)
>> u_int16_t reserved6;
>>
>> u_int16_t max_posted_cmd_buffers;
>> Index: mpii.c
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/pci/mpii.c,v
>> retrieving revision 1.113
>> diff -u -p -u -p -r1.113 mpii.c
>> --- mpii.c 12 Dec 2017 11:18:32 -0000 1.113
>> +++ mpii.c 16 Jun 2018 21:55:20 -0000
>> @@ -431,7 +431,13 @@ static const struct pci_matchid mpii_dev
>> { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3108_1 },
>> { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3108_2 },
>> { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3108_3 },
>> - { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3108_4 }
>> + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3108_4 },
>> + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3408 },
>> + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3416 },
>> + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3508 },
>> + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3508_1 },
>> + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3516 },
>> + { PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS3516_1 }
>> };
>>
>> int
>> @@ -492,13 +498,13 @@ mpii_attach(struct device *parent, struc
>> }
>> printf(": %s\n", pci_intr_string(sc->sc_pc, ih));
>>
>> - if (mpii_init(sc) != 0) {
>> - printf("%s: unable to initialize ioc\n", DEVNAME(sc));
>> + if (mpii_iocfacts(sc) != 0) {
>> + printf("%s: unable to get iocfacts\n", DEVNAME(sc));
>> goto unmap;
>> }
>>
>> - if (mpii_iocfacts(sc) != 0) {
>> - printf("%s: unable to get iocfacts\n", DEVNAME(sc));
>> + if (mpii_init(sc) != 0) {
>> + printf("%s: unable to initialize ioc\n", DEVNAME(sc));
>> goto unmap;
>> }
>>
>> @@ -556,7 +562,8 @@ mpii_attach(struct device *parent, struc
>>
>> /* XXX bail on unsupported porttype? */
>> if ((sc->sc_porttype == MPII_PORTFACTS_PORTTYPE_SAS_PHYSICAL) ||
>> -    (sc->sc_porttype == MPII_PORTFACTS_PORTTYPE_SAS_VIRTUAL)) {
>> +    (sc->sc_porttype == MPII_PORTFACTS_PORTTYPE_SAS_VIRTUAL) ||
>> +    (sc->sc_porttype == MPII_PORTFACTS_PORTTYPE_TRI_MODE)) {
>> if (mpii_eventnotify(sc) != 0) {
>> printf("%s: unable to enable events\n", DEVNAME(sc));
>> goto free_queues;
>> @@ -876,7 +883,8 @@ mpii_scsi_probe(struct scsi_link *link)
>> int flags;
>>
>> if ((sc->sc_porttype != MPII_PORTFACTS_PORTTYPE_SAS_PHYSICAL) &&
>> -    (sc->sc_porttype != MPII_PORTFACTS_PORTTYPE_SAS_VIRTUAL))
>> +    (sc->sc_porttype != MPII_PORTFACTS_PORTTYPE_SAS_VIRTUAL) &&
>> +    (sc->sc_porttype != MPII_PORTFACTS_PORTTYPE_TRI_MODE))
>> return (ENXIO);
>>
>> dev = sc->sc_devs[link->target];
>> @@ -1261,12 +1269,16 @@ mpii_iocfacts(struct mpii_softc *sc)
>> if (ISSET(lemtoh32(&ifp.ioc_capabilities),
>>    MPII_IOCFACTS_CAPABILITY_INTEGRATED_RAID))
>> SET(sc->sc_flags, MPII_F_RAID);
>> + if (ISSET(lemtoh32(&ifp.ioc_capabilities),
>> +    MPII_IOCFACTS_CAPABILITY_EVENT_REPLAY))
>> + sc->sc_ioc_event_replay = 1;
>>
>> sc->sc_max_cmds = MIN(lemtoh16(&ifp.request_credit),
>>    MPII_REQUEST_CREDIT);
>>
>> - /* SAS3 controllers have different sgl layouts */
>> - if (ifp.msg_version_maj == 2 && ifp.msg_version_min == 5)
>> + /* SAS3 and 3.5 controllers have different sgl layouts */
>> + if (ifp.msg_version_maj == 2 && ((ifp.msg_version_min == 5)
>> +    || (ifp.msg_version_min == 6)))
>> SET(sc->sc_flags, MPII_F_SAS3);
>>
>> /*
>>
>