Allow expander table-to-table attachments for expanders that support it. Signed-off-by: Luben Tuikov ---  drivers/scsi/libsas/sas_expander.c |   20 ++++++++++++++------  include/scsi/libsas.h              |    3 +++  include/scsi/sas.h                 |   14 ++++++++++++--  3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c index f84084b..e8d0115 100644 --- a/drivers/scsi/libsas/sas_expander.c +++ b/drivers/scsi/libsas/sas_expander.c @@ -329,6 +329,7 @@ static void ex_assign_report_general(struct domain_device *dev,      dev->ex_dev.ex_change_count = be16_to_cpu(rg->change_count);      dev->ex_dev.max_route_indexes = be16_to_cpu(rg->route_indexes);      dev->ex_dev.num_phys = min(rg->num_phys, (u8)MAX_EXPANDER_PHYS); +    dev->ex_dev.t2t_supp = rg->t2t_supp;      dev->ex_dev.conf_route_table = rg->conf_route_table;      dev->ex_dev.configuring = rg->configuring;      memcpy(dev->ex_dev.enclosure_logical_id, rg->enclosure_logical_id, 8); @@ -1133,15 +1134,17 @@ static void sas_print_parent_topology_bug(struct domain_device *child,      };      struct domain_device *parent = child->parent;   -    sas_printk("%s ex %016llx phy 0x%x <--> %s ex %016llx phy 0x%x " -           "has %c:%c routing link!\n", +    sas_printk("%s ex %016llx (T2T supp:%d) phy 0x%x <--> %s ex %016llx " +           "(T2T supp:%d) phy 0x%x has %c:%c routing link!\n",               ex_type[parent->dev_type],             SAS_ADDR(parent->sas_addr), +           parent->ex_dev.t2t_supp,             parent_phy->phy_id,               ex_type[child->dev_type],             SAS_ADDR(child->sas_addr), +           child->ex_dev.t2t_supp,             child_phy->phy_id,               ra_char[parent_phy->routing_attr], @@ -1238,10 +1241,15 @@ static int sas_check_parent_topology(struct domain_device *child)                      sas_print_parent_topology_bug(child, parent_phy, child_phy);                      res = -ENODEV;                  } -            } else if (parent_phy->routing_attr == TABLE_ROUTING && -                   child_phy->routing_attr != SUBTRACTIVE_ROUTING) { -                sas_print_parent_topology_bug(child, parent_phy, child_phy); -                res = -ENODEV; +            } else if (parent_phy->routing_attr == TABLE_ROUTING) { +                if (child_phy->routing_attr == SUBTRACTIVE_ROUTING || +                    (child_phy->routing_attr == TABLE_ROUTING && +                     child_ex->t2t_supp && parent_ex->t2t_supp)) { +                    /* All good */; +                } else { +                    sas_print_parent_topology_bug(child, parent_phy, child_phy); +                    res = -ENODEV; +                }              }              break;          case FANOUT_DEV: diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index ee86606..793f80b 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -142,8 +142,11 @@ struct expander_device {      u16    ex_change_count;      u16    max_route_indexes;      u8     num_phys; + +    u8     t2t_supp:1;      u8     configuring:1;      u8     conf_route_table:1; +      u8     enclosure_logical_id[8];        struct ex_phy *ex_phy; diff --git a/include/scsi/sas.h b/include/scsi/sas.h index e9fd022..f59f182 100644 --- a/include/scsi/sas.h +++ b/include/scsi/sas.h @@ -341,7 +341,12 @@ struct report_general_resp {        u8      conf_route_table:1;      u8      configuring:1; -    u8      _r_b:6; +    u8    config_others:1; +    u8    orej_retry_supp:1; +    u8    stp_cont_awt:1; +    u8    self_config:1; +    u8    zone_config:1; +    u8    t2t_supp:1;        u8      _r_c;   @@ -528,7 +533,12 @@ struct report_general_resp {      u8      _r_a;      u8      num_phys;   -    u8      _r_b:6; +    u8    t2t_supp:1; +    u8    zone_config:1; +    u8    self_config:1; +    u8    stp_cont_awt:1; +    u8    orej_retry_supp:1; +    u8    config_others:1;      u8      configuring:1;      u8      conf_route_table:1;   -- 1.7.2.2.165.gbc382