Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e8887c51 authored by Joe Carnuccio's avatar Joe Carnuccio Committed by Christoph Hellwig
Browse files

qla2xxx: Add ISP8044 serdes bsg interface.

parent 7012532d
Loading
Loading
Loading
Loading
+45 −2
Original line number Diff line number Diff line
@@ -2054,9 +2054,49 @@ qla26xx_serdes_op(struct fc_bsg_job *bsg_job)
		bsg_job->reply->reply_payload_rcv_len = sizeof(sr);
		break;
	default:
		ql_log(ql_log_warn, vha, 0x708c,
		ql_dbg(ql_dbg_user, vha, 0x708c,
		    "Unknown serdes cmd %x.\n", sr.cmd);
		rval = -EDOM;
		rval = -EINVAL;
		break;
	}

	bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] =
	    rval ? EXT_STATUS_MAILBOX : 0;

	bsg_job->reply_len = sizeof(struct fc_bsg_reply);
	bsg_job->reply->result = DID_OK << 16;
	bsg_job->job_done(bsg_job);
	return 0;
}

static int
qla8044_serdes_op(struct fc_bsg_job *bsg_job)
{
	struct Scsi_Host *host = bsg_job->shost;
	scsi_qla_host_t *vha = shost_priv(host);
	int rval = 0;
	struct qla_serdes_reg_ex sr;

	memset(&sr, 0, sizeof(sr));

	sg_copy_to_buffer(bsg_job->request_payload.sg_list,
	    bsg_job->request_payload.sg_cnt, &sr, sizeof(sr));

	switch (sr.cmd) {
	case INT_SC_SERDES_WRITE_REG:
		rval = qla8044_write_serdes_word(vha, sr.addr, sr.val);
		bsg_job->reply->reply_payload_rcv_len = 0;
		break;
	case INT_SC_SERDES_READ_REG:
		rval = qla8044_read_serdes_word(vha, sr.addr, &sr.val);
		sg_copy_from_buffer(bsg_job->reply_payload.sg_list,
		    bsg_job->reply_payload.sg_cnt, &sr, sizeof(sr));
		bsg_job->reply->reply_payload_rcv_len = sizeof(sr);
		break;
	default:
		ql_dbg(ql_dbg_user, vha, 0x70cf,
		    "Unknown serdes cmd %x.\n", sr.cmd);
		rval = -EINVAL;
		break;
	}

@@ -2121,6 +2161,9 @@ qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job)
	case QL_VND_SERDES_OP:
		return qla26xx_serdes_op(bsg_job);

	case QL_VND_SERDES_OP_EX:
		return qla8044_serdes_op(bsg_job);

	default:
		return -ENOSYS;
	}
+7 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#define QL_VND_READ_I2C		0x11
#define QL_VND_FX00_MGMT_CMD	0x12
#define QL_VND_SERDES_OP	0x13
#define	QL_VND_SERDES_OP_EX	0x14

/* BSG Vendor specific subcode returns */
#define EXT_STATUS_OK			0
@@ -225,4 +226,10 @@ struct qla_serdes_reg {
	uint16_t val;
} __packed;

struct qla_serdes_reg_ex {
	uint16_t cmd;
	uint32_t addr;
	uint32_t val;
} __packed;

#endif
+1 −1
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@
 * |                              |                    | 0x0144,0x0146	|
 * |                              |                    | 0x015b-0x0160	|
 * |                              |                    | 0x016e-0x0170	|
 * | Mailbox commands             |       0x1187       | 0x1018-0x1019	|
 * | Mailbox commands             |       0x118d       | 0x1018-0x1019	|
 * |                              |                    | 0x10ca         |
 * |                              |                    | 0x1115-0x1116  |
 * |                              |                    | 0x111a-0x111b	|
+7 −0
Original line number Diff line number Diff line
@@ -965,6 +965,13 @@ struct mbx_cmd_32 {
 */
#define MBC_WRITE_MPI_REGISTER		0x01    /* Write MPI Register. */

/*
 * ISP8044 mailbox commands
 */
#define MBC_SET_GET_ETH_SERDES_REG	0x150
#define HCS_WRITE_SERDES		0x3
#define HCS_READ_SERDES			0x4

/* Firmware return data sizes */
#define FCAL_MAP_SIZE	128

+5 −0
Original line number Diff line number Diff line
@@ -346,6 +346,11 @@ qla2x00_write_serdes_word(scsi_qla_host_t *, uint16_t, uint16_t);
extern int
qla2x00_read_serdes_word(scsi_qla_host_t *, uint16_t, uint16_t *);

extern int
qla8044_write_serdes_word(scsi_qla_host_t *, uint32_t, uint32_t);
extern int
qla8044_read_serdes_word(scsi_qla_host_t *, uint32_t, uint32_t *);

extern int
qla2x00_set_serdes_params(scsi_qla_host_t *, uint16_t, uint16_t, uint16_t);

Loading