diff options
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_def.h | 20 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gbl.h | 1 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gs.c | 72 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_init.c | 11 |
4 files changed, 103 insertions, 1 deletions
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 7f9f86b8140b..02c7480c99c3 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
@@ -1652,8 +1652,14 @@ typedef struct { | |||
1652 | uint8_t port_name[WWN_SIZE]; | 1652 | uint8_t port_name[WWN_SIZE]; |
1653 | uint8_t fabric_port_name[WWN_SIZE]; | 1653 | uint8_t fabric_port_name[WWN_SIZE]; |
1654 | uint16_t fp_speed; | 1654 | uint16_t fp_speed; |
1655 | uint8_t fc4_type; | ||
1655 | } sw_info_t; | 1656 | } sw_info_t; |
1656 | 1657 | ||
1658 | /* FCP-4 types */ | ||
1659 | #define FC4_TYPE_FCP_SCSI 0x08 | ||
1660 | #define FC4_TYPE_OTHER 0x0 | ||
1661 | #define FC4_TYPE_UNKNOWN 0xff | ||
1662 | |||
1657 | /* | 1663 | /* |
1658 | * Fibre channel port type. | 1664 | * Fibre channel port type. |
1659 | */ | 1665 | */ |
@@ -1697,6 +1703,7 @@ typedef struct fc_port { | |||
1697 | u32 supported_classes; | 1703 | u32 supported_classes; |
1698 | 1704 | ||
1699 | uint16_t vp_idx; | 1705 | uint16_t vp_idx; |
1706 | uint8_t fc4_type; | ||
1700 | } fc_port_t; | 1707 | } fc_port_t; |
1701 | 1708 | ||
1702 | /* | 1709 | /* |
@@ -1779,6 +1786,9 @@ typedef struct fc_port { | |||
1779 | #define GPSC_REQ_SIZE (16 + 8) | 1786 | #define GPSC_REQ_SIZE (16 + 8) |
1780 | #define GPSC_RSP_SIZE (16 + 2 + 2) | 1787 | #define GPSC_RSP_SIZE (16 + 2 + 2) |
1781 | 1788 | ||
1789 | #define GFF_ID_CMD 0x011F | ||
1790 | #define GFF_ID_REQ_SIZE (16 + 4) | ||
1791 | #define GFF_ID_RSP_SIZE (16 + 128) | ||
1782 | 1792 | ||
1783 | /* | 1793 | /* |
1784 | * HBA attribute types. | 1794 | * HBA attribute types. |
@@ -1980,6 +1990,11 @@ struct ct_sns_req { | |||
1980 | struct { | 1990 | struct { |
1981 | uint8_t port_name[8]; | 1991 | uint8_t port_name[8]; |
1982 | } gpsc; | 1992 | } gpsc; |
1993 | |||
1994 | struct { | ||
1995 | uint8_t reserved; | ||
1996 | uint8_t port_name[3]; | ||
1997 | } gff_id; | ||
1983 | } req; | 1998 | } req; |
1984 | }; | 1999 | }; |
1985 | 2000 | ||
@@ -2052,6 +2067,11 @@ struct ct_sns_rsp { | |||
2052 | uint16_t speeds; | 2067 | uint16_t speeds; |
2053 | uint16_t speed; | 2068 | uint16_t speed; |
2054 | } gpsc; | 2069 | } gpsc; |
2070 | |||
2071 | #define GFF_FCP_SCSI_OFFSET 7 | ||
2072 | struct { | ||
2073 | uint8_t fc4_features[128]; | ||
2074 | } gff_id; | ||
2055 | } rsp; | 2075 | } rsp; |
2056 | }; | 2076 | }; |
2057 | 2077 | ||
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index fd299911d7d6..55f4599ade63 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h | |||
@@ -441,6 +441,7 @@ extern int qla2x00_ga_nxt(scsi_qla_host_t *, fc_port_t *); | |||
441 | extern int qla2x00_gid_pt(scsi_qla_host_t *, sw_info_t *); | 441 | extern int qla2x00_gid_pt(scsi_qla_host_t *, sw_info_t *); |
442 | extern int qla2x00_gpn_id(scsi_qla_host_t *, sw_info_t *); | 442 | extern int qla2x00_gpn_id(scsi_qla_host_t *, sw_info_t *); |
443 | extern int qla2x00_gnn_id(scsi_qla_host_t *, sw_info_t *); | 443 | extern int qla2x00_gnn_id(scsi_qla_host_t *, sw_info_t *); |
444 | extern void qla2x00_gff_id(scsi_qla_host_t *, sw_info_t *); | ||
444 | extern int qla2x00_rft_id(scsi_qla_host_t *); | 445 | extern int qla2x00_rft_id(scsi_qla_host_t *); |
445 | extern int qla2x00_rff_id(scsi_qla_host_t *); | 446 | extern int qla2x00_rff_id(scsi_qla_host_t *); |
446 | extern int qla2x00_rnn_id(scsi_qla_host_t *); | 447 | extern int qla2x00_rnn_id(scsi_qla_host_t *); |
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c index 872c55f049a5..2fabae8daec4 100644 --- a/drivers/scsi/qla2xxx/qla_gs.c +++ b/drivers/scsi/qla2xxx/qla_gs.c | |||
@@ -1913,3 +1913,75 @@ qla2x00_gpsc(scsi_qla_host_t *vha, sw_info_t *list) | |||
1913 | 1913 | ||
1914 | return (rval); | 1914 | return (rval); |
1915 | } | 1915 | } |
1916 | |||
1917 | /** | ||
1918 | * qla2x00_gff_id() - SNS Get FC-4 Features (GFF_ID) query. | ||
1919 | * | ||
1920 | * @ha: HA context | ||
1921 | * @list: switch info entries to populate | ||
1922 | * | ||
1923 | */ | ||
1924 | void | ||
1925 | qla2x00_gff_id(scsi_qla_host_t *vha, sw_info_t *list) | ||
1926 | { | ||
1927 | int rval; | ||
1928 | uint16_t i; | ||
1929 | |||
1930 | ms_iocb_entry_t *ms_pkt; | ||
1931 | struct ct_sns_req *ct_req; | ||
1932 | struct ct_sns_rsp *ct_rsp; | ||
1933 | struct qla_hw_data *ha = vha->hw; | ||
1934 | uint8_t fcp_scsi_features = 0; | ||
1935 | |||
1936 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | ||
1937 | /* Set default FC4 Type as UNKNOWN so the default is to | ||
1938 | * Process this port */ | ||
1939 | list[i].fc4_type = FC4_TYPE_UNKNOWN; | ||
1940 | |||
1941 | /* Do not attempt GFF_ID if we are not FWI_2 capable */ | ||
1942 | if (!IS_FWI2_CAPABLE(ha)) | ||
1943 | continue; | ||
1944 | |||
1945 | /* Prepare common MS IOCB */ | ||
1946 | ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GFF_ID_REQ_SIZE, | ||
1947 | GFF_ID_RSP_SIZE); | ||
1948 | |||
1949 | /* Prepare CT request */ | ||
1950 | ct_req = qla2x00_prep_ct_req(&ha->ct_sns->p.req, GFF_ID_CMD, | ||
1951 | GFF_ID_RSP_SIZE); | ||
1952 | ct_rsp = &ha->ct_sns->p.rsp; | ||
1953 | |||
1954 | /* Prepare CT arguments -- port_id */ | ||
1955 | ct_req->req.port_id.port_id[0] = list[i].d_id.b.domain; | ||
1956 | ct_req->req.port_id.port_id[1] = list[i].d_id.b.area; | ||
1957 | ct_req->req.port_id.port_id[2] = list[i].d_id.b.al_pa; | ||
1958 | |||
1959 | /* Execute MS IOCB */ | ||
1960 | rval = qla2x00_issue_iocb(vha, ha->ms_iocb, ha->ms_iocb_dma, | ||
1961 | sizeof(ms_iocb_entry_t)); | ||
1962 | |||
1963 | if (rval != QLA_SUCCESS) { | ||
1964 | DEBUG2_3(printk(KERN_INFO | ||
1965 | "scsi(%ld): GFF_ID issue IOCB failed " | ||
1966 | "(%d).\n", vha->host_no, rval)); | ||
1967 | } else if (qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp, | ||
1968 | "GPN_ID") != QLA_SUCCESS) { | ||
1969 | DEBUG2_3(printk(KERN_INFO | ||
1970 | "scsi(%ld): GFF_ID IOCB status had a " | ||
1971 | "failure status code\n", vha->host_no)); | ||
1972 | } else { | ||
1973 | fcp_scsi_features = | ||
1974 | ct_rsp->rsp.gff_id.fc4_features[GFF_FCP_SCSI_OFFSET]; | ||
1975 | fcp_scsi_features &= 0x0f; | ||
1976 | |||
1977 | if (fcp_scsi_features) | ||
1978 | list[i].fc4_type = FC4_TYPE_FCP_SCSI; | ||
1979 | else | ||
1980 | list[i].fc4_type = FC4_TYPE_OTHER; | ||
1981 | } | ||
1982 | |||
1983 | /* Last device exit. */ | ||
1984 | if (list[i].d_id.b.rsvd_1 != 0) | ||
1985 | break; | ||
1986 | } | ||
1987 | } | ||
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index cea491bf0fc0..685c350007b0 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
@@ -3078,7 +3078,6 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha) | |||
3078 | return (rval); | 3078 | return (rval); |
3079 | } | 3079 | } |
3080 | 3080 | ||
3081 | |||
3082 | /* | 3081 | /* |
3083 | * qla2x00_find_all_fabric_devs | 3082 | * qla2x00_find_all_fabric_devs |
3084 | * | 3083 | * |
@@ -3131,6 +3130,10 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha, | |||
3131 | qla2x00_gfpn_id(vha, swl) == QLA_SUCCESS) { | 3130 | qla2x00_gfpn_id(vha, swl) == QLA_SUCCESS) { |
3132 | qla2x00_gpsc(vha, swl); | 3131 | qla2x00_gpsc(vha, swl); |
3133 | } | 3132 | } |
3133 | |||
3134 | /* If other queries succeeded probe for FC-4 type */ | ||
3135 | if (swl) | ||
3136 | qla2x00_gff_id(vha, swl); | ||
3134 | } | 3137 | } |
3135 | swl_idx = 0; | 3138 | swl_idx = 0; |
3136 | 3139 | ||
@@ -3172,6 +3175,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha, | |||
3172 | memcpy(new_fcport->fabric_port_name, | 3175 | memcpy(new_fcport->fabric_port_name, |
3173 | swl[swl_idx].fabric_port_name, WWN_SIZE); | 3176 | swl[swl_idx].fabric_port_name, WWN_SIZE); |
3174 | new_fcport->fp_speed = swl[swl_idx].fp_speed; | 3177 | new_fcport->fp_speed = swl[swl_idx].fp_speed; |
3178 | new_fcport->fc4_type = swl[swl_idx].fc4_type; | ||
3175 | 3179 | ||
3176 | if (swl[swl_idx].d_id.b.rsvd_1 != 0) { | 3180 | if (swl[swl_idx].d_id.b.rsvd_1 != 0) { |
3177 | last_dev = 1; | 3181 | last_dev = 1; |
@@ -3233,6 +3237,11 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha, | |||
3233 | if ((new_fcport->d_id.b.domain & 0xf0) == 0xf0) | 3237 | if ((new_fcport->d_id.b.domain & 0xf0) == 0xf0) |
3234 | continue; | 3238 | continue; |
3235 | 3239 | ||
3240 | /* Bypass ports whose FCP-4 type is not FCP_SCSI */ | ||
3241 | if (new_fcport->fc4_type != FC4_TYPE_FCP_SCSI && | ||
3242 | new_fcport->fc4_type != FC4_TYPE_UNKNOWN) | ||
3243 | continue; | ||
3244 | |||
3236 | /* Locate matching device in database. */ | 3245 | /* Locate matching device in database. */ |
3237 | found = 0; | 3246 | found = 0; |
3238 | list_for_each_entry(fcport, &vha->vp_fcports, list) { | 3247 | list_for_each_entry(fcport, &vha->vp_fcports, list) { |