aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorJoe Carnuccio <joe.carnuccio@qlogic.com>2013-10-30 03:38:18 -0400
committerJames Bottomley <JBottomley@Parallels.com>2013-12-19 10:38:58 -0500
commitdb64e9301c067245928bfdbbd9c048cdba087927 (patch)
tree06050e3ddaf97d760073bedde26329ab684919e8 /drivers/scsi
parente8f5e95d5a7db8c8f195bc92c0ca8363223a0a9e (diff)
[SCSI] qla2xxx: Add BSG interface for read/write serdes register.
Signed-off-by: Joe Carnuccio <joe.carnuccio@qlogic.com> Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/qla2xxx/qla_bsg.c44
-rw-r--r--drivers/scsi/qla2xxx/qla_bsg.h13
-rw-r--r--drivers/scsi/qla2xxx/qla_dbg.c2
-rw-r--r--drivers/scsi/qla2xxx/qla_def.h3
-rw-r--r--drivers/scsi/qla2xxx/qla_gbl.h5
-rw-r--r--drivers/scsi/qla2xxx/qla_mbx.c69
6 files changed, 134 insertions, 2 deletions
diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index aa57bf0af574..f15d03e6b7ee 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -2022,6 +2022,46 @@ done:
2022} 2022}
2023 2023
2024static int 2024static int
2025qla26xx_serdes_op(struct fc_bsg_job *bsg_job)
2026{
2027 struct Scsi_Host *host = bsg_job->shost;
2028 scsi_qla_host_t *vha = shost_priv(host);
2029 int rval = 0;
2030 struct qla_serdes_reg sr;
2031
2032 memset(&sr, 0, sizeof(sr));
2033
2034 sg_copy_to_buffer(bsg_job->request_payload.sg_list,
2035 bsg_job->request_payload.sg_cnt, &sr, sizeof(sr));
2036
2037 switch (sr.cmd) {
2038 case INT_SC_SERDES_WRITE_REG:
2039 rval = qla2x00_write_serdes_word(vha, sr.addr, sr.val);
2040 bsg_job->reply->reply_payload_rcv_len = 0;
2041 break;
2042 case INT_SC_SERDES_READ_REG:
2043 rval = qla2x00_read_serdes_word(vha, sr.addr, &sr.val);
2044 sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
2045 bsg_job->reply_payload.sg_cnt, &sr, sizeof(sr));
2046 bsg_job->reply->reply_payload_rcv_len = sizeof(sr);
2047 break;
2048 default:
2049 ql_log(ql_log_warn, vha, 0x708c,
2050 "Unknown serdes cmd %x.\n", sr.cmd);
2051 rval = -EDOM;
2052 break;
2053 }
2054
2055 bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
2056 rval ? EXT_STATUS_MAILBOX : 0;
2057
2058 bsg_job->reply_len = sizeof(struct fc_bsg_reply);
2059 bsg_job->reply->result = DID_OK << 16;
2060 bsg_job->job_done(bsg_job);
2061 return 0;
2062}
2063
2064static int
2025qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job) 2065qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job)
2026{ 2066{
2027 switch (bsg_job->request->rqst_data.h_vendor.vendor_cmd[0]) { 2067 switch (bsg_job->request->rqst_data.h_vendor.vendor_cmd[0]) {
@@ -2069,6 +2109,10 @@ qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job)
2069 2109
2070 case QL_VND_FX00_MGMT_CMD: 2110 case QL_VND_FX00_MGMT_CMD:
2071 return qlafx00_mgmt_cmd(bsg_job); 2111 return qlafx00_mgmt_cmd(bsg_job);
2112
2113 case QL_VND_SERDES_OP:
2114 return qla26xx_serdes_op(bsg_job);
2115
2072 default: 2116 default:
2073 return -ENOSYS; 2117 return -ENOSYS;
2074 } 2118 }
diff --git a/drivers/scsi/qla2xxx/qla_bsg.h b/drivers/scsi/qla2xxx/qla_bsg.h
index 04f770332c2b..e5c2126221e9 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.h
+++ b/drivers/scsi/qla2xxx/qla_bsg.h
@@ -23,6 +23,7 @@
23#define QL_VND_WRITE_I2C 0x10 23#define QL_VND_WRITE_I2C 0x10
24#define QL_VND_READ_I2C 0x11 24#define QL_VND_READ_I2C 0x11
25#define QL_VND_FX00_MGMT_CMD 0x12 25#define QL_VND_FX00_MGMT_CMD 0x12
26#define QL_VND_SERDES_OP 0x13
26 27
27/* BSG Vendor specific subcode returns */ 28/* BSG Vendor specific subcode returns */
28#define EXT_STATUS_OK 0 29#define EXT_STATUS_OK 0
@@ -212,4 +213,16 @@ struct qla_i2c_access {
212 uint8_t buffer[0x40]; 213 uint8_t buffer[0x40];
213} __packed; 214} __packed;
214 215
216/* 26xx serdes register interface */
217
218/* serdes reg commands */
219#define INT_SC_SERDES_READ_REG 1
220#define INT_SC_SERDES_WRITE_REG 2
221
222struct qla_serdes_reg {
223 uint16_t cmd;
224 uint16_t addr;
225 uint16_t val;
226} __packed;
227
215#endif 228#endif
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index 66f6597d857b..9cd767c26a27 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -12,7 +12,7 @@
12 * | Level | Last Value Used | Holes | 12 * | Level | Last Value Used | Holes |
13 * ---------------------------------------------------------------------- 13 * ----------------------------------------------------------------------
14 * | Module Init and Probe | 0x015b | 0x4b,0xba,0xfa | 14 * | Module Init and Probe | 0x015b | 0x4b,0xba,0xfa |
15 * | Mailbox commands | 0x1181 | 0x111a-0x111b | 15 * | Mailbox commands | 0x1187 | 0x111a-0x111b |
16 * | | | 0x1155-0x1158 | 16 * | | | 0x1155-0x1158 |
17 * | | | 0x1018-0x1019 | 17 * | | | 0x1018-0x1019 |
18 * | | | 0x1115-0x1116 | 18 * | | | 0x1115-0x1116 |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index ac62bcacc2d6..41d6491d7bd9 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -862,7 +862,6 @@ struct mbx_cmd_32 {
862 */ 862 */
863#define MBC_LOAD_RAM 1 /* Load RAM. */ 863#define MBC_LOAD_RAM 1 /* Load RAM. */
864#define MBC_EXECUTE_FIRMWARE 2 /* Execute firmware. */ 864#define MBC_EXECUTE_FIRMWARE 2 /* Execute firmware. */
865#define MBC_WRITE_RAM_WORD 4 /* Write RAM word. */
866#define MBC_READ_RAM_WORD 5 /* Read RAM word. */ 865#define MBC_READ_RAM_WORD 5 /* Read RAM word. */
867#define MBC_MAILBOX_REGISTER_TEST 6 /* Wrap incoming mailboxes */ 866#define MBC_MAILBOX_REGISTER_TEST 6 /* Wrap incoming mailboxes */
868#define MBC_VERIFY_CHECKSUM 7 /* Verify checksum. */ 867#define MBC_VERIFY_CHECKSUM 7 /* Verify checksum. */
@@ -937,6 +936,8 @@ struct mbx_cmd_32 {
937/* 936/*
938 * ISP24xx mailbox commands 937 * ISP24xx mailbox commands
939 */ 938 */
939#define MBC_WRITE_SERDES 0x3 /* Write serdes word. */
940#define MBC_READ_SERDES 0x4 /* Read serdes word. */
940#define MBC_SERDES_PARAMS 0x10 /* Serdes Tx Parameters. */ 941#define MBC_SERDES_PARAMS 0x10 /* Serdes Tx Parameters. */
941#define MBC_GET_IOCB_STATUS 0x12 /* Get IOCB status command. */ 942#define MBC_GET_IOCB_STATUS 0x12 /* Get IOCB status command. */
942#define MBC_PORT_PARAMS 0x1A /* Port iDMA Parameters. */ 943#define MBC_PORT_PARAMS 0x1A /* Port iDMA Parameters. */
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index 359d0d9e09d9..00427e0ff5b2 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -341,6 +341,11 @@ extern int
341qla2x00_system_error(scsi_qla_host_t *); 341qla2x00_system_error(scsi_qla_host_t *);
342 342
343extern int 343extern int
344qla2x00_write_serdes_word(scsi_qla_host_t *, uint16_t, uint16_t);
345extern int
346qla2x00_read_serdes_word(scsi_qla_host_t *, uint16_t, uint16_t *);
347
348extern int
344qla2x00_set_serdes_params(scsi_qla_host_t *, uint16_t, uint16_t, uint16_t); 349qla2x00_set_serdes_params(scsi_qla_host_t *, uint16_t, uint16_t, uint16_t);
345 350
346extern int 351extern int
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
index 5957fee119c9..b94511ae0051 100644
--- a/drivers/scsi/qla2xxx/qla_mbx.c
+++ b/drivers/scsi/qla2xxx/qla_mbx.c
@@ -2800,6 +2800,75 @@ qla2x00_system_error(scsi_qla_host_t *vha)
2800 return rval; 2800 return rval;
2801} 2801}
2802 2802
2803int
2804qla2x00_write_serdes_word(scsi_qla_host_t *vha, uint16_t addr, uint16_t data)
2805{
2806 int rval;
2807 mbx_cmd_t mc;
2808 mbx_cmd_t *mcp = &mc;
2809
2810 if (!IS_QLA2031(vha->hw))
2811 return QLA_FUNCTION_FAILED;
2812
2813 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1182,
2814 "Entered %s.\n", __func__);
2815
2816 mcp->mb[0] = MBC_WRITE_SERDES;
2817 mcp->mb[1] = addr;
2818 mcp->mb[2] = data & 0xff;
2819 mcp->mb[3] = 0;
2820 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
2821 mcp->in_mb = MBX_0;
2822 mcp->tov = MBX_TOV_SECONDS;
2823 mcp->flags = 0;
2824 rval = qla2x00_mailbox_command(vha, mcp);
2825
2826 if (rval != QLA_SUCCESS) {
2827 ql_dbg(ql_dbg_mbx, vha, 0x1183,
2828 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
2829 } else {
2830 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1184,
2831 "Done %s.\n", __func__);
2832 }
2833
2834 return rval;
2835}
2836
2837int
2838qla2x00_read_serdes_word(scsi_qla_host_t *vha, uint16_t addr, uint16_t *data)
2839{
2840 int rval;
2841 mbx_cmd_t mc;
2842 mbx_cmd_t *mcp = &mc;
2843
2844 if (!IS_QLA2031(vha->hw))
2845 return QLA_FUNCTION_FAILED;
2846
2847 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1185,
2848 "Entered %s.\n", __func__);
2849
2850 mcp->mb[0] = MBC_READ_SERDES;
2851 mcp->mb[1] = addr;
2852 mcp->mb[3] = 0;
2853 mcp->out_mb = MBX_3|MBX_1|MBX_0;
2854 mcp->in_mb = MBX_1|MBX_0;
2855 mcp->tov = MBX_TOV_SECONDS;
2856 mcp->flags = 0;
2857 rval = qla2x00_mailbox_command(vha, mcp);
2858
2859 *data = mcp->mb[1] & 0xff;
2860
2861 if (rval != QLA_SUCCESS) {
2862 ql_dbg(ql_dbg_mbx, vha, 0x1186,
2863 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
2864 } else {
2865 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1187,
2866 "Done %s.\n", __func__);
2867 }
2868
2869 return rval;
2870}
2871
2803/** 2872/**
2804 * qla2x00_set_serdes_params() - 2873 * qla2x00_set_serdes_params() -
2805 * @ha: HA context 2874 * @ha: HA context