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

Commit 1e34e307 authored by Ron Mercer's avatar Ron Mercer Committed by David S. Miller
Browse files

qlge: Add firmware/driver sub-command support.



These sub-commands are issued by another (FCoE) function requesting
an operation on a shared resource.

Signed-off-by: default avatarRon Mercer <ron.mercer@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 32a5b2a0
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -816,6 +816,18 @@ enum {
	MB_CMD_GET_MGMNT_TFK_CTL = 0x00000161, /* Get Mgmnt Traffic Control */
	MB_GET_MPI_TFK_STOPPED = (1 << 0),
	MB_GET_MPI_TFK_FIFO_EMPTY = (1 << 1),
	/* Sub-commands for IDC request.
	 * This describes the reason for the
	 * IDC request.
	 */
	MB_CMD_IOP_NONE = 0x0000,
	MB_CMD_IOP_PREP_UPDATE_MPI	= 0x0001,
	MB_CMD_IOP_COMP_UPDATE_MPI	= 0x0002,
	MB_CMD_IOP_PREP_LINK_DOWN	= 0x0010,
	MB_CMD_IOP_DVR_START	 = 0x0100,
	MB_CMD_IOP_FLASH_ACC	 = 0x0101,
	MB_CMD_IOP_RESTART_MPI	= 0x0102,
	MB_CMD_IOP_CORE_DUMP_MPI	= 0x0103,

	/* Mailbox Command Status. */
	MB_CMD_STS_GOOD = 0x00004000,	/* Success. */
+49 −7
Original line number Diff line number Diff line
@@ -1038,8 +1038,11 @@ void ql_mpi_idc_work(struct work_struct *work)
	int status;
	struct mbox_params *mbcp = &qdev->idc_mbc;
	u32 aen;
	int timeout;

	rtnl_lock();
	aen = mbcp->mbox_out[1] >> 16;
	timeout = (mbcp->mbox_out[1] >> 8) & 0xf;

	switch (aen) {
	default:
@@ -1047,22 +1050,61 @@ void ql_mpi_idc_work(struct work_struct *work)
			"Bug: Unhandled IDC action.\n");
		break;
	case MB_CMD_PORT_RESET:
	case MB_CMD_SET_PORT_CFG:
	case MB_CMD_STOP_FW:
		ql_link_off(qdev);
	case MB_CMD_SET_PORT_CFG:
		/* Signal the resulting link up AEN
		 * that the frame routing and mac addr
		 * needs to be set.
		 * */
		set_bit(QL_CAM_RT_SET, &qdev->flags);
		rtnl_lock();
		/* Do ACK if required */
		if (timeout) {
			status = ql_mb_idc_ack(qdev);
		rtnl_unlock();
		if (status) {
			if (status)
				QPRINTK(qdev, DRV, ERR,
					"Bug: No pending IDC!\n");
		} else {
			QPRINTK(qdev, DRV, DEBUG,
				    "IDC ACK not required\n");
			status = 0; /* success */
		}
		break;

	/* These sub-commands issued by another (FCoE)
	 * function are requesting to do an operation
	 * on the shared resource (MPI environment).
	 * We currently don't issue these so we just
	 * ACK the request.
	 */
	case MB_CMD_IOP_RESTART_MPI:
	case MB_CMD_IOP_PREP_LINK_DOWN:
		/* Drop the link, reload the routing
		 * table when link comes up.
		 */
		ql_link_off(qdev);
		set_bit(QL_CAM_RT_SET, &qdev->flags);
		/* Fall through. */
	case MB_CMD_IOP_DVR_START:
	case MB_CMD_IOP_FLASH_ACC:
	case MB_CMD_IOP_CORE_DUMP_MPI:
	case MB_CMD_IOP_PREP_UPDATE_MPI:
	case MB_CMD_IOP_COMP_UPDATE_MPI:
	case MB_CMD_IOP_NONE:	/*  an IDC without params */
		/* Do ACK if required */
		if (timeout) {
			status = ql_mb_idc_ack(qdev);
			if (status)
				QPRINTK(qdev, DRV, ERR,
				    "Bug: No pending IDC!\n");
		} else {
			QPRINTK(qdev, DRV, DEBUG,
			    "IDC ACK not required\n");
			status = 0; /* success */
		}
		break;
	}
	rtnl_unlock();
}

void ql_mpi_work(struct work_struct *work)